From b7e8e13be33ac17be83449f1b12e887566c52f10 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Thu, 2 Jan 2020 16:22:08 +0000 Subject: [PATCH] Deploy code docs to GitHub Pages for Appveyor build 1071 Commit: 17b8f3db1ebabf352c6163d6fc58fd3b653608ad --- ...3___m_s_initial_create_8_designer_8cs.html | 107 + ..._initial_create_8_designer_8cs_source.html | 86 + 20180906135553___m_s_initial_create_8cs.html | 107 + ...35553___m_s_initial_create_8cs_source.html | 98 + ...9___m_y_initial_create_8_designer_8cs.html | 107 + ..._initial_create_8_designer_8cs_source.html | 86 + 20180906143029___m_y_initial_create_8cs.html | 107 + ...43029___m_y_initial_create_8cs_source.html | 98 + ...y_add_minimum_security_8_designer_8cs.html | 107 + ...inimum_security_8_designer_8cs_source.html | 86 + ...020726___m_y_add_minimum_security_8cs.html | 107 + ...__m_y_add_minimum_security_8cs_source.html | 92 + ...s_add_minimum_security_8_designer_8cs.html | 107 + ...inimum_security_8_designer_8cs_source.html | 86 + ...021228___m_s_add_minimum_security_8cs.html | 107 + ...__m_s_add_minimum_security_8cs_source.html | 92 + ...nd_foreign_key_cleanup_8_designer_8cs.html | 107 + ...ign_key_cleanup_8_designer_8cs_source.html | 86 + ..._nullable_and_foreign_key_cleanup_8cs.html | 107 + ...le_and_foreign_key_cleanup_8cs_source.html | 87 + ...nd_foreign_key_cleanup_8_designer_8cs.html | 107 + ...ign_key_cleanup_8_designer_8cs_source.html | 86 + ..._nullable_and_foreign_key_cleanup_8cs.html | 107 + ...le_and_foreign_key_cleanup_8cs_source.html | 87 + ...h_compile_job_required_8_designer_8cs.html | 107 + ...le_job_required_8_designer_8cs_source.html | 86 + ...m_s_reattach_compile_job_required_8cs.html | 107 + ...ttach_compile_job_required_8cs_source.html | 87 + ...h_compile_job_required_8_designer_8cs.html | 107 + ...le_job_required_8_designer_8cs_source.html | 86 + ...m_y_reattach_compile_job_required_8cs.html | 107 + ...ttach_compile_job_required_8cs_source.html | 87 + ...gle_testmerge_comments_8_designer_8cs.html | 107 + ...tmerge_comments_8_designer_8cs_source.html | 86 + ...4___m_s_toggle_testmerge_comments_8cs.html | 107 + ..._toggle_testmerge_comments_8cs_source.html | 87 + ...gle_testmerge_comments_8_designer_8cs.html | 107 + ...tmerge_comments_8_designer_8cs_source.html | 86 + ...9___m_y_toggle_testmerge_comments_8cs.html | 107 + ..._toggle_testmerge_comments_8cs_source.html | 87 + ...m_s_fix_rev_info_index_8_designer_8cs.html | 107 + ..._rev_info_index_8_designer_8cs_source.html | 86 + ...19041825___m_s_fix_rev_info_index_8cs.html | 107 + ...5___m_s_fix_rev_info_index_8cs_source.html | 87 + ...m_y_fix_rev_info_index_8_designer_8cs.html | 107 + ..._rev_info_index_8_designer_8cs_source.html | 86 + ...19042440___m_y_fix_rev_info_index_8cs.html | 107 + ...0___m_y_fix_rev_info_index_8cs_source.html | 87 + ArchitectureOverview.png | Bin 0 -> 159852 bytes _a_p_i_8dox.html | 78 + _administration_8cs.html | 105 + _administration_8cs_source.html | 88 + _administration_client_8cs.html | 102 + _administration_client_8cs_source.html | 99 + _administration_controller_8cs.html | 105 + _administration_controller_8cs_source.html | 136 ++ _administration_rights_8cs.html | 114 + _administration_rights_8cs_source.html | 90 + _administration_test_8cs.html | 102 + _administration_test_8cs_source.html | 99 + _api_client_8cs.html | 102 + _api_client_8cs_source.html | 130 ++ _api_client_factory_8cs.html | 102 + _api_client_factory_8cs_source.html | 93 + _api_conflict_exception_8cs.html | 103 + _api_conflict_exception_8cs_source.html | 93 + _api_controller_8cs.html | 105 + _api_controller_8cs_source.html | 117 + _api_headers_8cs.html | 103 + _api_headers_8cs_source.html | 107 + _api_mismatch_exception_8cs.html | 103 + _api_mismatch_exception_8cs_source.html | 94 + _api_validation_status_8cs.html | 116 + _api_validation_status_8cs_source.html | 90 + _application_8cs.html | 104 + _application_8cs_source.html | 191 ++ _application_builder_extensions_8cs.html | 105 + ...ication_builder_extensions_8cs_source.html | 92 + _architecture_8dox.html | 78 + _async_delayer_8cs.html | 104 + _async_delayer_8cs_source.html | 86 + _authentication_context_8cs.html | 105 + _authentication_context_8cs_source.html | 104 + _authentication_context_factory_8cs.html | 104 + ...entication_context_factory_8cs_source.html | 107 + _basic_watchdog_8cs.html | 107 + _basic_watchdog_8cs_source.html | 163 ++ _bool_converter_8cs.html | 109 + _bool_converter_8cs_source.html | 88 + _byond_8cs.html | 105 + _byond_8cs_source.html | 87 + _byond_client_8cs.html | 104 + _byond_client_8cs_source.html | 103 + _byond_command_8cs.html | 109 + _byond_command_8cs_source.html | 104 + _byond_controller_8cs.html | 105 + _byond_controller_8cs_source.html | 119 + _byond_executable_lock_8cs.html | 106 + _byond_executable_lock_8cs_source.html | 91 + _byond_manager_8cs.html | 106 + _byond_manager_8cs_source.html | 132 ++ _byond_rights_8cs.html | 113 + _byond_rights_8cs_source.html | 89 + _byond_test_8cs.html | 104 + _byond_test_8cs_source.html | 101 + _channel_8cs.html | 107 + _channel_8cs_source.html | 91 + _channel_mapping_8cs.html | 107 + _channel_mapping_8cs_source.html | 89 + _chat_8cs.html | 106 + _chat_8cs_source.html | 166 ++ _chat_bot_rights_8cs.html | 119 + _chat_bot_rights_8cs_source.html | 94 + _chat_bots_client_8cs.html | 104 + _chat_bots_client_8cs_source.html | 107 + _chat_command_8cs.html | 107 + _chat_command_8cs_source.html | 92 + _chat_connection_string_builder_8cs.html | 107 + ..._connection_string_builder_8cs_source.html | 86 + _chat_controller_8cs.html | 105 + _chat_controller_8cs_source.html | 123 + _chat_factory_8cs.html | 106 + _chat_factory_8cs_source.html | 105 + _chat_provider_8cs.html | 107 + _chat_provider_8cs_source.html | 86 + _claims_injector_8cs.html | 104 + _claims_injector_8cs_source.html | 106 + _client_exception_8cs.html | 103 + _client_exception_8cs_source.html | 95 + _comm_command_8cs.html | 107 + _comm_command_8cs_source.html | 86 + _comm_context_8cs.html | 106 + _comm_context_8cs_source.html | 105 + _command_factory_8cs.html | 108 + _command_factory_8cs_source.html | 112 + _components_2_watchdog_2_i_watchdog_8cs.html | 107 + ...ts_2_watchdog_2_i_watchdog_8cs_source.html | 104 + ...s_2_watchdog_2_i_watchdog_factory_8cs.html | 107 + ...chdog_2_i_watchdog_factory_8cs_source.html | 101 + ...2_watchdog_2_reattach_information_8cs.html | 107 + ...dog_2_reattach_information_8cs_source.html | 93 + ...nts_2_watchdog_2_watchdog_factory_8cs.html | 106 + ...atchdog_2_watchdog_factory_8cs_source.html | 122 + ...g_2_watchdog_reattach_information_8cs.html | 107 + ...chdog_reattach_information_8cs_source.html | 96 + _configuration_8cs.html | 106 + _configuration_8cs_source.html | 153 ++ _configuration_client_8cs.html | 104 + _configuration_client_8cs_source.html | 109 + _configuration_controller_8cs.html | 105 + _configuration_controller_8cs_source.html | 125 + _configuration_file_8cs.html | 105 + _configuration_file_8cs_source.html | 89 + _configuration_rights_8cs.html | 113 + _configuration_rights_8cs_source.html | 89 + _configuration_test_8cs.html | 104 + _configuration_test_8cs_source.html | 103 + _configuration_type_8cs.html | 108 + _configuration_type_8cs_source.html | 87 + _conflict_exception_8cs.html | 103 + _conflict_exception_8cs_source.html | 94 + _console_8cs.html | 104 + _console_8cs_source.html | 90 + _constants_8cs.html | 107 + _constants_8cs_source.html | 101 + _control_panel_configuration_8cs.html | 105 + _control_panel_configuration_8cs_source.html | 88 + _credentials_provider_8cs.html | 106 + _credentials_provider_8cs_source.html | 93 + _cryptography_suite_8cs.html | 104 + _cryptography_suite_8cs_source.html | 99 + _custom_command_8cs.html | 109 + _custom_command_8cs_source.html | 96 + _d_b_connection_factory_8cs.html | 104 + _d_b_connection_factory_8cs_source.html | 92 + _database_configuration_8cs.html | 105 + _database_configuration_8cs_source.html | 91 + _database_context_8cs.html | 104 + _database_context_8cs_source.html | 130 ++ _database_context_factory_8cs.html | 104 + _database_context_factory_8cs_source.html | 93 + _database_seeder_8cs.html | 104 + _database_seeder_8cs_source.html | 104 + _database_type_8cs.html | 108 + _database_type_8cs_source.html | 87 + _dead_session_controller_8cs.html | 107 + _dead_session_controller_8cs_source.html | 107 + _default_i_o_manager_8cs.html | 105 + _default_i_o_manager_8cs_source.html | 111 + ...n_time_db_context_factory_helpers_8cs.html | 107 + ...db_context_factory_helpers_8cs_source.html | 93 + _discord_connection_string_builder_8cs.html | 105 + ..._connection_string_builder_8cs_source.html | 94 + _discord_provider_8cs.html | 109 + _discord_provider_8cs_source.html | 115 + _dmb_factory_8cs.html | 107 + _dmb_factory_8cs_source.html | 127 + _dmb_provider_8cs.html | 106 + _dmb_provider_8cs_source.html | 108 + _dream_daemon_8cs.html | 105 + _dream_daemon_8cs_source.html | 97 + _dream_daemon_client_8cs.html | 104 + _dream_daemon_client_8cs_source.html | 106 + _dream_daemon_controller_8cs.html | 105 + _dream_daemon_controller_8cs_source.html | 136 ++ _dream_daemon_launch_parameters_8cs.html | 107 + ...m_daemon_launch_parameters_8cs_source.html | 91 + _dream_daemon_rights_8cs.html | 123 + _dream_daemon_rights_8cs_source.html | 97 + _dream_daemon_security_8cs.html | 108 + _dream_daemon_security_8cs_source.html | 87 + _dream_daemon_status_8cs.html | 108 + _dream_daemon_status_8cs_source.html | 87 + _dream_maker_client_8cs.html | 104 + _dream_maker_client_8cs_source.html | 108 + _dream_maker_controller_8cs.html | 105 + _dream_maker_controller_8cs_source.html | 128 + _dream_maker_rights_8cs.html | 116 + _dream_maker_rights_8cs_source.html | 92 + _dream_maker_settings_8cs.html | 104 + _dream_maker_settings_8cs_source.html | 91 + _error_message_8cs.html | 105 + _error_message_8cs_source.html | 88 + _event_consumer_8cs.html | 104 + _event_consumer_8cs_source.html | 99 + _event_notification_8cs.html | 107 + _event_notification_8cs_source.html | 87 + _event_type_8cs.html | 124 + _event_type_8cs_source.html | 98 + _experimental_watchdog_8cs.html | 107 + _experimental_watchdog_8cs_source.html | 178 ++ _file_logging_configuration_8cs.html | 105 + _file_logging_configuration_8cs_source.html | 92 + _general_configuration_8cs.html | 105 + _general_configuration_8cs_source.html | 95 + _git_hub_client_factory_8cs.html | 104 + _git_hub_client_factory_8cs_source.html | 93 + _global_suppressions_8cs.html | 84 + _global_suppressions_8cs_source.html | 82 + _home_controller_8cs.html | 105 + _home_controller_8cs_source.html | 133 ++ _http_client_8cs.html | 102 + _http_client_8cs_source.html | 90 + _i_administration_client_8cs.html | 103 + _i_administration_client_8cs_source.html | 92 + _i_api_client_8cs.html | 103 + _i_api_client_8cs_source.html | 104 + _i_api_client_factory_8cs.html | 103 + _i_api_client_factory_8cs_source.html | 90 + _i_application_8cs.html | 105 + _i_application_8cs_source.html | 88 + _i_async_delayer_8cs.html | 105 + _i_async_delayer_8cs_source.html | 85 + _i_authentication_context_8cs.html | 105 + _i_authentication_context_8cs_source.html | 97 + _i_authentication_context_factory_8cs.html | 105 + ...entication_context_factory_8cs_source.html | 87 + _i_byond_client_8cs.html | 105 + _i_byond_client_8cs_source.html | 92 + _i_byond_executable_lock_8cs.html | 107 + _i_byond_executable_lock_8cs_source.html | 89 + _i_byond_installer_8cs.html | 107 + _i_byond_installer_8cs_source.html | 89 + _i_byond_manager_8cs.html | 107 + _i_byond_manager_8cs_source.html | 90 + _i_chat_8cs.html | 107 + _i_chat_8cs_source.html | 102 + _i_chat_bots_client_8cs.html | 105 + _i_chat_bots_client_8cs_source.html | 94 + _i_chat_factory_8cs.html | 107 + _i_chat_factory_8cs_source.html | 94 + _i_claims_injector_8cs.html | 105 + _i_claims_injector_8cs_source.html | 85 + _i_comm_context_8cs.html | 107 + _i_comm_context_8cs_source.html | 87 + _i_comm_handler_8cs.html | 107 + _i_comm_handler_8cs_source.html | 86 + _i_command_8cs.html | 109 + _i_command_8cs_source.html | 89 + _i_command_factory_8cs.html | 109 + _i_command_factory_8cs_source.html | 85 + _i_compile_job_consumer_8cs.html | 107 + _i_compile_job_consumer_8cs_source.html | 92 + _i_configuration_8cs.html | 107 + _i_configuration_8cs_source.html | 101 + _i_configuration_client_8cs.html | 105 + _i_configuration_client_8cs_source.html | 94 + _i_console_8cs.html | 105 + _i_console_8cs_source.html | 88 + _i_credentials_provider_8cs.html | 107 + _i_credentials_provider_8cs_source.html | 85 + _i_cryptography_suite_8cs.html | 105 + _i_cryptography_suite_8cs_source.html | 93 + _i_custom_command_handler_8cs.html | 107 + _i_custom_command_handler_8cs_source.html | 86 + _i_d_b_connection_factory_8cs.html | 105 + _i_d_b_connection_factory_8cs_source.html | 90 + _i_database_context_8cs.html | 105 + _i_database_context_8cs_source.html | 100 + _i_database_context_factory_8cs.html | 105 + _i_database_context_factory_8cs_source.html | 89 + _i_database_seeder_8cs.html | 105 + _i_database_seeder_8cs_source.html | 87 + _i_dmb_factory_8cs.html | 107 + _i_dmb_factory_8cs_source.html | 95 + _i_dmb_provider_8cs.html | 105 + _i_dmb_provider_8cs_source.html | 94 + _i_dream_daemon_client_8cs.html | 105 + _i_dream_daemon_client_8cs_source.html | 94 + _i_dream_maker_8cs.html | 107 + _i_dream_maker_8cs_source.html | 91 + _i_dream_maker_client_8cs.html | 105 + _i_dream_maker_client_8cs_source.html | 95 + _i_event_consumer_8cs.html | 105 + _i_event_consumer_8cs_source.html | 86 + _i_git_hub_client_factory_8cs.html | 105 + _i_git_hub_client_factory_8cs_source.html | 85 + _i_http_client_8cs.html | 103 + _i_http_client_8cs_source.html | 87 + _i_i_o_manager_8cs.html | 105 + _i_i_o_manager_8cs_source.html | 106 + _i_identity_cache_8cs.html | 105 + _i_identity_cache_8cs_source.html | 92 + _i_instance_8cs.html | 105 + _i_instance_8cs_source.html | 112 + _i_instance_client_8cs.html | 105 + _i_instance_client_8cs_source.html | 106 + _i_instance_factory_8cs.html | 105 + _i_instance_factory_8cs_source.html | 87 + _i_instance_manager_8cs.html | 105 + _i_instance_manager_8cs_source.html | 94 + _i_instance_manager_client_8cs.html | 103 + _i_instance_manager_client_8cs_source.html | 97 + _i_instance_user_client_8cs.html | 105 + _i_instance_user_client_8cs_source.html | 95 + _i_job_manager_8cs.html | 105 + _i_job_manager_8cs_source.html | 96 + _i_jobs_client_8cs.html | 105 + _i_jobs_client_8cs_source.html | 93 + _i_json_tracking_context_8cs.html | 107 + _i_json_tracking_context_8cs_source.html | 93 + _i_network_prompt_reaper_8cs.html | 107 + _i_network_prompt_reaper_8cs_source.html | 90 + _i_platform_identifier_8cs.html | 105 + _i_platform_identifier_8cs_source.html | 86 + _i_post_write_handler_8cs.html | 105 + _i_post_write_handler_8cs_source.html | 85 + _i_process_8cs.html | 105 + _i_process_8cs_source.html | 91 + _i_process_base_8cs.html | 105 + _i_process_base_8cs_source.html | 87 + _i_process_executor_8cs.html | 105 + _i_process_executor_8cs_source.html | 87 + _i_provider_8cs.html | 109 + _i_provider_8cs_source.html | 92 + _i_provider_factory_8cs.html | 107 + _i_provider_factory_8cs_source.html | 95 + _i_reattach_info_handler_8cs.html | 107 + _i_reattach_info_handler_8cs_source.html | 87 + _i_repository_8cs.html | 107 + _i_repository_8cs_source.html | 106 + _i_repository_client_8cs.html | 105 + _i_repository_client_8cs_source.html | 93 + _i_repository_manager_8cs.html | 107 + _i_repository_manager_8cs_source.html | 90 + _i_request_logger_8cs.html | 103 + _i_request_logger_8cs_source.html | 86 + _i_restart_handler_8cs.html | 105 + _i_restart_handler_8cs_source.html | 85 + _i_restart_registration_8cs.html | 105 + _i_restart_registration_8cs_source.html | 85 + _i_server_8cs.html | 103 + _i_server_8cs_source.html | 86 + _i_server_client_8cs.html | 103 + _i_server_client_8cs_source.html | 101 + _i_server_client_factory_8cs.html | 103 + _i_server_client_factory_8cs_source.html | 91 + _i_server_control_8cs.html | 105 + _i_server_control_8cs_source.html | 96 + _i_server_factory_8cs.html | 103 + _i_server_factory_8cs_source.html | 86 + _i_session_controller_8cs.html | 107 + _i_session_controller_8cs_source.html | 106 + _i_session_controller_factory_8cs.html | 107 + _i_session_controller_factory_8cs_source.html | 100 + _i_setup_wizard_8cs.html | 105 + _i_setup_wizard_8cs_source.html | 85 + _i_symlink_factory_8cs.html | 105 + _i_symlink_factory_8cs_source.html | 85 + _i_synchronous_i_o_manager_8cs.html | 105 + _i_synchronous_i_o_manager_8cs_source.html | 91 + _i_system_identity_8cs.html | 105 + _i_system_identity_8cs_source.html | 89 + _i_system_identity_factory_8cs.html | 105 + _i_system_identity_factory_8cs_source.html | 90 + _i_token_factory_8cs.html | 105 + _i_token_factory_8cs_source.html | 90 + _i_users_client_8cs.html | 103 + _i_users_client_8cs_source.html | 95 + _identity_cache_8cs.html | 104 + _identity_cache_8cs_source.html | 105 + _identity_cache_object_8cs.html | 105 + _identity_cache_object_8cs_source.html | 97 + _instance_client_8cs.html | 104 + _instance_client_8cs_source.html | 118 + _instance_controller_8cs.html | 105 + _instance_controller_8cs_source.html | 169 ++ _instance_factory_8cs.html | 104 + _instance_factory_8cs_source.html | 152 ++ _instance_manager_8cs.html | 104 + _instance_manager_8cs_source.html | 128 + _instance_manager_client_8cs.html | 102 + _instance_manager_client_8cs_source.html | 110 + _instance_manager_rights_8cs.html | 119 + _instance_manager_rights_8cs_source.html | 94 + _instance_manager_test_8cs.html | 102 + _instance_manager_test_8cs_source.html | 110 + _instance_test_8cs.html | 104 + _instance_test_8cs_source.html | 98 + _instance_user_client_8cs.html | 104 + _instance_user_client_8cs_source.html | 108 + _instance_user_controller_8cs.html | 105 + _instance_user_controller_8cs_source.html | 125 + _instance_user_rights_8cs.html | 109 + _instance_user_rights_8cs_source.html | 88 + _insufficient_permissions_exception_8cs.html | 103 + ...ient_permissions_exception_8cs_source.html | 93 + _integration_test_8cs.html | 102 + _integration_test_8cs_source.html | 119 + _irc_connection_string_builder_8cs.html | 105 + ..._connection_string_builder_8cs_source.html | 100 + _irc_password_type_8cs.html | 108 + _irc_password_type_8cs_source.html | 87 + _irc_provider_8cs.html | 109 + _irc_provider_8cs_source.html | 126 + _job_controller_8cs.html | 105 + _job_controller_8cs_source.html | 113 + _job_exception_8cs.html | 105 + _job_exception_8cs_source.html | 87 + _job_handler_8cs.html | 105 + _job_handler_8cs_source.html | 92 + _job_manager_8cs.html | 104 + _job_manager_8cs_source.html | 121 + _jobs_client_8cs.html | 104 + _jobs_client_8cs_source.html | 105 + _json_file_8cs.html | 107 + _json_file_8cs_source.html | 99 + _json_sub_file_list_8cs.html | 107 + _json_sub_file_list_8cs_source.html | 89 + _json_tracking_context_8cs.html | 106 + _json_tracking_context_8cs_source.html | 112 + _kek_command_8cs.html | 109 + _kek_command_8cs_source.html | 91 + _launch_result_8cs.html | 107 + _launch_result_8cs_source.html | 87 + _message_8cs.html | 109 + _message_8cs_source.html | 86 + _method_not_supported_exception_8cs.html | 103 + ...od_not_supported_exception_8cs_source.html | 93 + _model_controller_8cs.html | 105 + _model_controller_8cs_source.html | 100 + _models_2_reattach_information_8cs.html | 105 + ...els_2_reattach_information_8cs_source.html | 87 + ...s_2_watchdog_reattach_information_8cs.html | 105 + ...chdog_reattach_information_8cs_source.html | 90 + _monitor_action_8cs.html | 115 + _monitor_action_8cs_source.html | 88 + _monitor_activation_reason_8cs.html | 117 + _monitor_activation_reason_8cs_source.html | 91 + _monitor_state_8cs.html | 107 + _monitor_state_8cs_source.html | 91 + _my_sql_database_context_8cs.html | 105 + _my_sql_database_context_8cs_source.html | 101 + ...l_database_context_model_snapshot_8cs.html | 106 + ...ase_context_model_snapshot_8cs_source.html | 87 + ...ql_design_time_db_context_factory_8cs.html | 106 + ...gn_time_db_context_factory_8cs_source.html | 95 + _native_methods_8cs.html | 103 + _native_methods_8cs_source.html | 93 + _platform_identifier_8cs.html | 104 + _platform_identifier_8cs_source.html | 88 + _posix_byond_installer_8cs.html | 107 + _posix_byond_installer_8cs_source.html | 112 + _posix_network_prompt_reaper_8cs.html | 106 + _posix_network_prompt_reaper_8cs_source.html | 91 + _posix_post_write_handler_8cs.html | 105 + _posix_post_write_handler_8cs_source.html | 86 + _posix_symlink_factory_8cs.html | 105 + _posix_symlink_factory_8cs_source.html | 86 + _posix_system_identity_factory_8cs.html | 105 + ...ix_system_identity_factory_8cs_source.html | 91 + _process_8cs.html | 104 + _process_8cs_source.html | 100 + _process_executor_8cs.html | 104 + _process_executor_8cs_source.html | 93 + _provider_8cs.html | 108 + _provider_8cs_source.html | 102 + _provider_factory_8cs.html | 106 + _provider_factory_8cs_source.html | 106 + _pull_requests_command_8cs.html | 109 + _pull_requests_command_8cs_source.html | 109 + _r_e_a_d_m_e_8md.html | 78 + _rate_limit_exception_8cs.html | 103 + _rate_limit_exception_8cs_source.html | 94 + _reattach_info_handler_8cs.html | 104 + _reattach_info_handler_8cs_source.html | 115 + _reattach_information_base_8cs.html | 105 + _reattach_information_base_8cs_source.html | 100 + _reboot_state_8cs.html | 110 + _reboot_state_8cs_source.html | 85 + _release_notes_8_assembly_info_8cs.html | 84 + ...ease_notes_8_assembly_info_8cs_source.html | 82 + _repository_client_8cs.html | 104 + _repository_client_8cs_source.html | 104 + _repository_controller_8cs.html | 105 + _repository_controller_8cs_source.html | 145 ++ _repository_manager_8cs.html | 106 + _repository_manager_8cs_source.html | 119 + _repository_rights_8cs.html | 124 + _repository_rights_8cs_source.html | 98 + _request_timeout_exception_8cs.html | 103 + _request_timeout_exception_8cs_source.html | 93 + _resolving_i_o_manager_8cs.html | 105 + _resolving_i_o_manager_8cs_source.html | 91 + _response_8cs.html | 107 + _response_8cs_source.html | 86 + _restart_registration_8cs.html | 104 + _restart_registration_8cs_source.html | 88 + _rev_info_test_merge_8cs.html | 105 + _rev_info_test_merge_8cs_source.html | 87 + _revision_command_8cs.html | 109 + _revision_command_8cs_source.html | 105 + _rights_helper_8cs.html | 105 + _rights_helper_8cs_source.html | 99 + _rights_type_8cs.html | 118 + _rights_type_8cs_source.html | 93 + _routes_8cs.html | 103 + _routes_8cs_source.html | 100 + _semaphore_slim_context_8cs.html | 105 + _semaphore_slim_context_8cs_source.html | 91 + _server_8cs.html | 102 + _server_8cs_source.html | 119 + _server_client_8cs.html | 102 + _server_client_8cs_source.html | 120 + _server_client_factory_8cs.html | 102 + _server_client_factory_8cs_source.html | 105 + _server_error_exception_8cs.html | 103 + _server_error_exception_8cs_source.html | 94 + _server_factory_8cs.html | 102 + _server_factory_8cs_source.html | 92 + _server_information_8cs.html | 105 + _server_information_8cs_source.html | 86 + _server_service_8cs.html | 105 + _server_service_8cs_source.html | 102 + _server_side_modifications_8cs.html | 107 + _server_side_modifications_8cs_source.html | 88 + _service_collection_extensions_8cs.html | 105 + ...vice_collection_extensions_8cs_source.html | 91 + _service_unavailable_exception_8cs.html | 103 + ...vice_unavailable_exception_8cs_source.html | 93 + _session_controller_8cs.html | 106 + _session_controller_8cs_source.html | 177 ++ _session_controller_factory_8cs.html | 106 + _session_controller_factory_8cs_source.html | 169 ++ _setup_wizard_8cs.html | 104 + _setup_wizard_8cs_source.html | 142 ++ _setup_wizard_mode_8cs.html | 109 + _setup_wizard_mode_8cs_source.html | 88 + _sql_server_database_context_8cs.html | 105 + _sql_server_database_context_8cs_source.html | 96 + ...r_database_context_model_snapshot_8cs.html | 106 + ...ase_context_model_snapshot_8cs_source.html | 87 + ...er_design_time_db_context_factory_8cs.html | 106 + ...gn_time_db_context_factory_8cs_source.html | 95 + _synchronous_i_o_manager_8cs.html | 104 + _synchronous_i_o_manager_8cs_source.html | 92 + _task_extensions_8cs.html | 105 + _task_extensions_8cs_source.html | 86 + _temporary_dmb_provider_8cs.html | 107 + _temporary_dmb_provider_8cs_source.html | 96 + _test_api_client_8cs.html | 104 + _test_api_client_8cs_source.html | 96 + _test_api_headers_8cs.html | 105 + _test_api_headers_8cs_source.html | 89 + _test_application_8cs.html | 111 + _test_application_8cs_source.html | 104 + _test_async_delayer_8cs.html | 106 + _test_async_delayer_8cs_source.html | 87 + _test_authentication_context_8cs.html | 107 + _test_authentication_context_8cs_source.html | 98 + _test_console_8cs.html | 106 + _test_console_8cs_source.html | 87 + _test_d_b_connection_factory_8cs.html | 106 + _test_d_b_connection_factory_8cs_source.html | 93 + _test_database_context_factory_8cs.html | 106 + ...t_database_context_factory_8cs_source.html | 92 + _test_discord_provider_8cs.html | 110 + _test_discord_provider_8cs_source.html | 91 + _test_dream_daemon_client_8cs.html | 106 + _test_dream_daemon_client_8cs_source.html | 94 + _test_experimental_watchdog_8cs.html | 108 + _test_experimental_watchdog_8cs_source.html | 103 + _test_git_hub_client_factory_8cs.html | 106 + _test_git_hub_client_factory_8cs_source.html | 88 + _test_irc_connection_string_builder_8cs.html | 106 + ..._connection_string_builder_8cs_source.html | 87 + _test_job_exception_8cs.html | 106 + _test_job_exception_8cs_source.html | 86 + _test_job_handler_8cs.html | 106 + _test_job_handler_8cs_source.html | 93 + _test_merge_base_8cs.html | 107 + _test_merge_base_8cs_source.html | 94 + _test_merge_parameters_8cs.html | 105 + _test_merge_parameters_8cs_source.html | 87 + _test_platform_identifier_8cs.html | 106 + _test_platform_identifier_8cs_source.html | 86 + _test_posix_byond_installer_8cs.html | 108 + _test_posix_byond_installer_8cs_source.html | 93 + _test_post_write_handler_8cs.html | 106 + _test_post_write_handler_8cs_source.html | 91 + _test_program_8cs.html | 106 + _test_program_8cs_source.html | 92 + _test_rights_8cs.html | 107 + _test_rights_8cs_source.html | 88 + _test_server_client_factory_8cs.html | 104 + _test_server_client_factory_8cs_source.html | 86 + _test_server_factory_8cs.html | 105 + _test_server_factory_8cs_source.html | 87 + _test_server_service_8cs.html | 107 + _test_server_service_8cs_source.html | 92 + _test_service_collection_extensions_8cs.html | 114 + ...vice_collection_extensions_8cs_source.html | 93 + _test_setup_wizard_8cs.html | 106 + _test_setup_wizard_8cs_source.html | 95 + _test_symlink_factory_8cs.html | 106 + _test_symlink_factory_8cs_source.html | 94 + _test_watchdog_8cs.html | 106 + _test_watchdog_8cs_source.html | 86 + _test_watchdog_factory_8cs.html | 107 + _test_watchdog_factory_8cs_source.html | 86 + _testing_server_8cs.html | 102 + _testing_server_8cs_source.html | 101 + _tgs_authorize_attribute_8cs.html | 105 + _tgs_authorize_attribute_8cs_source.html | 109 + ..._server_8_api_2_models_2_chat_bot_8cs.html | 104 + ..._8_api_2_models_2_chat_bot_8cs_source.html | 88 + ...ver_8_api_2_models_2_chat_channel_8cs.html | 105 + ...pi_2_models_2_chat_channel_8cs_source.html | 90 + ...rver_8_api_2_models_2_compile_job_8cs.html | 104 + ...api_2_models_2_compile_job_8cs_source.html | 87 + ...rver_8_api_2_models_2_dream_maker_8cs.html | 105 + ...api_2_models_2_dream_maker_8cs_source.html | 88 + ..._server_8_api_2_models_2_instance_8cs.html | 105 + ..._8_api_2_models_2_instance_8cs_source.html | 94 + ...er_8_api_2_models_2_instance_user_8cs.html | 105 + ...i_2_models_2_instance_user_8cs_source.html | 96 + ...pi_2_models_2_internal_2_chat_bot_8cs.html | 107 + ...dels_2_internal_2_chat_bot_8cs_source.html | 96 + ...2_models_2_internal_2_compile_job_8cs.html | 107 + ...s_2_internal_2_compile_job_8cs_source.html | 90 + ..._internal_2_dream_daemon_settings_8cs.html | 107 + ...al_2_dream_daemon_settings_8cs_source.html | 88 + ...r_8_api_2_models_2_internal_2_job_8cs.html | 107 + ..._2_models_2_internal_2_job_8cs_source.html | 97 + ..._2_internal_2_repository_settings_8cs.html | 107 + ...rnal_2_repository_settings_8cs_source.html | 93 + ...2_internal_2_revision_information_8cs.html | 107 + ...nal_2_revision_information_8cs_source.html | 86 + ..._2_models_2_internal_2_test_merge_8cs.html | 107 + ...ls_2_internal_2_test_merge_8cs_source.html | 87 + ..._8_api_2_models_2_internal_2_user_8cs.html | 107 + ...2_models_2_internal_2_user_8cs_source.html | 95 + ...ion_8_server_8_api_2_models_2_job_8cs.html | 105 + ...erver_8_api_2_models_2_job_8cs_source.html | 88 + ...erver_8_api_2_models_2_repository_8cs.html | 105 + ..._api_2_models_2_repository_8cs_source.html | 94 + ...i_2_models_2_revision_information_8cs.html | 104 + ...els_2_revision_information_8cs_source.html | 88 + ...erver_8_api_2_models_2_test_merge_8cs.html | 104 + ..._api_2_models_2_test_merge_8cs_source.html | 86 + ...on_8_server_8_api_2_models_2_user_8cs.html | 104 + ...rver_8_api_2_models_2_user_8cs_source.html | 87 + ...on_8_server_8_api_8_assembly_info_8cs.html | 84 + ...rver_8_api_8_assembly_info_8cs_source.html | 82 + ...ver_8_api_8_tests_8_assembly_info_8cs.html | 84 + ...pi_8_tests_8_assembly_info_8cs_source.html | 82 + ..._8_server_8_api_8_tests_8_program_8cs.html | 92 + ...er_8_api_8_tests_8_program_8cs_source.html | 84 + ...8_server_8_client_2_assembly_info_8cs.html | 84 + ...r_8_client_2_assembly_info_8cs_source.html | 82 + ...8_server_8_client_8_assembly_info_8cs.html | 84 + ...r_8_client_8_assembly_info_8cs_source.html | 82 + ..._8_client_8_tests_8_assembly_info_8cs.html | 84 + ...nt_8_tests_8_assembly_info_8cs_source.html | 82 + ...server_8_client_8_tests_8_program_8cs.html | 92 + ...8_client_8_tests_8_program_8cs_source.html | 84 + ...n_8_server_8_host_2_assembly_info_8cs.html | 84 + ...ver_8_host_2_assembly_info_8cs_source.html | 82 + ...8_host_2_components_2_chat_2_user_8cs.html | 107 + ...2_components_2_chat_2_user_8cs_source.html | 89 + ...mponents_2_compiler_2_dream_maker_8cs.html | 106 + ...s_2_compiler_2_dream_maker_8cs_source.html | 160 ++ ...er_8_host_2_components_2_instance_8cs.html | 104 + ...st_2_components_2_instance_8cs_source.html | 185 ++ ...components_2_interop_2_test_merge_8cs.html | 107 + ...nts_2_interop_2_test_merge_8cs_source.html | 94 + ...ponents_2_repository_2_repository_8cs.html | 106 + ..._2_repository_2_repository_8cs_source.html | 136 ++ ...server_8_host_2_models_2_chat_bot_8cs.html | 104 + ...8_host_2_models_2_chat_bot_8cs_source.html | 93 + ...er_8_host_2_models_2_chat_channel_8cs.html | 104 + ...st_2_models_2_chat_channel_8cs_source.html | 99 + ...ver_8_host_2_models_2_compile_job_8cs.html | 104 + ...ost_2_models_2_compile_job_8cs_source.html | 96 + ..._2_models_2_dream_daemon_settings_8cs.html | 104 + ...ls_2_dream_daemon_settings_8cs_source.html | 89 + ...server_8_host_2_models_2_instance_8cs.html | 105 + ...8_host_2_models_2_instance_8cs_source.html | 99 + ...r_8_host_2_models_2_instance_user_8cs.html | 104 + ...t_2_models_2_instance_user_8cs_source.html | 97 + ...on_8_server_8_host_2_models_2_job_8cs.html | 104 + ...rver_8_host_2_models_2_job_8cs_source.html | 99 + ...st_2_models_2_repository_settings_8cs.html | 104 + ...dels_2_repository_settings_8cs_source.html | 101 + ...t_2_models_2_revision_information_8cs.html | 104 + ...els_2_revision_information_8cs_source.html | 95 + ...rver_8_host_2_models_2_test_merge_8cs.html | 104 + ...host_2_models_2_test_merge_8cs_source.html | 101 + ...n_8_server_8_host_2_models_2_user_8cs.html | 104 + ...ver_8_host_2_models_2_user_8cs_source.html | 99 + ...n_8_server_8_host_8_assembly_info_8cs.html | 84 + ...ver_8_host_8_assembly_info_8cs_source.html | 82 + ..._8_host_8_console_2_assembly_info_8cs.html | 84 + ..._8_console_2_assembly_info_8cs_source.html | 82 + ..._8_host_8_console_8_assembly_info_8cs.html | 84 + ..._8_console_8_assembly_info_8cs_source.html | 82 + ...8_console_8_tests_8_assembly_info_8cs.html | 84 + ...le_8_tests_8_assembly_info_8cs_source.html | 82 + ..._host_8_console_8_tests_8_program_8cs.html | 92 + ..._console_8_tests_8_program_8cs_source.html | 84 + ...rver_8_host_8_razor_assembly_info_8cs.html | 84 + ...host_8_razor_assembly_info_8cs_source.html | 82 + ...vice_2_properties_2_assembly_info_8cs.html | 84 + ...properties_2_assembly_info_8cs_source.html | 82 + ..._8_host_8_service_8_assembly_info_8cs.html | 84 + ..._8_service_8_assembly_info_8cs_source.html | 82 + ...8_service_8_tests_8_assembly_info_8cs.html | 84 + ...ce_8_tests_8_assembly_info_8cs_source.html | 82 + ...er_8_host_8_tests_8_assembly_info_8cs.html | 84 + ...st_8_tests_8_assembly_info_8cs_source.html | 82 + ...8_server_8_host_8_tests_8_program_8cs.html | 92 + ...r_8_host_8_tests_8_program_8cs_source.html | 84 + ...8_host_8_watchdog_2_assembly_info_8cs.html | 84 + ...8_watchdog_2_assembly_info_8cs_source.html | 82 + ...8_host_8_watchdog_8_assembly_info_8cs.html | 84 + ...8_watchdog_8_assembly_info_8cs_source.html | 82 + ..._watchdog_8_tests_8_assembly_info_8cs.html | 84 + ...og_8_tests_8_assembly_info_8cs_source.html | 82 + ...host_8_watchdog_8_tests_8_program_8cs.html | 92 + ...watchdog_8_tests_8_program_8cs_source.html | 84 + ..._8_server_8_tests_8_assembly_info_8cs.html | 84 + ...er_8_tests_8_assembly_info_8cs_source.html | 82 + ...tation_8_server_8_tests_8_program_8cs.html | 92 + ...8_server_8_tests_8_program_8cs_source.html | 84 + _token_8cs.html | 105 + _token_8cs_source.html | 86 + _token_factory_8cs.html | 104 + _token_factory_8cs_source.html | 103 + _unauthorized_exception_8cs.html | 103 + _unauthorized_exception_8cs_source.html | 93 + _unrecognized_response_exception_8cs.html | 103 + ...ognized_response_exception_8cs_source.html | 94 + _updates_configuration_8cs.html | 105 + _updates_configuration_8cs_source.html | 91 + _user_controller_8cs.html | 105 + _user_controller_8cs_source.html | 128 + _user_update_8cs.html | 105 + _user_update_8cs_source.html | 86 + _users_client_8cs.html | 102 + _users_client_8cs_source.html | 103 + _version_command_8cs.html | 109 + _version_command_8cs_source.html | 98 + _watchdog_2_i_watchdog_8cs.html | 105 + _watchdog_2_i_watchdog_8cs_source.html | 85 + _watchdog_2_i_watchdog_factory_8cs.html | 105 + ...chdog_2_i_watchdog_factory_8cs_source.html | 86 + _watchdog_2_watchdog_factory_8cs.html | 104 + _watchdog_2_watchdog_factory_8cs_source.html | 88 + _watchdog_8cs.html | 104 + _watchdog_8cs_source.html | 91 + _watchdog_base_8cs.html | 107 + _watchdog_base_8cs_source.html | 187 ++ _watchdog_reattach_information_base_8cs.html | 105 + ..._reattach_information_base_8cs_source.html | 87 + _windows_byond_installer_8cs.html | 107 + _windows_byond_installer_8cs_source.html | 122 + _windows_network_prompt_reaper_8cs.html | 106 + ...dows_network_prompt_reaper_8cs_source.html | 118 + _windows_post_write_handler_8cs.html | 105 + _windows_post_write_handler_8cs_source.html | 86 + _windows_symlink_factory_8cs.html | 105 + _windows_symlink_factory_8cs_source.html | 89 + _windows_system_identity_8cs.html | 105 + _windows_system_identity_8cs_source.html | 94 + _windows_system_identity_factory_8cs.html | 105 + ...ws_system_identity_factory_8cs_source.html | 94 + annotated.html | 491 ++++ api.html | 346 +++ architecture.html | 291 +++ bc_s.png | Bin 0 -> 676 bytes bdwn.png | Bin 0 -> 147 bytes class_authorize_attribute.html | 90 + class_authorize_attribute.png | Bin 0 -> 1017 bytes class_auto_generated_program-members.html | 87 + class_auto_generated_program.html | 301 +++ class_controller.html | 92 + class_controller.png | Bin 0 -> 2123 bytes class_db_context.html | 90 + class_db_context.png | Bin 0 -> 1045 bytes class_i_application_lifetime.html | 90 + class_i_application_lifetime.png | Bin 0 -> 1118 bytes class_i_design_time_db_context_factory.html | 91 + class_i_design_time_db_context_factory.png | Bin 0 -> 1777 bytes class_i_disposable.html | 118 + class_i_disposable.png | Bin 0 -> 24790 bytes class_i_hosted_service.html | 99 + class_i_hosted_service.png | Bin 0 -> 9021 bytes class_json_converter.html | 90 + class_json_converter.png | Bin 0 -> 1036 bytes class_migration.html | 101 + class_migration.png | Bin 0 -> 11783 bytes class_model_snapshot.html | 91 + class_model_snapshot.png | Bin 0 -> 1635 bytes class_release_notes_1_1_program-members.html | 86 + class_release_notes_1_1_program.html | 133 ++ class_service_base.html | 90 + class_service_base.png | Bin 0 -> 764 bytes ...erver_1_1_api_1_1_api_headers-members.html | 108 + ...on_1_1_server_1_1_api_1_1_api_headers.html | 936 ++++++++ ...1_1_models_1_1_administration-members.html | 89 + ...1_1_api_1_1_models_1_1_administration.html | 220 ++ ..._1_1_api_1_1_models_1_1_byond-members.html | 87 + ...1_server_1_1_api_1_1_models_1_1_byond.html | 158 ++ ...1_api_1_1_models_1_1_chat_bot-members.html | 94 + ...erver_1_1_api_1_1_models_1_1_chat_bot.html | 197 ++ ...server_1_1_api_1_1_models_1_1_chat_bot.png | Bin 0 -> 998 bytes ...i_1_1_models_1_1_chat_channel-members.html | 91 + ...r_1_1_api_1_1_models_1_1_chat_channel.html | 289 +++ ...er_1_1_api_1_1_models_1_1_chat_channel.png | Bin 0 -> 963 bytes ...pi_1_1_models_1_1_compile_job-members.html | 93 + ...er_1_1_api_1_1_models_1_1_compile_job.html | 215 ++ ...ver_1_1_api_1_1_models_1_1_compile_job.png | Bin 0 -> 1119 bytes ...models_1_1_configuration_file-members.html | 90 + ...api_1_1_models_1_1_configuration_file.html | 251 ++ ...ord_connection_string_builder-members.html | 90 + ...1_1_discord_connection_string_builder.html | 266 +++ ..._1_1_discord_connection_string_builder.png | Bin 0 -> 1386 bytes ...i_1_1_models_1_1_dream_daemon-members.html | 100 + ...r_1_1_api_1_1_models_1_1_dream_daemon.html | 317 +++ ...er_1_1_api_1_1_models_1_1_dream_daemon.png | Bin 0 -> 2043 bytes ...pi_1_1_models_1_1_dream_maker-members.html | 88 + ...er_1_1_api_1_1_models_1_1_dream_maker.html | 196 ++ ...ver_1_1_api_1_1_models_1_1_dream_maker.png | Bin 0 -> 1182 bytes ..._1_1_models_1_1_error_message-members.html | 87 + ..._1_1_api_1_1_models_1_1_error_message.html | 162 ++ ...1_api_1_1_models_1_1_instance-members.html | 93 + ...erver_1_1_api_1_1_models_1_1_instance.html | 347 +++ ...server_1_1_api_1_1_models_1_1_instance.png | Bin 0 -> 910 bytes ..._1_1_models_1_1_instance_user-members.html | 93 + ..._1_1_api_1_1_models_1_1_instance_user.html | 343 +++ ...r_1_1_api_1_1_models_1_1_instance_user.png | Bin 0 -> 966 bytes ...els_1_1_internal_1_1_chat_bot-members.html | 92 + ..._1_1_models_1_1_internal_1_1_chat_bot.html | 332 +++ ...i_1_1_models_1_1_internal_1_1_chat_bot.png | Bin 0 -> 1391 bytes ...hat_connection_string_builder-members.html | 87 + ...al_1_1_chat_connection_string_builder.html | 179 ++ ...nal_1_1_chat_connection_string_builder.png | Bin 0 -> 1858 bytes ..._1_1_internal_1_1_compile_job-members.html | 90 + ...1_models_1_1_internal_1_1_compile_job.html | 261 +++ ..._1_models_1_1_internal_1_1_compile_job.png | Bin 0 -> 1553 bytes ...ream_daemon_launch_parameters-members.html | 91 + ...al_1_1_dream_daemon_launch_parameters.html | 303 +++ ...nal_1_1_dream_daemon_launch_parameters.png | Bin 0 -> 2801 bytes ...nal_1_1_dream_daemon_settings-members.html | 94 + ..._1_internal_1_1_dream_daemon_settings.html | 223 ++ ...1_1_internal_1_1_dream_daemon_settings.png | Bin 0 -> 2792 bytes ...1_models_1_1_internal_1_1_job-members.html | 93 + ...1_api_1_1_models_1_1_internal_1_1_job.html | 350 +++ ..._1_api_1_1_models_1_1_internal_1_1_job.png | Bin 0 -> 1221 bytes ...ernal_1_1_repository_settings-members.html | 94 + ..._1_1_internal_1_1_repository_settings.html | 373 +++ ...s_1_1_internal_1_1_repository_settings.png | Bin 0 -> 1725 bytes ...rnal_1_1_revision_information-members.html | 87 + ...1_1_internal_1_1_revision_information.html | 172 ++ ..._1_1_internal_1_1_revision_information.png | Bin 0 -> 1642 bytes ...s_1_1_internal_1_1_test_merge-members.html | 96 + ..._1_models_1_1_internal_1_1_test_merge.html | 203 ++ ...1_1_models_1_1_internal_1_1_test_merge.png | Bin 0 -> 3214 bytes ..._internal_1_1_test_merge_base-members.html | 94 + ...dels_1_1_internal_1_1_test_merge_base.html | 332 +++ ...odels_1_1_internal_1_1_test_merge_base.png | Bin 0 -> 3643 bytes ..._models_1_1_internal_1_1_user-members.html | 92 + ..._api_1_1_models_1_1_internal_1_1_user.html | 326 +++ ...1_api_1_1_models_1_1_internal_1_1_user.png | Bin 0 -> 1812 bytes ...irc_connection_string_builder-members.html | 95 + ...els_1_1_irc_connection_string_builder.html | 436 ++++ ...dels_1_1_irc_connection_string_builder.png | Bin 0 -> 1370 bytes ...er_1_1_api_1_1_models_1_1_job-members.html | 96 + ...1_1_server_1_1_api_1_1_models_1_1_job.html | 221 ++ ..._1_1_server_1_1_api_1_1_models_1_1_job.png | Bin 0 -> 912 bytes ...api_1_1_models_1_1_repository-members.html | 103 + ...ver_1_1_api_1_1_models_1_1_repository.html | 408 ++++ ...rver_1_1_api_1_1_models_1_1_repository.png | Bin 0 -> 1199 bytes ...dels_1_1_revision_information-members.html | 90 + ...i_1_1_models_1_1_revision_information.html | 204 ++ ...pi_1_1_models_1_1_revision_information.png | Bin 0 -> 1201 bytes ...models_1_1_server_information-members.html | 87 + ...api_1_1_models_1_1_server_information.html | 158 ++ ...api_1_1_models_1_1_test_merge-members.html | 97 + ...ver_1_1_api_1_1_models_1_1_test_merge.html | 179 ++ ...rver_1_1_api_1_1_models_1_1_test_merge.png | Bin 0 -> 2402 bytes ...els_1_1_test_merge_parameters-members.html | 88 + ..._1_1_models_1_1_test_merge_parameters.html | 206 ++ ...i_1_1_models_1_1_test_merge_parameters.png | Bin 0 -> 3648 bytes ...irc_connection_string_builder-members.html | 86 + ..._1_test_irc_connection_string_builder.html | 118 + ..._1_1_api_1_1_models_1_1_token-members.html | 87 + ...1_server_1_1_api_1_1_models_1_1_token.html | 162 ++ ...r_1_1_api_1_1_models_1_1_user-members.html | 95 + ..._1_server_1_1_api_1_1_models_1_1_user.html | 211 ++ ...1_1_server_1_1_api_1_1_models_1_1_user.png | Bin 0 -> 1371 bytes ...pi_1_1_models_1_1_user_update-members.html | 96 + ...er_1_1_api_1_1_models_1_1_user_update.html | 175 ++ ...ver_1_1_api_1_1_models_1_1_user_update.png | Bin 0 -> 1367 bytes ..._1_1_rights_1_1_rights_helper-members.html | 90 + ..._1_1_api_1_1_rights_1_1_rights_helper.html | 326 +++ ...hts_1_1_tests_1_1_test_rights-members.html | 86 + ..._1_1_rights_1_1_tests_1_1_test_rights.html | 124 + ...1_1_server_1_1_api_1_1_routes-members.html | 101 + ...station_1_1_server_1_1_api_1_1_routes.html | 494 ++++ ..._1_tests_1_1_test_api_headers-members.html | 88 + ..._1_api_1_1_tests_1_1_test_api_headers.html | 180 ++ ...ent_1_1_administration_client-members.html | 90 + ..._1_1_client_1_1_administration_client.html | 264 +++ ...r_1_1_client_1_1_administration_client.png | Bin 0 -> 927 bytes ...ver_1_1_client_1_1_api_client-members.html | 112 + ..._1_1_server_1_1_client_1_1_api_client.html | 1195 ++++++++++ ...n_1_1_server_1_1_client_1_1_api_client.png | Bin 0 -> 1087 bytes ...client_1_1_api_client_factory-members.html | 86 + ...ver_1_1_client_1_1_api_client_factory.html | 145 ++ ...rver_1_1_client_1_1_api_client_factory.png | Bin 0 -> 956 bytes ...nt_1_1_api_conflict_exception-members.html | 95 + ...1_1_client_1_1_api_conflict_exception.html | 273 +++ ..._1_1_client_1_1_api_conflict_exception.png | Bin 0 -> 1188 bytes ...nt_1_1_api_mismatch_exception-members.html | 95 + ...1_1_client_1_1_api_mismatch_exception.html | 260 +++ ..._1_1_client_1_1_api_mismatch_exception.png | Bin 0 -> 1336 bytes ...1_client_1_1_client_exception-members.html | 91 + ...erver_1_1_client_1_1_client_exception.html | 364 +++ ...server_1_1_client_1_1_client_exception.png | Bin 0 -> 9509 bytes ...1_components_1_1_byond_client-members.html | 92 + ...lient_1_1_components_1_1_byond_client.html | 361 +++ ...client_1_1_components_1_1_byond_client.png | Bin 0 -> 1105 bytes ...mponents_1_1_chat_bots_client-members.html | 95 + ...t_1_1_components_1_1_chat_bots_client.html | 491 ++++ ...nt_1_1_components_1_1_chat_bots_client.png | Bin 0 -> 1135 bytes ...ents_1_1_configuration_client-members.html | 96 + ...1_components_1_1_configuration_client.html | 559 +++++ ..._1_components_1_1_configuration_client.png | Bin 0 -> 1186 bytes ...nents_1_1_dream_daemon_client-members.html | 94 + ..._1_components_1_1_dream_daemon_client.html | 411 ++++ ...1_1_components_1_1_dream_daemon_client.png | Bin 0 -> 1201 bytes ...onents_1_1_dream_maker_client-members.html | 94 + ...1_1_components_1_1_dream_maker_client.html | 421 ++++ ..._1_1_components_1_1_dream_maker_client.png | Bin 0 -> 1200 bytes ...omponents_1_1_instance_client-members.html | 96 + ...nt_1_1_components_1_1_instance_client.html | 493 ++++ ...ent_1_1_components_1_1_instance_client.png | Bin 0 -> 1108 bytes ...ents_1_1_instance_user_client-members.html | 96 + ...1_components_1_1_instance_user_client.html | 516 ++++ ..._1_components_1_1_instance_user_client.png | Bin 0 -> 1179 bytes ..._1_components_1_1_jobs_client-members.html | 92 + ...client_1_1_components_1_1_jobs_client.html | 342 +++ ..._client_1_1_components_1_1_jobs_client.png | Bin 0 -> 1053 bytes ...ponents_1_1_repository_client-members.html | 94 + ..._1_1_components_1_1_repository_client.html | 446 ++++ ...t_1_1_components_1_1_repository_client.png | Bin 0 -> 1172 bytes ..._1_1_test_dream_daemon_client-members.html | 86 + ..._1_tests_1_1_test_dream_daemon_client.html | 123 + ...client_1_1_conflict_exception-members.html | 95 + ...ver_1_1_client_1_1_conflict_exception.html | 271 +++ ...rver_1_1_client_1_1_conflict_exception.png | Bin 0 -> 1152 bytes ...er_1_1_client_1_1_http_client-members.html | 90 + ...1_1_server_1_1_client_1_1_http_client.html | 271 +++ ..._1_1_server_1_1_client_1_1_http_client.png | Bin 0 -> 1072 bytes ...t_1_1_instance_manager_client-members.html | 96 + ..._1_client_1_1_instance_manager_client.html | 501 ++++ ...1_1_client_1_1_instance_manager_client.png | Bin 0 -> 1060 bytes ...ficient_permissions_exception-members.html | 94 + ..._1_insufficient_permissions_exception.html | 230 ++ ...1_1_insufficient_permissions_exception.png | Bin 0 -> 1486 bytes ...ethod_not_supported_exception-members.html | 94 + ...nt_1_1_method_not_supported_exception.html | 230 ++ ...ent_1_1_method_not_supported_exception.png | Bin 0 -> 1462 bytes ...ient_1_1_rate_limit_exception-members.html | 95 + ...r_1_1_client_1_1_rate_limit_exception.html | 262 +++ ...er_1_1_client_1_1_rate_limit_exception.png | Bin 0 -> 1172 bytes ...1_1_request_timeout_exception-members.html | 94 + ..._client_1_1_request_timeout_exception.html | 230 ++ ...1_client_1_1_request_timeout_exception.png | Bin 0 -> 1405 bytes ..._1_1_client_1_1_server_client-members.html | 97 + ...1_server_1_1_client_1_1_server_client.html | 503 ++++ ..._1_server_1_1_client_1_1_server_client.png | Bin 0 -> 1060 bytes ...ent_1_1_server_client_factory-members.html | 90 + ..._1_1_client_1_1_server_client_factory.html | 327 +++ ...r_1_1_client_1_1_server_client_factory.png | Bin 0 -> 923 bytes ...nt_1_1_server_error_exception-members.html | 95 + ...1_1_client_1_1_server_error_exception.html | 265 +++ ..._1_1_client_1_1_server_error_exception.png | Bin 0 -> 1235 bytes ...service_unavailable_exception-members.html | 94 + ...ent_1_1_service_unavailable_exception.html | 230 ++ ...ient_1_1_service_unavailable_exception.png | Bin 0 -> 1437 bytes ...1_1_tests_1_1_test_api_client-members.html | 87 + ..._client_1_1_tests_1_1_test_api_client.html | 150 ++ ..._1_test_server_client_factory-members.html | 86 + ..._tests_1_1_test_server_client_factory.html | 117 + ...nt_1_1_unauthorized_exception-members.html | 94 + ...1_1_client_1_1_unauthorized_exception.html | 230 ++ ..._1_1_client_1_1_unauthorized_exception.png | Bin 0 -> 1361 bytes ...recognized_response_exception-members.html | 95 + ...t_1_1_unrecognized_response_exception.html | 272 +++ ...nt_1_1_unrecognized_response_exception.png | Bin 0 -> 1472 bytes ...r_1_1_client_1_1_users_client-members.html | 94 + ..._1_server_1_1_client_1_1_users_client.html | 426 ++++ ...1_1_server_1_1_client_1_1_users_client.png | Bin 0 -> 846 bytes ...ond_1_1_byond_executable_lock-members.html | 91 + ...s_1_1_byond_1_1_byond_executable_lock.html | 318 +++ ...ts_1_1_byond_1_1_byond_executable_lock.png | Bin 0 -> 1699 bytes ...s_1_1_byond_1_1_byond_manager-members.html | 104 + ...omponents_1_1_byond_1_1_byond_manager.html | 833 +++++++ ...components_1_1_byond_1_1_byond_manager.png | Bin 0 -> 2280 bytes ...ond_1_1_posix_byond_installer-members.html | 99 + ...s_1_1_byond_1_1_posix_byond_installer.html | 593 +++++ ...ts_1_1_byond_1_1_posix_byond_installer.png | Bin 0 -> 1300 bytes ..._1_test_posix_byond_installer-members.html | 89 + ..._tests_1_1_test_posix_byond_installer.html | 180 ++ ...d_1_1_windows_byond_installer-members.html | 102 + ...1_1_byond_1_1_windows_byond_installer.html | 695 ++++++ ..._1_1_byond_1_1_windows_byond_installer.png | Bin 0 -> 1778 bytes ...mponents_1_1_chat_1_1_channel-members.html | 92 + ...t_1_1_components_1_1_chat_1_1_channel.html | 315 +++ ..._1_1_chat_1_1_channel_mapping-members.html | 90 + ...mponents_1_1_chat_1_1_channel_mapping.html | 247 ++ ..._components_1_1_chat_1_1_chat-members.html | 121 + ...host_1_1_components_1_1_chat_1_1_chat.html | 1535 ++++++++++++ ..._host_1_1_components_1_1_chat_1_1_chat.png | Bin 0 -> 2225 bytes ...nts_1_1_chat_1_1_chat_factory-members.html | 91 + ..._components_1_1_chat_1_1_chat_factory.html | 341 +++ ...1_components_1_1_chat_1_1_chat_factory.png | Bin 0 -> 1190 bytes ...1_commands_1_1_bool_converter-members.html | 88 + ..._chat_1_1_commands_1_1_bool_converter.html | 213 ++ ...1_chat_1_1_commands_1_1_bool_converter.png | Bin 0 -> 1033 bytes ..._1_commands_1_1_byond_command-members.html | 92 + ...1_chat_1_1_commands_1_1_byond_command.html | 350 +++ ..._1_chat_1_1_commands_1_1_byond_command.png | Bin 0 -> 1301 bytes ..._commands_1_1_command_factory-members.html | 94 + ...chat_1_1_commands_1_1_command_factory.html | 438 ++++ ..._chat_1_1_commands_1_1_command_factory.png | Bin 0 -> 1352 bytes ...1_commands_1_1_custom_command-members.html | 91 + ..._chat_1_1_commands_1_1_custom_command.html | 328 +++ ...1_chat_1_1_commands_1_1_custom_command.png | Bin 0 -> 1287 bytes ..._1_1_commands_1_1_kek_command-members.html | 90 + ...1_1_chat_1_1_commands_1_1_kek_command.html | 261 +++ ..._1_1_chat_1_1_commands_1_1_kek_command.png | Bin 0 -> 1250 bytes ...nds_1_1_pull_requests_command-members.html | 94 + ..._1_commands_1_1_pull_requests_command.html | 432 ++++ ...1_1_commands_1_1_pull_requests_command.png | Bin 0 -> 1366 bytes ...commands_1_1_revision_command-members.html | 93 + ...hat_1_1_commands_1_1_revision_command.html | 389 +++ ...chat_1_1_commands_1_1_revision_command.png | Bin 0 -> 1310 bytes ..._commands_1_1_version_command-members.html | 91 + ...chat_1_1_commands_1_1_version_command.html | 298 +++ ..._chat_1_1_commands_1_1_version_command.png | Bin 0 -> 1303 bytes ...hat_1_1_json_tracking_context-members.html | 98 + ...ts_1_1_chat_1_1_json_tracking_context.html | 572 +++++ ...nts_1_1_chat_1_1_json_tracking_context.png | Bin 0 -> 1708 bytes ...1_1_chat_1_1_provider_factory-members.html | 91 + ...ponents_1_1_chat_1_1_provider_factory.html | 299 +++ ...mponents_1_1_chat_1_1_provider_factory.png | Bin 0 -> 1279 bytes ...roviders_1_1_discord_provider-members.html | 103 + ...at_1_1_providers_1_1_discord_provider.html | 713 ++++++ ...hat_1_1_providers_1_1_discord_provider.png | Bin 0 -> 2344 bytes ..._1_providers_1_1_irc_provider-members.html | 114 + ...1_chat_1_1_providers_1_1_irc_provider.html | 1102 +++++++++ ..._1_chat_1_1_providers_1_1_irc_provider.png | Bin 0 -> 2230 bytes ...hat_1_1_providers_1_1_message-members.html | 87 + ...ts_1_1_chat_1_1_providers_1_1_message.html | 162 ++ ...at_1_1_providers_1_1_provider-members.html | 98 + ...s_1_1_chat_1_1_providers_1_1_provider.html | 561 +++++ ...ts_1_1_chat_1_1_providers_1_1_provider.png | Bin 0 -> 3179 bytes ...sts_1_1_test_discord_provider-members.html | 90 + ...s_1_1_tests_1_1_test_discord_provider.html | 221 ++ ...ponents_1_1_chat_1_1_response-members.html | 87 + ..._1_1_components_1_1_chat_1_1_response.html | 158 ++ ..._components_1_1_chat_1_1_user-members.html | 90 + ...host_1_1_components_1_1_chat_1_1_user.html | 250 ++ ..._1_1_compiler_1_1_dmb_factory-members.html | 105 + ...mponents_1_1_compiler_1_1_dmb_factory.html | 836 +++++++ ...omponents_1_1_compiler_1_1_dmb_factory.png | Bin 0 -> 2710 bytes ...1_1_compiler_1_1_dmb_provider-members.html | 94 + ...ponents_1_1_compiler_1_1_dmb_provider.html | 387 +++ ...mponents_1_1_compiler_1_1_dmb_provider.png | Bin 0 -> 1539 bytes ..._1_1_compiler_1_1_dream_maker-members.html | 111 + ...mponents_1_1_compiler_1_1_dream_maker.html | 1331 +++++++++++ ...omponents_1_1_compiler_1_1_dream_maker.png | Bin 0 -> 1255 bytes ...er_1_1_temporary_dmb_provider-members.html | 92 + ...1_compiler_1_1_temporary_dmb_provider.html | 343 +++ ..._1_compiler_1_1_temporary_dmb_provider.png | Bin 0 -> 1669 bytes ...components_1_1_event_consumer-members.html | 90 + ...ost_1_1_components_1_1_event_consumer.html | 292 +++ ...host_1_1_components_1_1_event_consumer.png | Bin 0 -> 1150 bytes ...t_1_1_components_1_1_instance-members.html | 110 + ..._1_1_host_1_1_components_1_1_instance.html | 1134 +++++++++ ...r_1_1_host_1_1_components_1_1_instance.png | Bin 0 -> 1816 bytes ...mponents_1_1_instance_factory-members.html | 107 + ...t_1_1_components_1_1_instance_factory.html | 949 ++++++++ ...st_1_1_components_1_1_instance_factory.png | Bin 0 -> 1524 bytes ...mponents_1_1_instance_manager-members.html | 105 + ...t_1_1_components_1_1_instance_manager.html | 813 +++++++ ...st_1_1_components_1_1_instance_manager.png | Bin 0 -> 2385 bytes ..._1_1_interop_1_1_chat_command-members.html | 88 + ...mponents_1_1_interop_1_1_chat_command.html | 187 ++ ..._1_1_interop_1_1_comm_command-members.html | 87 + ...mponents_1_1_interop_1_1_comm_command.html | 162 ++ ..._1_1_interop_1_1_comm_context-members.html | 96 + ...mponents_1_1_interop_1_1_comm_context.html | 519 +++++ ...omponents_1_1_interop_1_1_comm_context.png | Bin 0 -> 1528 bytes ...nts_1_1_interop_1_1_constants-members.html | 102 + ..._components_1_1_interop_1_1_constants.html | 491 ++++ ...nterop_1_1_event_notification-members.html | 87 + ...ts_1_1_interop_1_1_event_notification.html | 158 ++ ...nts_1_1_interop_1_1_json_file-members.html | 94 + ..._components_1_1_interop_1_1_json_file.html | 361 +++ ...nterop_1_1_json_sub_file_list-members.html | 90 + ...ts_1_1_interop_1_1_json_sub_file_list.html | 281 +++ ...nts_1_1_interop_1_1_json_sub_file_list.png | Bin 0 -> 2691 bytes ...ts_1_1_interop_1_1_test_merge-members.html | 97 + ...components_1_1_interop_1_1_test_merge.html | 256 ++ ..._components_1_1_interop_1_1_test_merge.png | Bin 0 -> 1851 bytes ...nts_1_1_reattach_info_handler-members.html | 92 + ..._components_1_1_reattach_info_handler.html | 371 +++ ...1_components_1_1_reattach_info_handler.png | Bin 0 -> 1334 bytes ...tory_1_1_credentials_provider-members.html | 88 + ...1_repository_1_1_credentials_provider.html | 216 ++ ..._1_repository_1_1_credentials_provider.png | Bin 0 -> 1400 bytes ...1_1_repository_1_1_repository-members.html | 118 + ...ponents_1_1_repository_1_1_repository.html | 1486 ++++++++++++ ...mponents_1_1_repository_1_1_repository.png | Bin 0 -> 1531 bytes ...sitory_1_1_repository_manager-members.html | 99 + ...1_1_repository_1_1_repository_manager.html | 656 ++++++ ..._1_1_repository_1_1_repository_manager.png | Bin 0 -> 1694 bytes ...tatic_files_1_1_configuration-members.html | 115 + ...ts_1_1_static_files_1_1_configuration.html | 1308 +++++++++++ ...nts_1_1_static_files_1_1_configuration.png | Bin 0 -> 3006 bytes ...1_1_server_side_modifications-members.html | 89 + ...c_files_1_1_server_side_modifications.html | 252 ++ ...1_watchdog_1_1_basic_watchdog-members.html | 124 + ...nents_1_1_watchdog_1_1_basic_watchdog.html | 760 ++++++ ...onents_1_1_watchdog_1_1_basic_watchdog.png | Bin 0 -> 4870 bytes ...g_1_1_dead_session_controller-members.html | 105 + ..._watchdog_1_1_dead_session_controller.html | 700 ++++++ ...1_watchdog_1_1_dead_session_controller.png | Bin 0 -> 2311 bytes ...dog_1_1_experimental_watchdog-members.html | 127 + ..._1_watchdog_1_1_experimental_watchdog.html | 888 +++++++ ...1_1_watchdog_1_1_experimental_watchdog.png | Bin 0 -> 5019 bytes ..._1_watchdog_1_1_launch_result-members.html | 88 + ...onents_1_1_watchdog_1_1_launch_result.html | 184 ++ ..._1_watchdog_1_1_monitor_state-members.html | 90 + ...onents_1_1_watchdog_1_1_monitor_state.html | 255 ++ ...1_posix_network_prompt_reaper-members.html | 86 + ...chdog_1_1_posix_network_prompt_reaper.html | 135 ++ ...tchdog_1_1_posix_network_prompt_reaper.png | Bin 0 -> 1488 bytes ...hdog_1_1_reattach_information-members.html | 101 + ...1_1_watchdog_1_1_reattach_information.html | 262 +++ ..._1_1_watchdog_1_1_reattach_information.png | Bin 0 -> 1958 bytes ...tchdog_1_1_session_controller-members.html | 125 + ...s_1_1_watchdog_1_1_session_controller.html | 1598 +++++++++++++ ...ts_1_1_watchdog_1_1_session_controller.png | Bin 0 -> 3103 bytes ..._1_session_controller_factory-members.html | 101 + ...tchdog_1_1_session_controller_factory.html | 805 +++++++ ...atchdog_1_1_session_controller_factory.png | Bin 0 -> 1433 bytes ..._1_test_experimental_watchdog-members.html | 87 + ..._tests_1_1_test_experimental_watchdog.html | 146 ++ ..._1_watchdog_1_1_watchdog_base-members.html | 133 ++ ...onents_1_1_watchdog_1_1_watchdog_base.html | 2075 +++++++++++++++++ ...ponents_1_1_watchdog_1_1_watchdog_base.png | Bin 0 -> 5264 bytes ...watchdog_1_1_watchdog_factory-members.html | 94 + ...nts_1_1_watchdog_1_1_watchdog_factory.html | 495 ++++ ...ents_1_1_watchdog_1_1_watchdog_factory.png | Bin 0 -> 1278 bytes ...watchdog_reattach_information-members.html | 93 + ...dog_1_1_watchdog_reattach_information.html | 291 +++ ...hdog_1_1_watchdog_reattach_information.png | Bin 0 -> 1407 bytes ...windows_network_prompt_reaper-members.html | 100 + ...dog_1_1_windows_network_prompt_reaper.html | 620 +++++ ...hdog_1_1_windows_network_prompt_reaper.png | Bin 0 -> 2408 bytes ...1_control_panel_configuration-members.html | 89 + ...ation_1_1_control_panel_configuration.html | 217 ++ ...on_1_1_database_configuration-members.html | 91 + ...figuration_1_1_database_configuration.html | 283 +++ ..._1_file_logging_configuration-members.html | 92 + ...ration_1_1_file_logging_configuration.html | 316 +++ ...ion_1_1_general_configuration-members.html | 95 + ...nfiguration_1_1_general_configuration.html | 406 ++++ ...ion_1_1_updates_configuration-members.html | 92 + ...nfiguration_1_1_updates_configuration.html | 313 +++ ..._host_1_1_console_1_1_program-members.html | 87 + ...rver_1_1_host_1_1_console_1_1_program.html | 184 ++ ...le_1_1_tests_1_1_test_program-members.html | 86 + ..._1_console_1_1_tests_1_1_test_program.html | 119 + ...1_1_administration_controller-members.html | 107 + ...rollers_1_1_administration_controller.html | 769 ++++++ ...trollers_1_1_administration_controller.png | Bin 0 -> 1309 bytes ...ontrollers_1_1_api_controller-members.html | 94 + ...st_1_1_controllers_1_1_api_controller.html | 458 ++++ ...ost_1_1_controllers_1_1_api_controller.png | Bin 0 -> 2111 bytes ...trollers_1_1_byond_controller-members.html | 96 + ..._1_1_controllers_1_1_byond_controller.html | 376 +++ ...t_1_1_controllers_1_1_byond_controller.png | Bin 0 -> 1295 bytes ...ntrollers_1_1_chat_controller-members.html | 97 + ...t_1_1_controllers_1_1_chat_controller.html | 514 ++++ ...st_1_1_controllers_1_1_chat_controller.png | Bin 0 -> 1282 bytes ..._1_1_configuration_controller-members.html | 101 + ...trollers_1_1_configuration_controller.html | 605 +++++ ...ntrollers_1_1_configuration_controller.png | Bin 0 -> 1294 bytes ...s_1_1_dream_daemon_controller-members.html | 100 + ...ntrollers_1_1_dream_daemon_controller.html | 555 +++++ ...ontrollers_1_1_dream_daemon_controller.png | Bin 0 -> 1313 bytes ...rs_1_1_dream_maker_controller-members.html | 97 + ...ontrollers_1_1_dream_maker_controller.html | 493 ++++ ...controllers_1_1_dream_maker_controller.png | Bin 0 -> 1321 bytes ...ntrollers_1_1_home_controller-members.html | 102 + ...t_1_1_controllers_1_1_home_controller.html | 553 +++++ ...st_1_1_controllers_1_1_home_controller.png | Bin 0 -> 1356 bytes ...llers_1_1_instance_controller-members.html | 104 + ...1_controllers_1_1_instance_controller.html | 803 +++++++ ..._1_controllers_1_1_instance_controller.png | Bin 0 -> 1303 bytes ..._1_1_instance_user_controller-members.html | 96 + ...trollers_1_1_instance_user_controller.html | 489 ++++ ...ntrollers_1_1_instance_user_controller.png | Bin 0 -> 1364 bytes ...ontrollers_1_1_job_controller-members.html | 94 + ...st_1_1_controllers_1_1_job_controller.html | 404 ++++ ...ost_1_1_controllers_1_1_job_controller.png | Bin 0 -> 1238 bytes ...trollers_1_1_model_controller-members.html | 99 + ..._1_1_controllers_1_1_model_controller.html | 487 ++++ ...t_1_1_controllers_1_1_model_controller.png | Bin 0 -> 1523 bytes ...ers_1_1_repository_controller-members.html | 102 + ...controllers_1_1_repository_controller.html | 708 ++++++ ..._controllers_1_1_repository_controller.png | Bin 0 -> 1273 bytes ...s_1_1_tgs_authorize_attribute-members.html | 95 + ...ntrollers_1_1_tgs_authorize_attribute.html | 421 ++++ ...ontrollers_1_1_tgs_authorize_attribute.png | Bin 0 -> 1015 bytes ...ntrollers_1_1_user_controller-members.html | 99 + ...t_1_1_controllers_1_1_user_controller.html | 571 +++++ ...st_1_1_controllers_1_1_user_controller.png | Bin 0 -> 1224 bytes ...host_1_1_core_1_1_application-members.html | 96 + ...ver_1_1_host_1_1_core_1_1_application.html | 587 +++++ ...rver_1_1_host_1_1_core_1_1_application.png | Bin 0 -> 908 bytes ...pplication_builder_extensions-members.html | 88 + ...re_1_1_application_builder_extensions.html | 229 ++ ...st_1_1_core_1_1_async_delayer-members.html | 86 + ...r_1_1_host_1_1_core_1_1_async_delayer.html | 145 ++ ...er_1_1_host_1_1_core_1_1_async_delayer.png | Bin 0 -> 964 bytes ...re_1_1_d_b_connection_factory-members.html | 86 + ...t_1_1_core_1_1_d_b_connection_factory.html | 146 ++ ...st_1_1_core_1_1_d_b_connection_factory.png | Bin 0 -> 1149 bytes ..._1_1_database_context_factory-members.html | 88 + ...1_1_core_1_1_database_context_factory.html | 211 ++ ..._1_1_core_1_1_database_context_factory.png | Bin 0 -> 1214 bytes ...re_1_1_git_hub_client_factory-members.html | 90 + ...t_1_1_core_1_1_git_hub_client_factory.html | 270 +++ ...st_1_1_core_1_1_git_hub_client_factory.png | Bin 0 -> 1137 bytes ...st_1_1_core_1_1_job_exception-members.html | 88 + ...r_1_1_host_1_1_core_1_1_job_exception.html | 203 ++ ...er_1_1_host_1_1_core_1_1_job_exception.png | Bin 0 -> 722 bytes ...host_1_1_core_1_1_job_handler-members.html | 92 + ...ver_1_1_host_1_1_core_1_1_job_handler.html | 330 +++ ...rver_1_1_host_1_1_core_1_1_job_handler.png | Bin 0 -> 723 bytes ...host_1_1_core_1_1_job_manager-members.html | 98 + ...ver_1_1_host_1_1_core_1_1_job_manager.html | 647 +++++ ...rver_1_1_host_1_1_core_1_1_job_manager.png | Bin 0 -> 1622 bytes ..._core_1_1_platform_identifier-members.html | 88 + ...host_1_1_core_1_1_platform_identifier.html | 208 ++ ..._host_1_1_core_1_1_platform_identifier.png | Bin 0 -> 1021 bytes ...1_1_host_1_1_core_1_1_process-members.html | 100 + ..._server_1_1_host_1_1_core_1_1_process.html | 622 +++++ ...1_server_1_1_host_1_1_core_1_1_process.png | Bin 0 -> 1545 bytes ...1_1_core_1_1_process_executor-members.html | 91 + ..._1_host_1_1_core_1_1_process_executor.html | 366 +++ ...1_1_host_1_1_core_1_1_process_executor.png | Bin 0 -> 1006 bytes ...core_1_1_restart_registration-members.html | 88 + ...ost_1_1_core_1_1_restart_registration.html | 201 ++ ...host_1_1_core_1_1_restart_registration.png | Bin 0 -> 1413 bytes ...re_1_1_semaphore_slim_context-members.html | 91 + ...t_1_1_core_1_1_semaphore_slim_context.html | 343 +++ ...st_1_1_core_1_1_semaphore_slim_context.png | Bin 0 -> 914 bytes ...service_collection_extensions-members.html | 86 + ...ore_1_1_service_collection_extensions.html | 169 ++ ...ost_1_1_core_1_1_setup_wizard-members.html | 104 + ...er_1_1_host_1_1_core_1_1_setup_wizard.html | 1026 ++++++++ ...ver_1_1_host_1_1_core_1_1_setup_wizard.png | Bin 0 -> 948 bytes ..._1_1_core_1_1_task_extensions-members.html | 87 + ...1_1_host_1_1_core_1_1_task_extensions.html | 208 ++ ..._1_tests_1_1_test_application-members.html | 87 + ...1_core_1_1_tests_1_1_test_application.html | 154 ++ ...1_1_mock_application_lifetime-members.html | 89 + ...ication_1_1_mock_application_lifetime.html | 185 ++ ...lication_1_1_mock_application_lifetime.png | Bin 0 -> 1114 bytes ...ication_1_1_mock_setup_wizard-members.html | 86 + ...est_application_1_1_mock_setup_wizard.html | 137 ++ ...test_application_1_1_mock_setup_wizard.png | Bin 0 -> 1292 bytes ..._tests_1_1_test_async_delayer-members.html | 87 + ...core_1_1_tests_1_1_test_async_delayer.html | 138 ++ ...1_test_d_b_connection_factory-members.html | 87 + ...tests_1_1_test_d_b_connection_factory.html | 140 ++ ...test_database_context_factory-members.html | 87 + ...sts_1_1_test_database_context_factory.html | 140 ++ ...1_test_git_hub_client_factory-members.html | 88 + ...tests_1_1_test_git_hub_client_factory.html | 157 ++ ..._tests_1_1_test_job_exception-members.html | 86 + ...core_1_1_tests_1_1_test_job_exception.html | 117 + ..._1_tests_1_1_test_job_handler-members.html | 92 + ...1_core_1_1_tests_1_1_test_job_handler.html | 301 +++ ..._1_1_test_platform_identifier-members.html | 86 + ..._1_tests_1_1_test_platform_identifier.html | 117 + ...service_collection_extensions-members.html | 86 + ..._1_test_service_collection_extensions.html | 129 + ...on_extensions_1_1_bad_config1-members.html | 86 + ...collection_extensions_1_1_bad_config1.html | 122 + ...on_extensions_1_1_bad_config2-members.html | 86 + ...collection_extensions_1_1_bad_config2.html | 114 + ...collection_extensions_1_1_bad_config3.html | 88 + ...on_extensions_1_1_good_config-members.html | 86 + ...collection_extensions_1_1_good_config.html | 114 + ...1_tests_1_1_test_setup_wizard-members.html | 87 + ..._core_1_1_tests_1_1_test_setup_wizard.html | 141 ++ ..._1_1_host_1_1_i_o_1_1_console-members.html | 90 + ...1_server_1_1_host_1_1_i_o_1_1_console.html | 279 +++ ..._1_server_1_1_host_1_1_i_o_1_1_console.png | Bin 0 -> 829 bytes ...1_i_o_1_1_default_i_o_manager-members.html | 111 + ..._host_1_1_i_o_1_1_default_i_o_manager.html | 1122 +++++++++ ...1_host_1_1_i_o_1_1_default_i_o_manager.png | Bin 0 -> 1597 bytes ..._1_1_posix_post_write_handler-members.html | 86 + ..._1_1_i_o_1_1_posix_post_write_handler.html | 136 ++ ...t_1_1_i_o_1_1_posix_post_write_handler.png | Bin 0 -> 1108 bytes ...i_o_1_1_posix_symlink_factory-members.html | 86 + ...ost_1_1_i_o_1_1_posix_symlink_factory.html | 150 ++ ...host_1_1_i_o_1_1_posix_symlink_factory.png | Bin 0 -> 1088 bytes ...i_o_1_1_resolving_i_o_manager-members.html | 110 + ...ost_1_1_i_o_1_1_resolving_i_o_manager.html | 303 +++ ...host_1_1_i_o_1_1_resolving_i_o_manager.png | Bin 0 -> 1594 bytes ...o_1_1_synchronous_i_o_manager-members.html | 92 + ...t_1_1_i_o_1_1_synchronous_i_o_manager.html | 354 +++ ...st_1_1_i_o_1_1_synchronous_i_o_manager.png | Bin 0 -> 1175 bytes ..._o_1_1_tests_1_1_test_console-members.html | 87 + ...st_1_1_i_o_1_1_tests_1_1_test_console.html | 138 ++ ...s_1_1_test_post_write_handler-members.html | 88 + ...1_1_tests_1_1_test_post_write_handler.html | 163 ++ ...ests_1_1_test_symlink_factory-members.html | 91 + ..._o_1_1_tests_1_1_test_symlink_factory.html | 265 +++ ..._1_windows_post_write_handler-members.html | 86 + ..._1_i_o_1_1_windows_post_write_handler.html | 136 ++ ...1_1_i_o_1_1_windows_post_write_handler.png | Bin 0 -> 1154 bytes ...o_1_1_windows_symlink_factory-members.html | 86 + ...t_1_1_i_o_1_1_windows_symlink_factory.html | 150 ++ ...st_1_1_i_o_1_1_windows_symlink_factory.png | Bin 0 -> 1156 bytes ..._host_1_1_models_1_1_chat_bot-members.html | 96 + ...rver_1_1_host_1_1_models_1_1_chat_bot.html | 246 ++ ...erver_1_1_host_1_1_models_1_1_chat_bot.png | Bin 0 -> 996 bytes ...t_1_1_models_1_1_chat_channel-members.html | 95 + ..._1_1_host_1_1_models_1_1_chat_channel.html | 242 ++ ...r_1_1_host_1_1_models_1_1_chat_channel.png | Bin 0 -> 964 bytes ...st_1_1_models_1_1_compile_job-members.html | 95 + ...r_1_1_host_1_1_models_1_1_compile_job.html | 272 +++ ...er_1_1_host_1_1_models_1_1_compile_job.png | Bin 0 -> 1121 bytes ...1_models_1_1_database_context-members.html | 109 + ..._host_1_1_models_1_1_database_context.html | 937 ++++++++ ...1_host_1_1_models_1_1_database_context.png | Bin 0 -> 1719 bytes ..._1_models_1_1_database_seeder-members.html | 90 + ...1_host_1_1_models_1_1_database_seeder.html | 307 +++ ..._1_host_1_1_models_1_1_database_seeder.png | Bin 0 -> 1113 bytes ...els_1_1_dream_daemon_settings-members.html | 99 + ..._1_1_models_1_1_dream_daemon_settings.html | 287 +++ ...t_1_1_models_1_1_dream_daemon_settings.png | Bin 0 -> 2091 bytes ...dels_1_1_dream_maker_settings-members.html | 92 + ...t_1_1_models_1_1_dream_maker_settings.html | 233 ++ ...st_1_1_models_1_1_dream_maker_settings.png | Bin 0 -> 1183 bytes ..._host_1_1_models_1_1_instance-members.html | 102 + ...rver_1_1_host_1_1_models_1_1_instance.html | 395 ++++ ...erver_1_1_host_1_1_models_1_1_instance.png | Bin 0 -> 908 bytes ..._1_1_models_1_1_instance_user-members.html | 98 + ...1_1_host_1_1_models_1_1_instance_user.html | 274 +++ ..._1_1_host_1_1_models_1_1_instance_user.png | Bin 0 -> 963 bytes ...r_1_1_host_1_1_models_1_1_job-members.html | 98 + ..._1_server_1_1_host_1_1_models_1_1_job.html | 282 +++ ...1_1_server_1_1_host_1_1_models_1_1_job.png | Bin 0 -> 909 bytes ...me_db_context_factory_helpers-members.html | 88 + ...esign_time_db_context_factory_helpers.html | 208 ++ ..._1_1_m_s_add_minimum_security-members.html | 88 + ...grations_1_1_m_s_add_minimum_security.html | 228 ++ ...igrations_1_1_m_s_add_minimum_security.png | Bin 0 -> 1054 bytes ...ns_1_1_m_s_fix_rev_info_index-members.html | 88 + ...migrations_1_1_m_s_fix_rev_info_index.html | 227 ++ ..._migrations_1_1_m_s_fix_rev_info_index.png | Bin 0 -> 1006 bytes ...ations_1_1_m_s_initial_create-members.html | 88 + ...1_1_migrations_1_1_m_s_initial_create.html | 240 ++ ..._1_1_migrations_1_1_m_s_initial_create.png | Bin 0 -> 979 bytes ...lable_and_foreign_key_cleanup-members.html | 88 + ..._m_s_nullable_and_foreign_key_cleanup.html | 227 ++ ...1_m_s_nullable_and_foreign_key_cleanup.png | Bin 0 -> 1140 bytes ...reattach_compile_job_required-members.html | 88 + ...1_1_m_s_reattach_compile_job_required.html | 227 ++ ..._1_1_m_s_reattach_compile_job_required.png | Bin 0 -> 1104 bytes ...m_s_toggle_testmerge_comments-members.html | 88 + ...ons_1_1_m_s_toggle_testmerge_comments.html | 227 ++ ...ions_1_1_m_s_toggle_testmerge_comments.png | Bin 0 -> 1107 bytes ..._1_1_m_y_add_minimum_security-members.html | 88 + ...grations_1_1_m_y_add_minimum_security.html | 228 ++ ...igrations_1_1_m_y_add_minimum_security.png | Bin 0 -> 1056 bytes ...ns_1_1_m_y_fix_rev_info_index-members.html | 88 + ...migrations_1_1_m_y_fix_rev_info_index.html | 227 ++ ..._migrations_1_1_m_y_fix_rev_info_index.png | Bin 0 -> 1003 bytes ...ations_1_1_m_y_initial_create-members.html | 88 + ...1_1_migrations_1_1_m_y_initial_create.html | 240 ++ ..._1_1_migrations_1_1_m_y_initial_create.png | Bin 0 -> 975 bytes ...lable_and_foreign_key_cleanup-members.html | 88 + ..._m_y_nullable_and_foreign_key_cleanup.html | 227 ++ ...1_m_y_nullable_and_foreign_key_cleanup.png | Bin 0 -> 1133 bytes ...reattach_compile_job_required-members.html | 88 + ...1_1_m_y_reattach_compile_job_required.html | 227 ++ ..._1_1_m_y_reattach_compile_job_required.png | Bin 0 -> 1105 bytes ...m_y_toggle_testmerge_comments-members.html | 88 + ...ons_1_1_m_y_toggle_testmerge_comments.html | 227 ++ ...ions_1_1_m_y_toggle_testmerge_comments.png | Bin 0 -> 1105 bytes ...tabase_context_model_snapshot-members.html | 86 + ...y_sql_database_context_model_snapshot.html | 135 ++ ...my_sql_database_context_model_snapshot.png | Bin 0 -> 1194 bytes ...esign_time_db_context_factory-members.html | 86 + ...my_sql_design_time_db_context_factory.html | 135 ++ ..._my_sql_design_time_db_context_factory.png | Bin 0 -> 1468 bytes ...tabase_context_model_snapshot-members.html | 86 + ...erver_database_context_model_snapshot.html | 135 ++ ...server_database_context_model_snapshot.png | Bin 0 -> 1197 bytes ...esign_time_db_context_factory-members.html | 86 + ...server_design_time_db_context_factory.html | 135 ++ ..._server_design_time_db_context_factory.png | Bin 0 -> 1515 bytes ...s_1_1_my_sql_database_context-members.html | 110 + ..._1_models_1_1_my_sql_database_context.html | 298 +++ ...1_1_models_1_1_my_sql_database_context.png | Bin 0 -> 1378 bytes ...dels_1_1_reattach_information-members.html | 100 + ...t_1_1_models_1_1_reattach_information.html | 215 ++ ...st_1_1_models_1_1_reattach_information.png | Bin 0 -> 1858 bytes ...1_1_reattach_information_base-members.html | 98 + ..._models_1_1_reattach_information_base.html | 393 ++++ ...1_models_1_1_reattach_information_base.png | Bin 0 -> 2684 bytes ...odels_1_1_repository_settings-members.html | 98 + ...st_1_1_models_1_1_repository_settings.html | 251 ++ ...ost_1_1_models_1_1_repository_settings.png | Bin 0 -> 1245 bytes ...odels_1_1_rev_info_test_merge-members.html | 88 + ...st_1_1_models_1_1_rev_info_test_merge.html | 187 ++ ...dels_1_1_revision_information-members.html | 94 + ...t_1_1_models_1_1_revision_information.html | 321 +++ ...st_1_1_models_1_1_revision_information.png | Bin 0 -> 1200 bytes ...1_sql_server_database_context-members.html | 110 + ...odels_1_1_sql_server_database_context.html | 294 +++ ...models_1_1_sql_server_database_context.png | Bin 0 -> 1377 bytes ...ost_1_1_models_1_1_test_merge-members.html | 101 + ...er_1_1_host_1_1_models_1_1_test_merge.html | 296 +++ ...ver_1_1_host_1_1_models_1_1_test_merge.png | Bin 0 -> 2392 bytes ..._1_1_host_1_1_models_1_1_user-members.html | 101 + ...1_server_1_1_host_1_1_models_1_1_user.html | 425 ++++ ..._1_server_1_1_host_1_1_models_1_1_user.png | Bin 0 -> 929 bytes ...watchdog_reattach_information-members.html | 92 + ...els_1_1_watchdog_reattach_information.html | 240 ++ ...dels_1_1_watchdog_reattach_information.png | Bin 0 -> 1318 bytes ...dog_reattach_information_base-members.html | 88 + ..._1_watchdog_reattach_information_base.html | 216 ++ ...1_1_watchdog_reattach_information_base.png | Bin 0 -> 1927 bytes ...r_1_1_host_1_1_native_methods-members.html | 94 + ..._1_server_1_1_host_1_1_native_methods.html | 473 ++++ ...1_server_1_1_host_1_1_program-members.html | 87 + ...ation_1_1_server_1_1_host_1_1_program.html | 179 ++ ...ty_1_1_authentication_context-members.html | 92 + ...1_security_1_1_authentication_context.html | 352 +++ ..._1_security_1_1_authentication_context.png | Bin 0 -> 1539 bytes ...uthentication_context_factory-members.html | 92 + ...ty_1_1_authentication_context_factory.html | 380 +++ ...ity_1_1_authentication_context_factory.png | Bin 0 -> 1770 bytes ..._security_1_1_claims_injector-members.html | 89 + ...host_1_1_security_1_1_claims_injector.html | 271 +++ ..._host_1_1_security_1_1_claims_injector.png | Bin 0 -> 1093 bytes ...curity_1_1_cryptography_suite-members.html | 92 + ...t_1_1_security_1_1_cryptography_suite.html | 351 +++ ...st_1_1_security_1_1_cryptography_suite.png | Bin 0 -> 1230 bytes ...1_security_1_1_identity_cache-members.html | 92 + ..._host_1_1_security_1_1_identity_cache.html | 362 +++ ...1_host_1_1_security_1_1_identity_cache.png | Bin 0 -> 1450 bytes ...ity_1_1_identity_cache_object-members.html | 90 + ..._1_security_1_1_identity_cache_object.html | 302 +++ ...1_1_security_1_1_identity_cache_object.png | Bin 0 -> 937 bytes ...posix_system_identity_factory-members.html | 87 + ...ity_1_1_posix_system_identity_factory.html | 186 ++ ...rity_1_1_posix_system_identity_factory.png | Bin 0 -> 1301 bytes ...1_test_authentication_context-members.html | 87 + ...tests_1_1_test_authentication_context.html | 149 ++ ..._1_security_1_1_token_factory-members.html | 92 + ...1_host_1_1_security_1_1_token_factory.html | 370 +++ ..._1_host_1_1_security_1_1_token_factory.png | Bin 0 -> 1073 bytes ...y_1_1_windows_system_identity-members.html | 94 + ..._security_1_1_windows_system_identity.html | 394 ++++ ...1_security_1_1_windows_system_identity.png | Bin 0 -> 1545 bytes ...ndows_system_identity_factory-members.html | 90 + ...y_1_1_windows_system_identity_factory.html | 317 +++ ...ty_1_1_windows_system_identity_factory.png | Bin 0 -> 1334 bytes ..._1_server_1_1_host_1_1_server-members.html | 104 + ...tation_1_1_server_1_1_host_1_1_server.html | 805 +++++++ ...station_1_1_server_1_1_host_1_1_server.png | Bin 0 -> 1134 bytes ...r_1_1_host_1_1_server_factory-members.html | 86 + ..._1_server_1_1_host_1_1_server_factory.html | 149 ++ ...1_1_server_1_1_host_1_1_server_factory.png | Bin 0 -> 865 bytes ..._host_1_1_service_1_1_program-members.html | 94 + ...rver_1_1_host_1_1_service_1_1_program.html | 401 ++++ ..._1_service_1_1_server_service-members.html | 94 + ...1_host_1_1_service_1_1_server_service.html | 464 ++++ ..._1_host_1_1_service_1_1_server_service.png | Bin 0 -> 758 bytes ...tests_1_1_test_server_service-members.html | 87 + ...ice_1_1_tests_1_1_test_server_service.html | 144 ++ ...tests_1_1_test_server_factory-members.html | 87 + ...ost_1_1_tests_1_1_test_server_factory.html | 142 ++ ...g_1_1_tests_1_1_test_watchdog-members.html | 86 + ..._watchdog_1_1_tests_1_1_test_watchdog.html | 117 + ...sts_1_1_test_watchdog_factory-members.html | 86 + ...g_1_1_tests_1_1_test_watchdog_factory.html | 121 + ...ost_1_1_watchdog_1_1_watchdog-members.html | 89 + ...er_1_1_host_1_1_watchdog_1_1_watchdog.html | 266 +++ ...ver_1_1_host_1_1_watchdog_1_1_watchdog.png | Bin 0 -> 859 bytes ...watchdog_1_1_watchdog_factory-members.html | 86 + ...ost_1_1_watchdog_1_1_watchdog_factory.html | 135 ++ ...host_1_1_watchdog_1_1_watchdog_factory.png | Bin 0 -> 1109 bytes ...tests_1_1_administration_test-members.html | 89 + ...ver_1_1_tests_1_1_administration_test.html | 226 ++ ...s_1_1_instance_1_1_byond_test-members.html | 91 + ...1_1_tests_1_1_instance_1_1_byond_test.html | 301 +++ ...stance_1_1_configuration_test-members.html | 91 + ...s_1_1_instance_1_1_configuration_test.html | 301 +++ ..._1_instance_1_1_instance_test-members.html | 88 + ..._tests_1_1_instance_1_1_instance_test.html | 186 ++ ...sts_1_1_instance_manager_test-members.html | 91 + ...r_1_1_tests_1_1_instance_manager_test.html | 297 +++ ..._1_tests_1_1_integration_test-members.html | 88 + ...server_1_1_tests_1_1_integration_test.html | 203 ++ ..._1_1_tests_1_1_testing_server-members.html | 92 + ...1_server_1_1_tests_1_1_testing_server.html | 312 +++ ..._1_server_1_1_tests_1_1_testing_server.png | Bin 0 -> 831 bytes classes.html | 186 ++ closed.png | Bin 0 -> 132 bytes dir_009a3598be1715e27911e1588bdd551c.html | 88 + dir_019c6d3af924151b681494cc466be1ac.html | 88 + dir_02f69155ced6ccca99a24744a5273903.html | 132 ++ dir_08963d262fa9e27215dce7b7c6e97f1b.html | 100 + dir_0b6a380fe7fc1e1d640d1ac854fc3fb6.html | 88 + dir_0c9add60ab05c04ed8367ecaedf67c01.html | 144 ++ dir_0de875c2ee7edd4009e892c5045f7b3a.html | 148 ++ dir_0f5073360b9ba6d1522457c65eebe36a.html | 106 + dir_103b33cf1ab7043de6f87dfa61afa23f.html | 88 + dir_1083fcf52a7d94a2efffb6ca88246acf.html | 90 + dir_1302441b003a340c6a16c9bc1b51c94e.html | 106 + dir_177c182c6d1f29bec543c3fdad3072d5.html | 88 + dir_18f2820c1d411453d7d989b812e41820.html | 88 + dir_1cebbc1bce26b60bfb2ee26c80f86b02.html | 88 + dir_2133157f8312226ef9ea4ce42a802cf8.html | 92 + dir_2553b13cbb871373b0c30fb90d66217c.html | 90 + dir_26764abc66ddba24c5915db53fd68d23.html | 88 + dir_2b9d136d9ffdab429a63a74fca28b300.html | 88 + dir_2e39d68cad3f83629c74ea67329dead9.html | 88 + dir_2e67631cb23401d696bcfdbe81f86f0f.html | 88 + dir_2ea2465064f3ff030c6dd6700a328d91.html | 99 + dir_34761767c1c3cd212f9d2f80ea0828a8.html | 119 + dir_38cec1532eaed7aa1de0b599a76e3e80.html | 116 + dir_446bdfc1cd19b69c11765b5665ebfd45.html | 88 + dir_48968f849f7ddb061f7130e079fe66a6.html | 88 + dir_49e56c817e5e54854c35e136979f97ca.html | 82 + dir_4c0c7e2f4fc60f51e2347a2d8dda94ce.html | 90 + dir_4ddbd20a555bd1f3bf9569744c8989cc.html | 92 + dir_4eeb864c4eec08c7d6b9d3b0352cfdde.html | 88 + dir_59425e443f801f1f2fd8bbe4959a3ccf.html | 100 + dir_5d46d0c3fd1cac5ce1ea23751ad25792.html | 98 + dir_5d5b300b88421e3050db28dd037f6f39.html | 95 + dir_5e0b464d3b4be546c63c5188ffeb96e4.html | 94 + dir_61d7974a657c30011f457b376d274ee7.html | 145 ++ dir_68267d1309a1af8e8297ef4c3efbcdba.html | 98 + dir_685b5aa2d8a661ab5bc3f68b331887b0.html | 88 + dir_689f0584ee97ae9ca308532531d9c5d2.html | 88 + dir_6c60df807dd2523776d391746c262b4d.html | 122 + dir_71f5cbd840fdd1dea9f035c7b1a066ee.html | 97 + dir_74017a19412e2f90cc6ad11fcac82495.html | 88 + dir_78e87f8f095a8e3bb6ef1faef94cdb78.html | 88 + dir_7916dda968fadc8673161597975e4c5d.html | 88 + dir_7a3fd032a1362a6005a1fc9227a8dd86.html | 125 + dir_7a9487ad1984d08627fcf919e6f3d801.html | 88 + dir_7cd79c49f3850abc2141fa4adfdd1950.html | 106 + dir_860acef72838dce8d3d54c8f98bc464b.html | 108 + dir_87039fa7b841d848ca75981d64237477.html | 88 + dir_87a4f2035ed18e30422f4b60aebc4381.html | 88 + dir_9257d56e926145e494a5aa5279887044.html | 90 + dir_9826fb2d31585a830723e6d7089b5d0e.html | 153 ++ dir_9aa5991638c9344778d807333cc0bd50.html | 88 + dir_a01d946a2e1b048dc542232ffcdcf572.html | 99 + dir_a24b8c5f308a77f73e7a9e43c0f243d1.html | 88 + dir_a3714ab037275c284988fc90b4d045a5.html | 88 + dir_a3831f1c39821b3669f8a3808652203f.html | 88 + dir_a44a562b5a12ef1c8495ac1a63e915ea.html | 121 + dir_a51095d0142a80f0e979ff5bf5b861be.html | 88 + dir_a536e49cdf631f66733cf2c9791144ce.html | 112 + dir_a8807eef6592489c6a360d587f5b1a66.html | 88 + dir_a99ad55e4d1fa76955df2299f3783cf0.html | 88 + dir_b0d0d898ef448ca0a6a170a2896fa60e.html | 100 + dir_b524b00ec2259c3c83b44909fd47f6e3.html | 88 + dir_b551a02288ef39e099594710382363a0.html | 90 + dir_b6324197f7ac56e30d6189c3a45eec56.html | 100 + dir_b87cbb2c60cf682b61fbfcceb9bced43.html | 90 + dir_b92573f47b933d7a3661c26d1af2098b.html | 88 + dir_ba6c75cd9bd8b7a0d2af20e1cd5a80ab.html | 88 + dir_be6161819238d55fa660c07ade960e53.html | 95 + dir_be9f3ed3485a880e3213506a311823d1.html | 88 + dir_bf23e1e49f40264f2966f02ed35d8142.html | 88 + dir_c037ac41e54cca303e35165acb6e013d.html | 93 + dir_c2c4d4ee47e55233c6ea5db8b96422c6.html | 137 ++ dir_c50f9bd139317d744e2ee08ea9a734cc.html | 88 + dir_c5451d9d233744a5b09a29938f0cda9a.html | 122 + dir_c5f98c05147bcbba78e71856485f5049.html | 90 + dir_c648ff9d1a57dd8752f4ab2a7c68712c.html | 88 + dir_c9d0608eee53bfffcc33d03463bbe2db.html | 92 + dir_d8869fc9da5c696ed284d5c470b7210f.html | 88 + dir_d88de13ae4b64d4d0766b0c06f1a9edf.html | 88 + dir_d8a279f7113e0073f6cd65dd050c1475.html | 88 + dir_dbb0c65ea012faeef2906502dd42dfec.html | 93 + dir_df215ce6792635a450ba5a94b5a17942.html | 92 + dir_e0c1bccb03249d93bc42ac0968ce43fd.html | 88 + dir_e2ec88631ea78d6df8b37d27efa9bfe2.html | 97 + dir_e97d380c3eebaf0856a4ec180d749620.html | 88 + dir_e9975c2f0de13509bd9fb4e31ae732ab.html | 93 + dir_ea36b5ab01ad6e8b607438a02ae91964.html | 88 + dir_eb7c70823ae63176c38851687b13349d.html | 101 + dir_ed78ff3b0fc4a7f5234cdb0b34617476.html | 101 + dir_f0581cdd528a911f791df57d0f438bcb.html | 88 + dir_f0d41009ce252337feb2b68822c4cfba.html | 101 + dir_f2a82faa4c4beef364292694cefca86d.html | 108 + dir_f88948f9bde0555374e8a59a663bdfc9.html | 88 + dir_fab1362e86740a2c573ef875dd474a67.html | 88 + dir_fb12273b841438c2f2c9b5bc5398c636.html | 88 + doc.png | Bin 0 -> 746 bytes doxygen.css | 1764 ++++++++++++++ doxygen.png | Bin 0 -> 3779 bytes dynsections.js | 127 + files.html | 582 +++++ folderclosed.png | Bin 0 -> 616 bytes folderopen.png | Bin 0 -> 597 bytes functions.html | 368 +++ functions_b.html | 218 ++ functions_c.html | 719 ++++++ functions_d.html | 495 ++++ functions_e.html | 139 ++ functions_enum.html | 79 + functions_f.html | 108 + functions_func.html | 135 ++ functions_func_b.html | 120 + functions_func_c.html | 427 ++++ functions_func_d.html | 267 +++ functions_func_e.html | 104 + functions_func_f.html | 100 + functions_func_g.html | 218 ++ functions_func_h.html | 128 + functions_func_i.html | 179 ++ functions_func_j.html | 103 + functions_func_k.html | 83 + functions_func_l.html | 164 ++ functions_func_m.html | 130 ++ functions_func_n.html | 94 + functions_func_o.html | 108 + functions_func_p.html | 129 + functions_func_r.html | 294 +++ functions_func_s.html | 275 +++ functions_func_t.html | 296 +++ functions_func_u.html | 170 ++ functions_func_v.html | 97 + functions_func_w.html | 139 ++ functions_func_z.html | 82 + functions_func_~.html | 84 + functions_g.html | 259 ++ functions_h.html | 174 ++ functions_i.html | 397 ++++ functions_j.html | 145 ++ functions_k.html | 86 + functions_l.html | 254 ++ functions_m.html | 183 ++ functions_n.html | 143 ++ functions_o.html | 146 ++ functions_p.html | 268 +++ functions_prop.html | 198 ++ functions_prop_b.html | 114 + functions_prop_c.html | 230 ++ functions_prop_d.html | 166 ++ functions_prop_e.html | 94 + functions_prop_f.html | 82 + functions_prop_g.html | 99 + functions_prop_h.html | 95 + functions_prop_i.html | 197 ++ functions_prop_j.html | 92 + functions_prop_l.html | 109 + functions_prop_m.html | 111 + functions_prop_n.html | 100 + functions_prop_o.html | 99 + functions_prop_p.html | 155 ++ functions_prop_r.html | 161 ++ functions_prop_s.html | 154 ++ functions_prop_t.html | 131 ++ functions_prop_u.html | 124 + functions_prop_v.html | 100 + functions_prop_w.html | 98 + functions_q.html | 81 + functions_r.html | 446 ++++ functions_s.html | 422 ++++ functions_t.html | 390 ++++ functions_u.html | 239 ++ functions_v.html | 124 + functions_vars.html | 199 ++ functions_vars_b.html | 146 ++ functions_vars_c.html | 219 ++ functions_vars_d.html | 236 ++ functions_vars_e.html | 95 + functions_vars_f.html | 84 + functions_vars_g.html | 98 + functions_vars_h.html | 109 + functions_vars_i.html | 179 ++ functions_vars_j.html | 106 + functions_vars_k.html | 81 + functions_vars_l.html | 129 + functions_vars_m.html | 98 + functions_vars_n.html | 105 + functions_vars_o.html | 99 + functions_vars_p.html | 142 ++ functions_vars_q.html | 81 + functions_vars_r.html | 161 ++ functions_vars_s.html | 153 ++ functions_vars_t.html | 125 + functions_vars_u.html | 111 + functions_vars_v.html | 91 + functions_vars_w.html | 102 + functions_w.html | 177 ++ functions_z.html | 82 + functions_~.html | 84 + hierarchy.html | 482 ++++ index.html | 292 +++ ...components_1_1_i_byond_client-members.html | 88 + ...ent_1_1_components_1_1_i_byond_client.html | 222 ++ ...ient_1_1_components_1_1_i_byond_client.png | Bin 0 -> 1111 bytes ...onents_1_1_i_chat_bots_client-members.html | 90 + ...1_1_components_1_1_i_chat_bots_client.html | 313 +++ ..._1_1_components_1_1_i_chat_bots_client.png | Bin 0 -> 1140 bytes ...ts_1_1_i_configuration_client-members.html | 90 + ...components_1_1_i_configuration_client.html | 328 +++ ..._components_1_1_i_configuration_client.png | Bin 0 -> 1190 bytes ...nts_1_1_i_dream_daemon_client-members.html | 90 + ..._components_1_1_i_dream_daemon_client.html | 280 +++ ...1_components_1_1_i_dream_daemon_client.png | Bin 0 -> 1209 bytes ...ents_1_1_i_dream_maker_client-members.html | 90 + ...1_components_1_1_i_dream_maker_client.html | 291 +++ ..._1_components_1_1_i_dream_maker_client.png | Bin 0 -> 1207 bytes ...ponents_1_1_i_instance_client-members.html | 94 + ..._1_1_components_1_1_i_instance_client.html | 378 +++ ...t_1_1_components_1_1_i_instance_client.png | Bin 0 -> 1114 bytes ...ts_1_1_i_instance_user_client-members.html | 91 + ...components_1_1_i_instance_user_client.html | 345 +++ ..._components_1_1_i_instance_user_client.png | Bin 0 -> 1184 bytes ..._components_1_1_i_jobs_client-members.html | 89 + ...ient_1_1_components_1_1_i_jobs_client.html | 263 +++ ...lient_1_1_components_1_1_i_jobs_client.png | Bin 0 -> 1058 bytes ...nents_1_1_i_repository_client-members.html | 89 + ..._1_components_1_1_i_repository_client.html | 259 ++ ...1_1_components_1_1_i_repository_client.png | Bin 0 -> 1179 bytes ...t_1_1_i_administration_client-members.html | 88 + ..._1_client_1_1_i_administration_client.html | 220 ++ ...1_1_client_1_1_i_administration_client.png | Bin 0 -> 935 bytes ...r_1_1_client_1_1_i_api_client-members.html | 104 + ..._1_server_1_1_client_1_1_i_api_client.html | 1060 +++++++++ ...1_1_server_1_1_client_1_1_i_api_client.png | Bin 0 -> 1092 bytes ...ient_1_1_i_api_client_factory-members.html | 86 + ...r_1_1_client_1_1_i_api_client_factory.html | 152 ++ ...er_1_1_client_1_1_i_api_client_factory.png | Bin 0 -> 958 bytes ..._1_1_client_1_1_i_http_client-members.html | 87 + ...1_server_1_1_client_1_1_i_http_client.html | 189 ++ ..._1_server_1_1_client_1_1_i_http_client.png | Bin 0 -> 1082 bytes ...1_1_i_instance_manager_client-members.html | 91 + ..._client_1_1_i_instance_manager_client.html | 355 +++ ...1_client_1_1_i_instance_manager_client.png | Bin 0 -> 1066 bytes ...1_client_1_1_i_request_logger-members.html | 87 + ...erver_1_1_client_1_1_i_request_logger.html | 182 ++ ..._1_client_1_1_i_server_client-members.html | 93 + ...server_1_1_client_1_1_i_server_client.html | 360 +++ ..._server_1_1_client_1_1_i_server_client.png | Bin 0 -> 1068 bytes ...t_1_1_i_server_client_factory-members.html | 87 + ..._1_client_1_1_i_server_client_factory.html | 225 ++ ...1_1_client_1_1_i_server_client_factory.png | Bin 0 -> 934 bytes ...1_1_client_1_1_i_users_client-members.html | 90 + ..._server_1_1_client_1_1_i_users_client.html | 302 +++ ...1_server_1_1_client_1_1_i_users_client.png | Bin 0 -> 855 bytes ...d_1_1_i_byond_executable_lock-members.html | 89 + ...1_1_byond_1_1_i_byond_executable_lock.html | 232 ++ ..._1_1_byond_1_1_i_byond_executable_lock.png | Bin 0 -> 1702 bytes ...1_byond_1_1_i_byond_installer-members.html | 90 + ...nents_1_1_byond_1_1_i_byond_installer.html | 306 +++ ...onents_1_1_byond_1_1_i_byond_installer.png | Bin 0 -> 1789 bytes ...1_1_byond_1_1_i_byond_manager-members.html | 89 + ...ponents_1_1_byond_1_1_i_byond_manager.html | 264 +++ ...mponents_1_1_byond_1_1_i_byond_manager.png | Bin 0 -> 2278 bytes ...at_1_1_commands_1_1_i_command-members.html | 89 + ...s_1_1_chat_1_1_commands_1_1_i_command.html | 256 ++ ...ts_1_1_chat_1_1_commands_1_1_i_command.png | Bin 0 -> 3441 bytes ...ommands_1_1_i_command_factory-members.html | 86 + ...at_1_1_commands_1_1_i_command_factory.html | 136 ++ ...hat_1_1_commands_1_1_i_command_factory.png | Bin 0 -> 1360 bytes ...omponents_1_1_chat_1_1_i_chat-members.html | 94 + ...st_1_1_components_1_1_chat_1_1_i_chat.html | 511 ++++ ...ost_1_1_components_1_1_chat_1_1_i_chat.png | Bin 0 -> 1917 bytes ...s_1_1_chat_1_1_i_chat_factory-members.html | 86 + ...omponents_1_1_chat_1_1_i_chat_factory.html | 161 ++ ...components_1_1_chat_1_1_i_chat_factory.png | Bin 0 -> 1195 bytes ..._1_1_i_custom_command_handler-members.html | 86 + ...1_1_chat_1_1_i_custom_command_handler.html | 168 ++ ..._1_1_chat_1_1_i_custom_command_handler.png | Bin 0 -> 2698 bytes ...t_1_1_i_json_tracking_context-members.html | 88 + ..._1_1_chat_1_1_i_json_tracking_context.html | 221 ++ ...s_1_1_chat_1_1_i_json_tracking_context.png | Bin 0 -> 1709 bytes ...1_chat_1_1_i_provider_factory-members.html | 86 + ...nents_1_1_chat_1_1_i_provider_factory.html | 141 ++ ...onents_1_1_chat_1_1_i_provider_factory.png | Bin 0 -> 1284 bytes ..._1_1_providers_1_1_i_provider-members.html | 92 + ...1_1_chat_1_1_providers_1_1_i_provider.html | 369 +++ ..._1_1_chat_1_1_providers_1_1_i_provider.png | Bin 0 -> 3182 bytes ...er_1_1_i_compile_job_consumer-members.html | 86 + ...1_compiler_1_1_i_compile_job_consumer.html | 156 ++ ..._1_compiler_1_1_i_compile_job_consumer.png | Bin 0 -> 2302 bytes ..._1_compiler_1_1_i_dmb_factory-members.html | 90 + ...onents_1_1_compiler_1_1_i_dmb_factory.html | 299 +++ ...ponents_1_1_compiler_1_1_i_dmb_factory.png | Bin 0 -> 1251 bytes ..._1_compiler_1_1_i_dream_maker-members.html | 86 + ...onents_1_1_compiler_1_1_i_dream_maker.html | 187 ++ ...ponents_1_1_compiler_1_1_i_dream_maker.png | Bin 0 -> 1259 bytes ...components_1_1_i_dmb_provider-members.html | 90 + ...ost_1_1_components_1_1_i_dmb_provider.html | 264 +++ ...host_1_1_components_1_1_i_dmb_provider.png | Bin 0 -> 2278 bytes ...mponents_1_1_i_event_consumer-members.html | 86 + ...t_1_1_components_1_1_i_event_consumer.html | 167 ++ ...st_1_1_components_1_1_i_event_consumer.png | Bin 0 -> 4960 bytes ...1_1_components_1_1_i_instance-members.html | 94 + ..._1_host_1_1_components_1_1_i_instance.html | 418 ++++ ...1_1_host_1_1_components_1_1_i_instance.png | Bin 0 -> 1824 bytes ...onents_1_1_i_instance_factory-members.html | 86 + ...1_1_components_1_1_i_instance_factory.html | 144 ++ ..._1_1_components_1_1_i_instance_factory.png | Bin 0 -> 1530 bytes ...onents_1_1_i_instance_manager-members.html | 89 + ...1_1_components_1_1_i_instance_manager.html | 284 +++ ..._1_1_components_1_1_i_instance_manager.png | Bin 0 -> 1197 bytes ..._1_interop_1_1_i_comm_context-members.html | 86 + ...onents_1_1_interop_1_1_i_comm_context.html | 143 ++ ...ponents_1_1_interop_1_1_i_comm_context.png | Bin 0 -> 1534 bytes ..._1_interop_1_1_i_comm_handler-members.html | 86 + ...onents_1_1_interop_1_1_i_comm_handler.html | 152 ++ ...ponents_1_1_interop_1_1_i_comm_handler.png | Bin 0 -> 1280 bytes ...ry_1_1_i_credentials_provider-members.html | 86 + ...repository_1_1_i_credentials_provider.html | 154 ++ ..._repository_1_1_i_credentials_provider.png | Bin 0 -> 1402 bytes ...1_repository_1_1_i_repository-members.html | 101 + ...nents_1_1_repository_1_1_i_repository.html | 823 +++++++ ...onents_1_1_repository_1_1_i_repository.png | Bin 0 -> 1535 bytes ...tory_1_1_i_repository_manager-members.html | 90 + ...1_repository_1_1_i_repository_manager.html | 310 +++ ..._1_repository_1_1_i_repository_manager.png | Bin 0 -> 1698 bytes ...tic_files_1_1_i_configuration-members.html | 93 + ..._1_1_static_files_1_1_i_configuration.html | 473 ++++ ...s_1_1_static_files_1_1_i_configuration.png | Bin 0 -> 3004 bytes ...g_1_1_i_network_prompt_reaper-members.html | 86 + ..._watchdog_1_1_i_network_prompt_reaper.html | 143 ++ ...1_watchdog_1_1_i_network_prompt_reaper.png | Bin 0 -> 2005 bytes ...g_1_1_i_reattach_info_handler-members.html | 87 + ..._watchdog_1_1_i_reattach_info_handler.html | 188 ++ ...1_watchdog_1_1_i_reattach_info_handler.png | Bin 0 -> 1338 bytes ...hdog_1_1_i_session_controller-members.html | 102 + ...1_1_watchdog_1_1_i_session_controller.html | 610 +++++ ..._1_1_watchdog_1_1_i_session_controller.png | Bin 0 -> 3139 bytes ..._i_session_controller_factory-members.html | 88 + ...hdog_1_1_i_session_controller_factory.html | 264 +++ ...chdog_1_1_i_session_controller_factory.png | Bin 0 -> 1436 bytes ...s_1_1_watchdog_1_1_i_watchdog-members.html | 97 + ...omponents_1_1_watchdog_1_1_i_watchdog.html | 496 ++++ ...components_1_1_watchdog_1_1_i_watchdog.png | Bin 0 -> 4253 bytes ...tchdog_1_1_i_watchdog_factory-members.html | 86 + ...s_1_1_watchdog_1_1_i_watchdog_factory.html | 189 ++ ...ts_1_1_watchdog_1_1_i_watchdog_factory.png | Bin 0 -> 1282 bytes ...st_1_1_core_1_1_i_application-members.html | 89 + ...r_1_1_host_1_1_core_1_1_i_application.html | 238 ++ ...er_1_1_host_1_1_core_1_1_i_application.png | Bin 0 -> 921 bytes ..._1_1_core_1_1_i_async_delayer-members.html | 86 + ...1_1_host_1_1_core_1_1_i_async_delayer.html | 154 ++ ..._1_1_host_1_1_core_1_1_i_async_delayer.png | Bin 0 -> 972 bytes ..._1_1_i_d_b_connection_factory-members.html | 86 + ...1_1_core_1_1_i_d_b_connection_factory.html | 154 ++ ..._1_1_core_1_1_i_d_b_connection_factory.png | Bin 0 -> 1155 bytes ..._1_i_database_context_factory-members.html | 86 + ...1_core_1_1_i_database_context_factory.html | 143 ++ ..._1_core_1_1_i_database_context_factory.png | Bin 0 -> 1216 bytes ..._1_1_i_git_hub_client_factory-members.html | 87 + ...1_1_core_1_1_i_git_hub_client_factory.html | 168 ++ ..._1_1_core_1_1_i_git_hub_client_factory.png | Bin 0 -> 1143 bytes ...st_1_1_core_1_1_i_job_manager-members.html | 89 + ...r_1_1_host_1_1_core_1_1_i_job_manager.html | 314 +++ ...er_1_1_host_1_1_core_1_1_i_job_manager.png | Bin 0 -> 1206 bytes ...ore_1_1_i_platform_identifier-members.html | 87 + ...st_1_1_core_1_1_i_platform_identifier.html | 169 ++ ...ost_1_1_core_1_1_i_platform_identifier.png | Bin 0 -> 1029 bytes ...1_host_1_1_core_1_1_i_process-members.html | 93 + ...erver_1_1_host_1_1_core_1_1_i_process.html | 287 +++ ...server_1_1_host_1_1_core_1_1_i_process.png | Bin 0 -> 1551 bytes ...t_1_1_core_1_1_i_process_base-members.html | 87 + ..._1_1_host_1_1_core_1_1_i_process_base.html | 176 ++ ...r_1_1_host_1_1_core_1_1_i_process_base.png | Bin 0 -> 4025 bytes ...1_core_1_1_i_process_executor-members.html | 87 + ..._host_1_1_core_1_1_i_process_executor.html | 216 ++ ...1_host_1_1_core_1_1_i_process_executor.png | Bin 0 -> 1013 bytes ..._1_core_1_1_i_restart_handler-members.html | 86 + ...1_host_1_1_core_1_1_i_restart_handler.html | 156 ++ ..._1_host_1_1_core_1_1_i_restart_handler.png | Bin 0 -> 3525 bytes ...t_1_1_core_1_1_i_restart_registration.html | 102 + ...st_1_1_core_1_1_i_restart_registration.png | Bin 0 -> 1417 bytes ...1_1_core_1_1_i_server_control-members.html | 90 + ..._1_host_1_1_core_1_1_i_server_control.html | 290 +++ ...1_1_host_1_1_core_1_1_i_server_control.png | Bin 0 -> 871 bytes ...t_1_1_core_1_1_i_setup_wizard-members.html | 86 + ..._1_1_host_1_1_core_1_1_i_setup_wizard.html | 144 ++ ...r_1_1_host_1_1_core_1_1_i_setup_wizard.png | Bin 0 -> 1739 bytes ..._1_host_1_1_i_o_1_1_i_console-members.html | 89 + ...server_1_1_host_1_1_i_o_1_1_i_console.html | 276 +++ ..._server_1_1_host_1_1_i_o_1_1_i_console.png | Bin 0 -> 837 bytes ...ost_1_1_i_o_1_1_i_i_o_manager-members.html | 107 + ...er_1_1_host_1_1_i_o_1_1_i_i_o_manager.html | 1080 +++++++++ ...ver_1_1_host_1_1_i_o_1_1_i_i_o_manager.png | Bin 0 -> 1600 bytes ..._i_o_1_1_i_post_write_handler-members.html | 86 + ...host_1_1_i_o_1_1_i_post_write_handler.html | 143 ++ ..._host_1_1_i_o_1_1_i_post_write_handler.png | Bin 0 -> 1579 bytes ...1_1_i_o_1_1_i_symlink_factory-members.html | 86 + ..._1_host_1_1_i_o_1_1_i_symlink_factory.html | 162 ++ ...1_1_host_1_1_i_o_1_1_i_symlink_factory.png | Bin 0 -> 1603 bytes ...1_1_i_synchronous_i_o_manager-members.html | 92 + ...1_1_i_o_1_1_i_synchronous_i_o_manager.html | 399 ++++ ..._1_1_i_o_1_1_i_synchronous_i_o_manager.png | Bin 0 -> 1179 bytes ..._server_1_1_host_1_1_i_server-members.html | 87 + ...tion_1_1_server_1_1_host_1_1_i_server.html | 178 ++ ...ation_1_1_server_1_1_host_1_1_i_server.png | Bin 0 -> 1132 bytes ...1_1_host_1_1_i_server_factory-members.html | 86 + ..._server_1_1_host_1_1_i_server_factory.html | 152 ++ ...1_server_1_1_host_1_1_i_server_factory.png | Bin 0 -> 873 bytes ...models_1_1_i_database_context-members.html | 101 + ...ost_1_1_models_1_1_i_database_context.html | 616 +++++ ...host_1_1_models_1_1_i_database_context.png | Bin 0 -> 1314 bytes ..._models_1_1_i_database_seeder-members.html | 87 + ...host_1_1_models_1_1_i_database_seeder.html | 199 ++ ..._host_1_1_models_1_1_i_database_seeder.png | Bin 0 -> 1121 bytes ..._1_1_i_authentication_context-members.html | 89 + ...security_1_1_i_authentication_context.html | 234 ++ ..._security_1_1_i_authentication_context.png | Bin 0 -> 1544 bytes ...uthentication_context_factory-members.html | 87 + ..._1_1_i_authentication_context_factory.html | 204 ++ ...y_1_1_i_authentication_context_factory.png | Bin 0 -> 1320 bytes ...ecurity_1_1_i_claims_injector-members.html | 86 + ...st_1_1_security_1_1_i_claims_injector.html | 152 ++ ...ost_1_1_security_1_1_i_claims_injector.png | Bin 0 -> 1095 bytes ...rity_1_1_i_cryptography_suite-members.html | 89 + ...1_1_security_1_1_i_cryptography_suite.html | 266 +++ ..._1_1_security_1_1_i_cryptography_suite.png | Bin 0 -> 1236 bytes ...security_1_1_i_identity_cache-members.html | 87 + ...ost_1_1_security_1_1_i_identity_cache.html | 194 ++ ...host_1_1_security_1_1_i_identity_cache.png | Bin 0 -> 1046 bytes ...ecurity_1_1_i_system_identity-members.html | 89 + ...st_1_1_security_1_1_i_system_identity.html | 249 ++ ...ost_1_1_security_1_1_i_system_identity.png | Bin 0 -> 1545 bytes ...1_1_i_system_identity_factory-members.html | 87 + ...ecurity_1_1_i_system_identity_factory.html | 205 ++ ...security_1_1_i_system_identity_factory.png | Bin 0 -> 1792 bytes ..._security_1_1_i_token_factory-members.html | 87 + ...host_1_1_security_1_1_i_token_factory.html | 190 ++ ..._host_1_1_security_1_1_i_token_factory.png | Bin 0 -> 1081 bytes ...t_1_1_watchdog_1_1_i_watchdog-members.html | 86 + ..._1_1_host_1_1_watchdog_1_1_i_watchdog.html | 161 ++ ...r_1_1_host_1_1_watchdog_1_1_i_watchdog.png | Bin 0 -> 867 bytes ...tchdog_1_1_i_watchdog_factory-members.html | 86 + ...t_1_1_watchdog_1_1_i_watchdog_factory.html | 143 ++ ...st_1_1_watchdog_1_1_i_watchdog_factory.png | Bin 0 -> 1116 bytes jquery.js | 87 + menu.js | 50 + menudata.js | 137 ++ namespace_release_notes.html | 87 + namespace_tgstation.html | 86 + namespace_tgstation_1_1_server.html | 96 + namespace_tgstation_1_1_server_1_1_api.html | 104 + ...station_1_1_server_1_1_api_1_1_models.html | 373 +++ ...erver_1_1_api_1_1_models_1_1_internal.html | 121 + ...1_server_1_1_api_1_1_models_1_1_tests.html | 90 + ...station_1_1_server_1_1_api_1_1_rights.html | 782 +++++++ ...1_server_1_1_api_1_1_rights_1_1_tests.html | 91 + ...gstation_1_1_server_1_1_api_1_1_tests.html | 91 + ...space_tgstation_1_1_server_1_1_client.html | 175 ++ ..._1_1_server_1_1_client_1_1_components.html | 139 ++ ...r_1_1_client_1_1_components_1_1_tests.html | 90 + ...ation_1_1_server_1_1_client_1_1_tests.html | 92 + namespace_tgstation_1_1_server_1_1_host.html | 130 ++ ...on_1_1_server_1_1_host_1_1_components.html | 228 ++ ...ver_1_1_host_1_1_components_1_1_byond.html | 113 + ...st_1_1_components_1_1_byond_1_1_tests.html | 90 + ...rver_1_1_host_1_1_components_1_1_chat.html | 131 ++ ..._1_1_components_1_1_chat_1_1_commands.html | 117 + ...1_1_components_1_1_chat_1_1_providers.html | 108 + ...ents_1_1_chat_1_1_providers_1_1_tests.html | 90 + ..._1_1_host_1_1_components_1_1_compiler.html | 107 + ...r_1_1_host_1_1_components_1_1_interop.html | 117 + ..._1_host_1_1_components_1_1_repository.html | 103 + ..._host_1_1_components_1_1_static_files.html | 96 + ..._1_1_host_1_1_components_1_1_watchdog.html | 368 +++ ...1_1_components_1_1_watchdog_1_1_tests.html | 90 + ...1_1_server_1_1_host_1_1_configuration.html | 198 ++ ...ation_1_1_server_1_1_host_1_1_console.html | 97 + ...server_1_1_host_1_1_console_1_1_tests.html | 90 + ...n_1_1_server_1_1_host_1_1_controllers.html | 133 ++ ...gstation_1_1_server_1_1_host_1_1_core.html | 176 ++ ..._1_server_1_1_host_1_1_core_1_1_tests.html | 109 + ...tgstation_1_1_server_1_1_host_1_1_i_o.html | 131 ++ ...1_1_server_1_1_host_1_1_i_o_1_1_tests.html | 94 + ...tation_1_1_server_1_1_host_1_1_models.html | 150 ++ ...er_1_1_host_1_1_models_1_1_migrations.html | 135 ++ ...tion_1_1_server_1_1_host_1_1_security.html | 143 ++ ...erver_1_1_host_1_1_security_1_1_tests.html | 91 + ...ation_1_1_server_1_1_host_1_1_service.html | 100 + ...server_1_1_host_1_1_service_1_1_tests.html | 91 + ...station_1_1_server_1_1_host_1_1_tests.html | 91 + ...tion_1_1_server_1_1_host_1_1_watchdog.html | 104 + ...erver_1_1_host_1_1_watchdog_1_1_tests.html | 93 + namespace_tgstation_1_1_server_1_1_tests.html | 102 + ...ion_1_1_server_1_1_tests_1_1_instance.html | 94 + namespacemembers.html | 142 ++ namespacemembers_enum.html | 142 ++ namespaces.html | 129 + nav_f.png | Bin 0 -> 153 bytes nav_g.png | Bin 0 -> 95 bytes nav_h.png | Bin 0 -> 98 bytes open.png | Bin 0 -> 123 bytes search/all_0.html | 30 + search/all_0.js | 27 + search/all_1.html | 30 + search/all_1.js | 94 + search/all_10.html | 30 + search/all_10.js | 65 + search/all_11.html | 30 + search/all_11.js | 4 + search/all_12.html | 30 + search/all_12.js | 132 ++ search/all_13.html | 30 + search/all_13.js | 133 ++ search/all_14.html | 30 + search/all_14.js | 207 ++ search/all_15.html | 30 + search/all_15.js | 47 + search/all_16.html | 30 + search/all_16.js | 15 + search/all_17.html | 30 + search/all_17.js | 45 + search/all_18.html | 30 + search/all_18.js | 4 + search/all_19.html | 30 + search/all_19.js | 5 + search/all_2.html | 30 + search/all_2.js | 54 + search/all_3.html | 30 + search/all_3.js | 213 ++ search/all_4.html | 30 + search/all_4.js | 129 + search/all_5.html | 30 + search/all_5.js | 29 + search/all_6.html | 30 + search/all_6.js | 14 + search/all_7.html | 30 + search/all_7.js | 49 + search/all_8.html | 30 + search/all_8.js | 29 + search/all_9.html | 30 + search/all_9.js | 251 ++ search/all_a.html | 30 + search/all_a.js | 27 + search/all_b.html | 30 + search/all_b.js | 7 + search/all_c.html | 30 + search/all_c.js | 35 + search/all_d.html | 30 + search/all_d.js | 75 + search/all_e.html | 30 + search/all_e.js | 26 + search/all_f.html | 30 + search/all_f.js | 24 + search/classes_0.html | 30 + search/classes_0.js | 20 + search/classes_1.html | 30 + search/classes_1.js | 15 + search/classes_10.html | 30 + search/classes_10.js | 22 + search/classes_11.html | 30 + search/classes_11.js | 40 + search/classes_12.html | 30 + search/classes_12.js | 10 + search/classes_13.html | 30 + search/classes_13.js | 4 + search/classes_14.html | 30 + search/classes_14.js | 14 + search/classes_2.html | 30 + search/classes_2.js | 32 + search/classes_3.html | 30 + search/classes_3.js | 27 + search/classes_4.html | 30 + search/classes_4.js | 7 + search/classes_5.html | 30 + search/classes_5.js | 4 + search/classes_6.html | 30 + search/classes_6.js | 6 + search/classes_7.html | 30 + search/classes_7.js | 5 + search/classes_8.html | 30 + search/classes_8.js | 104 + search/classes_9.html | 30 + search/classes_9.js | 13 + search/classes_a.html | 30 + search/classes_a.js | 4 + search/classes_b.html | 30 + search/classes_b.js | 4 + search/classes_c.html | 30 + search/classes_c.js | 37 + search/classes_d.html | 30 + search/classes_d.js | 4 + search/classes_e.html | 30 + search/classes_e.js | 15 + search/classes_f.html | 30 + search/classes_f.js | 21 + search/close.png | Bin 0 -> 273 bytes search/enums_0.html | 30 + search/enums_0.js | 5 + search/enums_1.html | 30 + search/enums_1.js | 4 + search/enums_2.html | 30 + search/enums_2.js | 8 + search/enums_3.html | 30 + search/enums_3.js | 8 + search/enums_4.html | 30 + search/enums_4.js | 4 + search/enums_5.html | 30 + search/enums_5.js | 6 + search/enums_6.html | 30 + search/enums_6.js | 5 + search/enums_7.html | 30 + search/enums_7.js | 6 + search/enums_8.html | 30 + search/enums_8.js | 4 + search/enumvalues_0.html | 30 + search/enumvalues_0.js | 9 + search/enumvalues_1.html | 30 + search/enumvalues_1.js | 9 + search/enumvalues_10.html | 30 + search/enumvalues_10.js | 10 + search/enumvalues_2.html | 30 + search/enumvalues_2.js | 23 + search/enumvalues_3.html | 30 + search/enumvalues_3.js | 9 + search/enumvalues_4.html | 30 + search/enumvalues_4.js | 5 + search/enumvalues_5.html | 30 + search/enumvalues_5.js | 4 + search/enumvalues_6.html | 30 + search/enumvalues_6.js | 5 + search/enumvalues_7.html | 30 + search/enumvalues_7.js | 10 + search/enumvalues_8.html | 30 + search/enumvalues_8.js | 5 + search/enumvalues_9.html | 30 + search/enumvalues_9.js | 6 + search/enumvalues_a.html | 30 + search/enumvalues_a.js | 9 + search/enumvalues_b.html | 30 + search/enumvalues_b.js | 6 + search/enumvalues_c.html | 30 + search/enumvalues_c.js | 23 + search/enumvalues_d.html | 30 + search/enumvalues_d.js | 27 + search/enumvalues_e.html | 30 + search/enumvalues_e.js | 4 + search/enumvalues_f.html | 30 + search/enumvalues_f.js | 6 + search/files_0.html | 30 + search/files_0.js | 27 + search/files_1.html | 30 + search/files_1.js | 23 + search/files_10.html | 30 + search/files_10.js | 26 + search/files_11.html | 30 + search/files_11.js | 22 + search/files_12.html | 30 + search/files_12.js | 60 + search/files_13.html | 30 + search/files_13.js | 10 + search/files_14.html | 30 + search/files_14.js | 4 + search/files_15.html | 30 + search/files_15.js | 14 + search/files_2.html | 30 + search/files_2.js | 13 + search/files_3.html | 30 + search/files_3.js | 35 + search/files_4.html | 30 + search/files_4.js | 29 + search/files_5.html | 30 + search/files_5.js | 8 + search/files_6.html | 30 + search/files_6.js | 4 + search/files_7.html | 30 + search/files_7.js | 6 + search/files_8.html | 30 + search/files_8.js | 5 + search/files_9.html | 30 + search/files_9.js | 103 + search/files_a.html | 30 + search/files_a.js | 12 + search/files_b.html | 30 + search/files_b.js | 4 + search/files_c.html | 30 + search/files_c.js | 4 + search/files_d.html | 30 + search/files_d.js | 12 + search/files_e.html | 30 + search/files_e.js | 4 + search/files_f.html | 30 + search/files_f.js | 15 + search/functions_0.html | 30 + search/functions_0.js | 20 + search/functions_1.html | 30 + search/functions_1.js | 13 + search/functions_10.html | 30 + search/functions_10.js | 53 + search/functions_11.html | 30 + search/functions_11.js | 52 + search/functions_12.html | 30 + search/functions_12.js | 66 + search/functions_13.html | 30 + search/functions_13.js | 19 + search/functions_14.html | 30 + search/functions_14.js | 9 + search/functions_15.html | 30 + search/functions_15.js | 21 + search/functions_16.html | 30 + search/functions_16.js | 4 + search/functions_17.html | 30 + search/functions_17.js | 5 + search/functions_2.html | 30 + search/functions_2.js | 92 + search/functions_3.html | 30 + search/functions_3.js | 37 + search/functions_4.html | 30 + search/functions_4.js | 11 + search/functions_5.html | 30 + search/functions_5.js | 9 + search/functions_6.html | 30 + search/functions_6.js | 36 + search/functions_7.html | 30 + search/functions_7.js | 16 + search/functions_8.html | 30 + search/functions_8.js | 31 + search/functions_9.html | 30 + search/functions_9.js | 11 + search/functions_a.html | 30 + search/functions_a.js | 4 + search/functions_b.html | 30 + search/functions_b.js | 21 + search/functions_c.html | 30 + search/functions_c.js | 16 + search/functions_d.html | 30 + search/functions_d.js | 8 + search/functions_e.html | 30 + search/functions_e.js | 12 + search/functions_f.html | 30 + search/functions_f.js | 19 + search/mag_sel.png | Bin 0 -> 465 bytes search/namespaces_0.html | 30 + search/namespaces_0.js | 4 + search/namespaces_1.html | 30 + search/namespaces_1.js | 31 + search/nomatches.html | 12 + search/pages_0.html | 30 + search/pages_0.js | 4 + search/pages_1.html | 30 + search/pages_1.js | 4 + search/pages_2.html | 30 + search/pages_2.js | 4 + search/properties_0.html | 30 + search/properties_0.js | 38 + search/properties_1.html | 30 + search/properties_1.js | 13 + search/properties_10.html | 30 + search/properties_10.js | 26 + search/properties_11.html | 30 + search/properties_11.js | 17 + search/properties_12.html | 30 + search/properties_12.js | 14 + search/properties_13.html | 30 + search/properties_13.js | 8 + search/properties_14.html | 30 + search/properties_14.js | 9 + search/properties_2.html | 30 + search/properties_2.js | 44 + search/properties_3.html | 30 + search/properties_3.js | 28 + search/properties_4.html | 30 + search/properties_4.js | 8 + search/properties_5.html | 30 + search/properties_5.js | 4 + search/properties_6.html | 30 + search/properties_6.js | 9 + search/properties_7.html | 30 + search/properties_7.js | 8 + search/properties_8.html | 30 + search/properties_8.js | 27 + search/properties_9.html | 30 + search/properties_9.js | 6 + search/properties_a.html | 30 + search/properties_a.js | 11 + search/properties_b.html | 30 + search/properties_b.js | 13 + search/properties_c.html | 30 + search/properties_c.js | 9 + search/properties_d.html | 30 + search/properties_d.js | 9 + search/properties_e.html | 30 + search/properties_e.js | 25 + search/properties_f.html | 30 + search/properties_f.js | 24 + search/search.css | 271 +++ search/search.js | 814 +++++++ search/search_l.png | Bin 0 -> 567 bytes search/search_m.png | Bin 0 -> 158 bytes search/search_r.png | Bin 0 -> 553 bytes search/searchdata.js | 42 + search/variables_0.html | 30 + search/variables_0.js | 29 + search/variables_1.html | 30 + search/variables_1.js | 22 + search/variables_10.html | 30 + search/variables_10.js | 4 + search/variables_11.html | 30 + search/variables_11.js | 28 + search/variables_12.html | 30 + search/variables_12.js | 22 + search/variables_13.html | 30 + search/variables_13.js | 18 + search/variables_14.html | 30 + search/variables_14.js | 14 + search/variables_15.html | 30 + search/variables_15.js | 7 + search/variables_16.html | 30 + search/variables_16.js | 8 + search/variables_2.html | 30 + search/variables_2.js | 41 + search/variables_3.html | 30 + search/variables_3.js | 49 + search/variables_4.html | 30 + search/variables_4.js | 7 + search/variables_5.html | 30 + search/variables_5.js | 5 + search/variables_6.html | 30 + search/variables_6.js | 7 + search/variables_7.html | 30 + search/variables_7.js | 11 + search/variables_8.html | 30 + search/variables_8.js | 23 + search/variables_9.html | 30 + search/variables_9.js | 8 + search/variables_a.html | 30 + search/variables_a.js | 4 + search/variables_b.html | 30 + search/variables_b.js | 9 + search/variables_c.html | 30 + search/variables_c.js | 9 + search/variables_d.html | 30 + search/variables_d.js | 10 + search/variables_e.html | 30 + search/variables_e.js | 9 + search/variables_f.html | 30 + search/variables_f.js | 19 + splitbar.png | Bin 0 -> 314 bytes ...station_8_server_8_host_2_program_8cs.html | 103 + ..._8_server_8_host_2_program_8cs_source.html | 90 + ...server_8_host_8_console_2_program_8cs.html | 105 + ...8_host_8_console_2_program_8cs_source.html | 94 + ...server_8_host_8_service_2_program_8cs.html | 105 + ...8_host_8_service_2_program_8cs_source.html | 104 + sync_off.png | Bin 0 -> 853 bytes sync_on.png | Bin 0 -> 845 bytes tab_a.png | Bin 0 -> 142 bytes tab_b.png | Bin 0 -> 169 bytes tab_h.png | Bin 0 -> 177 bytes tab_s.png | Bin 0 -> 184 bytes tabs.css | 1 + tgs.ico | Bin 0 -> 123198 bytes tools_2_release_notes_2_program_8cs.html | 99 + ..._2_release_notes_2_program_8cs_source.html | 85 + tools_2_release_notes_2_r_e_a_d_m_e_8md.html | 78 + 2427 files changed, 280947 insertions(+) create mode 100644 20180906135553___m_s_initial_create_8_designer_8cs.html create mode 100644 20180906135553___m_s_initial_create_8_designer_8cs_source.html create mode 100644 20180906135553___m_s_initial_create_8cs.html create mode 100644 20180906135553___m_s_initial_create_8cs_source.html create mode 100644 20180906143029___m_y_initial_create_8_designer_8cs.html create mode 100644 20180906143029___m_y_initial_create_8_designer_8cs_source.html create mode 100644 20180906143029___m_y_initial_create_8cs.html create mode 100644 20180906143029___m_y_initial_create_8cs_source.html create mode 100644 20180918020726___m_y_add_minimum_security_8_designer_8cs.html create mode 100644 20180918020726___m_y_add_minimum_security_8_designer_8cs_source.html create mode 100644 20180918020726___m_y_add_minimum_security_8cs.html create mode 100644 20180918020726___m_y_add_minimum_security_8cs_source.html create mode 100644 20180918021228___m_s_add_minimum_security_8_designer_8cs.html create mode 100644 20180918021228___m_s_add_minimum_security_8_designer_8cs_source.html create mode 100644 20180918021228___m_s_add_minimum_security_8cs.html create mode 100644 20180918021228___m_s_add_minimum_security_8cs_source.html create mode 100644 20180918204520___m_y_nullable_and_foreign_key_cleanup_8_designer_8cs.html create mode 100644 20180918204520___m_y_nullable_and_foreign_key_cleanup_8_designer_8cs_source.html create mode 100644 20180918204520___m_y_nullable_and_foreign_key_cleanup_8cs.html create mode 100644 20180918204520___m_y_nullable_and_foreign_key_cleanup_8cs_source.html create mode 100644 20180918205224___m_s_nullable_and_foreign_key_cleanup_8_designer_8cs.html create mode 100644 20180918205224___m_s_nullable_and_foreign_key_cleanup_8_designer_8cs_source.html create mode 100644 20180918205224___m_s_nullable_and_foreign_key_cleanup_8cs.html create mode 100644 20180918205224___m_s_nullable_and_foreign_key_cleanup_8cs_source.html create mode 100644 20180926033145___m_s_reattach_compile_job_required_8_designer_8cs.html create mode 100644 20180926033145___m_s_reattach_compile_job_required_8_designer_8cs_source.html create mode 100644 20180926033145___m_s_reattach_compile_job_required_8cs.html create mode 100644 20180926033145___m_s_reattach_compile_job_required_8cs_source.html create mode 100644 20180926034014___m_y_reattach_compile_job_required_8_designer_8cs.html create mode 100644 20180926034014___m_y_reattach_compile_job_required_8_designer_8cs_source.html create mode 100644 20180926034014___m_y_reattach_compile_job_required_8cs.html create mode 100644 20180926034014___m_y_reattach_compile_job_required_8cs_source.html create mode 100644 20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs.html create mode 100644 20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs_source.html create mode 100644 20181124231534___m_s_toggle_testmerge_comments_8cs.html create mode 100644 20181124231534___m_s_toggle_testmerge_comments_8cs_source.html create mode 100644 20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs.html create mode 100644 20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs_source.html create mode 100644 20181124231549___m_y_toggle_testmerge_comments_8cs.html create mode 100644 20181124231549___m_y_toggle_testmerge_comments_8cs_source.html create mode 100644 20190219041825___m_s_fix_rev_info_index_8_designer_8cs.html create mode 100644 20190219041825___m_s_fix_rev_info_index_8_designer_8cs_source.html create mode 100644 20190219041825___m_s_fix_rev_info_index_8cs.html create mode 100644 20190219041825___m_s_fix_rev_info_index_8cs_source.html create mode 100644 20190219042440___m_y_fix_rev_info_index_8_designer_8cs.html create mode 100644 20190219042440___m_y_fix_rev_info_index_8_designer_8cs_source.html create mode 100644 20190219042440___m_y_fix_rev_info_index_8cs.html create mode 100644 20190219042440___m_y_fix_rev_info_index_8cs_source.html create mode 100644 ArchitectureOverview.png create mode 100644 _a_p_i_8dox.html create mode 100644 _administration_8cs.html create mode 100644 _administration_8cs_source.html create mode 100644 _administration_client_8cs.html create mode 100644 _administration_client_8cs_source.html create mode 100644 _administration_controller_8cs.html create mode 100644 _administration_controller_8cs_source.html create mode 100644 _administration_rights_8cs.html create mode 100644 _administration_rights_8cs_source.html create mode 100644 _administration_test_8cs.html create mode 100644 _administration_test_8cs_source.html create mode 100644 _api_client_8cs.html create mode 100644 _api_client_8cs_source.html create mode 100644 _api_client_factory_8cs.html create mode 100644 _api_client_factory_8cs_source.html create mode 100644 _api_conflict_exception_8cs.html create mode 100644 _api_conflict_exception_8cs_source.html create mode 100644 _api_controller_8cs.html create mode 100644 _api_controller_8cs_source.html create mode 100644 _api_headers_8cs.html create mode 100644 _api_headers_8cs_source.html create mode 100644 _api_mismatch_exception_8cs.html create mode 100644 _api_mismatch_exception_8cs_source.html create mode 100644 _api_validation_status_8cs.html create mode 100644 _api_validation_status_8cs_source.html create mode 100644 _application_8cs.html create mode 100644 _application_8cs_source.html create mode 100644 _application_builder_extensions_8cs.html create mode 100644 _application_builder_extensions_8cs_source.html create mode 100644 _architecture_8dox.html create mode 100644 _async_delayer_8cs.html create mode 100644 _async_delayer_8cs_source.html create mode 100644 _authentication_context_8cs.html create mode 100644 _authentication_context_8cs_source.html create mode 100644 _authentication_context_factory_8cs.html create mode 100644 _authentication_context_factory_8cs_source.html create mode 100644 _basic_watchdog_8cs.html create mode 100644 _basic_watchdog_8cs_source.html create mode 100644 _bool_converter_8cs.html create mode 100644 _bool_converter_8cs_source.html create mode 100644 _byond_8cs.html create mode 100644 _byond_8cs_source.html create mode 100644 _byond_client_8cs.html create mode 100644 _byond_client_8cs_source.html create mode 100644 _byond_command_8cs.html create mode 100644 _byond_command_8cs_source.html create mode 100644 _byond_controller_8cs.html create mode 100644 _byond_controller_8cs_source.html create mode 100644 _byond_executable_lock_8cs.html create mode 100644 _byond_executable_lock_8cs_source.html create mode 100644 _byond_manager_8cs.html create mode 100644 _byond_manager_8cs_source.html create mode 100644 _byond_rights_8cs.html create mode 100644 _byond_rights_8cs_source.html create mode 100644 _byond_test_8cs.html create mode 100644 _byond_test_8cs_source.html create mode 100644 _channel_8cs.html create mode 100644 _channel_8cs_source.html create mode 100644 _channel_mapping_8cs.html create mode 100644 _channel_mapping_8cs_source.html create mode 100644 _chat_8cs.html create mode 100644 _chat_8cs_source.html create mode 100644 _chat_bot_rights_8cs.html create mode 100644 _chat_bot_rights_8cs_source.html create mode 100644 _chat_bots_client_8cs.html create mode 100644 _chat_bots_client_8cs_source.html create mode 100644 _chat_command_8cs.html create mode 100644 _chat_command_8cs_source.html create mode 100644 _chat_connection_string_builder_8cs.html create mode 100644 _chat_connection_string_builder_8cs_source.html create mode 100644 _chat_controller_8cs.html create mode 100644 _chat_controller_8cs_source.html create mode 100644 _chat_factory_8cs.html create mode 100644 _chat_factory_8cs_source.html create mode 100644 _chat_provider_8cs.html create mode 100644 _chat_provider_8cs_source.html create mode 100644 _claims_injector_8cs.html create mode 100644 _claims_injector_8cs_source.html create mode 100644 _client_exception_8cs.html create mode 100644 _client_exception_8cs_source.html create mode 100644 _comm_command_8cs.html create mode 100644 _comm_command_8cs_source.html create mode 100644 _comm_context_8cs.html create mode 100644 _comm_context_8cs_source.html create mode 100644 _command_factory_8cs.html create mode 100644 _command_factory_8cs_source.html create mode 100644 _components_2_watchdog_2_i_watchdog_8cs.html create mode 100644 _components_2_watchdog_2_i_watchdog_8cs_source.html create mode 100644 _components_2_watchdog_2_i_watchdog_factory_8cs.html create mode 100644 _components_2_watchdog_2_i_watchdog_factory_8cs_source.html create mode 100644 _components_2_watchdog_2_reattach_information_8cs.html create mode 100644 _components_2_watchdog_2_reattach_information_8cs_source.html create mode 100644 _components_2_watchdog_2_watchdog_factory_8cs.html create mode 100644 _components_2_watchdog_2_watchdog_factory_8cs_source.html create mode 100644 _components_2_watchdog_2_watchdog_reattach_information_8cs.html create mode 100644 _components_2_watchdog_2_watchdog_reattach_information_8cs_source.html create mode 100644 _configuration_8cs.html create mode 100644 _configuration_8cs_source.html create mode 100644 _configuration_client_8cs.html create mode 100644 _configuration_client_8cs_source.html create mode 100644 _configuration_controller_8cs.html create mode 100644 _configuration_controller_8cs_source.html create mode 100644 _configuration_file_8cs.html create mode 100644 _configuration_file_8cs_source.html create mode 100644 _configuration_rights_8cs.html create mode 100644 _configuration_rights_8cs_source.html create mode 100644 _configuration_test_8cs.html create mode 100644 _configuration_test_8cs_source.html create mode 100644 _configuration_type_8cs.html create mode 100644 _configuration_type_8cs_source.html create mode 100644 _conflict_exception_8cs.html create mode 100644 _conflict_exception_8cs_source.html create mode 100644 _console_8cs.html create mode 100644 _console_8cs_source.html create mode 100644 _constants_8cs.html create mode 100644 _constants_8cs_source.html create mode 100644 _control_panel_configuration_8cs.html create mode 100644 _control_panel_configuration_8cs_source.html create mode 100644 _credentials_provider_8cs.html create mode 100644 _credentials_provider_8cs_source.html create mode 100644 _cryptography_suite_8cs.html create mode 100644 _cryptography_suite_8cs_source.html create mode 100644 _custom_command_8cs.html create mode 100644 _custom_command_8cs_source.html create mode 100644 _d_b_connection_factory_8cs.html create mode 100644 _d_b_connection_factory_8cs_source.html create mode 100644 _database_configuration_8cs.html create mode 100644 _database_configuration_8cs_source.html create mode 100644 _database_context_8cs.html create mode 100644 _database_context_8cs_source.html create mode 100644 _database_context_factory_8cs.html create mode 100644 _database_context_factory_8cs_source.html create mode 100644 _database_seeder_8cs.html create mode 100644 _database_seeder_8cs_source.html create mode 100644 _database_type_8cs.html create mode 100644 _database_type_8cs_source.html create mode 100644 _dead_session_controller_8cs.html create mode 100644 _dead_session_controller_8cs_source.html create mode 100644 _default_i_o_manager_8cs.html create mode 100644 _default_i_o_manager_8cs_source.html create mode 100644 _design_time_db_context_factory_helpers_8cs.html create mode 100644 _design_time_db_context_factory_helpers_8cs_source.html create mode 100644 _discord_connection_string_builder_8cs.html create mode 100644 _discord_connection_string_builder_8cs_source.html create mode 100644 _discord_provider_8cs.html create mode 100644 _discord_provider_8cs_source.html create mode 100644 _dmb_factory_8cs.html create mode 100644 _dmb_factory_8cs_source.html create mode 100644 _dmb_provider_8cs.html create mode 100644 _dmb_provider_8cs_source.html create mode 100644 _dream_daemon_8cs.html create mode 100644 _dream_daemon_8cs_source.html create mode 100644 _dream_daemon_client_8cs.html create mode 100644 _dream_daemon_client_8cs_source.html create mode 100644 _dream_daemon_controller_8cs.html create mode 100644 _dream_daemon_controller_8cs_source.html create mode 100644 _dream_daemon_launch_parameters_8cs.html create mode 100644 _dream_daemon_launch_parameters_8cs_source.html create mode 100644 _dream_daemon_rights_8cs.html create mode 100644 _dream_daemon_rights_8cs_source.html create mode 100644 _dream_daemon_security_8cs.html create mode 100644 _dream_daemon_security_8cs_source.html create mode 100644 _dream_daemon_status_8cs.html create mode 100644 _dream_daemon_status_8cs_source.html create mode 100644 _dream_maker_client_8cs.html create mode 100644 _dream_maker_client_8cs_source.html create mode 100644 _dream_maker_controller_8cs.html create mode 100644 _dream_maker_controller_8cs_source.html create mode 100644 _dream_maker_rights_8cs.html create mode 100644 _dream_maker_rights_8cs_source.html create mode 100644 _dream_maker_settings_8cs.html create mode 100644 _dream_maker_settings_8cs_source.html create mode 100644 _error_message_8cs.html create mode 100644 _error_message_8cs_source.html create mode 100644 _event_consumer_8cs.html create mode 100644 _event_consumer_8cs_source.html create mode 100644 _event_notification_8cs.html create mode 100644 _event_notification_8cs_source.html create mode 100644 _event_type_8cs.html create mode 100644 _event_type_8cs_source.html create mode 100644 _experimental_watchdog_8cs.html create mode 100644 _experimental_watchdog_8cs_source.html create mode 100644 _file_logging_configuration_8cs.html create mode 100644 _file_logging_configuration_8cs_source.html create mode 100644 _general_configuration_8cs.html create mode 100644 _general_configuration_8cs_source.html create mode 100644 _git_hub_client_factory_8cs.html create mode 100644 _git_hub_client_factory_8cs_source.html create mode 100644 _global_suppressions_8cs.html create mode 100644 _global_suppressions_8cs_source.html create mode 100644 _home_controller_8cs.html create mode 100644 _home_controller_8cs_source.html create mode 100644 _http_client_8cs.html create mode 100644 _http_client_8cs_source.html create mode 100644 _i_administration_client_8cs.html create mode 100644 _i_administration_client_8cs_source.html create mode 100644 _i_api_client_8cs.html create mode 100644 _i_api_client_8cs_source.html create mode 100644 _i_api_client_factory_8cs.html create mode 100644 _i_api_client_factory_8cs_source.html create mode 100644 _i_application_8cs.html create mode 100644 _i_application_8cs_source.html create mode 100644 _i_async_delayer_8cs.html create mode 100644 _i_async_delayer_8cs_source.html create mode 100644 _i_authentication_context_8cs.html create mode 100644 _i_authentication_context_8cs_source.html create mode 100644 _i_authentication_context_factory_8cs.html create mode 100644 _i_authentication_context_factory_8cs_source.html create mode 100644 _i_byond_client_8cs.html create mode 100644 _i_byond_client_8cs_source.html create mode 100644 _i_byond_executable_lock_8cs.html create mode 100644 _i_byond_executable_lock_8cs_source.html create mode 100644 _i_byond_installer_8cs.html create mode 100644 _i_byond_installer_8cs_source.html create mode 100644 _i_byond_manager_8cs.html create mode 100644 _i_byond_manager_8cs_source.html create mode 100644 _i_chat_8cs.html create mode 100644 _i_chat_8cs_source.html create mode 100644 _i_chat_bots_client_8cs.html create mode 100644 _i_chat_bots_client_8cs_source.html create mode 100644 _i_chat_factory_8cs.html create mode 100644 _i_chat_factory_8cs_source.html create mode 100644 _i_claims_injector_8cs.html create mode 100644 _i_claims_injector_8cs_source.html create mode 100644 _i_comm_context_8cs.html create mode 100644 _i_comm_context_8cs_source.html create mode 100644 _i_comm_handler_8cs.html create mode 100644 _i_comm_handler_8cs_source.html create mode 100644 _i_command_8cs.html create mode 100644 _i_command_8cs_source.html create mode 100644 _i_command_factory_8cs.html create mode 100644 _i_command_factory_8cs_source.html create mode 100644 _i_compile_job_consumer_8cs.html create mode 100644 _i_compile_job_consumer_8cs_source.html create mode 100644 _i_configuration_8cs.html create mode 100644 _i_configuration_8cs_source.html create mode 100644 _i_configuration_client_8cs.html create mode 100644 _i_configuration_client_8cs_source.html create mode 100644 _i_console_8cs.html create mode 100644 _i_console_8cs_source.html create mode 100644 _i_credentials_provider_8cs.html create mode 100644 _i_credentials_provider_8cs_source.html create mode 100644 _i_cryptography_suite_8cs.html create mode 100644 _i_cryptography_suite_8cs_source.html create mode 100644 _i_custom_command_handler_8cs.html create mode 100644 _i_custom_command_handler_8cs_source.html create mode 100644 _i_d_b_connection_factory_8cs.html create mode 100644 _i_d_b_connection_factory_8cs_source.html create mode 100644 _i_database_context_8cs.html create mode 100644 _i_database_context_8cs_source.html create mode 100644 _i_database_context_factory_8cs.html create mode 100644 _i_database_context_factory_8cs_source.html create mode 100644 _i_database_seeder_8cs.html create mode 100644 _i_database_seeder_8cs_source.html create mode 100644 _i_dmb_factory_8cs.html create mode 100644 _i_dmb_factory_8cs_source.html create mode 100644 _i_dmb_provider_8cs.html create mode 100644 _i_dmb_provider_8cs_source.html create mode 100644 _i_dream_daemon_client_8cs.html create mode 100644 _i_dream_daemon_client_8cs_source.html create mode 100644 _i_dream_maker_8cs.html create mode 100644 _i_dream_maker_8cs_source.html create mode 100644 _i_dream_maker_client_8cs.html create mode 100644 _i_dream_maker_client_8cs_source.html create mode 100644 _i_event_consumer_8cs.html create mode 100644 _i_event_consumer_8cs_source.html create mode 100644 _i_git_hub_client_factory_8cs.html create mode 100644 _i_git_hub_client_factory_8cs_source.html create mode 100644 _i_http_client_8cs.html create mode 100644 _i_http_client_8cs_source.html create mode 100644 _i_i_o_manager_8cs.html create mode 100644 _i_i_o_manager_8cs_source.html create mode 100644 _i_identity_cache_8cs.html create mode 100644 _i_identity_cache_8cs_source.html create mode 100644 _i_instance_8cs.html create mode 100644 _i_instance_8cs_source.html create mode 100644 _i_instance_client_8cs.html create mode 100644 _i_instance_client_8cs_source.html create mode 100644 _i_instance_factory_8cs.html create mode 100644 _i_instance_factory_8cs_source.html create mode 100644 _i_instance_manager_8cs.html create mode 100644 _i_instance_manager_8cs_source.html create mode 100644 _i_instance_manager_client_8cs.html create mode 100644 _i_instance_manager_client_8cs_source.html create mode 100644 _i_instance_user_client_8cs.html create mode 100644 _i_instance_user_client_8cs_source.html create mode 100644 _i_job_manager_8cs.html create mode 100644 _i_job_manager_8cs_source.html create mode 100644 _i_jobs_client_8cs.html create mode 100644 _i_jobs_client_8cs_source.html create mode 100644 _i_json_tracking_context_8cs.html create mode 100644 _i_json_tracking_context_8cs_source.html create mode 100644 _i_network_prompt_reaper_8cs.html create mode 100644 _i_network_prompt_reaper_8cs_source.html create mode 100644 _i_platform_identifier_8cs.html create mode 100644 _i_platform_identifier_8cs_source.html create mode 100644 _i_post_write_handler_8cs.html create mode 100644 _i_post_write_handler_8cs_source.html create mode 100644 _i_process_8cs.html create mode 100644 _i_process_8cs_source.html create mode 100644 _i_process_base_8cs.html create mode 100644 _i_process_base_8cs_source.html create mode 100644 _i_process_executor_8cs.html create mode 100644 _i_process_executor_8cs_source.html create mode 100644 _i_provider_8cs.html create mode 100644 _i_provider_8cs_source.html create mode 100644 _i_provider_factory_8cs.html create mode 100644 _i_provider_factory_8cs_source.html create mode 100644 _i_reattach_info_handler_8cs.html create mode 100644 _i_reattach_info_handler_8cs_source.html create mode 100644 _i_repository_8cs.html create mode 100644 _i_repository_8cs_source.html create mode 100644 _i_repository_client_8cs.html create mode 100644 _i_repository_client_8cs_source.html create mode 100644 _i_repository_manager_8cs.html create mode 100644 _i_repository_manager_8cs_source.html create mode 100644 _i_request_logger_8cs.html create mode 100644 _i_request_logger_8cs_source.html create mode 100644 _i_restart_handler_8cs.html create mode 100644 _i_restart_handler_8cs_source.html create mode 100644 _i_restart_registration_8cs.html create mode 100644 _i_restart_registration_8cs_source.html create mode 100644 _i_server_8cs.html create mode 100644 _i_server_8cs_source.html create mode 100644 _i_server_client_8cs.html create mode 100644 _i_server_client_8cs_source.html create mode 100644 _i_server_client_factory_8cs.html create mode 100644 _i_server_client_factory_8cs_source.html create mode 100644 _i_server_control_8cs.html create mode 100644 _i_server_control_8cs_source.html create mode 100644 _i_server_factory_8cs.html create mode 100644 _i_server_factory_8cs_source.html create mode 100644 _i_session_controller_8cs.html create mode 100644 _i_session_controller_8cs_source.html create mode 100644 _i_session_controller_factory_8cs.html create mode 100644 _i_session_controller_factory_8cs_source.html create mode 100644 _i_setup_wizard_8cs.html create mode 100644 _i_setup_wizard_8cs_source.html create mode 100644 _i_symlink_factory_8cs.html create mode 100644 _i_symlink_factory_8cs_source.html create mode 100644 _i_synchronous_i_o_manager_8cs.html create mode 100644 _i_synchronous_i_o_manager_8cs_source.html create mode 100644 _i_system_identity_8cs.html create mode 100644 _i_system_identity_8cs_source.html create mode 100644 _i_system_identity_factory_8cs.html create mode 100644 _i_system_identity_factory_8cs_source.html create mode 100644 _i_token_factory_8cs.html create mode 100644 _i_token_factory_8cs_source.html create mode 100644 _i_users_client_8cs.html create mode 100644 _i_users_client_8cs_source.html create mode 100644 _identity_cache_8cs.html create mode 100644 _identity_cache_8cs_source.html create mode 100644 _identity_cache_object_8cs.html create mode 100644 _identity_cache_object_8cs_source.html create mode 100644 _instance_client_8cs.html create mode 100644 _instance_client_8cs_source.html create mode 100644 _instance_controller_8cs.html create mode 100644 _instance_controller_8cs_source.html create mode 100644 _instance_factory_8cs.html create mode 100644 _instance_factory_8cs_source.html create mode 100644 _instance_manager_8cs.html create mode 100644 _instance_manager_8cs_source.html create mode 100644 _instance_manager_client_8cs.html create mode 100644 _instance_manager_client_8cs_source.html create mode 100644 _instance_manager_rights_8cs.html create mode 100644 _instance_manager_rights_8cs_source.html create mode 100644 _instance_manager_test_8cs.html create mode 100644 _instance_manager_test_8cs_source.html create mode 100644 _instance_test_8cs.html create mode 100644 _instance_test_8cs_source.html create mode 100644 _instance_user_client_8cs.html create mode 100644 _instance_user_client_8cs_source.html create mode 100644 _instance_user_controller_8cs.html create mode 100644 _instance_user_controller_8cs_source.html create mode 100644 _instance_user_rights_8cs.html create mode 100644 _instance_user_rights_8cs_source.html create mode 100644 _insufficient_permissions_exception_8cs.html create mode 100644 _insufficient_permissions_exception_8cs_source.html create mode 100644 _integration_test_8cs.html create mode 100644 _integration_test_8cs_source.html create mode 100644 _irc_connection_string_builder_8cs.html create mode 100644 _irc_connection_string_builder_8cs_source.html create mode 100644 _irc_password_type_8cs.html create mode 100644 _irc_password_type_8cs_source.html create mode 100644 _irc_provider_8cs.html create mode 100644 _irc_provider_8cs_source.html create mode 100644 _job_controller_8cs.html create mode 100644 _job_controller_8cs_source.html create mode 100644 _job_exception_8cs.html create mode 100644 _job_exception_8cs_source.html create mode 100644 _job_handler_8cs.html create mode 100644 _job_handler_8cs_source.html create mode 100644 _job_manager_8cs.html create mode 100644 _job_manager_8cs_source.html create mode 100644 _jobs_client_8cs.html create mode 100644 _jobs_client_8cs_source.html create mode 100644 _json_file_8cs.html create mode 100644 _json_file_8cs_source.html create mode 100644 _json_sub_file_list_8cs.html create mode 100644 _json_sub_file_list_8cs_source.html create mode 100644 _json_tracking_context_8cs.html create mode 100644 _json_tracking_context_8cs_source.html create mode 100644 _kek_command_8cs.html create mode 100644 _kek_command_8cs_source.html create mode 100644 _launch_result_8cs.html create mode 100644 _launch_result_8cs_source.html create mode 100644 _message_8cs.html create mode 100644 _message_8cs_source.html create mode 100644 _method_not_supported_exception_8cs.html create mode 100644 _method_not_supported_exception_8cs_source.html create mode 100644 _model_controller_8cs.html create mode 100644 _model_controller_8cs_source.html create mode 100644 _models_2_reattach_information_8cs.html create mode 100644 _models_2_reattach_information_8cs_source.html create mode 100644 _models_2_watchdog_reattach_information_8cs.html create mode 100644 _models_2_watchdog_reattach_information_8cs_source.html create mode 100644 _monitor_action_8cs.html create mode 100644 _monitor_action_8cs_source.html create mode 100644 _monitor_activation_reason_8cs.html create mode 100644 _monitor_activation_reason_8cs_source.html create mode 100644 _monitor_state_8cs.html create mode 100644 _monitor_state_8cs_source.html create mode 100644 _my_sql_database_context_8cs.html create mode 100644 _my_sql_database_context_8cs_source.html create mode 100644 _my_sql_database_context_model_snapshot_8cs.html create mode 100644 _my_sql_database_context_model_snapshot_8cs_source.html create mode 100644 _my_sql_design_time_db_context_factory_8cs.html create mode 100644 _my_sql_design_time_db_context_factory_8cs_source.html create mode 100644 _native_methods_8cs.html create mode 100644 _native_methods_8cs_source.html create mode 100644 _platform_identifier_8cs.html create mode 100644 _platform_identifier_8cs_source.html create mode 100644 _posix_byond_installer_8cs.html create mode 100644 _posix_byond_installer_8cs_source.html create mode 100644 _posix_network_prompt_reaper_8cs.html create mode 100644 _posix_network_prompt_reaper_8cs_source.html create mode 100644 _posix_post_write_handler_8cs.html create mode 100644 _posix_post_write_handler_8cs_source.html create mode 100644 _posix_symlink_factory_8cs.html create mode 100644 _posix_symlink_factory_8cs_source.html create mode 100644 _posix_system_identity_factory_8cs.html create mode 100644 _posix_system_identity_factory_8cs_source.html create mode 100644 _process_8cs.html create mode 100644 _process_8cs_source.html create mode 100644 _process_executor_8cs.html create mode 100644 _process_executor_8cs_source.html create mode 100644 _provider_8cs.html create mode 100644 _provider_8cs_source.html create mode 100644 _provider_factory_8cs.html create mode 100644 _provider_factory_8cs_source.html create mode 100644 _pull_requests_command_8cs.html create mode 100644 _pull_requests_command_8cs_source.html create mode 100644 _r_e_a_d_m_e_8md.html create mode 100644 _rate_limit_exception_8cs.html create mode 100644 _rate_limit_exception_8cs_source.html create mode 100644 _reattach_info_handler_8cs.html create mode 100644 _reattach_info_handler_8cs_source.html create mode 100644 _reattach_information_base_8cs.html create mode 100644 _reattach_information_base_8cs_source.html create mode 100644 _reboot_state_8cs.html create mode 100644 _reboot_state_8cs_source.html create mode 100644 _release_notes_8_assembly_info_8cs.html create mode 100644 _release_notes_8_assembly_info_8cs_source.html create mode 100644 _repository_client_8cs.html create mode 100644 _repository_client_8cs_source.html create mode 100644 _repository_controller_8cs.html create mode 100644 _repository_controller_8cs_source.html create mode 100644 _repository_manager_8cs.html create mode 100644 _repository_manager_8cs_source.html create mode 100644 _repository_rights_8cs.html create mode 100644 _repository_rights_8cs_source.html create mode 100644 _request_timeout_exception_8cs.html create mode 100644 _request_timeout_exception_8cs_source.html create mode 100644 _resolving_i_o_manager_8cs.html create mode 100644 _resolving_i_o_manager_8cs_source.html create mode 100644 _response_8cs.html create mode 100644 _response_8cs_source.html create mode 100644 _restart_registration_8cs.html create mode 100644 _restart_registration_8cs_source.html create mode 100644 _rev_info_test_merge_8cs.html create mode 100644 _rev_info_test_merge_8cs_source.html create mode 100644 _revision_command_8cs.html create mode 100644 _revision_command_8cs_source.html create mode 100644 _rights_helper_8cs.html create mode 100644 _rights_helper_8cs_source.html create mode 100644 _rights_type_8cs.html create mode 100644 _rights_type_8cs_source.html create mode 100644 _routes_8cs.html create mode 100644 _routes_8cs_source.html create mode 100644 _semaphore_slim_context_8cs.html create mode 100644 _semaphore_slim_context_8cs_source.html create mode 100644 _server_8cs.html create mode 100644 _server_8cs_source.html create mode 100644 _server_client_8cs.html create mode 100644 _server_client_8cs_source.html create mode 100644 _server_client_factory_8cs.html create mode 100644 _server_client_factory_8cs_source.html create mode 100644 _server_error_exception_8cs.html create mode 100644 _server_error_exception_8cs_source.html create mode 100644 _server_factory_8cs.html create mode 100644 _server_factory_8cs_source.html create mode 100644 _server_information_8cs.html create mode 100644 _server_information_8cs_source.html create mode 100644 _server_service_8cs.html create mode 100644 _server_service_8cs_source.html create mode 100644 _server_side_modifications_8cs.html create mode 100644 _server_side_modifications_8cs_source.html create mode 100644 _service_collection_extensions_8cs.html create mode 100644 _service_collection_extensions_8cs_source.html create mode 100644 _service_unavailable_exception_8cs.html create mode 100644 _service_unavailable_exception_8cs_source.html create mode 100644 _session_controller_8cs.html create mode 100644 _session_controller_8cs_source.html create mode 100644 _session_controller_factory_8cs.html create mode 100644 _session_controller_factory_8cs_source.html create mode 100644 _setup_wizard_8cs.html create mode 100644 _setup_wizard_8cs_source.html create mode 100644 _setup_wizard_mode_8cs.html create mode 100644 _setup_wizard_mode_8cs_source.html create mode 100644 _sql_server_database_context_8cs.html create mode 100644 _sql_server_database_context_8cs_source.html create mode 100644 _sql_server_database_context_model_snapshot_8cs.html create mode 100644 _sql_server_database_context_model_snapshot_8cs_source.html create mode 100644 _sql_server_design_time_db_context_factory_8cs.html create mode 100644 _sql_server_design_time_db_context_factory_8cs_source.html create mode 100644 _synchronous_i_o_manager_8cs.html create mode 100644 _synchronous_i_o_manager_8cs_source.html create mode 100644 _task_extensions_8cs.html create mode 100644 _task_extensions_8cs_source.html create mode 100644 _temporary_dmb_provider_8cs.html create mode 100644 _temporary_dmb_provider_8cs_source.html create mode 100644 _test_api_client_8cs.html create mode 100644 _test_api_client_8cs_source.html create mode 100644 _test_api_headers_8cs.html create mode 100644 _test_api_headers_8cs_source.html create mode 100644 _test_application_8cs.html create mode 100644 _test_application_8cs_source.html create mode 100644 _test_async_delayer_8cs.html create mode 100644 _test_async_delayer_8cs_source.html create mode 100644 _test_authentication_context_8cs.html create mode 100644 _test_authentication_context_8cs_source.html create mode 100644 _test_console_8cs.html create mode 100644 _test_console_8cs_source.html create mode 100644 _test_d_b_connection_factory_8cs.html create mode 100644 _test_d_b_connection_factory_8cs_source.html create mode 100644 _test_database_context_factory_8cs.html create mode 100644 _test_database_context_factory_8cs_source.html create mode 100644 _test_discord_provider_8cs.html create mode 100644 _test_discord_provider_8cs_source.html create mode 100644 _test_dream_daemon_client_8cs.html create mode 100644 _test_dream_daemon_client_8cs_source.html create mode 100644 _test_experimental_watchdog_8cs.html create mode 100644 _test_experimental_watchdog_8cs_source.html create mode 100644 _test_git_hub_client_factory_8cs.html create mode 100644 _test_git_hub_client_factory_8cs_source.html create mode 100644 _test_irc_connection_string_builder_8cs.html create mode 100644 _test_irc_connection_string_builder_8cs_source.html create mode 100644 _test_job_exception_8cs.html create mode 100644 _test_job_exception_8cs_source.html create mode 100644 _test_job_handler_8cs.html create mode 100644 _test_job_handler_8cs_source.html create mode 100644 _test_merge_base_8cs.html create mode 100644 _test_merge_base_8cs_source.html create mode 100644 _test_merge_parameters_8cs.html create mode 100644 _test_merge_parameters_8cs_source.html create mode 100644 _test_platform_identifier_8cs.html create mode 100644 _test_platform_identifier_8cs_source.html create mode 100644 _test_posix_byond_installer_8cs.html create mode 100644 _test_posix_byond_installer_8cs_source.html create mode 100644 _test_post_write_handler_8cs.html create mode 100644 _test_post_write_handler_8cs_source.html create mode 100644 _test_program_8cs.html create mode 100644 _test_program_8cs_source.html create mode 100644 _test_rights_8cs.html create mode 100644 _test_rights_8cs_source.html create mode 100644 _test_server_client_factory_8cs.html create mode 100644 _test_server_client_factory_8cs_source.html create mode 100644 _test_server_factory_8cs.html create mode 100644 _test_server_factory_8cs_source.html create mode 100644 _test_server_service_8cs.html create mode 100644 _test_server_service_8cs_source.html create mode 100644 _test_service_collection_extensions_8cs.html create mode 100644 _test_service_collection_extensions_8cs_source.html create mode 100644 _test_setup_wizard_8cs.html create mode 100644 _test_setup_wizard_8cs_source.html create mode 100644 _test_symlink_factory_8cs.html create mode 100644 _test_symlink_factory_8cs_source.html create mode 100644 _test_watchdog_8cs.html create mode 100644 _test_watchdog_8cs_source.html create mode 100644 _test_watchdog_factory_8cs.html create mode 100644 _test_watchdog_factory_8cs_source.html create mode 100644 _testing_server_8cs.html create mode 100644 _testing_server_8cs_source.html create mode 100644 _tgs_authorize_attribute_8cs.html create mode 100644 _tgs_authorize_attribute_8cs_source.html create mode 100644 _tgstation_8_server_8_api_2_models_2_chat_bot_8cs.html create mode 100644 _tgstation_8_server_8_api_2_models_2_chat_bot_8cs_source.html create mode 100644 _tgstation_8_server_8_api_2_models_2_chat_channel_8cs.html create mode 100644 _tgstation_8_server_8_api_2_models_2_chat_channel_8cs_source.html create mode 100644 _tgstation_8_server_8_api_2_models_2_compile_job_8cs.html create mode 100644 _tgstation_8_server_8_api_2_models_2_compile_job_8cs_source.html create mode 100644 _tgstation_8_server_8_api_2_models_2_dream_maker_8cs.html create mode 100644 _tgstation_8_server_8_api_2_models_2_dream_maker_8cs_source.html create mode 100644 _tgstation_8_server_8_api_2_models_2_instance_8cs.html create mode 100644 _tgstation_8_server_8_api_2_models_2_instance_8cs_source.html create mode 100644 _tgstation_8_server_8_api_2_models_2_instance_user_8cs.html create mode 100644 _tgstation_8_server_8_api_2_models_2_instance_user_8cs_source.html create mode 100644 _tgstation_8_server_8_api_2_models_2_internal_2_chat_bot_8cs.html create mode 100644 _tgstation_8_server_8_api_2_models_2_internal_2_chat_bot_8cs_source.html create mode 100644 _tgstation_8_server_8_api_2_models_2_internal_2_compile_job_8cs.html create mode 100644 _tgstation_8_server_8_api_2_models_2_internal_2_compile_job_8cs_source.html create mode 100644 _tgstation_8_server_8_api_2_models_2_internal_2_dream_daemon_settings_8cs.html create mode 100644 _tgstation_8_server_8_api_2_models_2_internal_2_dream_daemon_settings_8cs_source.html create mode 100644 _tgstation_8_server_8_api_2_models_2_internal_2_job_8cs.html create mode 100644 _tgstation_8_server_8_api_2_models_2_internal_2_job_8cs_source.html create mode 100644 _tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs.html create mode 100644 _tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs_source.html create mode 100644 _tgstation_8_server_8_api_2_models_2_internal_2_revision_information_8cs.html create mode 100644 _tgstation_8_server_8_api_2_models_2_internal_2_revision_information_8cs_source.html create mode 100644 _tgstation_8_server_8_api_2_models_2_internal_2_test_merge_8cs.html create mode 100644 _tgstation_8_server_8_api_2_models_2_internal_2_test_merge_8cs_source.html create mode 100644 _tgstation_8_server_8_api_2_models_2_internal_2_user_8cs.html create mode 100644 _tgstation_8_server_8_api_2_models_2_internal_2_user_8cs_source.html create mode 100644 _tgstation_8_server_8_api_2_models_2_job_8cs.html create mode 100644 _tgstation_8_server_8_api_2_models_2_job_8cs_source.html create mode 100644 _tgstation_8_server_8_api_2_models_2_repository_8cs.html create mode 100644 _tgstation_8_server_8_api_2_models_2_repository_8cs_source.html create mode 100644 _tgstation_8_server_8_api_2_models_2_revision_information_8cs.html create mode 100644 _tgstation_8_server_8_api_2_models_2_revision_information_8cs_source.html create mode 100644 _tgstation_8_server_8_api_2_models_2_test_merge_8cs.html create mode 100644 _tgstation_8_server_8_api_2_models_2_test_merge_8cs_source.html create mode 100644 _tgstation_8_server_8_api_2_models_2_user_8cs.html create mode 100644 _tgstation_8_server_8_api_2_models_2_user_8cs_source.html create mode 100644 _tgstation_8_server_8_api_8_assembly_info_8cs.html create mode 100644 _tgstation_8_server_8_api_8_assembly_info_8cs_source.html create mode 100644 _tgstation_8_server_8_api_8_tests_8_assembly_info_8cs.html create mode 100644 _tgstation_8_server_8_api_8_tests_8_assembly_info_8cs_source.html create mode 100644 _tgstation_8_server_8_api_8_tests_8_program_8cs.html create mode 100644 _tgstation_8_server_8_api_8_tests_8_program_8cs_source.html create mode 100644 _tgstation_8_server_8_client_2_assembly_info_8cs.html create mode 100644 _tgstation_8_server_8_client_2_assembly_info_8cs_source.html create mode 100644 _tgstation_8_server_8_client_8_assembly_info_8cs.html create mode 100644 _tgstation_8_server_8_client_8_assembly_info_8cs_source.html create mode 100644 _tgstation_8_server_8_client_8_tests_8_assembly_info_8cs.html create mode 100644 _tgstation_8_server_8_client_8_tests_8_assembly_info_8cs_source.html create mode 100644 _tgstation_8_server_8_client_8_tests_8_program_8cs.html create mode 100644 _tgstation_8_server_8_client_8_tests_8_program_8cs_source.html create mode 100644 _tgstation_8_server_8_host_2_assembly_info_8cs.html create mode 100644 _tgstation_8_server_8_host_2_assembly_info_8cs_source.html create mode 100644 _tgstation_8_server_8_host_2_components_2_chat_2_user_8cs.html create mode 100644 _tgstation_8_server_8_host_2_components_2_chat_2_user_8cs_source.html create mode 100644 _tgstation_8_server_8_host_2_components_2_compiler_2_dream_maker_8cs.html create mode 100644 _tgstation_8_server_8_host_2_components_2_compiler_2_dream_maker_8cs_source.html create mode 100644 _tgstation_8_server_8_host_2_components_2_instance_8cs.html create mode 100644 _tgstation_8_server_8_host_2_components_2_instance_8cs_source.html create mode 100644 _tgstation_8_server_8_host_2_components_2_interop_2_test_merge_8cs.html create mode 100644 _tgstation_8_server_8_host_2_components_2_interop_2_test_merge_8cs_source.html create mode 100644 _tgstation_8_server_8_host_2_components_2_repository_2_repository_8cs.html create mode 100644 _tgstation_8_server_8_host_2_components_2_repository_2_repository_8cs_source.html create mode 100644 _tgstation_8_server_8_host_2_models_2_chat_bot_8cs.html create mode 100644 _tgstation_8_server_8_host_2_models_2_chat_bot_8cs_source.html create mode 100644 _tgstation_8_server_8_host_2_models_2_chat_channel_8cs.html create mode 100644 _tgstation_8_server_8_host_2_models_2_chat_channel_8cs_source.html create mode 100644 _tgstation_8_server_8_host_2_models_2_compile_job_8cs.html create mode 100644 _tgstation_8_server_8_host_2_models_2_compile_job_8cs_source.html create mode 100644 _tgstation_8_server_8_host_2_models_2_dream_daemon_settings_8cs.html create mode 100644 _tgstation_8_server_8_host_2_models_2_dream_daemon_settings_8cs_source.html create mode 100644 _tgstation_8_server_8_host_2_models_2_instance_8cs.html create mode 100644 _tgstation_8_server_8_host_2_models_2_instance_8cs_source.html create mode 100644 _tgstation_8_server_8_host_2_models_2_instance_user_8cs.html create mode 100644 _tgstation_8_server_8_host_2_models_2_instance_user_8cs_source.html create mode 100644 _tgstation_8_server_8_host_2_models_2_job_8cs.html create mode 100644 _tgstation_8_server_8_host_2_models_2_job_8cs_source.html create mode 100644 _tgstation_8_server_8_host_2_models_2_repository_settings_8cs.html create mode 100644 _tgstation_8_server_8_host_2_models_2_repository_settings_8cs_source.html create mode 100644 _tgstation_8_server_8_host_2_models_2_revision_information_8cs.html create mode 100644 _tgstation_8_server_8_host_2_models_2_revision_information_8cs_source.html create mode 100644 _tgstation_8_server_8_host_2_models_2_test_merge_8cs.html create mode 100644 _tgstation_8_server_8_host_2_models_2_test_merge_8cs_source.html create mode 100644 _tgstation_8_server_8_host_2_models_2_user_8cs.html create mode 100644 _tgstation_8_server_8_host_2_models_2_user_8cs_source.html create mode 100644 _tgstation_8_server_8_host_8_assembly_info_8cs.html create mode 100644 _tgstation_8_server_8_host_8_assembly_info_8cs_source.html create mode 100644 _tgstation_8_server_8_host_8_console_2_assembly_info_8cs.html create mode 100644 _tgstation_8_server_8_host_8_console_2_assembly_info_8cs_source.html create mode 100644 _tgstation_8_server_8_host_8_console_8_assembly_info_8cs.html create mode 100644 _tgstation_8_server_8_host_8_console_8_assembly_info_8cs_source.html create mode 100644 _tgstation_8_server_8_host_8_console_8_tests_8_assembly_info_8cs.html create mode 100644 _tgstation_8_server_8_host_8_console_8_tests_8_assembly_info_8cs_source.html create mode 100644 _tgstation_8_server_8_host_8_console_8_tests_8_program_8cs.html create mode 100644 _tgstation_8_server_8_host_8_console_8_tests_8_program_8cs_source.html create mode 100644 _tgstation_8_server_8_host_8_razor_assembly_info_8cs.html create mode 100644 _tgstation_8_server_8_host_8_razor_assembly_info_8cs_source.html create mode 100644 _tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs.html create mode 100644 _tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs_source.html create mode 100644 _tgstation_8_server_8_host_8_service_8_assembly_info_8cs.html create mode 100644 _tgstation_8_server_8_host_8_service_8_assembly_info_8cs_source.html create mode 100644 _tgstation_8_server_8_host_8_service_8_tests_8_assembly_info_8cs.html create mode 100644 _tgstation_8_server_8_host_8_service_8_tests_8_assembly_info_8cs_source.html create mode 100644 _tgstation_8_server_8_host_8_tests_8_assembly_info_8cs.html create mode 100644 _tgstation_8_server_8_host_8_tests_8_assembly_info_8cs_source.html create mode 100644 _tgstation_8_server_8_host_8_tests_8_program_8cs.html create mode 100644 _tgstation_8_server_8_host_8_tests_8_program_8cs_source.html create mode 100644 _tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs.html create mode 100644 _tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs_source.html create mode 100644 _tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs.html create mode 100644 _tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs_source.html create mode 100644 _tgstation_8_server_8_host_8_watchdog_8_tests_8_assembly_info_8cs.html create mode 100644 _tgstation_8_server_8_host_8_watchdog_8_tests_8_assembly_info_8cs_source.html create mode 100644 _tgstation_8_server_8_host_8_watchdog_8_tests_8_program_8cs.html create mode 100644 _tgstation_8_server_8_host_8_watchdog_8_tests_8_program_8cs_source.html create mode 100644 _tgstation_8_server_8_tests_8_assembly_info_8cs.html create mode 100644 _tgstation_8_server_8_tests_8_assembly_info_8cs_source.html create mode 100644 _tgstation_8_server_8_tests_8_program_8cs.html create mode 100644 _tgstation_8_server_8_tests_8_program_8cs_source.html create mode 100644 _token_8cs.html create mode 100644 _token_8cs_source.html create mode 100644 _token_factory_8cs.html create mode 100644 _token_factory_8cs_source.html create mode 100644 _unauthorized_exception_8cs.html create mode 100644 _unauthorized_exception_8cs_source.html create mode 100644 _unrecognized_response_exception_8cs.html create mode 100644 _unrecognized_response_exception_8cs_source.html create mode 100644 _updates_configuration_8cs.html create mode 100644 _updates_configuration_8cs_source.html create mode 100644 _user_controller_8cs.html create mode 100644 _user_controller_8cs_source.html create mode 100644 _user_update_8cs.html create mode 100644 _user_update_8cs_source.html create mode 100644 _users_client_8cs.html create mode 100644 _users_client_8cs_source.html create mode 100644 _version_command_8cs.html create mode 100644 _version_command_8cs_source.html create mode 100644 _watchdog_2_i_watchdog_8cs.html create mode 100644 _watchdog_2_i_watchdog_8cs_source.html create mode 100644 _watchdog_2_i_watchdog_factory_8cs.html create mode 100644 _watchdog_2_i_watchdog_factory_8cs_source.html create mode 100644 _watchdog_2_watchdog_factory_8cs.html create mode 100644 _watchdog_2_watchdog_factory_8cs_source.html create mode 100644 _watchdog_8cs.html create mode 100644 _watchdog_8cs_source.html create mode 100644 _watchdog_base_8cs.html create mode 100644 _watchdog_base_8cs_source.html create mode 100644 _watchdog_reattach_information_base_8cs.html create mode 100644 _watchdog_reattach_information_base_8cs_source.html create mode 100644 _windows_byond_installer_8cs.html create mode 100644 _windows_byond_installer_8cs_source.html create mode 100644 _windows_network_prompt_reaper_8cs.html create mode 100644 _windows_network_prompt_reaper_8cs_source.html create mode 100644 _windows_post_write_handler_8cs.html create mode 100644 _windows_post_write_handler_8cs_source.html create mode 100644 _windows_symlink_factory_8cs.html create mode 100644 _windows_symlink_factory_8cs_source.html create mode 100644 _windows_system_identity_8cs.html create mode 100644 _windows_system_identity_8cs_source.html create mode 100644 _windows_system_identity_factory_8cs.html create mode 100644 _windows_system_identity_factory_8cs_source.html create mode 100644 annotated.html create mode 100644 api.html create mode 100644 architecture.html create mode 100644 bc_s.png create mode 100644 bdwn.png create mode 100644 class_authorize_attribute.html create mode 100644 class_authorize_attribute.png create mode 100644 class_auto_generated_program-members.html create mode 100644 class_auto_generated_program.html create mode 100644 class_controller.html create mode 100644 class_controller.png create mode 100644 class_db_context.html create mode 100644 class_db_context.png create mode 100644 class_i_application_lifetime.html create mode 100644 class_i_application_lifetime.png create mode 100644 class_i_design_time_db_context_factory.html create mode 100644 class_i_design_time_db_context_factory.png create mode 100644 class_i_disposable.html create mode 100644 class_i_disposable.png create mode 100644 class_i_hosted_service.html create mode 100644 class_i_hosted_service.png create mode 100644 class_json_converter.html create mode 100644 class_json_converter.png create mode 100644 class_migration.html create mode 100644 class_migration.png create mode 100644 class_model_snapshot.html create mode 100644 class_model_snapshot.png create mode 100644 class_release_notes_1_1_program-members.html create mode 100644 class_release_notes_1_1_program.html create mode 100644 class_service_base.html create mode 100644 class_service_base.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_api_headers-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_api_headers.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_administration-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_administration.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_byond-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_byond.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_bot-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_bot.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_bot.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_connection_string_builder-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_connection_string_builder.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_connection_string_builder.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_compile_job-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_compile_job.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_compile_job.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_settings-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_settings.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_settings.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_revision_information-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_revision_information.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_revision_information.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_server_information-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_server_information.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests_1_1_test_irc_connection_string_builder-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests_1_1_test_irc_connection_string_builder.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_token-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_token.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user_update-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user_update.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user_update.png create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests_1_1_test_rights-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests_1_1_test_rights.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_routes-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_routes.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_tests_1_1_test_api_headers-members.html create mode 100644 class_tgstation_1_1_server_1_1_api_1_1_tests_1_1_test_api_headers.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_administration_client-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_administration_client.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_administration_client.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_api_client-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_api_client.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_api_client.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_api_client_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_api_client_factory.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_api_client_factory.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_api_conflict_exception-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_api_conflict_exception.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_api_conflict_exception.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_client_exception-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_client_exception.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_client_exception.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests_1_1_test_dream_daemon_client-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests_1_1_test_dream_daemon_client.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_conflict_exception-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_conflict_exception.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_conflict_exception.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_http_client-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_http_client.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_http_client.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_method_not_supported_exception-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_method_not_supported_exception.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_method_not_supported_exception.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_server_client-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_server_client.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_server_client.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_server_client_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_server_error_exception-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_server_error_exception.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_server_error_exception.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_api_client-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_api_client.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_server_client_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_server_client_factory.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.png create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_users_client-members.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_users_client.html create mode 100644 class_tgstation_1_1_server_1_1_client_1_1_users_client.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests_1_1_test_posix_byond_installer-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests_1_1_test_posix_byond_installer.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_bool_converter-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_bool_converter.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_bool_converter.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_message-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_message.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests_1_1_test_discord_provider-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests_1_1_test_discord_provider.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_response-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_response.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_command-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_command.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_command-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_command.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_event_notification-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_event_notification.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_server_side_modifications-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_server_side_modifications.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_launch_result-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_launch_result.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_monitor_state-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_monitor_state.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_posix_network_prompt_reaper-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_posix_network_prompt_reaper.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_posix_network_prompt_reaper.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_reattach_information-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_reattach_information.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_reattach_information.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests_1_1_test_experimental_watchdog-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests_1_1_test_experimental_watchdog.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_control_panel_configuration-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_control_panel_configuration.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_console_1_1_program-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_console_1_1_program.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests_1_1_test_program-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests_1_1_test_program.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application_builder_extensions-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application_builder_extensions.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_async_delayer-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_async_delayer.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_async_delayer.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_d_b_connection_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_d_b_connection_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_d_b_connection_factory.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_database_context_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_database_context_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_database_context_factory.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_exception-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_exception.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_exception.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_platform_identifier-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_platform_identifier.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_platform_identifier.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_service_collection_extensions-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_service_collection_extensions.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_task_extensions-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_task_extensions.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_setup_wizard-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_setup_wizard.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_setup_wizard.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_async_delayer-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_async_delayer.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_d_b_connection_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_d_b_connection_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_database_context_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_database_context_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_git_hub_client_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_git_hub_client_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_exception-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_exception.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_platform_identifier-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_platform_identifier.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config1-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config1.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config2-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config2.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config3.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_good_config-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_good_config.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_setup_wizard-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_setup_wizard.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_post_write_handler-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_post_write_handler.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_post_write_handler.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_symlink_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_symlink_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_symlink_factory.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_resolving_i_o_manager-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_resolving_i_o_manager.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_resolving_i_o_manager.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_console-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_console.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_post_write_handler-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_post_write_handler.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_post_write_handler-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_post_write_handler.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_post_write_handler.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_symlink_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_symlink_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_symlink_factory.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_design_time_db_context_factory_helpers-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_design_time_db_context_factory_helpers.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_fix_rev_info_index-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_fix_rev_info_index.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_fix_rev_info_index.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_fix_rev_info_index-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_fix_rev_info_index.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_fix_rev_info_index.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_database_context_model_snapshot-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_database_context_model_snapshot.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_database_context_model_snapshot.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_design_time_db_context_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_design_time_db_context_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_design_time_db_context_factory.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_database_context_model_snapshot-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_database_context_model_snapshot.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_database_context_model_snapshot.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_design_time_db_context_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_design_time_db_context_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_design_time_db_context_factory.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_my_sql_database_context-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_my_sql_database_context.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_my_sql_database_context.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_rev_info_test_merge-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_rev_info_test_merge.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_native_methods-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_native_methods.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_program-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_program.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_claims_injector-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_claims_injector.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_claims_injector.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_posix_system_identity_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_posix_system_identity_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_posix_system_identity_factory.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_tests_1_1_test_authentication_context-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_tests_1_1_test_authentication_context.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_server-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_server.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_server.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_server_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_server_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_server_factory.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_service_1_1_tests_1_1_test_server_service-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_service_1_1_tests_1_1_test_server_service.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_tests_1_1_test_server_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_tests_1_1_test_server_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.png create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory-members.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory.html create mode 100644 class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory.png create mode 100644 class_tgstation_1_1_server_1_1_tests_1_1_administration_test-members.html create mode 100644 class_tgstation_1_1_server_1_1_tests_1_1_administration_test.html create mode 100644 class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test-members.html create mode 100644 class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html create mode 100644 class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test-members.html create mode 100644 class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test.html create mode 100644 class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_instance_test-members.html create mode 100644 class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_instance_test.html create mode 100644 class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test-members.html create mode 100644 class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test.html create mode 100644 class_tgstation_1_1_server_1_1_tests_1_1_integration_test-members.html create mode 100644 class_tgstation_1_1_server_1_1_tests_1_1_integration_test.html create mode 100644 class_tgstation_1_1_server_1_1_tests_1_1_testing_server-members.html create mode 100644 class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html create mode 100644 class_tgstation_1_1_server_1_1_tests_1_1_testing_server.png create mode 100644 classes.html create mode 100644 closed.png create mode 100644 dir_009a3598be1715e27911e1588bdd551c.html create mode 100644 dir_019c6d3af924151b681494cc466be1ac.html create mode 100644 dir_02f69155ced6ccca99a24744a5273903.html create mode 100644 dir_08963d262fa9e27215dce7b7c6e97f1b.html create mode 100644 dir_0b6a380fe7fc1e1d640d1ac854fc3fb6.html create mode 100644 dir_0c9add60ab05c04ed8367ecaedf67c01.html create mode 100644 dir_0de875c2ee7edd4009e892c5045f7b3a.html create mode 100644 dir_0f5073360b9ba6d1522457c65eebe36a.html create mode 100644 dir_103b33cf1ab7043de6f87dfa61afa23f.html create mode 100644 dir_1083fcf52a7d94a2efffb6ca88246acf.html create mode 100644 dir_1302441b003a340c6a16c9bc1b51c94e.html create mode 100644 dir_177c182c6d1f29bec543c3fdad3072d5.html create mode 100644 dir_18f2820c1d411453d7d989b812e41820.html create mode 100644 dir_1cebbc1bce26b60bfb2ee26c80f86b02.html create mode 100644 dir_2133157f8312226ef9ea4ce42a802cf8.html create mode 100644 dir_2553b13cbb871373b0c30fb90d66217c.html create mode 100644 dir_26764abc66ddba24c5915db53fd68d23.html create mode 100644 dir_2b9d136d9ffdab429a63a74fca28b300.html create mode 100644 dir_2e39d68cad3f83629c74ea67329dead9.html create mode 100644 dir_2e67631cb23401d696bcfdbe81f86f0f.html create mode 100644 dir_2ea2465064f3ff030c6dd6700a328d91.html create mode 100644 dir_34761767c1c3cd212f9d2f80ea0828a8.html create mode 100644 dir_38cec1532eaed7aa1de0b599a76e3e80.html create mode 100644 dir_446bdfc1cd19b69c11765b5665ebfd45.html create mode 100644 dir_48968f849f7ddb061f7130e079fe66a6.html create mode 100644 dir_49e56c817e5e54854c35e136979f97ca.html create mode 100644 dir_4c0c7e2f4fc60f51e2347a2d8dda94ce.html create mode 100644 dir_4ddbd20a555bd1f3bf9569744c8989cc.html create mode 100644 dir_4eeb864c4eec08c7d6b9d3b0352cfdde.html create mode 100644 dir_59425e443f801f1f2fd8bbe4959a3ccf.html create mode 100644 dir_5d46d0c3fd1cac5ce1ea23751ad25792.html create mode 100644 dir_5d5b300b88421e3050db28dd037f6f39.html create mode 100644 dir_5e0b464d3b4be546c63c5188ffeb96e4.html create mode 100644 dir_61d7974a657c30011f457b376d274ee7.html create mode 100644 dir_68267d1309a1af8e8297ef4c3efbcdba.html create mode 100644 dir_685b5aa2d8a661ab5bc3f68b331887b0.html create mode 100644 dir_689f0584ee97ae9ca308532531d9c5d2.html create mode 100644 dir_6c60df807dd2523776d391746c262b4d.html create mode 100644 dir_71f5cbd840fdd1dea9f035c7b1a066ee.html create mode 100644 dir_74017a19412e2f90cc6ad11fcac82495.html create mode 100644 dir_78e87f8f095a8e3bb6ef1faef94cdb78.html create mode 100644 dir_7916dda968fadc8673161597975e4c5d.html create mode 100644 dir_7a3fd032a1362a6005a1fc9227a8dd86.html create mode 100644 dir_7a9487ad1984d08627fcf919e6f3d801.html create mode 100644 dir_7cd79c49f3850abc2141fa4adfdd1950.html create mode 100644 dir_860acef72838dce8d3d54c8f98bc464b.html create mode 100644 dir_87039fa7b841d848ca75981d64237477.html create mode 100644 dir_87a4f2035ed18e30422f4b60aebc4381.html create mode 100644 dir_9257d56e926145e494a5aa5279887044.html create mode 100644 dir_9826fb2d31585a830723e6d7089b5d0e.html create mode 100644 dir_9aa5991638c9344778d807333cc0bd50.html create mode 100644 dir_a01d946a2e1b048dc542232ffcdcf572.html create mode 100644 dir_a24b8c5f308a77f73e7a9e43c0f243d1.html create mode 100644 dir_a3714ab037275c284988fc90b4d045a5.html create mode 100644 dir_a3831f1c39821b3669f8a3808652203f.html create mode 100644 dir_a44a562b5a12ef1c8495ac1a63e915ea.html create mode 100644 dir_a51095d0142a80f0e979ff5bf5b861be.html create mode 100644 dir_a536e49cdf631f66733cf2c9791144ce.html create mode 100644 dir_a8807eef6592489c6a360d587f5b1a66.html create mode 100644 dir_a99ad55e4d1fa76955df2299f3783cf0.html create mode 100644 dir_b0d0d898ef448ca0a6a170a2896fa60e.html create mode 100644 dir_b524b00ec2259c3c83b44909fd47f6e3.html create mode 100644 dir_b551a02288ef39e099594710382363a0.html create mode 100644 dir_b6324197f7ac56e30d6189c3a45eec56.html create mode 100644 dir_b87cbb2c60cf682b61fbfcceb9bced43.html create mode 100644 dir_b92573f47b933d7a3661c26d1af2098b.html create mode 100644 dir_ba6c75cd9bd8b7a0d2af20e1cd5a80ab.html create mode 100644 dir_be6161819238d55fa660c07ade960e53.html create mode 100644 dir_be9f3ed3485a880e3213506a311823d1.html create mode 100644 dir_bf23e1e49f40264f2966f02ed35d8142.html create mode 100644 dir_c037ac41e54cca303e35165acb6e013d.html create mode 100644 dir_c2c4d4ee47e55233c6ea5db8b96422c6.html create mode 100644 dir_c50f9bd139317d744e2ee08ea9a734cc.html create mode 100644 dir_c5451d9d233744a5b09a29938f0cda9a.html create mode 100644 dir_c5f98c05147bcbba78e71856485f5049.html create mode 100644 dir_c648ff9d1a57dd8752f4ab2a7c68712c.html create mode 100644 dir_c9d0608eee53bfffcc33d03463bbe2db.html create mode 100644 dir_d8869fc9da5c696ed284d5c470b7210f.html create mode 100644 dir_d88de13ae4b64d4d0766b0c06f1a9edf.html create mode 100644 dir_d8a279f7113e0073f6cd65dd050c1475.html create mode 100644 dir_dbb0c65ea012faeef2906502dd42dfec.html create mode 100644 dir_df215ce6792635a450ba5a94b5a17942.html create mode 100644 dir_e0c1bccb03249d93bc42ac0968ce43fd.html create mode 100644 dir_e2ec88631ea78d6df8b37d27efa9bfe2.html create mode 100644 dir_e97d380c3eebaf0856a4ec180d749620.html create mode 100644 dir_e9975c2f0de13509bd9fb4e31ae732ab.html create mode 100644 dir_ea36b5ab01ad6e8b607438a02ae91964.html create mode 100644 dir_eb7c70823ae63176c38851687b13349d.html create mode 100644 dir_ed78ff3b0fc4a7f5234cdb0b34617476.html create mode 100644 dir_f0581cdd528a911f791df57d0f438bcb.html create mode 100644 dir_f0d41009ce252337feb2b68822c4cfba.html create mode 100644 dir_f2a82faa4c4beef364292694cefca86d.html create mode 100644 dir_f88948f9bde0555374e8a59a663bdfc9.html create mode 100644 dir_fab1362e86740a2c573ef875dd474a67.html create mode 100644 dir_fb12273b841438c2f2c9b5bc5398c636.html create mode 100644 doc.png create mode 100644 doxygen.css create mode 100644 doxygen.png create mode 100644 dynsections.js create mode 100644 files.html create mode 100644 folderclosed.png create mode 100644 folderopen.png create mode 100644 functions.html create mode 100644 functions_b.html create mode 100644 functions_c.html create mode 100644 functions_d.html create mode 100644 functions_e.html create mode 100644 functions_enum.html create mode 100644 functions_f.html create mode 100644 functions_func.html create mode 100644 functions_func_b.html create mode 100644 functions_func_c.html create mode 100644 functions_func_d.html create mode 100644 functions_func_e.html create mode 100644 functions_func_f.html create mode 100644 functions_func_g.html create mode 100644 functions_func_h.html create mode 100644 functions_func_i.html create mode 100644 functions_func_j.html create mode 100644 functions_func_k.html create mode 100644 functions_func_l.html create mode 100644 functions_func_m.html create mode 100644 functions_func_n.html create mode 100644 functions_func_o.html create mode 100644 functions_func_p.html create mode 100644 functions_func_r.html create mode 100644 functions_func_s.html create mode 100644 functions_func_t.html create mode 100644 functions_func_u.html create mode 100644 functions_func_v.html create mode 100644 functions_func_w.html create mode 100644 functions_func_z.html create mode 100644 functions_func_~.html create mode 100644 functions_g.html create mode 100644 functions_h.html create mode 100644 functions_i.html create mode 100644 functions_j.html create mode 100644 functions_k.html create mode 100644 functions_l.html create mode 100644 functions_m.html create mode 100644 functions_n.html create mode 100644 functions_o.html create mode 100644 functions_p.html create mode 100644 functions_prop.html create mode 100644 functions_prop_b.html create mode 100644 functions_prop_c.html create mode 100644 functions_prop_d.html create mode 100644 functions_prop_e.html create mode 100644 functions_prop_f.html create mode 100644 functions_prop_g.html create mode 100644 functions_prop_h.html create mode 100644 functions_prop_i.html create mode 100644 functions_prop_j.html create mode 100644 functions_prop_l.html create mode 100644 functions_prop_m.html create mode 100644 functions_prop_n.html create mode 100644 functions_prop_o.html create mode 100644 functions_prop_p.html create mode 100644 functions_prop_r.html create mode 100644 functions_prop_s.html create mode 100644 functions_prop_t.html create mode 100644 functions_prop_u.html create mode 100644 functions_prop_v.html create mode 100644 functions_prop_w.html create mode 100644 functions_q.html create mode 100644 functions_r.html create mode 100644 functions_s.html create mode 100644 functions_t.html create mode 100644 functions_u.html create mode 100644 functions_v.html create mode 100644 functions_vars.html create mode 100644 functions_vars_b.html create mode 100644 functions_vars_c.html create mode 100644 functions_vars_d.html create mode 100644 functions_vars_e.html create mode 100644 functions_vars_f.html create mode 100644 functions_vars_g.html create mode 100644 functions_vars_h.html create mode 100644 functions_vars_i.html create mode 100644 functions_vars_j.html create mode 100644 functions_vars_k.html create mode 100644 functions_vars_l.html create mode 100644 functions_vars_m.html create mode 100644 functions_vars_n.html create mode 100644 functions_vars_o.html create mode 100644 functions_vars_p.html create mode 100644 functions_vars_q.html create mode 100644 functions_vars_r.html create mode 100644 functions_vars_s.html create mode 100644 functions_vars_t.html create mode 100644 functions_vars_u.html create mode 100644 functions_vars_v.html create mode 100644 functions_vars_w.html create mode 100644 functions_w.html create mode 100644 functions_z.html create mode 100644 functions_~.html create mode 100644 hierarchy.html create mode 100644 index.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client-members.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client.png create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client-members.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.png create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client-members.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.png create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client-members.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.png create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client-members.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.png create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client-members.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.png create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client-members.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.png create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client-members.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client.png create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client-members.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.png create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client-members.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client.png create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_api_client-members.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.png create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_api_client_factory-members.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_api_client_factory.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_api_client_factory.png create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_http_client-members.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_http_client.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_http_client.png create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client-members.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.png create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_request_logger-members.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_request_logger.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_server_client-members.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.png create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_server_client_factory-members.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_server_client_factory.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_server_client_factory.png create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_users_client-members.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.html create mode 100644 interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_manager-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_manager.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_manager.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command_factory-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command_factory.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command_factory.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat_factory-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat_factory.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat_factory.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_custom_command_handler-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_custom_command_handler.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_custom_command_handler.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_json_tracking_context-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_json_tracking_context.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_json_tracking_context.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_provider_factory-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_provider_factory.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_provider_factory.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_compile_job_consumer-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_compile_job_consumer.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_compile_job_consumer.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dream_maker-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dream_maker.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dream_maker.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_event_consumer-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_event_consumer.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_event_consumer.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_factory-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_factory.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_factory.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_context-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_context.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_context.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_handler-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_handler.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_handler.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_credentials_provider-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_credentials_provider.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_credentials_provider.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository_manager-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository_manager.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository_manager.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_network_prompt_reaper-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_network_prompt_reaper.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_network_prompt_reaper.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_reattach_info_handler-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_reattach_info_handler.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_reattach_info_handler.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller_factory-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller_factory.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller_factory.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog_factory-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog_factory.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog_factory.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_application-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_application.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_application.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_async_delayer-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_async_delayer.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_async_delayer.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_d_b_connection_factory-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_d_b_connection_factory.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_d_b_connection_factory.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_database_context_factory-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_database_context_factory.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_database_context_factory.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_git_hub_client_factory-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_git_hub_client_factory.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_git_hub_client_factory.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_platform_identifier-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_platform_identifier.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_platform_identifier.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_base-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_base.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_base.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_executor-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_executor.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_executor.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_handler-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_handler.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_handler.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_registration.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_registration.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_setup_wizard-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_setup_wizard.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_setup_wizard.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_post_write_handler-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_post_write_handler.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_post_write_handler.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_symlink_factory-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_symlink_factory.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_symlink_factory.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_server-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_server.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_server.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_server_factory-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_server_factory.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_i_server_factory.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_seeder-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_seeder.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_seeder.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context_factory-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context_factory.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context_factory.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_claims_injector-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_claims_injector.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_claims_injector.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_cryptography_suite-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_cryptography_suite.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_cryptography_suite.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_identity_cache-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_identity_cache.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_identity_cache.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity_factory-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity_factory.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity_factory.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_token_factory-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_token_factory.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_token_factory.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog.png create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog_factory-members.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog_factory.html create mode 100644 interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog_factory.png create mode 100644 jquery.js create mode 100644 menu.js create mode 100644 menudata.js create mode 100644 namespace_release_notes.html create mode 100644 namespace_tgstation.html create mode 100644 namespace_tgstation_1_1_server.html create mode 100644 namespace_tgstation_1_1_server_1_1_api.html create mode 100644 namespace_tgstation_1_1_server_1_1_api_1_1_models.html create mode 100644 namespace_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal.html create mode 100644 namespace_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests.html create mode 100644 namespace_tgstation_1_1_server_1_1_api_1_1_rights.html create mode 100644 namespace_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests.html create mode 100644 namespace_tgstation_1_1_server_1_1_api_1_1_tests.html create mode 100644 namespace_tgstation_1_1_server_1_1_client.html create mode 100644 namespace_tgstation_1_1_server_1_1_client_1_1_components.html create mode 100644 namespace_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests.html create mode 100644 namespace_tgstation_1_1_server_1_1_client_1_1_tests.html create mode 100644 namespace_tgstation_1_1_server_1_1_host.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_components.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_console.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_controllers.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_core.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_i_o.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_models.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_security.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_security_1_1_tests.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_service.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_service_1_1_tests.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_tests.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_watchdog.html create mode 100644 namespace_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests.html create mode 100644 namespace_tgstation_1_1_server_1_1_tests.html create mode 100644 namespace_tgstation_1_1_server_1_1_tests_1_1_instance.html create mode 100644 namespacemembers.html create mode 100644 namespacemembers_enum.html create mode 100644 namespaces.html create mode 100644 nav_f.png create mode 100644 nav_g.png create mode 100644 nav_h.png create mode 100644 open.png create mode 100644 search/all_0.html create mode 100644 search/all_0.js create mode 100644 search/all_1.html create mode 100644 search/all_1.js create mode 100644 search/all_10.html create mode 100644 search/all_10.js create mode 100644 search/all_11.html create mode 100644 search/all_11.js create mode 100644 search/all_12.html create mode 100644 search/all_12.js create mode 100644 search/all_13.html create mode 100644 search/all_13.js create mode 100644 search/all_14.html create mode 100644 search/all_14.js create mode 100644 search/all_15.html create mode 100644 search/all_15.js create mode 100644 search/all_16.html create mode 100644 search/all_16.js create mode 100644 search/all_17.html create mode 100644 search/all_17.js create mode 100644 search/all_18.html create mode 100644 search/all_18.js create mode 100644 search/all_19.html create mode 100644 search/all_19.js create mode 100644 search/all_2.html create mode 100644 search/all_2.js create mode 100644 search/all_3.html create mode 100644 search/all_3.js create mode 100644 search/all_4.html create mode 100644 search/all_4.js create mode 100644 search/all_5.html create mode 100644 search/all_5.js create mode 100644 search/all_6.html create mode 100644 search/all_6.js create mode 100644 search/all_7.html create mode 100644 search/all_7.js create mode 100644 search/all_8.html create mode 100644 search/all_8.js create mode 100644 search/all_9.html create mode 100644 search/all_9.js create mode 100644 search/all_a.html create mode 100644 search/all_a.js create mode 100644 search/all_b.html create mode 100644 search/all_b.js create mode 100644 search/all_c.html create mode 100644 search/all_c.js create mode 100644 search/all_d.html create mode 100644 search/all_d.js create mode 100644 search/all_e.html create mode 100644 search/all_e.js create mode 100644 search/all_f.html create mode 100644 search/all_f.js create mode 100644 search/classes_0.html create mode 100644 search/classes_0.js create mode 100644 search/classes_1.html create mode 100644 search/classes_1.js create mode 100644 search/classes_10.html create mode 100644 search/classes_10.js create mode 100644 search/classes_11.html create mode 100644 search/classes_11.js create mode 100644 search/classes_12.html create mode 100644 search/classes_12.js create mode 100644 search/classes_13.html create mode 100644 search/classes_13.js create mode 100644 search/classes_14.html create mode 100644 search/classes_14.js create mode 100644 search/classes_2.html create mode 100644 search/classes_2.js create mode 100644 search/classes_3.html create mode 100644 search/classes_3.js create mode 100644 search/classes_4.html create mode 100644 search/classes_4.js create mode 100644 search/classes_5.html create mode 100644 search/classes_5.js create mode 100644 search/classes_6.html create mode 100644 search/classes_6.js create mode 100644 search/classes_7.html create mode 100644 search/classes_7.js create mode 100644 search/classes_8.html create mode 100644 search/classes_8.js create mode 100644 search/classes_9.html create mode 100644 search/classes_9.js create mode 100644 search/classes_a.html create mode 100644 search/classes_a.js create mode 100644 search/classes_b.html create mode 100644 search/classes_b.js create mode 100644 search/classes_c.html create mode 100644 search/classes_c.js create mode 100644 search/classes_d.html create mode 100644 search/classes_d.js create mode 100644 search/classes_e.html create mode 100644 search/classes_e.js create mode 100644 search/classes_f.html create mode 100644 search/classes_f.js create mode 100644 search/close.png create mode 100644 search/enums_0.html create mode 100644 search/enums_0.js create mode 100644 search/enums_1.html create mode 100644 search/enums_1.js create mode 100644 search/enums_2.html create mode 100644 search/enums_2.js create mode 100644 search/enums_3.html create mode 100644 search/enums_3.js create mode 100644 search/enums_4.html create mode 100644 search/enums_4.js create mode 100644 search/enums_5.html create mode 100644 search/enums_5.js create mode 100644 search/enums_6.html create mode 100644 search/enums_6.js create mode 100644 search/enums_7.html create mode 100644 search/enums_7.js create mode 100644 search/enums_8.html create mode 100644 search/enums_8.js create mode 100644 search/enumvalues_0.html create mode 100644 search/enumvalues_0.js create mode 100644 search/enumvalues_1.html create mode 100644 search/enumvalues_1.js create mode 100644 search/enumvalues_10.html create mode 100644 search/enumvalues_10.js create mode 100644 search/enumvalues_2.html create mode 100644 search/enumvalues_2.js create mode 100644 search/enumvalues_3.html create mode 100644 search/enumvalues_3.js create mode 100644 search/enumvalues_4.html create mode 100644 search/enumvalues_4.js create mode 100644 search/enumvalues_5.html create mode 100644 search/enumvalues_5.js create mode 100644 search/enumvalues_6.html create mode 100644 search/enumvalues_6.js create mode 100644 search/enumvalues_7.html create mode 100644 search/enumvalues_7.js create mode 100644 search/enumvalues_8.html create mode 100644 search/enumvalues_8.js create mode 100644 search/enumvalues_9.html create mode 100644 search/enumvalues_9.js create mode 100644 search/enumvalues_a.html create mode 100644 search/enumvalues_a.js create mode 100644 search/enumvalues_b.html create mode 100644 search/enumvalues_b.js create mode 100644 search/enumvalues_c.html create mode 100644 search/enumvalues_c.js create mode 100644 search/enumvalues_d.html create mode 100644 search/enumvalues_d.js create mode 100644 search/enumvalues_e.html create mode 100644 search/enumvalues_e.js create mode 100644 search/enumvalues_f.html create mode 100644 search/enumvalues_f.js create mode 100644 search/files_0.html create mode 100644 search/files_0.js create mode 100644 search/files_1.html create mode 100644 search/files_1.js create mode 100644 search/files_10.html create mode 100644 search/files_10.js create mode 100644 search/files_11.html create mode 100644 search/files_11.js create mode 100644 search/files_12.html create mode 100644 search/files_12.js create mode 100644 search/files_13.html create mode 100644 search/files_13.js create mode 100644 search/files_14.html create mode 100644 search/files_14.js create mode 100644 search/files_15.html create mode 100644 search/files_15.js create mode 100644 search/files_2.html create mode 100644 search/files_2.js create mode 100644 search/files_3.html create mode 100644 search/files_3.js create mode 100644 search/files_4.html create mode 100644 search/files_4.js create mode 100644 search/files_5.html create mode 100644 search/files_5.js create mode 100644 search/files_6.html create mode 100644 search/files_6.js create mode 100644 search/files_7.html create mode 100644 search/files_7.js create mode 100644 search/files_8.html create mode 100644 search/files_8.js create mode 100644 search/files_9.html create mode 100644 search/files_9.js create mode 100644 search/files_a.html create mode 100644 search/files_a.js create mode 100644 search/files_b.html create mode 100644 search/files_b.js create mode 100644 search/files_c.html create mode 100644 search/files_c.js create mode 100644 search/files_d.html create mode 100644 search/files_d.js create mode 100644 search/files_e.html create mode 100644 search/files_e.js create mode 100644 search/files_f.html create mode 100644 search/files_f.js create mode 100644 search/functions_0.html create mode 100644 search/functions_0.js create mode 100644 search/functions_1.html create mode 100644 search/functions_1.js create mode 100644 search/functions_10.html create mode 100644 search/functions_10.js create mode 100644 search/functions_11.html create mode 100644 search/functions_11.js create mode 100644 search/functions_12.html create mode 100644 search/functions_12.js create mode 100644 search/functions_13.html create mode 100644 search/functions_13.js create mode 100644 search/functions_14.html create mode 100644 search/functions_14.js create mode 100644 search/functions_15.html create mode 100644 search/functions_15.js create mode 100644 search/functions_16.html create mode 100644 search/functions_16.js create mode 100644 search/functions_17.html create mode 100644 search/functions_17.js create mode 100644 search/functions_2.html create mode 100644 search/functions_2.js create mode 100644 search/functions_3.html create mode 100644 search/functions_3.js create mode 100644 search/functions_4.html create mode 100644 search/functions_4.js create mode 100644 search/functions_5.html create mode 100644 search/functions_5.js create mode 100644 search/functions_6.html create mode 100644 search/functions_6.js create mode 100644 search/functions_7.html create mode 100644 search/functions_7.js create mode 100644 search/functions_8.html create mode 100644 search/functions_8.js create mode 100644 search/functions_9.html create mode 100644 search/functions_9.js create mode 100644 search/functions_a.html create mode 100644 search/functions_a.js create mode 100644 search/functions_b.html create mode 100644 search/functions_b.js create mode 100644 search/functions_c.html create mode 100644 search/functions_c.js create mode 100644 search/functions_d.html create mode 100644 search/functions_d.js create mode 100644 search/functions_e.html create mode 100644 search/functions_e.js create mode 100644 search/functions_f.html create mode 100644 search/functions_f.js create mode 100644 search/mag_sel.png create mode 100644 search/namespaces_0.html create mode 100644 search/namespaces_0.js create mode 100644 search/namespaces_1.html create mode 100644 search/namespaces_1.js create mode 100644 search/nomatches.html create mode 100644 search/pages_0.html create mode 100644 search/pages_0.js create mode 100644 search/pages_1.html create mode 100644 search/pages_1.js create mode 100644 search/pages_2.html create mode 100644 search/pages_2.js create mode 100644 search/properties_0.html create mode 100644 search/properties_0.js create mode 100644 search/properties_1.html create mode 100644 search/properties_1.js create mode 100644 search/properties_10.html create mode 100644 search/properties_10.js create mode 100644 search/properties_11.html create mode 100644 search/properties_11.js create mode 100644 search/properties_12.html create mode 100644 search/properties_12.js create mode 100644 search/properties_13.html create mode 100644 search/properties_13.js create mode 100644 search/properties_14.html create mode 100644 search/properties_14.js create mode 100644 search/properties_2.html create mode 100644 search/properties_2.js create mode 100644 search/properties_3.html create mode 100644 search/properties_3.js create mode 100644 search/properties_4.html create mode 100644 search/properties_4.js create mode 100644 search/properties_5.html create mode 100644 search/properties_5.js create mode 100644 search/properties_6.html create mode 100644 search/properties_6.js create mode 100644 search/properties_7.html create mode 100644 search/properties_7.js create mode 100644 search/properties_8.html create mode 100644 search/properties_8.js create mode 100644 search/properties_9.html create mode 100644 search/properties_9.js create mode 100644 search/properties_a.html create mode 100644 search/properties_a.js create mode 100644 search/properties_b.html create mode 100644 search/properties_b.js create mode 100644 search/properties_c.html create mode 100644 search/properties_c.js create mode 100644 search/properties_d.html create mode 100644 search/properties_d.js create mode 100644 search/properties_e.html create mode 100644 search/properties_e.js create mode 100644 search/properties_f.html create mode 100644 search/properties_f.js create mode 100644 search/search.css create mode 100644 search/search.js create mode 100644 search/search_l.png create mode 100644 search/search_m.png create mode 100644 search/search_r.png create mode 100644 search/searchdata.js create mode 100644 search/variables_0.html create mode 100644 search/variables_0.js create mode 100644 search/variables_1.html create mode 100644 search/variables_1.js create mode 100644 search/variables_10.html create mode 100644 search/variables_10.js create mode 100644 search/variables_11.html create mode 100644 search/variables_11.js create mode 100644 search/variables_12.html create mode 100644 search/variables_12.js create mode 100644 search/variables_13.html create mode 100644 search/variables_13.js create mode 100644 search/variables_14.html create mode 100644 search/variables_14.js create mode 100644 search/variables_15.html create mode 100644 search/variables_15.js create mode 100644 search/variables_16.html create mode 100644 search/variables_16.js create mode 100644 search/variables_2.html create mode 100644 search/variables_2.js create mode 100644 search/variables_3.html create mode 100644 search/variables_3.js create mode 100644 search/variables_4.html create mode 100644 search/variables_4.js create mode 100644 search/variables_5.html create mode 100644 search/variables_5.js create mode 100644 search/variables_6.html create mode 100644 search/variables_6.js create mode 100644 search/variables_7.html create mode 100644 search/variables_7.js create mode 100644 search/variables_8.html create mode 100644 search/variables_8.js create mode 100644 search/variables_9.html create mode 100644 search/variables_9.js create mode 100644 search/variables_a.html create mode 100644 search/variables_a.js create mode 100644 search/variables_b.html create mode 100644 search/variables_b.js create mode 100644 search/variables_c.html create mode 100644 search/variables_c.js create mode 100644 search/variables_d.html create mode 100644 search/variables_d.js create mode 100644 search/variables_e.html create mode 100644 search/variables_e.js create mode 100644 search/variables_f.html create mode 100644 search/variables_f.js create mode 100644 splitbar.png create mode 100644 src_2_tgstation_8_server_8_host_2_program_8cs.html create mode 100644 src_2_tgstation_8_server_8_host_2_program_8cs_source.html create mode 100644 src_2_tgstation_8_server_8_host_8_console_2_program_8cs.html create mode 100644 src_2_tgstation_8_server_8_host_8_console_2_program_8cs_source.html create mode 100644 src_2_tgstation_8_server_8_host_8_service_2_program_8cs.html create mode 100644 src_2_tgstation_8_server_8_host_8_service_2_program_8cs_source.html create mode 100644 sync_off.png create mode 100644 sync_on.png create mode 100644 tab_a.png create mode 100644 tab_b.png create mode 100644 tab_h.png create mode 100644 tab_s.png create mode 100644 tabs.css create mode 100644 tgs.ico create mode 100644 tools_2_release_notes_2_program_8cs.html create mode 100644 tools_2_release_notes_2_program_8cs_source.html create mode 100644 tools_2_release_notes_2_r_e_a_d_m_e_8md.html diff --git a/20180906135553___m_s_initial_create_8_designer_8cs.html b/20180906135553___m_s_initial_create_8_designer_8cs.html new file mode 100644 index 0000000000..f021ee896c --- /dev/null +++ b/20180906135553___m_s_initial_create_8_designer_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180906135553_MSInitialCreate.Designer.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20180906135553_MSInitialCreate.Designer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MSInitialCreate
 The initial database migration for MSSQL More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + diff --git a/20180906135553___m_s_initial_create_8_designer_8cs_source.html b/20180906135553___m_s_initial_create_8_designer_8cs_source.html new file mode 100644 index 0000000000..2cfdb5e28f --- /dev/null +++ b/20180906135553___m_s_initial_create_8_designer_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180906135553_MSInitialCreate.Designer.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20180906135553_MSInitialCreate.Designer.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated />
2 using System;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.EntityFrameworkCore.Infrastructure;
5 using Microsoft.EntityFrameworkCore.Metadata;
6 using Microsoft.EntityFrameworkCore.Migrations;
7 using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
8 
10 {
11  [DbContext(typeof(SqlServerDatabaseContext))]
12  [Migration("20180906135553_MSInitialCreate")]
13  partial class MSInitialCreate
14  {
19  protected override void BuildTargetModel(ModelBuilder modelBuilder)
20  {
21 #pragma warning disable 612, 618
22  modelBuilder
23  .HasAnnotation("ProductVersion", "2.1.2-rtm-30932")
24  .HasAnnotation("Relational:MaxIdentifierLength", 128)
25  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
26 
27  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
28  {
29  b.Property<long>("Id")
30  .ValueGeneratedOnAdd()
31  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
32 
33  b.Property<string>("ConnectionString")
34  .IsRequired();
35 
36  b.Property<bool?>("Enabled");
37 
38  b.Property<long>("InstanceId");
39 
40  b.Property<string>("Name")
41  .IsRequired();
42 
43  b.Property<int?>("Provider");
44 
45  b.HasKey("Id");
46 
47  b.HasIndex("InstanceId");
48 
49  b.HasIndex("Name")
50  .IsUnique();
51 
52  b.ToTable("ChatBots");
53  });
54 
55  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
56  {
57  b.Property<long>("Id")
58  .ValueGeneratedOnAdd()
59  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
60 
61  b.Property<long>("ChatSettingsId");
62 
63  b.Property<decimal?>("DiscordChannelId")
64  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
65 
66  b.Property<string>("IrcChannel");
67 
68  b.Property<bool?>("IsAdminChannel")
69  .IsRequired();
70 
71  b.Property<bool?>("IsUpdatesChannel")
72  .IsRequired();
73 
74  b.Property<bool?>("IsWatchdogChannel")
75  .IsRequired();
76 
77  b.Property<string>("Tag");
78 
79  b.HasKey("Id");
80 
81  b.HasIndex("ChatSettingsId", "DiscordChannelId")
82  .IsUnique()
83  .HasFilter("[DiscordChannelId] IS NOT NULL");
84 
85  b.HasIndex("ChatSettingsId", "IrcChannel")
86  .IsUnique()
87  .HasFilter("[IrcChannel] IS NOT NULL");
88 
89  b.ToTable("ChatChannels");
90  });
91 
92  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
93  {
94  b.Property<long>("Id")
95  .ValueGeneratedOnAdd()
96  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
97 
98  b.Property<string>("ByondVersion")
99  .IsRequired();
100 
101  b.Property<Guid?>("DirectoryName");
102 
103  b.Property<string>("DmeName");
104 
105  b.Property<long?>("JobId");
106 
107  b.Property<string>("Output");
108 
109  b.Property<long>("RevisionInformationId");
110 
111  b.HasKey("Id");
112 
113  b.HasIndex("DirectoryName");
114 
115  b.HasIndex("JobId");
116 
117  b.HasIndex("RevisionInformationId");
118 
119  b.ToTable("CompileJobs");
120  });
121 
122  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
123  {
124  b.Property<long>("Id")
125  .ValueGeneratedOnAdd()
126  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
127 
128  b.Property<string>("AccessToken");
129 
130  b.Property<bool?>("AllowWebClient")
131  .IsRequired();
132 
133  b.Property<bool?>("AutoStart")
134  .IsRequired();
135 
136  b.Property<long>("InstanceId");
137 
138  b.Property<int>("PrimaryPort");
139 
140  b.Property<int?>("ProcessId");
141 
142  b.Property<int>("SecondaryPort");
143 
144  b.Property<int>("SecurityLevel");
145 
146  b.Property<bool?>("SoftRestart")
147  .IsRequired();
148 
149  b.Property<bool?>("SoftShutdown")
150  .IsRequired();
151 
152  b.Property<long>("StartupTimeout");
153 
154  b.HasKey("Id");
155 
156  b.HasIndex("InstanceId")
157  .IsUnique();
158 
159  b.ToTable("DreamDaemonSettings");
160  });
161 
162  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
163  {
164  b.Property<long>("Id")
165  .ValueGeneratedOnAdd()
166  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
167 
168  b.Property<int>("ApiValidationPort");
169 
170  b.Property<long>("InstanceId");
171 
172  b.Property<string>("ProjectName");
173 
174  b.HasKey("Id");
175 
176  b.HasIndex("InstanceId")
177  .IsUnique();
178 
179  b.ToTable("DreamMakerSettings");
180  });
181 
182  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
183  {
184  b.Property<long>("Id")
185  .ValueGeneratedOnAdd()
186  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
187 
188  b.Property<long>("AutoUpdateInterval");
189 
190  b.Property<int>("ConfigurationType");
191 
192  b.Property<string>("Name")
193  .IsRequired();
194 
195  b.Property<bool?>("Online")
196  .IsRequired();
197 
198  b.Property<string>("Path")
199  .IsRequired();
200 
201  b.Property<long?>("WatchdogReattachInformationId");
202 
203  b.HasKey("Id");
204 
205  b.HasIndex("Path")
206  .IsUnique();
207 
208  b.HasIndex("WatchdogReattachInformationId");
209 
210  b.ToTable("Instances");
211  });
212 
213  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
214  {
215  b.Property<long>("Id")
216  .ValueGeneratedOnAdd()
217  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
218 
219  b.Property<decimal>("ByondRights")
220  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
221 
222  b.Property<decimal>("ChatBotRights")
223  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
224 
225  b.Property<decimal>("ConfigurationRights")
226  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
227 
228  b.Property<decimal>("DreamDaemonRights")
229  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
230 
231  b.Property<decimal>("DreamMakerRights")
232  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
233 
234  b.Property<long>("InstanceId");
235 
236  b.Property<decimal>("InstanceUserRights")
237  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
238 
239  b.Property<decimal>("RepositoryRights")
240  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
241 
242  b.Property<long?>("UserId")
243  .IsRequired();
244 
245  b.HasKey("Id");
246 
247  b.HasIndex("InstanceId");
248 
249  b.HasIndex("UserId", "InstanceId")
250  .IsUnique();
251 
252  b.ToTable("InstanceUsers");
253  });
254 
255  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
256  {
257  b.Property<long>("Id")
258  .ValueGeneratedOnAdd()
259  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
260 
261  b.Property<decimal?>("CancelRight")
262  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
263 
264  b.Property<decimal?>("CancelRightsType")
265  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
266 
267  b.Property<bool?>("Cancelled")
268  .IsRequired();
269 
270  b.Property<long?>("CancelledById");
271 
272  b.Property<string>("Description")
273  .IsRequired();
274 
275  b.Property<string>("ExceptionDetails");
276 
277  b.Property<long>("InstanceId");
278 
279  b.Property<DateTimeOffset?>("StartedAt")
280  .IsRequired();
281 
282  b.Property<long>("StartedById");
283 
284  b.Property<DateTimeOffset?>("StoppedAt");
285 
286  b.HasKey("Id");
287 
288  b.HasIndex("CancelledById");
289 
290  b.HasIndex("InstanceId");
291 
292  b.HasIndex("StartedById");
293 
294  b.ToTable("Jobs");
295  });
296 
297  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
298  {
299  b.Property<long>("Id")
300  .ValueGeneratedOnAdd()
301  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
302 
303  b.Property<string>("AccessIdentifier")
304  .IsRequired();
305 
306  b.Property<string>("ChatChannelsJson")
307  .IsRequired();
308 
309  b.Property<string>("ChatCommandsJson")
310  .IsRequired();
311 
312  b.Property<long?>("CompileJobId");
313 
314  b.Property<bool>("IsPrimary");
315 
316  b.Property<int>("Port");
317 
318  b.Property<int>("ProcessId");
319 
320  b.Property<int>("RebootState");
321 
322  b.Property<string>("ServerCommandsJson")
323  .IsRequired();
324 
325  b.HasKey("Id");
326 
327  b.HasIndex("CompileJobId");
328 
329  b.ToTable("ReattachInformations");
330  });
331 
332  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
333  {
334  b.Property<long>("Id")
335  .ValueGeneratedOnAdd()
336  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
337 
338  b.Property<string>("AccessToken");
339 
340  b.Property<string>("AccessUser");
341 
342  b.Property<bool?>("AutoUpdatesKeepTestMerges")
343  .IsRequired();
344 
345  b.Property<bool?>("AutoUpdatesSynchronize")
346  .IsRequired();
347 
348  b.Property<string>("CommitterEmail")
349  .IsRequired();
350 
351  b.Property<string>("CommitterName")
352  .IsRequired();
353 
354  b.Property<long>("InstanceId");
355 
356  b.Property<bool?>("PushTestMergeCommits")
357  .IsRequired();
358 
359  b.Property<bool?>("ShowTestMergeCommitters")
360  .IsRequired();
361 
362  b.HasKey("Id");
363 
364  b.HasIndex("InstanceId")
365  .IsUnique();
366 
367  b.ToTable("RepositorySettings");
368  });
369 
370  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
371  {
372  b.Property<long>("Id")
373  .ValueGeneratedOnAdd()
374  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
375 
376  b.Property<long>("RevisionInformationId");
377 
378  b.Property<long>("TestMergeId");
379 
380  b.HasKey("Id");
381 
382  b.HasIndex("RevisionInformationId");
383 
384  b.HasIndex("TestMergeId");
385 
386  b.ToTable("RevInfoTestMerges");
387  });
388 
389  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
390  {
391  b.Property<long>("Id")
392  .ValueGeneratedOnAdd()
393  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
394 
395  b.Property<string>("CommitSha")
396  .IsRequired()
397  .HasMaxLength(40);
398 
399  b.Property<long>("InstanceId");
400 
401  b.Property<string>("OriginCommitSha")
402  .IsRequired()
403  .HasMaxLength(40);
404 
405  b.HasKey("Id");
406 
407  b.HasIndex("CommitSha")
408  .IsUnique();
409 
410  b.HasIndex("InstanceId");
411 
412  b.ToTable("RevisionInformations");
413  });
414 
415  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
416  {
417  b.Property<long>("Id")
418  .ValueGeneratedOnAdd()
419  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
420 
421  b.Property<string>("Author")
422  .IsRequired();
423 
424  b.Property<string>("BodyAtMerge")
425  .IsRequired();
426 
427  b.Property<string>("Comment");
428 
429  b.Property<DateTimeOffset>("MergedAt");
430 
431  b.Property<long>("MergedById");
432 
433  b.Property<int?>("Number")
434  .IsRequired();
435 
436  b.Property<long?>("PrimaryRevisionInformationId");
437 
438  b.Property<string>("PullRequestRevision")
439  .IsRequired();
440 
441  b.Property<string>("TitleAtMerge")
442  .IsRequired();
443 
444  b.Property<string>("Url")
445  .IsRequired();
446 
447  b.HasKey("Id");
448 
449  b.HasIndex("MergedById");
450 
451  b.HasIndex("PrimaryRevisionInformationId")
452  .IsUnique()
453  .HasFilter("[PrimaryRevisionInformationId] IS NOT NULL");
454 
455  b.ToTable("TestMerges");
456  });
457 
458  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
459  {
460  b.Property<long>("Id")
461  .ValueGeneratedOnAdd()
462  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
463 
464  b.Property<decimal>("AdministrationRights")
465  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
466 
467  b.Property<string>("CanonicalName")
468  .IsRequired();
469 
470  b.Property<DateTimeOffset?>("CreatedAt")
471  .IsRequired();
472 
473  b.Property<long?>("CreatedById");
474 
475  b.Property<bool?>("Enabled")
476  .IsRequired();
477 
478  b.Property<decimal>("InstanceManagerRights")
479  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
480 
481  b.Property<DateTimeOffset?>("LastPasswordUpdate");
482 
483  b.Property<string>("Name")
484  .IsRequired();
485 
486  b.Property<string>("PasswordHash");
487 
488  b.Property<string>("SystemIdentifier");
489 
490  b.HasKey("Id");
491 
492  b.HasIndex("CanonicalName")
493  .IsUnique();
494 
495  b.HasIndex("CreatedById");
496 
497  b.ToTable("Users");
498  });
499 
500  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
501  {
502  b.Property<long>("Id")
503  .ValueGeneratedOnAdd()
504  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
505 
506  b.Property<long?>("AlphaId");
507 
508  b.Property<bool>("AlphaIsActive");
509 
510  b.Property<long?>("BravoId");
511 
512  b.HasKey("Id");
513 
514  b.HasIndex("AlphaId");
515 
516  b.HasIndex("BravoId");
517 
518  b.ToTable("WatchdogReattachInformations");
519  });
520 
521  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
522  {
523  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
524  .WithMany("ChatSettings")
525  .HasForeignKey("InstanceId")
526  .OnDelete(DeleteBehavior.Cascade);
527  });
528 
529  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
530  {
531  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
532  .WithMany("Channels")
533  .HasForeignKey("ChatSettingsId")
534  .OnDelete(DeleteBehavior.Cascade);
535  });
536 
537  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
538  {
539  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
540  .WithMany()
541  .HasForeignKey("JobId");
542 
543  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
544  .WithMany("CompileJobs")
545  .HasForeignKey("RevisionInformationId")
546  .OnDelete(DeleteBehavior.Cascade);
547  });
548 
549  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
550  {
551  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
552  .WithOne("DreamDaemonSettings")
553  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
554  .OnDelete(DeleteBehavior.Cascade);
555  });
556 
557  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
558  {
559  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
560  .WithOne("DreamMakerSettings")
561  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
562  .OnDelete(DeleteBehavior.Cascade);
563  });
564 
565  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
566  {
567  b.HasOne("Tgstation.Server.Host.Models.WatchdogReattachInformation", "WatchdogReattachInformation")
568  .WithMany()
569  .HasForeignKey("WatchdogReattachInformationId");
570  });
571 
572  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
573  {
574  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
575  .WithMany("InstanceUsers")
576  .HasForeignKey("InstanceId")
577  .OnDelete(DeleteBehavior.Cascade);
578 
579  b.HasOne("Tgstation.Server.Host.Models.User")
580  .WithMany("InstanceUsers")
581  .HasForeignKey("UserId")
582  .OnDelete(DeleteBehavior.Cascade);
583  });
584 
585  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
586  {
587  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
588  .WithMany()
589  .HasForeignKey("CancelledById");
590 
591  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
592  .WithMany("Jobs")
593  .HasForeignKey("InstanceId")
594  .OnDelete(DeleteBehavior.Cascade);
595 
596  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
597  .WithMany()
598  .HasForeignKey("StartedById")
599  .OnDelete(DeleteBehavior.Cascade);
600  });
601 
602  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
603  {
604  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
605  .WithMany()
606  .HasForeignKey("CompileJobId");
607  });
608 
609  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
610  {
611  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
612  .WithOne("RepositorySettings")
613  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
614  .OnDelete(DeleteBehavior.Cascade);
615  });
616 
617  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
618  {
619  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
620  .WithMany("ActiveTestMerges")
621  .HasForeignKey("RevisionInformationId")
622  .OnDelete(DeleteBehavior.Cascade);
623 
624  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
625  .WithMany("RevisonInformations")
626  .HasForeignKey("TestMergeId")
627  .OnDelete(DeleteBehavior.Cascade);
628  });
629 
630  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
631  {
632  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
633  .WithMany("RevisionInformations")
634  .HasForeignKey("InstanceId")
635  .OnDelete(DeleteBehavior.Cascade);
636  });
637 
638  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
639  {
640  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
641  .WithMany("TestMerges")
642  .HasForeignKey("MergedById")
643  .OnDelete(DeleteBehavior.Restrict);
644 
645  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
646  .WithOne("PrimaryTestMerge")
647  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
648  .OnDelete(DeleteBehavior.SetNull);
649  });
650 
651  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
652  {
653  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
654  .WithMany("CreatedUsers")
655  .HasForeignKey("CreatedById");
656  });
657 
658  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
659  {
660  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
661  .WithMany()
662  .HasForeignKey("AlphaId");
663 
664  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
665  .WithMany()
666  .HasForeignKey("BravoId");
667  });
668 #pragma warning restore 612, 618
669  }
670  }
671 }
+ + +
override void BuildTargetModel(ModelBuilder modelBuilder)
Builds the target model
+
+ + + + diff --git a/20180906135553___m_s_initial_create_8cs.html b/20180906135553___m_s_initial_create_8cs.html new file mode 100644 index 0000000000..b7e94c1342 --- /dev/null +++ b/20180906135553___m_s_initial_create_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180906135553_MSInitialCreate.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20180906135553_MSInitialCreate.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MSInitialCreate
 The initial database migration for MSSQL More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + diff --git a/20180906135553___m_s_initial_create_8cs_source.html b/20180906135553___m_s_initial_create_8cs_source.html new file mode 100644 index 0000000000..29a41f29d9 --- /dev/null +++ b/20180906135553___m_s_initial_create_8cs_source.html @@ -0,0 +1,98 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180906135553_MSInitialCreate.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20180906135553_MSInitialCreate.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using Microsoft.EntityFrameworkCore.Metadata;
3 using Microsoft.EntityFrameworkCore.Migrations;
4 
6 {
10  #pragma warning disable CA1506
11  public partial class MSInitialCreate : Migration
12  {
17  protected override void Up(MigrationBuilder migrationBuilder)
18  {
19  if (migrationBuilder == null)
20  throw new ArgumentNullException(nameof(migrationBuilder));
21 
22  migrationBuilder.CreateTable(
23  name: "Users",
24  columns: table => new
25  {
26  Id = table.Column<long>(nullable: false)
27  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
28  Enabled = table.Column<bool>(nullable: false),
29  CreatedAt = table.Column<DateTimeOffset>(nullable: false),
30  SystemIdentifier = table.Column<string>(nullable: true),
31  Name = table.Column<string>(nullable: false),
32  AdministrationRights = table.Column<decimal>(nullable: false),
33  InstanceManagerRights = table.Column<decimal>(nullable: false),
34  PasswordHash = table.Column<string>(nullable: true),
35  CreatedById = table.Column<long>(nullable: true),
36  CanonicalName = table.Column<string>(nullable: false),
37  LastPasswordUpdate = table.Column<DateTimeOffset>(nullable: true)
38  },
39  constraints: table =>
40  {
41  table.PrimaryKey("PK_Users", x => x.Id);
42  table.ForeignKey(
43  name: "FK_Users_Users_CreatedById",
44  column: x => x.CreatedById,
45  principalTable: "Users",
46  principalColumn: "Id",
47  onDelete: ReferentialAction.Restrict);
48  });
49 
50  migrationBuilder.CreateTable(
51  name: "ChatChannels",
52  columns: table => new
53  {
54  IrcChannel = table.Column<string>(nullable: true),
55  DiscordChannelId = table.Column<decimal>(nullable: true),
56  IsAdminChannel = table.Column<bool>(nullable: false),
57  IsWatchdogChannel = table.Column<bool>(nullable: false),
58  IsUpdatesChannel = table.Column<bool>(nullable: false),
59  Tag = table.Column<string>(nullable: true),
60  Id = table.Column<long>(nullable: false)
61  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
62  ChatSettingsId = table.Column<long>(nullable: false)
63  },
64  constraints: table =>
65  {
66  table.PrimaryKey("PK_ChatChannels", x => x.Id);
67  });
68 
69  migrationBuilder.CreateTable(
70  name: "ReattachInformations",
71  columns: table => new
72  {
73  ChatCommandsJson = table.Column<string>(nullable: false),
74  ChatChannelsJson = table.Column<string>(nullable: false),
75  ServerCommandsJson = table.Column<string>(nullable: false),
76  AccessIdentifier = table.Column<string>(nullable: false),
77  ProcessId = table.Column<int>(nullable: false),
78  IsPrimary = table.Column<bool>(nullable: false),
79  Port = table.Column<int>(nullable: false),
80  RebootState = table.Column<int>(nullable: false),
81  Id = table.Column<long>(nullable: false)
82  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
83  CompileJobId = table.Column<long>(nullable: true)
84  },
85  constraints: table =>
86  {
87  table.PrimaryKey("PK_ReattachInformations", x => x.Id);
88  });
89 
90  migrationBuilder.CreateTable(
91  name: "WatchdogReattachInformations",
92  columns: table => new
93  {
94  AlphaIsActive = table.Column<bool>(nullable: false),
95  Id = table.Column<long>(nullable: false)
96  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
97  AlphaId = table.Column<long>(nullable: true),
98  BravoId = table.Column<long>(nullable: true)
99  },
100  constraints: table =>
101  {
102  table.PrimaryKey("PK_WatchdogReattachInformations", x => x.Id);
103  table.ForeignKey(
104  name: "FK_WatchdogReattachInformations_ReattachInformations_AlphaId",
105  column: x => x.AlphaId,
106  principalTable: "ReattachInformations",
107  principalColumn: "Id",
108  onDelete: ReferentialAction.Restrict);
109  table.ForeignKey(
110  name: "FK_WatchdogReattachInformations_ReattachInformations_BravoId",
111  column: x => x.BravoId,
112  principalTable: "ReattachInformations",
113  principalColumn: "Id",
114  onDelete: ReferentialAction.Restrict);
115  });
116 
117  migrationBuilder.CreateTable(
118  name: "Instances",
119  columns: table => new
120  {
121  Id = table.Column<long>(nullable: false)
122  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
123  Name = table.Column<string>(nullable: false),
124  Path = table.Column<string>(nullable: false),
125  Online = table.Column<bool>(nullable: false),
126  ConfigurationType = table.Column<int>(nullable: false),
127  AutoUpdateInterval = table.Column<long>(nullable: false),
128  WatchdogReattachInformationId = table.Column<long>(nullable: true)
129  },
130  constraints: table =>
131  {
132  table.PrimaryKey("PK_Instances", x => x.Id);
133  table.ForeignKey(
134  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInformationId",
135  column: x => x.WatchdogReattachInformationId,
136  principalTable: "WatchdogReattachInformations",
137  principalColumn: "Id",
138  onDelete: ReferentialAction.Restrict);
139  });
140 
141  migrationBuilder.CreateTable(
142  name: "ChatBots",
143  columns: table => new
144  {
145  Id = table.Column<long>(nullable: false)
146  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
147  Name = table.Column<string>(nullable: false),
148  Enabled = table.Column<bool>(nullable: true),
149  Provider = table.Column<int>(nullable: true),
150  ConnectionString = table.Column<string>(nullable: false),
151  InstanceId = table.Column<long>(nullable: false)
152  },
153  constraints: table =>
154  {
155  table.PrimaryKey("PK_ChatBots", x => x.Id);
156  table.ForeignKey(
157  name: "FK_ChatBots_Instances_InstanceId",
158  column: x => x.InstanceId,
159  principalTable: "Instances",
160  principalColumn: "Id",
161  onDelete: ReferentialAction.Cascade);
162  });
163 
164  migrationBuilder.CreateTable(
165  name: "DreamDaemonSettings",
166  columns: table => new
167  {
168  AllowWebClient = table.Column<bool>(nullable: false),
169  SecurityLevel = table.Column<int>(nullable: false),
170  PrimaryPort = table.Column<int>(nullable: false),
171  SecondaryPort = table.Column<int>(nullable: false),
172  StartupTimeout = table.Column<long>(nullable: false),
173  AutoStart = table.Column<bool>(nullable: false),
174  SoftRestart = table.Column<bool>(nullable: false),
175  SoftShutdown = table.Column<bool>(nullable: false),
176  Id = table.Column<long>(nullable: false)
177  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
178  ProcessId = table.Column<int>(nullable: true),
179  AccessToken = table.Column<string>(nullable: true),
180  InstanceId = table.Column<long>(nullable: false)
181  },
182  constraints: table =>
183  {
184  table.PrimaryKey("PK_DreamDaemonSettings", x => x.Id);
185  table.ForeignKey(
186  name: "FK_DreamDaemonSettings_Instances_InstanceId",
187  column: x => x.InstanceId,
188  principalTable: "Instances",
189  principalColumn: "Id",
190  onDelete: ReferentialAction.Cascade);
191  });
192 
193  migrationBuilder.CreateTable(
194  name: "DreamMakerSettings",
195  columns: table => new
196  {
197  ProjectName = table.Column<string>(nullable: true),
198  ApiValidationPort = table.Column<int>(nullable: false),
199  Id = table.Column<long>(nullable: false)
200  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
201  InstanceId = table.Column<long>(nullable: false)
202  },
203  constraints: table =>
204  {
205  table.PrimaryKey("PK_DreamMakerSettings", x => x.Id);
206  table.ForeignKey(
207  name: "FK_DreamMakerSettings_Instances_InstanceId",
208  column: x => x.InstanceId,
209  principalTable: "Instances",
210  principalColumn: "Id",
211  onDelete: ReferentialAction.Cascade);
212  });
213 
214  migrationBuilder.CreateTable(
215  name: "InstanceUsers",
216  columns: table => new
217  {
218  UserId = table.Column<long>(nullable: false),
219  InstanceUserRights = table.Column<decimal>(nullable: false),
220  ByondRights = table.Column<decimal>(nullable: false),
221  DreamDaemonRights = table.Column<decimal>(nullable: false),
222  DreamMakerRights = table.Column<decimal>(nullable: false),
223  RepositoryRights = table.Column<decimal>(nullable: false),
224  ChatBotRights = table.Column<decimal>(nullable: false),
225  ConfigurationRights = table.Column<decimal>(nullable: false),
226  Id = table.Column<long>(nullable: false)
227  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
228  InstanceId = table.Column<long>(nullable: false)
229  },
230  constraints: table =>
231  {
232  table.PrimaryKey("PK_InstanceUsers", x => x.Id);
233  table.ForeignKey(
234  name: "FK_InstanceUsers_Instances_InstanceId",
235  column: x => x.InstanceId,
236  principalTable: "Instances",
237  principalColumn: "Id",
238  onDelete: ReferentialAction.Cascade);
239  table.ForeignKey(
240  name: "FK_InstanceUsers_Users_UserId",
241  column: x => x.UserId,
242  principalTable: "Users",
243  principalColumn: "Id",
244  onDelete: ReferentialAction.Cascade);
245  });
246 
247  migrationBuilder.CreateTable(
248  name: "Jobs",
249  columns: table => new
250  {
251  Id = table.Column<long>(nullable: false)
252  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
253  Description = table.Column<string>(nullable: false),
254  ExceptionDetails = table.Column<string>(nullable: true),
255  StartedAt = table.Column<DateTimeOffset>(nullable: false),
256  StoppedAt = table.Column<DateTimeOffset>(nullable: true),
257  Cancelled = table.Column<bool>(nullable: false),
258  CancelRightsType = table.Column<decimal>(nullable: true),
259  CancelRight = table.Column<decimal>(nullable: true),
260  StartedById = table.Column<long>(nullable: false),
261  CancelledById = table.Column<long>(nullable: true),
262  InstanceId = table.Column<long>(nullable: false)
263  },
264  constraints: table =>
265  {
266  table.PrimaryKey("PK_Jobs", x => x.Id);
267  table.ForeignKey(
268  name: "FK_Jobs_Users_CancelledById",
269  column: x => x.CancelledById,
270  principalTable: "Users",
271  principalColumn: "Id",
272  onDelete: ReferentialAction.Restrict);
273  table.ForeignKey(
274  name: "FK_Jobs_Instances_InstanceId",
275  column: x => x.InstanceId,
276  principalTable: "Instances",
277  principalColumn: "Id",
278  onDelete: ReferentialAction.Cascade);
279  table.ForeignKey(
280  name: "FK_Jobs_Users_StartedById",
281  column: x => x.StartedById,
282  principalTable: "Users",
283  principalColumn: "Id",
284  onDelete: ReferentialAction.Cascade);
285  });
286 
287  migrationBuilder.CreateTable(
288  name: "RepositorySettings",
289  columns: table => new
290  {
291  CommitterName = table.Column<string>(nullable: false),
292  CommitterEmail = table.Column<string>(nullable: false),
293  AccessUser = table.Column<string>(nullable: true),
294  AccessToken = table.Column<string>(nullable: true),
295  PushTestMergeCommits = table.Column<bool>(nullable: false),
296  ShowTestMergeCommitters = table.Column<bool>(nullable: false),
297  AutoUpdatesKeepTestMerges = table.Column<bool>(nullable: false),
298  AutoUpdatesSynchronize = table.Column<bool>(nullable: false),
299  Id = table.Column<long>(nullable: false)
300  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
301  InstanceId = table.Column<long>(nullable: false)
302  },
303  constraints: table =>
304  {
305  table.PrimaryKey("PK_RepositorySettings", x => x.Id);
306  table.ForeignKey(
307  name: "FK_RepositorySettings_Instances_InstanceId",
308  column: x => x.InstanceId,
309  principalTable: "Instances",
310  principalColumn: "Id",
311  onDelete: ReferentialAction.Cascade);
312  });
313 
314  migrationBuilder.CreateTable(
315  name: "RevisionInformations",
316  columns: table => new
317  {
318  CommitSha = table.Column<string>(maxLength: 40, nullable: false),
319  OriginCommitSha = table.Column<string>(maxLength: 40, nullable: false),
320  Id = table.Column<long>(nullable: false)
321  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
322  InstanceId = table.Column<long>(nullable: false)
323  },
324  constraints: table =>
325  {
326  table.PrimaryKey("PK_RevisionInformations", x => x.Id);
327  table.ForeignKey(
328  name: "FK_RevisionInformations_Instances_InstanceId",
329  column: x => x.InstanceId,
330  principalTable: "Instances",
331  principalColumn: "Id",
332  onDelete: ReferentialAction.Cascade);
333  });
334 
335  migrationBuilder.CreateTable(
336  name: "CompileJobs",
337  columns: table => new
338  {
339  Id = table.Column<long>(nullable: false)
340  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
341  DmeName = table.Column<string>(nullable: true),
342  Output = table.Column<string>(nullable: true),
343  DirectoryName = table.Column<Guid>(nullable: true),
344  JobId = table.Column<long>(nullable: true),
345  RevisionInformationId = table.Column<long>(nullable: false),
346  ByondVersion = table.Column<string>(nullable: false)
347  },
348  constraints: table =>
349  {
350  table.PrimaryKey("PK_CompileJobs", x => x.Id);
351  table.ForeignKey(
352  name: "FK_CompileJobs_Jobs_JobId",
353  column: x => x.JobId,
354  principalTable: "Jobs",
355  principalColumn: "Id",
356  onDelete: ReferentialAction.Restrict);
357  table.ForeignKey(
358  name: "FK_CompileJobs_RevisionInformations_RevisionInformationId",
359  column: x => x.RevisionInformationId,
360  principalTable: "RevisionInformations",
361  principalColumn: "Id",
362  onDelete: ReferentialAction.Cascade);
363  });
364 
365  migrationBuilder.CreateTable(
366  name: "TestMerges",
367  columns: table => new
368  {
369  Number = table.Column<int>(nullable: false),
370  PullRequestRevision = table.Column<string>(nullable: false),
371  Comment = table.Column<string>(nullable: true),
372  TitleAtMerge = table.Column<string>(nullable: false),
373  BodyAtMerge = table.Column<string>(nullable: false),
374  Url = table.Column<string>(nullable: false),
375  Author = table.Column<string>(nullable: false),
376  Id = table.Column<long>(nullable: false)
377  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
378  MergedAt = table.Column<DateTimeOffset>(nullable: false),
379  MergedById = table.Column<long>(nullable: false),
380  PrimaryRevisionInformationId = table.Column<long>(nullable: true)
381  },
382  constraints: table =>
383  {
384  table.PrimaryKey("PK_TestMerges", x => x.Id);
385  table.ForeignKey(
386  name: "FK_TestMerges_Users_MergedById",
387  column: x => x.MergedById,
388  principalTable: "Users",
389  principalColumn: "Id",
390  onDelete: ReferentialAction.Restrict);
391  table.ForeignKey(
392  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
393  column: x => x.PrimaryRevisionInformationId,
394  principalTable: "RevisionInformations",
395  principalColumn: "Id",
396  onDelete: ReferentialAction.SetNull);
397  });
398 
399  migrationBuilder.CreateTable(
400  name: "RevInfoTestMerges",
401  columns: table => new
402  {
403  Id = table.Column<long>(nullable: false)
404  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
405  TestMergeId = table.Column<long>(nullable: false),
406  RevisionInformationId = table.Column<long>(nullable: false)
407  },
408  constraints: table =>
409  {
410  table.PrimaryKey("PK_RevInfoTestMerges", x => x.Id);
411  table.ForeignKey(
412  name: "FK_RevInfoTestMerges_RevisionInformations_RevisionInformationId",
413  column: x => x.RevisionInformationId,
414  principalTable: "RevisionInformations",
415  principalColumn: "Id",
416  onDelete: ReferentialAction.Cascade);
417  table.ForeignKey(
418  name: "FK_RevInfoTestMerges_TestMerges_TestMergeId",
419  column: x => x.TestMergeId,
420  principalTable: "TestMerges",
421  principalColumn: "Id",
422  onDelete: ReferentialAction.Cascade);
423  });
424 
425  migrationBuilder.CreateIndex(
426  name: "IX_ChatBots_InstanceId",
427  table: "ChatBots",
428  column: "InstanceId");
429 
430  migrationBuilder.CreateIndex(
431  name: "IX_ChatBots_Name",
432  table: "ChatBots",
433  column: "Name",
434  unique: true);
435 
436  migrationBuilder.CreateIndex(
437  name: "IX_ChatChannels_ChatSettingsId_DiscordChannelId",
438  table: "ChatChannels",
439  columns: new[] { "ChatSettingsId", "DiscordChannelId" },
440  unique: true,
441  filter: "[DiscordChannelId] IS NOT NULL");
442 
443  migrationBuilder.CreateIndex(
444  name: "IX_ChatChannels_ChatSettingsId_IrcChannel",
445  table: "ChatChannels",
446  columns: new[] { "ChatSettingsId", "IrcChannel" },
447  unique: true,
448  filter: "[IrcChannel] IS NOT NULL");
449 
450  migrationBuilder.CreateIndex(
451  name: "IX_CompileJobs_DirectoryName",
452  table: "CompileJobs",
453  column: "DirectoryName");
454 
455  migrationBuilder.CreateIndex(
456  name: "IX_CompileJobs_JobId",
457  table: "CompileJobs",
458  column: "JobId");
459 
460  migrationBuilder.CreateIndex(
461  name: "IX_CompileJobs_RevisionInformationId",
462  table: "CompileJobs",
463  column: "RevisionInformationId");
464 
465  migrationBuilder.CreateIndex(
466  name: "IX_DreamDaemonSettings_InstanceId",
467  table: "DreamDaemonSettings",
468  column: "InstanceId",
469  unique: true);
470 
471  migrationBuilder.CreateIndex(
472  name: "IX_DreamMakerSettings_InstanceId",
473  table: "DreamMakerSettings",
474  column: "InstanceId",
475  unique: true);
476 
477  migrationBuilder.CreateIndex(
478  name: "IX_Instances_Path",
479  table: "Instances",
480  column: "Path",
481  unique: true);
482 
483  migrationBuilder.CreateIndex(
484  name: "IX_Instances_WatchdogReattachInformationId",
485  table: "Instances",
486  column: "WatchdogReattachInformationId");
487 
488  migrationBuilder.CreateIndex(
489  name: "IX_InstanceUsers_InstanceId",
490  table: "InstanceUsers",
491  column: "InstanceId");
492 
493  migrationBuilder.CreateIndex(
494  name: "IX_InstanceUsers_UserId_InstanceId",
495  table: "InstanceUsers",
496  columns: new[] { "UserId", "InstanceId" },
497  unique: true);
498 
499  migrationBuilder.CreateIndex(
500  name: "IX_Jobs_CancelledById",
501  table: "Jobs",
502  column: "CancelledById");
503 
504  migrationBuilder.CreateIndex(
505  name: "IX_Jobs_InstanceId",
506  table: "Jobs",
507  column: "InstanceId");
508 
509  migrationBuilder.CreateIndex(
510  name: "IX_Jobs_StartedById",
511  table: "Jobs",
512  column: "StartedById");
513 
514  migrationBuilder.CreateIndex(
515  name: "IX_ReattachInformations_CompileJobId",
516  table: "ReattachInformations",
517  column: "CompileJobId");
518 
519  migrationBuilder.CreateIndex(
520  name: "IX_RepositorySettings_InstanceId",
521  table: "RepositorySettings",
522  column: "InstanceId",
523  unique: true);
524 
525  migrationBuilder.CreateIndex(
526  name: "IX_RevInfoTestMerges_RevisionInformationId",
527  table: "RevInfoTestMerges",
528  column: "RevisionInformationId");
529 
530  migrationBuilder.CreateIndex(
531  name: "IX_RevInfoTestMerges_TestMergeId",
532  table: "RevInfoTestMerges",
533  column: "TestMergeId");
534 
535  migrationBuilder.CreateIndex(
536  name: "IX_RevisionInformations_CommitSha",
537  table: "RevisionInformations",
538  column: "CommitSha",
539  unique: true);
540 
541  migrationBuilder.CreateIndex(
542  name: "IX_RevisionInformations_InstanceId",
543  table: "RevisionInformations",
544  column: "InstanceId");
545 
546  migrationBuilder.CreateIndex(
547  name: "IX_TestMerges_MergedById",
548  table: "TestMerges",
549  column: "MergedById");
550 
551  migrationBuilder.CreateIndex(
552  name: "IX_TestMerges_PrimaryRevisionInformationId",
553  table: "TestMerges",
554  column: "PrimaryRevisionInformationId",
555  unique: true,
556  filter: "[PrimaryRevisionInformationId] IS NOT NULL");
557 
558  migrationBuilder.CreateIndex(
559  name: "IX_Users_CanonicalName",
560  table: "Users",
561  column: "CanonicalName",
562  unique: true);
563 
564  migrationBuilder.CreateIndex(
565  name: "IX_Users_CreatedById",
566  table: "Users",
567  column: "CreatedById");
568 
569  migrationBuilder.CreateIndex(
570  name: "IX_WatchdogReattachInformations_AlphaId",
571  table: "WatchdogReattachInformations",
572  column: "AlphaId");
573 
574  migrationBuilder.CreateIndex(
575  name: "IX_WatchdogReattachInformations_BravoId",
576  table: "WatchdogReattachInformations",
577  column: "BravoId");
578 
579  migrationBuilder.AddForeignKey(
580  name: "FK_ChatChannels_ChatBots_ChatSettingsId",
581  table: "ChatChannels",
582  column: "ChatSettingsId",
583  principalTable: "ChatBots",
584  principalColumn: "Id",
585  onDelete: ReferentialAction.Cascade);
586 
587  migrationBuilder.AddForeignKey(
588  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
589  table: "ReattachInformations",
590  column: "CompileJobId",
591  principalTable: "CompileJobs",
592  principalColumn: "Id",
593  onDelete: ReferentialAction.Restrict);
594  }
595 
600  protected override void Down(MigrationBuilder migrationBuilder)
601  {
602  if (migrationBuilder == null)
603  throw new ArgumentNullException(nameof(migrationBuilder));
604 
605  migrationBuilder.DropForeignKey(
606  name: "FK_Jobs_Instances_InstanceId",
607  table: "Jobs");
608 
609  migrationBuilder.DropForeignKey(
610  name: "FK_RevisionInformations_Instances_InstanceId",
611  table: "RevisionInformations");
612 
613  migrationBuilder.DropTable(
614  name: "ChatChannels");
615 
616  migrationBuilder.DropTable(
617  name: "DreamDaemonSettings");
618 
619  migrationBuilder.DropTable(
620  name: "DreamMakerSettings");
621 
622  migrationBuilder.DropTable(
623  name: "InstanceUsers");
624 
625  migrationBuilder.DropTable(
626  name: "RepositorySettings");
627 
628  migrationBuilder.DropTable(
629  name: "RevInfoTestMerges");
630 
631  migrationBuilder.DropTable(
632  name: "ChatBots");
633 
634  migrationBuilder.DropTable(
635  name: "TestMerges");
636 
637  migrationBuilder.DropTable(
638  name: "Instances");
639 
640  migrationBuilder.DropTable(
641  name: "WatchdogReattachInformations");
642 
643  migrationBuilder.DropTable(
644  name: "ReattachInformations");
645 
646  migrationBuilder.DropTable(
647  name: "CompileJobs");
648 
649  migrationBuilder.DropTable(
650  name: "Jobs");
651 
652  migrationBuilder.DropTable(
653  name: "RevisionInformations");
654 
655  migrationBuilder.DropTable(
656  name: "Users");
657  }
658  }
659 }
ConfigurationRights
Rights for Models.ConfigurationFile
+
override void Down(MigrationBuilder migrationBuilder)
Unapplies the migration
+
override void Up(MigrationBuilder migrationBuilder)
Applies the migration
+
ByondRights
Rights for Models.Byond
Definition: ByondRights.cs:9
+
InstanceUserRights
Rights for an Models.Instance
+ +
AdministrationRights
Rights for Models.Administration
+
ConfigurationType
The type of configuration allowed on an Instance
+ +
DreamDaemonRights
Rights for Models.DreamDaemon
+
InstanceManagerRights
Rights for managing Models.Instances
+
DreamMakerRights
Rights for Models.DreamMaker
+
RepositoryRights
Rights for a Models.Repository
+ +
ChatBotRights
Rights for Models.ChatBot
Definition: ChatBotRights.cs:9
+
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
+
+ + + + diff --git a/20180906143029___m_y_initial_create_8_designer_8cs.html b/20180906143029___m_y_initial_create_8_designer_8cs.html new file mode 100644 index 0000000000..8bc67d7463 --- /dev/null +++ b/20180906143029___m_y_initial_create_8_designer_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180906143029_MYInitialCreate.Designer.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20180906143029_MYInitialCreate.Designer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MYInitialCreate
 The initial database migration for MySQL/MariaDB More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + diff --git a/20180906143029___m_y_initial_create_8_designer_8cs_source.html b/20180906143029___m_y_initial_create_8_designer_8cs_source.html new file mode 100644 index 0000000000..c76e9ca9c4 --- /dev/null +++ b/20180906143029___m_y_initial_create_8_designer_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180906143029_MYInitialCreate.Designer.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20180906143029_MYInitialCreate.Designer.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated />
2 using System;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.EntityFrameworkCore.Infrastructure;
5 using Microsoft.EntityFrameworkCore.Migrations;
6 
8 {
9  [DbContext(typeof(MySqlDatabaseContext))]
10  [Migration("20180906143029_MYInitialCreate")]
11  partial class MYInitialCreate
12  {
17  protected override void BuildTargetModel(ModelBuilder modelBuilder)
18  {
19 #pragma warning disable 612, 618
20  modelBuilder
21  .HasAnnotation("ProductVersion", "2.1.2-rtm-30932")
22  .HasAnnotation("Relational:MaxIdentifierLength", 64);
23 
24  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
25  {
26  b.Property<long>("Id")
27  .ValueGeneratedOnAdd();
28 
29  b.Property<string>("ConnectionString")
30  .IsRequired();
31 
32  b.Property<bool?>("Enabled");
33 
34  b.Property<long>("InstanceId");
35 
36  b.Property<string>("Name")
37  .IsRequired();
38 
39  b.Property<int?>("Provider");
40 
41  b.HasKey("Id");
42 
43  b.HasIndex("InstanceId");
44 
45  b.HasIndex("Name")
46  .IsUnique();
47 
48  b.ToTable("ChatBots");
49  });
50 
51  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
52  {
53  b.Property<long>("Id")
54  .ValueGeneratedOnAdd();
55 
56  b.Property<long>("ChatSettingsId");
57 
58  b.Property<ulong?>("DiscordChannelId");
59 
60  b.Property<string>("IrcChannel");
61 
62  b.Property<bool?>("IsAdminChannel")
63  .IsRequired();
64 
65  b.Property<bool?>("IsUpdatesChannel")
66  .IsRequired();
67 
68  b.Property<bool?>("IsWatchdogChannel")
69  .IsRequired();
70 
71  b.Property<string>("Tag");
72 
73  b.HasKey("Id");
74 
75  b.HasIndex("ChatSettingsId", "DiscordChannelId")
76  .IsUnique();
77 
78  b.HasIndex("ChatSettingsId", "IrcChannel")
79  .IsUnique();
80 
81  b.ToTable("ChatChannels");
82  });
83 
84  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
85  {
86  b.Property<long>("Id")
87  .ValueGeneratedOnAdd();
88 
89  b.Property<string>("ByondVersion")
90  .IsRequired();
91 
92  b.Property<Guid?>("DirectoryName");
93 
94  b.Property<string>("DmeName");
95 
96  b.Property<long?>("JobId");
97 
98  b.Property<string>("Output");
99 
100  b.Property<long>("RevisionInformationId");
101 
102  b.HasKey("Id");
103 
104  b.HasIndex("DirectoryName");
105 
106  b.HasIndex("JobId");
107 
108  b.HasIndex("RevisionInformationId");
109 
110  b.ToTable("CompileJobs");
111  });
112 
113  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
114  {
115  b.Property<long>("Id")
116  .ValueGeneratedOnAdd();
117 
118  b.Property<string>("AccessToken");
119 
120  b.Property<bool?>("AllowWebClient")
121  .IsRequired();
122 
123  b.Property<bool?>("AutoStart")
124  .IsRequired();
125 
126  b.Property<long>("InstanceId");
127 
128  b.Property<ushort?>("PrimaryPort")
129  .IsRequired();
130 
131  b.Property<int?>("ProcessId");
132 
133  b.Property<ushort?>("SecondaryPort")
134  .IsRequired();
135 
136  b.Property<int>("SecurityLevel");
137 
138  b.Property<bool?>("SoftRestart")
139  .IsRequired();
140 
141  b.Property<bool?>("SoftShutdown")
142  .IsRequired();
143 
144  b.Property<uint?>("StartupTimeout")
145  .IsRequired();
146 
147  b.HasKey("Id");
148 
149  b.HasIndex("InstanceId")
150  .IsUnique();
151 
152  b.ToTable("DreamDaemonSettings");
153  });
154 
155  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
156  {
157  b.Property<long>("Id")
158  .ValueGeneratedOnAdd();
159 
160  b.Property<ushort?>("ApiValidationPort")
161  .IsRequired();
162 
163  b.Property<long>("InstanceId");
164 
165  b.Property<string>("ProjectName");
166 
167  b.HasKey("Id");
168 
169  b.HasIndex("InstanceId")
170  .IsUnique();
171 
172  b.ToTable("DreamMakerSettings");
173  });
174 
175  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
176  {
177  b.Property<long>("Id")
178  .ValueGeneratedOnAdd();
179 
180  b.Property<uint?>("AutoUpdateInterval")
181  .IsRequired();
182 
183  b.Property<int>("ConfigurationType");
184 
185  b.Property<string>("Name")
186  .IsRequired();
187 
188  b.Property<bool?>("Online")
189  .IsRequired();
190 
191  b.Property<string>("Path")
192  .IsRequired();
193 
194  b.Property<long?>("WatchdogReattachInformationId");
195 
196  b.HasKey("Id");
197 
198  b.HasIndex("Path")
199  .IsUnique();
200 
201  b.HasIndex("WatchdogReattachInformationId");
202 
203  b.ToTable("Instances");
204  });
205 
206  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
207  {
208  b.Property<long>("Id")
209  .ValueGeneratedOnAdd();
210 
211  b.Property<ulong>("ByondRights");
212 
213  b.Property<ulong>("ChatBotRights");
214 
215  b.Property<ulong>("ConfigurationRights");
216 
217  b.Property<ulong>("DreamDaemonRights");
218 
219  b.Property<ulong>("DreamMakerRights");
220 
221  b.Property<long>("InstanceId");
222 
223  b.Property<ulong>("InstanceUserRights");
224 
225  b.Property<ulong>("RepositoryRights");
226 
227  b.Property<long?>("UserId")
228  .IsRequired();
229 
230  b.HasKey("Id");
231 
232  b.HasIndex("InstanceId");
233 
234  b.HasIndex("UserId", "InstanceId")
235  .IsUnique();
236 
237  b.ToTable("InstanceUsers");
238  });
239 
240  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
241  {
242  b.Property<long>("Id")
243  .ValueGeneratedOnAdd();
244 
245  b.Property<ulong?>("CancelRight");
246 
247  b.Property<ulong?>("CancelRightsType");
248 
249  b.Property<bool?>("Cancelled")
250  .IsRequired();
251 
252  b.Property<long?>("CancelledById");
253 
254  b.Property<string>("Description")
255  .IsRequired();
256 
257  b.Property<string>("ExceptionDetails");
258 
259  b.Property<long>("InstanceId");
260 
261  b.Property<DateTimeOffset?>("StartedAt")
262  .IsRequired();
263 
264  b.Property<long>("StartedById");
265 
266  b.Property<DateTimeOffset?>("StoppedAt");
267 
268  b.HasKey("Id");
269 
270  b.HasIndex("CancelledById");
271 
272  b.HasIndex("InstanceId");
273 
274  b.HasIndex("StartedById");
275 
276  b.ToTable("Jobs");
277  });
278 
279  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
280  {
281  b.Property<long>("Id")
282  .ValueGeneratedOnAdd();
283 
284  b.Property<string>("AccessIdentifier")
285  .IsRequired();
286 
287  b.Property<string>("ChatChannelsJson")
288  .IsRequired();
289 
290  b.Property<string>("ChatCommandsJson")
291  .IsRequired();
292 
293  b.Property<long?>("CompileJobId");
294 
295  b.Property<bool>("IsPrimary");
296 
297  b.Property<ushort>("Port");
298 
299  b.Property<int>("ProcessId");
300 
301  b.Property<int>("RebootState");
302 
303  b.Property<string>("ServerCommandsJson")
304  .IsRequired();
305 
306  b.HasKey("Id");
307 
308  b.HasIndex("CompileJobId");
309 
310  b.ToTable("ReattachInformations");
311  });
312 
313  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
314  {
315  b.Property<long>("Id")
316  .ValueGeneratedOnAdd();
317 
318  b.Property<string>("AccessToken");
319 
320  b.Property<string>("AccessUser");
321 
322  b.Property<bool?>("AutoUpdatesKeepTestMerges")
323  .IsRequired();
324 
325  b.Property<bool?>("AutoUpdatesSynchronize")
326  .IsRequired();
327 
328  b.Property<string>("CommitterEmail")
329  .IsRequired();
330 
331  b.Property<string>("CommitterName")
332  .IsRequired();
333 
334  b.Property<long>("InstanceId");
335 
336  b.Property<bool?>("PushTestMergeCommits")
337  .IsRequired();
338 
339  b.Property<bool?>("ShowTestMergeCommitters")
340  .IsRequired();
341 
342  b.HasKey("Id");
343 
344  b.HasIndex("InstanceId")
345  .IsUnique();
346 
347  b.ToTable("RepositorySettings");
348  });
349 
350  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
351  {
352  b.Property<long>("Id")
353  .ValueGeneratedOnAdd();
354 
355  b.Property<long>("RevisionInformationId");
356 
357  b.Property<long>("TestMergeId");
358 
359  b.HasKey("Id");
360 
361  b.HasIndex("RevisionInformationId");
362 
363  b.HasIndex("TestMergeId");
364 
365  b.ToTable("RevInfoTestMerges");
366  });
367 
368  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
369  {
370  b.Property<long>("Id")
371  .ValueGeneratedOnAdd();
372 
373  b.Property<string>("CommitSha")
374  .IsRequired()
375  .HasMaxLength(40);
376 
377  b.Property<long>("InstanceId");
378 
379  b.Property<string>("OriginCommitSha")
380  .IsRequired()
381  .HasMaxLength(40);
382 
383  b.HasKey("Id");
384 
385  b.HasIndex("CommitSha")
386  .IsUnique();
387 
388  b.HasIndex("InstanceId");
389 
390  b.ToTable("RevisionInformations");
391  });
392 
393  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
394  {
395  b.Property<long>("Id")
396  .ValueGeneratedOnAdd();
397 
398  b.Property<string>("Author")
399  .IsRequired();
400 
401  b.Property<string>("BodyAtMerge")
402  .IsRequired();
403 
404  b.Property<string>("Comment");
405 
406  b.Property<DateTimeOffset>("MergedAt");
407 
408  b.Property<long>("MergedById");
409 
410  b.Property<int?>("Number")
411  .IsRequired();
412 
413  b.Property<long?>("PrimaryRevisionInformationId");
414 
415  b.Property<string>("PullRequestRevision")
416  .IsRequired();
417 
418  b.Property<string>("TitleAtMerge")
419  .IsRequired();
420 
421  b.Property<string>("Url")
422  .IsRequired();
423 
424  b.HasKey("Id");
425 
426  b.HasIndex("MergedById");
427 
428  b.HasIndex("PrimaryRevisionInformationId")
429  .IsUnique();
430 
431  b.ToTable("TestMerges");
432  });
433 
434  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
435  {
436  b.Property<long>("Id")
437  .ValueGeneratedOnAdd();
438 
439  b.Property<ulong>("AdministrationRights");
440 
441  b.Property<string>("CanonicalName")
442  .IsRequired();
443 
444  b.Property<DateTimeOffset?>("CreatedAt")
445  .IsRequired();
446 
447  b.Property<long?>("CreatedById");
448 
449  b.Property<bool?>("Enabled")
450  .IsRequired();
451 
452  b.Property<ulong>("InstanceManagerRights");
453 
454  b.Property<DateTimeOffset?>("LastPasswordUpdate");
455 
456  b.Property<string>("Name")
457  .IsRequired();
458 
459  b.Property<string>("PasswordHash");
460 
461  b.Property<string>("SystemIdentifier");
462 
463  b.HasKey("Id");
464 
465  b.HasIndex("CanonicalName")
466  .IsUnique();
467 
468  b.HasIndex("CreatedById");
469 
470  b.ToTable("Users");
471  });
472 
473  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
474  {
475  b.Property<long>("Id")
476  .ValueGeneratedOnAdd();
477 
478  b.Property<long?>("AlphaId");
479 
480  b.Property<bool>("AlphaIsActive");
481 
482  b.Property<long?>("BravoId");
483 
484  b.HasKey("Id");
485 
486  b.HasIndex("AlphaId");
487 
488  b.HasIndex("BravoId");
489 
490  b.ToTable("WatchdogReattachInformations");
491  });
492 
493  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
494  {
495  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
496  .WithMany("ChatSettings")
497  .HasForeignKey("InstanceId")
498  .OnDelete(DeleteBehavior.Cascade);
499  });
500 
501  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
502  {
503  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
504  .WithMany("Channels")
505  .HasForeignKey("ChatSettingsId")
506  .OnDelete(DeleteBehavior.Cascade);
507  });
508 
509  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
510  {
511  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
512  .WithMany()
513  .HasForeignKey("JobId");
514 
515  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
516  .WithMany("CompileJobs")
517  .HasForeignKey("RevisionInformationId")
518  .OnDelete(DeleteBehavior.Cascade);
519  });
520 
521  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
522  {
523  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
524  .WithOne("DreamDaemonSettings")
525  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
526  .OnDelete(DeleteBehavior.Cascade);
527  });
528 
529  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
530  {
531  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
532  .WithOne("DreamMakerSettings")
533  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
534  .OnDelete(DeleteBehavior.Cascade);
535  });
536 
537  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
538  {
539  b.HasOne("Tgstation.Server.Host.Models.WatchdogReattachInformation", "WatchdogReattachInformation")
540  .WithMany()
541  .HasForeignKey("WatchdogReattachInformationId");
542  });
543 
544  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
545  {
546  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
547  .WithMany("InstanceUsers")
548  .HasForeignKey("InstanceId")
549  .OnDelete(DeleteBehavior.Cascade);
550 
551  b.HasOne("Tgstation.Server.Host.Models.User")
552  .WithMany("InstanceUsers")
553  .HasForeignKey("UserId")
554  .OnDelete(DeleteBehavior.Cascade);
555  });
556 
557  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
558  {
559  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
560  .WithMany()
561  .HasForeignKey("CancelledById");
562 
563  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
564  .WithMany("Jobs")
565  .HasForeignKey("InstanceId")
566  .OnDelete(DeleteBehavior.Cascade);
567 
568  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
569  .WithMany()
570  .HasForeignKey("StartedById")
571  .OnDelete(DeleteBehavior.Cascade);
572  });
573 
574  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
575  {
576  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
577  .WithMany()
578  .HasForeignKey("CompileJobId");
579  });
580 
581  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
582  {
583  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
584  .WithOne("RepositorySettings")
585  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
586  .OnDelete(DeleteBehavior.Cascade);
587  });
588 
589  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
590  {
591  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
592  .WithMany("ActiveTestMerges")
593  .HasForeignKey("RevisionInformationId")
594  .OnDelete(DeleteBehavior.Cascade);
595 
596  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
597  .WithMany("RevisonInformations")
598  .HasForeignKey("TestMergeId")
599  .OnDelete(DeleteBehavior.Cascade);
600  });
601 
602  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
603  {
604  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
605  .WithMany("RevisionInformations")
606  .HasForeignKey("InstanceId")
607  .OnDelete(DeleteBehavior.Cascade);
608  });
609 
610  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
611  {
612  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
613  .WithMany("TestMerges")
614  .HasForeignKey("MergedById")
615  .OnDelete(DeleteBehavior.Restrict);
616 
617  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
618  .WithOne("PrimaryTestMerge")
619  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
620  .OnDelete(DeleteBehavior.SetNull);
621  });
622 
623  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
624  {
625  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
626  .WithMany("CreatedUsers")
627  .HasForeignKey("CreatedById");
628  });
629 
630  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
631  {
632  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
633  .WithMany()
634  .HasForeignKey("AlphaId");
635 
636  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
637  .WithMany()
638  .HasForeignKey("BravoId");
639  });
640 #pragma warning restore 612, 618
641  }
642  }
643 }
+ + +
override void BuildTargetModel(ModelBuilder modelBuilder)
Builds the target model
+
+ + + + diff --git a/20180906143029___m_y_initial_create_8cs.html b/20180906143029___m_y_initial_create_8cs.html new file mode 100644 index 0000000000..ecf32454bb --- /dev/null +++ b/20180906143029___m_y_initial_create_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180906143029_MYInitialCreate.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20180906143029_MYInitialCreate.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MYInitialCreate
 The initial database migration for MySQL/MariaDB More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + diff --git a/20180906143029___m_y_initial_create_8cs_source.html b/20180906143029___m_y_initial_create_8cs_source.html new file mode 100644 index 0000000000..077118ef47 --- /dev/null +++ b/20180906143029___m_y_initial_create_8cs_source.html @@ -0,0 +1,98 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180906143029_MYInitialCreate.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20180906143029_MYInitialCreate.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using Microsoft.EntityFrameworkCore.Metadata;
3 using Microsoft.EntityFrameworkCore.Migrations;
4 
6 {
10  #pragma warning disable CA1506
11  public partial class MYInitialCreate : Migration
12  {
17  protected override void Up(MigrationBuilder migrationBuilder)
18  {
19  if (migrationBuilder == null)
20  throw new ArgumentNullException(nameof(migrationBuilder));
21 
22  migrationBuilder.CreateTable(
23  name: "Users",
24  columns: table => new
25  {
26  Id = table.Column<long>(nullable: false)
27  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
28  Enabled = table.Column<bool>(nullable: false),
29  CreatedAt = table.Column<DateTimeOffset>(nullable: false),
30  SystemIdentifier = table.Column<string>(nullable: true),
31  Name = table.Column<string>(nullable: false),
32  AdministrationRights = table.Column<ulong>(nullable: false),
33  InstanceManagerRights = table.Column<ulong>(nullable: false),
34  PasswordHash = table.Column<string>(nullable: true),
35  CreatedById = table.Column<long>(nullable: true),
36  CanonicalName = table.Column<string>(nullable: false),
37  LastPasswordUpdate = table.Column<DateTimeOffset>(nullable: true)
38  },
39  constraints: table =>
40  {
41  table.PrimaryKey("PK_Users", x => x.Id);
42  table.ForeignKey(
43  name: "FK_Users_Users_CreatedById",
44  column: x => x.CreatedById,
45  principalTable: "Users",
46  principalColumn: "Id",
47  onDelete: ReferentialAction.Restrict);
48  });
49 
50  migrationBuilder.CreateTable(
51  name: "ChatChannels",
52  columns: table => new
53  {
54  IrcChannel = table.Column<string>(nullable: true),
55  DiscordChannelId = table.Column<ulong>(nullable: true),
56  IsAdminChannel = table.Column<bool>(nullable: false),
57  IsWatchdogChannel = table.Column<bool>(nullable: false),
58  IsUpdatesChannel = table.Column<bool>(nullable: false),
59  Tag = table.Column<string>(nullable: true),
60  Id = table.Column<long>(nullable: false)
61  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
62  ChatSettingsId = table.Column<long>(nullable: false)
63  },
64  constraints: table =>
65  {
66  table.PrimaryKey("PK_ChatChannels", x => x.Id);
67  });
68 
69  migrationBuilder.CreateTable(
70  name: "ReattachInformations",
71  columns: table => new
72  {
73  ChatCommandsJson = table.Column<string>(nullable: false),
74  ChatChannelsJson = table.Column<string>(nullable: false),
75  ServerCommandsJson = table.Column<string>(nullable: false),
76  AccessIdentifier = table.Column<string>(nullable: false),
77  ProcessId = table.Column<int>(nullable: false),
78  IsPrimary = table.Column<bool>(nullable: false),
79  Port = table.Column<ushort>(nullable: false),
80  RebootState = table.Column<int>(nullable: false),
81  Id = table.Column<long>(nullable: false)
82  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
83  CompileJobId = table.Column<long>(nullable: true)
84  },
85  constraints: table =>
86  {
87  table.PrimaryKey("PK_ReattachInformations", x => x.Id);
88  });
89 
90  migrationBuilder.CreateTable(
91  name: "WatchdogReattachInformations",
92  columns: table => new
93  {
94  AlphaIsActive = table.Column<bool>(nullable: false),
95  Id = table.Column<long>(nullable: false)
96  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
97  AlphaId = table.Column<long>(nullable: true),
98  BravoId = table.Column<long>(nullable: true)
99  },
100  constraints: table =>
101  {
102  table.PrimaryKey("PK_WatchdogReattachInformations", x => x.Id);
103  table.ForeignKey(
104  name: "FK_WatchdogReattachInformations_ReattachInformations_AlphaId",
105  column: x => x.AlphaId,
106  principalTable: "ReattachInformations",
107  principalColumn: "Id",
108  onDelete: ReferentialAction.Restrict);
109  table.ForeignKey(
110  name: "FK_WatchdogReattachInformations_ReattachInformations_BravoId",
111  column: x => x.BravoId,
112  principalTable: "ReattachInformations",
113  principalColumn: "Id",
114  onDelete: ReferentialAction.Restrict);
115  });
116 
117  migrationBuilder.CreateTable(
118  name: "Instances",
119  columns: table => new
120  {
121  Id = table.Column<long>(nullable: false)
122  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
123  Name = table.Column<string>(nullable: false),
124  Path = table.Column<string>(nullable: false),
125  Online = table.Column<bool>(nullable: false),
126  ConfigurationType = table.Column<int>(nullable: false),
127  AutoUpdateInterval = table.Column<uint>(nullable: false),
128  WatchdogReattachInformationId = table.Column<long>(nullable: true)
129  },
130  constraints: table =>
131  {
132  table.PrimaryKey("PK_Instances", x => x.Id);
133  table.ForeignKey(
134  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInfor~",
135  column: x => x.WatchdogReattachInformationId,
136  principalTable: "WatchdogReattachInformations",
137  principalColumn: "Id",
138  onDelete: ReferentialAction.Restrict);
139  });
140 
141  migrationBuilder.CreateTable(
142  name: "ChatBots",
143  columns: table => new
144  {
145  Id = table.Column<long>(nullable: false)
146  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
147  Name = table.Column<string>(nullable: false),
148  Enabled = table.Column<bool>(nullable: true),
149  Provider = table.Column<int>(nullable: true),
150  ConnectionString = table.Column<string>(nullable: false),
151  InstanceId = table.Column<long>(nullable: false)
152  },
153  constraints: table =>
154  {
155  table.PrimaryKey("PK_ChatBots", x => x.Id);
156  table.ForeignKey(
157  name: "FK_ChatBots_Instances_InstanceId",
158  column: x => x.InstanceId,
159  principalTable: "Instances",
160  principalColumn: "Id",
161  onDelete: ReferentialAction.Cascade);
162  });
163 
164  migrationBuilder.CreateTable(
165  name: "DreamDaemonSettings",
166  columns: table => new
167  {
168  AllowWebClient = table.Column<bool>(nullable: false),
169  SecurityLevel = table.Column<int>(nullable: false),
170  PrimaryPort = table.Column<ushort>(nullable: false),
171  SecondaryPort = table.Column<ushort>(nullable: false),
172  StartupTimeout = table.Column<uint>(nullable: false),
173  AutoStart = table.Column<bool>(nullable: false),
174  SoftRestart = table.Column<bool>(nullable: false),
175  SoftShutdown = table.Column<bool>(nullable: false),
176  Id = table.Column<long>(nullable: false)
177  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
178  ProcessId = table.Column<int>(nullable: true),
179  AccessToken = table.Column<string>(nullable: true),
180  InstanceId = table.Column<long>(nullable: false)
181  },
182  constraints: table =>
183  {
184  table.PrimaryKey("PK_DreamDaemonSettings", x => x.Id);
185  table.ForeignKey(
186  name: "FK_DreamDaemonSettings_Instances_InstanceId",
187  column: x => x.InstanceId,
188  principalTable: "Instances",
189  principalColumn: "Id",
190  onDelete: ReferentialAction.Cascade);
191  });
192 
193  migrationBuilder.CreateTable(
194  name: "DreamMakerSettings",
195  columns: table => new
196  {
197  ProjectName = table.Column<string>(nullable: true),
198  ApiValidationPort = table.Column<ushort>(nullable: false),
199  Id = table.Column<long>(nullable: false)
200  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
201  InstanceId = table.Column<long>(nullable: false)
202  },
203  constraints: table =>
204  {
205  table.PrimaryKey("PK_DreamMakerSettings", x => x.Id);
206  table.ForeignKey(
207  name: "FK_DreamMakerSettings_Instances_InstanceId",
208  column: x => x.InstanceId,
209  principalTable: "Instances",
210  principalColumn: "Id",
211  onDelete: ReferentialAction.Cascade);
212  });
213 
214  migrationBuilder.CreateTable(
215  name: "InstanceUsers",
216  columns: table => new
217  {
218  UserId = table.Column<long>(nullable: false),
219  InstanceUserRights = table.Column<ulong>(nullable: false),
220  ByondRights = table.Column<ulong>(nullable: false),
221  DreamDaemonRights = table.Column<ulong>(nullable: false),
222  DreamMakerRights = table.Column<ulong>(nullable: false),
223  RepositoryRights = table.Column<ulong>(nullable: false),
224  ChatBotRights = table.Column<ulong>(nullable: false),
225  ConfigurationRights = table.Column<ulong>(nullable: false),
226  Id = table.Column<long>(nullable: false)
227  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
228  InstanceId = table.Column<long>(nullable: false)
229  },
230  constraints: table =>
231  {
232  table.PrimaryKey("PK_InstanceUsers", x => x.Id);
233  table.ForeignKey(
234  name: "FK_InstanceUsers_Instances_InstanceId",
235  column: x => x.InstanceId,
236  principalTable: "Instances",
237  principalColumn: "Id",
238  onDelete: ReferentialAction.Cascade);
239  table.ForeignKey(
240  name: "FK_InstanceUsers_Users_UserId",
241  column: x => x.UserId,
242  principalTable: "Users",
243  principalColumn: "Id",
244  onDelete: ReferentialAction.Cascade);
245  });
246 
247  migrationBuilder.CreateTable(
248  name: "Jobs",
249  columns: table => new
250  {
251  Id = table.Column<long>(nullable: false)
252  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
253  Description = table.Column<string>(nullable: false),
254  ExceptionDetails = table.Column<string>(nullable: true),
255  StartedAt = table.Column<DateTimeOffset>(nullable: false),
256  StoppedAt = table.Column<DateTimeOffset>(nullable: true),
257  Cancelled = table.Column<bool>(nullable: false),
258  CancelRightsType = table.Column<ulong>(nullable: true),
259  CancelRight = table.Column<ulong>(nullable: true),
260  StartedById = table.Column<long>(nullable: false),
261  CancelledById = table.Column<long>(nullable: true),
262  InstanceId = table.Column<long>(nullable: false)
263  },
264  constraints: table =>
265  {
266  table.PrimaryKey("PK_Jobs", x => x.Id);
267  table.ForeignKey(
268  name: "FK_Jobs_Users_CancelledById",
269  column: x => x.CancelledById,
270  principalTable: "Users",
271  principalColumn: "Id",
272  onDelete: ReferentialAction.Restrict);
273  table.ForeignKey(
274  name: "FK_Jobs_Instances_InstanceId",
275  column: x => x.InstanceId,
276  principalTable: "Instances",
277  principalColumn: "Id",
278  onDelete: ReferentialAction.Cascade);
279  table.ForeignKey(
280  name: "FK_Jobs_Users_StartedById",
281  column: x => x.StartedById,
282  principalTable: "Users",
283  principalColumn: "Id",
284  onDelete: ReferentialAction.Cascade);
285  });
286 
287  migrationBuilder.CreateTable(
288  name: "RepositorySettings",
289  columns: table => new
290  {
291  CommitterName = table.Column<string>(nullable: false),
292  CommitterEmail = table.Column<string>(nullable: false),
293  AccessUser = table.Column<string>(nullable: true),
294  AccessToken = table.Column<string>(nullable: true),
295  PushTestMergeCommits = table.Column<bool>(nullable: false),
296  ShowTestMergeCommitters = table.Column<bool>(nullable: false),
297  AutoUpdatesKeepTestMerges = table.Column<bool>(nullable: false),
298  AutoUpdatesSynchronize = table.Column<bool>(nullable: false),
299  Id = table.Column<long>(nullable: false)
300  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
301  InstanceId = table.Column<long>(nullable: false)
302  },
303  constraints: table =>
304  {
305  table.PrimaryKey("PK_RepositorySettings", x => x.Id);
306  table.ForeignKey(
307  name: "FK_RepositorySettings_Instances_InstanceId",
308  column: x => x.InstanceId,
309  principalTable: "Instances",
310  principalColumn: "Id",
311  onDelete: ReferentialAction.Cascade);
312  });
313 
314  migrationBuilder.CreateTable(
315  name: "RevisionInformations",
316  columns: table => new
317  {
318  CommitSha = table.Column<string>(maxLength: 40, nullable: false),
319  OriginCommitSha = table.Column<string>(maxLength: 40, nullable: false),
320  Id = table.Column<long>(nullable: false)
321  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
322  InstanceId = table.Column<long>(nullable: false)
323  },
324  constraints: table =>
325  {
326  table.PrimaryKey("PK_RevisionInformations", x => x.Id);
327  table.ForeignKey(
328  name: "FK_RevisionInformations_Instances_InstanceId",
329  column: x => x.InstanceId,
330  principalTable: "Instances",
331  principalColumn: "Id",
332  onDelete: ReferentialAction.Cascade);
333  });
334 
335  migrationBuilder.CreateTable(
336  name: "CompileJobs",
337  columns: table => new
338  {
339  Id = table.Column<long>(nullable: false)
340  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
341  DmeName = table.Column<string>(nullable: true),
342  Output = table.Column<string>(nullable: true),
343  DirectoryName = table.Column<Guid>(nullable: true),
344  JobId = table.Column<long>(nullable: true),
345  RevisionInformationId = table.Column<long>(nullable: false),
346  ByondVersion = table.Column<string>(nullable: false)
347  },
348  constraints: table =>
349  {
350  table.PrimaryKey("PK_CompileJobs", x => x.Id);
351  table.ForeignKey(
352  name: "FK_CompileJobs_Jobs_JobId",
353  column: x => x.JobId,
354  principalTable: "Jobs",
355  principalColumn: "Id",
356  onDelete: ReferentialAction.Restrict);
357  table.ForeignKey(
358  name: "FK_CompileJobs_RevisionInformations_RevisionInformationId",
359  column: x => x.RevisionInformationId,
360  principalTable: "RevisionInformations",
361  principalColumn: "Id",
362  onDelete: ReferentialAction.Cascade);
363  });
364 
365  migrationBuilder.CreateTable(
366  name: "TestMerges",
367  columns: table => new
368  {
369  Number = table.Column<int>(nullable: false),
370  PullRequestRevision = table.Column<string>(nullable: false),
371  Comment = table.Column<string>(nullable: true),
372  TitleAtMerge = table.Column<string>(nullable: false),
373  BodyAtMerge = table.Column<string>(nullable: false),
374  Url = table.Column<string>(nullable: false),
375  Author = table.Column<string>(nullable: false),
376  Id = table.Column<long>(nullable: false)
377  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
378  MergedAt = table.Column<DateTimeOffset>(nullable: false),
379  MergedById = table.Column<long>(nullable: false),
380  PrimaryRevisionInformationId = table.Column<long>(nullable: true)
381  },
382  constraints: table =>
383  {
384  table.PrimaryKey("PK_TestMerges", x => x.Id);
385  table.ForeignKey(
386  name: "FK_TestMerges_Users_MergedById",
387  column: x => x.MergedById,
388  principalTable: "Users",
389  principalColumn: "Id",
390  onDelete: ReferentialAction.Restrict);
391  table.ForeignKey(
392  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
393  column: x => x.PrimaryRevisionInformationId,
394  principalTable: "RevisionInformations",
395  principalColumn: "Id",
396  onDelete: ReferentialAction.SetNull);
397  });
398 
399  migrationBuilder.CreateTable(
400  name: "RevInfoTestMerges",
401  columns: table => new
402  {
403  Id = table.Column<long>(nullable: false)
404  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
405  TestMergeId = table.Column<long>(nullable: false),
406  RevisionInformationId = table.Column<long>(nullable: false)
407  },
408  constraints: table =>
409  {
410  table.PrimaryKey("PK_RevInfoTestMerges", x => x.Id);
411  table.ForeignKey(
412  name: "FK_RevInfoTestMerges_RevisionInformations_RevisionInformationId",
413  column: x => x.RevisionInformationId,
414  principalTable: "RevisionInformations",
415  principalColumn: "Id",
416  onDelete: ReferentialAction.Cascade);
417  table.ForeignKey(
418  name: "FK_RevInfoTestMerges_TestMerges_TestMergeId",
419  column: x => x.TestMergeId,
420  principalTable: "TestMerges",
421  principalColumn: "Id",
422  onDelete: ReferentialAction.Cascade);
423  });
424 
425  migrationBuilder.CreateIndex(
426  name: "IX_ChatBots_InstanceId",
427  table: "ChatBots",
428  column: "InstanceId");
429 
430  migrationBuilder.CreateIndex(
431  name: "IX_ChatBots_Name",
432  table: "ChatBots",
433  column: "Name",
434  unique: true);
435 
436  migrationBuilder.CreateIndex(
437  name: "IX_ChatChannels_ChatSettingsId_DiscordChannelId",
438  table: "ChatChannels",
439  columns: new[] { "ChatSettingsId", "DiscordChannelId" },
440  unique: true);
441 
442  migrationBuilder.CreateIndex(
443  name: "IX_ChatChannels_ChatSettingsId_IrcChannel",
444  table: "ChatChannels",
445  columns: new[] { "ChatSettingsId", "IrcChannel" },
446  unique: true);
447 
448  migrationBuilder.CreateIndex(
449  name: "IX_CompileJobs_DirectoryName",
450  table: "CompileJobs",
451  column: "DirectoryName");
452 
453  migrationBuilder.CreateIndex(
454  name: "IX_CompileJobs_JobId",
455  table: "CompileJobs",
456  column: "JobId");
457 
458  migrationBuilder.CreateIndex(
459  name: "IX_CompileJobs_RevisionInformationId",
460  table: "CompileJobs",
461  column: "RevisionInformationId");
462 
463  migrationBuilder.CreateIndex(
464  name: "IX_DreamDaemonSettings_InstanceId",
465  table: "DreamDaemonSettings",
466  column: "InstanceId",
467  unique: true);
468 
469  migrationBuilder.CreateIndex(
470  name: "IX_DreamMakerSettings_InstanceId",
471  table: "DreamMakerSettings",
472  column: "InstanceId",
473  unique: true);
474 
475  migrationBuilder.CreateIndex(
476  name: "IX_Instances_Path",
477  table: "Instances",
478  column: "Path",
479  unique: true);
480 
481  migrationBuilder.CreateIndex(
482  name: "IX_Instances_WatchdogReattachInformationId",
483  table: "Instances",
484  column: "WatchdogReattachInformationId");
485 
486  migrationBuilder.CreateIndex(
487  name: "IX_InstanceUsers_InstanceId",
488  table: "InstanceUsers",
489  column: "InstanceId");
490 
491  migrationBuilder.CreateIndex(
492  name: "IX_InstanceUsers_UserId_InstanceId",
493  table: "InstanceUsers",
494  columns: new[] { "UserId", "InstanceId" },
495  unique: true);
496 
497  migrationBuilder.CreateIndex(
498  name: "IX_Jobs_CancelledById",
499  table: "Jobs",
500  column: "CancelledById");
501 
502  migrationBuilder.CreateIndex(
503  name: "IX_Jobs_InstanceId",
504  table: "Jobs",
505  column: "InstanceId");
506 
507  migrationBuilder.CreateIndex(
508  name: "IX_Jobs_StartedById",
509  table: "Jobs",
510  column: "StartedById");
511 
512  migrationBuilder.CreateIndex(
513  name: "IX_ReattachInformations_CompileJobId",
514  table: "ReattachInformations",
515  column: "CompileJobId");
516 
517  migrationBuilder.CreateIndex(
518  name: "IX_RepositorySettings_InstanceId",
519  table: "RepositorySettings",
520  column: "InstanceId",
521  unique: true);
522 
523  migrationBuilder.CreateIndex(
524  name: "IX_RevInfoTestMerges_RevisionInformationId",
525  table: "RevInfoTestMerges",
526  column: "RevisionInformationId");
527 
528  migrationBuilder.CreateIndex(
529  name: "IX_RevInfoTestMerges_TestMergeId",
530  table: "RevInfoTestMerges",
531  column: "TestMergeId");
532 
533  migrationBuilder.CreateIndex(
534  name: "IX_RevisionInformations_CommitSha",
535  table: "RevisionInformations",
536  column: "CommitSha",
537  unique: true);
538 
539  migrationBuilder.CreateIndex(
540  name: "IX_RevisionInformations_InstanceId",
541  table: "RevisionInformations",
542  column: "InstanceId");
543 
544  migrationBuilder.CreateIndex(
545  name: "IX_TestMerges_MergedById",
546  table: "TestMerges",
547  column: "MergedById");
548 
549  migrationBuilder.CreateIndex(
550  name: "IX_TestMerges_PrimaryRevisionInformationId",
551  table: "TestMerges",
552  column: "PrimaryRevisionInformationId",
553  unique: true);
554 
555  migrationBuilder.CreateIndex(
556  name: "IX_Users_CanonicalName",
557  table: "Users",
558  column: "CanonicalName",
559  unique: true);
560 
561  migrationBuilder.CreateIndex(
562  name: "IX_Users_CreatedById",
563  table: "Users",
564  column: "CreatedById");
565 
566  migrationBuilder.CreateIndex(
567  name: "IX_WatchdogReattachInformations_AlphaId",
568  table: "WatchdogReattachInformations",
569  column: "AlphaId");
570 
571  migrationBuilder.CreateIndex(
572  name: "IX_WatchdogReattachInformations_BravoId",
573  table: "WatchdogReattachInformations",
574  column: "BravoId");
575 
576  migrationBuilder.AddForeignKey(
577  name: "FK_ChatChannels_ChatBots_ChatSettingsId",
578  table: "ChatChannels",
579  column: "ChatSettingsId",
580  principalTable: "ChatBots",
581  principalColumn: "Id",
582  onDelete: ReferentialAction.Cascade);
583 
584  migrationBuilder.AddForeignKey(
585  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
586  table: "ReattachInformations",
587  column: "CompileJobId",
588  principalTable: "CompileJobs",
589  principalColumn: "Id",
590  onDelete: ReferentialAction.Restrict);
591  }
592 
597  protected override void Down(MigrationBuilder migrationBuilder)
598  {
599  if (migrationBuilder == null)
600  throw new ArgumentNullException(nameof(migrationBuilder));
601 
602  migrationBuilder.DropForeignKey(
603  name: "FK_Jobs_Instances_InstanceId",
604  table: "Jobs");
605 
606  migrationBuilder.DropForeignKey(
607  name: "FK_RevisionInformations_Instances_InstanceId",
608  table: "RevisionInformations");
609 
610  migrationBuilder.DropTable(
611  name: "ChatChannels");
612 
613  migrationBuilder.DropTable(
614  name: "DreamDaemonSettings");
615 
616  migrationBuilder.DropTable(
617  name: "DreamMakerSettings");
618 
619  migrationBuilder.DropTable(
620  name: "InstanceUsers");
621 
622  migrationBuilder.DropTable(
623  name: "RepositorySettings");
624 
625  migrationBuilder.DropTable(
626  name: "RevInfoTestMerges");
627 
628  migrationBuilder.DropTable(
629  name: "ChatBots");
630 
631  migrationBuilder.DropTable(
632  name: "TestMerges");
633 
634  migrationBuilder.DropTable(
635  name: "Instances");
636 
637  migrationBuilder.DropTable(
638  name: "WatchdogReattachInformations");
639 
640  migrationBuilder.DropTable(
641  name: "ReattachInformations");
642 
643  migrationBuilder.DropTable(
644  name: "CompileJobs");
645 
646  migrationBuilder.DropTable(
647  name: "Jobs");
648 
649  migrationBuilder.DropTable(
650  name: "RevisionInformations");
651 
652  migrationBuilder.DropTable(
653  name: "Users");
654  }
655  }
656 }
ConfigurationRights
Rights for Models.ConfigurationFile
+
ByondRights
Rights for Models.Byond
Definition: ByondRights.cs:9
+
InstanceUserRights
Rights for an Models.Instance
+ +
AdministrationRights
Rights for Models.Administration
+
ConfigurationType
The type of configuration allowed on an Instance
+ +
DreamDaemonRights
Rights for Models.DreamDaemon
+
InstanceManagerRights
Rights for managing Models.Instances
+
DreamMakerRights
Rights for Models.DreamMaker
+
override void Up(MigrationBuilder migrationBuilder)
Applies the migration
+
RepositoryRights
Rights for a Models.Repository
+ +
ChatBotRights
Rights for Models.ChatBot
Definition: ChatBotRights.cs:9
+
override void Down(MigrationBuilder migrationBuilder)
Unapplies the migration
+
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
+
+ + + + diff --git a/20180918020726___m_y_add_minimum_security_8_designer_8cs.html b/20180918020726___m_y_add_minimum_security_8_designer_8cs.html new file mode 100644 index 0000000000..e54d81ae89 --- /dev/null +++ b/20180918020726___m_y_add_minimum_security_8_designer_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.Designer.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20180918020726_MYAddMinimumSecurity.Designer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity
 Add the Api.Models.Internal.CompileJob.MinimumSecurityLevel and DreamMaker.ApiValidationSecurityLevel columns for MySQL/MariaDB More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + 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 new file mode 100644 index 0000000000..c9e9ddbd5a --- /dev/null +++ b/20180918020726___m_y_add_minimum_security_8_designer_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.Designer.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20180918020726_MYAddMinimumSecurity.Designer.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated />
2 using System;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.EntityFrameworkCore.Infrastructure;
5 using Microsoft.EntityFrameworkCore.Migrations;
6 
8 {
9  [DbContext(typeof(MySqlDatabaseContext))]
10  [Migration("20180918020726_MYAddMinimumSecurity")]
11  partial class MYAddMinimumSecurity
12  {
17  protected override void BuildTargetModel(ModelBuilder modelBuilder)
18  {
19 #pragma warning disable 612, 618
20  modelBuilder
21  .HasAnnotation("ProductVersion", "2.1.3-rtm-32065")
22  .HasAnnotation("Relational:MaxIdentifierLength", 64);
23 
24  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
25  {
26  b.Property<long>("Id")
27  .ValueGeneratedOnAdd();
28 
29  b.Property<string>("ConnectionString")
30  .IsRequired();
31 
32  b.Property<bool?>("Enabled");
33 
34  b.Property<long>("InstanceId");
35 
36  b.Property<string>("Name")
37  .IsRequired();
38 
39  b.Property<int?>("Provider");
40 
41  b.HasKey("Id");
42 
43  b.HasIndex("InstanceId");
44 
45  b.HasIndex("Name")
46  .IsUnique();
47 
48  b.ToTable("ChatBots");
49  });
50 
51  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
52  {
53  b.Property<long>("Id")
54  .ValueGeneratedOnAdd();
55 
56  b.Property<long>("ChatSettingsId");
57 
58  b.Property<ulong?>("DiscordChannelId");
59 
60  b.Property<string>("IrcChannel");
61 
62  b.Property<bool?>("IsAdminChannel")
63  .IsRequired();
64 
65  b.Property<bool?>("IsUpdatesChannel")
66  .IsRequired();
67 
68  b.Property<bool?>("IsWatchdogChannel")
69  .IsRequired();
70 
71  b.Property<string>("Tag");
72 
73  b.HasKey("Id");
74 
75  b.HasIndex("ChatSettingsId", "DiscordChannelId")
76  .IsUnique();
77 
78  b.HasIndex("ChatSettingsId", "IrcChannel")
79  .IsUnique();
80 
81  b.ToTable("ChatChannels");
82  });
83 
84  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
85  {
86  b.Property<long>("Id")
87  .ValueGeneratedOnAdd();
88 
89  b.Property<string>("ByondVersion")
90  .IsRequired();
91 
92  b.Property<Guid?>("DirectoryName");
93 
94  b.Property<string>("DmeName");
95 
96  b.Property<long?>("JobId");
97 
98  b.Property<int>("MinimumSecurityLevel");
99 
100  b.Property<string>("Output");
101 
102  b.Property<long>("RevisionInformationId");
103 
104  b.HasKey("Id");
105 
106  b.HasIndex("DirectoryName");
107 
108  b.HasIndex("JobId");
109 
110  b.HasIndex("RevisionInformationId");
111 
112  b.ToTable("CompileJobs");
113  });
114 
115  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
116  {
117  b.Property<long>("Id")
118  .ValueGeneratedOnAdd();
119 
120  b.Property<string>("AccessToken");
121 
122  b.Property<bool?>("AllowWebClient")
123  .IsRequired();
124 
125  b.Property<bool?>("AutoStart")
126  .IsRequired();
127 
128  b.Property<long>("InstanceId");
129 
130  b.Property<ushort?>("PrimaryPort")
131  .IsRequired();
132 
133  b.Property<int?>("ProcessId");
134 
135  b.Property<ushort?>("SecondaryPort")
136  .IsRequired();
137 
138  b.Property<int>("SecurityLevel");
139 
140  b.Property<bool?>("SoftRestart")
141  .IsRequired();
142 
143  b.Property<bool?>("SoftShutdown")
144  .IsRequired();
145 
146  b.Property<uint?>("StartupTimeout")
147  .IsRequired();
148 
149  b.HasKey("Id");
150 
151  b.HasIndex("InstanceId")
152  .IsUnique();
153 
154  b.ToTable("DreamDaemonSettings");
155  });
156 
157  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
158  {
159  b.Property<long>("Id")
160  .ValueGeneratedOnAdd();
161 
162  b.Property<ushort?>("ApiValidationPort")
163  .IsRequired();
164 
165  b.Property<int>("ApiValidationSecurityLevel");
166 
167  b.Property<long>("InstanceId");
168 
169  b.Property<string>("ProjectName");
170 
171  b.HasKey("Id");
172 
173  b.HasIndex("InstanceId")
174  .IsUnique();
175 
176  b.ToTable("DreamMakerSettings");
177  });
178 
179  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
180  {
181  b.Property<long>("Id")
182  .ValueGeneratedOnAdd();
183 
184  b.Property<uint?>("AutoUpdateInterval")
185  .IsRequired();
186 
187  b.Property<int>("ConfigurationType");
188 
189  b.Property<string>("Name")
190  .IsRequired();
191 
192  b.Property<bool?>("Online")
193  .IsRequired();
194 
195  b.Property<string>("Path")
196  .IsRequired();
197 
198  b.Property<long?>("WatchdogReattachInformationId");
199 
200  b.HasKey("Id");
201 
202  b.HasIndex("Path")
203  .IsUnique();
204 
205  b.HasIndex("WatchdogReattachInformationId");
206 
207  b.ToTable("Instances");
208  });
209 
210  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
211  {
212  b.Property<long>("Id")
213  .ValueGeneratedOnAdd();
214 
215  b.Property<ulong>("ByondRights");
216 
217  b.Property<ulong>("ChatBotRights");
218 
219  b.Property<ulong>("ConfigurationRights");
220 
221  b.Property<ulong>("DreamDaemonRights");
222 
223  b.Property<ulong>("DreamMakerRights");
224 
225  b.Property<long>("InstanceId");
226 
227  b.Property<ulong>("InstanceUserRights");
228 
229  b.Property<ulong>("RepositoryRights");
230 
231  b.Property<long?>("UserId")
232  .IsRequired();
233 
234  b.HasKey("Id");
235 
236  b.HasIndex("InstanceId");
237 
238  b.HasIndex("UserId", "InstanceId")
239  .IsUnique();
240 
241  b.ToTable("InstanceUsers");
242  });
243 
244  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
245  {
246  b.Property<long>("Id")
247  .ValueGeneratedOnAdd();
248 
249  b.Property<ulong?>("CancelRight");
250 
251  b.Property<ulong?>("CancelRightsType");
252 
253  b.Property<bool?>("Cancelled")
254  .IsRequired();
255 
256  b.Property<long?>("CancelledById");
257 
258  b.Property<string>("Description")
259  .IsRequired();
260 
261  b.Property<string>("ExceptionDetails");
262 
263  b.Property<long>("InstanceId");
264 
265  b.Property<DateTimeOffset?>("StartedAt")
266  .IsRequired();
267 
268  b.Property<long>("StartedById");
269 
270  b.Property<DateTimeOffset?>("StoppedAt");
271 
272  b.HasKey("Id");
273 
274  b.HasIndex("CancelledById");
275 
276  b.HasIndex("InstanceId");
277 
278  b.HasIndex("StartedById");
279 
280  b.ToTable("Jobs");
281  });
282 
283  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
284  {
285  b.Property<long>("Id")
286  .ValueGeneratedOnAdd();
287 
288  b.Property<string>("AccessIdentifier")
289  .IsRequired();
290 
291  b.Property<string>("ChatChannelsJson")
292  .IsRequired();
293 
294  b.Property<string>("ChatCommandsJson")
295  .IsRequired();
296 
297  b.Property<long?>("CompileJobId");
298 
299  b.Property<bool>("IsPrimary");
300 
301  b.Property<ushort>("Port");
302 
303  b.Property<int>("ProcessId");
304 
305  b.Property<int>("RebootState");
306 
307  b.Property<string>("ServerCommandsJson")
308  .IsRequired();
309 
310  b.HasKey("Id");
311 
312  b.HasIndex("CompileJobId");
313 
314  b.ToTable("ReattachInformations");
315  });
316 
317  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
318  {
319  b.Property<long>("Id")
320  .ValueGeneratedOnAdd();
321 
322  b.Property<string>("AccessToken");
323 
324  b.Property<string>("AccessUser");
325 
326  b.Property<bool?>("AutoUpdatesKeepTestMerges")
327  .IsRequired();
328 
329  b.Property<bool?>("AutoUpdatesSynchronize")
330  .IsRequired();
331 
332  b.Property<string>("CommitterEmail")
333  .IsRequired();
334 
335  b.Property<string>("CommitterName")
336  .IsRequired();
337 
338  b.Property<long>("InstanceId");
339 
340  b.Property<bool?>("PushTestMergeCommits")
341  .IsRequired();
342 
343  b.Property<bool?>("ShowTestMergeCommitters")
344  .IsRequired();
345 
346  b.HasKey("Id");
347 
348  b.HasIndex("InstanceId")
349  .IsUnique();
350 
351  b.ToTable("RepositorySettings");
352  });
353 
354  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
355  {
356  b.Property<long>("Id")
357  .ValueGeneratedOnAdd();
358 
359  b.Property<long>("RevisionInformationId");
360 
361  b.Property<long>("TestMergeId");
362 
363  b.HasKey("Id");
364 
365  b.HasIndex("RevisionInformationId");
366 
367  b.HasIndex("TestMergeId");
368 
369  b.ToTable("RevInfoTestMerges");
370  });
371 
372  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
373  {
374  b.Property<long>("Id")
375  .ValueGeneratedOnAdd();
376 
377  b.Property<string>("CommitSha")
378  .IsRequired()
379  .HasMaxLength(40);
380 
381  b.Property<long>("InstanceId");
382 
383  b.Property<string>("OriginCommitSha")
384  .IsRequired()
385  .HasMaxLength(40);
386 
387  b.HasKey("Id");
388 
389  b.HasIndex("CommitSha")
390  .IsUnique();
391 
392  b.HasIndex("InstanceId");
393 
394  b.ToTable("RevisionInformations");
395  });
396 
397  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
398  {
399  b.Property<long>("Id")
400  .ValueGeneratedOnAdd();
401 
402  b.Property<string>("Author")
403  .IsRequired();
404 
405  b.Property<string>("BodyAtMerge")
406  .IsRequired();
407 
408  b.Property<string>("Comment");
409 
410  b.Property<DateTimeOffset>("MergedAt");
411 
412  b.Property<long>("MergedById");
413 
414  b.Property<int?>("Number")
415  .IsRequired();
416 
417  b.Property<long?>("PrimaryRevisionInformationId");
418 
419  b.Property<string>("PullRequestRevision")
420  .IsRequired();
421 
422  b.Property<string>("TitleAtMerge")
423  .IsRequired();
424 
425  b.Property<string>("Url")
426  .IsRequired();
427 
428  b.HasKey("Id");
429 
430  b.HasIndex("MergedById");
431 
432  b.HasIndex("PrimaryRevisionInformationId")
433  .IsUnique();
434 
435  b.ToTable("TestMerges");
436  });
437 
438  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
439  {
440  b.Property<long>("Id")
441  .ValueGeneratedOnAdd();
442 
443  b.Property<ulong>("AdministrationRights");
444 
445  b.Property<string>("CanonicalName")
446  .IsRequired();
447 
448  b.Property<DateTimeOffset?>("CreatedAt")
449  .IsRequired();
450 
451  b.Property<long?>("CreatedById");
452 
453  b.Property<bool?>("Enabled")
454  .IsRequired();
455 
456  b.Property<ulong>("InstanceManagerRights");
457 
458  b.Property<DateTimeOffset?>("LastPasswordUpdate");
459 
460  b.Property<string>("Name")
461  .IsRequired();
462 
463  b.Property<string>("PasswordHash");
464 
465  b.Property<string>("SystemIdentifier");
466 
467  b.HasKey("Id");
468 
469  b.HasIndex("CanonicalName")
470  .IsUnique();
471 
472  b.HasIndex("CreatedById");
473 
474  b.ToTable("Users");
475  });
476 
477  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
478  {
479  b.Property<long>("Id")
480  .ValueGeneratedOnAdd();
481 
482  b.Property<long?>("AlphaId");
483 
484  b.Property<bool>("AlphaIsActive");
485 
486  b.Property<long?>("BravoId");
487 
488  b.HasKey("Id");
489 
490  b.HasIndex("AlphaId");
491 
492  b.HasIndex("BravoId");
493 
494  b.ToTable("WatchdogReattachInformations");
495  });
496 
497  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
498  {
499  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
500  .WithMany("ChatSettings")
501  .HasForeignKey("InstanceId")
502  .OnDelete(DeleteBehavior.Cascade);
503  });
504 
505  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
506  {
507  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
508  .WithMany("Channels")
509  .HasForeignKey("ChatSettingsId")
510  .OnDelete(DeleteBehavior.Cascade);
511  });
512 
513  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
514  {
515  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
516  .WithMany()
517  .HasForeignKey("JobId");
518 
519  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
520  .WithMany("CompileJobs")
521  .HasForeignKey("RevisionInformationId")
522  .OnDelete(DeleteBehavior.Cascade);
523  });
524 
525  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
526  {
527  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
528  .WithOne("DreamDaemonSettings")
529  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
530  .OnDelete(DeleteBehavior.Cascade);
531  });
532 
533  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
534  {
535  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
536  .WithOne("DreamMakerSettings")
537  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
538  .OnDelete(DeleteBehavior.Cascade);
539  });
540 
541  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
542  {
543  b.HasOne("Tgstation.Server.Host.Models.WatchdogReattachInformation", "WatchdogReattachInformation")
544  .WithMany()
545  .HasForeignKey("WatchdogReattachInformationId");
546  });
547 
548  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
549  {
550  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
551  .WithMany("InstanceUsers")
552  .HasForeignKey("InstanceId")
553  .OnDelete(DeleteBehavior.Cascade);
554 
555  b.HasOne("Tgstation.Server.Host.Models.User")
556  .WithMany("InstanceUsers")
557  .HasForeignKey("UserId")
558  .OnDelete(DeleteBehavior.Cascade);
559  });
560 
561  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
562  {
563  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
564  .WithMany()
565  .HasForeignKey("CancelledById");
566 
567  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
568  .WithMany("Jobs")
569  .HasForeignKey("InstanceId")
570  .OnDelete(DeleteBehavior.Cascade);
571 
572  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
573  .WithMany()
574  .HasForeignKey("StartedById")
575  .OnDelete(DeleteBehavior.Cascade);
576  });
577 
578  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
579  {
580  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
581  .WithMany()
582  .HasForeignKey("CompileJobId");
583  });
584 
585  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
586  {
587  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
588  .WithOne("RepositorySettings")
589  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
590  .OnDelete(DeleteBehavior.Cascade);
591  });
592 
593  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
594  {
595  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
596  .WithMany("ActiveTestMerges")
597  .HasForeignKey("RevisionInformationId")
598  .OnDelete(DeleteBehavior.Cascade);
599 
600  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
601  .WithMany("RevisonInformations")
602  .HasForeignKey("TestMergeId")
603  .OnDelete(DeleteBehavior.Cascade);
604  });
605 
606  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
607  {
608  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
609  .WithMany("RevisionInformations")
610  .HasForeignKey("InstanceId")
611  .OnDelete(DeleteBehavior.Cascade);
612  });
613 
614  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
615  {
616  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
617  .WithMany("TestMerges")
618  .HasForeignKey("MergedById")
619  .OnDelete(DeleteBehavior.Restrict);
620 
621  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
622  .WithOne("PrimaryTestMerge")
623  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
624  .OnDelete(DeleteBehavior.SetNull);
625  });
626 
627  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
628  {
629  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
630  .WithMany("CreatedUsers")
631  .HasForeignKey("CreatedById");
632  });
633 
634  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
635  {
636  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
637  .WithMany()
638  .HasForeignKey("AlphaId");
639 
640  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
641  .WithMany()
642  .HasForeignKey("BravoId");
643  });
644 #pragma warning restore 612, 618
645  }
646  }
647 }
override void BuildTargetModel(ModelBuilder modelBuilder)
Builds the target model
+ + + +
+ + + + diff --git a/20180918020726___m_y_add_minimum_security_8cs.html b/20180918020726___m_y_add_minimum_security_8cs.html new file mode 100644 index 0000000000..8a1ebcf450 --- /dev/null +++ b/20180918020726___m_y_add_minimum_security_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20180918020726_MYAddMinimumSecurity.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity
 Add the Api.Models.Internal.CompileJob.MinimumSecurityLevel and DreamMaker.ApiValidationSecurityLevel columns for MySQL/MariaDB More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + diff --git a/20180918020726___m_y_add_minimum_security_8cs_source.html b/20180918020726___m_y_add_minimum_security_8cs_source.html new file mode 100644 index 0000000000..ef7c0c3d7b --- /dev/null +++ b/20180918020726___m_y_add_minimum_security_8cs_source.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180918020726_MYAddMinimumSecurity.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20180918020726_MYAddMinimumSecurity.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore.Migrations;
2 using System;
4 
6 {
10  public partial class MYAddMinimumSecurity : Migration
11  {
16  protected override void Up(MigrationBuilder migrationBuilder)
17  {
18  if (migrationBuilder == null)
19  throw new ArgumentNullException(nameof(migrationBuilder));
20 
21  migrationBuilder.AddColumn<int>(
22  name: "ApiValidationSecurityLevel",
23  table: "DreamMakerSettings",
24  nullable: false,
25  defaultValue: (int)DreamDaemonSecurity.Safe);
26 
27  migrationBuilder.AddColumn<int>(
28  name: "MinimumSecurityLevel",
29  table: "CompileJobs",
30  nullable: false,
31  defaultValue: (int)DreamDaemonSecurity.Safe);
32  }
33 
38  protected override void Down(MigrationBuilder migrationBuilder)
39  {
40  if (migrationBuilder == null)
41  throw new ArgumentNullException(nameof(migrationBuilder));
42 
43  migrationBuilder.DropColumn(
44  name: "ApiValidationSecurityLevel",
45  table: "DreamMakerSettings");
46 
47  migrationBuilder.DropColumn(
48  name: "MinimumSecurityLevel",
49  table: "CompileJobs");
50  }
51  }
52 }
override void Down(MigrationBuilder migrationBuilder)
Unapplies the migration
+ + +
Add the Api.Models.Internal.CompileJob.MinimumSecurityLevel and DreamMaker.ApiValidationSecurityLevel...
+ + + +
DreamDaemonSecurity
DreamDaemon's security level
+ +
override void Up(MigrationBuilder migrationBuilder)
Applies the migration
+
+ + + + diff --git a/20180918021228___m_s_add_minimum_security_8_designer_8cs.html b/20180918021228___m_s_add_minimum_security_8_designer_8cs.html new file mode 100644 index 0000000000..9a5278e928 --- /dev/null +++ b/20180918021228___m_s_add_minimum_security_8_designer_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.Designer.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20180918021228_MSAddMinimumSecurity.Designer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity
 Add the Api.Models.Internal.CompileJob.MinimumSecurityLevel and DreamMaker.ApiValidationSecurityLevel columns for MSSQL More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + 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 new file mode 100644 index 0000000000..5ac1258774 --- /dev/null +++ b/20180918021228___m_s_add_minimum_security_8_designer_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.Designer.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20180918021228_MSAddMinimumSecurity.Designer.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated />
2 using System;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.EntityFrameworkCore.Infrastructure;
5 using Microsoft.EntityFrameworkCore.Metadata;
6 using Microsoft.EntityFrameworkCore.Migrations;
7 using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
8 
10 {
11  [DbContext(typeof(SqlServerDatabaseContext))]
12  [Migration("20180918021228_MSAddMinimumSecurity")]
13  partial class MSAddMinimumSecurity
14  {
19  protected override void BuildTargetModel(ModelBuilder modelBuilder)
20  {
21 #pragma warning disable 612, 618
22  modelBuilder
23  .HasAnnotation("ProductVersion", "2.1.3-rtm-32065")
24  .HasAnnotation("Relational:MaxIdentifierLength", 128)
25  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
26 
27  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
28  {
29  b.Property<long>("Id")
30  .ValueGeneratedOnAdd()
31  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
32 
33  b.Property<string>("ConnectionString")
34  .IsRequired();
35 
36  b.Property<bool?>("Enabled");
37 
38  b.Property<long>("InstanceId");
39 
40  b.Property<string>("Name")
41  .IsRequired();
42 
43  b.Property<int?>("Provider");
44 
45  b.HasKey("Id");
46 
47  b.HasIndex("InstanceId");
48 
49  b.HasIndex("Name")
50  .IsUnique();
51 
52  b.ToTable("ChatBots");
53  });
54 
55  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
56  {
57  b.Property<long>("Id")
58  .ValueGeneratedOnAdd()
59  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
60 
61  b.Property<long>("ChatSettingsId");
62 
63  b.Property<decimal?>("DiscordChannelId")
64  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
65 
66  b.Property<string>("IrcChannel");
67 
68  b.Property<bool?>("IsAdminChannel")
69  .IsRequired();
70 
71  b.Property<bool?>("IsUpdatesChannel")
72  .IsRequired();
73 
74  b.Property<bool?>("IsWatchdogChannel")
75  .IsRequired();
76 
77  b.Property<string>("Tag");
78 
79  b.HasKey("Id");
80 
81  b.HasIndex("ChatSettingsId", "DiscordChannelId")
82  .IsUnique()
83  .HasFilter("[DiscordChannelId] IS NOT NULL");
84 
85  b.HasIndex("ChatSettingsId", "IrcChannel")
86  .IsUnique()
87  .HasFilter("[IrcChannel] IS NOT NULL");
88 
89  b.ToTable("ChatChannels");
90  });
91 
92  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
93  {
94  b.Property<long>("Id")
95  .ValueGeneratedOnAdd()
96  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
97 
98  b.Property<string>("ByondVersion")
99  .IsRequired();
100 
101  b.Property<Guid?>("DirectoryName");
102 
103  b.Property<string>("DmeName");
104 
105  b.Property<long?>("JobId");
106 
107  b.Property<int>("MinimumSecurityLevel");
108 
109  b.Property<string>("Output");
110 
111  b.Property<long>("RevisionInformationId");
112 
113  b.HasKey("Id");
114 
115  b.HasIndex("DirectoryName");
116 
117  b.HasIndex("JobId");
118 
119  b.HasIndex("RevisionInformationId");
120 
121  b.ToTable("CompileJobs");
122  });
123 
124  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
125  {
126  b.Property<long>("Id")
127  .ValueGeneratedOnAdd()
128  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
129 
130  b.Property<string>("AccessToken");
131 
132  b.Property<bool?>("AllowWebClient")
133  .IsRequired();
134 
135  b.Property<bool?>("AutoStart")
136  .IsRequired();
137 
138  b.Property<long>("InstanceId");
139 
140  b.Property<int>("PrimaryPort");
141 
142  b.Property<int?>("ProcessId");
143 
144  b.Property<int>("SecondaryPort");
145 
146  b.Property<int>("SecurityLevel");
147 
148  b.Property<bool?>("SoftRestart")
149  .IsRequired();
150 
151  b.Property<bool?>("SoftShutdown")
152  .IsRequired();
153 
154  b.Property<long>("StartupTimeout");
155 
156  b.HasKey("Id");
157 
158  b.HasIndex("InstanceId")
159  .IsUnique();
160 
161  b.ToTable("DreamDaemonSettings");
162  });
163 
164  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
165  {
166  b.Property<long>("Id")
167  .ValueGeneratedOnAdd()
168  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
169 
170  b.Property<int>("ApiValidationPort");
171 
172  b.Property<int>("ApiValidationSecurityLevel");
173 
174  b.Property<long>("InstanceId");
175 
176  b.Property<string>("ProjectName");
177 
178  b.HasKey("Id");
179 
180  b.HasIndex("InstanceId")
181  .IsUnique();
182 
183  b.ToTable("DreamMakerSettings");
184  });
185 
186  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
187  {
188  b.Property<long>("Id")
189  .ValueGeneratedOnAdd()
190  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
191 
192  b.Property<long>("AutoUpdateInterval");
193 
194  b.Property<int>("ConfigurationType");
195 
196  b.Property<string>("Name")
197  .IsRequired();
198 
199  b.Property<bool?>("Online")
200  .IsRequired();
201 
202  b.Property<string>("Path")
203  .IsRequired();
204 
205  b.Property<long?>("WatchdogReattachInformationId");
206 
207  b.HasKey("Id");
208 
209  b.HasIndex("Path")
210  .IsUnique();
211 
212  b.HasIndex("WatchdogReattachInformationId");
213 
214  b.ToTable("Instances");
215  });
216 
217  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
218  {
219  b.Property<long>("Id")
220  .ValueGeneratedOnAdd()
221  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
222 
223  b.Property<decimal>("ByondRights")
224  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
225 
226  b.Property<decimal>("ChatBotRights")
227  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
228 
229  b.Property<decimal>("ConfigurationRights")
230  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
231 
232  b.Property<decimal>("DreamDaemonRights")
233  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
234 
235  b.Property<decimal>("DreamMakerRights")
236  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
237 
238  b.Property<long>("InstanceId");
239 
240  b.Property<decimal>("InstanceUserRights")
241  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
242 
243  b.Property<decimal>("RepositoryRights")
244  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
245 
246  b.Property<long?>("UserId")
247  .IsRequired();
248 
249  b.HasKey("Id");
250 
251  b.HasIndex("InstanceId");
252 
253  b.HasIndex("UserId", "InstanceId")
254  .IsUnique();
255 
256  b.ToTable("InstanceUsers");
257  });
258 
259  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
260  {
261  b.Property<long>("Id")
262  .ValueGeneratedOnAdd()
263  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
264 
265  b.Property<decimal?>("CancelRight")
266  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
267 
268  b.Property<decimal?>("CancelRightsType")
269  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
270 
271  b.Property<bool?>("Cancelled")
272  .IsRequired();
273 
274  b.Property<long?>("CancelledById");
275 
276  b.Property<string>("Description")
277  .IsRequired();
278 
279  b.Property<string>("ExceptionDetails");
280 
281  b.Property<long>("InstanceId");
282 
283  b.Property<DateTimeOffset?>("StartedAt")
284  .IsRequired();
285 
286  b.Property<long>("StartedById");
287 
288  b.Property<DateTimeOffset?>("StoppedAt");
289 
290  b.HasKey("Id");
291 
292  b.HasIndex("CancelledById");
293 
294  b.HasIndex("InstanceId");
295 
296  b.HasIndex("StartedById");
297 
298  b.ToTable("Jobs");
299  });
300 
301  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
302  {
303  b.Property<long>("Id")
304  .ValueGeneratedOnAdd()
305  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
306 
307  b.Property<string>("AccessIdentifier")
308  .IsRequired();
309 
310  b.Property<string>("ChatChannelsJson")
311  .IsRequired();
312 
313  b.Property<string>("ChatCommandsJson")
314  .IsRequired();
315 
316  b.Property<long?>("CompileJobId");
317 
318  b.Property<bool>("IsPrimary");
319 
320  b.Property<int>("Port");
321 
322  b.Property<int>("ProcessId");
323 
324  b.Property<int>("RebootState");
325 
326  b.Property<string>("ServerCommandsJson")
327  .IsRequired();
328 
329  b.HasKey("Id");
330 
331  b.HasIndex("CompileJobId");
332 
333  b.ToTable("ReattachInformations");
334  });
335 
336  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
337  {
338  b.Property<long>("Id")
339  .ValueGeneratedOnAdd()
340  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
341 
342  b.Property<string>("AccessToken");
343 
344  b.Property<string>("AccessUser");
345 
346  b.Property<bool?>("AutoUpdatesKeepTestMerges")
347  .IsRequired();
348 
349  b.Property<bool?>("AutoUpdatesSynchronize")
350  .IsRequired();
351 
352  b.Property<string>("CommitterEmail")
353  .IsRequired();
354 
355  b.Property<string>("CommitterName")
356  .IsRequired();
357 
358  b.Property<long>("InstanceId");
359 
360  b.Property<bool?>("PushTestMergeCommits")
361  .IsRequired();
362 
363  b.Property<bool?>("ShowTestMergeCommitters")
364  .IsRequired();
365 
366  b.HasKey("Id");
367 
368  b.HasIndex("InstanceId")
369  .IsUnique();
370 
371  b.ToTable("RepositorySettings");
372  });
373 
374  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
375  {
376  b.Property<long>("Id")
377  .ValueGeneratedOnAdd()
378  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
379 
380  b.Property<long>("RevisionInformationId");
381 
382  b.Property<long>("TestMergeId");
383 
384  b.HasKey("Id");
385 
386  b.HasIndex("RevisionInformationId");
387 
388  b.HasIndex("TestMergeId");
389 
390  b.ToTable("RevInfoTestMerges");
391  });
392 
393  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
394  {
395  b.Property<long>("Id")
396  .ValueGeneratedOnAdd()
397  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
398 
399  b.Property<string>("CommitSha")
400  .IsRequired()
401  .HasMaxLength(40);
402 
403  b.Property<long>("InstanceId");
404 
405  b.Property<string>("OriginCommitSha")
406  .IsRequired()
407  .HasMaxLength(40);
408 
409  b.HasKey("Id");
410 
411  b.HasIndex("CommitSha")
412  .IsUnique();
413 
414  b.HasIndex("InstanceId");
415 
416  b.ToTable("RevisionInformations");
417  });
418 
419  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
420  {
421  b.Property<long>("Id")
422  .ValueGeneratedOnAdd()
423  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
424 
425  b.Property<string>("Author")
426  .IsRequired();
427 
428  b.Property<string>("BodyAtMerge")
429  .IsRequired();
430 
431  b.Property<string>("Comment");
432 
433  b.Property<DateTimeOffset>("MergedAt");
434 
435  b.Property<long>("MergedById");
436 
437  b.Property<int?>("Number")
438  .IsRequired();
439 
440  b.Property<long?>("PrimaryRevisionInformationId");
441 
442  b.Property<string>("PullRequestRevision")
443  .IsRequired();
444 
445  b.Property<string>("TitleAtMerge")
446  .IsRequired();
447 
448  b.Property<string>("Url")
449  .IsRequired();
450 
451  b.HasKey("Id");
452 
453  b.HasIndex("MergedById");
454 
455  b.HasIndex("PrimaryRevisionInformationId")
456  .IsUnique()
457  .HasFilter("[PrimaryRevisionInformationId] IS NOT NULL");
458 
459  b.ToTable("TestMerges");
460  });
461 
462  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
463  {
464  b.Property<long>("Id")
465  .ValueGeneratedOnAdd()
466  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
467 
468  b.Property<decimal>("AdministrationRights")
469  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
470 
471  b.Property<string>("CanonicalName")
472  .IsRequired();
473 
474  b.Property<DateTimeOffset?>("CreatedAt")
475  .IsRequired();
476 
477  b.Property<long?>("CreatedById");
478 
479  b.Property<bool?>("Enabled")
480  .IsRequired();
481 
482  b.Property<decimal>("InstanceManagerRights")
483  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
484 
485  b.Property<DateTimeOffset?>("LastPasswordUpdate");
486 
487  b.Property<string>("Name")
488  .IsRequired();
489 
490  b.Property<string>("PasswordHash");
491 
492  b.Property<string>("SystemIdentifier");
493 
494  b.HasKey("Id");
495 
496  b.HasIndex("CanonicalName")
497  .IsUnique();
498 
499  b.HasIndex("CreatedById");
500 
501  b.ToTable("Users");
502  });
503 
504  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
505  {
506  b.Property<long>("Id")
507  .ValueGeneratedOnAdd()
508  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
509 
510  b.Property<long?>("AlphaId");
511 
512  b.Property<bool>("AlphaIsActive");
513 
514  b.Property<long?>("BravoId");
515 
516  b.HasKey("Id");
517 
518  b.HasIndex("AlphaId");
519 
520  b.HasIndex("BravoId");
521 
522  b.ToTable("WatchdogReattachInformations");
523  });
524 
525  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
526  {
527  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
528  .WithMany("ChatSettings")
529  .HasForeignKey("InstanceId")
530  .OnDelete(DeleteBehavior.Cascade);
531  });
532 
533  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
534  {
535  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
536  .WithMany("Channels")
537  .HasForeignKey("ChatSettingsId")
538  .OnDelete(DeleteBehavior.Cascade);
539  });
540 
541  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
542  {
543  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
544  .WithMany()
545  .HasForeignKey("JobId");
546 
547  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
548  .WithMany("CompileJobs")
549  .HasForeignKey("RevisionInformationId")
550  .OnDelete(DeleteBehavior.Cascade);
551  });
552 
553  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
554  {
555  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
556  .WithOne("DreamDaemonSettings")
557  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
558  .OnDelete(DeleteBehavior.Cascade);
559  });
560 
561  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
562  {
563  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
564  .WithOne("DreamMakerSettings")
565  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
566  .OnDelete(DeleteBehavior.Cascade);
567  });
568 
569  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
570  {
571  b.HasOne("Tgstation.Server.Host.Models.WatchdogReattachInformation", "WatchdogReattachInformation")
572  .WithMany()
573  .HasForeignKey("WatchdogReattachInformationId");
574  });
575 
576  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
577  {
578  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
579  .WithMany("InstanceUsers")
580  .HasForeignKey("InstanceId")
581  .OnDelete(DeleteBehavior.Cascade);
582 
583  b.HasOne("Tgstation.Server.Host.Models.User")
584  .WithMany("InstanceUsers")
585  .HasForeignKey("UserId")
586  .OnDelete(DeleteBehavior.Cascade);
587  });
588 
589  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
590  {
591  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
592  .WithMany()
593  .HasForeignKey("CancelledById");
594 
595  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
596  .WithMany("Jobs")
597  .HasForeignKey("InstanceId")
598  .OnDelete(DeleteBehavior.Cascade);
599 
600  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
601  .WithMany()
602  .HasForeignKey("StartedById")
603  .OnDelete(DeleteBehavior.Cascade);
604  });
605 
606  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
607  {
608  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
609  .WithMany()
610  .HasForeignKey("CompileJobId");
611  });
612 
613  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
614  {
615  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
616  .WithOne("RepositorySettings")
617  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
618  .OnDelete(DeleteBehavior.Cascade);
619  });
620 
621  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
622  {
623  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
624  .WithMany("ActiveTestMerges")
625  .HasForeignKey("RevisionInformationId")
626  .OnDelete(DeleteBehavior.Cascade);
627 
628  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
629  .WithMany("RevisonInformations")
630  .HasForeignKey("TestMergeId")
631  .OnDelete(DeleteBehavior.Cascade);
632  });
633 
634  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
635  {
636  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
637  .WithMany("RevisionInformations")
638  .HasForeignKey("InstanceId")
639  .OnDelete(DeleteBehavior.Cascade);
640  });
641 
642  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
643  {
644  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
645  .WithMany("TestMerges")
646  .HasForeignKey("MergedById")
647  .OnDelete(DeleteBehavior.Restrict);
648 
649  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
650  .WithOne("PrimaryTestMerge")
651  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
652  .OnDelete(DeleteBehavior.SetNull);
653  });
654 
655  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
656  {
657  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
658  .WithMany("CreatedUsers")
659  .HasForeignKey("CreatedById");
660  });
661 
662  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
663  {
664  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
665  .WithMany()
666  .HasForeignKey("AlphaId");
667 
668  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
669  .WithMany()
670  .HasForeignKey("BravoId");
671  });
672 #pragma warning restore 612, 618
673  }
674  }
675 }
+ + +
override void BuildTargetModel(ModelBuilder modelBuilder)
Builds the target model
+
+ + + + diff --git a/20180918021228___m_s_add_minimum_security_8cs.html b/20180918021228___m_s_add_minimum_security_8cs.html new file mode 100644 index 0000000000..3ae5a6d744 --- /dev/null +++ b/20180918021228___m_s_add_minimum_security_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20180918021228_MSAddMinimumSecurity.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity
 Add the Api.Models.Internal.CompileJob.MinimumSecurityLevel and DreamMaker.ApiValidationSecurityLevel columns for MSSQL More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + diff --git a/20180918021228___m_s_add_minimum_security_8cs_source.html b/20180918021228___m_s_add_minimum_security_8cs_source.html new file mode 100644 index 0000000000..1335a4d8d9 --- /dev/null +++ b/20180918021228___m_s_add_minimum_security_8cs_source.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180918021228_MSAddMinimumSecurity.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20180918021228_MSAddMinimumSecurity.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore.Migrations;
2 using System;
4 
6 {
10  public partial class MSAddMinimumSecurity : Migration
11  {
16  protected override void Up(MigrationBuilder migrationBuilder)
17  {
18  if (migrationBuilder == null)
19  throw new ArgumentNullException(nameof(migrationBuilder));
20 
21  migrationBuilder.AddColumn<int>(
22  name: "ApiValidationSecurityLevel",
23  table: "DreamMakerSettings",
24  nullable: false,
25  defaultValue: (int)DreamDaemonSecurity.Safe);
26 
27  migrationBuilder.AddColumn<int>(
28  name: "MinimumSecurityLevel",
29  table: "CompileJobs",
30  nullable: false,
31  defaultValue: (int)DreamDaemonSecurity.Safe);
32  }
33 
38  protected override void Down(MigrationBuilder migrationBuilder)
39  {
40  if (migrationBuilder == null)
41  throw new ArgumentNullException(nameof(migrationBuilder));
42 
43  migrationBuilder.DropColumn(
44  name: "ApiValidationSecurityLevel",
45  table: "DreamMakerSettings");
46 
47  migrationBuilder.DropColumn(
48  name: "MinimumSecurityLevel",
49  table: "CompileJobs");
50  }
51  }
52 }
+
override void Down(MigrationBuilder migrationBuilder)
Unapplies the migration
+ + + +
Add the Api.Models.Internal.CompileJob.MinimumSecurityLevel and DreamMaker.ApiValidationSecurityLevel...
+ +
override void Up(MigrationBuilder migrationBuilder)
Applies the migration
+
DreamDaemonSecurity
DreamDaemon's security level
+ +
+ + + + 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 new file mode 100644 index 0000000000..f8d140926b --- /dev/null +++ b/20180918204520___m_y_nullable_and_foreign_key_cleanup_8_designer_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180918204520_MYNullableAndForeignKeyCleanup.Designer.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20180918204520_MYNullableAndForeignKeyCleanup.Designer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup
 Cleans up of nullable columns and foreign keys MySQL/MariaDB More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + 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 new file mode 100644 index 0000000000..130d0d7750 --- /dev/null +++ b/20180918204520___m_y_nullable_and_foreign_key_cleanup_8_designer_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180918204520_MYNullableAndForeignKeyCleanup.Designer.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20180918204520_MYNullableAndForeignKeyCleanup.Designer.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated />
2 using System;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.EntityFrameworkCore.Infrastructure;
5 using Microsoft.EntityFrameworkCore.Migrations;
6 
8 {
9  [DbContext(typeof(MySqlDatabaseContext))]
10  [Migration("20180918204520_MYNullableAndForeignKeyCleanup")]
11  partial class MYNullableAndForeignKeyCleanup
12  {
17  protected override void BuildTargetModel(ModelBuilder modelBuilder)
18  {
19 #pragma warning disable 612, 618
20  modelBuilder
21  .HasAnnotation("ProductVersion", "2.1.3-rtm-32065")
22  .HasAnnotation("Relational:MaxIdentifierLength", 64);
23 
24  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
25  {
26  b.Property<long>("Id")
27  .ValueGeneratedOnAdd();
28 
29  b.Property<string>("ConnectionString")
30  .IsRequired();
31 
32  b.Property<bool?>("Enabled");
33 
34  b.Property<long>("InstanceId");
35 
36  b.Property<string>("Name")
37  .IsRequired();
38 
39  b.Property<int?>("Provider");
40 
41  b.HasKey("Id");
42 
43  b.HasIndex("InstanceId");
44 
45  b.HasIndex("Name")
46  .IsUnique();
47 
48  b.ToTable("ChatBots");
49  });
50 
51  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
52  {
53  b.Property<long>("Id")
54  .ValueGeneratedOnAdd();
55 
56  b.Property<long>("ChatSettingsId");
57 
58  b.Property<ulong?>("DiscordChannelId");
59 
60  b.Property<string>("IrcChannel");
61 
62  b.Property<bool?>("IsAdminChannel")
63  .IsRequired();
64 
65  b.Property<bool?>("IsUpdatesChannel")
66  .IsRequired();
67 
68  b.Property<bool?>("IsWatchdogChannel")
69  .IsRequired();
70 
71  b.Property<string>("Tag");
72 
73  b.HasKey("Id");
74 
75  b.HasIndex("ChatSettingsId", "DiscordChannelId")
76  .IsUnique();
77 
78  b.HasIndex("ChatSettingsId", "IrcChannel")
79  .IsUnique();
80 
81  b.ToTable("ChatChannels");
82  });
83 
84  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
85  {
86  b.Property<long>("Id")
87  .ValueGeneratedOnAdd();
88 
89  b.Property<string>("ByondVersion")
90  .IsRequired();
91 
92  b.Property<Guid?>("DirectoryName")
93  .IsRequired();
94 
95  b.Property<string>("DmeName")
96  .IsRequired();
97 
98  b.Property<long>("JobId");
99 
100  b.Property<int>("MinimumSecurityLevel");
101 
102  b.Property<string>("Output")
103  .IsRequired();
104 
105  b.Property<long>("RevisionInformationId");
106 
107  b.HasKey("Id");
108 
109  b.HasIndex("DirectoryName");
110 
111  b.HasIndex("JobId")
112  .IsUnique();
113 
114  b.HasIndex("RevisionInformationId");
115 
116  b.ToTable("CompileJobs");
117  });
118 
119  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
120  {
121  b.Property<long>("Id")
122  .ValueGeneratedOnAdd();
123 
124  b.Property<string>("AccessToken");
125 
126  b.Property<bool?>("AllowWebClient")
127  .IsRequired();
128 
129  b.Property<bool?>("AutoStart")
130  .IsRequired();
131 
132  b.Property<long>("InstanceId");
133 
134  b.Property<ushort?>("PrimaryPort")
135  .IsRequired();
136 
137  b.Property<int?>("ProcessId");
138 
139  b.Property<ushort?>("SecondaryPort")
140  .IsRequired();
141 
142  b.Property<int>("SecurityLevel");
143 
144  b.Property<bool?>("SoftRestart")
145  .IsRequired();
146 
147  b.Property<bool?>("SoftShutdown")
148  .IsRequired();
149 
150  b.Property<uint?>("StartupTimeout")
151  .IsRequired();
152 
153  b.HasKey("Id");
154 
155  b.HasIndex("InstanceId")
156  .IsUnique();
157 
158  b.ToTable("DreamDaemonSettings");
159  });
160 
161  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
162  {
163  b.Property<long>("Id")
164  .ValueGeneratedOnAdd();
165 
166  b.Property<ushort?>("ApiValidationPort")
167  .IsRequired();
168 
169  b.Property<int>("ApiValidationSecurityLevel");
170 
171  b.Property<long>("InstanceId");
172 
173  b.Property<string>("ProjectName");
174 
175  b.HasKey("Id");
176 
177  b.HasIndex("InstanceId")
178  .IsUnique();
179 
180  b.ToTable("DreamMakerSettings");
181  });
182 
183  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
184  {
185  b.Property<long>("Id")
186  .ValueGeneratedOnAdd();
187 
188  b.Property<uint?>("AutoUpdateInterval")
189  .IsRequired();
190 
191  b.Property<int>("ConfigurationType");
192 
193  b.Property<string>("Name")
194  .IsRequired();
195 
196  b.Property<bool?>("Online")
197  .IsRequired();
198 
199  b.Property<string>("Path")
200  .IsRequired();
201 
202  b.HasKey("Id");
203 
204  b.HasIndex("Path")
205  .IsUnique();
206 
207  b.ToTable("Instances");
208  });
209 
210  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
211  {
212  b.Property<long>("Id")
213  .ValueGeneratedOnAdd();
214 
215  b.Property<ulong>("ByondRights");
216 
217  b.Property<ulong>("ChatBotRights");
218 
219  b.Property<ulong>("ConfigurationRights");
220 
221  b.Property<ulong>("DreamDaemonRights");
222 
223  b.Property<ulong>("DreamMakerRights");
224 
225  b.Property<long>("InstanceId");
226 
227  b.Property<ulong>("InstanceUserRights");
228 
229  b.Property<ulong>("RepositoryRights");
230 
231  b.Property<long?>("UserId")
232  .IsRequired();
233 
234  b.HasKey("Id");
235 
236  b.HasIndex("InstanceId");
237 
238  b.HasIndex("UserId", "InstanceId")
239  .IsUnique();
240 
241  b.ToTable("InstanceUsers");
242  });
243 
244  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
245  {
246  b.Property<long>("Id")
247  .ValueGeneratedOnAdd();
248 
249  b.Property<ulong?>("CancelRight");
250 
251  b.Property<ulong?>("CancelRightsType");
252 
253  b.Property<bool?>("Cancelled")
254  .IsRequired();
255 
256  b.Property<long?>("CancelledById");
257 
258  b.Property<string>("Description")
259  .IsRequired();
260 
261  b.Property<string>("ExceptionDetails");
262 
263  b.Property<long>("InstanceId");
264 
265  b.Property<DateTimeOffset?>("StartedAt")
266  .IsRequired();
267 
268  b.Property<long>("StartedById");
269 
270  b.Property<DateTimeOffset?>("StoppedAt");
271 
272  b.HasKey("Id");
273 
274  b.HasIndex("CancelledById");
275 
276  b.HasIndex("InstanceId");
277 
278  b.HasIndex("StartedById");
279 
280  b.ToTable("Jobs");
281  });
282 
283  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
284  {
285  b.Property<long>("Id")
286  .ValueGeneratedOnAdd();
287 
288  b.Property<string>("AccessIdentifier")
289  .IsRequired();
290 
291  b.Property<string>("ChatChannelsJson")
292  .IsRequired();
293 
294  b.Property<string>("ChatCommandsJson")
295  .IsRequired();
296 
297  b.Property<long?>("CompileJobId");
298 
299  b.Property<bool>("IsPrimary");
300 
301  b.Property<ushort>("Port");
302 
303  b.Property<int>("ProcessId");
304 
305  b.Property<int>("RebootState");
306 
307  b.Property<string>("ServerCommandsJson")
308  .IsRequired();
309 
310  b.HasKey("Id");
311 
312  b.HasIndex("CompileJobId");
313 
314  b.ToTable("ReattachInformations");
315  });
316 
317  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
318  {
319  b.Property<long>("Id")
320  .ValueGeneratedOnAdd();
321 
322  b.Property<string>("AccessToken");
323 
324  b.Property<string>("AccessUser");
325 
326  b.Property<bool?>("AutoUpdatesKeepTestMerges")
327  .IsRequired();
328 
329  b.Property<bool?>("AutoUpdatesSynchronize")
330  .IsRequired();
331 
332  b.Property<string>("CommitterEmail")
333  .IsRequired();
334 
335  b.Property<string>("CommitterName")
336  .IsRequired();
337 
338  b.Property<long>("InstanceId");
339 
340  b.Property<bool?>("PushTestMergeCommits")
341  .IsRequired();
342 
343  b.Property<bool?>("ShowTestMergeCommitters")
344  .IsRequired();
345 
346  b.HasKey("Id");
347 
348  b.HasIndex("InstanceId")
349  .IsUnique();
350 
351  b.ToTable("RepositorySettings");
352  });
353 
354  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
355  {
356  b.Property<long>("Id")
357  .ValueGeneratedOnAdd();
358 
359  b.Property<long>("RevisionInformationId");
360 
361  b.Property<long>("TestMergeId");
362 
363  b.HasKey("Id");
364 
365  b.HasIndex("RevisionInformationId");
366 
367  b.HasIndex("TestMergeId");
368 
369  b.ToTable("RevInfoTestMerges");
370  });
371 
372  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
373  {
374  b.Property<long>("Id")
375  .ValueGeneratedOnAdd();
376 
377  b.Property<string>("CommitSha")
378  .IsRequired()
379  .HasMaxLength(40);
380 
381  b.Property<long>("InstanceId");
382 
383  b.Property<string>("OriginCommitSha")
384  .IsRequired()
385  .HasMaxLength(40);
386 
387  b.HasKey("Id");
388 
389  b.HasIndex("CommitSha")
390  .IsUnique();
391 
392  b.HasIndex("InstanceId");
393 
394  b.ToTable("RevisionInformations");
395  });
396 
397  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
398  {
399  b.Property<long>("Id")
400  .ValueGeneratedOnAdd();
401 
402  b.Property<string>("Author")
403  .IsRequired();
404 
405  b.Property<string>("BodyAtMerge")
406  .IsRequired();
407 
408  b.Property<string>("Comment");
409 
410  b.Property<DateTimeOffset>("MergedAt");
411 
412  b.Property<long>("MergedById");
413 
414  b.Property<int?>("Number")
415  .IsRequired();
416 
417  b.Property<long?>("PrimaryRevisionInformationId")
418  .IsRequired();
419 
420  b.Property<string>("PullRequestRevision")
421  .IsRequired();
422 
423  b.Property<string>("TitleAtMerge")
424  .IsRequired();
425 
426  b.Property<string>("Url")
427  .IsRequired();
428 
429  b.HasKey("Id");
430 
431  b.HasIndex("MergedById");
432 
433  b.HasIndex("PrimaryRevisionInformationId")
434  .IsUnique();
435 
436  b.ToTable("TestMerges");
437  });
438 
439  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
440  {
441  b.Property<long>("Id")
442  .ValueGeneratedOnAdd();
443 
444  b.Property<ulong>("AdministrationRights");
445 
446  b.Property<string>("CanonicalName")
447  .IsRequired();
448 
449  b.Property<DateTimeOffset?>("CreatedAt")
450  .IsRequired();
451 
452  b.Property<long?>("CreatedById");
453 
454  b.Property<bool?>("Enabled")
455  .IsRequired();
456 
457  b.Property<ulong>("InstanceManagerRights");
458 
459  b.Property<DateTimeOffset?>("LastPasswordUpdate");
460 
461  b.Property<string>("Name")
462  .IsRequired();
463 
464  b.Property<string>("PasswordHash");
465 
466  b.Property<string>("SystemIdentifier");
467 
468  b.HasKey("Id");
469 
470  b.HasIndex("CanonicalName")
471  .IsUnique();
472 
473  b.HasIndex("CreatedById");
474 
475  b.ToTable("Users");
476  });
477 
478  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
479  {
480  b.Property<long>("Id")
481  .ValueGeneratedOnAdd();
482 
483  b.Property<long?>("AlphaId");
484 
485  b.Property<bool>("AlphaIsActive");
486 
487  b.Property<long?>("BravoId");
488 
489  b.Property<long>("InstanceId");
490 
491  b.HasKey("Id");
492 
493  b.HasIndex("AlphaId");
494 
495  b.HasIndex("BravoId");
496 
497  b.HasIndex("InstanceId")
498  .IsUnique();
499 
500  b.ToTable("WatchdogReattachInformations");
501  });
502 
503  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
504  {
505  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
506  .WithMany("ChatSettings")
507  .HasForeignKey("InstanceId")
508  .OnDelete(DeleteBehavior.Cascade);
509  });
510 
511  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
512  {
513  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
514  .WithMany("Channels")
515  .HasForeignKey("ChatSettingsId")
516  .OnDelete(DeleteBehavior.Cascade);
517  });
518 
519  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
520  {
521  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
522  .WithOne()
523  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
524  .OnDelete(DeleteBehavior.Restrict);
525 
526  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
527  .WithMany("CompileJobs")
528  .HasForeignKey("RevisionInformationId")
529  .OnDelete(DeleteBehavior.Cascade);
530  });
531 
532  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
533  {
534  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
535  .WithOne("DreamDaemonSettings")
536  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
537  .OnDelete(DeleteBehavior.Cascade);
538  });
539 
540  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
541  {
542  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
543  .WithOne("DreamMakerSettings")
544  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
545  .OnDelete(DeleteBehavior.Cascade);
546  });
547 
548  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
549  {
550  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
551  .WithMany("InstanceUsers")
552  .HasForeignKey("InstanceId")
553  .OnDelete(DeleteBehavior.Cascade);
554 
555  b.HasOne("Tgstation.Server.Host.Models.User")
556  .WithMany("InstanceUsers")
557  .HasForeignKey("UserId")
558  .OnDelete(DeleteBehavior.Cascade);
559  });
560 
561  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
562  {
563  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
564  .WithMany()
565  .HasForeignKey("CancelledById");
566 
567  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
568  .WithMany("Jobs")
569  .HasForeignKey("InstanceId")
570  .OnDelete(DeleteBehavior.Cascade);
571 
572  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
573  .WithMany()
574  .HasForeignKey("StartedById")
575  .OnDelete(DeleteBehavior.Cascade);
576  });
577 
578  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
579  {
580  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
581  .WithMany()
582  .HasForeignKey("CompileJobId");
583  });
584 
585  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
586  {
587  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
588  .WithOne("RepositorySettings")
589  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
590  .OnDelete(DeleteBehavior.Cascade);
591  });
592 
593  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
594  {
595  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
596  .WithMany("ActiveTestMerges")
597  .HasForeignKey("RevisionInformationId")
598  .OnDelete(DeleteBehavior.Cascade);
599 
600  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
601  .WithMany("RevisonInformations")
602  .HasForeignKey("TestMergeId")
603  .OnDelete(DeleteBehavior.Cascade);
604  });
605 
606  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
607  {
608  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
609  .WithMany("RevisionInformations")
610  .HasForeignKey("InstanceId")
611  .OnDelete(DeleteBehavior.Cascade);
612  });
613 
614  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
615  {
616  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
617  .WithMany("TestMerges")
618  .HasForeignKey("MergedById")
619  .OnDelete(DeleteBehavior.Restrict);
620 
621  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
622  .WithOne("PrimaryTestMerge")
623  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
624  .OnDelete(DeleteBehavior.Restrict);
625  });
626 
627  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
628  {
629  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
630  .WithMany("CreatedUsers")
631  .HasForeignKey("CreatedById");
632  });
633 
634  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
635  {
636  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
637  .WithMany()
638  .HasForeignKey("AlphaId");
639 
640  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
641  .WithMany()
642  .HasForeignKey("BravoId");
643 
644  b.HasOne("Tgstation.Server.Host.Models.Instance")
645  .WithOne("WatchdogReattachInformation")
646  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
647  .OnDelete(DeleteBehavior.Cascade);
648  });
649 #pragma warning restore 612, 618
650  }
651  }
652 }
+ + + +
+ + + + diff --git a/20180918204520___m_y_nullable_and_foreign_key_cleanup_8cs.html b/20180918204520___m_y_nullable_and_foreign_key_cleanup_8cs.html new file mode 100644 index 0000000000..2bfa31aebf --- /dev/null +++ b/20180918204520___m_y_nullable_and_foreign_key_cleanup_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180918204520_MYNullableAndForeignKeyCleanup.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20180918204520_MYNullableAndForeignKeyCleanup.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup
 Cleans up of nullable columns and foreign keys MySQL/MariaDB More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + 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 new file mode 100644 index 0000000000..887a5d4629 --- /dev/null +++ b/20180918204520___m_y_nullable_and_foreign_key_cleanup_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180918204520_MYNullableAndForeignKeyCleanup.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20180918204520_MYNullableAndForeignKeyCleanup.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using Microsoft.EntityFrameworkCore.Migrations;
3 
5 {
10  {
15  protected override void Up(MigrationBuilder migrationBuilder)
16  {
17  if (migrationBuilder == null)
18  throw new ArgumentNullException(nameof(migrationBuilder));
19 
20  migrationBuilder.DropForeignKey(
21  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInfor~",
22  table: "Instances");
23 
24  migrationBuilder.DropForeignKey(
25  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
26  table: "TestMerges");
27 
28  migrationBuilder.DropForeignKey(
29  name: "FK_CompileJobs_Jobs_JobId",
30  table: "CompileJobs");
31 
32  migrationBuilder.DropIndex(
33  name: "IX_Instances_WatchdogReattachInformationId",
34  table: "Instances");
35 
36  migrationBuilder.DropIndex(
37  name: "IX_CompileJobs_JobId",
38  table: "CompileJobs");
39 
40  migrationBuilder.DropColumn(
41  name: "WatchdogReattachInformationId",
42  table: "Instances");
43 
44  migrationBuilder.AddColumn<long>(
45  name: "InstanceId",
46  table: "WatchdogReattachInformations",
47  nullable: false,
48  defaultValue: 0L);
49 
50  migrationBuilder.AlterColumn<long>(
51  name: "PrimaryRevisionInformationId",
52  table: "TestMerges",
53  nullable: false,
54  oldClrType: typeof(long),
55  oldNullable: true);
56 
57  migrationBuilder.AlterColumn<string>(
58  name: "Output",
59  table: "CompileJobs",
60  nullable: false,
61  oldClrType: typeof(string),
62  oldNullable: true);
63 
64  migrationBuilder.AlterColumn<long>(
65  name: "JobId",
66  table: "CompileJobs",
67  nullable: false,
68  oldClrType: typeof(long),
69  oldNullable: true);
70 
71  migrationBuilder.AlterColumn<string>(
72  name: "DmeName",
73  table: "CompileJobs",
74  nullable: false,
75  oldClrType: typeof(string),
76  oldNullable: true);
77 
78  migrationBuilder.AlterColumn<Guid>(
79  name: "DirectoryName",
80  table: "CompileJobs",
81  nullable: false,
82  oldClrType: typeof(Guid),
83  oldNullable: true);
84 
85  migrationBuilder.CreateIndex(
86  name: "IX_WatchdogReattachInformations_InstanceId",
87  table: "WatchdogReattachInformations",
88  column: "InstanceId",
89  unique: true);
90 
91  migrationBuilder.CreateIndex(
92  name: "IX_CompileJobs_JobId",
93  table: "CompileJobs",
94  column: "JobId",
95  unique: true);
96 
97  migrationBuilder.AddForeignKey(
98  name: "FK_CompileJobs_Jobs_JobId",
99  table: "CompileJobs",
100  column: "JobId",
101  principalTable: "Jobs",
102  principalColumn: "Id",
103  onDelete: ReferentialAction.Restrict);
104 
105  migrationBuilder.AddForeignKey(
106  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
107  table: "TestMerges",
108  column: "PrimaryRevisionInformationId",
109  principalTable: "RevisionInformations",
110  principalColumn: "Id",
111  onDelete: ReferentialAction.Restrict);
112 
113  migrationBuilder.AddForeignKey(
114  name: "FK_WatchdogReattachInformations_Instances_InstanceId",
115  table: "WatchdogReattachInformations",
116  column: "InstanceId",
117  principalTable: "Instances",
118  principalColumn: "Id",
119  onDelete: ReferentialAction.Cascade);
120  }
121 
126  protected override void Down(MigrationBuilder migrationBuilder)
127  {
128  if (migrationBuilder == null)
129  throw new ArgumentNullException(nameof(migrationBuilder));
130 
131  migrationBuilder.DropForeignKey(
132  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
133  table: "TestMerges");
134 
135  migrationBuilder.DropForeignKey(
136  name: "FK_WatchdogReattachInformations_Instances_InstanceId",
137  table: "WatchdogReattachInformations");
138 
139  migrationBuilder.DropForeignKey(
140  name: "FK_CompileJobs_Jobs_JobId",
141  table: "CompileJobs");
142 
143  migrationBuilder.DropIndex(
144  name: "IX_WatchdogReattachInformations_InstanceId",
145  table: "WatchdogReattachInformations");
146 
147  migrationBuilder.DropIndex(
148  name: "IX_CompileJobs_JobId",
149  table: "CompileJobs");
150 
151  migrationBuilder.DropColumn(
152  name: "InstanceId",
153  table: "WatchdogReattachInformations");
154 
155  migrationBuilder.AlterColumn<long>(
156  name: "PrimaryRevisionInformationId",
157  table: "TestMerges",
158  nullable: true,
159  oldClrType: typeof(long));
160 
161  migrationBuilder.AddColumn<long>(
162  name: "WatchdogReattachInformationId",
163  table: "Instances",
164  nullable: true);
165 
166  migrationBuilder.AlterColumn<string>(
167  name: "Output",
168  table: "CompileJobs",
169  nullable: true,
170  oldClrType: typeof(string));
171 
172  migrationBuilder.AlterColumn<long>(
173  name: "JobId",
174  table: "CompileJobs",
175  nullable: true,
176  oldClrType: typeof(long));
177 
178  migrationBuilder.AlterColumn<string>(
179  name: "DmeName",
180  table: "CompileJobs",
181  nullable: true,
182  oldClrType: typeof(string));
183 
184  migrationBuilder.AlterColumn<Guid>(
185  name: "DirectoryName",
186  table: "CompileJobs",
187  nullable: true,
188  oldClrType: typeof(Guid));
189 
190  migrationBuilder.CreateIndex(
191  name: "IX_Instances_WatchdogReattachInformationId",
192  table: "Instances",
193  column: "WatchdogReattachInformationId");
194 
195  migrationBuilder.CreateIndex(
196  name: "IX_CompileJobs_JobId",
197  table: "CompileJobs",
198  column: "JobId");
199 
200  migrationBuilder.AddForeignKey(
201  name: "FK_CompileJobs_Jobs_JobId",
202  table: "CompileJobs",
203  column: "JobId",
204  principalTable: "Jobs",
205  principalColumn: "Id",
206  onDelete: ReferentialAction.Restrict);
207 
208  migrationBuilder.AddForeignKey(
209  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInfor~",
210  table: "Instances",
211  column: "WatchdogReattachInformationId",
212  principalTable: "WatchdogReattachInformations",
213  principalColumn: "Id",
214  onDelete: ReferentialAction.Restrict);
215 
216  migrationBuilder.AddForeignKey(
217  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
218  table: "TestMerges",
219  column: "PrimaryRevisionInformationId",
220  principalTable: "RevisionInformations",
221  principalColumn: "Id",
222  onDelete: ReferentialAction.SetNull);
223  }
224  }
225 }
override void Up(MigrationBuilder migrationBuilder)
Applies the migration
+ + +
override void Down(MigrationBuilder migrationBuilder)
Unapplies the migration
+ +
+ + + + 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 new file mode 100644 index 0000000000..726d33adfd --- /dev/null +++ b/20180918205224___m_s_nullable_and_foreign_key_cleanup_8_designer_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180918205224_MSNullableAndForeignKeyCleanup.Designer.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20180918205224_MSNullableAndForeignKeyCleanup.Designer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup
 Cleans up of nullable columns and foreign keys MSSQL More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + 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 new file mode 100644 index 0000000000..fb346499cb --- /dev/null +++ b/20180918205224___m_s_nullable_and_foreign_key_cleanup_8_designer_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180918205224_MSNullableAndForeignKeyCleanup.Designer.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20180918205224_MSNullableAndForeignKeyCleanup.Designer.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated />
2 using System;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.EntityFrameworkCore.Infrastructure;
5 using Microsoft.EntityFrameworkCore.Metadata;
6 using Microsoft.EntityFrameworkCore.Migrations;
7 using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
8 
10 {
11  [DbContext(typeof(SqlServerDatabaseContext))]
12  [Migration("20180918205224_MSNullableAndForeignKeyCleanup")]
13  partial class MSNullableAndForeignKeyCleanup
14  {
19  protected override void BuildTargetModel(ModelBuilder modelBuilder)
20  {
21 #pragma warning disable 612, 618
22  modelBuilder
23  .HasAnnotation("ProductVersion", "2.1.3-rtm-32065")
24  .HasAnnotation("Relational:MaxIdentifierLength", 128)
25  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
26 
27  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
28  {
29  b.Property<long>("Id")
30  .ValueGeneratedOnAdd()
31  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
32 
33  b.Property<string>("ConnectionString")
34  .IsRequired();
35 
36  b.Property<bool?>("Enabled");
37 
38  b.Property<long>("InstanceId");
39 
40  b.Property<string>("Name")
41  .IsRequired();
42 
43  b.Property<int?>("Provider");
44 
45  b.HasKey("Id");
46 
47  b.HasIndex("InstanceId");
48 
49  b.HasIndex("Name")
50  .IsUnique();
51 
52  b.ToTable("ChatBots");
53  });
54 
55  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
56  {
57  b.Property<long>("Id")
58  .ValueGeneratedOnAdd()
59  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
60 
61  b.Property<long>("ChatSettingsId");
62 
63  b.Property<decimal?>("DiscordChannelId")
64  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
65 
66  b.Property<string>("IrcChannel");
67 
68  b.Property<bool?>("IsAdminChannel")
69  .IsRequired();
70 
71  b.Property<bool?>("IsUpdatesChannel")
72  .IsRequired();
73 
74  b.Property<bool?>("IsWatchdogChannel")
75  .IsRequired();
76 
77  b.Property<string>("Tag");
78 
79  b.HasKey("Id");
80 
81  b.HasIndex("ChatSettingsId", "DiscordChannelId")
82  .IsUnique()
83  .HasFilter("[DiscordChannelId] IS NOT NULL");
84 
85  b.HasIndex("ChatSettingsId", "IrcChannel")
86  .IsUnique()
87  .HasFilter("[IrcChannel] IS NOT NULL");
88 
89  b.ToTable("ChatChannels");
90  });
91 
92  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
93  {
94  b.Property<long>("Id")
95  .ValueGeneratedOnAdd()
96  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
97 
98  b.Property<string>("ByondVersion")
99  .IsRequired();
100 
101  b.Property<Guid?>("DirectoryName")
102  .IsRequired();
103 
104  b.Property<string>("DmeName")
105  .IsRequired();
106 
107  b.Property<long>("JobId");
108 
109  b.Property<int>("MinimumSecurityLevel");
110 
111  b.Property<string>("Output")
112  .IsRequired();
113 
114  b.Property<long>("RevisionInformationId");
115 
116  b.HasKey("Id");
117 
118  b.HasIndex("DirectoryName");
119 
120  b.HasIndex("JobId")
121  .IsUnique();
122 
123  b.HasIndex("RevisionInformationId");
124 
125  b.ToTable("CompileJobs");
126  });
127 
128  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
129  {
130  b.Property<long>("Id")
131  .ValueGeneratedOnAdd()
132  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
133 
134  b.Property<string>("AccessToken");
135 
136  b.Property<bool?>("AllowWebClient")
137  .IsRequired();
138 
139  b.Property<bool?>("AutoStart")
140  .IsRequired();
141 
142  b.Property<long>("InstanceId");
143 
144  b.Property<int>("PrimaryPort");
145 
146  b.Property<int?>("ProcessId");
147 
148  b.Property<int>("SecondaryPort");
149 
150  b.Property<int>("SecurityLevel");
151 
152  b.Property<bool?>("SoftRestart")
153  .IsRequired();
154 
155  b.Property<bool?>("SoftShutdown")
156  .IsRequired();
157 
158  b.Property<long>("StartupTimeout");
159 
160  b.HasKey("Id");
161 
162  b.HasIndex("InstanceId")
163  .IsUnique();
164 
165  b.ToTable("DreamDaemonSettings");
166  });
167 
168  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
169  {
170  b.Property<long>("Id")
171  .ValueGeneratedOnAdd()
172  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
173 
174  b.Property<int>("ApiValidationPort");
175 
176  b.Property<int>("ApiValidationSecurityLevel");
177 
178  b.Property<long>("InstanceId");
179 
180  b.Property<string>("ProjectName");
181 
182  b.HasKey("Id");
183 
184  b.HasIndex("InstanceId")
185  .IsUnique();
186 
187  b.ToTable("DreamMakerSettings");
188  });
189 
190  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
191  {
192  b.Property<long>("Id")
193  .ValueGeneratedOnAdd()
194  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
195 
196  b.Property<long>("AutoUpdateInterval");
197 
198  b.Property<int>("ConfigurationType");
199 
200  b.Property<string>("Name")
201  .IsRequired();
202 
203  b.Property<bool?>("Online")
204  .IsRequired();
205 
206  b.Property<string>("Path")
207  .IsRequired();
208 
209  b.HasKey("Id");
210 
211  b.HasIndex("Path")
212  .IsUnique();
213 
214  b.ToTable("Instances");
215  });
216 
217  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
218  {
219  b.Property<long>("Id")
220  .ValueGeneratedOnAdd()
221  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
222 
223  b.Property<decimal>("ByondRights")
224  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
225 
226  b.Property<decimal>("ChatBotRights")
227  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
228 
229  b.Property<decimal>("ConfigurationRights")
230  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
231 
232  b.Property<decimal>("DreamDaemonRights")
233  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
234 
235  b.Property<decimal>("DreamMakerRights")
236  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
237 
238  b.Property<long>("InstanceId");
239 
240  b.Property<decimal>("InstanceUserRights")
241  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
242 
243  b.Property<decimal>("RepositoryRights")
244  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
245 
246  b.Property<long?>("UserId")
247  .IsRequired();
248 
249  b.HasKey("Id");
250 
251  b.HasIndex("InstanceId");
252 
253  b.HasIndex("UserId", "InstanceId")
254  .IsUnique();
255 
256  b.ToTable("InstanceUsers");
257  });
258 
259  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
260  {
261  b.Property<long>("Id")
262  .ValueGeneratedOnAdd()
263  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
264 
265  b.Property<decimal?>("CancelRight")
266  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
267 
268  b.Property<decimal?>("CancelRightsType")
269  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
270 
271  b.Property<bool?>("Cancelled")
272  .IsRequired();
273 
274  b.Property<long?>("CancelledById");
275 
276  b.Property<string>("Description")
277  .IsRequired();
278 
279  b.Property<string>("ExceptionDetails");
280 
281  b.Property<long>("InstanceId");
282 
283  b.Property<DateTimeOffset?>("StartedAt")
284  .IsRequired();
285 
286  b.Property<long>("StartedById");
287 
288  b.Property<DateTimeOffset?>("StoppedAt");
289 
290  b.HasKey("Id");
291 
292  b.HasIndex("CancelledById");
293 
294  b.HasIndex("InstanceId");
295 
296  b.HasIndex("StartedById");
297 
298  b.ToTable("Jobs");
299  });
300 
301  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
302  {
303  b.Property<long>("Id")
304  .ValueGeneratedOnAdd()
305  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
306 
307  b.Property<string>("AccessIdentifier")
308  .IsRequired();
309 
310  b.Property<string>("ChatChannelsJson")
311  .IsRequired();
312 
313  b.Property<string>("ChatCommandsJson")
314  .IsRequired();
315 
316  b.Property<long?>("CompileJobId");
317 
318  b.Property<bool>("IsPrimary");
319 
320  b.Property<int>("Port");
321 
322  b.Property<int>("ProcessId");
323 
324  b.Property<int>("RebootState");
325 
326  b.Property<string>("ServerCommandsJson")
327  .IsRequired();
328 
329  b.HasKey("Id");
330 
331  b.HasIndex("CompileJobId");
332 
333  b.ToTable("ReattachInformations");
334  });
335 
336  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
337  {
338  b.Property<long>("Id")
339  .ValueGeneratedOnAdd()
340  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
341 
342  b.Property<string>("AccessToken");
343 
344  b.Property<string>("AccessUser");
345 
346  b.Property<bool?>("AutoUpdatesKeepTestMerges")
347  .IsRequired();
348 
349  b.Property<bool?>("AutoUpdatesSynchronize")
350  .IsRequired();
351 
352  b.Property<string>("CommitterEmail")
353  .IsRequired();
354 
355  b.Property<string>("CommitterName")
356  .IsRequired();
357 
358  b.Property<long>("InstanceId");
359 
360  b.Property<bool?>("PushTestMergeCommits")
361  .IsRequired();
362 
363  b.Property<bool?>("ShowTestMergeCommitters")
364  .IsRequired();
365 
366  b.HasKey("Id");
367 
368  b.HasIndex("InstanceId")
369  .IsUnique();
370 
371  b.ToTable("RepositorySettings");
372  });
373 
374  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
375  {
376  b.Property<long>("Id")
377  .ValueGeneratedOnAdd()
378  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
379 
380  b.Property<long>("RevisionInformationId");
381 
382  b.Property<long>("TestMergeId");
383 
384  b.HasKey("Id");
385 
386  b.HasIndex("RevisionInformationId");
387 
388  b.HasIndex("TestMergeId");
389 
390  b.ToTable("RevInfoTestMerges");
391  });
392 
393  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
394  {
395  b.Property<long>("Id")
396  .ValueGeneratedOnAdd()
397  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
398 
399  b.Property<string>("CommitSha")
400  .IsRequired()
401  .HasMaxLength(40);
402 
403  b.Property<long>("InstanceId");
404 
405  b.Property<string>("OriginCommitSha")
406  .IsRequired()
407  .HasMaxLength(40);
408 
409  b.HasKey("Id");
410 
411  b.HasIndex("CommitSha")
412  .IsUnique();
413 
414  b.HasIndex("InstanceId");
415 
416  b.ToTable("RevisionInformations");
417  });
418 
419  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
420  {
421  b.Property<long>("Id")
422  .ValueGeneratedOnAdd()
423  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
424 
425  b.Property<string>("Author")
426  .IsRequired();
427 
428  b.Property<string>("BodyAtMerge")
429  .IsRequired();
430 
431  b.Property<string>("Comment");
432 
433  b.Property<DateTimeOffset>("MergedAt");
434 
435  b.Property<long>("MergedById");
436 
437  b.Property<int?>("Number")
438  .IsRequired();
439 
440  b.Property<long?>("PrimaryRevisionInformationId")
441  .IsRequired();
442 
443  b.Property<string>("PullRequestRevision")
444  .IsRequired();
445 
446  b.Property<string>("TitleAtMerge")
447  .IsRequired();
448 
449  b.Property<string>("Url")
450  .IsRequired();
451 
452  b.HasKey("Id");
453 
454  b.HasIndex("MergedById");
455 
456  b.HasIndex("PrimaryRevisionInformationId")
457  .IsUnique();
458 
459  b.ToTable("TestMerges");
460  });
461 
462  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
463  {
464  b.Property<long>("Id")
465  .ValueGeneratedOnAdd()
466  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
467 
468  b.Property<decimal>("AdministrationRights")
469  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
470 
471  b.Property<string>("CanonicalName")
472  .IsRequired();
473 
474  b.Property<DateTimeOffset?>("CreatedAt")
475  .IsRequired();
476 
477  b.Property<long?>("CreatedById");
478 
479  b.Property<bool?>("Enabled")
480  .IsRequired();
481 
482  b.Property<decimal>("InstanceManagerRights")
483  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
484 
485  b.Property<DateTimeOffset?>("LastPasswordUpdate");
486 
487  b.Property<string>("Name")
488  .IsRequired();
489 
490  b.Property<string>("PasswordHash");
491 
492  b.Property<string>("SystemIdentifier");
493 
494  b.HasKey("Id");
495 
496  b.HasIndex("CanonicalName")
497  .IsUnique();
498 
499  b.HasIndex("CreatedById");
500 
501  b.ToTable("Users");
502  });
503 
504  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
505  {
506  b.Property<long>("Id")
507  .ValueGeneratedOnAdd()
508  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
509 
510  b.Property<long?>("AlphaId");
511 
512  b.Property<bool>("AlphaIsActive");
513 
514  b.Property<long?>("BravoId");
515 
516  b.Property<long>("InstanceId");
517 
518  b.HasKey("Id");
519 
520  b.HasIndex("AlphaId");
521 
522  b.HasIndex("BravoId");
523 
524  b.HasIndex("InstanceId")
525  .IsUnique();
526 
527  b.ToTable("WatchdogReattachInformations");
528  });
529 
530  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
531  {
532  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
533  .WithMany("ChatSettings")
534  .HasForeignKey("InstanceId")
535  .OnDelete(DeleteBehavior.Cascade);
536  });
537 
538  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
539  {
540  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
541  .WithMany("Channels")
542  .HasForeignKey("ChatSettingsId")
543  .OnDelete(DeleteBehavior.Cascade);
544  });
545 
546  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
547  {
548  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
549  .WithOne()
550  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
551  .OnDelete(DeleteBehavior.Restrict);
552 
553  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
554  .WithMany("CompileJobs")
555  .HasForeignKey("RevisionInformationId")
556  .OnDelete(DeleteBehavior.Cascade);
557  });
558 
559  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
560  {
561  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
562  .WithOne("DreamDaemonSettings")
563  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
564  .OnDelete(DeleteBehavior.Cascade);
565  });
566 
567  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
568  {
569  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
570  .WithOne("DreamMakerSettings")
571  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
572  .OnDelete(DeleteBehavior.Cascade);
573  });
574 
575  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
576  {
577  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
578  .WithMany("InstanceUsers")
579  .HasForeignKey("InstanceId")
580  .OnDelete(DeleteBehavior.Cascade);
581 
582  b.HasOne("Tgstation.Server.Host.Models.User")
583  .WithMany("InstanceUsers")
584  .HasForeignKey("UserId")
585  .OnDelete(DeleteBehavior.Cascade);
586  });
587 
588  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
589  {
590  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
591  .WithMany()
592  .HasForeignKey("CancelledById");
593 
594  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
595  .WithMany("Jobs")
596  .HasForeignKey("InstanceId")
597  .OnDelete(DeleteBehavior.Cascade);
598 
599  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
600  .WithMany()
601  .HasForeignKey("StartedById")
602  .OnDelete(DeleteBehavior.Cascade);
603  });
604 
605  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
606  {
607  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
608  .WithMany()
609  .HasForeignKey("CompileJobId");
610  });
611 
612  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
613  {
614  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
615  .WithOne("RepositorySettings")
616  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
617  .OnDelete(DeleteBehavior.Cascade);
618  });
619 
620  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
621  {
622  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
623  .WithMany("ActiveTestMerges")
624  .HasForeignKey("RevisionInformationId")
625  .OnDelete(DeleteBehavior.Cascade);
626 
627  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
628  .WithMany("RevisonInformations")
629  .HasForeignKey("TestMergeId")
630  .OnDelete(DeleteBehavior.Cascade);
631  });
632 
633  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
634  {
635  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
636  .WithMany("RevisionInformations")
637  .HasForeignKey("InstanceId")
638  .OnDelete(DeleteBehavior.Cascade);
639  });
640 
641  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
642  {
643  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
644  .WithMany("TestMerges")
645  .HasForeignKey("MergedById")
646  .OnDelete(DeleteBehavior.Restrict);
647 
648  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
649  .WithOne("PrimaryTestMerge")
650  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
651  .OnDelete(DeleteBehavior.Restrict);
652  });
653 
654  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
655  {
656  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
657  .WithMany("CreatedUsers")
658  .HasForeignKey("CreatedById");
659  });
660 
661  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
662  {
663  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
664  .WithMany()
665  .HasForeignKey("AlphaId");
666 
667  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
668  .WithMany()
669  .HasForeignKey("BravoId");
670 
671  b.HasOne("Tgstation.Server.Host.Models.Instance")
672  .WithOne("WatchdogReattachInformation")
673  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
674  .OnDelete(DeleteBehavior.Cascade);
675  });
676 #pragma warning restore 612, 618
677  }
678  }
679 }
+ + + +
+ + + + diff --git a/20180918205224___m_s_nullable_and_foreign_key_cleanup_8cs.html b/20180918205224___m_s_nullable_and_foreign_key_cleanup_8cs.html new file mode 100644 index 0000000000..7d0103074d --- /dev/null +++ b/20180918205224___m_s_nullable_and_foreign_key_cleanup_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180918205224_MSNullableAndForeignKeyCleanup.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20180918205224_MSNullableAndForeignKeyCleanup.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup
 Cleans up of nullable columns and foreign keys MSSQL More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + 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 new file mode 100644 index 0000000000..26d2e4ab42 --- /dev/null +++ b/20180918205224___m_s_nullable_and_foreign_key_cleanup_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180918205224_MSNullableAndForeignKeyCleanup.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20180918205224_MSNullableAndForeignKeyCleanup.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using Microsoft.EntityFrameworkCore.Migrations;
3 
5 {
10  {
15  protected override void Up(MigrationBuilder migrationBuilder)
16  {
17  if (migrationBuilder == null)
18  throw new ArgumentNullException(nameof(migrationBuilder));
19 
20  migrationBuilder.DropForeignKey(
21  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInformationId",
22  table: "Instances");
23 
24  migrationBuilder.DropForeignKey(
25  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
26  table: "TestMerges");
27 
28  migrationBuilder.DropIndex(
29  name: "IX_TestMerges_PrimaryRevisionInformationId",
30  table: "TestMerges");
31 
32  migrationBuilder.DropIndex(
33  name: "IX_Instances_WatchdogReattachInformationId",
34  table: "Instances");
35 
36  migrationBuilder.DropIndex(
37  name: "IX_CompileJobs_JobId",
38  table: "CompileJobs");
39 
40  migrationBuilder.DropColumn(
41  name: "WatchdogReattachInformationId",
42  table: "Instances");
43 
44  migrationBuilder.AddColumn<long>(
45  name: "InstanceId",
46  table: "WatchdogReattachInformations",
47  nullable: false,
48  defaultValue: 0L);
49 
50  migrationBuilder.AlterColumn<long>(
51  name: "PrimaryRevisionInformationId",
52  table: "TestMerges",
53  nullable: false,
54  oldClrType: typeof(long),
55  oldNullable: true);
56 
57  migrationBuilder.AlterColumn<string>(
58  name: "Output",
59  table: "CompileJobs",
60  nullable: false,
61  oldClrType: typeof(string),
62  oldNullable: true);
63 
64  migrationBuilder.AlterColumn<long>(
65  name: "JobId",
66  table: "CompileJobs",
67  nullable: false,
68  oldClrType: typeof(long),
69  oldNullable: true);
70 
71  migrationBuilder.AlterColumn<string>(
72  name: "DmeName",
73  table: "CompileJobs",
74  nullable: false,
75  oldClrType: typeof(string),
76  oldNullable: true);
77 
78  migrationBuilder.AlterColumn<Guid>(
79  name: "DirectoryName",
80  table: "CompileJobs",
81  nullable: false,
82  oldClrType: typeof(Guid),
83  oldNullable: true);
84 
85  migrationBuilder.CreateIndex(
86  name: "IX_WatchdogReattachInformations_InstanceId",
87  table: "WatchdogReattachInformations",
88  column: "InstanceId",
89  unique: true);
90 
91  migrationBuilder.CreateIndex(
92  name: "IX_TestMerges_PrimaryRevisionInformationId",
93  table: "TestMerges",
94  column: "PrimaryRevisionInformationId",
95  unique: true);
96 
97  migrationBuilder.CreateIndex(
98  name: "IX_CompileJobs_JobId",
99  table: "CompileJobs",
100  column: "JobId",
101  unique: true);
102 
103  migrationBuilder.AddForeignKey(
104  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
105  table: "TestMerges",
106  column: "PrimaryRevisionInformationId",
107  principalTable: "RevisionInformations",
108  principalColumn: "Id",
109  onDelete: ReferentialAction.Restrict);
110 
111  migrationBuilder.AddForeignKey(
112  name: "FK_WatchdogReattachInformations_Instances_InstanceId",
113  table: "WatchdogReattachInformations",
114  column: "InstanceId",
115  principalTable: "Instances",
116  principalColumn: "Id",
117  onDelete: ReferentialAction.Cascade);
118  }
119 
124  protected override void Down(MigrationBuilder migrationBuilder)
125  {
126  if (migrationBuilder == null)
127  throw new ArgumentNullException(nameof(migrationBuilder));
128 
129  migrationBuilder.DropForeignKey(
130  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
131  table: "TestMerges");
132 
133  migrationBuilder.DropForeignKey(
134  name: "FK_WatchdogReattachInformations_Instances_InstanceId",
135  table: "WatchdogReattachInformations");
136 
137  migrationBuilder.DropIndex(
138  name: "IX_WatchdogReattachInformations_InstanceId",
139  table: "WatchdogReattachInformations");
140 
141  migrationBuilder.DropIndex(
142  name: "IX_TestMerges_PrimaryRevisionInformationId",
143  table: "TestMerges");
144 
145  migrationBuilder.DropIndex(
146  name: "IX_CompileJobs_JobId",
147  table: "CompileJobs");
148 
149  migrationBuilder.DropColumn(
150  name: "InstanceId",
151  table: "WatchdogReattachInformations");
152 
153  migrationBuilder.AlterColumn<long>(
154  name: "PrimaryRevisionInformationId",
155  table: "TestMerges",
156  nullable: true,
157  oldClrType: typeof(long));
158 
159  migrationBuilder.AddColumn<long>(
160  name: "WatchdogReattachInformationId",
161  table: "Instances",
162  nullable: true);
163 
164  migrationBuilder.AlterColumn<string>(
165  name: "Output",
166  table: "CompileJobs",
167  nullable: true,
168  oldClrType: typeof(string));
169 
170  migrationBuilder.AlterColumn<long>(
171  name: "JobId",
172  table: "CompileJobs",
173  nullable: true,
174  oldClrType: typeof(long));
175 
176  migrationBuilder.AlterColumn<string>(
177  name: "DmeName",
178  table: "CompileJobs",
179  nullable: true,
180  oldClrType: typeof(string));
181 
182  migrationBuilder.AlterColumn<Guid>(
183  name: "DirectoryName",
184  table: "CompileJobs",
185  nullable: true,
186  oldClrType: typeof(Guid));
187 
188  migrationBuilder.CreateIndex(
189  name: "IX_TestMerges_PrimaryRevisionInformationId",
190  table: "TestMerges",
191  column: "PrimaryRevisionInformationId",
192  unique: true,
193  filter: "[PrimaryRevisionInformationId] IS NOT NULL");
194 
195  migrationBuilder.CreateIndex(
196  name: "IX_Instances_WatchdogReattachInformationId",
197  table: "Instances",
198  column: "WatchdogReattachInformationId");
199 
200  migrationBuilder.CreateIndex(
201  name: "IX_CompileJobs_JobId",
202  table: "CompileJobs",
203  column: "JobId");
204 
205  migrationBuilder.AddForeignKey(
206  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInformationId",
207  table: "Instances",
208  column: "WatchdogReattachInformationId",
209  principalTable: "WatchdogReattachInformations",
210  principalColumn: "Id",
211  onDelete: ReferentialAction.Restrict);
212 
213  migrationBuilder.AddForeignKey(
214  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
215  table: "TestMerges",
216  column: "PrimaryRevisionInformationId",
217  principalTable: "RevisionInformations",
218  principalColumn: "Id",
219  onDelete: ReferentialAction.SetNull);
220  }
221  }
222 }
+
override void Down(MigrationBuilder migrationBuilder)
Unapplies the migration
+
override void Up(MigrationBuilder migrationBuilder)
Applies the migration
+ + +
+ + + + 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 new file mode 100644 index 0000000000..c0f38c78f6 --- /dev/null +++ b/20180926033145___m_s_reattach_compile_job_required_8_designer_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180926033145_MSReattachCompileJobRequired.Designer.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20180926033145_MSReattachCompileJobRequired.Designer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired
 Marks the CompileJobs of ReattachInformations as non-nullable for MSSQL More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + 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 new file mode 100644 index 0000000000..7bed682512 --- /dev/null +++ b/20180926033145___m_s_reattach_compile_job_required_8_designer_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180926033145_MSReattachCompileJobRequired.Designer.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20180926033145_MSReattachCompileJobRequired.Designer.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated />
2 using System;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.EntityFrameworkCore.Infrastructure;
5 using Microsoft.EntityFrameworkCore.Metadata;
6 using Microsoft.EntityFrameworkCore.Migrations;
7 using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
8 
10 {
11  [DbContext(typeof(SqlServerDatabaseContext))]
12  [Migration("20180926033145_MSReattachCompileJobRequired")]
13  partial class MSReattachCompileJobRequired
14  {
19  protected override void BuildTargetModel(ModelBuilder modelBuilder)
20  {
21 #pragma warning disable 612, 618
22  modelBuilder
23  .HasAnnotation("ProductVersion", "2.1.3-rtm-32065")
24  .HasAnnotation("Relational:MaxIdentifierLength", 128)
25  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
26 
27  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
28  {
29  b.Property<long>("Id")
30  .ValueGeneratedOnAdd()
31  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
32 
33  b.Property<string>("ConnectionString")
34  .IsRequired();
35 
36  b.Property<bool?>("Enabled");
37 
38  b.Property<long>("InstanceId");
39 
40  b.Property<string>("Name")
41  .IsRequired();
42 
43  b.Property<int?>("Provider");
44 
45  b.HasKey("Id");
46 
47  b.HasIndex("InstanceId");
48 
49  b.HasIndex("Name")
50  .IsUnique();
51 
52  b.ToTable("ChatBots");
53  });
54 
55  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
56  {
57  b.Property<long>("Id")
58  .ValueGeneratedOnAdd()
59  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
60 
61  b.Property<long>("ChatSettingsId");
62 
63  b.Property<decimal?>("DiscordChannelId")
64  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
65 
66  b.Property<string>("IrcChannel");
67 
68  b.Property<bool?>("IsAdminChannel")
69  .IsRequired();
70 
71  b.Property<bool?>("IsUpdatesChannel")
72  .IsRequired();
73 
74  b.Property<bool?>("IsWatchdogChannel")
75  .IsRequired();
76 
77  b.Property<string>("Tag");
78 
79  b.HasKey("Id");
80 
81  b.HasIndex("ChatSettingsId", "DiscordChannelId")
82  .IsUnique()
83  .HasFilter("[DiscordChannelId] IS NOT NULL");
84 
85  b.HasIndex("ChatSettingsId", "IrcChannel")
86  .IsUnique()
87  .HasFilter("[IrcChannel] IS NOT NULL");
88 
89  b.ToTable("ChatChannels");
90  });
91 
92  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
93  {
94  b.Property<long>("Id")
95  .ValueGeneratedOnAdd()
96  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
97 
98  b.Property<string>("ByondVersion")
99  .IsRequired();
100 
101  b.Property<Guid?>("DirectoryName")
102  .IsRequired();
103 
104  b.Property<string>("DmeName")
105  .IsRequired();
106 
107  b.Property<long>("JobId");
108 
109  b.Property<int>("MinimumSecurityLevel");
110 
111  b.Property<string>("Output")
112  .IsRequired();
113 
114  b.Property<long>("RevisionInformationId");
115 
116  b.HasKey("Id");
117 
118  b.HasIndex("DirectoryName");
119 
120  b.HasIndex("JobId")
121  .IsUnique();
122 
123  b.HasIndex("RevisionInformationId");
124 
125  b.ToTable("CompileJobs");
126  });
127 
128  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
129  {
130  b.Property<long>("Id")
131  .ValueGeneratedOnAdd()
132  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
133 
134  b.Property<string>("AccessToken");
135 
136  b.Property<bool?>("AllowWebClient")
137  .IsRequired();
138 
139  b.Property<bool?>("AutoStart")
140  .IsRequired();
141 
142  b.Property<long>("InstanceId");
143 
144  b.Property<int>("PrimaryPort");
145 
146  b.Property<int?>("ProcessId");
147 
148  b.Property<int>("SecondaryPort");
149 
150  b.Property<int>("SecurityLevel");
151 
152  b.Property<bool?>("SoftRestart")
153  .IsRequired();
154 
155  b.Property<bool?>("SoftShutdown")
156  .IsRequired();
157 
158  b.Property<long>("StartupTimeout");
159 
160  b.HasKey("Id");
161 
162  b.HasIndex("InstanceId")
163  .IsUnique();
164 
165  b.ToTable("DreamDaemonSettings");
166  });
167 
168  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
169  {
170  b.Property<long>("Id")
171  .ValueGeneratedOnAdd()
172  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
173 
174  b.Property<int>("ApiValidationPort");
175 
176  b.Property<int>("ApiValidationSecurityLevel");
177 
178  b.Property<long>("InstanceId");
179 
180  b.Property<string>("ProjectName");
181 
182  b.HasKey("Id");
183 
184  b.HasIndex("InstanceId")
185  .IsUnique();
186 
187  b.ToTable("DreamMakerSettings");
188  });
189 
190  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
191  {
192  b.Property<long>("Id")
193  .ValueGeneratedOnAdd()
194  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
195 
196  b.Property<long>("AutoUpdateInterval");
197 
198  b.Property<int>("ConfigurationType");
199 
200  b.Property<string>("Name")
201  .IsRequired();
202 
203  b.Property<bool?>("Online")
204  .IsRequired();
205 
206  b.Property<string>("Path")
207  .IsRequired();
208 
209  b.HasKey("Id");
210 
211  b.HasIndex("Path")
212  .IsUnique();
213 
214  b.ToTable("Instances");
215  });
216 
217  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
218  {
219  b.Property<long>("Id")
220  .ValueGeneratedOnAdd()
221  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
222 
223  b.Property<decimal>("ByondRights")
224  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
225 
226  b.Property<decimal>("ChatBotRights")
227  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
228 
229  b.Property<decimal>("ConfigurationRights")
230  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
231 
232  b.Property<decimal>("DreamDaemonRights")
233  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
234 
235  b.Property<decimal>("DreamMakerRights")
236  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
237 
238  b.Property<long>("InstanceId");
239 
240  b.Property<decimal>("InstanceUserRights")
241  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
242 
243  b.Property<decimal>("RepositoryRights")
244  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
245 
246  b.Property<long?>("UserId")
247  .IsRequired();
248 
249  b.HasKey("Id");
250 
251  b.HasIndex("InstanceId");
252 
253  b.HasIndex("UserId", "InstanceId")
254  .IsUnique();
255 
256  b.ToTable("InstanceUsers");
257  });
258 
259  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
260  {
261  b.Property<long>("Id")
262  .ValueGeneratedOnAdd()
263  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
264 
265  b.Property<decimal?>("CancelRight")
266  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
267 
268  b.Property<decimal?>("CancelRightsType")
269  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
270 
271  b.Property<bool?>("Cancelled")
272  .IsRequired();
273 
274  b.Property<long?>("CancelledById");
275 
276  b.Property<string>("Description")
277  .IsRequired();
278 
279  b.Property<string>("ExceptionDetails");
280 
281  b.Property<long>("InstanceId");
282 
283  b.Property<DateTimeOffset?>("StartedAt")
284  .IsRequired();
285 
286  b.Property<long>("StartedById");
287 
288  b.Property<DateTimeOffset?>("StoppedAt");
289 
290  b.HasKey("Id");
291 
292  b.HasIndex("CancelledById");
293 
294  b.HasIndex("InstanceId");
295 
296  b.HasIndex("StartedById");
297 
298  b.ToTable("Jobs");
299  });
300 
301  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
302  {
303  b.Property<long>("Id")
304  .ValueGeneratedOnAdd()
305  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
306 
307  b.Property<string>("AccessIdentifier")
308  .IsRequired();
309 
310  b.Property<string>("ChatChannelsJson")
311  .IsRequired();
312 
313  b.Property<string>("ChatCommandsJson")
314  .IsRequired();
315 
316  b.Property<long>("CompileJobId");
317 
318  b.Property<bool>("IsPrimary");
319 
320  b.Property<int>("Port");
321 
322  b.Property<int>("ProcessId");
323 
324  b.Property<int>("RebootState");
325 
326  b.Property<string>("ServerCommandsJson")
327  .IsRequired();
328 
329  b.HasKey("Id");
330 
331  b.HasIndex("CompileJobId");
332 
333  b.ToTable("ReattachInformations");
334  });
335 
336  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
337  {
338  b.Property<long>("Id")
339  .ValueGeneratedOnAdd()
340  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
341 
342  b.Property<string>("AccessToken");
343 
344  b.Property<string>("AccessUser");
345 
346  b.Property<bool?>("AutoUpdatesKeepTestMerges")
347  .IsRequired();
348 
349  b.Property<bool?>("AutoUpdatesSynchronize")
350  .IsRequired();
351 
352  b.Property<string>("CommitterEmail")
353  .IsRequired();
354 
355  b.Property<string>("CommitterName")
356  .IsRequired();
357 
358  b.Property<long>("InstanceId");
359 
360  b.Property<bool?>("PushTestMergeCommits")
361  .IsRequired();
362 
363  b.Property<bool?>("ShowTestMergeCommitters")
364  .IsRequired();
365 
366  b.HasKey("Id");
367 
368  b.HasIndex("InstanceId")
369  .IsUnique();
370 
371  b.ToTable("RepositorySettings");
372  });
373 
374  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
375  {
376  b.Property<long>("Id")
377  .ValueGeneratedOnAdd()
378  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
379 
380  b.Property<long>("RevisionInformationId");
381 
382  b.Property<long>("TestMergeId");
383 
384  b.HasKey("Id");
385 
386  b.HasIndex("RevisionInformationId");
387 
388  b.HasIndex("TestMergeId");
389 
390  b.ToTable("RevInfoTestMerges");
391  });
392 
393  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
394  {
395  b.Property<long>("Id")
396  .ValueGeneratedOnAdd()
397  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
398 
399  b.Property<string>("CommitSha")
400  .IsRequired()
401  .HasMaxLength(40);
402 
403  b.Property<long>("InstanceId");
404 
405  b.Property<string>("OriginCommitSha")
406  .IsRequired()
407  .HasMaxLength(40);
408 
409  b.HasKey("Id");
410 
411  b.HasIndex("CommitSha")
412  .IsUnique();
413 
414  b.HasIndex("InstanceId");
415 
416  b.ToTable("RevisionInformations");
417  });
418 
419  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
420  {
421  b.Property<long>("Id")
422  .ValueGeneratedOnAdd()
423  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
424 
425  b.Property<string>("Author")
426  .IsRequired();
427 
428  b.Property<string>("BodyAtMerge")
429  .IsRequired();
430 
431  b.Property<string>("Comment");
432 
433  b.Property<DateTimeOffset>("MergedAt");
434 
435  b.Property<long>("MergedById");
436 
437  b.Property<int?>("Number")
438  .IsRequired();
439 
440  b.Property<long?>("PrimaryRevisionInformationId")
441  .IsRequired();
442 
443  b.Property<string>("PullRequestRevision")
444  .IsRequired();
445 
446  b.Property<string>("TitleAtMerge")
447  .IsRequired();
448 
449  b.Property<string>("Url")
450  .IsRequired();
451 
452  b.HasKey("Id");
453 
454  b.HasIndex("MergedById");
455 
456  b.HasIndex("PrimaryRevisionInformationId")
457  .IsUnique();
458 
459  b.ToTable("TestMerges");
460  });
461 
462  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
463  {
464  b.Property<long>("Id")
465  .ValueGeneratedOnAdd()
466  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
467 
468  b.Property<decimal>("AdministrationRights")
469  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
470 
471  b.Property<string>("CanonicalName")
472  .IsRequired();
473 
474  b.Property<DateTimeOffset?>("CreatedAt")
475  .IsRequired();
476 
477  b.Property<long?>("CreatedById");
478 
479  b.Property<bool?>("Enabled")
480  .IsRequired();
481 
482  b.Property<decimal>("InstanceManagerRights")
483  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
484 
485  b.Property<DateTimeOffset?>("LastPasswordUpdate");
486 
487  b.Property<string>("Name")
488  .IsRequired();
489 
490  b.Property<string>("PasswordHash");
491 
492  b.Property<string>("SystemIdentifier");
493 
494  b.HasKey("Id");
495 
496  b.HasIndex("CanonicalName")
497  .IsUnique();
498 
499  b.HasIndex("CreatedById");
500 
501  b.ToTable("Users");
502  });
503 
504  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
505  {
506  b.Property<long>("Id")
507  .ValueGeneratedOnAdd()
508  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
509 
510  b.Property<long?>("AlphaId");
511 
512  b.Property<bool>("AlphaIsActive");
513 
514  b.Property<long?>("BravoId");
515 
516  b.Property<long>("InstanceId");
517 
518  b.HasKey("Id");
519 
520  b.HasIndex("AlphaId");
521 
522  b.HasIndex("BravoId");
523 
524  b.HasIndex("InstanceId")
525  .IsUnique();
526 
527  b.ToTable("WatchdogReattachInformations");
528  });
529 
530  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
531  {
532  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
533  .WithMany("ChatSettings")
534  .HasForeignKey("InstanceId")
535  .OnDelete(DeleteBehavior.Cascade);
536  });
537 
538  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
539  {
540  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
541  .WithMany("Channels")
542  .HasForeignKey("ChatSettingsId")
543  .OnDelete(DeleteBehavior.Cascade);
544  });
545 
546  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
547  {
548  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
549  .WithOne()
550  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
551  .OnDelete(DeleteBehavior.Restrict);
552 
553  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
554  .WithMany("CompileJobs")
555  .HasForeignKey("RevisionInformationId")
556  .OnDelete(DeleteBehavior.Cascade);
557  });
558 
559  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
560  {
561  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
562  .WithOne("DreamDaemonSettings")
563  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
564  .OnDelete(DeleteBehavior.Cascade);
565  });
566 
567  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
568  {
569  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
570  .WithOne("DreamMakerSettings")
571  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
572  .OnDelete(DeleteBehavior.Cascade);
573  });
574 
575  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
576  {
577  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
578  .WithMany("InstanceUsers")
579  .HasForeignKey("InstanceId")
580  .OnDelete(DeleteBehavior.Cascade);
581 
582  b.HasOne("Tgstation.Server.Host.Models.User")
583  .WithMany("InstanceUsers")
584  .HasForeignKey("UserId")
585  .OnDelete(DeleteBehavior.Cascade);
586  });
587 
588  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
589  {
590  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
591  .WithMany()
592  .HasForeignKey("CancelledById");
593 
594  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
595  .WithMany("Jobs")
596  .HasForeignKey("InstanceId")
597  .OnDelete(DeleteBehavior.Cascade);
598 
599  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
600  .WithMany()
601  .HasForeignKey("StartedById")
602  .OnDelete(DeleteBehavior.Cascade);
603  });
604 
605  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
606  {
607  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
608  .WithMany()
609  .HasForeignKey("CompileJobId")
610  .OnDelete(DeleteBehavior.Cascade);
611  });
612 
613  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
614  {
615  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
616  .WithOne("RepositorySettings")
617  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
618  .OnDelete(DeleteBehavior.Cascade);
619  });
620 
621  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
622  {
623  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
624  .WithMany("ActiveTestMerges")
625  .HasForeignKey("RevisionInformationId")
626  .OnDelete(DeleteBehavior.Cascade);
627 
628  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
629  .WithMany("RevisonInformations")
630  .HasForeignKey("TestMergeId")
631  .OnDelete(DeleteBehavior.Cascade);
632  });
633 
634  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
635  {
636  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
637  .WithMany("RevisionInformations")
638  .HasForeignKey("InstanceId")
639  .OnDelete(DeleteBehavior.Cascade);
640  });
641 
642  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
643  {
644  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
645  .WithMany("TestMerges")
646  .HasForeignKey("MergedById")
647  .OnDelete(DeleteBehavior.Restrict);
648 
649  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
650  .WithOne("PrimaryTestMerge")
651  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
652  .OnDelete(DeleteBehavior.Restrict);
653  });
654 
655  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
656  {
657  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
658  .WithMany("CreatedUsers")
659  .HasForeignKey("CreatedById");
660  });
661 
662  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
663  {
664  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
665  .WithMany()
666  .HasForeignKey("AlphaId");
667 
668  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
669  .WithMany()
670  .HasForeignKey("BravoId");
671 
672  b.HasOne("Tgstation.Server.Host.Models.Instance")
673  .WithOne("WatchdogReattachInformation")
674  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
675  .OnDelete(DeleteBehavior.Cascade);
676  });
677 #pragma warning restore 612, 618
678  }
679  }
680 }
+ + + +
+ + + + diff --git a/20180926033145___m_s_reattach_compile_job_required_8cs.html b/20180926033145___m_s_reattach_compile_job_required_8cs.html new file mode 100644 index 0000000000..ebf34d1976 --- /dev/null +++ b/20180926033145___m_s_reattach_compile_job_required_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180926033145_MSReattachCompileJobRequired.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20180926033145_MSReattachCompileJobRequired.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired
 Marks the CompileJobs of ReattachInformations as non-nullable for MSSQL More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + diff --git a/20180926033145___m_s_reattach_compile_job_required_8cs_source.html b/20180926033145___m_s_reattach_compile_job_required_8cs_source.html new file mode 100644 index 0000000000..ed6d460166 --- /dev/null +++ b/20180926033145___m_s_reattach_compile_job_required_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180926033145_MSReattachCompileJobRequired.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20180926033145_MSReattachCompileJobRequired.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore.Migrations;
2 using System;
3 
5 {
9  public partial class MSReattachCompileJobRequired : Migration
10  {
15  protected override void Up(MigrationBuilder migrationBuilder)
16  {
17  if (migrationBuilder == null)
18  throw new ArgumentNullException(nameof(migrationBuilder));
19 
20  migrationBuilder.DropForeignKey(
21  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
22  table: "ReattachInformations");
23 
24  migrationBuilder.AlterColumn<long>(
25  name: "CompileJobId",
26  table: "ReattachInformations",
27  nullable: false,
28  oldClrType: typeof(long),
29  oldNullable: true);
30 
31  migrationBuilder.AddForeignKey(
32  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
33  table: "ReattachInformations",
34  column: "CompileJobId",
35  principalTable: "CompileJobs",
36  principalColumn: "Id",
37  onDelete: ReferentialAction.Cascade);
38  }
39 
44  protected override void Down(MigrationBuilder migrationBuilder)
45  {
46  if (migrationBuilder == null)
47  throw new ArgumentNullException(nameof(migrationBuilder));
48 
49  migrationBuilder.DropForeignKey(
50  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
51  table: "ReattachInformations");
52 
53  migrationBuilder.AlterColumn<long>(
54  name: "CompileJobId",
55  table: "ReattachInformations",
56  nullable: true,
57  oldClrType: typeof(long));
58 
59  migrationBuilder.AddForeignKey(
60  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
61  table: "ReattachInformations",
62  column: "CompileJobId",
63  principalTable: "CompileJobs",
64  principalColumn: "Id",
65  onDelete: ReferentialAction.Restrict);
66  }
67  }
68 }
+ +
override void Down(MigrationBuilder migrationBuilder)
Unapplies the migration
+
override void Up(MigrationBuilder migrationBuilder)
Applies the migration
+
Marks the CompileJobs of ReattachInformations as non-nullable for MSSQL
+
+ + + + 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 new file mode 100644 index 0000000000..6eb6355b0b --- /dev/null +++ b/20180926034014___m_y_reattach_compile_job_required_8_designer_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180926034014_MYReattachCompileJobRequired.Designer.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20180926034014_MYReattachCompileJobRequired.Designer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired
 Marks the CompileJobs of ReattachInformations as non-nullable for MySQL/MariaDB More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + 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 new file mode 100644 index 0000000000..17e6ca8829 --- /dev/null +++ b/20180926034014___m_y_reattach_compile_job_required_8_designer_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180926034014_MYReattachCompileJobRequired.Designer.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20180926034014_MYReattachCompileJobRequired.Designer.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated />
2 using System;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.EntityFrameworkCore.Infrastructure;
5 using Microsoft.EntityFrameworkCore.Migrations;
6 
8 {
9  [DbContext(typeof(MySqlDatabaseContext))]
10  [Migration("20180926034014_MYReattachCompileJobRequired")]
11  partial class MYReattachCompileJobRequired
12  {
17  protected override void BuildTargetModel(ModelBuilder modelBuilder)
18  {
19 #pragma warning disable 612, 618
20  modelBuilder
21  .HasAnnotation("ProductVersion", "2.1.3-rtm-32065")
22  .HasAnnotation("Relational:MaxIdentifierLength", 64);
23 
24  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
25  {
26  b.Property<long>("Id")
27  .ValueGeneratedOnAdd();
28 
29  b.Property<string>("ConnectionString")
30  .IsRequired();
31 
32  b.Property<bool?>("Enabled");
33 
34  b.Property<long>("InstanceId");
35 
36  b.Property<string>("Name")
37  .IsRequired();
38 
39  b.Property<int?>("Provider");
40 
41  b.HasKey("Id");
42 
43  b.HasIndex("InstanceId");
44 
45  b.HasIndex("Name")
46  .IsUnique();
47 
48  b.ToTable("ChatBots");
49  });
50 
51  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
52  {
53  b.Property<long>("Id")
54  .ValueGeneratedOnAdd();
55 
56  b.Property<long>("ChatSettingsId");
57 
58  b.Property<ulong?>("DiscordChannelId");
59 
60  b.Property<string>("IrcChannel");
61 
62  b.Property<bool?>("IsAdminChannel")
63  .IsRequired();
64 
65  b.Property<bool?>("IsUpdatesChannel")
66  .IsRequired();
67 
68  b.Property<bool?>("IsWatchdogChannel")
69  .IsRequired();
70 
71  b.Property<string>("Tag");
72 
73  b.HasKey("Id");
74 
75  b.HasIndex("ChatSettingsId", "DiscordChannelId")
76  .IsUnique();
77 
78  b.HasIndex("ChatSettingsId", "IrcChannel")
79  .IsUnique();
80 
81  b.ToTable("ChatChannels");
82  });
83 
84  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
85  {
86  b.Property<long>("Id")
87  .ValueGeneratedOnAdd();
88 
89  b.Property<string>("ByondVersion")
90  .IsRequired();
91 
92  b.Property<Guid?>("DirectoryName")
93  .IsRequired();
94 
95  b.Property<string>("DmeName")
96  .IsRequired();
97 
98  b.Property<long>("JobId");
99 
100  b.Property<int>("MinimumSecurityLevel");
101 
102  b.Property<string>("Output")
103  .IsRequired();
104 
105  b.Property<long>("RevisionInformationId");
106 
107  b.HasKey("Id");
108 
109  b.HasIndex("DirectoryName");
110 
111  b.HasIndex("JobId")
112  .IsUnique();
113 
114  b.HasIndex("RevisionInformationId");
115 
116  b.ToTable("CompileJobs");
117  });
118 
119  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
120  {
121  b.Property<long>("Id")
122  .ValueGeneratedOnAdd();
123 
124  b.Property<string>("AccessToken");
125 
126  b.Property<bool?>("AllowWebClient")
127  .IsRequired();
128 
129  b.Property<bool?>("AutoStart")
130  .IsRequired();
131 
132  b.Property<long>("InstanceId");
133 
134  b.Property<ushort?>("PrimaryPort")
135  .IsRequired();
136 
137  b.Property<int?>("ProcessId");
138 
139  b.Property<ushort?>("SecondaryPort")
140  .IsRequired();
141 
142  b.Property<int>("SecurityLevel");
143 
144  b.Property<bool?>("SoftRestart")
145  .IsRequired();
146 
147  b.Property<bool?>("SoftShutdown")
148  .IsRequired();
149 
150  b.Property<uint?>("StartupTimeout")
151  .IsRequired();
152 
153  b.HasKey("Id");
154 
155  b.HasIndex("InstanceId")
156  .IsUnique();
157 
158  b.ToTable("DreamDaemonSettings");
159  });
160 
161  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
162  {
163  b.Property<long>("Id")
164  .ValueGeneratedOnAdd();
165 
166  b.Property<ushort?>("ApiValidationPort")
167  .IsRequired();
168 
169  b.Property<int>("ApiValidationSecurityLevel");
170 
171  b.Property<long>("InstanceId");
172 
173  b.Property<string>("ProjectName");
174 
175  b.HasKey("Id");
176 
177  b.HasIndex("InstanceId")
178  .IsUnique();
179 
180  b.ToTable("DreamMakerSettings");
181  });
182 
183  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
184  {
185  b.Property<long>("Id")
186  .ValueGeneratedOnAdd();
187 
188  b.Property<uint?>("AutoUpdateInterval")
189  .IsRequired();
190 
191  b.Property<int>("ConfigurationType");
192 
193  b.Property<string>("Name")
194  .IsRequired();
195 
196  b.Property<bool?>("Online")
197  .IsRequired();
198 
199  b.Property<string>("Path")
200  .IsRequired();
201 
202  b.HasKey("Id");
203 
204  b.HasIndex("Path")
205  .IsUnique();
206 
207  b.ToTable("Instances");
208  });
209 
210  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
211  {
212  b.Property<long>("Id")
213  .ValueGeneratedOnAdd();
214 
215  b.Property<ulong>("ByondRights");
216 
217  b.Property<ulong>("ChatBotRights");
218 
219  b.Property<ulong>("ConfigurationRights");
220 
221  b.Property<ulong>("DreamDaemonRights");
222 
223  b.Property<ulong>("DreamMakerRights");
224 
225  b.Property<long>("InstanceId");
226 
227  b.Property<ulong>("InstanceUserRights");
228 
229  b.Property<ulong>("RepositoryRights");
230 
231  b.Property<long?>("UserId")
232  .IsRequired();
233 
234  b.HasKey("Id");
235 
236  b.HasIndex("InstanceId");
237 
238  b.HasIndex("UserId", "InstanceId")
239  .IsUnique();
240 
241  b.ToTable("InstanceUsers");
242  });
243 
244  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
245  {
246  b.Property<long>("Id")
247  .ValueGeneratedOnAdd();
248 
249  b.Property<ulong?>("CancelRight");
250 
251  b.Property<ulong?>("CancelRightsType");
252 
253  b.Property<bool?>("Cancelled")
254  .IsRequired();
255 
256  b.Property<long?>("CancelledById");
257 
258  b.Property<string>("Description")
259  .IsRequired();
260 
261  b.Property<string>("ExceptionDetails");
262 
263  b.Property<long>("InstanceId");
264 
265  b.Property<DateTimeOffset?>("StartedAt")
266  .IsRequired();
267 
268  b.Property<long>("StartedById");
269 
270  b.Property<DateTimeOffset?>("StoppedAt");
271 
272  b.HasKey("Id");
273 
274  b.HasIndex("CancelledById");
275 
276  b.HasIndex("InstanceId");
277 
278  b.HasIndex("StartedById");
279 
280  b.ToTable("Jobs");
281  });
282 
283  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
284  {
285  b.Property<long>("Id")
286  .ValueGeneratedOnAdd();
287 
288  b.Property<string>("AccessIdentifier")
289  .IsRequired();
290 
291  b.Property<string>("ChatChannelsJson")
292  .IsRequired();
293 
294  b.Property<string>("ChatCommandsJson")
295  .IsRequired();
296 
297  b.Property<long>("CompileJobId");
298 
299  b.Property<bool>("IsPrimary");
300 
301  b.Property<ushort>("Port");
302 
303  b.Property<int>("ProcessId");
304 
305  b.Property<int>("RebootState");
306 
307  b.Property<string>("ServerCommandsJson")
308  .IsRequired();
309 
310  b.HasKey("Id");
311 
312  b.HasIndex("CompileJobId");
313 
314  b.ToTable("ReattachInformations");
315  });
316 
317  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
318  {
319  b.Property<long>("Id")
320  .ValueGeneratedOnAdd();
321 
322  b.Property<string>("AccessToken");
323 
324  b.Property<string>("AccessUser");
325 
326  b.Property<bool?>("AutoUpdatesKeepTestMerges")
327  .IsRequired();
328 
329  b.Property<bool?>("AutoUpdatesSynchronize")
330  .IsRequired();
331 
332  b.Property<string>("CommitterEmail")
333  .IsRequired();
334 
335  b.Property<string>("CommitterName")
336  .IsRequired();
337 
338  b.Property<long>("InstanceId");
339 
340  b.Property<bool?>("PushTestMergeCommits")
341  .IsRequired();
342 
343  b.Property<bool?>("ShowTestMergeCommitters")
344  .IsRequired();
345 
346  b.HasKey("Id");
347 
348  b.HasIndex("InstanceId")
349  .IsUnique();
350 
351  b.ToTable("RepositorySettings");
352  });
353 
354  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
355  {
356  b.Property<long>("Id")
357  .ValueGeneratedOnAdd();
358 
359  b.Property<long>("RevisionInformationId");
360 
361  b.Property<long>("TestMergeId");
362 
363  b.HasKey("Id");
364 
365  b.HasIndex("RevisionInformationId");
366 
367  b.HasIndex("TestMergeId");
368 
369  b.ToTable("RevInfoTestMerges");
370  });
371 
372  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
373  {
374  b.Property<long>("Id")
375  .ValueGeneratedOnAdd();
376 
377  b.Property<string>("CommitSha")
378  .IsRequired()
379  .HasMaxLength(40);
380 
381  b.Property<long>("InstanceId");
382 
383  b.Property<string>("OriginCommitSha")
384  .IsRequired()
385  .HasMaxLength(40);
386 
387  b.HasKey("Id");
388 
389  b.HasIndex("CommitSha")
390  .IsUnique();
391 
392  b.HasIndex("InstanceId");
393 
394  b.ToTable("RevisionInformations");
395  });
396 
397  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
398  {
399  b.Property<long>("Id")
400  .ValueGeneratedOnAdd();
401 
402  b.Property<string>("Author")
403  .IsRequired();
404 
405  b.Property<string>("BodyAtMerge")
406  .IsRequired();
407 
408  b.Property<string>("Comment");
409 
410  b.Property<DateTimeOffset>("MergedAt");
411 
412  b.Property<long>("MergedById");
413 
414  b.Property<int?>("Number")
415  .IsRequired();
416 
417  b.Property<long?>("PrimaryRevisionInformationId")
418  .IsRequired();
419 
420  b.Property<string>("PullRequestRevision")
421  .IsRequired();
422 
423  b.Property<string>("TitleAtMerge")
424  .IsRequired();
425 
426  b.Property<string>("Url")
427  .IsRequired();
428 
429  b.HasKey("Id");
430 
431  b.HasIndex("MergedById");
432 
433  b.HasIndex("PrimaryRevisionInformationId")
434  .IsUnique();
435 
436  b.ToTable("TestMerges");
437  });
438 
439  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
440  {
441  b.Property<long>("Id")
442  .ValueGeneratedOnAdd();
443 
444  b.Property<ulong>("AdministrationRights");
445 
446  b.Property<string>("CanonicalName")
447  .IsRequired();
448 
449  b.Property<DateTimeOffset?>("CreatedAt")
450  .IsRequired();
451 
452  b.Property<long?>("CreatedById");
453 
454  b.Property<bool?>("Enabled")
455  .IsRequired();
456 
457  b.Property<ulong>("InstanceManagerRights");
458 
459  b.Property<DateTimeOffset?>("LastPasswordUpdate");
460 
461  b.Property<string>("Name")
462  .IsRequired();
463 
464  b.Property<string>("PasswordHash");
465 
466  b.Property<string>("SystemIdentifier");
467 
468  b.HasKey("Id");
469 
470  b.HasIndex("CanonicalName")
471  .IsUnique();
472 
473  b.HasIndex("CreatedById");
474 
475  b.ToTable("Users");
476  });
477 
478  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
479  {
480  b.Property<long>("Id")
481  .ValueGeneratedOnAdd();
482 
483  b.Property<long?>("AlphaId");
484 
485  b.Property<bool>("AlphaIsActive");
486 
487  b.Property<long?>("BravoId");
488 
489  b.Property<long>("InstanceId");
490 
491  b.HasKey("Id");
492 
493  b.HasIndex("AlphaId");
494 
495  b.HasIndex("BravoId");
496 
497  b.HasIndex("InstanceId")
498  .IsUnique();
499 
500  b.ToTable("WatchdogReattachInformations");
501  });
502 
503  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
504  {
505  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
506  .WithMany("ChatSettings")
507  .HasForeignKey("InstanceId")
508  .OnDelete(DeleteBehavior.Cascade);
509  });
510 
511  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
512  {
513  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
514  .WithMany("Channels")
515  .HasForeignKey("ChatSettingsId")
516  .OnDelete(DeleteBehavior.Cascade);
517  });
518 
519  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
520  {
521  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
522  .WithOne()
523  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
524  .OnDelete(DeleteBehavior.Restrict);
525 
526  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
527  .WithMany("CompileJobs")
528  .HasForeignKey("RevisionInformationId")
529  .OnDelete(DeleteBehavior.Cascade);
530  });
531 
532  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
533  {
534  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
535  .WithOne("DreamDaemonSettings")
536  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
537  .OnDelete(DeleteBehavior.Cascade);
538  });
539 
540  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
541  {
542  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
543  .WithOne("DreamMakerSettings")
544  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
545  .OnDelete(DeleteBehavior.Cascade);
546  });
547 
548  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
549  {
550  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
551  .WithMany("InstanceUsers")
552  .HasForeignKey("InstanceId")
553  .OnDelete(DeleteBehavior.Cascade);
554 
555  b.HasOne("Tgstation.Server.Host.Models.User")
556  .WithMany("InstanceUsers")
557  .HasForeignKey("UserId")
558  .OnDelete(DeleteBehavior.Cascade);
559  });
560 
561  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
562  {
563  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
564  .WithMany()
565  .HasForeignKey("CancelledById");
566 
567  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
568  .WithMany("Jobs")
569  .HasForeignKey("InstanceId")
570  .OnDelete(DeleteBehavior.Cascade);
571 
572  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
573  .WithMany()
574  .HasForeignKey("StartedById")
575  .OnDelete(DeleteBehavior.Cascade);
576  });
577 
578  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
579  {
580  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
581  .WithMany()
582  .HasForeignKey("CompileJobId")
583  .OnDelete(DeleteBehavior.Cascade);
584  });
585 
586  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
587  {
588  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
589  .WithOne("RepositorySettings")
590  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
591  .OnDelete(DeleteBehavior.Cascade);
592  });
593 
594  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
595  {
596  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
597  .WithMany("ActiveTestMerges")
598  .HasForeignKey("RevisionInformationId")
599  .OnDelete(DeleteBehavior.Cascade);
600 
601  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
602  .WithMany("RevisonInformations")
603  .HasForeignKey("TestMergeId")
604  .OnDelete(DeleteBehavior.Cascade);
605  });
606 
607  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
608  {
609  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
610  .WithMany("RevisionInformations")
611  .HasForeignKey("InstanceId")
612  .OnDelete(DeleteBehavior.Cascade);
613  });
614 
615  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
616  {
617  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
618  .WithMany("TestMerges")
619  .HasForeignKey("MergedById")
620  .OnDelete(DeleteBehavior.Restrict);
621 
622  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
623  .WithOne("PrimaryTestMerge")
624  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
625  .OnDelete(DeleteBehavior.Restrict);
626  });
627 
628  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
629  {
630  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
631  .WithMany("CreatedUsers")
632  .HasForeignKey("CreatedById");
633  });
634 
635  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
636  {
637  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
638  .WithMany()
639  .HasForeignKey("AlphaId");
640 
641  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
642  .WithMany()
643  .HasForeignKey("BravoId");
644 
645  b.HasOne("Tgstation.Server.Host.Models.Instance")
646  .WithOne("WatchdogReattachInformation")
647  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
648  .OnDelete(DeleteBehavior.Cascade);
649  });
650 #pragma warning restore 612, 618
651  }
652  }
653 }
+ + + +
+ + + + diff --git a/20180926034014___m_y_reattach_compile_job_required_8cs.html b/20180926034014___m_y_reattach_compile_job_required_8cs.html new file mode 100644 index 0000000000..afc01bfd5f --- /dev/null +++ b/20180926034014___m_y_reattach_compile_job_required_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180926034014_MYReattachCompileJobRequired.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20180926034014_MYReattachCompileJobRequired.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired
 Marks the CompileJobs of ReattachInformations as non-nullable for MySQL/MariaDB More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + diff --git a/20180926034014___m_y_reattach_compile_job_required_8cs_source.html b/20180926034014___m_y_reattach_compile_job_required_8cs_source.html new file mode 100644 index 0000000000..53509cd4d7 --- /dev/null +++ b/20180926034014___m_y_reattach_compile_job_required_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20180926034014_MYReattachCompileJobRequired.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20180926034014_MYReattachCompileJobRequired.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore.Migrations;
2 using System;
3 
5 {
9  public partial class MYReattachCompileJobRequired : Migration
10  {
15  protected override void Up(MigrationBuilder migrationBuilder)
16  {
17  if (migrationBuilder == null)
18  throw new ArgumentNullException(nameof(migrationBuilder));
19 
20  migrationBuilder.DropForeignKey(
21  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
22  table: "ReattachInformations");
23 
24  migrationBuilder.AlterColumn<long>(
25  name: "CompileJobId",
26  table: "ReattachInformations",
27  nullable: false,
28  oldClrType: typeof(long),
29  oldNullable: true);
30 
31  migrationBuilder.AddForeignKey(
32  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
33  table: "ReattachInformations",
34  column: "CompileJobId",
35  principalTable: "CompileJobs",
36  principalColumn: "Id",
37  onDelete: ReferentialAction.Cascade);
38  }
39 
44  protected override void Down(MigrationBuilder migrationBuilder)
45  {
46  if (migrationBuilder == null)
47  throw new ArgumentNullException(nameof(migrationBuilder));
48 
49  migrationBuilder.DropForeignKey(
50  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
51  table: "ReattachInformations");
52 
53  migrationBuilder.AlterColumn<long>(
54  name: "CompileJobId",
55  table: "ReattachInformations",
56  nullable: true,
57  oldClrType: typeof(long));
58 
59  migrationBuilder.AddForeignKey(
60  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
61  table: "ReattachInformations",
62  column: "CompileJobId",
63  principalTable: "CompileJobs",
64  principalColumn: "Id",
65  onDelete: ReferentialAction.Restrict);
66  }
67  }
68 }
Marks the CompileJobs of ReattachInformations as non-nullable for MySQL/MariaDB
+ +
override void Up(MigrationBuilder migrationBuilder)
Applies the migration
+ +
override void Down(MigrationBuilder migrationBuilder)
Unapplies the migration
+
+ + + + diff --git a/20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs.html b/20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs.html new file mode 100644 index 0000000000..c3d68c9ccf --- /dev/null +++ b/20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20181124231534_MSToggleTestmergeComments.Designer.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20181124231534_MSToggleTestmergeComments.Designer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments
 Add the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MSSQL More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + 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 new file mode 100644 index 0000000000..a86adf7199 --- /dev/null +++ b/20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20181124231534_MSToggleTestmergeComments.Designer.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20181124231534_MSToggleTestmergeComments.Designer.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated />
2 using System;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.EntityFrameworkCore.Infrastructure;
5 using Microsoft.EntityFrameworkCore.Metadata;
6 using Microsoft.EntityFrameworkCore.Migrations;
7 using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
8 
10 {
11  [DbContext(typeof(SqlServerDatabaseContext))]
12  [Migration("20181124231534_MSToggleTestmergeComments")]
13  partial class MSToggleTestmergeComments
14  {
19  protected override void BuildTargetModel(ModelBuilder modelBuilder)
20  {
21 #pragma warning disable 612, 618
22  modelBuilder
23  .HasAnnotation("ProductVersion", "2.1.4-rtm-31024")
24  .HasAnnotation("Relational:MaxIdentifierLength", 128)
25  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
26 
27  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
28  {
29  b.Property<long>("Id")
30  .ValueGeneratedOnAdd()
31  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
32 
33  b.Property<string>("ConnectionString")
34  .IsRequired();
35 
36  b.Property<bool?>("Enabled");
37 
38  b.Property<long>("InstanceId");
39 
40  b.Property<string>("Name")
41  .IsRequired();
42 
43  b.Property<int?>("Provider");
44 
45  b.HasKey("Id");
46 
47  b.HasIndex("InstanceId");
48 
49  b.HasIndex("Name")
50  .IsUnique();
51 
52  b.ToTable("ChatBots");
53  });
54 
55  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
56  {
57  b.Property<long>("Id")
58  .ValueGeneratedOnAdd()
59  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
60 
61  b.Property<long>("ChatSettingsId");
62 
63  b.Property<decimal?>("DiscordChannelId")
64  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
65 
66  b.Property<string>("IrcChannel");
67 
68  b.Property<bool?>("IsAdminChannel")
69  .IsRequired();
70 
71  b.Property<bool?>("IsUpdatesChannel")
72  .IsRequired();
73 
74  b.Property<bool?>("IsWatchdogChannel")
75  .IsRequired();
76 
77  b.Property<string>("Tag");
78 
79  b.HasKey("Id");
80 
81  b.HasIndex("ChatSettingsId", "DiscordChannelId")
82  .IsUnique()
83  .HasFilter("[DiscordChannelId] IS NOT NULL");
84 
85  b.HasIndex("ChatSettingsId", "IrcChannel")
86  .IsUnique()
87  .HasFilter("[IrcChannel] IS NOT NULL");
88 
89  b.ToTable("ChatChannels");
90  });
91 
92  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
93  {
94  b.Property<long>("Id")
95  .ValueGeneratedOnAdd()
96  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
97 
98  b.Property<string>("ByondVersion")
99  .IsRequired();
100 
101  b.Property<Guid?>("DirectoryName")
102  .IsRequired();
103 
104  b.Property<string>("DmeName")
105  .IsRequired();
106 
107  b.Property<long>("JobId");
108 
109  b.Property<int>("MinimumSecurityLevel");
110 
111  b.Property<string>("Output")
112  .IsRequired();
113 
114  b.Property<long>("RevisionInformationId");
115 
116  b.HasKey("Id");
117 
118  b.HasIndex("DirectoryName");
119 
120  b.HasIndex("JobId")
121  .IsUnique();
122 
123  b.HasIndex("RevisionInformationId");
124 
125  b.ToTable("CompileJobs");
126  });
127 
128  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
129  {
130  b.Property<long>("Id")
131  .ValueGeneratedOnAdd()
132  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
133 
134  b.Property<string>("AccessToken");
135 
136  b.Property<bool?>("AllowWebClient")
137  .IsRequired();
138 
139  b.Property<bool?>("AutoStart")
140  .IsRequired();
141 
142  b.Property<long>("InstanceId");
143 
144  b.Property<int>("PrimaryPort");
145 
146  b.Property<int?>("ProcessId");
147 
148  b.Property<int>("SecondaryPort");
149 
150  b.Property<int>("SecurityLevel");
151 
152  b.Property<bool?>("SoftRestart")
153  .IsRequired();
154 
155  b.Property<bool?>("SoftShutdown")
156  .IsRequired();
157 
158  b.Property<long>("StartupTimeout");
159 
160  b.HasKey("Id");
161 
162  b.HasIndex("InstanceId")
163  .IsUnique();
164 
165  b.ToTable("DreamDaemonSettings");
166  });
167 
168  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
169  {
170  b.Property<long>("Id")
171  .ValueGeneratedOnAdd()
172  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
173 
174  b.Property<int>("ApiValidationPort");
175 
176  b.Property<int>("ApiValidationSecurityLevel");
177 
178  b.Property<long>("InstanceId");
179 
180  b.Property<string>("ProjectName");
181 
182  b.HasKey("Id");
183 
184  b.HasIndex("InstanceId")
185  .IsUnique();
186 
187  b.ToTable("DreamMakerSettings");
188  });
189 
190  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
191  {
192  b.Property<long>("Id")
193  .ValueGeneratedOnAdd()
194  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
195 
196  b.Property<long>("AutoUpdateInterval");
197 
198  b.Property<int>("ConfigurationType");
199 
200  b.Property<string>("Name")
201  .IsRequired();
202 
203  b.Property<bool?>("Online")
204  .IsRequired();
205 
206  b.Property<string>("Path")
207  .IsRequired();
208 
209  b.HasKey("Id");
210 
211  b.HasIndex("Path")
212  .IsUnique();
213 
214  b.ToTable("Instances");
215  });
216 
217  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
218  {
219  b.Property<long>("Id")
220  .ValueGeneratedOnAdd()
221  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
222 
223  b.Property<decimal>("ByondRights")
224  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
225 
226  b.Property<decimal>("ChatBotRights")
227  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
228 
229  b.Property<decimal>("ConfigurationRights")
230  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
231 
232  b.Property<decimal>("DreamDaemonRights")
233  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
234 
235  b.Property<decimal>("DreamMakerRights")
236  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
237 
238  b.Property<long>("InstanceId");
239 
240  b.Property<decimal>("InstanceUserRights")
241  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
242 
243  b.Property<decimal>("RepositoryRights")
244  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
245 
246  b.Property<long?>("UserId")
247  .IsRequired();
248 
249  b.HasKey("Id");
250 
251  b.HasIndex("InstanceId");
252 
253  b.HasIndex("UserId", "InstanceId")
254  .IsUnique();
255 
256  b.ToTable("InstanceUsers");
257  });
258 
259  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
260  {
261  b.Property<long>("Id")
262  .ValueGeneratedOnAdd()
263  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
264 
265  b.Property<decimal?>("CancelRight")
266  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
267 
268  b.Property<decimal?>("CancelRightsType")
269  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
270 
271  b.Property<bool?>("Cancelled")
272  .IsRequired();
273 
274  b.Property<long?>("CancelledById");
275 
276  b.Property<string>("Description")
277  .IsRequired();
278 
279  b.Property<string>("ExceptionDetails");
280 
281  b.Property<long>("InstanceId");
282 
283  b.Property<DateTimeOffset?>("StartedAt")
284  .IsRequired();
285 
286  b.Property<long>("StartedById");
287 
288  b.Property<DateTimeOffset?>("StoppedAt");
289 
290  b.HasKey("Id");
291 
292  b.HasIndex("CancelledById");
293 
294  b.HasIndex("InstanceId");
295 
296  b.HasIndex("StartedById");
297 
298  b.ToTable("Jobs");
299  });
300 
301  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
302  {
303  b.Property<long>("Id")
304  .ValueGeneratedOnAdd()
305  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
306 
307  b.Property<string>("AccessIdentifier")
308  .IsRequired();
309 
310  b.Property<string>("ChatChannelsJson")
311  .IsRequired();
312 
313  b.Property<string>("ChatCommandsJson")
314  .IsRequired();
315 
316  b.Property<long>("CompileJobId");
317 
318  b.Property<bool>("IsPrimary");
319 
320  b.Property<int>("Port");
321 
322  b.Property<int>("ProcessId");
323 
324  b.Property<int>("RebootState");
325 
326  b.Property<string>("ServerCommandsJson")
327  .IsRequired();
328 
329  b.HasKey("Id");
330 
331  b.HasIndex("CompileJobId");
332 
333  b.ToTable("ReattachInformations");
334  });
335 
336  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
337  {
338  b.Property<long>("Id")
339  .ValueGeneratedOnAdd()
340  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
341 
342  b.Property<string>("AccessToken");
343 
344  b.Property<string>("AccessUser");
345 
346  b.Property<bool?>("AutoUpdatesKeepTestMerges")
347  .IsRequired();
348 
349  b.Property<bool?>("AutoUpdatesSynchronize")
350  .IsRequired();
351 
352  b.Property<string>("CommitterEmail")
353  .IsRequired();
354 
355  b.Property<string>("CommitterName")
356  .IsRequired();
357 
358  b.Property<long>("InstanceId");
359 
360  b.Property<bool?>("PostTestMergeComment")
361  .IsRequired();
362 
363  b.Property<bool?>("PushTestMergeCommits")
364  .IsRequired();
365 
366  b.Property<bool?>("ShowTestMergeCommitters")
367  .IsRequired();
368 
369  b.HasKey("Id");
370 
371  b.HasIndex("InstanceId")
372  .IsUnique();
373 
374  b.ToTable("RepositorySettings");
375  });
376 
377  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
378  {
379  b.Property<long>("Id")
380  .ValueGeneratedOnAdd()
381  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
382 
383  b.Property<long>("RevisionInformationId");
384 
385  b.Property<long>("TestMergeId");
386 
387  b.HasKey("Id");
388 
389  b.HasIndex("RevisionInformationId");
390 
391  b.HasIndex("TestMergeId");
392 
393  b.ToTable("RevInfoTestMerges");
394  });
395 
396  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
397  {
398  b.Property<long>("Id")
399  .ValueGeneratedOnAdd()
400  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
401 
402  b.Property<string>("CommitSha")
403  .IsRequired()
404  .HasMaxLength(40);
405 
406  b.Property<long>("InstanceId");
407 
408  b.Property<string>("OriginCommitSha")
409  .IsRequired()
410  .HasMaxLength(40);
411 
412  b.HasKey("Id");
413 
414  b.HasIndex("CommitSha")
415  .IsUnique();
416 
417  b.HasIndex("InstanceId");
418 
419  b.ToTable("RevisionInformations");
420  });
421 
422  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
423  {
424  b.Property<long>("Id")
425  .ValueGeneratedOnAdd()
426  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
427 
428  b.Property<string>("Author")
429  .IsRequired();
430 
431  b.Property<string>("BodyAtMerge")
432  .IsRequired();
433 
434  b.Property<string>("Comment");
435 
436  b.Property<DateTimeOffset>("MergedAt");
437 
438  b.Property<long>("MergedById");
439 
440  b.Property<int?>("Number")
441  .IsRequired();
442 
443  b.Property<long?>("PrimaryRevisionInformationId")
444  .IsRequired();
445 
446  b.Property<string>("PullRequestRevision")
447  .IsRequired();
448 
449  b.Property<string>("TitleAtMerge")
450  .IsRequired();
451 
452  b.Property<string>("Url")
453  .IsRequired();
454 
455  b.HasKey("Id");
456 
457  b.HasIndex("MergedById");
458 
459  b.HasIndex("PrimaryRevisionInformationId")
460  .IsUnique();
461 
462  b.ToTable("TestMerges");
463  });
464 
465  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
466  {
467  b.Property<long>("Id")
468  .ValueGeneratedOnAdd()
469  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
470 
471  b.Property<decimal>("AdministrationRights")
472  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
473 
474  b.Property<string>("CanonicalName")
475  .IsRequired();
476 
477  b.Property<DateTimeOffset?>("CreatedAt")
478  .IsRequired();
479 
480  b.Property<long?>("CreatedById");
481 
482  b.Property<bool?>("Enabled")
483  .IsRequired();
484 
485  b.Property<decimal>("InstanceManagerRights")
486  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
487 
488  b.Property<DateTimeOffset?>("LastPasswordUpdate");
489 
490  b.Property<string>("Name")
491  .IsRequired();
492 
493  b.Property<string>("PasswordHash");
494 
495  b.Property<string>("SystemIdentifier");
496 
497  b.HasKey("Id");
498 
499  b.HasIndex("CanonicalName")
500  .IsUnique();
501 
502  b.HasIndex("CreatedById");
503 
504  b.ToTable("Users");
505  });
506 
507  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
508  {
509  b.Property<long>("Id")
510  .ValueGeneratedOnAdd()
511  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
512 
513  b.Property<long?>("AlphaId");
514 
515  b.Property<bool>("AlphaIsActive");
516 
517  b.Property<long?>("BravoId");
518 
519  b.Property<long>("InstanceId");
520 
521  b.HasKey("Id");
522 
523  b.HasIndex("AlphaId");
524 
525  b.HasIndex("BravoId");
526 
527  b.HasIndex("InstanceId")
528  .IsUnique();
529 
530  b.ToTable("WatchdogReattachInformations");
531  });
532 
533  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
534  {
535  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
536  .WithMany("ChatSettings")
537  .HasForeignKey("InstanceId")
538  .OnDelete(DeleteBehavior.Cascade);
539  });
540 
541  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
542  {
543  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
544  .WithMany("Channels")
545  .HasForeignKey("ChatSettingsId")
546  .OnDelete(DeleteBehavior.Cascade);
547  });
548 
549  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
550  {
551  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
552  .WithOne()
553  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
554  .OnDelete(DeleteBehavior.Restrict);
555 
556  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
557  .WithMany("CompileJobs")
558  .HasForeignKey("RevisionInformationId")
559  .OnDelete(DeleteBehavior.Cascade);
560  });
561 
562  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
563  {
564  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
565  .WithOne("DreamDaemonSettings")
566  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
567  .OnDelete(DeleteBehavior.Cascade);
568  });
569 
570  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
571  {
572  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
573  .WithOne("DreamMakerSettings")
574  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
575  .OnDelete(DeleteBehavior.Cascade);
576  });
577 
578  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
579  {
580  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
581  .WithMany("InstanceUsers")
582  .HasForeignKey("InstanceId")
583  .OnDelete(DeleteBehavior.Cascade);
584 
585  b.HasOne("Tgstation.Server.Host.Models.User")
586  .WithMany("InstanceUsers")
587  .HasForeignKey("UserId")
588  .OnDelete(DeleteBehavior.Cascade);
589  });
590 
591  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
592  {
593  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
594  .WithMany()
595  .HasForeignKey("CancelledById");
596 
597  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
598  .WithMany("Jobs")
599  .HasForeignKey("InstanceId")
600  .OnDelete(DeleteBehavior.Cascade);
601 
602  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
603  .WithMany()
604  .HasForeignKey("StartedById")
605  .OnDelete(DeleteBehavior.Cascade);
606  });
607 
608  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
609  {
610  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
611  .WithMany()
612  .HasForeignKey("CompileJobId")
613  .OnDelete(DeleteBehavior.Cascade);
614  });
615 
616  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
617  {
618  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
619  .WithOne("RepositorySettings")
620  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
621  .OnDelete(DeleteBehavior.Cascade);
622  });
623 
624  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
625  {
626  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
627  .WithMany("ActiveTestMerges")
628  .HasForeignKey("RevisionInformationId")
629  .OnDelete(DeleteBehavior.Cascade);
630 
631  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
632  .WithMany("RevisonInformations")
633  .HasForeignKey("TestMergeId")
634  .OnDelete(DeleteBehavior.Cascade);
635  });
636 
637  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
638  {
639  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
640  .WithMany("RevisionInformations")
641  .HasForeignKey("InstanceId")
642  .OnDelete(DeleteBehavior.Cascade);
643  });
644 
645  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
646  {
647  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
648  .WithMany("TestMerges")
649  .HasForeignKey("MergedById")
650  .OnDelete(DeleteBehavior.Restrict);
651 
652  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
653  .WithOne("PrimaryTestMerge")
654  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
655  .OnDelete(DeleteBehavior.Restrict);
656  });
657 
658  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
659  {
660  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
661  .WithMany("CreatedUsers")
662  .HasForeignKey("CreatedById");
663  });
664 
665  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
666  {
667  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
668  .WithMany()
669  .HasForeignKey("AlphaId");
670 
671  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
672  .WithMany()
673  .HasForeignKey("BravoId");
674 
675  b.HasOne("Tgstation.Server.Host.Models.Instance")
676  .WithOne("WatchdogReattachInformation")
677  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
678  .OnDelete(DeleteBehavior.Cascade);
679  });
680 #pragma warning restore 612, 618
681  }
682  }
683 }
+ + +
override void BuildTargetModel(ModelBuilder modelBuilder)
Builds the target model
+
+ + + + diff --git a/20181124231534___m_s_toggle_testmerge_comments_8cs.html b/20181124231534___m_s_toggle_testmerge_comments_8cs.html new file mode 100644 index 0000000000..76c32254ae --- /dev/null +++ b/20181124231534___m_s_toggle_testmerge_comments_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20181124231534_MSToggleTestmergeComments.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20181124231534_MSToggleTestmergeComments.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments
 Add the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MSSQL More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + diff --git a/20181124231534___m_s_toggle_testmerge_comments_8cs_source.html b/20181124231534___m_s_toggle_testmerge_comments_8cs_source.html new file mode 100644 index 0000000000..05f21b5c07 --- /dev/null +++ b/20181124231534___m_s_toggle_testmerge_comments_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20181124231534_MSToggleTestmergeComments.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20181124231534_MSToggleTestmergeComments.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore.Migrations;
2 using System;
3 
5 {
9  public partial class MSToggleTestmergeComments : Migration
10  {
15  protected override void Up(MigrationBuilder migrationBuilder)
16  {
17  if (migrationBuilder == null)
18  throw new ArgumentNullException(nameof(migrationBuilder));
19 
20  migrationBuilder.AddColumn<bool>(
21  name: "PostTestMergeComment",
22  table: "RepositorySettings",
23  nullable: false,
24  defaultValue: true);
25  }
26 
31  protected override void Down(MigrationBuilder migrationBuilder)
32  {
33  if (migrationBuilder == null)
34  throw new ArgumentNullException(nameof(migrationBuilder));
35 
36  migrationBuilder.DropColumn(
37  name: "PostTestMergeComment",
38  table: "RepositorySettings");
39  }
40  }
41 }
override void Up(MigrationBuilder migrationBuilder)
Applies the migration
+
override void Down(MigrationBuilder migrationBuilder)
Unapplies the migration
+ + +
Add the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MSSQL
+
+ + + + diff --git a/20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs.html b/20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs.html new file mode 100644 index 0000000000..b067cabb6a --- /dev/null +++ b/20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20181124231549_MYToggleTestmergeComments.Designer.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20181124231549_MYToggleTestmergeComments.Designer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments
 Add the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MySQL/MariaDB More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + 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 new file mode 100644 index 0000000000..a5ec3ce136 --- /dev/null +++ b/20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20181124231549_MYToggleTestmergeComments.Designer.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20181124231549_MYToggleTestmergeComments.Designer.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated />
2 using System;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.EntityFrameworkCore.Infrastructure;
5 using Microsoft.EntityFrameworkCore.Migrations;
6 
8 {
9  [DbContext(typeof(MySqlDatabaseContext))]
10  [Migration("20181124231549_MYToggleTestmergeComments")]
11  partial class MYToggleTestmergeComments
12  {
17  protected override void BuildTargetModel(ModelBuilder modelBuilder)
18  {
19 #pragma warning disable 612, 618
20  modelBuilder
21  .HasAnnotation("ProductVersion", "2.1.4-rtm-31024")
22  .HasAnnotation("Relational:MaxIdentifierLength", 64);
23 
24  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
25  {
26  b.Property<long>("Id")
27  .ValueGeneratedOnAdd();
28 
29  b.Property<string>("ConnectionString")
30  .IsRequired();
31 
32  b.Property<bool?>("Enabled");
33 
34  b.Property<long>("InstanceId");
35 
36  b.Property<string>("Name")
37  .IsRequired();
38 
39  b.Property<int?>("Provider");
40 
41  b.HasKey("Id");
42 
43  b.HasIndex("InstanceId");
44 
45  b.HasIndex("Name")
46  .IsUnique();
47 
48  b.ToTable("ChatBots");
49  });
50 
51  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
52  {
53  b.Property<long>("Id")
54  .ValueGeneratedOnAdd();
55 
56  b.Property<long>("ChatSettingsId");
57 
58  b.Property<ulong?>("DiscordChannelId");
59 
60  b.Property<string>("IrcChannel");
61 
62  b.Property<bool?>("IsAdminChannel")
63  .IsRequired();
64 
65  b.Property<bool?>("IsUpdatesChannel")
66  .IsRequired();
67 
68  b.Property<bool?>("IsWatchdogChannel")
69  .IsRequired();
70 
71  b.Property<string>("Tag");
72 
73  b.HasKey("Id");
74 
75  b.HasIndex("ChatSettingsId", "DiscordChannelId")
76  .IsUnique();
77 
78  b.HasIndex("ChatSettingsId", "IrcChannel")
79  .IsUnique();
80 
81  b.ToTable("ChatChannels");
82  });
83 
84  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
85  {
86  b.Property<long>("Id")
87  .ValueGeneratedOnAdd();
88 
89  b.Property<string>("ByondVersion")
90  .IsRequired();
91 
92  b.Property<Guid?>("DirectoryName")
93  .IsRequired();
94 
95  b.Property<string>("DmeName")
96  .IsRequired();
97 
98  b.Property<long>("JobId");
99 
100  b.Property<int>("MinimumSecurityLevel");
101 
102  b.Property<string>("Output")
103  .IsRequired();
104 
105  b.Property<long>("RevisionInformationId");
106 
107  b.HasKey("Id");
108 
109  b.HasIndex("DirectoryName");
110 
111  b.HasIndex("JobId")
112  .IsUnique();
113 
114  b.HasIndex("RevisionInformationId");
115 
116  b.ToTable("CompileJobs");
117  });
118 
119  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
120  {
121  b.Property<long>("Id")
122  .ValueGeneratedOnAdd();
123 
124  b.Property<string>("AccessToken");
125 
126  b.Property<bool?>("AllowWebClient")
127  .IsRequired();
128 
129  b.Property<bool?>("AutoStart")
130  .IsRequired();
131 
132  b.Property<long>("InstanceId");
133 
134  b.Property<ushort?>("PrimaryPort")
135  .IsRequired();
136 
137  b.Property<int?>("ProcessId");
138 
139  b.Property<ushort?>("SecondaryPort")
140  .IsRequired();
141 
142  b.Property<int>("SecurityLevel");
143 
144  b.Property<bool?>("SoftRestart")
145  .IsRequired();
146 
147  b.Property<bool?>("SoftShutdown")
148  .IsRequired();
149 
150  b.Property<uint?>("StartupTimeout")
151  .IsRequired();
152 
153  b.HasKey("Id");
154 
155  b.HasIndex("InstanceId")
156  .IsUnique();
157 
158  b.ToTable("DreamDaemonSettings");
159  });
160 
161  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
162  {
163  b.Property<long>("Id")
164  .ValueGeneratedOnAdd();
165 
166  b.Property<ushort?>("ApiValidationPort")
167  .IsRequired();
168 
169  b.Property<int>("ApiValidationSecurityLevel");
170 
171  b.Property<long>("InstanceId");
172 
173  b.Property<string>("ProjectName");
174 
175  b.HasKey("Id");
176 
177  b.HasIndex("InstanceId")
178  .IsUnique();
179 
180  b.ToTable("DreamMakerSettings");
181  });
182 
183  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
184  {
185  b.Property<long>("Id")
186  .ValueGeneratedOnAdd();
187 
188  b.Property<uint?>("AutoUpdateInterval")
189  .IsRequired();
190 
191  b.Property<int>("ConfigurationType");
192 
193  b.Property<string>("Name")
194  .IsRequired();
195 
196  b.Property<bool?>("Online")
197  .IsRequired();
198 
199  b.Property<string>("Path")
200  .IsRequired();
201 
202  b.HasKey("Id");
203 
204  b.HasIndex("Path")
205  .IsUnique();
206 
207  b.ToTable("Instances");
208  });
209 
210  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
211  {
212  b.Property<long>("Id")
213  .ValueGeneratedOnAdd();
214 
215  b.Property<ulong>("ByondRights");
216 
217  b.Property<ulong>("ChatBotRights");
218 
219  b.Property<ulong>("ConfigurationRights");
220 
221  b.Property<ulong>("DreamDaemonRights");
222 
223  b.Property<ulong>("DreamMakerRights");
224 
225  b.Property<long>("InstanceId");
226 
227  b.Property<ulong>("InstanceUserRights");
228 
229  b.Property<ulong>("RepositoryRights");
230 
231  b.Property<long?>("UserId")
232  .IsRequired();
233 
234  b.HasKey("Id");
235 
236  b.HasIndex("InstanceId");
237 
238  b.HasIndex("UserId", "InstanceId")
239  .IsUnique();
240 
241  b.ToTable("InstanceUsers");
242  });
243 
244  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
245  {
246  b.Property<long>("Id")
247  .ValueGeneratedOnAdd();
248 
249  b.Property<ulong?>("CancelRight");
250 
251  b.Property<ulong?>("CancelRightsType");
252 
253  b.Property<bool?>("Cancelled")
254  .IsRequired();
255 
256  b.Property<long?>("CancelledById");
257 
258  b.Property<string>("Description")
259  .IsRequired();
260 
261  b.Property<string>("ExceptionDetails");
262 
263  b.Property<long>("InstanceId");
264 
265  b.Property<DateTimeOffset?>("StartedAt")
266  .IsRequired();
267 
268  b.Property<long>("StartedById");
269 
270  b.Property<DateTimeOffset?>("StoppedAt");
271 
272  b.HasKey("Id");
273 
274  b.HasIndex("CancelledById");
275 
276  b.HasIndex("InstanceId");
277 
278  b.HasIndex("StartedById");
279 
280  b.ToTable("Jobs");
281  });
282 
283  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
284  {
285  b.Property<long>("Id")
286  .ValueGeneratedOnAdd();
287 
288  b.Property<string>("AccessIdentifier")
289  .IsRequired();
290 
291  b.Property<string>("ChatChannelsJson")
292  .IsRequired();
293 
294  b.Property<string>("ChatCommandsJson")
295  .IsRequired();
296 
297  b.Property<long>("CompileJobId");
298 
299  b.Property<bool>("IsPrimary");
300 
301  b.Property<ushort>("Port");
302 
303  b.Property<int>("ProcessId");
304 
305  b.Property<int>("RebootState");
306 
307  b.Property<string>("ServerCommandsJson")
308  .IsRequired();
309 
310  b.HasKey("Id");
311 
312  b.HasIndex("CompileJobId");
313 
314  b.ToTable("ReattachInformations");
315  });
316 
317  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
318  {
319  b.Property<long>("Id")
320  .ValueGeneratedOnAdd();
321 
322  b.Property<string>("AccessToken");
323 
324  b.Property<string>("AccessUser");
325 
326  b.Property<bool?>("AutoUpdatesKeepTestMerges")
327  .IsRequired();
328 
329  b.Property<bool?>("AutoUpdatesSynchronize")
330  .IsRequired();
331 
332  b.Property<string>("CommitterEmail")
333  .IsRequired();
334 
335  b.Property<string>("CommitterName")
336  .IsRequired();
337 
338  b.Property<long>("InstanceId");
339 
340  b.Property<bool?>("PostTestMergeComment")
341  .IsRequired();
342 
343  b.Property<bool?>("PushTestMergeCommits")
344  .IsRequired();
345 
346  b.Property<bool?>("ShowTestMergeCommitters")
347  .IsRequired();
348 
349  b.HasKey("Id");
350 
351  b.HasIndex("InstanceId")
352  .IsUnique();
353 
354  b.ToTable("RepositorySettings");
355  });
356 
357  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
358  {
359  b.Property<long>("Id")
360  .ValueGeneratedOnAdd();
361 
362  b.Property<long>("RevisionInformationId");
363 
364  b.Property<long>("TestMergeId");
365 
366  b.HasKey("Id");
367 
368  b.HasIndex("RevisionInformationId");
369 
370  b.HasIndex("TestMergeId");
371 
372  b.ToTable("RevInfoTestMerges");
373  });
374 
375  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
376  {
377  b.Property<long>("Id")
378  .ValueGeneratedOnAdd();
379 
380  b.Property<string>("CommitSha")
381  .IsRequired()
382  .HasMaxLength(40);
383 
384  b.Property<long>("InstanceId");
385 
386  b.Property<string>("OriginCommitSha")
387  .IsRequired()
388  .HasMaxLength(40);
389 
390  b.HasKey("Id");
391 
392  b.HasIndex("CommitSha")
393  .IsUnique();
394 
395  b.HasIndex("InstanceId");
396 
397  b.ToTable("RevisionInformations");
398  });
399 
400  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
401  {
402  b.Property<long>("Id")
403  .ValueGeneratedOnAdd();
404 
405  b.Property<string>("Author")
406  .IsRequired();
407 
408  b.Property<string>("BodyAtMerge")
409  .IsRequired();
410 
411  b.Property<string>("Comment");
412 
413  b.Property<DateTimeOffset>("MergedAt");
414 
415  b.Property<long>("MergedById");
416 
417  b.Property<int?>("Number")
418  .IsRequired();
419 
420  b.Property<long?>("PrimaryRevisionInformationId")
421  .IsRequired();
422 
423  b.Property<string>("PullRequestRevision")
424  .IsRequired();
425 
426  b.Property<string>("TitleAtMerge")
427  .IsRequired();
428 
429  b.Property<string>("Url")
430  .IsRequired();
431 
432  b.HasKey("Id");
433 
434  b.HasIndex("MergedById");
435 
436  b.HasIndex("PrimaryRevisionInformationId")
437  .IsUnique();
438 
439  b.ToTable("TestMerges");
440  });
441 
442  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
443  {
444  b.Property<long>("Id")
445  .ValueGeneratedOnAdd();
446 
447  b.Property<ulong>("AdministrationRights");
448 
449  b.Property<string>("CanonicalName")
450  .IsRequired();
451 
452  b.Property<DateTimeOffset?>("CreatedAt")
453  .IsRequired();
454 
455  b.Property<long?>("CreatedById");
456 
457  b.Property<bool?>("Enabled")
458  .IsRequired();
459 
460  b.Property<ulong>("InstanceManagerRights");
461 
462  b.Property<DateTimeOffset?>("LastPasswordUpdate");
463 
464  b.Property<string>("Name")
465  .IsRequired();
466 
467  b.Property<string>("PasswordHash");
468 
469  b.Property<string>("SystemIdentifier");
470 
471  b.HasKey("Id");
472 
473  b.HasIndex("CanonicalName")
474  .IsUnique();
475 
476  b.HasIndex("CreatedById");
477 
478  b.ToTable("Users");
479  });
480 
481  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
482  {
483  b.Property<long>("Id")
484  .ValueGeneratedOnAdd();
485 
486  b.Property<long?>("AlphaId");
487 
488  b.Property<bool>("AlphaIsActive");
489 
490  b.Property<long?>("BravoId");
491 
492  b.Property<long>("InstanceId");
493 
494  b.HasKey("Id");
495 
496  b.HasIndex("AlphaId");
497 
498  b.HasIndex("BravoId");
499 
500  b.HasIndex("InstanceId")
501  .IsUnique();
502 
503  b.ToTable("WatchdogReattachInformations");
504  });
505 
506  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
507  {
508  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
509  .WithMany("ChatSettings")
510  .HasForeignKey("InstanceId")
511  .OnDelete(DeleteBehavior.Cascade);
512  });
513 
514  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
515  {
516  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
517  .WithMany("Channels")
518  .HasForeignKey("ChatSettingsId")
519  .OnDelete(DeleteBehavior.Cascade);
520  });
521 
522  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
523  {
524  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
525  .WithOne()
526  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
527  .OnDelete(DeleteBehavior.Restrict);
528 
529  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
530  .WithMany("CompileJobs")
531  .HasForeignKey("RevisionInformationId")
532  .OnDelete(DeleteBehavior.Cascade);
533  });
534 
535  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
536  {
537  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
538  .WithOne("DreamDaemonSettings")
539  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
540  .OnDelete(DeleteBehavior.Cascade);
541  });
542 
543  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
544  {
545  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
546  .WithOne("DreamMakerSettings")
547  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
548  .OnDelete(DeleteBehavior.Cascade);
549  });
550 
551  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
552  {
553  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
554  .WithMany("InstanceUsers")
555  .HasForeignKey("InstanceId")
556  .OnDelete(DeleteBehavior.Cascade);
557 
558  b.HasOne("Tgstation.Server.Host.Models.User")
559  .WithMany("InstanceUsers")
560  .HasForeignKey("UserId")
561  .OnDelete(DeleteBehavior.Cascade);
562  });
563 
564  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
565  {
566  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
567  .WithMany()
568  .HasForeignKey("CancelledById");
569 
570  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
571  .WithMany("Jobs")
572  .HasForeignKey("InstanceId")
573  .OnDelete(DeleteBehavior.Cascade);
574 
575  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
576  .WithMany()
577  .HasForeignKey("StartedById")
578  .OnDelete(DeleteBehavior.Cascade);
579  });
580 
581  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
582  {
583  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
584  .WithMany()
585  .HasForeignKey("CompileJobId")
586  .OnDelete(DeleteBehavior.Cascade);
587  });
588 
589  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
590  {
591  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
592  .WithOne("RepositorySettings")
593  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
594  .OnDelete(DeleteBehavior.Cascade);
595  });
596 
597  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
598  {
599  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
600  .WithMany("ActiveTestMerges")
601  .HasForeignKey("RevisionInformationId")
602  .OnDelete(DeleteBehavior.Cascade);
603 
604  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
605  .WithMany("RevisonInformations")
606  .HasForeignKey("TestMergeId")
607  .OnDelete(DeleteBehavior.Cascade);
608  });
609 
610  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
611  {
612  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
613  .WithMany("RevisionInformations")
614  .HasForeignKey("InstanceId")
615  .OnDelete(DeleteBehavior.Cascade);
616  });
617 
618  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
619  {
620  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
621  .WithMany("TestMerges")
622  .HasForeignKey("MergedById")
623  .OnDelete(DeleteBehavior.Restrict);
624 
625  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
626  .WithOne("PrimaryTestMerge")
627  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
628  .OnDelete(DeleteBehavior.Restrict);
629  });
630 
631  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
632  {
633  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
634  .WithMany("CreatedUsers")
635  .HasForeignKey("CreatedById");
636  });
637 
638  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
639  {
640  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
641  .WithMany()
642  .HasForeignKey("AlphaId");
643 
644  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
645  .WithMany()
646  .HasForeignKey("BravoId");
647 
648  b.HasOne("Tgstation.Server.Host.Models.Instance")
649  .WithOne("WatchdogReattachInformation")
650  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
651  .OnDelete(DeleteBehavior.Cascade);
652  });
653 #pragma warning restore 612, 618
654  }
655  }
656 }
override void BuildTargetModel(ModelBuilder modelBuilder)
Builds the target model
+ + + +
+ + + + diff --git a/20181124231549___m_y_toggle_testmerge_comments_8cs.html b/20181124231549___m_y_toggle_testmerge_comments_8cs.html new file mode 100644 index 0000000000..55d2db719a --- /dev/null +++ b/20181124231549___m_y_toggle_testmerge_comments_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20181124231549_MYToggleTestmergeComments.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20181124231549_MYToggleTestmergeComments.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments
 Add the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MySQL/MariaDB More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + diff --git a/20181124231549___m_y_toggle_testmerge_comments_8cs_source.html b/20181124231549___m_y_toggle_testmerge_comments_8cs_source.html new file mode 100644 index 0000000000..29c3cd63ba --- /dev/null +++ b/20181124231549___m_y_toggle_testmerge_comments_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20181124231549_MYToggleTestmergeComments.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20181124231549_MYToggleTestmergeComments.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore.Migrations;
2 using System;
3 
5 {
9  public partial class MYToggleTestmergeComments : Migration
10  {
15  protected override void Up(MigrationBuilder migrationBuilder)
16  {
17  if (migrationBuilder == null)
18  throw new ArgumentNullException(nameof(migrationBuilder));
19 
20  migrationBuilder.AddColumn<bool>(
21  name: "PostTestMergeComment",
22  table: "RepositorySettings",
23  nullable: false,
24  defaultValue: true);
25  }
26 
31  protected override void Down(MigrationBuilder migrationBuilder)
32  {
33  if (migrationBuilder == null)
34  throw new ArgumentNullException(nameof(migrationBuilder));
35 
36  migrationBuilder.DropColumn(
37  name: "PostTestMergeComment",
38  table: "RepositorySettings");
39  }
40  }
41 }
+ +
Add the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MySQL/MariaDB
+
override void Up(MigrationBuilder migrationBuilder)
Applies the migration
+
override void Down(MigrationBuilder migrationBuilder)
Unapplies the migration
+
+ + + + 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 new file mode 100644 index 0000000000..b7c918a4e8 --- /dev/null +++ b/20190219041825___m_s_fix_rev_info_index_8_designer_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20190219041825_MSFixRevInfoIndex.Designer.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20190219041825_MSFixRevInfoIndex.Designer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MSFixRevInfoIndex
 Make commit shas non-unique per Instance for MSSQL More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + 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 new file mode 100644 index 0000000000..532d092328 --- /dev/null +++ b/20190219041825___m_s_fix_rev_info_index_8_designer_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20190219041825_MSFixRevInfoIndex.Designer.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20190219041825_MSFixRevInfoIndex.Designer.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated />
2 using System;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.EntityFrameworkCore.Infrastructure;
5 using Microsoft.EntityFrameworkCore.Metadata;
6 using Microsoft.EntityFrameworkCore.Migrations;
7 using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
8 
10 {
11  [DbContext(typeof(SqlServerDatabaseContext))]
12  [Migration("20190219041825_MSFixRevInfoIndex")]
13  partial class MSFixRevInfoIndex
14  {
19  protected override void BuildTargetModel(ModelBuilder modelBuilder)
20  {
21 #pragma warning disable 612, 618
22  modelBuilder
23  .HasAnnotation("ProductVersion", "2.1.4-rtm-31024")
24  .HasAnnotation("Relational:MaxIdentifierLength", 128)
25  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
26 
27  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
28  {
29  b.Property<long>("Id")
30  .ValueGeneratedOnAdd()
31  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
32 
33  b.Property<string>("ConnectionString")
34  .IsRequired();
35 
36  b.Property<bool?>("Enabled");
37 
38  b.Property<long>("InstanceId");
39 
40  b.Property<string>("Name")
41  .IsRequired();
42 
43  b.Property<int?>("Provider");
44 
45  b.HasKey("Id");
46 
47  b.HasIndex("InstanceId");
48 
49  b.HasIndex("Name")
50  .IsUnique();
51 
52  b.ToTable("ChatBots");
53  });
54 
55  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
56  {
57  b.Property<long>("Id")
58  .ValueGeneratedOnAdd()
59  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
60 
61  b.Property<long>("ChatSettingsId");
62 
63  b.Property<decimal?>("DiscordChannelId")
64  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
65 
66  b.Property<string>("IrcChannel");
67 
68  b.Property<bool?>("IsAdminChannel")
69  .IsRequired();
70 
71  b.Property<bool?>("IsUpdatesChannel")
72  .IsRequired();
73 
74  b.Property<bool?>("IsWatchdogChannel")
75  .IsRequired();
76 
77  b.Property<string>("Tag");
78 
79  b.HasKey("Id");
80 
81  b.HasIndex("ChatSettingsId", "DiscordChannelId")
82  .IsUnique()
83  .HasFilter("[DiscordChannelId] IS NOT NULL");
84 
85  b.HasIndex("ChatSettingsId", "IrcChannel")
86  .IsUnique()
87  .HasFilter("[IrcChannel] IS NOT NULL");
88 
89  b.ToTable("ChatChannels");
90  });
91 
92  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
93  {
94  b.Property<long>("Id")
95  .ValueGeneratedOnAdd()
96  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
97 
98  b.Property<string>("ByondVersion")
99  .IsRequired();
100 
101  b.Property<Guid?>("DirectoryName")
102  .IsRequired();
103 
104  b.Property<string>("DmeName")
105  .IsRequired();
106 
107  b.Property<long>("JobId");
108 
109  b.Property<int>("MinimumSecurityLevel");
110 
111  b.Property<string>("Output")
112  .IsRequired();
113 
114  b.Property<long>("RevisionInformationId");
115 
116  b.HasKey("Id");
117 
118  b.HasIndex("DirectoryName");
119 
120  b.HasIndex("JobId")
121  .IsUnique();
122 
123  b.HasIndex("RevisionInformationId");
124 
125  b.ToTable("CompileJobs");
126  });
127 
128  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
129  {
130  b.Property<long>("Id")
131  .ValueGeneratedOnAdd()
132  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
133 
134  b.Property<string>("AccessToken");
135 
136  b.Property<bool?>("AllowWebClient")
137  .IsRequired();
138 
139  b.Property<bool?>("AutoStart")
140  .IsRequired();
141 
142  b.Property<long>("InstanceId");
143 
144  b.Property<int>("PrimaryPort");
145 
146  b.Property<int?>("ProcessId");
147 
148  b.Property<int>("SecondaryPort");
149 
150  b.Property<int>("SecurityLevel");
151 
152  b.Property<bool?>("SoftRestart")
153  .IsRequired();
154 
155  b.Property<bool?>("SoftShutdown")
156  .IsRequired();
157 
158  b.Property<long>("StartupTimeout");
159 
160  b.HasKey("Id");
161 
162  b.HasIndex("InstanceId")
163  .IsUnique();
164 
165  b.ToTable("DreamDaemonSettings");
166  });
167 
168  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
169  {
170  b.Property<long>("Id")
171  .ValueGeneratedOnAdd()
172  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
173 
174  b.Property<int>("ApiValidationPort");
175 
176  b.Property<int>("ApiValidationSecurityLevel");
177 
178  b.Property<long>("InstanceId");
179 
180  b.Property<string>("ProjectName");
181 
182  b.HasKey("Id");
183 
184  b.HasIndex("InstanceId")
185  .IsUnique();
186 
187  b.ToTable("DreamMakerSettings");
188  });
189 
190  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
191  {
192  b.Property<long>("Id")
193  .ValueGeneratedOnAdd()
194  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
195 
196  b.Property<long>("AutoUpdateInterval");
197 
198  b.Property<int>("ConfigurationType");
199 
200  b.Property<string>("Name")
201  .IsRequired();
202 
203  b.Property<bool?>("Online")
204  .IsRequired();
205 
206  b.Property<string>("Path")
207  .IsRequired();
208 
209  b.HasKey("Id");
210 
211  b.HasIndex("Path")
212  .IsUnique();
213 
214  b.ToTable("Instances");
215  });
216 
217  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
218  {
219  b.Property<long>("Id")
220  .ValueGeneratedOnAdd()
221  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
222 
223  b.Property<decimal>("ByondRights")
224  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
225 
226  b.Property<decimal>("ChatBotRights")
227  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
228 
229  b.Property<decimal>("ConfigurationRights")
230  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
231 
232  b.Property<decimal>("DreamDaemonRights")
233  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
234 
235  b.Property<decimal>("DreamMakerRights")
236  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
237 
238  b.Property<long>("InstanceId");
239 
240  b.Property<decimal>("InstanceUserRights")
241  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
242 
243  b.Property<decimal>("RepositoryRights")
244  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
245 
246  b.Property<long?>("UserId")
247  .IsRequired();
248 
249  b.HasKey("Id");
250 
251  b.HasIndex("InstanceId");
252 
253  b.HasIndex("UserId", "InstanceId")
254  .IsUnique();
255 
256  b.ToTable("InstanceUsers");
257  });
258 
259  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
260  {
261  b.Property<long>("Id")
262  .ValueGeneratedOnAdd()
263  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
264 
265  b.Property<decimal?>("CancelRight")
266  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
267 
268  b.Property<decimal?>("CancelRightsType")
269  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
270 
271  b.Property<bool?>("Cancelled")
272  .IsRequired();
273 
274  b.Property<long?>("CancelledById");
275 
276  b.Property<string>("Description")
277  .IsRequired();
278 
279  b.Property<string>("ExceptionDetails");
280 
281  b.Property<long>("InstanceId");
282 
283  b.Property<DateTimeOffset?>("StartedAt")
284  .IsRequired();
285 
286  b.Property<long>("StartedById");
287 
288  b.Property<DateTimeOffset?>("StoppedAt");
289 
290  b.HasKey("Id");
291 
292  b.HasIndex("CancelledById");
293 
294  b.HasIndex("InstanceId");
295 
296  b.HasIndex("StartedById");
297 
298  b.ToTable("Jobs");
299  });
300 
301  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
302  {
303  b.Property<long>("Id")
304  .ValueGeneratedOnAdd()
305  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
306 
307  b.Property<string>("AccessIdentifier")
308  .IsRequired();
309 
310  b.Property<string>("ChatChannelsJson")
311  .IsRequired();
312 
313  b.Property<string>("ChatCommandsJson")
314  .IsRequired();
315 
316  b.Property<long>("CompileJobId");
317 
318  b.Property<bool>("IsPrimary");
319 
320  b.Property<int>("Port");
321 
322  b.Property<int>("ProcessId");
323 
324  b.Property<int>("RebootState");
325 
326  b.Property<string>("ServerCommandsJson")
327  .IsRequired();
328 
329  b.HasKey("Id");
330 
331  b.HasIndex("CompileJobId");
332 
333  b.ToTable("ReattachInformations");
334  });
335 
336  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
337  {
338  b.Property<long>("Id")
339  .ValueGeneratedOnAdd()
340  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
341 
342  b.Property<string>("AccessToken");
343 
344  b.Property<string>("AccessUser");
345 
346  b.Property<bool?>("AutoUpdatesKeepTestMerges")
347  .IsRequired();
348 
349  b.Property<bool?>("AutoUpdatesSynchronize")
350  .IsRequired();
351 
352  b.Property<string>("CommitterEmail")
353  .IsRequired();
354 
355  b.Property<string>("CommitterName")
356  .IsRequired();
357 
358  b.Property<long>("InstanceId");
359 
360  b.Property<bool?>("PostTestMergeComment")
361  .IsRequired();
362 
363  b.Property<bool?>("PushTestMergeCommits")
364  .IsRequired();
365 
366  b.Property<bool?>("ShowTestMergeCommitters")
367  .IsRequired();
368 
369  b.HasKey("Id");
370 
371  b.HasIndex("InstanceId")
372  .IsUnique();
373 
374  b.ToTable("RepositorySettings");
375  });
376 
377  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
378  {
379  b.Property<long>("Id")
380  .ValueGeneratedOnAdd()
381  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
382 
383  b.Property<long>("RevisionInformationId");
384 
385  b.Property<long>("TestMergeId");
386 
387  b.HasKey("Id");
388 
389  b.HasIndex("RevisionInformationId");
390 
391  b.HasIndex("TestMergeId");
392 
393  b.ToTable("RevInfoTestMerges");
394  });
395 
396  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
397  {
398  b.Property<long>("Id")
399  .ValueGeneratedOnAdd()
400  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
401 
402  b.Property<string>("CommitSha")
403  .IsRequired()
404  .HasMaxLength(40);
405 
406  b.Property<long>("InstanceId");
407 
408  b.Property<string>("OriginCommitSha")
409  .IsRequired()
410  .HasMaxLength(40);
411 
412  b.HasKey("Id");
413 
414  b.HasIndex("InstanceId", "CommitSha")
415  .IsUnique();
416 
417  b.ToTable("RevisionInformations");
418  });
419 
420  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
421  {
422  b.Property<long>("Id")
423  .ValueGeneratedOnAdd()
424  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
425 
426  b.Property<string>("Author")
427  .IsRequired();
428 
429  b.Property<string>("BodyAtMerge")
430  .IsRequired();
431 
432  b.Property<string>("Comment");
433 
434  b.Property<DateTimeOffset>("MergedAt");
435 
436  b.Property<long>("MergedById");
437 
438  b.Property<int?>("Number")
439  .IsRequired();
440 
441  b.Property<long?>("PrimaryRevisionInformationId")
442  .IsRequired();
443 
444  b.Property<string>("PullRequestRevision")
445  .IsRequired();
446 
447  b.Property<string>("TitleAtMerge")
448  .IsRequired();
449 
450  b.Property<string>("Url")
451  .IsRequired();
452 
453  b.HasKey("Id");
454 
455  b.HasIndex("MergedById");
456 
457  b.HasIndex("PrimaryRevisionInformationId")
458  .IsUnique();
459 
460  b.ToTable("TestMerges");
461  });
462 
463  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
464  {
465  b.Property<long>("Id")
466  .ValueGeneratedOnAdd()
467  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
468 
469  b.Property<decimal>("AdministrationRights")
470  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
471 
472  b.Property<string>("CanonicalName")
473  .IsRequired();
474 
475  b.Property<DateTimeOffset?>("CreatedAt")
476  .IsRequired();
477 
478  b.Property<long?>("CreatedById");
479 
480  b.Property<bool?>("Enabled")
481  .IsRequired();
482 
483  b.Property<decimal>("InstanceManagerRights")
484  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
485 
486  b.Property<DateTimeOffset?>("LastPasswordUpdate");
487 
488  b.Property<string>("Name")
489  .IsRequired();
490 
491  b.Property<string>("PasswordHash");
492 
493  b.Property<string>("SystemIdentifier");
494 
495  b.HasKey("Id");
496 
497  b.HasIndex("CanonicalName")
498  .IsUnique();
499 
500  b.HasIndex("CreatedById");
501 
502  b.ToTable("Users");
503  });
504 
505  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
506  {
507  b.Property<long>("Id")
508  .ValueGeneratedOnAdd()
509  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
510 
511  b.Property<long?>("AlphaId");
512 
513  b.Property<bool>("AlphaIsActive");
514 
515  b.Property<long?>("BravoId");
516 
517  b.Property<long>("InstanceId");
518 
519  b.HasKey("Id");
520 
521  b.HasIndex("AlphaId");
522 
523  b.HasIndex("BravoId");
524 
525  b.HasIndex("InstanceId")
526  .IsUnique();
527 
528  b.ToTable("WatchdogReattachInformations");
529  });
530 
531  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
532  {
533  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
534  .WithMany("ChatSettings")
535  .HasForeignKey("InstanceId")
536  .OnDelete(DeleteBehavior.Cascade);
537  });
538 
539  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
540  {
541  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
542  .WithMany("Channels")
543  .HasForeignKey("ChatSettingsId")
544  .OnDelete(DeleteBehavior.Cascade);
545  });
546 
547  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
548  {
549  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
550  .WithOne()
551  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
552  .OnDelete(DeleteBehavior.Restrict);
553 
554  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
555  .WithMany("CompileJobs")
556  .HasForeignKey("RevisionInformationId")
557  .OnDelete(DeleteBehavior.Cascade);
558  });
559 
560  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
561  {
562  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
563  .WithOne("DreamDaemonSettings")
564  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
565  .OnDelete(DeleteBehavior.Cascade);
566  });
567 
568  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
569  {
570  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
571  .WithOne("DreamMakerSettings")
572  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
573  .OnDelete(DeleteBehavior.Cascade);
574  });
575 
576  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
577  {
578  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
579  .WithMany("InstanceUsers")
580  .HasForeignKey("InstanceId")
581  .OnDelete(DeleteBehavior.Cascade);
582 
583  b.HasOne("Tgstation.Server.Host.Models.User")
584  .WithMany("InstanceUsers")
585  .HasForeignKey("UserId")
586  .OnDelete(DeleteBehavior.Cascade);
587  });
588 
589  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
590  {
591  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
592  .WithMany()
593  .HasForeignKey("CancelledById");
594 
595  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
596  .WithMany("Jobs")
597  .HasForeignKey("InstanceId")
598  .OnDelete(DeleteBehavior.Cascade);
599 
600  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
601  .WithMany()
602  .HasForeignKey("StartedById")
603  .OnDelete(DeleteBehavior.Cascade);
604  });
605 
606  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
607  {
608  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
609  .WithMany()
610  .HasForeignKey("CompileJobId")
611  .OnDelete(DeleteBehavior.Cascade);
612  });
613 
614  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
615  {
616  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
617  .WithOne("RepositorySettings")
618  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
619  .OnDelete(DeleteBehavior.Cascade);
620  });
621 
622  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
623  {
624  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
625  .WithMany("ActiveTestMerges")
626  .HasForeignKey("RevisionInformationId")
627  .OnDelete(DeleteBehavior.Cascade);
628 
629  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
630  .WithMany("RevisonInformations")
631  .HasForeignKey("TestMergeId")
632  .OnDelete(DeleteBehavior.Cascade);
633  });
634 
635  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
636  {
637  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
638  .WithMany("RevisionInformations")
639  .HasForeignKey("InstanceId")
640  .OnDelete(DeleteBehavior.Cascade);
641  });
642 
643  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
644  {
645  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
646  .WithMany("TestMerges")
647  .HasForeignKey("MergedById")
648  .OnDelete(DeleteBehavior.Restrict);
649 
650  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
651  .WithOne("PrimaryTestMerge")
652  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
653  .OnDelete(DeleteBehavior.Restrict);
654  });
655 
656  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
657  {
658  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
659  .WithMany("CreatedUsers")
660  .HasForeignKey("CreatedById");
661  });
662 
663  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
664  {
665  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
666  .WithMany()
667  .HasForeignKey("AlphaId");
668 
669  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
670  .WithMany()
671  .HasForeignKey("BravoId");
672 
673  b.HasOne("Tgstation.Server.Host.Models.Instance")
674  .WithOne("WatchdogReattachInformation")
675  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
676  .OnDelete(DeleteBehavior.Cascade);
677  });
678 #pragma warning restore 612, 618
679  }
680  }
681 }
+ + +
override void BuildTargetModel(ModelBuilder modelBuilder)
Builds the target model
+
+ + + + diff --git a/20190219041825___m_s_fix_rev_info_index_8cs.html b/20190219041825___m_s_fix_rev_info_index_8cs.html new file mode 100644 index 0000000000..d45f90deae --- /dev/null +++ b/20190219041825___m_s_fix_rev_info_index_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20190219041825_MSFixRevInfoIndex.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20190219041825_MSFixRevInfoIndex.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MSFixRevInfoIndex
 Make commit shas non-unique per Instance for MSSQL More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + diff --git a/20190219041825___m_s_fix_rev_info_index_8cs_source.html b/20190219041825___m_s_fix_rev_info_index_8cs_source.html new file mode 100644 index 0000000000..9217431df8 --- /dev/null +++ b/20190219041825___m_s_fix_rev_info_index_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20190219041825_MSFixRevInfoIndex.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20190219041825_MSFixRevInfoIndex.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore.Migrations;
2 using System;
3 
5 {
9  public partial class MSFixRevInfoIndex : Migration
10  {
15  protected override void Up(MigrationBuilder migrationBuilder)
16  {
17  if (migrationBuilder == null)
18  throw new ArgumentNullException(nameof(migrationBuilder));
19 
20  migrationBuilder.DropIndex(
21  name: "IX_RevisionInformations_CommitSha",
22  table: "RevisionInformations");
23 
24  migrationBuilder.DropIndex(
25  name: "IX_RevisionInformations_InstanceId",
26  table: "RevisionInformations");
27 
28  migrationBuilder.CreateIndex(
29  name: "IX_RevisionInformations_InstanceId_CommitSha",
30  table: "RevisionInformations",
31  columns: new[] { "InstanceId", "CommitSha" },
32  unique: true);
33  }
34 
39  protected override void Down(MigrationBuilder migrationBuilder)
40  {
41  if (migrationBuilder == null)
42  throw new ArgumentNullException(nameof(migrationBuilder));
43 
44  migrationBuilder.DropIndex(
45  name: "IX_RevisionInformations_InstanceId_CommitSha",
46  table: "RevisionInformations");
47 
48  migrationBuilder.CreateIndex(
49  name: "IX_RevisionInformations_CommitSha",
50  table: "RevisionInformations",
51  column: "CommitSha",
52  unique: true);
53 
54  migrationBuilder.CreateIndex(
55  name: "IX_RevisionInformations_InstanceId",
56  table: "RevisionInformations",
57  column: "InstanceId");
58  }
59  }
60 }
+ +
override void Down(MigrationBuilder migrationBuilder)
Unpplies the migration
+
override void Up(MigrationBuilder migrationBuilder)
Applies the migration
+ +
+ + + + 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 new file mode 100644 index 0000000000..5a4fec98a7 --- /dev/null +++ b/20190219042440___m_y_fix_rev_info_index_8_designer_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20190219042440_MYFixRevInfoIndex.Designer.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20190219042440_MYFixRevInfoIndex.Designer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MYFixRevInfoIndex
 Make commit shas non-unique per Instance for MSSQL More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + 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 new file mode 100644 index 0000000000..b1413fa774 --- /dev/null +++ b/20190219042440___m_y_fix_rev_info_index_8_designer_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20190219042440_MYFixRevInfoIndex.Designer.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20190219042440_MYFixRevInfoIndex.Designer.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated />
2 using System;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.EntityFrameworkCore.Infrastructure;
5 using Microsoft.EntityFrameworkCore.Migrations;
6 
8 {
9  [DbContext(typeof(MySqlDatabaseContext))]
10  [Migration("20190219042440_MYFixRevInfoIndex")]
11  partial class MYFixRevInfoIndex
12  {
17  protected override void BuildTargetModel(ModelBuilder modelBuilder)
18  {
19 #pragma warning disable 612, 618
20  modelBuilder
21  .HasAnnotation("ProductVersion", "2.1.4-rtm-31024")
22  .HasAnnotation("Relational:MaxIdentifierLength", 64);
23 
24  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
25  {
26  b.Property<long>("Id")
27  .ValueGeneratedOnAdd();
28 
29  b.Property<string>("ConnectionString")
30  .IsRequired();
31 
32  b.Property<bool?>("Enabled");
33 
34  b.Property<long>("InstanceId");
35 
36  b.Property<string>("Name")
37  .IsRequired();
38 
39  b.Property<int?>("Provider");
40 
41  b.HasKey("Id");
42 
43  b.HasIndex("InstanceId");
44 
45  b.HasIndex("Name")
46  .IsUnique();
47 
48  b.ToTable("ChatBots");
49  });
50 
51  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
52  {
53  b.Property<long>("Id")
54  .ValueGeneratedOnAdd();
55 
56  b.Property<long>("ChatSettingsId");
57 
58  b.Property<ulong?>("DiscordChannelId");
59 
60  b.Property<string>("IrcChannel");
61 
62  b.Property<bool?>("IsAdminChannel")
63  .IsRequired();
64 
65  b.Property<bool?>("IsUpdatesChannel")
66  .IsRequired();
67 
68  b.Property<bool?>("IsWatchdogChannel")
69  .IsRequired();
70 
71  b.Property<string>("Tag");
72 
73  b.HasKey("Id");
74 
75  b.HasIndex("ChatSettingsId", "DiscordChannelId")
76  .IsUnique();
77 
78  b.HasIndex("ChatSettingsId", "IrcChannel")
79  .IsUnique();
80 
81  b.ToTable("ChatChannels");
82  });
83 
84  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
85  {
86  b.Property<long>("Id")
87  .ValueGeneratedOnAdd();
88 
89  b.Property<string>("ByondVersion")
90  .IsRequired();
91 
92  b.Property<Guid?>("DirectoryName")
93  .IsRequired();
94 
95  b.Property<string>("DmeName")
96  .IsRequired();
97 
98  b.Property<long>("JobId");
99 
100  b.Property<int>("MinimumSecurityLevel");
101 
102  b.Property<string>("Output")
103  .IsRequired();
104 
105  b.Property<long>("RevisionInformationId");
106 
107  b.HasKey("Id");
108 
109  b.HasIndex("DirectoryName");
110 
111  b.HasIndex("JobId")
112  .IsUnique();
113 
114  b.HasIndex("RevisionInformationId");
115 
116  b.ToTable("CompileJobs");
117  });
118 
119  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
120  {
121  b.Property<long>("Id")
122  .ValueGeneratedOnAdd();
123 
124  b.Property<string>("AccessToken");
125 
126  b.Property<bool?>("AllowWebClient")
127  .IsRequired();
128 
129  b.Property<bool?>("AutoStart")
130  .IsRequired();
131 
132  b.Property<long>("InstanceId");
133 
134  b.Property<ushort?>("PrimaryPort")
135  .IsRequired();
136 
137  b.Property<int?>("ProcessId");
138 
139  b.Property<ushort?>("SecondaryPort")
140  .IsRequired();
141 
142  b.Property<int>("SecurityLevel");
143 
144  b.Property<bool?>("SoftRestart")
145  .IsRequired();
146 
147  b.Property<bool?>("SoftShutdown")
148  .IsRequired();
149 
150  b.Property<uint?>("StartupTimeout")
151  .IsRequired();
152 
153  b.HasKey("Id");
154 
155  b.HasIndex("InstanceId")
156  .IsUnique();
157 
158  b.ToTable("DreamDaemonSettings");
159  });
160 
161  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
162  {
163  b.Property<long>("Id")
164  .ValueGeneratedOnAdd();
165 
166  b.Property<ushort?>("ApiValidationPort")
167  .IsRequired();
168 
169  b.Property<int>("ApiValidationSecurityLevel");
170 
171  b.Property<long>("InstanceId");
172 
173  b.Property<string>("ProjectName");
174 
175  b.HasKey("Id");
176 
177  b.HasIndex("InstanceId")
178  .IsUnique();
179 
180  b.ToTable("DreamMakerSettings");
181  });
182 
183  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
184  {
185  b.Property<long>("Id")
186  .ValueGeneratedOnAdd();
187 
188  b.Property<uint?>("AutoUpdateInterval")
189  .IsRequired();
190 
191  b.Property<int>("ConfigurationType");
192 
193  b.Property<string>("Name")
194  .IsRequired();
195 
196  b.Property<bool?>("Online")
197  .IsRequired();
198 
199  b.Property<string>("Path")
200  .IsRequired();
201 
202  b.HasKey("Id");
203 
204  b.HasIndex("Path")
205  .IsUnique();
206 
207  b.ToTable("Instances");
208  });
209 
210  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
211  {
212  b.Property<long>("Id")
213  .ValueGeneratedOnAdd();
214 
215  b.Property<ulong>("ByondRights");
216 
217  b.Property<ulong>("ChatBotRights");
218 
219  b.Property<ulong>("ConfigurationRights");
220 
221  b.Property<ulong>("DreamDaemonRights");
222 
223  b.Property<ulong>("DreamMakerRights");
224 
225  b.Property<long>("InstanceId");
226 
227  b.Property<ulong>("InstanceUserRights");
228 
229  b.Property<ulong>("RepositoryRights");
230 
231  b.Property<long?>("UserId")
232  .IsRequired();
233 
234  b.HasKey("Id");
235 
236  b.HasIndex("InstanceId");
237 
238  b.HasIndex("UserId", "InstanceId")
239  .IsUnique();
240 
241  b.ToTable("InstanceUsers");
242  });
243 
244  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
245  {
246  b.Property<long>("Id")
247  .ValueGeneratedOnAdd();
248 
249  b.Property<ulong?>("CancelRight");
250 
251  b.Property<ulong?>("CancelRightsType");
252 
253  b.Property<bool?>("Cancelled")
254  .IsRequired();
255 
256  b.Property<long?>("CancelledById");
257 
258  b.Property<string>("Description")
259  .IsRequired();
260 
261  b.Property<string>("ExceptionDetails");
262 
263  b.Property<long>("InstanceId");
264 
265  b.Property<DateTimeOffset?>("StartedAt")
266  .IsRequired();
267 
268  b.Property<long>("StartedById");
269 
270  b.Property<DateTimeOffset?>("StoppedAt");
271 
272  b.HasKey("Id");
273 
274  b.HasIndex("CancelledById");
275 
276  b.HasIndex("InstanceId");
277 
278  b.HasIndex("StartedById");
279 
280  b.ToTable("Jobs");
281  });
282 
283  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
284  {
285  b.Property<long>("Id")
286  .ValueGeneratedOnAdd();
287 
288  b.Property<string>("AccessIdentifier")
289  .IsRequired();
290 
291  b.Property<string>("ChatChannelsJson")
292  .IsRequired();
293 
294  b.Property<string>("ChatCommandsJson")
295  .IsRequired();
296 
297  b.Property<long>("CompileJobId");
298 
299  b.Property<bool>("IsPrimary");
300 
301  b.Property<ushort>("Port");
302 
303  b.Property<int>("ProcessId");
304 
305  b.Property<int>("RebootState");
306 
307  b.Property<string>("ServerCommandsJson")
308  .IsRequired();
309 
310  b.HasKey("Id");
311 
312  b.HasIndex("CompileJobId");
313 
314  b.ToTable("ReattachInformations");
315  });
316 
317  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
318  {
319  b.Property<long>("Id")
320  .ValueGeneratedOnAdd();
321 
322  b.Property<string>("AccessToken");
323 
324  b.Property<string>("AccessUser");
325 
326  b.Property<bool?>("AutoUpdatesKeepTestMerges")
327  .IsRequired();
328 
329  b.Property<bool?>("AutoUpdatesSynchronize")
330  .IsRequired();
331 
332  b.Property<string>("CommitterEmail")
333  .IsRequired();
334 
335  b.Property<string>("CommitterName")
336  .IsRequired();
337 
338  b.Property<long>("InstanceId");
339 
340  b.Property<bool?>("PostTestMergeComment")
341  .IsRequired();
342 
343  b.Property<bool?>("PushTestMergeCommits")
344  .IsRequired();
345 
346  b.Property<bool?>("ShowTestMergeCommitters")
347  .IsRequired();
348 
349  b.HasKey("Id");
350 
351  b.HasIndex("InstanceId")
352  .IsUnique();
353 
354  b.ToTable("RepositorySettings");
355  });
356 
357  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
358  {
359  b.Property<long>("Id")
360  .ValueGeneratedOnAdd();
361 
362  b.Property<long>("RevisionInformationId");
363 
364  b.Property<long>("TestMergeId");
365 
366  b.HasKey("Id");
367 
368  b.HasIndex("RevisionInformationId");
369 
370  b.HasIndex("TestMergeId");
371 
372  b.ToTable("RevInfoTestMerges");
373  });
374 
375  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
376  {
377  b.Property<long>("Id")
378  .ValueGeneratedOnAdd();
379 
380  b.Property<string>("CommitSha")
381  .IsRequired()
382  .HasMaxLength(40);
383 
384  b.Property<long>("InstanceId");
385 
386  b.Property<string>("OriginCommitSha")
387  .IsRequired()
388  .HasMaxLength(40);
389 
390  b.HasKey("Id");
391 
392  b.HasIndex("InstanceId", "CommitSha")
393  .IsUnique();
394 
395  b.ToTable("RevisionInformations");
396  });
397 
398  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
399  {
400  b.Property<long>("Id")
401  .ValueGeneratedOnAdd();
402 
403  b.Property<string>("Author")
404  .IsRequired();
405 
406  b.Property<string>("BodyAtMerge")
407  .IsRequired();
408 
409  b.Property<string>("Comment");
410 
411  b.Property<DateTimeOffset>("MergedAt");
412 
413  b.Property<long>("MergedById");
414 
415  b.Property<int?>("Number")
416  .IsRequired();
417 
418  b.Property<long?>("PrimaryRevisionInformationId")
419  .IsRequired();
420 
421  b.Property<string>("PullRequestRevision")
422  .IsRequired();
423 
424  b.Property<string>("TitleAtMerge")
425  .IsRequired();
426 
427  b.Property<string>("Url")
428  .IsRequired();
429 
430  b.HasKey("Id");
431 
432  b.HasIndex("MergedById");
433 
434  b.HasIndex("PrimaryRevisionInformationId")
435  .IsUnique();
436 
437  b.ToTable("TestMerges");
438  });
439 
440  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
441  {
442  b.Property<long>("Id")
443  .ValueGeneratedOnAdd();
444 
445  b.Property<ulong>("AdministrationRights");
446 
447  b.Property<string>("CanonicalName")
448  .IsRequired();
449 
450  b.Property<DateTimeOffset?>("CreatedAt")
451  .IsRequired();
452 
453  b.Property<long?>("CreatedById");
454 
455  b.Property<bool?>("Enabled")
456  .IsRequired();
457 
458  b.Property<ulong>("InstanceManagerRights");
459 
460  b.Property<DateTimeOffset?>("LastPasswordUpdate");
461 
462  b.Property<string>("Name")
463  .IsRequired();
464 
465  b.Property<string>("PasswordHash");
466 
467  b.Property<string>("SystemIdentifier");
468 
469  b.HasKey("Id");
470 
471  b.HasIndex("CanonicalName")
472  .IsUnique();
473 
474  b.HasIndex("CreatedById");
475 
476  b.ToTable("Users");
477  });
478 
479  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
480  {
481  b.Property<long>("Id")
482  .ValueGeneratedOnAdd();
483 
484  b.Property<long?>("AlphaId");
485 
486  b.Property<bool>("AlphaIsActive");
487 
488  b.Property<long?>("BravoId");
489 
490  b.Property<long>("InstanceId");
491 
492  b.HasKey("Id");
493 
494  b.HasIndex("AlphaId");
495 
496  b.HasIndex("BravoId");
497 
498  b.HasIndex("InstanceId")
499  .IsUnique();
500 
501  b.ToTable("WatchdogReattachInformations");
502  });
503 
504  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
505  {
506  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
507  .WithMany("ChatSettings")
508  .HasForeignKey("InstanceId")
509  .OnDelete(DeleteBehavior.Cascade);
510  });
511 
512  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
513  {
514  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
515  .WithMany("Channels")
516  .HasForeignKey("ChatSettingsId")
517  .OnDelete(DeleteBehavior.Cascade);
518  });
519 
520  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
521  {
522  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
523  .WithOne()
524  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
525  .OnDelete(DeleteBehavior.Restrict);
526 
527  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
528  .WithMany("CompileJobs")
529  .HasForeignKey("RevisionInformationId")
530  .OnDelete(DeleteBehavior.Cascade);
531  });
532 
533  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
534  {
535  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
536  .WithOne("DreamDaemonSettings")
537  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
538  .OnDelete(DeleteBehavior.Cascade);
539  });
540 
541  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
542  {
543  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
544  .WithOne("DreamMakerSettings")
545  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
546  .OnDelete(DeleteBehavior.Cascade);
547  });
548 
549  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
550  {
551  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
552  .WithMany("InstanceUsers")
553  .HasForeignKey("InstanceId")
554  .OnDelete(DeleteBehavior.Cascade);
555 
556  b.HasOne("Tgstation.Server.Host.Models.User")
557  .WithMany("InstanceUsers")
558  .HasForeignKey("UserId")
559  .OnDelete(DeleteBehavior.Cascade);
560  });
561 
562  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
563  {
564  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
565  .WithMany()
566  .HasForeignKey("CancelledById");
567 
568  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
569  .WithMany("Jobs")
570  .HasForeignKey("InstanceId")
571  .OnDelete(DeleteBehavior.Cascade);
572 
573  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
574  .WithMany()
575  .HasForeignKey("StartedById")
576  .OnDelete(DeleteBehavior.Cascade);
577  });
578 
579  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
580  {
581  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
582  .WithMany()
583  .HasForeignKey("CompileJobId")
584  .OnDelete(DeleteBehavior.Cascade);
585  });
586 
587  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
588  {
589  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
590  .WithOne("RepositorySettings")
591  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
592  .OnDelete(DeleteBehavior.Cascade);
593  });
594 
595  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
596  {
597  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
598  .WithMany("ActiveTestMerges")
599  .HasForeignKey("RevisionInformationId")
600  .OnDelete(DeleteBehavior.Cascade);
601 
602  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
603  .WithMany("RevisonInformations")
604  .HasForeignKey("TestMergeId")
605  .OnDelete(DeleteBehavior.Cascade);
606  });
607 
608  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
609  {
610  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
611  .WithMany("RevisionInformations")
612  .HasForeignKey("InstanceId")
613  .OnDelete(DeleteBehavior.Cascade);
614  });
615 
616  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
617  {
618  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
619  .WithMany("TestMerges")
620  .HasForeignKey("MergedById")
621  .OnDelete(DeleteBehavior.Restrict);
622 
623  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
624  .WithOne("PrimaryTestMerge")
625  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
626  .OnDelete(DeleteBehavior.Restrict);
627  });
628 
629  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
630  {
631  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
632  .WithMany("CreatedUsers")
633  .HasForeignKey("CreatedById");
634  });
635 
636  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
637  {
638  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
639  .WithMany()
640  .HasForeignKey("AlphaId");
641 
642  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
643  .WithMany()
644  .HasForeignKey("BravoId");
645 
646  b.HasOne("Tgstation.Server.Host.Models.Instance")
647  .WithOne("WatchdogReattachInformation")
648  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
649  .OnDelete(DeleteBehavior.Cascade);
650  });
651 #pragma warning restore 612, 618
652  }
653  }
654 }
+ +
override void BuildTargetModel(ModelBuilder modelBuilder)
Builds the target model
+ +
+ + + + diff --git a/20190219042440___m_y_fix_rev_info_index_8cs.html b/20190219042440___m_y_fix_rev_info_index_8cs.html new file mode 100644 index 0000000000..b7b66547fc --- /dev/null +++ b/20190219042440___m_y_fix_rev_info_index_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20190219042440_MYFixRevInfoIndex.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
20190219042440_MYFixRevInfoIndex.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MYFixRevInfoIndex
 Make commit shas non-unique per Instance for MSSQL More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + diff --git a/20190219042440___m_y_fix_rev_info_index_8cs_source.html b/20190219042440___m_y_fix_rev_info_index_8cs_source.html new file mode 100644 index 0000000000..dd0a9c4fc4 --- /dev/null +++ b/20190219042440___m_y_fix_rev_info_index_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20190219042440_MYFixRevInfoIndex.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20190219042440_MYFixRevInfoIndex.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore.Migrations;
2 using System;
3 
5 {
9  public partial class MYFixRevInfoIndex : Migration
10  {
15  protected override void Up(MigrationBuilder migrationBuilder)
16  {
17  if (migrationBuilder == null)
18  throw new ArgumentNullException(nameof(migrationBuilder));
19 
20  migrationBuilder.DropForeignKey(
21  name: "FK_RevisionInformations_Instances_InstanceId",
22  table: "RevisionInformations");
23 
24  migrationBuilder.DropIndex(
25  name: "IX_RevisionInformations_CommitSha",
26  table: "RevisionInformations");
27 
28  migrationBuilder.DropIndex(
29  name: "IX_RevisionInformations_InstanceId",
30  table: "RevisionInformations");
31 
32  migrationBuilder.CreateIndex(
33  name: "IX_RevisionInformations_InstanceId_CommitSha",
34  table: "RevisionInformations",
35  columns: new[] { "InstanceId", "CommitSha" },
36  unique: true);
37 
38  migrationBuilder.AddForeignKey(
39  name: "FK_RevisionInformations_Instances_InstanceId",
40  table: "RevisionInformations",
41  column: "InstanceId",
42  principalTable: "Instances",
43  principalColumn: "Id",
44  onDelete: ReferentialAction.Cascade);
45  }
46 
51  protected override void Down(MigrationBuilder migrationBuilder)
52  {
53  if (migrationBuilder == null)
54  throw new ArgumentNullException(nameof(migrationBuilder));
55 
56  migrationBuilder.DropForeignKey(
57  name: "FK_RevisionInformations_Instances_InstanceId",
58  table: "RevisionInformations");
59 
60  migrationBuilder.DropIndex(
61  name: "IX_RevisionInformations_InstanceId_CommitSha",
62  table: "RevisionInformations");
63 
64  migrationBuilder.CreateIndex(
65  name: "IX_RevisionInformations_CommitSha",
66  table: "RevisionInformations",
67  column: "CommitSha",
68  unique: true);
69 
70  migrationBuilder.CreateIndex(
71  name: "IX_RevisionInformations_InstanceId",
72  table: "RevisionInformations",
73  column: "InstanceId");
74 
75  migrationBuilder.AddForeignKey(
76  name: "FK_RevisionInformations_Instances_InstanceId",
77  table: "RevisionInformations",
78  column: "InstanceId",
79  principalTable: "Instances",
80  principalColumn: "Id",
81  onDelete: ReferentialAction.Cascade);
82  }
83  }
84 }
+ +
override void Up(MigrationBuilder migrationBuilder)
Applies the migration
+
override void Down(MigrationBuilder migrationBuilder)
Unapplies the migration
+ +
+ + + + diff --git a/ArchitectureOverview.png b/ArchitectureOverview.png new file mode 100644 index 0000000000000000000000000000000000000000..d4c35d4451fca98b3a33e31744b40f985a253e7b GIT binary patch literal 159852 zcmYg&1yqz>yS9oVC|%M>cXun@NH<6$-5oF8-7Vc9&CuN`E!`#E{cqmyeCPbGkp;76 z=Hc1@HZJz_z&10UcGt+FD@n||LPT#F!;|60}Y<>ui$?B>ec60;zC~)ozwod zxTwS#Hx_#Fb=)4*&)h;Ar!TpcdBpI|b1!l49sOMrcXB$ODO5+j7&^|ii#-n^Ya;!rQ+h^ekzwhJnq?UZ*M8$2h}Pqm$>T8 z=Q|r64z`<*w?{M-6&3kxbaZtI%gQXIq@u+q}f&OEWsJgD|g*C^Q75dvA8;A2X)nj)rZ?4J$~>s{^->&2y|^)L5X z%@-SjSQ(ComvF6Z(LkLI0p(m!3 z>1}UE(${CB!N37uYt(sdY$mVOXqNA*s%&B4;R{-FLTyTXPi?sU{qKXrrMG)WuuIv< z5duHfFZlK`4{YW}5&ie7t1ig$7jYEv5`6a$l1FST`qiAj)DP|LuaHpcVsKsP*qUO& z=XiK<<^Fai`OVST^d1w7k(tNb$e>%wDH5ZI1tFLvqWtLfMVAqH{Qk|XhKxJ-`2H{q zyB8Cy_ScU|gly8_#b&L@0dqt5#fYV~&b^fHdIAQaZ~te_eRhP!CKMQ0S^edUHZz}Y zGlOHq`UeLIsi{+MZr(0CZ%BiiVn{8+4AZxFKt!SqCY3;u?91T`2nbsqPj#MJiWI^Y ztszOc67?`~fQEK}mjBIkllXiO9h1Z%KglF6J@lD^BFW*Pete#}{iN_+><`?M5$~?O z-VJ0!`~TZ_qTF4|6Um7R&r50|;vBK_V96Sm2(Q~VtEi0Vp8mpjkH3OP%Ugd??oYkV z72`M0Zc+(V#Fhouji9SQ`(Z352VNdG1s4-LNl9^&(d48tz84M$pUQyQhe=R>Ke+3M z2K(PT9t(}i7G`2)?b+NUk;sc7l}xbS8P&RQMfK%^y2jQ}tK*5As*$pHB?dnq;ou>Ri*3YXw?wZYGpF$3RaP>Q#Bks{T<74N@sY98`WklVvar-M6*7;n@C$f7Gx+-E z><0XQSM);kL!*tE2a(0_Un=sF^jJcb)dV1@7dw4?p=6WV`Lh7z$L%xDP8lD@_u*MIhz0WvPM}jA}Eb2b{ ziT#^DAgY}CUanOTO;qL>R~Mn3O;RaFQVDjB!TcA4-id^Cn`IKF+8b~SEZBHm#6}my zAZV&pk#Qv^AKAb?L;XR9t|8tH2n)OM>t8VG2p^)wrUjY#pLnHzLns{DO)rd&j*fMzyOR_Kq*35x-g72oL zA0mxW3MNNx8q(!_-#rE;gS{ZmN%(?e(Q<5D-4oKI*JXg+XL1n$zB#g9vu>=s|Ko%c zzJUp+pEROOgF#I;$pO8A*+snU5fMKBYd)Pr({g3KOq&ozp5&$UyxbrUzd%Ta4=8A4 zWMnoFp1Hp=!x+>elN?6XPI5Dqj7_pWrQoxA`|woDBH9lzLc?uJ>eK7G_BxKNbwS>$ znztSvR@Yr0&#qaofr8=YhxETeM~_V?Z1*e5UP?x0{Yq-px)Cb0{?A_-bA&_{TU@$Q zw)bqQP)$otsZ0LT+uf$;mOJ465Hf2n-nn#3bH{>f#)$ca1#=l(gimxj3jPD)go6K@ zJE0!=l z7U#iV(RaVMY2@|J#PjaE_ZJ%`MEUP7KjAlD$>%DU$Q3ERRB@ZNPT}4@P_Lce^=9Us zvTL45hA;4X_o>WmBSsplyXSjlEL+;zay4I%g#~lgXQrfd8ZgPp%loL8UA08`zmxfI zWFkGVRJ5QKDN;S{WjzeeyRR1n3$kVPqTWPNA@u@N*X-~oHuOJ*f;ST z4aT$QyH}oEwY0SO`TJ*mqc9Gd{JVo<`+qxz2R@SWrF#CAJX&gs1oh3-;hT~}YM!Lv z+%Mfwr}D_9o_J~%ISM1=Xr2u5-o8W4hHnA#MY+FzMftu*l$W>7D5rz}M5hU7ZdU7B z-(;NyS28`ixrr7ZAJ5FBVCd~}b#Y;Hvbxsp(HEKd-TK>DGPAMEMmYP;c_x2u;~kln zRtqkNHKxBnFlbJ5m3q+c12g(9|K0bK#_Dgu57o+=K_8>vbd+?N(F!XlD7@5qt+RIy zm*J|t=Af!-mNgF~e(i9t_Jo3-&thj&u?%8q~k2!iJ}ZQm9B*n1loprB}Cx?Th%-ohPX>2dR#Vin0b3 zUrbz_n1m#aShx@BJo;gt_Ows^Wgjbu9h=gts;b(BdmRpDYz}5T|AG(dP5RzKW2DXl!({G$>%1o=@mm(ehN~OPg{|{J{fQ zLc%>0Gt0vD`I$F#*pfKQ&ST*FAYoLz=HDa zGI<{u93GDh?%3EE5erMryYKP}0f`_ph=wq@cUxI+-5@tVU!NsHmqCp~!8RlG6aB>U zvapE>M{@G~g(-Bj*oK&t)K_+cFBR;z+ryl6n$5!vBWqf-{hV%E{{aNrpN5T?`y%j& zxzt0X68tpFKXZ{K2v~Iw3L7daDgulYGM!thG7Ph?1*V(CjCoxY> zKyCO*jo5qDaH}?+=$U{$Pk!Lv#zvGAlt_B|{It?`*7kf|ar1N!Wm20n#m-|efA($J zmDa=n+ZUUgVM+Zv+Ls0%C8s0T=-d(C=sX5OEM64qZp-0YqhEItkV2fdwZ|Nbq= z-xaT@@*{1{BUpfvKmx%SB)2|4xv6VtaN6bju`l1$R>VC9)Vq~V`cBSjDZ8(HcuP-S zQHv%mBa^L2rB=21(bV){?+_>Z=g+7}zPq$CjgKxDCjT@!5g_5?cX>VRWQvIoeP(6# zjf=Cdv!Kqs==bp3cw{An`rHM_BU47^mFqKk?19fOw?dj4(Gbk8;uewV2D{+p+Hv+ zM0A^Lx`r7T*z4{iM?pjD1Y6a!@^tl1P3^<}J~kGC(+!gdJ{g%G?!U`5-Dg>!1K@0( z`Mb;OlwX{SVHz!=c{(k{+r!D{H8u7~sHkJy$IYT50ck-numm0#jBeM5eMU|;oBcMe z2W(-y5r6cQit!6#frC(0Y2tm3T48+hE zK_=UOj*1Bia>K%6xj(re<>hVhxX%fyr^NXAnIF~jWakKWJv|ElU2yW_uDuQpl_X_R zlsH^^&$4n%!a@_%_H=1Sr&UbG#ui=ChOj-Fey_MxxKmB4gNlbY)Y2PhU{EY3Hk@As ziJh6jzdGdZTy7C9Y_y4dd@uX$ZbPYt3(5lECJ}M)!JAiyA_=q~Nl8i5^Ydk{j_J1- zA=DQayBr>OqE9D*{AZ_qnbtQa$e=1oY_YSj)iSYJex!MG@accjP$^7=m?=4|UyPEs zMIChBBq?RM07emb{V?pl-6Om&MBy84{C8nyO0_I(^_Au>6v5(@CU^E}d>#?&u?6FM zq9zA_i8xrol9HT{7JqyOCG8@NMnr@*EKD6>L-&S}m!hIu zTXj7jPN{UXG!DQRiRxwyQ?$HlU<^=`}u<|65qEc# z{{R}${XLnKkr$g5JKHBaJICJPI(s&C z+*EY$2tT)Qmt>*tFdxtp^+SpRnRIeeQs2!@d(epbmI9PrT?2QgcPZ)kByDZ6&1Oo; zDNIO*5+w@@3)i#-aaIohNDAmtrPlw|8%j9lbiaA4rKNs%FG>Mkuct>999;Bwu9p4R z*ukvX?bX5?s~=jX(C-m&^UBH+pPrCq(kKWyIn!gwB{`gqsK9y|KaD-#l4s|T0+#xn zE%miEMDyWhBht^WbTidKnfBt(dMfL%ht!V)ydjRV!AbZDhBW-JkfUh-^|)AK+lI4DlO zs8#ygH<)1Yq6^cDi_6HLI85IeB6MrH{LoqirlzK>pB`KS0s@2*J7)ixRSs#t7oFTl z?%uO!=Cd@O`mSp-=ePVxu!}6xDc_VeJxNW>r`vfiQ)J78yr~$ewo5pWcV3 z(V@$#Izzw?=ld*^(y9v<3sBv3Wa5i!x10*Eq}C_!R3O%P1VbV7&q+5OU(0?_CH?{Q z1bRfn*>bI2`$qC!<4V=JCMSBy#CO%__fYoNaC$5e`t{txDqQ~t zR?H2(Yw`4Ka8Qum`Su%E*Y{ZXtds6-;Wah5ipA3`?EIhEl(%Dv;4Lh8g+wHRgQDcs z)C9pwoK^|BvU1UB$(?s(K6MVlz;11^-`*Xd_oFE6?oUiC6o{5Ee`in!%cF;ehK7WU zEUdrr_^t_#ZvPj0_ zk)W`!tnzaIVX1eZw@fHi8(e`Zf2NQF(xa^ofma4SNtwV3Gd01GI`v}_T zc)|4KLczvvr2-lrx3E)1gv6!vO!;HNONlxBGuG}& z+E1xm>Yiv#fwX1_W7PZgli*Ux04{YLK6QMgaP_5#9}|4d!O9n976PkVu8p_UdUo^V zjT{glEfAv3_#lsljNG%-6do4oMjsQY0h;s1<~9}VM-A~IU$(nD=;(o%C^5YTxB6%x zB@yM2UR)ts7u0#n^4*3taA1{{r2}O^Oh)`%8|K?911SSfTX#%Z02)cL`D0U!)qb8d{|hVo13Ls+cM0cPW1L3 z0;x}jO7-EaMJg;Jf{Bak1CQF+1CjFt>u(~Vpc|JB2V+~?5A_QguuLkFmcAXIdKuw* zZA9QFl|Fl_oh1yXx=#~81KH#P@kW5#$8r20%l_`54j;qerU!qMfk#uIuJt6)YJimA zJX&&7rBRm3w*lHAZ^~<;oV?t8qwh?S`n8-C6m#Ov4RKKKBT!LLf+cD(s^@#7mcQu9 ze*m4j%wp;9l2cMV@&pNaK@8vs-cX{uyMKEOuwPPjB?hYc;b(3qPg&~|i4PxI zb1Ev1A-!r!O43qcVM--zzvrep`U}1E3Pp3xbeI6e?t6N?|6yVRGeyWR%Ud;Ike!wF zx>h}0y)3_~Dkdc412U0NGl`teO8aghBLn-I!?PP7>(>2|qwKJ1^R%0u*_o2HDh=C9 z5{J)2ePZhCvuG{-$3q$RzOXIt`bE|8GP9Cg6`D7)3yPgrfoVe%783fVq7n%Td&an+gLROYU6*!35u zk+RL)8@r&EbD`#~eS|*yIlSc4Oq=6SG<)2 z734Owmh(|=ArX=2=xAYAR}781zqwg!uR(7oj2451g*Dt7G--Wc3gUG`_&v$o5AZvU zT2)+B6pWr;jPv29#yh|%wpZN6c-;K9iO+}=`R7-%Q&phX6|_0JygKkKut{z zix`>vbG4~`G5S-__&CzLcMHLB{Ty1h!5v?r$g1m!)35il3&o#BjR3Men5{Tpd461R zKkfMhZs?5Q`80ELb6d`-BKg#&siMx~E^=SiBjX7brdIv&98LhR2!<(B*5rAYG!BIT z8LRH^xccUc5&FHtkXiV6i5?uQ2kc}TSO`zzuU`zEohr6P4^)nU)Zdo*s^L7r?H^gf zgU$$AgEfTQy3xbVLu+{uvEHo_&C`hU;eaZ$f(qzji;WJUwPtO=cnAa(O@5MjzGjbm z|3Cv1ry59*q)bdzVv<9f<7@gnu2W;HKfUYfw87dDQBsD7h4DOH6tqRBrAZs_yi!tf zaKE>B4VYAJZm!*GyBx@X7WrIuU4{roOS@Gh`HO1eT$5|A*SFibkj1db1xDbEV4pftuweGSIsXm9>4JE2>4Te_0~&fd z2`6WGZZ3;}01+%~^fygSi3$-}@Br8e3W|90Km`GNd>?K%KpIneLml!#WL=Q8yYcsI>>_U>hkJp^}NQovv=EGpWm9&07y=O_55qvLBx zNXX4*?AXmsEIp^TroeMMl5z=D;H0mcH_9mZU8tz2Ui=q&O4HhuDSJ|X{@dEYRoS?BEu+2&EugJNCnrlwNKg?HE;|@L;2HEZGF6aGhI8?#TF6Kl zQFrBF0E0zDw1swQ#E6=#I$qBA`iigxR=O=?gM2g!5Cl_ovZ5j^Tt0W7hzL(tcZ{lq>TXsu~7*V%~HZD^1s%f?1mwI)a6fdQ%EFOZn1w*i~!MR0yuX$5E*HKY|BO(B4g(f6iGcYiiSmOOh2nFzdCiNv4 z*A{OePur~dsH$u$kz3<$C$}G+)H<+hFk%)oeY%^?tWj;&`Viila0GY<^acl5E&xp7 zOhoq%a6~qSQ1P$i3 zCL!b($7;rA^ZZ0C0#(*n@W~1NVFQ3YVSW9NU%yhT)>|&2UbC~Y#Y9E5HyuB{udJk0 zTxr;#-AJ35Ffy7E6N~(-Ysm<84_n~JgD^V(r<0+W z4h{f6{Q#PEv_?xGZ3iZ7tZZ@f!XNjTLo_Woudn};_M;iJq~xOF78Zv-3keAcDC9$% z_XIL_8&^;%M@~6=1idD%T$E@06@ARXU2DBeMmcvgTJpcQN;R%&K`9;M|AnPmrW}FK zI~anli-z_$A3Qf(ywDU7eY5q@rw6)KLIN955OqgVSnVt)r>A@JrBiQKefiG~$3M_% zHik@aEO|bjvYiTqy!A=^^a2Ws)1((7zd2O<_uemEm|P@DRn(*T2b6E>nvny0vaGD7 zyRQHRg($DIGz6@rK^4i}-Q{kewE1F{Z`3bU1bn`cs;w*%(!8vR-5)OFBZzK@K;08D zH-Gc>E8*Wc!kKs%t&<9+Jx5t7C)^7MQXrLByEL2WLKZWyuA5pcmJVfr&4ekv+~X|@ zj}g`jaAtGaA|AqZ>ErEe4Vs}{8=OE0M#t0?T7hgPF}di#Qj^oC#j8cgdG{a_#iCQd zz6LD|8-EkpYj1SOp(8ojB*!N@Wuo{&3JQwvCMLVL&{vqyzTU@e&l%(66oBam=a1d{ zn^rfyL3QY%-wWMvQ7+C*OUrF(3EdhJ92go(z2*ce>dsi^PH08jc8)CHP9Q)!j_dRW7Pyz`G23cNBP0Y`qNGPZZMI}~-W6Sz!v=AZCEf5K=kgzDxL7*8) zIbmzN-;fR-Sp%k1Fxywf`RksGz?BD8mPba@?`aF^KlP2nVIPi@6T;6~u=95wMQ?p_ zzU7!^x?bI+am6>^>+K}7#KiDa*~qqmNq>7ZanIZLfpV&w&#ETrcF;R zTl6wn_8nPooYf|_xGKG5W))GcNy_||ofQfWj;sW5jiMRdujb|J%x^PBM?FW=n*_vy z{PHAyVd29!&&Pb{TJB$sjNkz~>m+sMfqUg}F;p{pY*xpOSrqgJqHfR`2xXrikA@gr z@P~*-`k`-!<_Hiw=z+a0yc(aa(7$Dijg5`5cy+PIEVl7`zPfGGUwlG}u}U59;tHY4 za7YGZ!Nyb(^W5Rp4&FLVV^fn_(-n@qd=;d)HC)E3^Y4KeyB*UWJ(lcXCt7SQ4HEOy z7l608UbG!Rb&^Ja7j7gX5(Wn!&cIPv(5545b^J<83!96p@rQ*+x9@wr#kLg*P`WNJ zrKe`tzA4xxrm~wAm6xymsZCW>)XZsaPLoWelT&x~t~QqB^ti(%m(AGj4o1c0_e>)e zjj%mg)xA1i8AIg%3(5^*ljETtFwo2w>cV||-n`5K^@igNto-txKA5dGJ^a%y(D5(F zq5?A;H-}a$YpGVPYEwIRs~u2P)z!B^GWU(Lrc|j|I{Q#jf&VlZZ;ST9|6j-?BsRhF zbQ}c8=H{8^i&rT*L<0N;t){EV@o^atcaM+6X*@0wadB|+@=P4os}y*6*foFTWHM+7 z0bJbZF@`v{BwQYR1SThz_wNPhynjTAFp+v-MCtaaf{2}+{^WT+dZ%fO zprn69%U__zWThGxErKr>rI3AI#Z$A~O5XvSZsI5#kF@go&8gnYURhddTT7A4 zqzR$K_AW#1K*?{WE3n`v1?}0o3}rqfe~A6zm=CH1(0y-I^Rr_?W5G^2QgEv9)~G+S z-tGUP>?eeZg*7q|OI}o5EKsIwce$@rt_cxPQ^Nui0;>I20x51k1hl$Ty*2?P z$5{P}=THDV&Rnw#GY}ojS6b84xt-)yRr>*xeo^Xy$h&&7)&(TUxb<~C89=k=tBpCm zo_P45Zio#H4FTs#E>Wq-RxSbew+_;AvDG8>&mZ-pZ`1AGr5n(h@`zzfTDwwTl_Jg5J8JUW!my4d?shGxT7htzD%3G~yZ*TvgCx2ROeZ0)8r?2mFy>uNlz|^nP=9`wL^e=!x zA{4HMjZ1GL|8-v_ERs`yKMQb|udeHS?6*KIv&; zd9O}y91{uCC4OwtmX#b5q@pV3aI0fsDCo@0<8VItX(iKx$UKECH zJnSw&VqHs{+rI#z*s&}FaZv4^XAFA^FlFd!sSrmUc;8Kzx5~GpR?{>x{hY@%Sua+C>(o{{X2ic1h^&!D}gL{I~X*YH-FlDO@{(P6|ng? z8<%ZlUIEPf{9YY4PrRpX37>ek{l5XDq_RY@_!HT7Teqqw9T@IVQc?mu{Ix*Hww~?p zR9agw?{&D$Y5+Q=_dE8-gU-3XbmoqU^@2$buJG6;Bb>yz)iXa&15{N+K0C)dXUXSI zo4!oIUhYr779SW@20>$o(4%RnR6X<)BSir@Dx}uz)+j@&r(CNkLxL)UU4c>IC1m{- zVYI1Ou;GEn@Bl2y=hGejXI5*UMuP#Aqm?#(vnC*+C{j(^@y=@AQ_#|qGBQSklzlV4 zxF}^{K%(P$OFBJ0{Yp_qB^Hp1U{vx9*Jox%?C^dACIcock(^UA*kUZzVqhWH>Vq7Bq%7Ts9?6MySp1?##v}k^z)-jw7zywN(wgEWEez5 z(L8x%e0&*a=bMknIVxHq5xATv91(tKyuocyNqrkyFiTr!tM-jHTuTj_t(UrssLNH3 zV}4F$$yj)uY0P?8*ew5sq|&CpSagpbz>HuiW&wx-Lly`N^;SD`mHKgsI(c<FA^ zrh1e4(s7B2P}a9+hCsyc1>D=X#S6sh=GN9b%hUsx#|nq*qou#gE%(8d!`GZN7q=s% z!p!v=6kTkyPY=hEU%$Qv)w zabRq02l2RNtS__tvrK}hM2OymJj?lqHbp8@3W}hOzDRu*Y_LXfnzv*9{hw)Q!q(T< zUGnwl9q-a7#I-ClkWs~KePp`@6WLV&cILwKY(ZX?sjwjaW9(Q|5B$1?ydRx>HhWC zB&%U?8L;O*K0Z+rc>p7WF{vfaYB{i9M&MPumv{f5fxi1Un2e5LOe@Nl1IHLR#WrA{3aE6mBL1o~P4xhwpnZx^@N_L_~#e_6z&LVJ9G?q-6gr+;%rz0oK5qdL}qH zxcPQFwNSB`y!_6X%cy)zm+>C%b)^SFZ6V6R=!hFQj%J`0u~<_3@R1cTc93*nn$P8`p~V4&yQbRT#Ugg z@?3e~)!H}2uoIK*&zA@}n%uJw#jnWx{aYSb1AQQK{a?nwJM2z0U&=So#%O^TjV?ff z^dRLtyOMO&zH1A~*gw6zyc7}=I=8ZF6OAMB^$n!|=9m{jtAQ9BQ^i5~d(U2sB&Hpf z-I@8boSYn}#P7HJfp#^_HJ~LHQe093^2!)2o%wu~Kd9W$GWJe~e|ok@Qo#^Wk7fPj z@-jZf$D#iI)k6U1K=*N_Yg)qRpiDn7xLWH9lntZi=g$N#(9t4<`8Wxnut5N1psMui z7r12ySB{X0cH z)?p_uXJf-ySy`zG_@8hKzW3_!;6=8l?CeZSPEObC%;RfNvRT;Jt7&_oqvswBR1K;O%T}K@08Kv!^qCsJB`nqc8!^ z{k`#T=GLv7fe(Y_Q*zoakrv#M(J`$JXAplGpM(89~X9nvxT#0D6vZif! z`_$lLMeXeDR_k_mO~7n{u$>*VQFSuNt7`i_c`#j-ArZ1VAo7vF0PU9fwI}5pt6K#F zgH6;eyB8>vm^e8#bs;5hz=92`kSp+xXoW%hf7zMp#x7pI_uFcDVimLRdw2UX@zf!< zq#(Z2uWuh?Hdc;@&EqxcGL?$iGSO}$4|>8*L1_0x%tl6KXC}_fD350F4s``0Ca0x+ z@T15<9qs`?0A|jDh#$1EWw@IBQZe7Pn&{M)^ZDE+Q=%gT5`RV~i>3UG&Xs-y$?I&p z`CFrywgx}~F2A;voE&l>BEb`E(OhQ$ymnUq*jT0tRooztt(^*CBA|;(?`DDqN0p<~ z%RWa03k#$-M6HLxQ z6A^WSsq7~PqmDdKwMrq-sjrGfy7Am{iIXc&DJUrT(bH02UthD?Ihs_mb)EnDyrNV? zr+@x;YFzxv)_yH?u~qFavoT6}X2noY5eD;s=wnjQqz^^J`pFegDO46?=!A2E?$ zM;kPoM54BvyP^3%3kzzE_In`ZWM#(`!aoV!E{+WVwzlGVPYY}(Mo`=GT3S#OhZb5! zH;~~!y{+CmIM9E*yL7*p5CxDRLp0L0=kyG5lv#4(*x1cW)0? zOxVoK>^h^) zR6QG=UXAZ^M20q4Mxpd>vut^Ezm{9|e1z_-ZKyA1&lmvrV7eDdtdc^|kwC zDW~q3`Z4j?y0SSzQsvk-uPVdV0ZOGpT2w3vc*01Hjg8y9+d%yR#y6Pd4Ft7d$9&!~ zDKya(;$E8(auB{)>eAoRD~iiuA2B@Kykl82zOXO^D7&%rNun5uckFO?x6rcNaSNvg zU1CB47^5YqcDp`mw*d0TDyW{@KnM7TJ@y5Z@jYHBfTqdG$@zk*syDmap1}nFmy&~% z6Kl|hG2)1FCd2?ZTU%RuL2j|JT{_QqD)RF38O0Ll0wZfPhUeGn+5pFnv9;sy#H z-Uw)&;*yg3T>;Ye4nKaWr-NagMaxK&5!zSZ?d{|6xE%qEe33+ggDK7b)P!ebJYn^P znruBq_JX+feQ(jfB@q%5(b_+I9_y@9lmR2=KWz#x*0a02%PiglN;s4}ILx>+teD2- z5CR}>W?YEHLR}?Ll7W;lT)#4!S#(lSzd5EzfkuV)VR}(Mnw1uPZx522w-pmZMb1e| z{u!N;(l#cxx+OUz*Bk}4I(ncgDAo`KA8Ra=?;!}BFN*?dklC8rv)L)VYKeT&8~*z( zV=5A}t z9#gXDLsao}EL?)JGs6*(qC`LD-r$ zI71R7w;VKE)n#1_p;U~8{2OhK8n(j+lWkgHFE7caltx-j*433zXG>BWw3m2@kK8tT zJ&G;szIhzH26BC2>vU(h24aKF{cCm)o09D{`^6tyz*z%Bm0ONw?56uhA~;S*qY)Ir zVTMBq6EibxJI9hh{wz^0Td#k9de8T?@WJsf)%N<9dbwtqsMhrG;UDD`^~OE-+`OA^ z;i~HM4Aaw@+dm5R_4V)n!1H@%J~P^hM|+*!58D<)EX_XaYtmNkxIRIy4y?W&@z>!K3~Bat35+qu zLNctjH4Bq1<{oJwpG;?4k~XXuH_&Mz&ri-g_;i{L?Eulu1G$bYHkewa{Bv~oFPC#i zE`m#DHp?z>a?H_92zr$jutmFv8yg}bA__XXUIQkZqeV^u!LGSFi%%(hOJN(rGWa5(RRk%H!S%JY}Kkr?@#n zk3L_`3}QIsAI03@FYLx;K z*4A)@y7B@ly-2uJx-Ql%)B+F5A#by@LDVNTz!|`Xjww3ltv7wi*Xw$d98$&|5)_wz zIvdGve1COpVrdC{y>!t?{E4Nd7xMc3`-_PWs6$Rp4rX|7`+BuwlShX`HfU)B(L2b5 z;>O1v@^sqedBgOC`_NS7?D8%x$PP-V`=&aIta578o9N-iMpM(*knPX|=6^$PvEa@q zl-<&WR6k$Ud4sXCFrC}fRHF!Z(=u8(PW$Q}&wN<5P78%)R+$k^hf~u|-&9sQmhNPZ zmd`~VTV#${Z?Y?6-NGXqW^aP-dPNt__OpQx7O-uJo!a!HaYbxM4&DZK& z^5ujkX~YOjrgZ`NvU|PE%NQF62QY!}LkYCr@`feTgA+NTYOOqe77I?3OF2E}_pW^K(87@219g*$BC{1T6zNdF?TlUY*E=2Sc; zRso#czVca6Qhu=-VG!bhp+PEmTe;UwYJi-XBq$(H7feYd|NBgAMDuV+u{1Nj=v(=+ z%<`XOBSR`S%RgiJ5GHgtnQ9uAjG#hHDr#z%o0GL>`AW}6XrBaeiia#e1>*_@dDqzA zRSTNU@)8k@1wT(z`km#uuDYjhRF&cq7nyLkpPQFd>cvC9}KcBS8FE6#TP9*$QNU+_B zY$}REp)x$(B974V@U z>6dn*JFn6sAF}eQ6^3#|)f*e3_x69k%Wl#Tm5q$Z$RKQV3*7w;H*pvWtbH(G%*U~%SLg0TY)rQAZYyEq#p-()>z4$FB}f= zrqMf|{r!Cyc&&j2z)sCI5duT#Y)&OWNZ~YiZtzK_n&13)763%M%gHxE*$RAcVgpP{ z_Jk$^69}AfhsICLhE(A(PnfVQHrRl3FRRInsUtu;ahW0N0fW6ffc1Hwoq}u~X&n2` z@XKyT#>ZF1_GBCu%x?f25rhr)#b+Ud+bLrFM77Gc9zb&}$75<;km?9{keewxDmoP& z&Vo*ya4^!4yY3o$yfTm6FVCZ&zkU~fpKDZ3My|qYwV=t*?f937MN>r1hSLxytf=pMhpE@_#=A}iA zQ^Y8!oa)b894%VBSl$WB@D_NFHBJcQ^F{F8IikLN1DJ6A!u9;%n92m)M9zd;j;yRz z8#~LRD+^SYcE@>Kpi>*F}orbCV%Pu!FpG$8)j9z=R zMQWCJUeqw7eNZV}Vr0(g9S$=Z`9_tf@2DIKfkf(iY6rSZhkQHuDSwa!9y6E;oiO2! z!ni&?YufgSBM{y<2^5+Sapa^}HyyZURR@qXdZvDxzxyY2Z=`(cvb z0~Ue(W1bH?|-&o-ay1tzjwfeqv*niA__VY!p#k>~W> z0on)ZYo*f4g3d$_bPK$7r8n6vc4}X0+HgerxEZ+`yFEt~8+^KW5$O`I_Rr!Iov?HR zWmcEF5)08CvaI8@s^fa@-NFU;)g-Lea zo`0I5$-SX$NI(S;&NDan!)aYDfnb+Hlne!-N+BN-2G{V&UYd`d_WO7V#Q4Ei;A`z4 zEbRK93}14zKBRY0lG)4XW=$mjoS+Y!X)lFAwRc6e=jz3CeeBa^NScMunW&QC5C-Qy zy$1|lce!IKgR|#JBXz7@dTMye2m8O~`QYwFb!-2Cxkn#>*k?hL4Nx!Z1wzS5+tciG z@AJcLMRc?alx!w@PH`R7Wkuuo)MBL5QVu3|MtAon?)HuY114q?Et{%^KbLr$=Sy~Df`S+_>g8jCuO!{&|E za`R~tHwOm{LZE=29@BE2y}pq$RLk<)>UroUk3)+Oeq|k2a*FEeALtVAC#upBDQP`| z^rH)GF7JpHXPpG5#(nF{e0QDM!^$%%^GM|gj*Ctlbb1C2<%T44ltUwQ>-(eJ(uyz% zbji@Nm{cppDTzz23!R;sF6uY%#So4bPwo1Ia-&CShKzl_$?xg1r07=8Ej^Z%l)M*~6GB6VA%sB|_TBotr`>kwXR8eL_*;;?$>TM```f=xRB&CZU{IgK{pQy~_!Q2_ z2rY*v4+6_G(Xs=)uBFU--wqdP$7RH*(<;0h+7Mtofn>Os>*zp)cs;-F{C{MV#Xq&t-^5s(Jy2I-V;5f!9a2pAwG4N?+{w9?&3H%NVB?RUTDd(S!7 z#gDxu*7M9c=7@XTfeD+;9X z^E4Y2`3lL1J|C;guIPl><(qj|njI*I-2wV@^P*--TH2mhy|gI-L7D1|hBrD@+Enf* zD?D?OYnGP3)NSzk{;2d(SGwl62t8@$)=5z&TXARWELc|8bfrH%ipa^%z5+duEYlKB z*BY9)Z}kMp=t2}0f4@-aF>{86`J)qWgC`AvC;oS=ZQtBS5-Ih9iJQ z-5_kF@*WKV*1*8P_EF&F5hSt!AzWXNtMHk)(>)8}-2PRX4i82t1ad7#Jwy5oB*WtM9QHc3^GC9S@sEuD}2V z^v&&Rjfzl{AlM0lVO!CebC1lq!09m3WwyNYBPe&%xBk+zs7^hpWy*bzo1&XLMKq${ zA~;cxQpd9}{ev@3Ooi2LiuUNAKb5lCf2;+O5Prkda@;s98v}b+~qZQ(obxk*b6+K>1GgEzFr?6B1yk8Q*2c{#S#&2j|Vcw@oPy zC7eP<_W3CztJSjoHEzq>j{^@LACEVl2NF@Ih3?`IQ%&tl?bl+(srai#)CAmWe}{84 z_LS5-_#lLSvQ3UD8aq@yJQCT&EhZL+OU}u_!_&WZ-W>rQ$!ti-AgNGL`~j0d@g_!j zA^q0jzZGd#J(x0K?Pguyjl=NV=jm$PDA}v8$F7i?v(7(F+kS%ZzdWaPu32+pb8`X5 zM1!B8pz)oTkE0vhuw^=R{Q(|D`=859oVw!D63gRzTC-8~&%;>@B8sMvSDyIm}`rs@`W?Cg;QaT1MmxtvI(|wi5?M@0lK0XY; zkm;tTAh$_-O`O!!y7aE=`=1vvdU}KWX3tw$qeEK^&d!!EVG|7M9X6#N_ole18LeFr zu9N5HW(d*F4|P>V&j_gDgyzzp-poiQG{!HC$d$qVRd-58v;%xHo%o zuDL$xdxe~HL7L-@Q1YEL@c;@rYzIFco$YYx97&xwL>(=;JI4?2FAUzc{vyvE`}Dh4 zaO~@%Z{Si54A2N7uu65;d8*#M!%%3QS9h($aY{Xf07fwS%5BLaPohr3_cj{wS5B=T zKYwD#X&5D^KDD$o4IH^H>U}}h?GUm;|H@Q9=ed#7^KQ%WL;Pe;Q;W)xY+mk_Kh$Uf zdO@MG@xys9F8T%rqE}V~`_A0!eFatw1lFdyq&W#L=BUy#GA7@D^2PsPPc=V4Sx^5W z2M+mUgE<9>nlyjTxAl55Vf6W_Z#6>+9K>=M($+Gv{ROkmg6dD6!~kb38;-efM$c9y zj2C=1YKZnfg%0u+&1=7?(3NAuesPa6+JDn+riO0Pa!(#3r}*^)B-zmqDu^r8-a++w z_PU4~$9Bi5`s)M{A&H5^2`5#KH|9r51t)4w(Nwz6SJskEG{v#vhN|6@D*alj?$pz6 zDQYZiMC{JBDX&XVgcUsM{v?~&+=LOv?%GW;x{k}8<^buC*Z5Q%uRWE!YxMA54G{nD zKy6YQD1m$HLvr7+M7;NFI<_P?p=OUjx}2YLb4=@p*SKSE*cM$)+7*h8yTdKY)Uk5R zm%pGIg1c`cab#?~C(%b_tK05Kw&mnAm zsQzS!8KlbOD2F!f%c)Ncia+WfNOxn>?reu{e`sN=tbX zPNpa8qjDA0<~AFs>K!O0jT;eKyWZ9n^12+A*@0$r!c(At@jTxKm=p;otE+F1JuY3e zbtI^V~{1gE8ZC*6{jR}r6&sud?fs8`}6DstuE6U$x9 z>tnu7Pp9d_3c2?d&t{dJ*lm}?)^^&&$Hut84bvp}=ao=)c-doV=&HoiCtS@6ylNjlPp>==!V{#+S2>fhqGacIF8{_+3%c@=9nt*?|H4jUP>)TQMVQ;a!eh+P`K{_y zZDuq^r+}SAO_C>35@yoD0fN# zqzc_f5Eh`Q2g$RU4Uvp>P3OOOVUO`QQr`X+Oy(^fd7^|(E8Yh7OBQo2fnK7W{=%6E zO)7pcF}|>HR1=cfYuARG7Iy)^6kQ@GGise>F0H;SnYtB?DXoRbGpfGApGBDTeF0vs zI_MlLce_6S?t3}n5{}ryp=%T>WSxuUFusLxdPv&@#20ZJl>>d0ybzdndZc*R@*^g8 zOYOdu2a8*3&E5p$CKaQTLu;1hH^|o7qcKTPsX4za!hr_(T)@=<&KRFbSN0IHu8z8( zmnFDcD53K3C?#W1*ls{~qoml`j1@y5DJcmiogsh)P~Y*A$?a!=VGQ{6Z*g0j(oAW= zV~YfK8p@{T>KAZ=W$z??0BbI9OxPDPvu@OMM#W~Ql?3RM!N&L@0aT-=2T3?WYQFkmj^mX^9` zO#?-NoQ^nTH~Oi9Fe%vOD#|VmYS8EsmY>PYLARq>m?UnXqj=lnJJQEi|As4)U60|) zO(9CMm^SmTk_=5(byz36%rs96DPbP_ui;sn$Hv7mva((SK6ixn?em30ity%%2^vdF zONQhw=;m{ai^s$2;Nj!vG&InHEKKWT<8!LjRnBqN)Ujq3fP~I?| zXz(3gi)J(~8Qo%dl1dgA4E-|nGfc2+eL}qAc_&{-v;m@~Q+Qauvyl9Zgbb8#WY z$B%=#S$S7i%v#@Y9sxC+3IE$)g>Qd88vFa#2Rd>L&{|?jjKsK3!iX3h9ToICK2|_J zP?7Cd`1$iE!`-|1D9Ti|0Vnj+Lx4vD-DXl~&UgI&bW-hiat~Oei5VGjKou%>5D&bd zDNwr^)S8p{N|u=?N?MvEEVNt{&^zZPJi?BIj`^&Bzg&Wy!tw3-oSiprTfd1;9q&|( z%Fg@n;X0Jb&Cq|82x*;VxN`>=G>IOlHHPl*$H0Nvgw~>hv2j+%;nLC)iuwoQ6McO6 z(Q_dkN>`K9@HmqR2_i5fWafbZ-FA6iC4re-8`RHJ<2IU?$awTHEpi(9fE@wn$!GFK z7OLclP|aR{*cxq?-%~4=!xC+sikZ+6GU<4f0_>>gPK2SkOHY@}*flX4*Mdq>92GaVwV6xw!H%Asm9#}+|^rFiuylun*AOPMjdY;U{J z#0!SBq$TVuZTRlj(??iHU#}RN38+;L(8>Vn8EA~r2zlVybB4WR!6{I6Bce`@d{0{7 z!ofrkksOZ@JgEqA%ZuD)9310z>2GOCnMw#!Yt|Ro2W7Jr7~QdS!KY zeof82Cbb*L?K&)L8~Pyae0OmozPG0MbEhGbs!B?@nwmX~Jc;Q1X)&P~{J@2c>FgX7 z^x+_jAfQ(m$zeY`-6EL#R2&cjj5J?+z^|}7;^pQFF6Wg>2(p^M6AQZTBjQ7|+DjvO zu@jUfWq;|>B&bSTXrtlaY?+v-hksc0w$`a8e_2Z61)dyCZ)V5KXahT}g@(o?qiMdt zsc(YpFS0Y4zP%w(@VUOm;|EbpCSg0z9j>yq;}i`ArPdBd3KJ*%{K?U|xEu5}OFmZ$ zm|}+;xUDd`&zQ(AuB%Fvo;9dy0f%63&lW0hB(e;X@JHsn<#*BrV=lSP#k$TPHE};D zwi4fJm6^|_&rp5+`j4(;#5xd$}fddn~3u*Z>4z*AsI(%w&*=^pdV z^(V=nnO^eri5HT9=w{njr-bY?8`8`MYnew5SRdD>b5wtYB^TE++O9~+Xwj$YWA#zDr+7#tH?ZsYa0{;7BUuV=`^r{sU+CcRERQWsO7ZZA1Vpa2^Q zmJoO8DDT$rd{9DMOQRmwuZ~Yf zva2H&D~kD4%(to(H17P7w(B6mj9}yD%_X?5fl-*kQ#RVnP4=_f#`*Gsltvg4kK*(E zN}_k>Ge(%Ds^i9 zAnhwHDIhS;XBgCltvgKYMH$6L0rRu(#G_YJ7PX-9I26SyhBCNas)GCq9jp zl!rSK$Uw4q!)Y7&84#bk{=R)WsC=x~D5QOtxuH7Q{_Kko+hPR>C{&vteX$VJM@&Xm zgQ(oqH(1{8+ZX9D_*kD))|GWSsV4;#MH@2gcgPw4e50JGeY9TMFgt6SF4iU2GP>t= zh{XSWknuk7cU-u@)=uTqEAX?{4#rfxTk?HSd;prk#%9G+?ApUYqVYutqUAkaUMUU4 z7yY7+vlw#TosD32ZBZwW800DusT>4cI6c`mV|JW!8Y4#=8owI!N#y3Pv%hY3__EFD zm}d2fmMw`gDT%k*=YZ{S%WAeKL&V7Lz5~b!Mt|AIjf`?5tJeDYK4*|Jd8j#wGPlSi zkAna0PxTK6fChnnD9w4uz5TDr*#%BCh7IN-w_W!f8AX|h+p4mV4O+2>syxC|`16Lt z?6p3Xje#r=j;SX7=U4o>q~MS+o4YFiSbpP}-TCu0qM9B}Z-bkH^8GI#WtCoYWn>UQ zBO!Cw@gi^bNwBoO#UQXwJ@lEZ^Wq`JBA`<^8D#s__($Gt?aI_aEHY3M1@g$tFH%sa zwO7ktjk3ptg5l>++w6X-iD%Z4>^Q3FmfEd~E1pqpI2O-i$eZ(QDDW^7PI}DpJ9Y{`wyn1FFCgTab*rrIrW<35K(sve z``TfU>@`+(X|7?xooZSU5zdZQVzF0W;@-~%vh-K}o z<$Oj0&xCO&R+EcrWft9VpBhM3F5Fgt)dYx9PZ1iNgW6K^3`1rL#6Q*O z{udlxUMe`yJOTx6^@>=p+pho`ko0|hf>}EA4D0S4dIWFmHQ|QqP%OMsyo1@Tvb@yC% zyEZFkd$sx}KTv~X<#F9HG4(Tusfw;rb@$*@=qG%Ccx_}|n}sb;QuN-{(RUY`o?)I!N1pL9()gi>D& zJ#K0NFN65`J}!9H+pm9^`|9Zl2{uK`>&Y=s@g3z>8KZ$wqY$iTY%BPd6meuJ$~`6& zcR=g})P=ma$rlRi>0RT=sg>Dq@i2M!eK3V-(K9lorhR!v?CGG6UoCCe*>PcE*>M)W z)h+aCgg^44`FbZfl7a!L0?&Bz)`1irs^pHCZp)i*CQylyHFKNtQG^`wW93~7IbfS# zjp$VFq*bp~tWG+nPY}P&Dq77-o9!z%tKl`^sc~>)od58V-*qrl z@3Gn2aArjdcq>bkEu6>c^dnB1=ZeOe#3fr@(F0wV281 zycyK~Q8&2xG?X@8YBUM6-huX8kZ$&?bq}k+= zY42K^t73Qky-})PM7KBj%=eG5bbiXJA{jY(GdG@>pLkC}f$z@>U5=T(6G3muOz~w^D$8BLnF3FLpTlUA}a}7a7FBifk zV=pXh5w}SdZ&|K8{&8_CDqTL>ln7VcNT(cFRp#cJ?9`nU;2EE`B4P2nzT91T`K-$W zw@a=#IdDtoViQo8&h9RBNMWUOwnv75&e|+Y6*92<*xHf$TT>s#!mjtqKAUb~m)cQA zsh_!0kH$*LuHW6PuEiZ*VNN-chzOvz``Rnqe$B*_7%^z2xwHF>5OM;Zd$%JrKLj_M zg#WJHZuV;axW!A!l@z%j00Q4`(nI&h&6y~3aT%fJ_7JAG8IC(5vgTW!10ifF1X^CM zt^@OSU|KHhqGU((4YF?I447@CFVuQvthnzQo__Zp{m#M3Db4g2BTZ&Lm0W|5hX+P5 zYa%5w(E4ApQyG%Lq|h~fYCXCtLkP46WWU9KZ=4*4)Qa)uXjEZ2(-k+HT#?hLcAkCS zVUYA4BYJLryFcl@@9(%uf}MC`xzD(vgNZ%Q-%{QHZBFsSEkYScMER&xB&XFllR>Zx zH!-pF{rkdaIu}E!CQQ_t*RQsmJgLM^bGSM>>MiINj$i6ULls9XoN*l>FduZ8H`PSg zb%+RaVkoq*5<2#3Z^NwFmb0KJfv1vPvRtAWoqkAE_2mW{7$W0q)!^1V4X=&Vj*0Kz zAF{A%MoPS%OTYDp$lPKMdx* zJ#Y?+GuC81quJ4PaG7)a@jkdy>FGT#b)v^b^$J_L0WAQZk}l#&x3lx`J?VX!oL`dA z!P3jfFtEVRinmji`1G;utt<`*hxA$FrM%SubenR6cJhv8Oe8xKkq0RO*7l^QK=b?# zH$VRpPu2SsviR_h`NIa=UJ7YLnQKLRxb))YWHrJV9aN;X}mS zT+%-V3E`dUj6@Dg#c9Q(K>hh`YZTnAQzoe|Ut1@ChR10|Fo)s4*bmPm?zgowoTRDXY;plgwVG z%OS3(J#Nphu6>W7M0(iE1d0`^I80GG!nbeV(z#XW-xZ{xQef^`*VS0imtJsvHwfc? ze`wK?v%*8m?P2Z}^GxiCzCJN2DWSLoZN?TRk3exq^UVGqPqF5kMEtOO6m)d*PEK41 z99C^x+MWzG8G{MbbcB4Wz}ApT!Cg~obpXC)C=CvyOO3d3zRH6w}OI#X3IfAN(E94 zgvBvyG)1@+i3)RD%udj#J%P7CWm}sZ9Dj907@&s! zuQL}Ba~a=fWcvpu-v9HfT*FOTqa2(v{fIs`%Q`n7>Gc0hK&wex(t z%30OrA@kYyth4JEb6gi_frnOs;q+%SSjU4B=UU&|Gn%WlgI8^CEG+?vKpD_iO}r$@ z5qNw8QLk+x8UjLqqUhY{B?4mKuV5I|>BZ+S1=Q2OGSd`SknQJ`&PlnJtmJz`PBBkQ zwC$T~vRpp}v0QVIG4esdphJ^aPQ zNj%iV|%S774e>a{Dai@PTx5>sC`Qo?Tj)Ocb%0h} zw$zx3{Mt??GZm&@qn&jJo);hIO8jL8tpKaz_43~BtcyWorl=%5$o-)ZPI=iYRW#Jv zsp~Oulp@Jc7}q*0sW(arhgw)zSaeB8TYJW9UC*Flr}J(!TmDk^@3)+Jxai3TavX zd*eY>lDKip(hOCVM;$t;>ov~nZaV^j(8Ug+Kf8ibGP_8)JPVX^-nmzM+TJh0hbn3I z_Jo&@1TpZ;urXQ+=A8w%k9V}-?LhKbY)Rbr5bvfLsY_l70@b7vn1RRz`4UsK$JO%k z+s=YthOt&qV-~I_k@2(H0b%T^Z(YcoSdrGJ+e!!riv;{M+Oc+Y$eKZD2nt4VwW!R< zXHiJg$cO@N5o+O%HA2<-FjfWOT*_Q?tp{qo&B5p#+B!NdwiTHB=koIMP0Ixg7YK6X zutSQ5ZT4{51Ua2qz2tVgqJ~A~7!SXA@Ru)mX9vcYM1f}=fw6(d9hbppc7%OHLa|dv zB(ZTS=8md$xs4qdXr}iGBG7v?9|d>iZ69ttNvMIL%*c2Z>CM-^)_&s&fO%LXDO$T@ z!kb-pbE9&u;R}_{=@5PW<5p&T)&nLad#5gIwBLtU8_t5s>G0jMa0f!-r zZnhM$c!m7FeUD>21jA~e|3dzkxg*3kDN!a8^UQujP{C#YhcJiX9h$?B4H zw-?pd7nLyGikDOeAQPEX7EZ-HFtZ9*LU^Zf!@R9Y`7K%5%xBTact*SgLAk^! z$iph_8RX3N%vrOZJ$oj_LIPj2i(Sd@i;It_o<2>WTpsjww3=u%jxH%_t@azO>z*4er#b7GGAAL0Jg9SQE(%kZL+`YX&j|c?}{p2+eFjy|7@k$Ny6(V~2 zgus*JKq=LDD-Awg-jL95vS)$N4cIBD5zLUBRc4C&CM!N-Pi64AT+DddSLAueJR?6p z+2!A2W1kzS%L)YDmN)`-4l*Bgq`mrvmDWudHIM&oxouI?r2OQ8qN2Qo1zx~OmoX}d z_4AvUU#`-Cm@?6>=xgX!jx*w%RI4tNAuSW%HjFEzL5xE*X zkxDa+7aVcCR>^_of;6^|{SqF&V3?AKY1%&JSHwq&cmb9x3V+Y3xqp#Io^OX?Lm8F590u~ zG8gM-8X;_xF44%!PH>X+W%rPE`pc^El2LmY25c`i?{HrHaRVYc)|d0QZz)k^BpCSu z!We<|I0lIAjx>C!tb_)!sPExVbE79usM({XpFUkAJBTH+7wqcWu8(Fi-op-7fb(ik zLQhEdNGeBLCU1yqL&0-w>6A4ZW^LJ{cYXFGcz9;Dj7peaD+1K_^>ni?XkkMh4-;Kc zQPFvOMhfI6sO58cvNx3SG(jWaDgdu0CJfmQFp-RA>N(Kge>F89Mk;4{ip$GM5puK8 zt9$Z`SGvTMk4kFr%j42{J32<-A2X$kE9I`7y5c4L;NiI+1JDxS9)*?HE@cyCnMNNm zfhp1;XJ_!Pdwp`^4f!IYs3=WEMFljut~wY4rVJUEjg1XTNaEiW@OSt041pC0 zI2*B}lha_ob7vfxN&Fli>Lu~4tw-y}sS4PlOo`Y9J?iY$M$wy7Jh8Dqc#71etW1DC za!v}GU*-UcfaDj>1EZ4i@pw<(w{R6oo>DU0s1elD(-Ty6xj88U0wQF|oQ5sGerY$2 z--PB+%Vth-F(IGIJPd!*?M*cX5=JApVbJF8A4$S@FLup|(9$ubc`3#PNH zE@r5bai8#q&JDdoB?PD+1|ivDGRvzw7w}W~=*0O0R;Mane*SQ1qc8&qVpb}c?Enl; zaD|MwZ{s}vYyb^I1Id3s9=P~dV67pQq}#*9!h($hIgmOzF=h-@+Zw(DGZa_9Gh@&t zJ_sEVj9F z!AlE(EpbkVud>xYDL@dVd_8W7R5r0#O%@&&d>q`}l%XaVx?yE)-FcIE#g4A|Asj8} z_e25Z09t?;UmRX5q6Ts2Kz0BQLwL6(uJ!3ZMt=gG)Zly@1Ub3yPilI4ER{ivlQYhC z%ktpfW#1bjUzdo{5}qIyU(Fn(iMt=fOEIOL@Ie_P;(K}FpWqF;J>rYkM5u{_E&fh; za**MI=3tXq>5Hr^!Z>--zQaXVA_Kprl zBJ3CG>9ILEIYE^TuiyW+MGfJLiP6IRE`H@V?2Mf?n^!tJPEJo4T@M+{}Y#`*I z3rkB(Y;2fuadD7%Ty+R^b|&%@rw645P$jtP;CqLHmR1gAA&^KUN_6o2?=!d~4yNoK z$FnYy7-sFjWOI;6wBcf7&&O`P-@iA*)RsqJ8+Pb34R%Df4Hd9AjrQ21TL3hwd~X$M zVh;5u6rX%5SpS?DqzaK7Xg{FCdFJ9GgmXE+_A{l}J2U}ipCw_O9guDq7C@T{0G9_- zjn{J2fu&5meJBufc<8Zx;s=o>`^y)EVxDVVoh*ajJy5oVF~|oG9$d-lRq*va_3(_6 z)J=kF0+s?wg9L9#Ucm`~t`*8}aZ76;;MqWmM{*ZC_^FnxhJpeX_(}cQ(bwdEZe;rU z`1qyn{8?SSsxrtZ!CPqv!mlMa-%7@3*T zf%b!jU5-l~qw4{XSg{ZX2C_>}c!~`B)LIgxY-=B6i zHdleHw)Z?Ej)VN2jqpM;t|Q!_hYlVXB1C6*cN>bqGoF=^AqQjXU_J~aQO^&tKIG?P z!uL_aDZH|wv~k^*C?Ny*HqhAFYh%((}H79^%$CBUN-{q4MOno2eljj zT^d_kG+3I?pAS=xAiIZxpPb9cuZ7WG;wvZl`uaMC%AnC6b|%kTWv}g-tKiQ-Wg~lV z6>aPSq)lNO{KczRp_`kVL6x-F6yYv)KNH1dLnnhYKe*Qo5Z5_MbDQ#~0niUVs6#ZS z4Gli}enLq(N~g&>H5@gY`0obU+XG+keNoXt%F$9cwL0R)uG%FGNcrnyj!aDvq~^;6 z)R=I?5e2j<2*srX8qbUb4fJr~&I=k%EiE31d3}`P;=CO9awE_s6Uh6=ih!_C?Xj4a2nB&|f^}vMP zgQE}P1$27`{9WHP>^+%@u)$V;T9$XzL#RTb4dB_{s1VD+E`P1>8Ll_!7;eyjL8@#p zfFt#5pcaY&t^>|}NJt2H4>;`LSl}b29336|I3C$qTVGKbeE;dw_~vIK>?f$)+d5TV zMyA!nGfYx9%ucIbprAx;RJ4~HkA>tq)Y|~6m25m~^Y8`2XLfEbI!Tm;jFJzifnI@4 z`P~Uh9YM(V+5CQEQIY&Ih~LA*AxL(ZgAj&wi7)oeO-+M+bno2C!QqD+JixQ!1xp6) z?CbS}yfCWuukov;t@2U8mTrhjHQZKD(Pi9DHKqA0t z)f*C$VECCzjqB0K313Slhd$<#uds1ekzsK(jtXEWvar6 zAT2E|Ymok^MjzBqcgss}10XJZWbPPKt!A2xGp zJ~0^?=3C`T)~yb1JPfp}@C6wP6Eibd(nJ=1OxxID+ToiwWQ~7WlfDzd&!!Ue-2MZk zz~?uHU$Q&#Vglt$l&*KV;1VnrX5Xc>wO{$t+kgfH3^-N#=UY@M!2ZEwzE|{ zD>BEzaLFY#5O|m}D3>btg%bI`wiacqp!o}%(jy^W>WK5hszy0r=bSph&w~(QAa0KO%GayT2NC%;+K(Oun^JJ& zg@8Z>qzSpz)f5l~fmr|P4TF!5A>3q&gNqACIXWh064`OE#kY}OF$SY4w>1{j(&)dc zvXJEDPQIKXZAZ;OeTtwegE;}-xc1%j~`Jt z?)f+hgcMO7VYJA@kRTieBPSEyd-q_;_I(Kt|}N|2z#X zZCtO!B@J8&Bn>}sxH%aEGVZX_S;pkV#KEAylMF+z9`to~OF&P*A#r)qJBjR^<_C?W9W7l+l7Ln?6fzVRHa4bv_ej8mATe=qafytHX@xccJo-*~ z);TZ$@xksOXO!30MvRS()qiya{YVgY2nGw()un(K4bkIq_j9nZBNcxqr($CV7;#7a zRZdO<_>=I5)w0CfK*cWM%NIUT|Gx-Ock1lygit06DlZUX7+)*)4-NvV90wPmRc*3{ zbI#`cwjJJ30|h~#zN3ykFf`iR<@>%23Zjk=6u_v6c5*kCH8;!n4 z1XjJ7ZBVL#cJmFmZIYM+3BjKLB#Dk!)dK$*MIS6C8_!K&Y)nHM5dso0N3kSVAoYbw zA{x-4+4);r;nQmK z#vA-241S;Y$GL&aM5VKksuUORDIiV;m-LaHa;Sf$mxu?E#92s19d|Sh4Di4)fm{`k zKabC-sTYK-(x5_gWSx(L!71>7_?ZhR@Z-$k#nAY7Gp5~RdJ!YC|E1r8c; zZ6Mgof|iw+=#&DaIWLov5?{X#Ln4_(y>~I-TtLgD6*R5j=7|qCWUwh9JV4q$I5-HY zi7)XmFS_g9z(v;@3qlR-TZ;|1ILE?cTJy8F5bzqn!7|9O60T!&zhfkj% zpEg>vI!>)3g;4I|#72nmIc_?0Jq1hy@*J4_FIl>mtJVy?beID&Dblv|W^m2@U3Rjf|^?x*_F) zq7|k538F&c`r^xKX(UnK?(TxF2p}?aqFzA|e~&IQNpGt9eW`lzK^s*kbX(SSe6hQg zT4nCuJyeLeFP%e_6?h>8x;C>H_58a&d2VBwQ7Iky&I> z#2!pAEouBn+NF!2=2+hFaV;Ou)DWwL4T^3nuP5LX@R zx;-%YG2t+ioqTnf$7GMzAHJ)_lvr)Jgq;)D^;(rFvGA|2s%pHN(p~?56G5o9P%}I7ZTffC|no>0AWl{lv8gT zW-tGz_@64vBY1KvTKvmGd~B?&rDgsp^6S7mlf`>?lZo_dC?x=Z11Uc@>bqV(llo|& zPMHhg8^SYm5y7Fiqb~9M*3nTHM|NgY{_!Ku?CdPuym>9AO&SinzP>)gYefj;!Jy1y zT`~6PG|FI^k%_70{G=LV3`%2Bx_N!%64>|g*~FWjrp?X@;tteNEC7v2PQRhW$d_YXKhFdPUJ90?2jKuKwjJq0{4klAB^*NoZ- zpdo|!E~Mt~T101=QByI|Nb%aM7cao>Aq#gDYlx30fa46+ipmPB=^Z^MYSc|PklnAZ z7j_Jv0>Z_S#`MoLAYf1z=f0?NtrrC;5#zc-xiR&8g1$Zq`I@ZxPFVcf!%Dj-H5Zqi z+fQb|OxY39&+aDQ{T~#Bep@95M)y#hY`3M@VKMh$vrn@9KitY(-~NtJ6MDQ{7QX(3*0jJ#cD80@V?u-i%Ra$pSb;6x_G#C*4giG zGl?`P!{c8ohSV_*5e5uhmF+k;u{OV{A><4WIw2fjeKo)ZoS= z41iYxc9XISee`J|7)Y_Up&=upy$Hi5m^_7!!tgZc;cj~U#0{JFcUT=Ue0HIP+is`6_x*j0DVsDYe1KIwFHa3ZgOCoCOHBRBt z!NCwQ-^0Q?(L-ehMyn)mz@%ZU2GkBP&ulhlW*CnB#0Lfk8#r^0wWViUYKHLC*k@B& zum8SqVjF+v81i&NgoXfSn?Mf`_6^lh0`!)7iLj1h_)p5kML>c#z!lro(QLZyg0q8q zTLwlAJ~t3@H7d44t;7F;9<((z(V~$<8B9iRJAmgQDtdN3qU8KoKY0}tlu^9YDOC$G zjd$wo;;slcA-%~OH!SE0JeOp+a^+}g3*N`aSKa_FZD9bY#DG)4#5YZ6U}z{Dq@tzR z5srTdDQlcbJeYItZAP86Znh4e_k$X9HoNWQ=(0NHJjNC*=HA{OEZWdBh6(Hcl>fEQ z*2qv`(Zm4M!OP$_#D72W`MZD1I+ft0R{4Sm4~cyRTAD9XQ==hndf(WfZnLd`Mwk_d z9JAx#;P5-x5dZV3BB0Q^7m@KDW?8@#L3v7a$@`8>8ELy<^LL-+GMK73!Z9CtwkZk}9e^M^cIG=KuNixW z2u|S7Pm$Wam4E^7h!hEotG!tgM>fW#U5l<_<$06h?VcoS8A`+FrB$gq|IHOzTBNtV z>J4*4{qIVj9`Bg<@zL(K*`A~7L$qL%$(!eQtk8za7gT{)&lPy01Z=c?)~cJ-%Y^?w zl*y+az&Lm?Ns#Dj>OFF-c7`j;8KBGnc;-s_{Upe{b;Kk=n^<0184qe{bt5B!e~QYL z3j;q&tvf~eH*ne%HVVJw8QJ};HQM@H1<~aZ|InJ)w%(|~<3Pj82|K-~#TH&(6mUU> zJmh9m_1+;6)F8%S{>dfO_h_v?N)8LVw&E`QAa4Nwtwgou+sKpFf>}E~0;l`<-zlbr zz@QD2u1?_?ZoPUKqHYe35H%tNCreChgQplw4!qx){Jmi|C8wbV)LF1e)jj*$8F654 zaP1cQvu5ZYqvm82nHAvPZ_4eP`TrNyLbqirgI$B|gOuZ0%<~Fa4R}OIUxI)9P=sBb zjp6zV^Z4NpSa!RX8c@l%2h6u8fKq#HvdhKUvP6VByF1tE*>|-7n4JxQo%TCF7#?X1 zlz?a|Q5I(W{m0yg&u=pU`-JO9gWAjh@`73cDp$Ott?A2^11O9hK74q*l;%W4N%_z+ z8ruji3uL@`6J-fOFq8xl7L3LBr|-!wE5uf4Jq(?B-fQBua6aY;RvdVBjoIE7IcR&XmD^K(KTjg-rZ`3Rs^fWz|>!y5*+}3U9xh{9P zc02=*Jne7_GCEc1kH)X@1RlGC4~05-2V!M{cd>CJG=QLuZ@f4C@9xJ$M+4{pEeEl$ zQ~&zdS7~XusBlpnj_OiWjiKM!`wv#54`3YlcWChqKX0Xe`u{@pBo7oFPlL$)?9evKeBSP(eiW0#hf zQQ;odjp+fqgN4Av#1vhsIi&LHVzw6p;YujV!zCH8kCQ0FO}AJ2;fk>^xMjm`v*GSV z*&tUsP8b^CsPs`t!sOnX5e^Lyt3~B`AgqW9KzkZnv_av-+Je5g=h{%wBWYm1LShey zqVuCmP>Py28miJly$9l??+nzp|DaT9LXe7krNFN-d>2=$(dX2qE7qU=k$ zvsUo}*c({V*q{tAH)>ep+BWOskx)#ZZm0w;0%>f3Ocz{zOFi&x^oTW}B*l!M$5{IU z0^j4$m&8z4oCOgv33f3I^^lejB8(p%@!y)kN|Qcv0XP$dh(I0ueSSh-K>U&giaD$lI8`fwqfx4L)6X-jpD6;{| zCsRBOU*lzucgDHg8|RZaw$a{~mJ-A8-z^ZIHjLO&T8laem@XDbXAJ~UB22%?=<#=Y z=;TRa6DxZSjErEz3;y^)^V#a?_;2%Q1yH#$7-hM8bPH)^^mSwrdGFrAdmPJ&LaFp> z;Ax zg8YvqtC@y|1{flk($doD`4%@?<-J^@AAV^nS4Ujc)lBtN;FW{&Yozws9riq!p!^2f zR>Ql$K4>A^gUvQ52FjR_;EX~vqk)gB;Q>L@xSg?33{XI{JZ<&7RM{hjlp(yIICd=jS2-J*_ zNkjPJxE1NjTrWsY=JdL3^0o3_kFF4Zi+?XsyT)z=z(5h->0c@4buAELhDg0!0QUYQ zIwJ;veViLmXwQP#3>K(~7&QL!HBfdCXZ%+CwwNXUUQg}EQMPaTbV=oQHN>rVMWb#I z%lRd$<`myE+nC4zjYV}uxu>MW=F8Uw-Ll33rGTZdw+TTPe*4~8{+R#9`nXP{Y zlZQ|#f?6(2e|dUV4We-BjC{UI&#WgDpJq7@T%f%K!5Lr&lrYiv-f2(V@E?XufqSszgL&eZ#M#JUQif(^zZ^$73f6L&d`ug_OF8` z&IPb*u>j*Eh#BHKpz|bat)}?r#m-znkrk_wBfX1Q&dyu8=QC?o%G&8xqi0Qnu1NTo z!btXLn4itl<_?L~74f_YGw`o8o0*=NZHQj=)%a$$=mXcy+w*dswOYf4IF(pw$;spa zm#5S7U=2>9?*YoXW)*#$0w6EMbzv17`%9ArEh^kRam=94pE&_uU=|kEcddE{uy79a zHiCnLJAeE@_1|Qjx-cVR0mt`EDUCDS4&7zJAI7_3)}Y zWFUrR?5;!k-z{8I2dbg_Fm>_mo%j-n5Q($rL5zHJR@(sOsZ~#UumPunscDW09vvYy z%{_jm^{-Zid@(8)O?AsqZW6++wZtAXAm%ntPt&9Py1Q_OwSZf0KaAEf9UmW$ls$7CExQH;Zysi zmH2tMM<*Ka8q^9_R(fa*e}hPH>(*693!{}_=5J#>@1DxZ5=)5PUC5#)B}IR&xVR%X z0a@%-X>1=~U)It+46=5_+ipwn@Mb`S`i) zKD)6I7aoo|9#RWe_Q3X{5GIFBx1KS-?08xcOk-nX$nMQ7E#;l5`2{WPWk=xjDABM6qL2~~4}R$3lzQ)3!p$v>&jh=^ z-3)x7rq%(X=sWZDmlSFI4lN+<8-^my%KiuT*3i?t^_G1Mf)AYezQIBBE}ieVREz>{ z7oGuZVNNpd{lB&wSX;mER?00b!~>aaRm16x20ogaUa&hb?CN#WE&WF4Mko#T;-fS> z@~8l^2AvH1`FMaVP|!X68Wfzi6+Zo&zCD?br~UTuu^Fu$9G?B>ls@2$28hF6&-7i% z9tKSLOJTdLFxMkQ)S5Jq*I=W;Xi#)Jwj`UWs9ld%9Sba-)uIiAYjL4JBLi~i z^$iUu?*~N!NMk=WLS9pF5C>5-8%6W4{68T@)X>&uxqVP722@E1OCb9VUGesnmG|$K z%NiR|G#5d*g#i>0F*d}WI#+WC+~nbLX&b1Zj+3Xr3-{*woA)-BPV}~2n*XgdK`v* zGOXyWs~-0a2HB7?ab;mwe;97`n-@%vVzTll8RN<_{H3SiG?f=HjjFl*lAOurFf9bHmbNTVIJgRIiuC-2N~gg` zisq+SuSR}#96~MvWFnZanFUAs5^G5!;EV#2WT;ihl$%$thsb>TZR>jiNE_rAkjsEt zh@`72pO8=#RIYFc$Bfd!m4bZkIMR@gtfleY(|eRarbuSBFz}Bu#Dy6RAONv?hc~`% zAw{jX1u&IDi7cKz6*76${4aA}a$1D^}M==kWs4u%LXfnA43kwUs0c8~)${{2m z>3b+T7J($FxH0M&{vWp91Fq-2{U1j|6h%Xb6sc$$6%kD;T8j2wT2wSuq#Z?Cq*D1H z6-qmmv?NI>ZIvYLNQ2hz`QqH?d*6@$|2)p)+~+==)93Skzs7Yv*F{tOqk2%_cpi=q z%x(}%oCe&9^U(xSq+H=k)4uUbjj!o#&J6p>-AuV`YE|}<{#1F9jjc)X_A}CT(-K4B zX@&Y^FJYSMq23ZJyAyzQX_ffl_Es)JOFWMZHt|pH16$_59Xs->8>6TDkTXnZBRq6} z%(nwhZdxg)?&(>?C+=)`Vq(QBkR-QMrPkS%B9Nx6tc-5$T1aF3ae;t%L>g0kVM&J% zixW?X{!~qyHyi;Q`lYN&yK&&o_cHptEb*F){_^VUh`Sa-2W99G{?YfhvAC(vQhe!G zdx&Y_UNq7GAVApf=I%jVPgqRMPlEL-P;5*} z;){_KG9!HYEKK)pve)sdpe^3SKpP`nIDO?AE;}(%N`p0UO-a?xiL$a6!xk8}viVAR z*vA_4J^RGPI~I%IA8wMm*Qz5j0j$nG`O%9P^Vf4Z;^~v_ef1x3G4a8!ryh2~F$mh{ zY1_3Z?al=}P<^lvbX+)fU2V*AbP@S@t@Kx1Y1vB7OP3Mj4xpk3_DslGskYfC(^w@R zzZM5M2|t+N%!|XP)s*ao#ugVBp}u@ld;1aK`nbT$xKNKCy)0OBO$hjY5dUa9U{88{zW zS6^SB`b_V{`?Rz>XRv^AsAC1@R&Zd#5@6go-so8=FU%{z{O8PKWAGagaM82~vdCv- zWUQs~{8h*o=6hw-;1JupqX#56%rC1@S9@Me&+8M$Ha$=@Uc#JSi$vo9u(ElK-!9I~ zC1g5o#8awv#0yrj-wH1gAkJ5{wY7ssJyU1$y}q9|jGcHsNKaoBa&hlD2yzrsGV6qf zr##Rb#VvFExcEw2W6sR6U!`-Vq=D+ysy!N$tUf?g%bnDXhZ~qw9yNK&<8%RCCIX@~kLPd~JRF}83OK58ephYZqvKrNoJocH z;trkUjJS9)N6z)-8>n*84qp5D^8$|PHO1+Hx~{{kL^-d5*nv<|-TbI!Y)b9d8T8XhZq zS?id{yk7p&p_i`~C&qZ53^}<+%ylXx@++yTS|z_;b92}5lQOD=Q3gkp?SQzKZq$PSKi z=+hg{P__5NGI~-%RVCJG4b~95e1CDF`Nd{xVVPWqE}OW_{+Vj}HOGeaSErE-KC@ZOO31+99gyNG@LxyMmX|?G41DGt+u07Nj?qeCtoI!DlDfYBTf@7d6 za>d{&YB;nR9@pv*ZWhUM?sD*C?w7`AD%L< zT}xyT9o-18o^JBV%5qLs*1EWuj zN=tl;%?0F~)SJ4x*2vI-tI}_u`uQ^`Ymyr18*YrBJZ!er6Lz>t$k=NfWIaCzKSUHM z-#M`pWg*4^(t)Cg$+o90H#p$-5?V7lwK(P(k3wCnhIlwX~wjPsrAi zXgTP2@3nc=ym^C%2A!_23rBU^YWa@xC*uSSogXV2 zM~Mp}Ti-$WV;GlUL}>E6cPdOWFfs92ALD1u{_|zmZP_9yF~MqEt<8ymc`oR(fNNle zSM-Yoz>7pmg@5GbZBIUmZ&dmQvpmgNnW#%Q z72;K_JdaM&h^|@kNvgdb>+6=0{~wIRWtLlit+3&XmjKA2;Ux|}qyZ0j{Fsxy~_Q=EtO_#FMGF>u>u3(I6g2qy{FB$;rznK~)WSZ_n+w z(NmV&+0yitaac30U+;@zKss@<5^8y0)c+n93qH5nL5#mW{nV4Hq@^sY0V5 zyyV&nBneAJVZl)x(JC1A7wG9hHJaO&h=Ldc^;m)T5FH?(K1N|-Vd$>6^YPIUZ4|U= zi&g3CCwzR~M{0CjTYseEeuFhU?X6cm$*6E?5C#a!z;OeXG9tITyPFXsI-zJFNr1>v zg#K5Aox#o|^q2sV0uN8+3OEy34^uq$%DLcI-j6&X93&89gfa?^V(MLA(?4s*efXmw z_6AIGe^;w0`wliT3=F>)zN|m!GIkR>@Mw2B+gcQNOwiWO&bld%L}N^|{Q2`D7*=VL zqibKPs-ohnvD(MS2eS%aaD{j;P9|=L8w_m$CcUU8eHdJ}46%>PmoEp3F)=d}2+Gaf zy}&+qu$=J-L3KRO3$IUW4uNwFItwUoRh(KX0a!xROJXIAxF@oC1^%oJb%MKb7gV2@&XMd;T20x|7w z+cGRatW4baq&ftPhpWka&+RXnqMK6~9Ucn@H1qy|{Sw{yh^!uDf=AGEE1S|LR}5;Y40ZLmCS!_0JCSRctF za8l&s7|?@O6$c56r0Hn%D-HQ|oTto}mJn8nH(>YaMcee$N3b5HOAF)ni0i-K578w( zOg|Kj!3o=5r?b}9N5KVyLMhi}AA9-p=RT5wiB4z)fGNIVM76Fc`|z5bA)PUJxIo4c zQy=4k^@>BlVpBy}BKsI-(yrv9#y6exMnd8;E^5@MP6daB6Z}U0Y_j#9W$r~d2`#q1 zYX1Q$SWO9oU-^Q&GVqe-(RNvgx6vQTvr8V*6$DM(X$sYz0|6B{VCWb!#9|FrXSOLxB0m)FAPVN^v)n!6l7R|H25?KF$(G232LR5Y;gskN2QW@Pu@yN28Q%{a0? zB3cV1nVFe^rxKL8!XXuSc3DTqW+>~{G7Dzs<%O=7@9OIMKfIOa3_L{`hqs$qem%7F zzR;k-qx_Xvx1Y4dfm8uw6T?MxyjGfxqn!mb5r}=@=L; zXq$ZlGI1|*bwC*Gzn%tuv2L3pLb*$NBGqyXGilO0_yG*aJ@bk0xbDUHg7b4&;^@0qjDRI6%2$B_g)#1WSRiX*G)0{oDNV z--^uO-#`HetUoy?C#sI!eHkhmfZ6gmcQtoKefVvIBOlK&I%A#QrvOqjaf1>R?Fh9rAI=_(w=79D80a4_uyKOUcMs1JL+b7>6{}{a;3(QX>*c4j(;ZTgJnm zab?>4v3yQO6&|HQYeb2KLW$xllXMgc$52rxGYoUa>%6DNhjA0{TU)<1ML%u$RVUt^ zZ|7Xx^yB9~tVl9x60EQHLg5aVu`r~sQCK!zS3uEJMFDJwZVwyCSF2$|Edq)`Bxd?7 zd0Qis&b@3c0|SYE2eBawpFDh2ZD&qZ1^8ocTku4jIPCG04)qk4Pqqc+!|)VJuIOw9 zc0IOIOxyj#&A+9gr3KScKFF|674JUQ{``}G4&D>5`mRClWyMR z3f^L7hS9rW5bvYu_>5N;k$V_h4m~Gk9CL|_x0vZS0&h8w`xb4jOp;m;Ql{9E<2&pi z%D($uYisKZ3E8Vu>e=rDGR1;UCcS7)H-$eMEM1NTWxLhcH27fp_|?PZbyGQ^YF*K6cW zzrpo{(@S1s?YCa9&a3>F!eQ^T>wkM2U<^2{(aS~TmPSDMNNk!VB_${;+)@^)u4aA$ zOJ0UnACikeKx*!P02v%RB=;D4@sEXRo400O`A)?BT+|zc^tCnT(7fSJQ@~FH-SY9$ zgNhH)5LLLjyOT>0wNkCa(|>P1!=~5~lu9_tp!$nw6}?}%Er+krsXyeA{(`CV?;=TD zx{(^l71vxZxmAfDvnmhILeEQmGd!FTt>LPa20r-~o^ta&Z8qCPqwD{tiGmwkxqT7J zPwYmfO`C=seSF|tf!bFTd6cSRQKfM@-S+L>OUtj@-w4&*iO`?oX@1N8zKuOcuMtJV9;R-W%>Sr$cT}V;`Xf@1 zsuQEI{I^U&NAsY=T=&VHnCug8za{Z;5u}FWrAt!aK#lipif4HXIgQQc_!SmJ`EXQ7QXyG^PjkY$%XKjL!id!@cx@|^VzZy5aJXGs{&UK=6@s^Wvv`APO?zqUVd20b+B-0?68aAJh6|!Z zRE|azH7I$J`0DpthHGLs#(0e3^VlM(h+v+$w@FFf<4h3obmoQEZ1MPI34H@InQ}R7-+AalC1hn z0=_IQcM{17&^_!Y#ddG_q%oP41Sg=vRO~QZgY|m;=Qs7)U%$8xA2twq8C5oc!%_j4 zCm0zsjQw1NURsQ>G4pMS3mYZE%%00R$be3GByC4b*Az%We(svOW>P;pD}k|tgdqm* z>Yl@K<|+gNKsuft@i~$?XMPd=SX6X0zAS1=x^_p7Kw$mClT06@AtXkPG(YQzM{u{G zezdD-17ItVvc#|jRvTUtoS0;NZrT(AyTUs?t39{Tkb#>W)nK{k>MCjf99=U)p79VS zEn^vI%MZ;QC^>x0yoP^()>rY_011o<9j0zEJ4?OD#her+(oSu4MdyZ-C0}??F}|iFW8-Br?oY*Gne& zi^}6v#(mgY;)Sr-?O;7oodTOSMx`!uA7|6fTZ3!FCD0|3GY$pzPEBk*Vm*Ohv-7Le zKzbd1CVUYcd%D|-YT81%pSO)Pg#{<~13n7GU}H3w#^=wgHRggJI6u-VI{W)~a&q!3 zGy3~s*RQv&mUZR`92&AYUGASLgv(VL_08fB;idJk&Dcf1u45YJE^VDPt$IVU*5De1 zF%g0oVoQ~unSp4UNe1y6;=9$HwES;@Gy#UT>Rs8XdWbxj8i; zU=p5yQv#B7;~ZU41fpPF_f>{&AlL~$74^A^u`vfVa1(AEJi1U=kf#FmG}K8ro3V{a zw@kfqWqEb=N}TD~>XYkt5L^ z3XUxZyn6-)0+Bedzh+PNy4X8+Wbm8dDm;_%>9v9(AEg!b{_M;iz0)pd?d;@WVt(Y| za4Db-Fl3AiUNrb?OG~9GtJm5)0TH7$MSX@|YxhAR)?uk%Am!z+Z`{~uEOJ~R{jhVJBLTLWW z0Qfw5^jd6x+CQxSbAU#8;JFuHY|HAdG8W0tHWOg{AMD{rTOLTn?V_UVaC$h*_bjq_rANH>6KF93?V-K4TCEZF>IOyb;)hD*|C{Fzojl#0^~!5w9C z`~Hw1uy2%8x}b@n9c=@k1u1jw>swsxqPv0JSsieeFlVyE(3Bl^bE-7 z$gnw`5YM8z=B$txS4BLtX1M~LOz(M=?J^+G3+m5 zfY#jA(Ar7@A#2*%;;d8h@-{?jG}IKZH*PE71KtCs*w-i)SKum{AU&Vpty{L_SUi7> zeq=uM1rc(?U`@Q6;7rQ0EJdjYM@HnJD2Jkh+RAc6Eie~I?-;=2aUAjHU<;LRoNn=j zl!T-}adC0MuMJsw$|LRNRhK|-pw)uCy_$NRnJoGA*n4PCA3m2y0kzGK%u%z@!{4F} zY#03)jr$DnD%Xx3)F|Mi(z{@80}3nL_v!|1jeG<2ZorMw*UtmM3eM8A{XI8#6SG0k z8?ZVb_Jphd$K)iMXmt&ZS6SJjavwT7uYsyTtz2_!Rcm()l%KJ&u{W|8a(aNTfqJDKav$*;Af+!&tc6`YFL^ciS56>^)>q2WB9`4%q4&^)=*Lz#cMti%T z63o@#BdAV;?;pS)ARglv zqd*oQCHX=%k7tJ?jax*72|`s3ao?Q#xb~rWLEnR|<}h3}97eE>l`H#R`P18WvC^6~ zBldU&Fwpq0Kv2qnicXxkR_kI|>b(Z!k#+TXMgWm3!}`vDdA&|i>hmOjTlf~qoo~V@ z4n_oWfw>4g;^|0;jU@Oe-^Ry{zH+6ng@G7YqQ64Q&3!@-;krbXA%{eVo&#ng9QdwR zuiMqadj|CRKtwLGkS{z#F9P}6(Leg%HWe~skCcV zG836MdZ0*ama^?acYR$QaWxZydf_mRqFqro@&-RPHj0Rg2cq;c1%3(AyaM{r=;lvo zQ?MUXJBZE`P>;udeVJSrIeO!~oE7FFdAJqf!JV zR)MMmByf*t{rw!kbX5v+Z@q97hNI^$Ygz(V1T9;jSaF8 zB1pVKwNlN?s8LBmqM>w&-UjfRR00EFQ7TuBgF*!)s)ZXa4 zM<)1H*e0H&KI;p$9{BR*?QWM(jg2d=E0l*A7Hu>go5R(krt}?UXpB7)WPnRgD=;Ek zWd+V61Y2r5ZN|o9*7`C7Wm1oX3c*sq&H({9&%qljLU{8?jqno!6BE6%WXtmNpKX{@ z0UUPz#}`Gim{4B1&RyXypR_)A?ig}2@a%Y8YoSrE00f57R5#+{B+tDU6BS*4wd^tw zRH6+6LWSA{kR5HcL3DGoekr*@5Z3ce$R7u&$cpnp>K_JLCa z7&s2Rv3NJ&DHBNc=;?CpMwD3Cs4EJPrJ1EgPE_ihQj)_8GH<;w7zvBTSlnU*RvQ=?C`|{c&${fC$UW-WZy?vfeT@@z-fZS)pp2K-;lH9;E{|Oo zamkScJphb|q`_?U2G%hivy{fBCO_H0wOoRNC!Iw196T6;vJPheu3=nGNW>wc5G;3` z1a3dS-K<-Lh7nJ=QI~Od9e78;t5moocJT7{VGj-Ooc!eE$gAGe-5m~U3YyDpP;EzQ zpp}b@6+z^VOfRZm0M@9R{s&I5e=hc7%Ms7=dZh!l-HVq54)IQxO5SM(@>UM#{REg- zZX6}JgYhRmxEqLPQsv&N$^KGupkwW9>FqttQtO*pWQcPdvYmGcf1xKDnK$j#FhzzJCx8IBx6ja_^Re|Z5(!M7dmk3HWYV}XQ4 z7!PDK{LTcEJ%jw}qSl6WH2@0WfL zK7?r`_U_&6u9!#-+^ASMczDHJu)&A)Kr~O(zjJeDDC%*A;D~o^ms<9J*g2Xt1d5?S zy$l@)+I+wmU^cLrVXKrHmvB@62~Wm$F0SR!qY=aw7Bs2FS+h7kU7PN^_5{@jxdL@D z5z*m4H2bUG$05$$`J=11%jiGM8ngUblo5D}-h6ckEaZ}FJdt~?nd}Vw3lf+t7Lm(I zq(;<8l@J=m`OHUg;0!PNbVHxzyHt)$s(t0}PlbB{Mk42rj*jjn%0q*lhWN-ZZYdfJ z2bG<#0P2B&5ePWe-j(vw{ZYCf>Q5X7_*}-=@=%<)O0Z+oVqStARQC7hj06u#O5Ti) z4j?S%-o4J{Mf(a;{!7nIg=j*Q(#&hX(xN8Gz0C?kO}$sxQha!CZwHf&4?-m&86>x4 zn_U1@n{aWG(2=cM9h`mk#?|2$a@xL6BwIs&K(--%8I~ym_+Y7U?c2u!&_sDCuF}-8 z&;X8*lYCIZ1FtcL-!1pzyWgO6=-ZFJlzbGP&_>H@5BCYk;Z9R6q_5lgFhg5Nm$=q%bR^G!v#KYnB{EzZ%~RS zc9%;g$!$cbucf7>vhWRZIEk>yZ-GT^c2$V1VPawN1Fr^tL+?lSK!UGi2)B2%S(0rR z&QXH0`OApbdpRWW4Ut#U#?P{v7)*Re#l^)-*ToQtGO~RBq4d7`e(mq~?_OG*0Un>- z_9OW?MFaPL``75Imcm~7294hzySv9P5K%1wFmY4mO6>-&QvK!8IK;ZoSEXH-FtZV1 zCvmGdFF;ULm_&rb1cD=+J@A`iikCw@MTc~j(erldwlEv z>R!|@T{;9E0u^nhOTw}v^hjj*S#`$zc^l3E29#JSh-tj;@w)Z({|Gb;rxxnpz2oNR zUxnSd)qvw7k|S}j;yQyjwOqXW((@4+?}RE?v9bN0xsDs=ZIEXRwJ;oE7?(Pure@46 zbV)xANe2UoK5PADG6mGB=O@+)fX0QqPt2s3k1cqEJaqNgs{eRh_ib8(8=Zh|@YC>2 zWfT>447$i9zt-u-fg%2aFQT>|kYkSoWD4YbMKmu;!woM?a>o z`#&cU5VS|aL2;vDH4$v04{sy#1Bk_8q)T_KbbaY`o|tl_*XLb2oUACQD`l_JLL*butLk zX#Ks_%(zO|;hvs&ioj~Ofq2)6G^2$#+vRTRW+cQ|mqA#(Qw5bjF|Lq&BV2t*8Ka@F z5d164f*!}Xr%wF~W{(e#h0-?d_j;aCZ&j61xk({HCO8i$Vx04n zmLbuNdBBby5`E8Gw*-s9u(! zjgUKj{Pm&C3SmDc)ISKxF0H_ux)Bot7M2!}C<4bKE%JXdmHhg;86txA_QG%WygPS- zgrlx}S5e`|_r2lszBwp^R6YUHkD|6Q`0KHmW zPc>32a7muAPuz_QhJi$T5E%dv?1S+RTJ?iAq}?1ZnOh6EqY|R&(35duy`y>ERm9Pg zFaJjqeKutSo69H;FiP5k$airWnVesK(46{}za1zRjJB|q#*9ubZBVMItKQQFxWay~ z4!zYa^z>MY(4WL~id%KG)h|<5TDN&~C|T)jM*ZpI^J2C9cZO?%f+>=o(*gh*Y;6(G zM&?qYkSE0tQn**6zXNIo>&9l1HO{?ln{k3QRuEa5&@>-@@(f~HK)I0`okgza8ah;n z(8b2t=%U3xNbmjRZ+QGT|99@JqIBWp!J+123Wt9{o1Fr7+nqai$Z>GB?AcCbLO{iq6r&^@T1s2uC#r*5-x8#of8%YxvY?YU5jAVE`%#G_5tA zcL%!?q!$Z1QXuS=<$;VXg~}0t6mKAa%4lKe%q)Tje8~d_dadiMUZK5}-v4fC=@Bf) zwkejE#!PJT^Tq|Bms0D{Pb0{KiHXVB`Dra?h~o8Yu{zKi<$E;(mmyfQF|?^x^#S|@L6b`q&s%Vb_}rpX{G3#`v1 zRJ@RDN}TUm2CfBS*B8AJh53778^Cwm*>v8o)$vDDQzRd8C+rF_EV;Bw$^RiuOv>ef zuV3GHb&;4}f@qdJ0#Z%XlQ?`qFB?v_t;n_Oq(GyCQ-{P}z*x;k$@Sb1TnR!DAzR%H zS~P(F+G|Eb=%XM<#*HGIs(J8a*XSVRf}0?UJ4|Yce*ho2t!%q8G zAC6*B8lSB8^uSJ7lcZBMh4}Z$jNHGhO%8>t(lY8h#6;{sohgk8TQ9zvMZ$G ztI-Bqt9qy#@NtOx1LOzd$HJeuziM?OoEA_R$PIF16LM5uHT>&55v*Y~7A4tu5JBKe z>ozRpQ^9s#4GG9fC7;*xTF}+q+{kAHfD$zgdIM-$sBoG3%;ovi%B_>tK)+3l#>fH9 zxOnC+w*rfnrY72)*=uP?apa;#5(G=m_~77K{TFWQi0{hX{g-KB-HlibREc}|LF14V z0h*Nj&4wsp#a2PG8U#9{l?nP1xG;rF=huVq85SyMHZv2IkO)E%K|=F@v1mJ+ zAQAa5E;q!Q@$3_jhc!~gsWFeu7?Af^VxLV_e|5tZ3?c#?s=W>G8_ z>&|(X^nh_W2#DoY`ch>ua zMzQJT+OWDwuZXd|*BfI87}r6uTC<0GQ)l67;F zzy;xmfOJ-$S(|;E;H#MSHKst(?W>S-1u8sXt{s-QHlY_n#u!eOPv@Hlhleqy@2I~1 z-Hr#UmTt5OpAU-vi&e)gyZ|=|-F|xdg|<(q(x8*VBTJr(fLVc}QL{MxF$h9Xu+q{S z6#q=)&X}!;T#l7VS#3#j)L&u(IB;knysI#>lj_3da4)iPgUbP=iuM4<^5c`1lMCedyco&q5 zaB<=eI-1s;CE$GRVjVPXNNfZP`@Xq3=kuH=+!o}}g_0J9#0B|Vy9MrJx8j{60V^$6 z)zusj6lzKZKn*Bw$%KK}y04&&FLO%iBG!~J1!ofppKv-Y(`(KJRi^aA4;VB;pQg)r zO)#MpTnZY0{5HqBxzE-GZr{1VS3JY-1pZ&vmX323&5qgLbKNCtlm;VACF>2qC${y>9RPhMCy z-xF~sAz>}CPhBX~dKy7M(6Bx=4UMeFa~ID5JBDPH5UW5GSXD!XXi>|6;JAcxL}(Px z4YfF0_AB@9ZNpM2{eIV&Uhl3TM|Byrwnq>}j8?Po>w-=`_L=4`WK!U_^S&t_2af>a z9Zy+kl;nc*8)&?u&fGZ0zMJ&gbX>I|j^V_7)6}1yQruX9LR?4WG=jb|4kLW-F(`GmVDJ=@1msx(WruZVYj1sDx zYMrSK9D*7tP7nxpl*Sx1aQH(S0;&SBbd;Z*U(g^T^<3Yf_FowX=cS3|EUW#M)hjq% z)zp{-*lHtw+o?j=1n0Xne@<{Z8XxF|VbRPz5(rR62rZrF#JtdyZiu}PN{PtD8xOoG zTQB362##ZI%}3(4aqd2S?X52=BC?F4QSjx$gW+{R@L{Igj>KHx0#IC|T@?O!Ul`1q zG>~G{9yoldN5M?IhZY8y^8TgA^=$RJC5yjp$zla0gd8( z|8o7y4ti9LRFn&foPi9qy-hvWqQIVR0uuv*O)t903f-+l81scVm}mZ3s{iA!$li7j)MO2)#B=g}~EkIcx4f)P-hiS(K8++;tyz zbtU_bANKwKV6}_g0w>_V{p7Rc1@&AK{xu|-;*Pag- zKR_fnoOU^Rgz~^+w)(mPRcPhspX_e4Qi3c8!+w_{!4pPNUf$}R$sAMN&F(myp*#XS znirgpI9(2@OY8uE;>4+<0ZT*E6qEeg`?LsvV<{=A+{vQz3fIroFX|Q^Ts!AkuRiyL zkT@V%Ma3TjpPU~$Q~C-a?<;{pX%@ZK`|O;H+pLZ(!?A(7%j zy2r1u_4uP+oseNw+Mdgut@~+V(P-93CGlWW0n6PLev^tP?mX#sf9E__KjZEl13fsM zH2m-BTWYhiT*}_dHH;+fE6?Kiv)6P~Hw{rz0;;bE?9pVEM@$=JPB79&xZqA+R-2XV z;*bXwk-U4)g7*<#YCwoMh(!+`e6uEGgP^V-^x0q+QOJ`Q3c~K2iHBfZ5Y!@I_<|iY^bd~q zQ5U>x{0S+7848ikbDBq2cccMxW|B9pUVb#oiyv*}QMxM~qtV6V4}CjEt03bB@$}$i z+zl|v*d-87o4UEVRcXA4j*3EfyI_hrlLHQ6`;J_bsi8mleNdlT3TzohF3$~|$Dx(U zQAgg>?LMdUu|N&+XvR9HT}JlcjF6#&9&hsxseS7EJoQVxw=k3wRQiJr$<`65eN$Dt zJLiKMqn11g5yZ=dSDC!rWEV)AjM){`FZoyZNuzPM6Wh$Ob|sE?{8jw*V$W5^_mERT zc|a&*B$}%{bZ)$S05A|RH|ZH^8ft@7cC@G{Y%bqJLY7}`zi-QMe`nJp31gjTW*{1T&e%tq*odO;V7XoDXLhk?W z#&`~tu*kngVns40reLax-uG1>eeya4+X8_b&37*?aAI}23Z|-x87xokNH;3oiq**I zu{M?N>r7n8rrwbCrNyX=#||lN32Yf=wKq~>*)JxB8A3G&*=>kb1HzdkpdKhqkiQ}W zUJEEvKyI!Wm?hryxu=-Y=i%`?J8R~x6=co%+&2K4LIJeO)3F=vtts@#IIrn!Gj^?6 z(^L2Qpg1cE=qmRE$H@$ynqU+D$dKgJs&#?eALsVkT? z*WxnKZHeOE7Y`Z;jfWNtF$d+A&uJJUPHAZDkSCQLs%a`YUo|zg%$FM&=dWbHr<_p4 zTPQB?#mz4ZN5#w!?JV zJzT2K`G^UEL^3iI#wiA z^r_I4c8B9Lnn7B1*YlEuX`w&gb^5KGoYi0k3l_g;c8t1Z~;j>@c`<+Mz5o*g*=H7tJUiyVS2l=XDF_7xb?NI8{h!4N(tb=c5C8g-4*()`BMos!-_nyzM+LEIRmQ zo;h?KL}O6a@04oz{BuLfF@!{vBklfa z9<6C|(34Gym0LqA+kQ9}=;Mceq0ZDlA%49+I;8sRxbpRUf4Sk0(yJdUY z;J%x&cjK}&B-c!-X|Wi<-+?~4x%p(R%3#k8%Xp+l^f`P*N0Dw�I0HcB%K_Xd#0T zY;XsP^tXhslfTFTghNZ!gYQFQBStZ8Y2s1(HpKRr@6O{neE>N`5!le6?rd6)$PX}5}9A$;0$S905a8(h1{?Rhw+=~D~0bDe#Dd_-=VjY zIdz%i!FYl#u@=TBPg4o+#@ma>k@fY6MB#|33f>igI;)V z;DUqi>?-{Rp%cSAUckeJT;ydFkZh0C4x*1I^CzHDN`8A@iA*ShWD0Q%4uZe@6D@VZ+tgZfI>FNmNoS-C8*{0i&t)7ylF&uJvnfVk$rx!j;60~v|98VyRKltY;8 zM2?`L{3|zj;>8oZ`pbGjweQlmj%jCnT&BJcyaJRs&I9LQ*E*dRrB}uzM4_h%TCcvN z*~dHC9|of_p62)Ox3&B5BnOp@bR)tBm$+l5JU9en9X7;EYGcOZ{b%j#4m9g$_#Q>uI8hvIzm4e>U&HUx^V!g1uPyAI9$o1TaiC zUtH_9kip~E141D(y9gR`n7QFX|Myi~Kl06IWrwA?x!k^Y(c?)nybn>pUgoT3)##;v z=EGvUofx97c#ft+ohZVv*FNtD`gmUpowf)bsKU1SJ^D&X;tGG9{0K@p zKc+TcbDmGcY112H_iZ~qWu*Ng%J7zP z?Wb4!1~t6ybu{*$_YiIv)`Qp>P!|EyUT{#}B~_ZDDA*r!O*Xw4-G$vv$mD{*@PzBF0NgMCh#Gj#U#M1 z{BhYwkN87;Ps)V2>l`o0KUKC);9Yd0#Or}cF5p^(iJI`x=i2Z=@MqS|kim-*93R5y zA1r`jA%p2Q%>9N+hbTWlzPIllx^Rsv?{g`le3)c3Q)eC}F`yXwlNBW`D_fpD(!|aY z(%jteJ~r*`MMMw+-+`Y8A(3mayNT`(bORS^DV$Ld6y5n^yg;H7pi4!chnx71)MZr= zxaDvYb|Bj2HaYMGTGQ6Q8kzV~!;BFe+fec&couD2yhhbaV7BPex5J{AuE?=(A0PSV zZij!p&Jy?|2}8L7+y{|kujkZ;q{N#gKBtCoXG-WT-rsMao}5f~+3tjRU3xA2jB^^> zg<_}A@P&Naj}DB>XfFn#^N^~rvIZ$DOzWflj%_Ma*J453BiP$E&Gx1-fXd17cgA|u z>?qQ*W>0?X4Ca;sK1Xg0qR6>-9` zaAI!Tg~ZL9HmxWZ$x_@GiD*@1Qh}%OR4l^i26>lFLrIVMhJe>`QNyaIZeATuv)*Os zBnO9$^@+e==exU$JvYS1$KML6U}I&)J?+1Hz30@BmR)E5Iz+!M;ac!LJ9nbH)Q6Ky zhJc~<mT$d3w6}!$#5R!cI=ydSlX*$eyX9po7s}k`XGJwR zXAk~I3jp7h`KWKw7fI20yuP4h9E3FzdQ$Up^vlf63jN2Nm&wiaPyW&jrl;M>tBc*W zvRnkRM#f)vR{i=>D=ba7O1p+$0Ua=Vz$(wtqt`j{77xTD#}l@ZzCg`lwxszU<>8_PDJku zQV{IL4c3FWt%yn#`bvf=4YQ=Z-J}AbtihLn;%xUH`W`L7n|2!6L08kqjurcM>ad3^ zFX`ns6}v^RJJT47fgWT20z^K%6kz}ZBlE)a7XR+uh(rbK zcG{emH(_6std@FHTN_ltBPX4Kz%j|lt&~;b^jKUY_*Ri~tuK!?T|ncT8jU$7&!pp{ zyE%lembE9^aEb5lSihYkD)XW9Vc9m9l3?!DrN`}%GdM83fPT>Nxr>d6QGKEYEP=tO z9k-!Zfm0-TybL}@@IBbWMw41Cv7%p#hB=nO0Jk14Nu+~DWMet7lCKLFFI+VK+2P^~ zhj|4)9c+Qiq#BJIj4$l(O9AAgfzVq0hRo~2hN?+Jug0JCr?n2f$Z^^xr$0 zr-m?PhKLa0ov})d*+hTczvtjFM2KLzK!BZCHHgk<0-Jw4ZoA}G|Lc+z7V}#jb&vu3 z&c1ziu3Jikfhw=#@TeE@(EZI*iEsf-gEg7;cW)g;5HKB=1f)LMBQopcWv*zTPe!pS zl)>$@UorMa;p4|4%3Y6k?9YBya&uGEEq`E{+aX~|JDu_Qv4Qebu+fbXRH}apJYge@ z<@s^1&B%A^YVL+~jr~j7BQ8be9_KxZBkyh~$n|ScdK@Aq|76d!=1j^@k4C!#*mamC zik2Kg-MiTt?32A_8&;Fl<8qNZd>Xg$!pcTna6A!n7mAS0LBB6aA@e~~^FAweQ>-YP z?=S}s4q&|NTM@O?&&_nizWjXG?&;t{C~@`xb&KW)uyp+qpQf2UOxpT5guAF~Ezh)* z%ZGLHpaG38eWyVQZXTNQgT6@N4|<{Dc$zJ-{-JKac}Vv-Jj}g|4aRb*_g+Kpbz;3d zF(`u9VL5a6!6;3dX59wr>;+?g^Iy_;mEI{o%Z=3E-7EUNeoL*=nW_i=TC!c?YAnI= z#~ywNCRGmxXF((dRH9MtCbbRcxQwKa6N$JXwh02pgZUwB8C(JZ*t4##Gj^`3X3H~~ z^auEM-U^-!xbb|upWn#Pli~r(1UwpoHlcNW?6>p1oSYMdiC9OYEd~}4`6Q#IegVo; z94Zi!$h$!Fi>o1QP9Mh(z{LF0!&@28WX2|@EL~-k>It#2{0|Cn>L#C4QP*QFl?QHz zwxVBoW%<0U_xwxqJ^1VK5bnj2Z%d3hpR+qg*}C41x~SS1VeBc+Hpsmt*B0*ieBmH# z{0475hdjM$U7F#|Oa1rn?-65FNg50ES^MSj*_fD^zX{^byHDPk(?7pYoyB{r)FnF9 zsyK&<`Pc`^!{~0G88=4TzLlb{LEQl7pmua6%n;_IFqrfPa?05FJow~nQ^BXoyVX^w zcV@0kgaOC4Y}j)8Ds<{Ev(oJh4)01}lUXP(@I^I-<_#NKoBcr1U=a5~rY##c_BN_F zuGH18yL|*E$|ni{S?$E)Ox5q7#yhXGEQeJopEU?5EN=S%fe@Jt2|=wc-4m}RIKmXK zdZA~;kuN{s-;FG!n30_I%2aQ<^Ykt3cxL=M58Nn9*c!ePaBiUC)4=+H4|vgc`0gBl z$siM^+6@w;)OcHP@1PnGNJ{eu;K z?|AUS01<_u>CtNMfbds5;f5&y-)(+xYg*HOh2R^4;l($M%*U#BOic0H6%xr1_AB{# z-J6=1!_r>hair!aWS=~F8Ns8x;F+LR9-i z{eFd(&0r%1P4id%WWZECE=5Fofn>O+Ewy#?^z!RiX>2rAXuaPa#Hy=4+=Pv%UF0H& zq&&H~`@xE#{=`3e zY;fx5uS=~twi^aK?Q(Rf^vAzwTVM4!$x_E~WPXAQX#mflrTRHDlL7-C3|hy5s(5)7 zpB6OOZYQv><-k#QlXtjLuHeh*?w7HYWogJ%eHN=%+Ff68{nR)UATdmzQA|EA@JU<9 zMO(mI=j@B=3xh*LI0&KD585?K*mVmXknpmNWKQScH*E!ezHdCYeZYJNJdEa?|b zu>UD%pZdTm|ME-43XNbk;PWJ%d00_=^txZ=!Gn zcP=?gaA;?m(xjhGvra_KR^YYekeiyu(V!_=B^Dan#Dq!G5Dq?_@;D5;zyZ#Fk@C1oE4(cINV_^mll3Fg?Q~vX~&<2ruIW@JnGX_5dJ{w=a0Oh8c zJ>c-3cPd~1^;*U`o+|R8UV@EfW*Zs5>oAyiOU18Ii?gUpNGISb=Q)99sq2AkRl@J}b%|Mwg809t0HNzmO3>(f#u({O;dIU5f1D zH!n8s%IW9baW5+T*XTry+u3#p6UqQ!QLSCPrvO$%Lq$csbu_TcVZ-RH?(u>42hul_ zPT!4I`n4t9%Vd*nZ$xgyB)6UNh;Gf)$skP&yHrn^!2>r66Xpe6akbs8HRPL_l-bl| zo6I+liRut~i&(2+pp`4JGLjk3ba=`mI_TjKZ0XeEIHES3l3p9S~;V`QHA40@fRYde9z6O@BK;x|sV0$j-yJ|9ivR zSd(}fbUkY3Bz>nr#eXu1@z~8%YpxGwy{DbJ!?*ef?gzv$A&^<^eRtwv&j1imuMjXp z;`Fg^UXLBxw5d!x=!x@Xra{Ap+Y%BG< zG+8Ge;nLotV8)g8e#|qo4gAwTs6HXu=uhRfMPtrc9a-gHFU!%R{k|)aB$@*VE%|$u)2b-n zO5qPOLr!>w{jipzSe1cC!{&1duSHg{SJ z$g#D1b)(D3>ziDC$JJ&1gSFpg zRQL62oTWF*{M5g$u zjKRsK*n_w|)%My1(S+Ak1{yxu8KLWEcEbU5_{NO~gyq()`KYO6%q{L1?pp|?eWiGjj2yXz+D3qZEo+$L-iv*~b(UCKTo1zygSvy;Djf2* zM>;-RZ#`eEA99ZJ&zZgNVWGbCt~>GaZ&m676O6h8Ep$}a)xP72A28DP-gT@5wr89E zPIo`56`9jlTBzJS(q(+kWOf6SPaN8#UAH51akAb5lnB%#(6C;`mc)c^{Mkw~74El? z*D=~DHF$1q;P!il>*0mzHY|+jb1Hb>*tkA>>-y5@@bjL%-#+U`e@_(lSf zmC8`RU=x8SQ2|*zj}_OW$-EAJ=MvKNVOqjy7;YdmRSP9BeS;QzJXZho``64H1_R4_ zV8h$y_gY0stqA2$0G958%3HQSAiP4h-&;*GY6}H#dT2l1QJKiK^!NY|kR45L>Ysj< zHNu^bAYJgX(1{p>$wXeQKI>QcP&QKAp%R$=mJ$wHv~r5X^Z}%ml-!I}wHBJfcFxV4 zk#XmKRDtbJX>xFO!MmZ`@9Iwov5B`9ZcChhZc7U@R9R&~Q;9x8z$A!^iUa^?=h|%~ znKnd&=a3gV-90|@|M+_Ec&__4Y`la-86`9%Dl02Rlu;r@ls&UY$j-#2KD>5Rx z>`iD<5?Ps*1|eBl&+%5*bH9GiAHVz6AKlk=rSJFid5`lvj^jLzK=jKHLZU7RtTw5F zKr7d*ju!mt$t*`=`1jhiD4N|20& zo!J*!a+9o9GOPLWCRI9pBkGGIc>}(X8^@xdTv@I-6Mnst4wb z(<5(zwZ8Mz2ieQDD^U_JSH-(K{JrS^aWF#p+zZi_l{arP0q-UJ-p~ZJ^~@NVA$2R* zK)7hE1D70MO&%s<^C45}zMr zwu?`pNFFj6mgsgU{3@mqc4;b?VD2~xNRJCo@d1oH-kQRRkLrgUnJ`$8K2q-E3asoh zR!5|<-=?-dcEo)fWFiO|HGqQXNkEkkki<1ya!DKgPge01qGE&3D2-p&`yX8IeW|*dzMaD|T1Lp`itA6?)ISYXRZ2Vn* zdO$dhUqB+D!N4z=!rpEw{L7m|#dMK8;U{OBxqRRpgmd|JR;kF(GvFznE?}Yk^l6#c zFpN0V%gc{>Co!Cd9p*}CwlLwKkmZOz;Rx#Be{8S`wb$$yGN1}wAg)l!PbEAW{jjMb zv%xn|IN&lR8VE8Vn2Wy>su_vlxerm%{>u-$f9uU@nR?Bs>kgGNo#&#y)C2wgx-MTM8z;%Dbnx zdBz^XH1RUr#w`w@yvY9Q(T9l(v~Si(3!n4J!?o;Cwn^ZN{mFt4a0Enk9-S zl#mk1X;!>{ivXYpB5Qa2kjcf^6Qi7ns3=z_pV&690}?5Lra-3{Wam$5Yhpwj2Q|)j zaHJt6Z;t1Wx|hNN;(1-k*y%52M%iB-eb9LOIvhwmmcEp5B@sC}gqB8@6T~8)jc&Xb zeADlQE){xQ=oYH2o|rb?7b9c}<`k2>x46Y`n7S953pxq)5~aoW4X91Jhn`(CH!(T% z`@T&g?>>xakntN_(#;+h7z?|?0SjTz2_1~BwQmuuF zy5jr*Yh@LZcIpTaZ~vhSeKdTi9g_V6Zty^f*Jm8>T|YXiT}8N zXmUSEahxg31y)zLozC3cfZRn`H1h^=foA} zxTDp-gneZ1l4IJ$uB(Mi2f6zvKRXIPO`c;~REcbzwGY|oxvtGGr{t7b1E-sGt4T#z zBKjVJ?P7Q#^oQj-1_q+IMt9VCnUe-phyuh3Q0dn2%R&D}U>dzHEMzh;N8H@UOM4gS z2}+HH5#;|T)qgot#=JRE0iDr>(@A|@jo$Sh z8>T=QYxU^gY=!!z^KX8uJLCbm{MbFl=TP`K&z>y|^qb)LMAv!u-1e;68RGqeH6 z)piyd`wia&NWy(E;>2cUbh{8Ope{=4ET+Cd=oQ8Qh`W!MLO=x1VhBOBrn5P(omNrP zgy}IlLdO!Y=`O3hb5$FMsuR>_@^3+i^iEIs_k^hNy*JYfZ~%d6E=bFb*6)hpL5g}J z$9+T}Q(jc>>zX}Pz?#4|Z#d((<|fpxuC9AQMG$G7+_6Jtki?<)Lv9WbjSEKE4XN>d zp;+B!t?61&v)n45682eIj*x+-qY8)1@v*l!`z{{rDcOAGhc_WG4smX8w5{i zEqjfut$n0T6P@_O{RS~T#nGoTG$!1f*l6X{p5Q(Vkau$Ng$1p0^LwlzqJaYu zhy%C*xHy^6!{=4l&5A<#zGHcVsX>L zG0Zv9a3TY^GU+2s_2}>*vh>^|6qr;3Xh2f{9fD>XhQG{<^;7v6A1vUzbJd?O)%>E9B(oXXeF=Od{63K>( zsAJ{Y{0)zbvc4S2P8d%S;TW9*GDk+c(O5r2zcY@mxWgV31fj$x9ajy^oJ!LtIlpYc z_C+sRg)gb)Sc)-I@Iw&mRO8Roa+U0>X#liCW=>F4;Qk8wIH~CxJ9iUR9x$uy%0>Nm zKjDK6gtfQAmoqR9nl6H$K|zNEBzf~2m)6`obGjC$9ng#l z#XZ8e!v_p%v>Kcmb&|+IqeHH{VdWQoHf-|X8c;)!ZpYkQYl8x)xX2T<;#z;x?Jx`U zF!XN+2L`=5FJrjsa%V^@_r2=`CXxKo<-3F#X_93C0p>yXVS<%xwEuw7J=8Pc5A4!n z6^I3%=-$29Dwtl8*6ON&O$wnuQ3K%uXtW<+_ZgGQUw{07wF^J~MNNTOQgIX2|J9oA zw($Ue4vr0)5cRqK8P&Jqf#;LPrg>Nbr9?zT_^w4dz`PMFu~;h(%-Mw?t@$F8#fm$_ zk!`-8yx+g|99z&iEz|Cxse5a$)6n-G9ih?4iVK9 zJZI3-=Gpw=17Jn{Dv$V?_4S!}9-Iv(E{6~e!M)}1w(|#Q&!S(CTu4 za~x;TZo}Qd|LtfrLpcJw4Q6$k9K^SI{ZFxo#;Fbn_c#WzL+PkvPA2l|zO>!5<*udH zV|sRe+fkht&TqIUzL|gM?Y)kjh&9726y*WQDKtk^C>YY`oZj%jOzR^4C9&j(M|XO` zM@+#1aTxBcG&bP8&qF9>GHYjOX!!h+Tm--jiigdQu#5f6jD)d^%e@PeV&4pDSnycL z`0{)ag)EJfXL@?~zS|cT6yS)4diD50{Qao0 z_sZS7EHA2ya$KH#bcoC-I9u3-ez7k3Hl+8ccw@?QUW)o}iq1NN>l~vblmZ(kG}I@a zG>jFprsSviW+4WOaWz_1?Z;xzJu`(fjt^a93)UE9~X5?U%Ys-00TUR@vsi>|~O&7zuhE zIr_}7VZ=Sqlnpfcqn;_8BEXP=%4y{;%K?~P~<_68{!(jf4zzk^moA z{NPyj2Rby|5G0{;e!+4m+4oBr7ix1ndpOy>fKcfBTeF3fA!pp>;E-=+@JmOezc-uP zXqTOwyz8rT*N8hX(ACUVt%wf=3-zj;yWVG}9rYrSB*A?rcdm81*Z(?N0dmae=WDsE zTXMQ0c#JR+h}#Lhr5#iQpR7nrRrAHePu`_{yPICzqyk+WC8}Cf+PB;x@_@FsP4&6Y zjB42$QpK4@-3a@^U+qwMIFKO40oQif#jq`z06 zV`pQd>5OZ%qVwwhJ#(h=t61!}>rK&%xqz(2abz%Za4m^R8L34&*S zZCuy)|5ezwcF8Ws9ONnRi1nNR^@T+P%U4Z14cFM{*Pu91OWW9_C4Iy@U_cd$m6kjj zq|50plTc5Mch^e$kgmacpXsXJXvM4O?$NGonclk*7EV=p0wjRZCRJ0)=Fw%_#IL|l zwg(|WL;2m$x-eF#!rnQgaCkwZ3jsbk8ZL;c$tzsf%(vtZ1$I94t8OW}l1pJ?UQu4& zNyt$7u0S;@fKUto{b^cgIx7x^1t4jch(ve{Azp@ky9BgvZ5eujh(V;x@vdsS8^@aE|XppnwtNfO*30|3pQ`jLSX@B(gw zywA*dc!y}#D0fhW_dViXo;AE{iL`j=p3pwx>Oa=m`1{C79rmEaV=sNL#a}nh=yZ9M z$O~=@4{6PFPet=Hcn~@k;q_n9l;HVbLCUcZg)4E=gt2^L1lJyCt~ST}IcEG2+Pj@9 zF}_^O^i(=+FlDci&vY@0)J=`*`y*xC6Z!y+c)zyI=a1`uD0B@6mR33aGaqCkPyi|i zFj|Wit0wRI{>jCbQ^B1dbX;TU;Aue#sj7g$ou_jUK49de<1BreuUPiOcb=BHMK%@D z(r%RuV&YNp>Rq<^TtFsFUNZ}*Zl;;HYALesw`DeF7TdRPI~P~LW8aw9( z?UUYMt8elqI$TQ7OupNh{bq=+(+HyOw}Z%cJ%svmTAj6|rIFcj;K6UeZ4wYAwPhP$ z$NW{@W4nEm?r3??_D6Zoej(Y3kS76t<9AVxp>-TsNKM$9pPl{X0Ba2VcU?xs`M{=9 zqM>LwA@{!Qn$loI-9QTbZdS=RYnla)xDy8%olkCLu!rrqfNJOH^g{^DVJ8KY8Ce0F zF_^Y++??)@VCwA{OlcA)FcR6jJ9L>#RFkgdSpkt1P!8N{$2ujq!XevY1h*wlJJh3f z!WiKH6xOG5>}i!T->vil&F-^J!g}N0J9|rQ6S6OIy62bT*+QKR-^1?9gE(+P3*g4a zjhBbk5zJhj$h4Cmapgl&a**`OnrQbWo1ozPWWQ|~!kGk=CSvBh$)oe^X*X_$>TKJx zWkY!Mm$1aNXVk_OKId3hgazap@<%8T8GBjlv9@zf%jonDcxZ{Kox_{}Il5WJ zwNTC@)C#3Nr_G0DJ!FRGyHgCU@;B9GJAu~Wzv7Ft8XSBr+>?IvLOevDWyb^6af(9* zCbBk=(7ny#9zVOQ0f>h{kb^tcE|8B3B@7{1Fm}JrySp{|96tWFzaL-mc<^akMVghh zBDdV--utP39*9UDNck+!w4Hs6l#W6(ggclRxdx5RBbRHJh|6RUV^+`=Hl@1TV2!xp zkWdd%=dw_lcyr5LN&0x!H^x_n1K9UIwWK|}%lHD{fiocZG1zd}7^wX|91o@(Uw7ibfmi>tSe}>osW$g#yX4$m^0q8Zx$^Zn>8jlr4!*Gd5Sj z*8m6#470Bjq-1!`d&5uJ@U(|*ljUwdSj6o+(GeYoK9&yGw8jwJQBWA8Y36k>7#Y$O zGScIBxF32O{a*XX6kh{15>N>xhJnRO#0}+|)&}2LFNliG6m?p92$y%%k5#a^M~;{Q zTLI)bH~%gIHD0P$pN5~3&ux*_I}ICp;-!eQX==FRA@A-tpqiW@o+WwSNlEg` zY9F$Ct;f4}G#FMc-Fc7{wUg27@Qc|C`X34*a>K0KJHw%!AQZtEW?jMLmdM%-?_L(; zN#F9cEH1J!-8!ae9th?m{V{P<-^O@ZF!C0J;9E#UyzbqNDlepAQd4?b&$Jz<50)S} zWwKJBa=*X`V4VAZ6$sWnYGBlidG0}s$4i}jVq#T!PH<}+QrU7pI6B2Fj{kSHhW^;? zrFUvS1_gX(Qk8Se2c`{d$ErtPVOr_VwUgiati(_KF^g3yb#*&M6#c}`2x!F&G}6wP zC{XC~#n3ta5`=}`H?XC_aL=;vbD#Md*)P8qQki$v?Y#JwPN`}2`yz6Vi9#p%S089G z0%bMd$b^rlYHHXipJvSgTj;|>Y4L^Neew8R+zr>ECWLrKODU%PeHYEd^d#7n%=zoV zg&^s)gaXsL_4BRSewP3dXvt$-?=Z}s|5Nn}Yppty{zx!1fPF({uX-SZpK*{)aYW)d zr@dQvPX{nW6wl|Dg3^U#8>i03)Jqj!ll+AEfXfla)^YwU!k^R?%pg=}4@yhD>!%Jz zj>;xedOK1^+oX)bWc&GrO-{*f1wHcrz8m%=s!4SFyGFu1MeR9O>v6ZKqL z^(XUn1@Nc<4r(P!a}p$vlMe#1A&9ukKH=m`+dG9(_RVHQbadpc;KZ8 z#~aKHk;MuqtlRmx;HC+>I5mHRT-!JE6HEe)1*p*>f$elaV3vo6$008peP8|dyYH2E zw(l8#tb?%jpOx^6ke`!NP|K;l{LYm*LtVUb)aAovF71fupOIEQOh&7UL%VGE=*YT* z@dKoZgNsZNFx&6lw~rEzdC)mvUXq;3{mU9Y^yKTMd}f^RRCGowPcfqJiK4vEJrh|u zzY9jO4Xu(en29O;dCu0*xY12@6XqhY-s#hom6f5b=d*H>kxF&F2gLz#21VbTx5rfD zGcfjUPt{N&l3)}a6x+ZmnjZ4k5F`gcl}%S;Fz@=u*Q7A>1k~_CO&l6D_+_pzVu(s( z1H_O>WisnO3f$xt{(-0(J|420v2NjTe?vi4lHNUc6J^}6O2`5-M1^L zeNRXTmp-$Yt})DZ6;^YoPtwf{UD19?-{w)-D}3H}=8D$mlm*?VXP5v)$fXx$a=VV3 z4^4WJiP5{3BokVp3+Fw2W|^^c8_?`ylz5=&J-?4PX;v``)-=COA~XxXhw#x+|1mu&gI=9?0``hM_0tj%|CV}!nTr0VL z3tmF(yH1Ne@SX6KLct33E3mfz0xTG6`){Cm-*?w%KmD%OxNnLe-r4bV@yjUNL;dc? zzR4Awcv0XZQ4IxR*a3Gd*n|%(nKF%v!%=|tF`M;+ZlgjqH3#UiX30dVF9DMuN8FW- zI6~i+-!P7dHX1y&+u@Ce+Hct0!cW$uHh3L|Ueup9V&WX-J6a%&lZiN5f2>u2mlKXq zSbt325LHjBHY{CAp;#*42RclDC<)fWc*?|`cmMXxzq(-Dd{z^THTCC6fteZu*ENu5 zh-tR5h7&x^n&TEtmxs;?k(G?&1IJ3v2nH}9&OzUFtaB32(o#=v8R-p4#E%9HhV0nm zr6fMmQtx=_Jr)I&DT$Y=f-hgjwA3qK!%IK)z+K>aAJi6M5jJ|A%ucVs%qMvEsO%4oI|NC&J~ZK-u*`bA96|* z@p~~k9kxy5F)VMHxF68bz^O#v(t5{5p`8niUc<6NC@$gbQ)+((anlZ5H zC|w@n%5AfkHy8cCV%2*Q_hyP+mM$ql9Dzz6^Yl9Abrzz0F7XB>=lDuWON(2-!bHHc zyr)AZDMuvs$K&FrOC)LyscLBKc9J|h=8o|-4X*sGI|=kCfainb;8LJ$ zQgFxQS;X*rL+5zczpBW9g>O@U!-#GhR~JsTqRZv~V0kbl`wvZfm5+H!>7t}PmUusno9k)Eb77ii|VQs$AB8$u{D3bbZzzCWLq(4&t5;0aMY61tO1ka=P)DLgn^)$}KlqY~MhK9k7P! zK5xL(y{11Xl3j&`?~mcnQD5OoGw0{!?fdib?c1sa4@=AB4Bquye0U`l-AkqW>Rye` zRaIU1I@!NND zYQ4}|?6jn^(U1K=n%>z1YnabkNo~z<__DsG80C`T8Ip7v#8~vvLGNI&DN$+G*io&Y^y7{K3|LU0{q85EUbvk@d7xueVdg9MR2r_Cb!ORpmtTv$V{n`@sVIdZ z84578n^k>LLZd{{lx$>r-_h&pQ(>ia>4|BTx!v7ac<$hmZqv5DOLp=zs5W!_bS=c+ z{;PkBRZ z@;e-i0a_Fxt$RY)ZP2=d<3|AQT!(k!?J=WA?|)369D z*1;MGUxx`MAQ5&?)k@)wQD^@K6-^kK zojn|uagv8#ceoIpTXT^~0){>sgt83^>9Jr|#tEyFkOI(#D>-*&I6PIVRe@@Y>+hAt zm3;m~L=snwy&Cgtsv}2sbiZzUa1O>sz^mHfo`OSfqrL0W;__@6u8hm{>@^q=sO^3= z`vOms$hpZVF-Gj3bh2Vl!ZF1Q)kpDLgs=Y9qu+RX&}Rk)bC@J48z`{WXI@87A6ow# zBVPY6TZosh5xNR5HL}yeZElGK4So2K`c(?*L{#^1$;(mwwQlWNT&^$L zz54P!&Df5%{Vjo&c8~Jsw#YPXrn}iuGzwq0Fyh4m&X6S6CDQhw|EeJ}SC`L9U>IGE z8cc(t(FBq9D>Ku+pfs`EV@Q$^r$7{r+;?j;97+jZ7P01i`*xqb(o5z1{<^r9|)7&v}h+j@D^{GIScH_M-g$CYD|y4*9Gr;N@a48R26WTqv4F$ii> zg|tHWhpa69Na9i8>dQ}W)Ef2rpS&1DjyHZ=7DSCq3xx|O*|_uVV{xkBk)zp9zLO${ zZxG7x?s9LPW^ptN0nKOL8xF~RS{9#@An04}gs-(|;Mw{nP2`%kP{BQpmfgRf_D|dK zJ6EY!hSX8v5Tbl0wklge4LXR(!@_J>zM#?ej{y@~k^Qk1T68zNXdw{GgWYSAA0#_0 zGfZOt;@lz3NPMpPvca`LwrTU`C)FoJE;UZD3@x&($4!62BlIkYCNR-o2DP-gjyf zafwC5VOclTDuX(TktSwkHO2@mkK zh^s$JfG44@1h~Ct-@YJ-8X$8AxRDnafxl$7`g1o++hfq90Xb-v_agy zv|~{sj7ebXm_S(cE%$&r!8I+av@kE>Y>cAqdbn4xrlWnf3AHN@UCUL**0=AKje2`| z-9SDPtc9S_+TCdd5BdMKQZ?PRvyC_(mff81+~L(vh+gyWVIZ1p>uA{oJs9C)foL=W z#0wfGw9k{L*J)R&WvxhVcRyq@rDn=W6`w(0hrbUstIg{Bw->RhsIMCzRXTAWg|9yJuK{Tw7>Nt z!`AsDbqvh*xFcq>iLlPWK}g)8`$~4jA6j^_ta_D4CLuLF*x9#kg*b{#Fh4CtaMQn0 zmixTlhlh~?P(V9|K=(s5H(x*9*TrGI=TZDfw%_D#q0^r<5oP>*>^)$@B*ptmr3C8uz;O8bdio=7V3o(vWH&_bP|WKZB%iM!m)VRKPMx85;do z1-+%3%nLs~Dr<3n;H+tA-7*V5@`ezuT#9Qo0U0$Ecg(tG7ZxuZaC_Pmt(z&KA9RZ) zD1~arQ0KG~O?d_B+Je_@vC!EwV-ub)&z}IVFqoVUhjycvLrV{CQNbQepIqk8`p4AW zSihHf@oHjD3S+EV5|shC;Z^hIHbQ^WBLX-jvmKghXwb~ zIkZ8TEX75s;p|+3GZ3;r0?K}x%VLUwqX{knV)yFGU;FuNrAHd?pZSS5#Wi8*k8oX8 z!vw!+qaX9`K2K2O%@lVa3{C86mTQJw9P+qJuRhCx{hN-~WqKJG7k44xrYpObubr(e zxHMEvJ9YSQcwB*`=wU^LAGNon>?zTv{;n4)+#DD?shn+e9Aj7-V^|IxoB#8nvYs^d z14FV)l717>z0bYAp1I;WH)a1!Law0nKP^B*!yxemKk4^tL)kyYTc|N)i6}nSDr=vL zf3sSS#(lI$&_=QDb_@}DaEIP`?Kw7*^v=7Wu<%vqYibwtDG%BHDcd7<;w>b8{SWo9 zv`T|Y(duB@7!C?p!{XP!IX)PsVfYcW+O`|X5U8l|hbqsVa9se`w;cO|Nid$!N8#;j zAGe?2TL`y`YW_jS^8y;5S?<%x(tBDX*R&=&el z!!+wkB6Ne$54hakiX#Z{Rv-51N<}oNmTzI9%JPw<7Gj`0;DrUnnAa^{0O`*CN@>UQ ziYb@=w6(SZQY9Vz`g~bfTcg64Q)0~=zmI{40LB_$p1M<;-JP&QfFG0BR1X#CB`B4) zpkESS{NlJsy|(tuWBC?RLGcO;H@xwi+B^S=N49$TO)X4y&D3%%G8ROT04@9oglrr~ zSGv>s@2O3u#S4^%;cQYRa`h~C={@eKf5de_?Ud9Prn zV2@w~f<&!5;7=>eHD({*KCe;~P#^y-c@?XdU)rniMk``01R}K-!nZmRZ)DL`7@kCX09*IFpw?L9a`_`KWCsfx^>-oxX9#UvTQk$wg>sF#7%*S z7P=1p0mz5JI%Leks|PnNDhHwp18wrIO3s#NqwcZCGrKNyMQ6k2Kd+UVUx~ zpE1jJ;yzvh{t5B@UqSSm$k)P?RDA}ef{JYm4jWLr@G*pny?fN`r)$C$u3XzTm%YjJ zwrzfu@dm}S{=>1~Gz>cKEonrg`yq)^x#zX!;)Q!J-j_vbPQHJCLjAVtyV!F&9`C-n zr`~oi9HcI^Unzb}z>2A4=-AoyR}{=x+v`oD8`;)c?J;>(FCM;fOQ8MQs8*}q*Jkdu z)6+Gwd>3|oq%+LyKG~Z2UHnb?foY|Z1HImHLvvA`LjdHg8p?}`&Wt;LiTmx~*j*sW z+GE0R+J_n%F%a~Hv};yij&lWP(DcS2Sgd1!X0Xe#vJQ4PBC@h?O5SvKZiYf=B@$=x z0z1lcAMF;|yEhQ!Afwz?(T^{0%7e+=MC@G1!HV8|ZzxwFU=ZCBnm9S>24jtCxM;(M#IdgF&6^`ak(h(f&l%{U!dO_ZT5mlHk~VV(Bf&q_ z41O2=jcKN|a_-d$r(;V8+hY$}NdHH8|Q=P5}gu*@8LUdF1{=tZd zjX>PVJQa$#&-1JPfO{l<;6g&GIXz!OFfaix)jqVVQ`#xe4gC!TfAN{zD2`Sw~`S~(Y&Uj|2MPoF-G93Qv# zKgx=!Kth5@M4;YP!a{QfO-NVg=>LYfKh0x#soNk0{1-m>*AWprJesT0v&E#O*2>Y~ zm=maX-guH?zB-z>1R_3!$phnw8`Rd;h6y>HQrZ#0k57v0bCciLFXb-I3|=Q;jR*W3Fp;JZ`RWZ#ESX zXAG-zg3*MLQIEky##-?_0$*U{Ey(O}? zb~8^EM_EWBu`*{gYi^`ofi6k14pA`Mk+p!j){5@1eRy)pV`>3C7f1hq;tmS$QmSdI zS7&SYh;3d6mh9@6weWMQU)ax4`#x%&e@pb4#gc`x6S1jjJjv11V)KnLyQaVR3WRsP z>wPW#ZRGoRuOA`y{{Bk_Q(f0=UzF$MT!07)vrJ9_ ztao+GmMs{0&2V1c&-{XdRGdMr-#;)me96hr%L~|R-E@fSrc(g}3*(BO?qd*;V^JaC zhPF@TrZ;AYp%!M(I&TM6`_A=ipev|V{@x9x9{w>C8{2cq{a!e7F`Nf5gAEV-yh?x9 zC=dWS0hWUn>|It44B^qZ*(=)q4PNBfl*1lUO zk<};(4Hy;~a(n8F`wLc7f)U~p5Lk=o2MniqA83Oni8mQl!BaN4+tbU@*u|{yAL9;1 z!FPzpG&X3{K+$g*k!}%$I1-^y-0dovhPR*GCR%!MHo>j0Q8)V&FW$lCme!(_B0V!a zAw2Q1U%%v_9OF@L{^x7+^XE_0w*~EQ)l96(ye93X8omQfpxW_jbHrnqom5|kBwo5i zg@%EwEZ~Q_`ucDNfEo<*jKRLtKR!9xH_a}mQ%UFv6~Z4Hs~-!H-e1^R42~3Ng0Eb- zu;R8u_`$kUM_yZTlk7#gE4BBo6^mj4FN?uzI)_8;wvMHwX`|Na{`e8CBq9pDW}(UGIrXmN-enlMWpicBveD?KWt(D3b5ADs}V; z)qjzrE_)GIeD2$N(3MWmYFG1rJWA}Q@#HRDzPuWE*}I|r#c3|~Nm6ih^cM7^i>pCeF}@oz zWCoGr;6M+0A6cfLl1$j@`)!3|LvUswxBS*Evpo)}Vmk&02XTK~(B!Yfkmw9s`U*NC z8`R_{!GVqof0hGl_<;5Z)NgvW!Qk(*1DbG{=KQNp*MsnPiy08#D=JEnslEIqcI-HE zEO~>IEtVl()t1FZMTfG*ZQ3tk5ET{jkYyGXLZDof&-``+$s?sAvF` zc0s|x1BhLGcHMv8ylkTB;7mV*{}qn;zSYb5VPxhR=i++#n_)HFBs?et@FhuvyK!u% zW4;GtU(@g3``ChWJCmltJmao&6tiRPyIxnP5Ce-suA4OQTNs*bfAZwXgWoE~a>~Tn zl(FXDb+OFL2VhvfO(NJ-qKncIhE&wxdmh}8%ufA z>JJ$8D4LmZ;YdWVMtb@{vW~ik$9_}?2)L~O^Kq{T;5oqOl$4Y?C5LE-W5{{I!-H$E z%2eHOZQ>Qi0O5)mie;a`%7v~N?2g!(ucJ}Hm z4&_<7*r$Si=o7wm$+I(8y1F-*@|-<;7FMVXP*RcncsV(_t3um|Jtf9{;N}6J^pTR* z_wPwSDy|=~skRWDZkSsdmJv67@>AQuAPlb!p?WJ3VsuA+(0US+jv%@Q>sr4-7mPqv z%lMx(X0wKM(!lJ^FT7e5=1VQEh< zzkTDyUy(S1u*6M&d%3G2kI}|ZB_lmO?_;0gRXj~-yOY&z_Bc2@BLt*PLIXME+i|xN zQhF~XWl=NWSjeO>%&wn&sR1>?)eiQ%?U`p-+NHguPbPi^(2m1NJbpQu^4uF0ejRP? zx45+Nt#F9Tao@hkND*v$h$i>EMmAzkuhg002qIPa%!s3Z*mapdG=RX#C{zE)NceTx zMK=G%iTIJ83n$t$O6?c7zO)d0;54OYt^&rgqkU5qiLjQDxvA;OJL=lYnt9c~Wx@eC5YTXDlxr8&j|8ECA;c*tVXz@+m7jE^ zA6hm!nnCTqTz?XQm@4AfmH42=b%p{IU9Ty0yXtAoTsNO{YUc$tdKqA>2ap_wY%ZeZ z>d~QF8-51Hu2(UKrYeR{yBiw!XGopGp*+CMm)i6k`s{uLonZ*Ue8&mJM7ZFK-dl@w z6EuK|PEI0=;~Yy&{r&wgMFpt?hO{Vq^1yKRdUmh(?L;2W@{%4aFyy;_abluNb|#&5JBt zO3om+G;)5$48&YQ?+d<%fZM>6V7hY{)!K_~d+<2PYW0q*%F@%i-;4XH@XEHaD-0+GE0}<%QLPz*m=IpAQUbxN!*Sla^voC5mG9 zsQD_prWW!2#|kKQ#&<5)$H2oF<#c&g84ku=%Fh>jXt|?{auN*m4W(q5lg5P~<>^zx z;XoRHED*#m_xrT?{rR0XUjK54HnU1Q%eaz0M1J7LZb7K^k#(V{tJ}^}SPkJj@zlq) zSv@eog)0J|8zuU%g#OA3OhpEs;0{zuHgns(L7qt#NggO@@t21=<9Y?0Us1DlRIu%%nqt9|O8kwr$%A*dj4tsg$NHohgLjQcZqK zL3e+Ee@LIZw8%hFN<7H%LLjW}FM9_zgDzQp4T4K|Hz=-jz*^>nDK!3S`VR*`0i;5= z7+@&m|7x8hP7_cs^${rUZAnB3;*mxAotR*^2d_>VfE#d^dQwl9c!dMOoQS2o8yTrL z$eZk~)T(c6j3BB@x#BlQ#Hb2Ld4zjaq{Fz zJUu$D?oeoSI8oPQP8Wnt&a~52nAaW2)ZQT?!U(l&jD25eX({65NFUPH#+|_?$p=Fy zA}&CwguEPFw5bb}YR?$(vDen-Ocf#ZXm#?P$O<>q;v{`VJ?-4R^;C8fkai+DG3fH; zE`jox$JNyTwg4AWT;ymTKaM#15Q1f)&wlv@1;KdM*ntUI$1dn#4<)qPlA{MRlCJt~ z@kr(cwMeS)=;+cRo*NW*i+yHAarZxN%@rhHl>n~jZXnEN4;#RwA$}4iHFY9Z&m#>d zQEUS;wpLYj==tYg>|!=7*aB!C$Zh<~O^cMsuiQS-@mHC z+9JFchj|Dtm(w3u&v|$pdE8oqiu|k65N~6yN6AK3)*X_Pn>L426G*+WQ2|4I8gXI8 zjc@mL_K6OC{!Epr{p$Rs=NF6^70S@;fCBpQ-FZ3ZtjzKaA^lNN)nec zQnZ{GD-bfu01yO4yos1JQ~MU+T`<`R&=n}qzg-ziqTc~6V><#~a9;oJE?MRXEXfsm zu`N7zw!H#|VFW&xfG7ZjFwxNU?XR3&Co|KxiWnEn{P~gX44xHr3zDBpuX_lGKU^o| ziYBYnYlimN7Jcn9uRv&cz~i;uSs-w{;QotJe=XJ-{Fa%hU61V_*l5c%hlZfWJ^?03}Br&W7( zQG+LDqibj9RB%S`iXspGj5K)LdZTp*O>uN#`J)yuuyH+GA&!uBMB@(P6ep!B;=}jY zzd+bI9M@{&m*%aPxjf+3N8U5Zgj03%TjV9#R8f9NSr0|pS{==HhxjXhZj*bA&|usjz@nH`qidO}5oQ(BrG z!VWmo(c3vs`FDU#7Lu`h2YC^lj}}piLIYG; z8UNvfv4KG?hI%;HhahK+%OYjoA92+9Eyc}aLD(8yBPFO1LPU4hd3ri;r47T964_a+UzO%f{w-NsLkrPqxol?q$FN1Q- zUM_6=VGE=PcAKx9UC6VpdVxr~Au$I;GBiZwTFGlL|bnAb$}V$lMQc2ocIGF|7a=MlRPaz8&T(75>^X7rB(i7GS2ax@QDB)BURw6!L2EzlWKDXa~fye0h-**H|fe-A~x&$x= z$acQCGk_8N#}dv1K`L|O66+!2ufv%D>x!R@M~w}YkCQ{#uTOz_Q`!4sudLF%@&{ty zL&e3#@%?hLC%R)VLB2{X=bnxFFL`53F;7*Sm4$^k4MO3HD1zG>7w7BisWBmmH~OIY zjIN+D)yyDJ7{JB6LP7;yY^bbyyNl|~pnM(u(KLyfql>x%M`8T(VzvFm!~`+f{mm{3 zpHh_5@(c*Apx zYf|&C|7;Z@SB$k_mM2Z(MlW^ZtHH^Ff!(IskgXw-M-QvRm}z#)#}4Mt^89rNf? zQd99eN<=P38=7a~L;y|k{n>E(wZ?0-!ii@rEvfFPlNR|ZdNWj3*5R&J?gly*jE8ly z3=g9Wejakz6sXfSI|uBgyJ$4+k^b@$d+>B`$t< zqGb_ID`;u93kY1zzo2u$7zn_2mN4*uHidiez6f}VUFprTGK=I2VTHgk{G0T~9Vb;) z2Ox+ej5!c7yubY9qsP&ao3f#ldzhG5^Lg`)EsQ9l3}N<&=D)rP9q{&`_MH)a=g)6K zk32Ru2J_g6S9J5?;p+gCR@c_9!at_hiZuT^^5X7GYsQm4Q?VOF81M|RyHG=h#$p#T z${Ff2k37x#idqD{cPCc>UI$(oO8+x4x@3ac=s05zNAR5xV!D=*@c^Cm9d(jVTQKppi4(cn8b(SImO z#EUwUuW!zO0(ota1YHI=I`|2?s#=JXFlkl5R#LT%5AoBS7Rt`{-rfhv#f_9#*dR)s z|3!(CEQqn`HX%~+Q;2gYgna8a7k5Nqo(3gTX)#NFVd0U4Q`@dua!?LtCL zmh4W*;ALWEwbm+~C@0hM=-xwJ@z80|1v+f04&wz&vN{4t#-#hRkvNMJf{d z-qlO_FLvuLSzni$2W*HXiEpOcTJYhX-s#hIP={^5c}&+%!u=&cNnCTzP^RE&EAr_~ z$Co0}K){`3j^#E?_O!PjLOzZ>7ZYHhQI{qw)IiXqO5q=141rx#MFbNzchuXia{VO; zR~sQTaae#i`AT@WWw<$8u$GkMmacFn-sBlDKZqgikY-0`unlE!hRSNHt*ejJ%4n!a zgHs6)N1j;uOTNnUSnZI|5+)H7g62U5WgK4)*vZT!3+B>fK&&A4dmIt!0zGA@_v+Cz?uSJ)(Wua z?4QoI6nMn{1)yBodrzSEQsM&%LXh+pzdiLi`^&B*!b1h4KcoX0*cv;+b?k9#h1LeR z%3KD>HvC5n#R||9sGz6vKW9C;x$F$m!8LmlI`XW${W{d;$hc)>XD{d3L3xDT1a}Ke(5AI+KEWcx z&siD7NPvf{$aC0+F@9m;!sh1%zZRx@YyYCds>X$cID+z)Gzqw!3a6a}%$zpGp&w^! zAT9nXoQ-HQf*6sFpno+wDyolp=ut*imfYjk0Up`eH5D@hbkJywa|eh&0k{U{lah*R zjgW?FuxctW>Se;N2|6iY7T3V0M`oKkX_D#qT-~ea#G>1r%TY+fMF(FI(jeW_r}I1P zN-1#I5L6PQ9@nN%14o08eQvxFB4jE`7s&;i_HvnjCGju+6BF}VIcCQMoGF1xRl_(7 z#isV2L!hUb0NLHVckf#sy z%1vek)&;Bk=Ep%-BHWxy172x_)k)M&W)=)dV&(vjK|bM^o*u`gK$ zkr5zKr*|78$w+<1fq#24r>P205d=zt_T!N@LvJ3?2t;hKG49TtXMCy`I6RpY@YiCu zq5;WpCRn(lH4q|FqlU<1_-=6W_#ze~j<8Yb{gh`{ec0vf3KA6Wu?A}aT4|PdDZ}#6 zJ3lkq1Cv6#ClLWS$nm!fLa>7QE9V)W*lQ+j?3v^$uu;HN(OCon=K)?U%znAFq=b=~ISB1ilI#2Z;f zE2|Wfa(f=oHdhw}&uTq7h#WRTFG{*lLTfOW9$dE>J5~>zc>I7YksN{lmSqq?A(j==#lw$U-A94<5CA@4cSQH8-WCVC6AH+IfCzW*9#CPZ z#NPrWRVN?PWR#VidF?d#HmLIPBj9%+?A%oI=g$HBNI;5#m`=cxGe7yN0Bk%t<*~e` zKN<3v$O0x~3+`~MhPq#eh#U^3X&!j$dTlou0f7r?v~)3A25hQY5>5~0W6yBX^g&eW zmvF+uVx}>xNCqMbz~X4tu+csK$hpdp;s{s)YDLgnx>xt^QbD5b}c-?X9pi{v%;#!wmQYj?C9IT9t)iNl#*VyvzONawqWO(=^8CGGEjryp`gXqyZU2f zgev)tSkorLyw)Xx4A;P=x1MiQ}KX_FK5XNVf{|;Ak@zcOWYGD#+SU z2&Np}+(hb}>am=t%n)y|rNEILrkZ$w6=3I*M!bFXQ{3C4ZSEghTRXfZ4sv6#2b*W{ z6!5d{K{N~e_LRbjUvX{2l81-qve-5Cmz#$&2zZaW8COX)*cA9$O9-E*XJFV8s}b~j z)6gyeuR%AYOQ{|3p8*^|I6KhuIv5}ZZQikaFMu)>u+UrUm1kK1Qo?~uK8%vm`p`3( z&p?eJmhNi382m`_0WX8{#T9!a(Ut;ea$tht_8mKF&AMUa4aMq_R{b|%x==ZA-MkWc z^m$t!G=}77DJu^q$91)V0Nf1HNh1LH*s2N#bOF7UOru(s~m{L|gTgLKNEKY9823BPq-GOMcVum0p=K|x!3 z_7kilQb?ACUO*G1K?Q-3O1T;)tNRj*bDu7 zgwiE+^N^x+dP^9Pasg;sLAo{6o-nXkb6axv z7y+=EX>k=i_FMe{z!i=J^m4G!lC)5I2ATzM9U_jeqW%H~klKT?k0X1bUcj9${+79>~Y(2VT9mP%aVw-`!?5q6^kHLI{B)!&(>(XSmR{DF@yqAbdc$ zfyNvx-=hN31I27_$1)^2;8eLOD>RNl?Ki3=j2*!tAk3KoD= zd&ju~4?j#*dBVk?WUj&tl6n35KatbnpzHzzF(fGm-wBO#=fcpLzOSpB&`H`n=8r3Y z92$_%fC0|>Hb~r6mhg*i9DzEQW7>!nK4>$n66A+5th0!|fl3B{E3|XxM@xx9PO`&s zMn8^tIDeq&LiB-M_stT&Smo_u!QknVCgyY3NL(H~0RkFw9R92Ak(as*6|{&*7yD^L z!}mQRdpZ4Gaz_hiiKGbhny+FUGq-aN4fwXoyHpfz`#qS_g=S$;fU%xONZbd4*>w!+x(m3k6!A7~BG;SJ> zgcA+Uqa}-L=nz(;hnm_&-_o9id#p1lrLc6hfTs_%Y;GPN-3SXT5m*>oy+kb_>H7xm zNTU11SPb-ZNVxNBtFpDShMfoQ?6S${o!9?~Vt9rhCWA%igm?yb{qQ4?^cWD7C`$;1 zmYiJMUdGaS6%p$AM-;6ixs^v#IF(og(5`Wv4iHPr&Bassa9r%g9&Cg|sMJB7kg27p z!bt?aq9+W6k;=UbdQM%Xv?$jEA~uw3Sy&{XaVV-EbZ7n-(3HyI!_$q)1y`xJfQ%3v z-VG7~l?2pc10g<#6%{*2MsC8Nl^ds{t3X)l_{5_H_)0HnGddO*rpWLZ`7I=^M_3q6 z+)Y<*7|Qq?-`Jr?6gK$p)jS<}U^P^|t*xyMhZ3y*K~U!lc&C68Evuv6h@lsiOVhx13~6IAhN32-6sgxXB~r*{EFDV-7crpo#oNo7G34IWP~Xr@-8cTp$gINm(#YW*fFPL zbMK3Y^&OZ;D$=1;7ON!I9|VvC@cfay9#pzSud0~~WCKktVxGB4lZ_LDJa5bwAce=+ z-TlE}4m};+P&i;b`~rc)h>Q~q481Y2#e%>dX}R~Ng5DxV7?57q=x7*jmTzs9U)h0m zDBqJ^)>zi5k`>jy6>a9a!#_n^RBS-Z2tQRb-c|5VJc7bMNhbGIaS=QFZ2Q`$MeUb3S&i8O6 zhHn=wJ|`*Le`@FAN&-@JQ2gFR`~Hh4W&yvT87=|a!smLs>@|~iv8>4dP~Uy+r-6aT z0nipXAM*jbb|z;`WpsUI?zv`59ZW#2|r0$;Z*NBwZv* zKY}Tt^aELQkv0*bOM<=)4SqniFc5(%gZ|plgT>1bRti^FUNgxDTAWwT;tVrMb35rT z@eE$X1S8&m-~g`hu8$|B2Y>zqJ3Vvf?6O&aLI2cAuK6iAtw8Q$fFpzZE7!|ssH<(I z(hC~EuMBM{zr-*CIsUGK=2NGSLO!}uMI@MeM*QdEc`GG?4)Rga`>BMe?*zeko z+de)k$We&G0IRg=vTz=8<{%DwH*S3YGtdLKT?h-u;l@Io0GLLl7TDSyU9kj@S@S)EG(m7BN(5={ z4GM$~0(OC;#|@W}M3pE0@7&xRnDuOH19yu~d{ewwggSBbV89UX^1rL=1tP(g!f|`I zyu!?tDeY~TCekd1`1H<YMeN44S)3VD;{ z=?{WS zLA%yJTPO?ZC<{M7(^JiyKJHrZbEuqz_V4F~i_iYhkGrssmOW+1co0Vqcsxw4Kn$)h zCKQZ067V`B?FBW*4H2Zx<$uWC{jXZxYKWmg)s(`}u6lc+PZp&fur3NO)P3M24vF|- zFapnXa`O$${B-vAu2LDeIT?kG2-@n&OS+21tV-s76K`g`c8*ID)dQ zPcA&hu&1`K_MQ)3MS{Y7;`n^pYvJ@t*=73{hrWeCzqxZwM&D}MH@$dUSju@XGImw~ z%>@$ZL)=y5Vm>53`o+L@u2Gqpa`O-v!vD#fpdl0apaDBqCWx+ymo`MxXZTD(-J$mc z%0-Y*H~zRDM;K|~elw5;c?D@ni%PW5d0<0OMdPv|2p`vJJ-uoXI|-Q|*RCxGXG7>- zz%Dck+dW}s93B(1RwZ%#!rbJsVR&SX{b@XhMOVMKn%Hrm2Y@7QyhA!ghih^V@9~5N zs4i^v{O}S=PI}L1c_JK@z@-4nP|4!28+{jk-nXGzPRN70)HO7edSzy#AU{@F{T(Le zn0?+Y*QTwb)16T#e_c7g1cLEq=Tw)_tfEW)Q}z??gMVhSR+g)!Y#LK$f57ICA`_rc z3HCPLjk=DGxuL7{#pL&)Ejw2oZtY#H!;f=U^S`^_xkox*!r!~@!-sZBCg;YBMn=Wc zIc;;zww9K~_(}wFKs`vj>WM;Xv}4k_P2|Jg3*1~>G*8(9Mds7>0mdK)$5L)xbo7vm z`OXj1{0t69@J_B0T+{a=?G{V``7#p@KzUQoJ^TSYiY_olFVD00k^=z|A51Z7eG!Sx z`k4-&H5+9R+VLlqCk*Kfqa212ZCOa?egq0_)@6cL!> zwL?j4#?B3`9TpZWV!V=`+fJ;^1jGwonl!KY9}P3Eo9Es5pcEoQODMM5g_zLOU>W+f)`!4K{EsdeJSjq!Y(j$$`sYc8%74WR;>`EOL9xw(04YU+r!byBnSdAnB3CXG!_ zl5GR>F*H^X+6>q|e*G@Hp zE0{fHk>eom>M1+=Fpi!{lN5sNyVWGuUL$M&FdUuW8ytGU z3a_^^V#jq$N1Q7}H*adkiH6P=DiePkOj!0eW+9QL!j7qCe66lZSHpk{X*JRC*FGxi z?xr?d@5kzf0X=?~o!(Os%vTon_MVcsPSZAUQOYoBc)-~|H>FmHd<)eeS8ZZ|Q*a;;h*zE$t7Yljxr+dor%LuI;naP5U(X2SPmJ zmxOBh7S0R^8{h*QV!HF+NV5G8oTuvV)~ z)63Oqsj}5g{uU}M`MM6hh{N}{EYKtNSfi6kKii1;1k=!{xK;0O$y+c_fkfpFHLtOV zv2Bg2yO^+cMa+dyAjt{t9azzQz~CXlC5Su%XEEf4(b8XN9bVx%_ANa}0LpldN#mU2 z#q_G%|EC4Oxb8}gsK6JhgE#|x7grd29)X6 z&N=2LOB~SK&YLCAe&tjS_dd&qKpJ2ewC`{Cx)XD@uE9ZTPme;qq5G`l8-KKvf>CO} z0h{pQWO$V&l?4hxJ}xP4)1kL?S=O_N}F!7 z@Z;1df1ShLnBCSIvG&6mpt^gjKOo~6MRw>#4gv4EU6_my9nfxRXdqV?1RYSf6`s#z z=H@0NrjWg6Ji9Wi%|0xBMGXVan>U-)l;1zUeBg=MU__cE-NdY*7MS!Ehs@Ou&$ zS2DB*mYzQ&J)T10g`5Vi!35Vk@>x6@QrP|gQi+;v>mA%k#%5;aL$7hQ?Uc1EIBUR2Am^bSz|e<96uf^Q$9T4LM(GIaluJoQvAo^Gj6=51hBV>}zjF=2KohcQCcW3?yb*4)b1U`V^jfQFu<-IBT$Uveh8+|+ zzkcRNMVqYH{N?UzS4gca#!4t=#O*|>R4FN<7^U5GI1Tgk7FY3xOFF3PnK0 z1-PAgN}5{2VUTw9?{Eq6;c6ve#^d>jTA2GfeaVBb_G#UQPw${>Bd-ovDuI}{--VB7 z$5 zRPWZT7O_m#m^)qbyJSXc8xNpFg4JEn_#e?TjktZ|3nqI9SLU-&@bC;;mx+azwC0Sg zw74&Y2fn19`*h&T0!T1YT4DGb(ms)}O_>stUh7nYXtk!6Ul;!7IV#=Q+Qc!;zNTnJ zRG9I!-29r{0}7iLF^qyq@Iv8(G>HT*<$ z`jB)?Zk7s6nE#kp%|i5Y!7Fpv*(BGL>7RHzrRu)zBoFP%mnE*dy1Tm4`V!3imGd3OA@N8&a_4Nt_rY-ne^ROOHIdVFQhX~UD!Ok}>-Uqlr7#{rRtTG-J zXfCzo*1H}5SCGPp4WGStn5Vl*Q+>KnWK>Gx%t0UfHzCy8llL!$81Je68f$$dRw^_s z?C?_i<=M#BO=L3AQ#?3fu2phj2l%pW4k`dz0j6O5|ci;9XClU->P zXId93Z_Q*Lpjd&q!L6fv_G~4XBs2>f@2co&B}RuMa{`5n5JctZ?uZUJC1td5G|w6S zI_fH_(s^wVctB^I2Aw_(|1j(QAHJ2zCgG(bVjbC4#K!h3&YF%+Ib`T|b{AfF5mVah!g@U_KKYx-{q!k&D=Wzsri0|CyGGDScP8lD7D0xt z&+|^ULhshu*B1aWIidV8k4pL|{32%PF598sAO;WU7VPE>)m1`cF*}6<6qPT+H%Z`+XgH}*K|HVW7Z+xy|D_cp(mK>ux;A;iNTk7onp@N_a z6VHXeeM>(I`6L2GGhb51Le9-CM;XSCWBfo*Uk}mZlP3#JR(qAvG?NWSKcGo;1cdw8 zvEwjs@-%*D1xRt0#IJNQ!d8H%9f5^?f{D?|J$L0UPC%#;AE7cwtJv zj|ofG@MyJ01g6Rr>CWc6l^l;gYmcKJV{0%krcp_B6l#VV z5#L%dq2WQR#pM*f`Gu)?VA$xKMy9!m9Rl)2!BJqXiJ!Y{88-ECqdF7+e#@76 zyYl5vukfuMW`9$3<1q%#ifz6my}wR2?%Dhv<$qc{w7<5=aC%uBi`lqFLzzPc8yF? zWSX|mDYf4g{$_Y01w|{_43Xnbk4rc;3Q-$V*65 zIvgd&=M1z$ca!qKIa?>ym~~^PHGZR)AR`bFcCVLb{nqb&6_e=P;#phE*YNqz?o0A5 zyJV0QQ)pP3^Wgu&IR@o9B7%3(l?e#MW_|L08MI05ArRY8s6e1X7-}lH@c+$?>{3v$ zf2twJH0iO9hnpMH4b}D*Y46iwdgl%F>EF2S!!@a2R$!7*)7I-sGnxH$mckCfG0D)w z6bD>TAd*$Y)GAgb!Yvp<$TVFJT)teb4wNd^(N$1@AQCr$55eyR)eiMURcmW>LBLxc zX#UXHpt*+(E5s2n(njC=V!mzrg$>#waNmvtL91@ss})~g3LS#8MN;iz8X7$-Y z)1sz_Fwp#nOh3?lIBoWj!I0|eW|;%KdB+c6rtvf<1-eh-TLyc9&YqqXkPriOMlYP_ z@-4~7r$F!QS!JjhvCmPO;5S^ypcmm7@uw#F+aH07-m-P;HDj)?rRImD6Ss}EtUixJ zk8EB{#)K-HW?p_8(G5(iG9hr)WgWmV$W*w`PC;L2|09WKYj?}(2x$TP%Z0hJd5yJ= z?{_9%TEZZTD&`@0dNXGWuO3hoxT}098rT>XllT3##SWLGcO||suBgzQi5978!9+`l zbXM;xmCW)qL_kkQ0MfvBoyfK3ME-;hBFpV|ZV#2*h4SPpf$Fg23fI?$6o} z`xd=VHL9ID`DG+2Ip#(4X{`(i^UD@lZ>%q8S-;71joDzW)A;CtlZ%H+bRo0;7Nf)Y zQY?o*IQs~5=Fsx6ZHc{ zwyjU=?)EKp?vFa0?PNP9_Sa2WAT&;2pX5-%Js1q}FRlLaXLYt6g?vzHrMwh|zMvAL zQ$zqLAC!sHR z_~j`rNiSYpYqJZpzD~UrD3q+j2)pCOh51_%A>UOWun}MVBY>SyUqjpQHfpECrqzIg z-#ih<@b!?WMLdW=Qf4B)D6`OL=&WqEQ|pS<&#ri|8A>YPNIJrW#Kq5Dd{}Fa_cAfR zUQLkRMO9;`ZP0KYfcB6P=Zxl|OR)}Va9XZkpmWS?^QvP!H-9I%!GIkTkKIs%_8rOM z5I1~#G7fWg*&-g{C)9bZ*Qvq=0L)!6Y!3Oy^dCd*bqLwOV5(5)VnX=r{rDSV{~m!* zFcsPsIG`U&)W#6iV;s1+s4j15eC}JSyG`fBBT)`U1fzD``*F2<{?~2Rv&6fBq=Vu& zVqzKhw_J?49ovMz68qhI_mFy5w9XWGwUORe`<$a45f|n7IN`s7*BX`U03A47`WLxdbLeWg4>l<-ysKw->Qd{I4tTNv`nT%1; z_--FdN9(KW?W?d?{9etd`z`^E?=UXZ*7n69*+jPu;!@_0#zn}MC2bGJw9X9xq(Bz& zpjwPW<5JVn%>vf|iNLS83;^Q4lYClAKO>b;@pa2BkWt`D`cHn|jTy{rQ zaJ3dmKmYrk4IT-CoBwENu=4>t!tcOzQ#e3;SO9n757#s8uv8QZMjw8NZv66cj1x~Z zl+V$wua1(G@f#toj}UJx8r2;r*B9kLMEc&x1J0PTMIJl9)|2c2hjV{ut){lOTEKQG zR`unSlqBR2=W8M{R&tM%1|lub?n8Dn(Yi4JGyO`8Ivdx}C&bnwcl`BvJiRGCnJXU} z<+GY?yavCUILgIP=UIYF~-K+78b=SesdYeTfLLXVkZ=(Ncic zYRa+~fU!t#)*Q48klhi@B_REoJpsqGO$M+*PErG@u#Sj>d>XSCIR1g@ecoa0+r4hI zgHz;A>_OG=UMr!MZrovXbv#`i70R#izKr=wEd;wlPGI;DCnO+sfH)K zkHr~E1_yBa;71}~d0l^&tPWj}@OF?vHR)cQd+!nMqdUv+iTyi7JYtQJNO{x-)2}Je zi_+G3#r7F>mHP4j74_U82GdXQoT%0hJ=N^WDw-EVd^!!XX7ppfSgn0Ka!Q4L*{xPJ z%e}>~=kX>skZpkg-}Lh}km|Uvpoy!$mLdmzUNCOKSG&JyEMF#q<#a&ctzXU=n zF`{~vS#pO(s05zxUp)VV3RW&h@DL~pKyDGW6AWYh}0zvjN-#lvnz zeP`ePmHbOz$$sJ0R>jf|y$|oJ?Xp&zanl|R5!%Ig1)=5`&mrFzSQAtr5V4HBv;%@~~QINu)67bkc?Ga#GUe|;D{SrU^Y_@t0 zMaD0C9c=P|(AT=Zbi`dTUJg-LnVBRBa{t=rB4_dE^t4V{<2R0xwLuY2lXbgK;vj^J zL5HueeSojMfv27m<6vgX@Z9y>DIVT)RdumHlC=#qXVt7?L%s}HFCP1IB(P{g=+?sD zV7BRn)sF$W9RBT4Rb@FR-~6!1Hzh^$mrh3W8eE&uo6L&MB1yq>qE-ed2gXA$yzfh6 zkV$h|Bhn?}xa(eC zOIuq%F@rZ7B_!72v)xp889$U6Cb%WPJWALDjt$VWgyR)JeJZE; zJ-|pwW8<@1{+k}6Lzeq!Bcet0x3NEKdV@H)mt7e}RDdnL#~6PL!c?L_$rujPA| zcEXgmcVuhfiFlvUgbC*S2C^Q4i6Y8L=u_ig)S(7V}sRxe5m+w?e}z&$|-~S!G>xdy`&g z9bS8hZGC&OV))+SQ^yL;BOLB9R=LIr={NSFnt>rvnq8Y*wEPwQ%vQ43fO4W`!^SzX zvvm4uyD3|g8!H9Z90e-`71eWkhAkWO{cb`>XDFU9m9e)A)=&^FEa4e2 zt*~T<@$B~IkI+IvwmX=`%gH`pGO6@l-r3AdNlGC!#mSJWH!^DY;n6`3A&-#tINgA3 zdjtyES)LJ%Roj@4fS2u~>U-ZXuCLFP$1oKW_%NI;^?%=DsSy<>z}5561dLE`pe*fNIa}H%i<{8bKR^KY?>Xa}y*6T`5*VVaTOx@-T!)ZJ4(AjP5xkvT%s%7S|o=oxCoAXqvGs zU1cjf?c>{{qyuz&M~s{|2l3gb6&?Q(!s@jxKO8D#^z6r66lgQfJPE4&^A}PZW6%P+ zS$2Gd^OFX#=V9s)1n>beHLlRg`_U=9JIYHBM6$|vA7aN40xwDl=oSdSr}|zcE?<#= z_sH&rnw1gDQLzXaY~@m$sZ##RLaV$yx`JgI{fW5{~yPo z7T+KFiy#uK8}p3IkU6&^s&*CbVw{-h3A~EvXiow*!?W>0+sFo9mrAuP+>n@~TakXj z`RMtP$+KKP=e-kq_-vlpC5~cuVk_e>u$CyPg>z$| z9f|q|wGxnNBfvK%X%(C53#-UU7AOSAXV}zWjo}HUzM;gan}ng_L4XGzG)6Z!Tx!CT z!7tz{M#)j_k10AhU;^Shc!)B%y5)z{-}gQ?X}U_of*6b}Nf(V2)w>3fZTlC$*`ky+ z4Fp(&xpt>h&Mja}i1LPnFwp!iNAC(|hIMLE(=X~w(x%r_6a~DIs{%{`6Vd>DaCnrP z8b8VE9N!aqTo*GI4(*W-4PO?fUtm09;j0th{vhwEQvKVvfo94hMv@mH>^=2+-v}?u z2&3AZgI?D4wvkgT6pYv$f{!6d8#T;zx$t!g*C;&JNG>9@<(|P?gSTn3Z;{5Eg8vCT zsZ2k%D0jCy$j z*5`=67)~k*t4i#qUIbF1l{Rk6z1W05{<6Fd8Ny|xk3__pbJWUZ>nTB@B}T;(-hYpy z%A+l?-TZ;r0$@^}4U%CO?R$#ueh>ah+fj-EgJvFf=#>cOm-mE+3dEaRco;HyIkiQD zgbvE({qm%+oCd=hW~nn^q{MRi-09P&)v19k2w;8PlzyHOv#tjw4~d2d(NG`c<<#dG z?RHunmDpk<9pcs4(y~J&xHr8mX=5-n@o;cw!eI*hIBXO`Er|C**2zy7n=)*xP$2IG zN`YxO(FH|EM?XHIR(8dXczUBzgOC+8nZE8fAQR(dkk~xdOjHN0_=htJ7XWG;TmbsX zI_YtcvLG0x=m*}7?3E9vSDA@#O&oA82^8wm&VybVh~WJbTkBtbT2Km4naO@)jeqm6 zDrS!Lni+U`VQqc1eBViS*%-C@_iZp}%0CK0j9;5wRq*;9bLQWfq_uE~Fwffo-9j!f zFhv9oe*K-3V>7iqkc$36F>&LpdNuBr0~?kN9@cfx4+i%P_h~38nM>Lu-;*T-#@eU%}adF+pgb zp}{&ZSbI5@D$Es6n|9+f9z)vuHX4ARX*SK0cuMUri_a;K~*B_alh+Vt^qG@G;ZT5#yyf+8|SE4A}b-wI)oI14zxdkg!-t*h_ ziUt1@w}Q{u{BKoCd8e+Z{WxS>EjH;LM=P~W+n3{8>2P_v%Dx!2Lfcp3yK1aPU7z00 zLV$1B`~d`wg(~l^X;aNU=iB1m$NKB8=~0_l+S}pZ_Q@to?6YM`eBY*+^giis7E`A0taRqZwH@Y`KoGZvEh8mcz%bPo zm_S`ePlsqi z7|ewOmNPR6-3yC?3yC zVFmn#pT4XuOk}(YdkPF*nnfM|bL|(8zpnQ?P7qbohG(iSF4&TRuo}FM=M;x2wC%%n z2JE3XZlL);T?}4fl{OO%0dfEd+cc;96>3n`O#%Tv;vZVCs8c4h9xLEMQn zo<$$jl6B%CC$~`?I#q_n1TQ=IY?=;pZ&?5`g3lz30W(a>-@0>$?Q<^GA&APi&(#RD zkW0ipd=@9@s7NBgKG&f@m07$c(EKnVdi6>zJq|eEb#nUcog8TkL7H;CO(VO?8el=G zm=I45?RI+Q4+4Zhz)(Q@Vo(ID0X&1SsBPg3_$U$*0Jdmu5YA?n#rgUWPz3|!pd;{3 zOMx~61Yjl~DNqQd9j-%dZK)m0cKa#DIS`XreD38n=^DH4Jj^2c2c)sWKjfYbTodV* zYI5VO7CdDQ9UWz{OKi8`^wWbV>UyT@tSceChqc!R45$vdUVb}x2{bH%cyI#Nx3q*{ z0AwSS?=S&FrzL1VdddQ-8HhbG*Y^8|)-@v_UE14G>s0gnMc$jl^NW-&W(opSpmV}t zsbJC_#kkE|@prgGH2$8!XG?DxhENsq(A#Sre}H&mRyRUlLtNkBGlZ-5`A!vPf*+#y zjzf=&w$#PLEZPC${-LHc;&_2w0O=jQI}eaTFqcZ;%W(AuptBW{k>Lbg#^7!cF`5IJ zD#m923T%`!VULA3(+y63C~Ena_aolyQ1T9j0AVXz+dn(iFkjEU3lKO=7vcBuH8AS{ zPW&Z}?bwfd=TxN0--Ez_w=XSkD>-qk8^r-9;a)E>&!`XR-)rvV#EMTz27z!;lT3Mx zDOv_l!cq5e<4NG1Lnn<#dRmt?2`?CCgUooGD1DW1htdhUtlYF51IvQ=@IXrO8(cy) zqPtw=;9pM%_8IF0|JL2p8yl8vj>GIE^%89^T8K4zF{qYyC=GCFk#mDKSD%ee!c1W#+*=e&s6Q$}_##;#fli&cTMMgTXf{ zKL%4_+kuMfn(_VA2N^hD%89`hnqLezuz0W9$=xRsjLbkfK}#E(2%COv*kyMoDj@Y9 za@|LEAI<}uPCM81g!lM+nM~b*IrEm|kwycboVb;r&N%5;)^GzQ|i3-`l>L709r zhOw%=;X&N9&U<#F?xs8u`2^IbL9(jySBsYa8{9De6?>{ZvK20NDwVI$SE6Ce;ztct6$G zQ(En0FpEN>SMOA_f10qusZCsjPz?$Eao+z(0dZ5fd@w^o-+xH@{zZzisU;=6tc#{> zr_?r`8)(ei-Fnud!_6;7+b6@lO&UZx{TEqlnj z$A-rs5gyQH9=Rn=BpmXN2Id_MqF}@^4LkJZ*#d5?L$-_SU}-@pj(=`po)e*UlIYm~ zYf7MPC0`d#=nBzYT0+Gb8d4B*#p8ky2x0@CM;JpK{wQp01g~iLHeml~r0HL|OK*Ng z<2j`skMwKhf~Rb zOR0@?K!xC4R#_0?h~C0~f77>-e2NB?#B_qV)yav9Dv7&WT-_uTOVXsH@QQAsC*c-w z18vc3?{avI!v}XWf5W~<3f@dfUxLv965<71FZ4-BL_@OjnoBam#-+oqWhQB8&b@s5 z@0^rBgjI6J`BpJ-Yk7K!80GbP*OnHr(z(D&j;nz}$n-(8i*pgL5}p#EBvzn)$6!`5 z$x1>>A9y3oAk(A2p1X1;`wUJ>d5K99i)GWS6S%&>Yv5mx~TSOFCMe?9o^om1CX znd~|WL-D4}%*-BxrouyP&fEyEnib;uxs!U`j&D7O5N z;)K){^oTg1VTh=BMye+o6(gP&jD(h+mRXuE;DyVV^GIPAzj+nj9RM^Rz<*<7sU5#C zzI_lR1e}FJ!B+$RBMccbFUF=>V(;IlS<29(vzU%xp1>m}p9^~!R=?oTR^z*&C>~c> zoKV21IdQ{)GYtE%x`=T%LYqkSIZdJ8lDRVXmGEaO76Az~g#?rd&#D+1WY3e6Y4PJR zh}UK}#Z1BFNb_p3 zB|id3p0VTuA+q1<;kp3t4-9*n9sW0Q0Jpexj-0}2?=Z)43k^TCFzUa~;Pqi?nf(3r zL-)1SdKj~ylj_mv#aV{%saWp?_w3SVzPC^Z6q{%KN0p*NAvpjF+s$6;3fEH-st!ij%t{&JY+R1TL^;SQ)Su zA_Xf?UUlBfOO%axO#530@HwDSHV+a~dyXG^Lc1K*#rU9)Z$lrzL(Bq5+iR3x$wIqN z3hEC>RcKHJEca7nNuO1J{N8}9Gh8`sZDP$I8_#*KRivx6oM#|%M#M0(BVer*pKiI+ zG1S`}SajnUFPe>>^+J*z&@325IryHSX8}M@re!h20Vd9;PJVU`RNlX3FIEk^_Q11n z`d5tvTmix`hYy7hBuvF7X`LV(H2RlqiBP}e*U#2Zs$i=6*CP)E+N}vGf%aJEl_7md z#d17!R7|8qS4+6Vxf?h}|& zShnE*2aOO>or$4Q8Z6vpzogK)%G`bFXuFvtoKhefX1;WlwZ>t@355-D0_!~!iyN&b z9bnK&I%>Qx2?`=#1hqHWMo4E&b)PUNamb(#nBJZm0Wv`*iPZrSqOk$1P8v!`Zpdua z>z_BZo>wc{Fu%Y>yV*{bF864TRiVxzUaiUT^7J zBv}#>znLHF>mZEbFfF$ej%X>l&~X2a^Hllm4s06HS|orJQZv$*HDz94BUL1rxUwz> zf|(p@oF&7U;EUkbS_)YVMpn}v*H-^Q^%ys@9w+!Q=3!(t5Fw9+kPw0tEpXYr}i8Cm?9V77A|t#Ax;}q zGoI1dwJqpr08zu7-}Y$7=L68$;2}f!fHs9NiWn0m8D;=6MYiiTiIf~t6*j|#sNFP%&P!6w1o z*&i{rD9`JT+h~y)kP2e`fB7gh*Z@pT*S`bK*e7 zj!Uy!%BpmCJLQlnKO#b^?+*nsP_(V^gDtPu@Fd9$BxeJ)G32e}hNn6mpzUxOIpdG>(_olQ(yfwc2HWhGjhkt;o0XWMM0Nd*Fdc3J5hj45WA2 z-T2L0iCsKSO=9T=lCn><0^))tK*D#gB109H5ot96+Mo%#$EgVDfw<_RqceFYK8sop z_Mp$cw(nxVcNUvV-a(}XD#j^AWv{2e=9p1<&?YmzL6aH=)|ccf zy~|qzqPWe|bYZV!l-2V07b1Sqq0M=4+sQrHS;cJexcE!m53%mf_l%w!cpU^rZTIHa zvi4rPG;2cF!VNFG=Vy%D;sWoodf|m^ShEU8XGezws*+bJDH7#p9+yi3Kfq;L{Nhwn zs%aGybe*PW|KN;G6+NEZc9>X2lHhc-3FsPcaVnzbA^Qs+4&AO^(s=y*n7W!uHA=v? z@+-PX(PpOzM4lh-jj~6*HJ0N6q5`NR3|k1W2(d9FLih`R^YTm{2ebe(d_;wfkV}!#Ui^U# zX8Z&C@4Sc#rcUED(Lm>dwCzhH(PoDYbI5f~zNFB}SosQgcf?_4RC_z7thsN?{K38V zMBIO(6Vno9kjdh*NCTF+j&T^eQdXU$J#k-q)U8L~Is*;?G20EmAlrMf@Z=rZ5#yVz zd{6$pAl=A6ZXY3R(amw%Ld=|;atI)Lb|o4kv}NI0)UShoJmm#OxCi_DJ8d&_o;+7r z7!M;414Z@nF|pwMi4E?Il1%5~Wl$XC(`Gq5dDrCtrBiMCtlfnRCGffkqJ(fDsPaAc zaJO>e6Q%Gb>C)U#oLpe&)=#`);2c~HA{eXQ&JJz>*jBgK((2!2T_i^39tHg9)A7!T zrkim8nwQ{zK_^IT#t&=|ICyX56REVkWK?_$k= z_rocFs{Jx1hzU=Vm^gm48@iM=1!omt0NxGw1V#p?(AwbO#>^wzdWuO4k*Qt0vr3c9eSD;fLt1)|%h35ytsAZH_bnunW^Y0*iEzTLV4|$XtLJA8Wty z8Er9OYvNnx#n22`6oW_*Qj=-rqV)L9pTF(P$7C)qFxZNYx!R6S3x(MYUXvNIT_m10 z)#}UkxjyfOZ3{?-)a3jmyy^9;z+h^BkM)cps5pq#XvVa9!QKTzLIp9yid&Dak)#_4 zg^6zx=NU)`z*8Opu!Le^K3IqbO%aLMdIfXM#oBwq`nVR5&W&gHH_k8}OTbdR z6z^V#gHlJBwn!c&$Et98)3B?T2Zu~sjRCu3{BD#ab1U2tD+`Kod5$3y_~ealB%?JD zT^q@h$0vP44Lm-!{lv5!#z;|zp!WDR7?VBV45=ELm4+dVsI=pjEutQ^;n}6(g6%BN zVOQid3mb~#nF47M+0q(81{%MCwL#o!Sm>#j9(S-tqnihX98?PkrN`{;8qBW{CKyP( z%2P$4W)P1D5*a?>*uikB|B>0V=PI*eh7M!rWDX|00N6=02pWLCbI@kwhdOp zd~!JZQ%x!u@)u?Xr@a?P7rS0Jo-I?DD^mdfvDqpoS@==lzXyRTy6d+rJ_L9xuNj_B z0~*JM7GFjBu>)6bCUv0ufUt^`yI`i5Ka}q~a6m#`Lu%Kql6@ug33VX(+;3>-7>W~4 zcZbf)&d~}`UbW_IZT>hXH(@J)1BVjuLPP(Vo5o!5+w;$6jLDMK}tPf1&jRcSF_{UnFji)q>yeayDYC5_bu-Gim2*IL^``vY`jYSX?mK)pyV= z4A8$^Com#7f^Ab}ol@X0FyDWKKsc!E;`z9LEHWFQe$e>+AW3+6VQfJLj>XSkz8piH zIM}y_-D|E#V0Mo_j@BP9FYdXz6vm6dY%lJOQ!$!}znL*5y*JGyO*hqT+~k;snRFB- z>p|Ub+3ms9!>z$o6nvPp#QLcA&vq&mJpC@I3e2rIGHpf)qF6+*boW zO>G&z|M20jrUhg#r3|^3tBR1&15);s`JxcO1l}^hnWY#RjOQ~~?6Mt>L98kMg{Ji= z4e2!(Mn)Hyuq5Qjrk_!5IT$2r^52R0tPU-yJ00IHjqfgUAYBG`QEKmP$;#^g26=|4 z#&_H57$BFB=jbunlmt?V%rD*#Xqy+`t$)Qc(3opz#38hZ@D9&)=u%vl)@}U+>pAJm zyT&%ectq4giBvC$`wvACouF3-%}*Ct<$CJ-Xr4U-`W~f2eOp^7PBci`-2$ILY=lSf z7$6D0lOpo7=>!F390E^aQ~N_>4J0BiGc$ry5il`v2LMpN3(fBEPBwn5;r-|?swBL| z8Rx3J=T-ynQAu#9s8ygzX@#^_&(TcLjU=;!ApUNG1e@q zCBP)mM$pTU4O+1SMp(Fz<P18@M1iq$zo{|kOEHz8*nv(F;31OmEN1g|Hm57c96 z*m>wIln#7#@P;26Box4X$qWEJnE{fY>EA>OH`rAeUjUfUfV^+?ZY2Pm``PykY`*!LndLCLc0ZU`p`cR0<<^X_+JhW-_%`HReo<^{%au{l=&l?ad_Y zb`Rp_C)$3Uq%x;EO>`N6#?Tm2y~HYJ1DKaXPDG{wE?)GrnYo!l3ONno2un6RcJPAW zOMs`7!a_VU2Ts2LFaX|=p=QK0Z^BGHjz_dbxPhDUE=dpvYYZnpFETz+UPo?$?((4L zRV+a#p&KZ#izhn>v=Ro+{B)9ju&sbI4MBEc)=`G#XCxg3Q>_BabGLV0k9a)=Jj3MO zw^_7x@FFMH4S@WSFu(SCi4WS~=dlyNch6!WtiV5$#f@wqkXT@c1Rn&CSf2^6KT2Wo zQw$QX&$Z_YonWV+&4+<9bRW0Z!ZdHCwm1j*I>brC-}n|VdYrZBFymn)4FzH`W~ePk zI8_t@yN=jj1vRKD=5$%IZFd-ejpZ}WO<=B!WYESM7!H< z)kfpTx*hm7{sGiH$TLtyWa{=#_4hQ(dy*~R3@|FWZQC}hukCnAhmoWR7{W%nC7(@1 zi&_R@2qDKb6M@3-8)exvN?vLKw?pN!R`yz;y6xNd-5$Qov(+tXoBCN*vf5TjAptUXFp^x3c9Eb!|D5G;Za#FmrN~04Fa)>bBtZ@Yrs3D1XebAr9M7l!UeH|d zprzCQv;f0x7@A_S9t9(TK3p+TyVN|x@3okU8Fm(m7QE8vM(%$fY>PZV8PIejx!Sg< z;nSy7<1+t1`b}}fMq&IdAKJ_yv>tMO7x|8O2qIHcR1F5Z4Up^ zQ`#bL$odsE??frk1tUlv&~Dz%e9^n`s$l?)7)S$*A{k3ZK`dC3?wvN$>l>CTY9YoS zDBP_aiht$KV;?7${m~=Z`ntaPwpEThf}yFw)LnzJHrnNWcuLXWrzM3|0?h==f-+v%i)+icMw51U_31Lo^Q7R*2AbI=ekXQB8tHm z=kI7U6j)i%h;A{W37r){F7##}xc9u#6-5i{Tl0fe)#{z?B8lro!GLbyc%*1afPfbY zUJS?IL}9&7F6QP*x0$a7_QuGW;6G-W^Zj}IG2JWkQ7vb6WoSr%0&sJDBy4gw@VpnC zzN{oS4UAH8(*(%EuC^rI<~>sY391IK0j?2hs#0=i^0E4{UTV#~SkogHY>`!clx4g1 zDDD%qQmZo-2quAs@wW8aF27(mkpvE9m z){U${z4H<9`n{S8#(2>BWVR2-AI2d$<%#fY`eFijcj6gaVM4FVE_NoDT_@>F{0NjW zfG0r?0He@N)*)AEFm>sB96LsjF3wuk0BJpnM^ETAIFT?Gur1_^q@Z*Y4NJmi^>P{TgI6Ab9*;h`aP4*6bE~o)zb)9+n z^%CZhF%b=DA7BU!>txwRK|@mXn1B!en`nWq4_y>C!|f#-bl}CLnx`{^Q7}QgaXH|X zf{yUwjv8Bx?th0<8(vJJ%ijDaErU0Wkw!T^pK%-LdJ1|3bfL>U7hj^!O%zsP#2eO^g-hAx@LNOOLOftVz^@7%et|V6=X5Gqcq*qMWL@D zAHNAve%VfEnm`raNhVYo)7@!vl%5ahxs z%tBNrqBW&vlC?QZT}wzJBW7u!0r+B-X7%NTUPB)`nB2TPDd0U*EDz7 z))aD3-hg0)zjZm_X2?*3Fp2=Y0e=;qJ$G>?Ij>)N#lU~2r z=4Kj;$k?3y^Me8^Y*FgG=elyK;5YEr0A5v`@QnCqBKZIv;R`)wMnfSFyWr^0zjKU~ z!W~|mf$b?eV1zO#NN7k&N-8GQZP|&l0!m?q$n*31?^fxHYeLq^3Z%lfKVYiV6sFP`)I4HExT@ShD^)EkRw~(4b30E{GgCAHnB;*zd;ZE*QufgBz zlcuD>$^a7VJmTv6hp~R}4-A*P?Vn?86PZ7LEyI(|eFS<*L+^aFlKE}nzm6L==__i| zu`UT#b2cTcvzcW>cDOE%4;-$Vc_Z%Kw!_KV+uf~4p~sz@P*~i(Fq5*#?Tz}~-TKUo z`okvQpVLl*!Dyg+5By@kIV~JlMk4TDG2zotBU=}4a9m@dD8~EY16OxU9;DQlm-`0P zmjZem$FYQ?Z6g4VcXf4WP@(pQreyGIGU|m11944~sR88>6wvh6FHq+Gf75p0D_3t0 z&X$oQCrHD9Z&}wtn7)W|g!J=l9;pq(gF=Hm$1bIoiN$W};-c-OkD8X!l*oE@ zbcxT0_FV2+cf2o0Tnrg?IhV09yC`HncJ=_lkh}*YAuvJugtN4t_Ai~0j#g1-oG+Ma56RhZEFy;`iyC-d4+4a#wGIH2f$5lbtEScbP=wG1;40fU*F4DBkPu?RVWEZm_5j7L{OkDZO$Dm7?r$2n^BW9r>qdZU;8> z`I6{5T-gw&xQOWlxCDh#U>Ajunjk4g)P%7E3I zIlD3lv8iaMP#MJYsWf#u-NBgKeebceAiW9uSyECW3%TpJyIVg|VRO6|->%y}xHXqg zZRg)ymc0MlN^_?XGeEkSKW+w)Z~TXQS}Nco0ka1=)zvG#u)}?9=dW z4KA8VDk@#-ei1ailsOzb_kG)R$Kw1sFyEg7{8nz!M)qPZm6nkMUA@IwJJ+tjFjjB3 zup!@gyRK0M)z*i5@tr)zyJ-O=BeTkE)78k3mC*biM$L#W2EmV1KDDM!!#>|*^WfLM zzSKiS%>41UEGjqr1-TZe2OuyDN_QVha$xLq@ORGt!%}SkONEjQu(ov+nZgALZgda{&2^wJA%mP~ z;%Ln>KVnu8O*Fan%_PZYhU$C|=PjpTJxF1TinWCGd#y5ygP6s&Tw!VbM7aBQ6{!}m zk1!#H9g&}OGe!QAtLv{c7!$8PpSf{sFgzOe-{1h5TmR`3>jK-RcccuCQ}2W;Up>>7 zkuD_-Kz0zS5>g(jc3ghOAkJa`hC=@cDG^SEPZDq z@}0q9W7D1K+Fy(eppb=)tn!{n2h%j&j~_pF3cBpwVP&_s<(#7SXxD`< z_fG3&&!*IKrWSK-vsw5?1y4S( zK9W7UJncJ23ukF7OM8ee+XMVJaCBinR!*N?u>bG{6Sj9fm*K7sPz~gN7br!%px<-x z>cS;#_o)4_szJ|s^3j$`Tm%Q{#tp<2ik$#(wsrCK2}kG#I8$3dfo2|d-x8P*ps6zE zJ2TC}!O;ypRoRX{`EAh*waM#IrrR?D~##1XmC?prfLMd4jqLAM_gF$uR~+ zeC2TRcLm)G(0tcQ_h&pAdD9Q~SSv1JJQ&>bgTFG4a4q50(1%^c?Va09*X-xGs`9t_&4~J$Y6Kmz33>H{DKF zaSmP*V#PbehXoOrpKq8Rez3;x4hl~6^yq*^tad^6HhKZ+m#9-_U<$~mQp&b&-P4F1 zwx2x)ON}h>-I!aSIoI{Y?(`#c+~Q+YQD}-Rg5akc20#;=PkuEZhd*we!~Oltdsf}9 zHUo}2&b&nv^GsQfvzkvjIUzJv&is#tsQCxKFQ;uZy{EoBgLptyH8dbd9sd?e!ta-^ zR=(T7Rq*Gl0g(lwXd-?saJOA>bKK;KVh9DyZ;{~g?kru=rc~nC5(< zuq(rxLMnu;GBfQv|hWFs(Z3 z|2ZN7gn0X~_I(dUVKb1zxOUUvuoWB6>@zyxj4Dni=@iBn|2+FwXk0)L)ZQm1*f8V& zhpz9A$GUIdPbsUrtWadnGMnf^;>t{+kVMf?DH#L2rFW@qmC-2$X z#Ytm(EAI6CoSi&9=;oPcz6&Q~ZlawLBjtIUkJ$2s}ISV)RBEFj&-wE|b4F8gp8MIj*VbGXG9Z4t69NIzVJ^wK)nH|cao zFIMNkDe8*80|tfd+9lDXd#&qv$;ik$@F>BAfOFkWTZl+}_9I+j-C(dZFs1ix;_F<- zomi-nzc#OY@?7uQRQ&c^S4)aUS6tNPs0?KKmg5Y<>G0AoGeJxQX9kq|Rmu6qMfTLx zRFpY^J`tyKt=|3P8F1LR^ChAtx~Rlf0h)iouv5+b+vZ=~9TcC7Bs9Vy`pG4K(@yYR zT2DWbC}Iiay5PhM|a~T&DJ{R@Y;Pc!@v^jgKT_*&f1gAn0L-VAWnv$dX>c&mZlo&gl}v zsp_Psa(ZF=EpgWaoIkb3&e)`Ap8xq`lUa6NE|Vw*NlTrxMq)rTiW=NCZ`)SCtIOS? zPQlE>^X#1UEuVqVJ{@&JGtyg)V{|h>_s}^=VOkl3sP}_7f}|7#K~hRV3yQ5-wSMEq zv$FK>|0Tf%LpuKt0e{nJe>%{J;L_?QuL;_=FW+sCTVu*38U=!fSb+kNxwj2{+*3wD zJ8w-FpD(dR5%ym?9QBJlo+T~Fe=y$&vL-xtywHki$X@EaQs4HE|2T5B&u@qSFIAn% z<#IcWxf4$J$kJfn1otICsB%r^SZFxFAmdtwCs}srJ{-o-?%JB>#d=}Q6`+}li@ENJ zM{>7Rn{zuk9`;fZ(o@lQXSuUF#iYJt=9LtO^v5ltfzO}9Gwf3chYV9$<?ETr4)Yh1qkj(Y@@?oFi8qmXW0UPA?#Yrmi`b1Rm(*~4Kb>E@GSgdX1#$^M^vG8> z&Bq*~6+3cII{g|sf?WL91Mk!w(sgLb5+N4|tYJ9txBUs-evcS*`_3_}ud@wqOv6&` z+RD5BOa0IP)O!43 zpd1EAWkZmG@j40xR^m7S#QAe)E#Al4LlmCBS~!Cy27;!5inI8tucp#5P52F}a$j}X z3kf(QvfU?b!%Uj#_VQsS(^s=6b5AUMzjXhm^N+W&WZVY1%4%id8j~wqP%#rCDd9-9N(C%Mr-@ANY-!QR^6-Dve|5`sMgs(K zFw<}iAZ?i3izL7A=R@y9dhy;MMYg2q`b=Xa9XYVzNM7h-m!{h1fg(onL9=^^ zJMLO{liuQh4cG#gv)X;Y8ViQ)~;QRSC4zZj2DA+ zP;qrXDA?&aq8hFS7DbWdj_W(1btDl605zKOE|0t~RZf(E(C#_Btxzq&a8ZI`_vmEM zh5W-YODNMjpq#cIp%l9$d_n>Q;gIdLHN<_oY0@NYn2 z=&WM4;XJ7zkl)W;6~0w(F&^3fS)2;)rCj>&$-73Y! z&f$$ndnIUQw=F@9t;+ej`h4bHBfR{}LKma>km9S(`a|De!+F*PoCx+U^h3eh{^Jrl zygak^J_*2=LKH&AJ~F&r3r#TM5Ru%BNoO-`TraOG;W2QUb;t-U+g!p080=U5W{Yo{3wuc)w5D#}o_8|BFL^@#HLr9!GLua}2B? z{H)_5&wuMFE`2+whAEyTLx3Wz6?r>DqYL0B953Lt-YwG!raXV>GlwVVE73HJ#V@7E z#^+lJG}Cp#eaFRtO~D5)s!Nj7v7hKtWPAKLs;bszoEokDAt`mYSn%6^nwqsHmoIdM^6;3N97=r2CD4TKt zArbUCJs{&kHtxCItH`0V05l0#RqAjG0L9stj%nY(QwWV(>>nES|E|7Mo*=IfDGSOw zG&2nDC836eFeoBfYGg8GFE%62aj;+oA|!G~bt5gTiD)M=DprF&XiN_| zx#DtB=k4a1IIOkPA9IV?G@AR*`yVVGO494nNh#LAqb&UOc{RxPpsH4EHI(FH76Cxd z@;^7(@qG-M-Ti1I5~?@^3Nn_p=+Z#*0!f~B2MT^}M{HM+ymh^V9CA-;{>Sd%DjzHW zB?za*X69$Dt=DSTkVfkZMRejq+&sbd5*3%H)}a-QKQ_1Vl4xQ!|Aw06KO;l0w~@nq zwZf}Utk97`j;q#x)@YrY$B6W*L1TnO9US!-(#5_79byT7mIqdkuWdZYD)IB$+k*$L zO{iqEbdRAw!3j#t7Sz?i3dV|vF)5lsL{I@hi_U`yS=Z+|t)hXB2=xm33;&p8!X0!&j{k;#tzr z1?~!;|Kgd8`}uG(YOAT!q^@>c$d&0JYVvRPU2O#u`Bve}jHOUgI8H=1 z>%`3F{9oQF&B`QpS8Rn6;D5iS+u2hAVmm16!OJB?UVwB+eo3JkJSOb}tp@3a1LO7H zY``wCB+$P7^+{m|N7P~mcgya1v=}|^f!&Aix=988;9V=R0c8faz4d}SR@hK{d96Z! z=Ld`OlDV$r3bddUYX{UtAUu@UWMKiB0?x=aXgrNkwF@>(`~0j?f1KH0J(IBCyYIx| z!#VexG)|x1^hx8<+LxyZ z7euLpA_TZ0en%zF$?IKY^Xp0cn~uS2_wSpo+RpB;N7uDJovOqRGo<6uZ%t3^=G5Tr z2OCPHnja%H{D&hH_^rTtTL zc#YZ)jh>CBUWMm3&&$dmVnrmn0LU{{)?v}bqD-#Ei_lF@yNOBU-bF%)A!N=T`m4~A zX-&@n4!IwPmwvPXRur>{2IiKAd`bd@d8~3V^h-wID0|b zd2#gN{COa@;_stvjelsoV+U-&1Vo?XwAleSi(t--hF~ln(jZ&60zG;on%^>VyH~*O zL(dwT9S{gegB;(b$xglvlY;`AML+NUopx1~oE=ZJ}`Pz*etV9jb+S;1>Gniib z^>o>;p3TDN;Kl=HzwVnf{Bt7Cg|-{5e2)V4Vo@DCl^>m{((j9WH2CaL5Shq|H@jx~ zT30egdcDdwT$*8&INwfIVoyp?HP`nIKkXrMLvw-;wPegAP6@8dJ#~X_6r^|}d!BUS znq;jW@3^-Q;%(?sisfj?3<1Q;%6(?QfA0gd0>ipw*Xga(KJG~>AbDmjT?Q{RMlySv6{ z8!Pe^gLSKT=9|?KO>0a-wSA@=N2nm0US4WEa+Zvs{~k2vCe_wT7 z&n*jRl-T&}lp4}l|K7DhAvYn5Yf!lA9?9S^t3(n62y&fP6Q&EdT@HL!3;AbM?);q=1FUq@L`)IkI@#~Kt7l(BKXj;a01RQZY z*+Y3dH5Cr}maE%ar-vh?-m=Q&gph=gyw~nsDat~I;E?~uL|3G3YF(a?jrqY2UDl>h zfPaI-<~hB4+yjq#O7aS*y4`^HgUpatq$03{EL$9`I8})S31;?o?%Vv}Gm=FN>tga1 zE_Qvuo|OiA2rIIAoV$zs7+|>u-Wc?VChibxh=lQwqX{G@I5UEi9TgR&M=$RgCi3l7 zvHJJwaZEY9yDO3^=&Zwb^r7WZKeTnR-9gL+V-?P7Ve5~*A)W?zR71SPY1Fz%zY<&M z2o;g%C{q0CLGK;Qk$9fwp7t5B+|IC{GbeLeKzKTIf48c+-TfvIwOU6f(k4qr z+T5jcI~Q%q;RtY);Kn2sq%t+rDJ;)}SHPC1)! zuivo2S1ABgrd2$)4=u45Gm^b8`$`rE{B^=85PuM?l*Nk{;6}=AV^YXVMq>&+Jv2ia zrmgYp7uumO`v(~<1w%PPl|*-|18b|{j>1b9TUGx}vBHNIVY^$O{kmSU)K+jHbmQI| z*W%V_9uQim(6AlEM|=YU0G@=-;ZWzrMJ?e_)BsF*VZTmNLOAck*F|Mc@WNO$&#KUK zIk;YUY}@r6G%xoQyE5lka9~h3Hx-~D{+3AhC*AyCpKtC9EisH+_18k{+Y+(#2PpQ$mVrj8hb+9&ll9HjajapLZzyKCt!J6Qtf4g<&a? z3>bkm+3V--=i?0&DP~b)tTdD@Ck1%dCTZsXb2Ioi8R$BNDp@@_EqC-XFrj^oH+H#o z#hODp6zf0tMCc^`!NFEJEX2L{KBym*+QZdlo{#clN<4zhZ+sTZyUXnt8q82_?cTL4 zf2eY`JBOz%g6;kLF7Lghzu&}g$p~*Y9d`eCFR3i^F_&`5_9F(WpCkSljuJk!3P&pO z{X*-NyLRz5L&K*>AKK!n%??U{u>En>>RI;k zn{A#&_xR4JzBp$^z8L?AvJQrUukE{W6*n87_y3@Su85$5A4)BZht_v4zVxw@Td>%0 zdiUcCbPzcZnV&&=fmjjn=+UDHs>fJ?v-ZuvCWn9~hfC_=X1v)}Nj*r1_dT?P6AUtz zBVr5fLM~<0_C){EZdSmgFt>qcOvV-#%ozQs`r`X2@j3Dp)}7%Qh7$uK z8I3NTuZBaIle2Cp`mMoie%xF$;EZA&KS;Y8k6x6vpvUsBUYhpk0L`%0z&E}R{5%{@ z_}}AtA5fNY*u2YkUklEY&|9^2wHW*vgH4Zi!Xjj8@$oxkwGBt1r%b!Xl3g)kpu)G< z7HZGOJQE*Ct@avIEh~QojdaLT4?9~ zo!LI`bJb^?0;)|S5nRWFaY(>KQBE#E?9*!6hE@f$aAYuih)BM|(r>8jj1}|Epg^=C zvnE~$O`ikT5X2s05KS;1c8(b#x!Qe-K_FFBNq}5Jr|qeg?CAS(J_2 zrd_L+!K)!vHK^9+W}_|q1yH+0mzvxf zZ}DO5_vPCU(;~W^ zbKEZFvp*fQiIuk2t+Oc8I33z}B;37G?wS-lzrCYvJlNM2L<^9>U_#_u)fF|w^+Ara za3%bTMY|Bm1s}?Z)0l0$>){d-)`4K#Uf6?Nj)+|$P!E8&gVZ69%RP*m;`*rL&=x`U zL6Dy82)BkbnuEJcRgQY_8)0}%Kpa69r`lOzilJhW;OJz1IV|sdb=Tq&b(U1MT{qpe=r(WWvEQQ$D%}UsYU2`qn~v)7)2 zQj&g`VM`*DxG3#;usDq~(;%NNZJDH=yj}IJc#Ha5xCrHZSeZRNG`t7Ie5_w)#`$DI z1L&EEOBr%B91isEIDHh=n{b_s917qO36#OlTcho)n&48mBpm=c@HSyzzw)p6#Zfzq z$ew<-1`ScTfBJuPlZ>9bU}QKjiFQqruK$@yYDN%vIStWkN3sQbHh}7Wq%7QmSuM!B z|2qdyJQ)1QOTNBfXjr9tU%=$Ugn1uw%&&xdY1~i zI7m7g^{jd^O7u@U^VkOYH^4IqvIyD#f>v6VVQQ!DnvWE|T4KCgEJ>L)A4^Wm`u}(P}Ud_c{BkoTHXL$w6&MT!` zoTGe#;=#0m#&_U_!ESa&l<<9&$j8#)S;V{QTEp=LK4WQVRLe;koBjBsC)m(96_EgI z;g3@4u7RB)Z`?UNF4}xkoHh?9-Zx!zLj&2oSyB=Z$m;dKv8JiCa){{19Is9Gc!NxEgxra!yJ0( zEnz(E+1w>Z1Ebc4=pGj_)@ENDhx1giR1ru)+61vYC*EfWifh2vp- zmPi+RFUFK2Zop#DOjZ~LwfG($8(X#Kd$)(My~CBnzwBl|^D^>V?34aWPb|Yaqc*WK zZyqb!oY?kE4`;s4gZI+8^TNATKRRqc&~HsRoP?Y9WOq)|cU2R7DUn0jj(wLKzvO$I zeeEvS4!M~pd{51)TOeV0%ofg*zpFWkB;*`hA52bq7rBP_o~BsGebkq)>Nu`LIZ^xK zLzK+DgVvnIhSbGz9O1mV_Qab6kuIRlz8J<%j3WvKy&aN2hvI!uKii-9@57 z_^?lNh9@rYT0dn|$lpxT4gYc#V^=&oWNz@F0l7U?iId7Iy?c@Ka(CffzRXe|dL%SE z*8==qV7C|zgoc`abaJ1e!$7J4bTEO2pf5?mEJk8qGP?;yd$hsQWmFFHt2kgHyAPgh zvk5MXTp=?l{E-uaPs@#{v~HcaL=hGrd6P&B-{qZJO^hVlCt7CIry-IJ{QGTUrAKWt zlDGqN<5E5p*jMSOV0dh1F%t2hYJ~k~d|ECpE+#{;R00O^6y(#vhU97PnaSFjP$InD zs;T)b##V%bQOTtOw~RClArHpc(mW^eI}Sf?uBn~ZOL%8178X$#;_)A<^v>atOwS;) zjy9BX?{ZzFFvp&>vgRbbMAmoz(97rOb_`$^Wyg3=@@$I#vGb~Q9t?N*>@b+&iY>!n zx`D)lF#^DY}4AeIxK(7fDX5K;5;#*3WevjnGd#c~2BYCqq4 zyyUahMnC$&>YA6#g&}7L2}Q-*YJ%x#t@tUyEclkiQ;Zvx$z`bFp8XED=T$r+B1_X% z8^d56Wxk-&%bg+oc~}eAwOL>aGU=-^p!vn za9+ZpO^=USWz%^Pm7t1+7Z`>uqr;+wz9^94*5PqL z2vBPgla9xqzQvF0{E{{K08|r-p}#QE$jbUztOa6vfGz_QQ}`^TOqaz;5dJ@)&uU7( zfFD^~VW8fe6bJZS=HN$ z7%rT8^VJAt_^k`GI9p&j6l1iq(zxUPvG43f|2U|!664Ps*D&^AsY;;OiT%-zPeOFKV`F0AWwwKpI=$QuiT z0Evx$I|9g?3;-!nv9$i4pC8$D!BIE{u&{9qWM>;^p998lUMT<_Nj2)Wpg#&?I&`>~ z(8U;0xu8^15e8+Igrg`~2H4P`uVeM&WFDSH|Lq);*Z%Jg+;Cy>4O)VCtE*w-GqoOdhB0CQkpI+t z%Hmaa?XZN|&?%s>H?sgBVv>9Ja(GGJ;@+wvMI-N})WR?>$u^H@pk`l4XY#=NQpl64^wo{UG z;k+-)V_^2PAmaLu^TLMcu_U4sNGyIz=C^N)(_hn=%c!Xxh~1Ye6kfIM?m5U0SCIE^e3n-lA zH@n49yc&@;5uyMrf6aP@EDYR6S1okrsJ{91UO2&E>bAaRnG3!6$q%*N%v(H%ClT;b zW&1O4ruk`WiZ6omNu~Pzyx^hIUD3zvYHb2kEDV4fOD*TBcfqq9 z>8;~lFR}quyy!%Eufg^VEx4GPcr)C-dGiI9Pt+x$y}9lHO)!yKlf8aZ5?2X0Xi5Rl zTRw=9Vjip=MsJA7TSeY5iuy476h@YAeI!?Nn6v5iXmI|N4$>P6Bzg_LYnqN=ADnBLKnt9$8{0q66XAp&Szz2MyQ? zn9DpTW}cW57&>LSop*0S9+n~*35I!j#J>=>UASK|!j_-kpeo;RQHA{PXTirr4hfWs zw{LITlVJLF_E}*6%zC1eacAA{g!jj&tZ5uguo5!V<6fzJa$cwshLoFRpMx@>G*&)V z{CzIe4lh9ZNAx3*E;!VT^UuFFixPGY+AKT|jdVz!F{a8E$TAG5thTsENQ({yTk$dB zBtde4e|==N%Z;fmZ|IX-Lk-qDHdEmHpm@lGb8CVa7kLhZp{EppgH?tH7}ZlJtM?y$ zwu(m9sDYgZXq%|5a4}JQqRb1C-;<3C_z5YEgm@@`lW}eN&;_%{%Rni=W9sedz7e+F zAwySC^`l|Tj%xF$Ri7T;!7$fRvc~?!RuG^n$X%pt|zoMX6u@S6GaDZJ_L&zOqUlu!wh3@jy59`f;JNc>%4O<-vePkh!pyA zxLdNx45ObWB>vZdr$5`Lc<2+O=4K=;Mqga}K7ZC98;??~6zKa*_Ax{uOm>UW8>1~m zHz>BaAs71q>k1U~m%+R&ng{s7;lO_^EOP>zE;u1+c5gpd2C{`safIz7t6`DNy+%u- zb;f*Fm=?}^`sx)s0UDtx(Z8;b{4@z&6_~70UzYU@1E=xp8UOPL5+_o!)YqG!!&r8U zzjhcYe$>9IL+QUfXJ6aw(SVyn9*#L~JF?FaP(UJUBn@q|6Kj4+@ZYB5HZ9P#0r&EpBefnj8^oHd&k?UZ z+ME05#1s;~*he8K{y?|@`Li7ei8dxeKA2{oF#NL7m|M>B0W+G02r7g^qehp|t2R$F zxez4k?(NJLWuL}53|WlRo|LGHopa0K^Xvf+e>ikcJtqgtXbaKdI;X_5cJHd-#$1>W z;Zy;jBe|MG)6fsF0RX;u!}NFtYdx~UABFqjR3M&?X>r#2$8sxr;~XCFES%2(cmfo7 zykgAS%LkWQ#Aof5m*_KZ5oRZnUsR1qHQ`)_iA~^-5&51dvF(KaGIld;;oyYHf*p*9 zPZ=r~gE0m4&?V3#N(@Rc&qs=iAAqv3K@tuY#ozmOa=LX! z>a;)FDiPgBu_3!VmhA37b90vql$ES|0Xd2=OF zzn*psKK(wbb+ZwL80Hgf|7FN+g}=jT4`vcTRMel#IjB!ZlCnIVtoQD{2wQqh_BBEu z93`!A@REef`^QZiiCugwxso*SQjq{lC415>&c&Z_b5kY}@m9@B7>JiSL58mDSi&s2 zw6C`p|EZLC^T1G=4kE~gCdv{*F3X=Bsv>4lsIo1qjLeD-q&!3}@)V*=mfXl z2~zps_g(vM(0gG$w!ls{JuVYnjwp-7E15M?L7w8x<1rO+g2AGqO$YjwA0xLVUMK5T ztZlz2n=lo1{Eg_~$5$xg1|e7g8wyJwGS{}aqDcveN-k~|77ku%d=&>!b>gOt?LUzT zW5A}=Cyet7xO3;upLBbmf>>v1CK%h;_2s9^zF)N)_w=+H3fmN#XUNj5y?&r|YFl`q z19>w-jP@^KW9@3~drksYxy}pmT2b=jRIk!q8TCn_>5v?TIgm;43!v|t0_kK{Z45tp z#@0OVA+WB0&NnwdiiJ(}~v%>P|`qN4(KE=~h%avT)sAPD+QIsxyK6wzTr zP7$wm_ViXNhhjm`m5VMX(<2mGZkqB?iPfFmVz?;h&S8HfHTCNBmDca(2>~lfcK1F1 zM-J5ktD8RPq*tL-AY&USQzHam%;4U!?i2GC=N|V*yF;`OlPx&tILiiEKHKD7hFTv# z-bEUz;ho1ug@+=cdzG~DAQmwssdg@Rt%#C{Uwhc7ekf)2Mg=FsgD*zQq0O@P=#wBze)%%( z%}2Y*T{uUc98AMW+IaN7?d0iGr}o368?&_cZ5iEm>Xti25RJq&;sbZ=FNQ2*+*tQC zuP$QG2oM^pTZdl^2L&!yppmveHp5^$wPb#=D;%0gkvF>l$`=}IUlPrW@;d03Mplnw z!4Dn~O^7=RTueewT$n#kQ+JwDyWyCzJf}R(EvZ(w^^Go^b6M~(LD)}UtDs`K@)(Fp z1b#pTly*GAne-Ct8XF~Yt$N(8@2x6fy~QtQpLKPgqBM)h;M(L`spIb4KCjt7Ncou2 zAJ#f-z>~+QQ9T~rY=>-(_FSJE!|R%cDa*cJbgN2?l7{|=2`8A1u5F&fblNJ@#O>_k zy7|L0(Fz5gZth%7)bvtKpi@w_f??*CR0c6HF=SR2SVCrl-aZwqedE`KTh#HFs8I)s zW+sY&k{|n+?U=sijrQT??YqFs6Fm(~>pxM=zdPSiPe$y|pGsNyH8!LcEonG9?+4yR zGG2^6DCd!WahcHffBKmb|is!@jRzEAd=XJ7RE z`Je4*W7{1qh_oPLR)p+B+Zn!V#01OiX4?;sH09m@>K1!=v={o^=&Tz397C-mx?Cr# z>NrOzlCc_k4K8bQXr?aZq!t^BH+GPQ+8BU*upGUSGQdy%8l65Ly+Js-XrjIcZg(l_ zUWV4H3Gzm^!8MJ*vXqfmT23q}nW5`3ij$;qJTd6w1E2_^|A}U>Dr@~*GZ^el>Y2Ve z-=AA8xvFyB2fvXN|mE<-b!BS+4L1^^BzxupT(f)M;~sRBqbvxZP1r0{TlSBLOgN!Q zcm9=i?!3W?DWVk^G?TUrL^z~@l}lJMu#*)z{1l-L(=dYmj7;8s1eW#Sjb(lx)>c+lL`6+(>Hci7J#`$zzbH(h!rMk8l+4{-;a*~&gdG8SLv-IcfeIpbNu}SJ=G4ohnA#K zg+7iR-5xGfz5V^sj3G$io<7~Y(^z~__eJgp8?A`_F&1VY#n|l{1l2(pkfisa4_bh_ zrY4!)=R4hL3>Q!<%QbF{oXFTx=$U1-oBKExI;FO3vddtOmV!c@v?=@iv^kWxf;TKd zubx~o@&fHs%4ARv5Il@9X^t27CsSZXTYNN9p2($Z-RNOLDaJoIehFzg(IG3a6hVSPKUeSjMeT3Ntm8ukst1h^tVsY78#>SHNV?>sPY5D&{vAd|FD@`< z|Ku|>g#?$lTc_3%lW_!V;&O@^WSlU0V8KBNFmSi~R%zpUrP*g6RGWj`l_x~vhN8af zErfKGE*FYLIBS0dG3?&7X%q2_Q88s-FhHx}vR(LQ7wdceFpC*``TDNpszgPU4FRb? z#ytsh<(EkFKhG9pYbdpW`JG}S=}&MPqWSW^{J6qE`=E=(D1!4@LW7qcYY!S{MjlmUBJs zddvkVEQl{Suw2g5Pa_Ock9q$_f{>NyaBt0Aajfl)knNhe_fR}cL8AwgJW?z+L%kEa z)vg--HF6Y%8wS&7o4>V5@cmYlM`nrgIwQ@>!-xH;P3f~F*dVT3;WRTf+A%X#G!qD* zjHzY3=FGtT|7z z^@s&&Hn@}oX%Xi6NJgh8ie~u9O8!BLQ~8N1tTU~7bG0^b*))SkfpZTjaGaQb8;Gm0`+{^5H z4$jD=MGyLCDPGXv(*;Xgg=PkY2F-nbn8&X_#^e2~A=ws1)NY|Y(g~?9v#%w1#Ix(U zJwAvOxOg^CL+3`?)egf$BE`0w6vTD*p$YPhe?1yT&xw*;Fnm8^hlmutZo$=!)rEWe zgGdo}(K>h|8sXFn5WpQ(V?3{%P2c z#E{gU)vPHtQ=iSu~TytGDz`Y0g`>gdQ0@8~VAv zj$?4za&TDn6W06RdG{7fR+FUc2m^XAf-W!u0Ftx>n-D?lpKRR@%0(J&PY_lTn6?rMuC?f}ssz7cZuz z79@xqA1A-#;Sa_f9n$2UOI10EiXWt{%V9n4m?;>+{4!hjk@V2GClHxdclB?o z{w;B=#@x(|M1=zkt|H$WB_x>Vh6a4w9v0YcRz{x^wRc}jFy)DZ_%gb*polAkrDVpz zyy^B%2`hF9%M+B&=M#RqYU`GWMrV3Afr|!2T!pYikI2R8E*b?%o6w^%^^)sfE|6`ovQ+S&r_`|*nH>RY-EMuiPyK2%7k$U+UG+{)cc~A zva=LTgV(M=uE5Kxywc-dL2Cq5M))p>=fvq4fe;!b{9xCE&$5##+gdPOs#9H)T{2j7 zP-T#!FtzuVY3i>47tA`MjCV$Z!xc9)GVV#_V9>9{R0TIS+q;*dA$qp>niGB3D$0z5 z=x)07Wp)oNA2C)D6?{9!FJb?91qth?dJjgieP1g2gS?#$yJ?-@caE=5ymmG7eWT*a zbd!vMz1&0JPi4K`bbId~k-o{QiAG1vb;m9Xzd!Ssc{gn+8P5iKv_*D{!J$_gM#961 zKy4Uz)Oj!WLO;zT91a_O-nfCZX&q@L#CO++-vxJ!Rp+F zocoac;sv3tW!%4drfYk377!fNi5wFuCO)O6VaQ<}@WftF!3SXng9o6_eAIEDOu>ji z8z^G(exx=vQrb0rwSTAQk4AIjg0qp*q9zO%{mN6H*u>mo2JZ^&R5DX5wFu&bw#@uD?X1ZX!NrTfm{~?O zPMr?T5O6Pe@qvGPQX6UaZT?Nc;N6C4JV|ctENH_7b|zm0!xIqdB?TLGJ?0-HBjU3D zQG1IFyL37w$r<*|+xVVnu^5fMyRW3SSm>elu>fH2Rh5npEeHRn*u1RHw|MKPiy~4c zg;zElXU#Ny@M(FZw{qynC;EfNJ()%HF1hK)XW{u-5qtk5U1B;O1(ej(n2s4eLDMLh zj;C|3Lm4C#Eu~@dJHd}{R6r26co7-;1MJD1QwRqeDQ>E|D&xu7T|dq<&h`ZGF}+K> zS^?4mjGTkXpRaY+_AAo!=Yi`F#^tv6>SX#ICg)~rtd*dFnXm)mvwJxojy}})m9f#T zTU$%ZA9&ROcIa}Z zE~DyyjotI$c~Knn2Ed_VfXm;g7dfWZ)Y2j}IxI01h|>^Gl1z58olkwl!LA3*86E$K z=aR*ean#7(QzuYd)YIS3$s+Kzk=CE(<5su-%-tDG$CLy3Ivx>v6fgh&^cp3N!I}1u zW(*eshS1Qg&KoZM`Rmt`dk3o|RVnZ>Nlqz)H@t&Ww-2PnDYW`M+gJW* z$ii$IV;vCGh?~vDt$kjCG6jgjdHh;okC$x&;v8}Xa>Tq%c6oH&%mQa6v6(`Fl`CUw zxGLVVwrO)x4@g{A>5P&7h1CYw8A`)tYk3=>?paL|4fzma%SsS9IQ`eRJm2;mApwXz z2>*m5ja)yPhln!xZQm=%%U|-oSl{Og=xYhsW>ULpr2U4ii;$|whc3W89OH3S5})4I z)m^uzFFj+%9xlzwIN!vJp4*wEuY!h=G1*OZkHmx8_0W=g$mEbu`QBV zT~yW)=`DN{H8#9XFv?C#mwOfqb-*_&sz$$6z(?%z{oK5n*$hJAP*__~YGn5{I z8ZY)5o&m1s>FF8uWSi3F`3RK6HPiDh@MNme6RU z7lgQDp~znCnay)-P;w@!ZM^*1o(z*Ple2bR%U{0CoD>}7-I6`sl&>sd9AhndoCW$m zk{=lE=XMO0OIye_D3>6})TE#HOG0q443*U%shJ50x&)~Qx z5!?;N+&Iv+lyN@hG6J>T0E|#hWi#!PH(C#$PlOJf@o_6`+amY=TWBARZt?YEOb)K| zDwP2(qGLgd3q?0s3eP-QxMNkPFN7Qt$lSu2H}>m5<`3pm7kxj4;~xU7B~G&Ja#NTK_4*TEn|}}g2^rd> zOwCzX|}cC$acU32`S;cw@vY*#KzshhXhq5XzJsgT;RQeoLo|^0jo{L zQpu7~y^X)YJbi^o9*_1%+;typDcR4i8XbP^+HO|+n_(IIV2s1()5X&*Aac@~Zo5&; zyIB9Zcwb@WXzg74>^R498n$i5G7T>Ock;PiqahmX{-e|fBl=I2I&r1eQfZ%-w@tD4 z1qNq+IU3|z)GNK^%f`rol>%)azL)E-8!neI?i_S`O4z*jZM$vr0QrbvkN)u+CaO0O zH)izg4|YcJ1}MU*WRWRNL^4T=GXNm#kmM}l<^q5v#WX$fUl ze%Ga%bm;r&RBCB4^VLrrS`-J^uTh z5d@QY93@YJ0YWCq5yet?qF#^Bt?EMO0sy3p!*7UPm~6h>PI(y_g4Cv3NMSkmfB6!6 z*=X@POs;l7GnuFcW(5Tck#iYC_SkPaa&1|7&kZY)*~4pBk+?0DytI(0?+FD}6K3K8r%Nfc$UU0Padq5U?( z8AEb#fP?E1ivSkz8@=t5@O;L5gv}DGmQge4a?PAJjwggV6d+-vE7K)Z<##E6I`Z$^ zzd`n!@5dL{d%rFFRU608~*8?LCqQ0@?*&JQ)tM#UZ4eg?Y)oP;mBS4#}rafPx-F0+AI_MYPMLtnoWsv6KccTnbPAYV7 zQ4^j@8|sPK`Kwpg+<0p7T+-9G-q^mbO)@LIwg+HQTxE{s?fNNwr&4Vv3CjSuNeXlJ2-BEav-QD=y4Xnrv`wLffaP4pW5r4tV`7+4$_EqlYw@}9H79a1?*1DD zP0;ITC1L@P3I;)qx5Kn|w5K3f1>8q$qL8fsU;qo;^0ralK}qY?|5Ek?bqoj+c5)Ju zGrMGeks~J*g6`^M4IA1MX=dL8r*33sYHDgSp#1rGBFEN2o&z})W)caaWdUKBU!L2bN&0PJ2$HQ%NhbJkk}QWMTqMneIT@qC68Z;Et6vV zzG3Od@hXzmO$_4$n3_bg|s}(&9{P|G2(-=oB&<5bAY5#IKbJ^|#`rA_Rph z!E8)dX&4>U%l}6Qwey2A*yM!gtv)?wcU9SGe&CXoTR@Aq_8vcog*QM!qV|+8nlWN* z23RNQVG}s6&R!dXhU1kX zJkqcLV7c+^*|R^hb338r-v4{jud)CEz{ntQ^vW@Cxw29ph_BwP5yXcc(MGw+&`5~x zX45(ax1?lbod?!n*t00#VtrefWI;=--=!V0ou`?peSCA>I7Wd7yzSp+KOvAPQ7MZW z{E}>P0%)2NG~ixn#)G@aQBu7fzn5B+ss;Yjy6Akb{Mdb1k~AYQC>-P}PMt6TO|Uag z!{7|VyG31}XF+oaoR>g(?{XZ4z(9hWA)N4k@jaykv35q^*K|;~dvpSFOF$f20vD}0>%-8lQ|#0qnQl=g$@1UM1~d6 zW^+>`KTB%ZiEC^ZKOq72-8}Fg_QA3f<7@_Sd=*BvM}LK9o{3P$4I!eQTxA?g?%+VFSBBU$jI}Zyz=hZYlxT-ld%E@s9 z*D(PM1zUj3;ze(-z2#>YxO;;1L#(irVev)Al@Vt{VvvdR7@CPRX;0E;Ft>JJNDM1b zNCHuSAjS#(QV4q1e)AA_@fJTyWv}gqcSxTjoo_do7~n^&SdXnWsJD|lSWrl;q?@$CtydtY-}%&PODUkA$*Vea37MU8PjL!bGv!MAN_Ouc>0L_Wb`PIsX+`Zv;znR`LOZA zr9g0D@(cbhtmpj~FfAee+oYvO=Ghq<8nzn$if93)oz@~XljdZK&X*!&YanFH(*wJhtRwWSfZQC>ZfGUY5 za38pi#Do|mG-O_)yKjh=NC6{K%BhuDMI#RII89n6yEiV^XxMVVjI0h$Mux~~K^d2@ zj)9s@-&5}_blOb7aHe4T7tO`(mNqsDxgXIVnZwaiMmA>uL7CxQYNFqqgFBa6dG%6{ zh({f*vko=Ls_R;BbGM{Ak)e%O)xB2Wag)h|$ZJ6Uv>GSsK)|>lx|E~

kt?V{_nobcQZ<++L3Mnt+=A%SFd)IAI2e0jv-<8puD>rJ`!P_UaPIR zsl% z4qHu4qdP-|%@FV01w?aKAIr{quEATy)qj2G##RN*JumwCy@Rt$iqH5y{<>pC-F)Xx z@e&bJ+FG9GFkP=@#|6MAPR}{Pas5EMJ2K$UeSHjehHEOeY8k%$@Zk#5ltYNn0%au0 zD=^$suzBK=g%{s%V?*Q#is6qzvW zf(YINqxbfnro2Bzf~-JOdVnqZeLV}m zai{iBYa?WF6)C&aL+F@MLK*$&V)6K-Na4)XcRN)6k3oP}JoZKw11O3x3E90oR}hv{ zP~4$LeW{FG5RvUXPy#+Urp3EXi<{$`C2Ip%ydFEEU zJLW>b4Cy7WjVA+SB^$1Yc_-ZtS>anwZBN`j%d=<;Q7F{iUNRk?0CQZ&2@6V=unwia z!#Ouf6u{{KXX3naHOsF1(yQd;N*sMA_Dmv6D1sq?-WKI%ORZ% zBk`f3(MY8sQRsj~rK7DH7>G^Oyd)je05~f_?CL-1gXTw2Htcde@4F~ z7q`AWVLR+LW9iKqXZc?la#E4c!PUG8Eom}XjbUXh+>AJ>r1)l1NUq&jkrM0KzgHcJ zGSN+fiARP7gHlm6_0@4uVP;6-F?OC)i`VEZCkWL<`pwH`>6sU@+GLP40+7czyni6$wQNG; zP!vI50Gjw)-VXa5wdqpI1>IR5L-CcJ>y}yrs*k2vu7symX6pA{i@@DSc{+iuPU%oKfEry?7At_oh*cz$u zU>%&GVg2Qa+AUhWs+(-66@%3oaG02fSzn+wIR0Ao)2CY8cx0yO$=j^-ntY$h;n9(b z(QlS_)-Qd3R_=S)=;W7AHJ))fQ#GL@2euqzIW9tdE)%$N{!wjqlN)c`R$b%S5#vjr zzhYs(_TBlBqEaFp94YfP6$R$!`z*bh$P&S&yQFpE;hV#^FMau9b@uz}$1PT8ZTO%1 zGU?Gqvt^ThZ2P##(bRe3a@*0t(`WB!U42&Na%od7(~+$c>U&sxKER7O6zY#wP_LDp z+8IITdC~He**($jr7``-ZS+Napx5W6R`M03c zKHtV{guE8Rq|hkL?tF-KwS}D#x!l%k2etbRpx}ql=jD}+Uh<}BBx0H@!3IO+&US5M zqjC#A`{{=vM~{WXe@R;Ojryf%_g_)g9|7686@pOBqVQ+ZAh5XI%G^Q5x1y9hx$4ut zIJQ7Y+0e)C?Cg|HpaM?)f6TpkG?s1q2HGSIGLteDg$83v<_eKn6B#oUNv1MoDl!(5 z%2b3(y+Sh2lp(2vN-~oqGvzVc$Hn`7zu(?_t-ba?d#(Mg*86_19`|$K*L_{*aGb|^ zoK!&cV1{pM4+MSa=O6eplVi$5ek-z zI8~!aUW5znMA(!fwK>A}vmi`<2T409C=a_J9O|WCv%S-?%MrX;GLa@Z*|NM2SS%ul zP!37Pg!>Gs-0&jTk3YX6ujHA5{tbMp2lPx++vYtq5Pcq`Zcnu+wZCiS$rLsM#|RDj z(|;bCiUbR#c*=Y|DKLYt2Mrndd6!Es9%cFK8i4z^^h;I z6WlS2bLYVK?1AKiapW!ta~wHxq%1%_V1ojK->TW`E_<4VIds3s(xrSdNDEmYKATzUZ{ zASN?Ckahn$FhD+qL-uweNb%q25_DO5t_hhEEK~aY@gl?z0y9Y6*}lS?9BDjmJ78 zbTI%c_@`ePDvjT~q&dQJ4O3wOWgSK?{6vlK!19j&W7N+xFn20AVWJ=FU zz3}IE?=sJU%uoe(PeJ0D^GzoOq;Rm-93Gu+>g*NTYzyM$?b=>7p|LGnw;sWCrta=; z&;qK@Dl*@|Eno!hb|E3!>FH@m1&$ZA0*l08BU0AF%;*Yj#e_1i&Nj!%jmkk^b1SPQ zm`iW=I!c1r&LgM)S}Xwq4w%*Vl!e2jQGWxOPw%^J9nx_xU9LgLE|<(-++heM^V62Mv%1Ukg?ts&vMYOqLIB`q!S&osGQo*vsw26;t_9p>Oj%a=GWx z900Q!HnpDfqSF8_FopPw_13DGsX|vH_lG?U&&@B0rEX(}yjhY?K5N6;g7aYs_2wgcS z=8%jCZw9|3w;FB7VYeeA(Ui)`(l{}}ZMK05N7|=N82BAVn!Sd|EX$ahw_b_~CLXR| zzaC_=cdurvtSS39gh}u*lZa41)wx_&vYqhCuvZL)7(phr$EX_&3xasy*_x2ED9K_c zq4IkeQ%GLDdSy>y7ikw-uoxH?Q*K%kt(OQbxx+R#d+$UyCb*&$i?uF9>!vnx#`RJh81`ggh+2NhUs8QyH~XOTtL)mZk*fl;Yj2o zfs3K$emOC*v71}>fTDi;&Yf2l-6`7S0h%Pa!lmx>HEuXUrZ~gzLie`YrMKI$L^F!# z5|kLoyttFQA*0iOr|+Nlb#+PLd18K&pK*G?@#jR7W7|6N0D2hKM8uddP9+VkgWO(I zD@lhYT)ofYbo^pDc5g7Yeqe4y_9XhHm!o|^WiSM+Am|zMpITuoyO@IZu1Tx}pYY1QGph&l) zbD`{w*wL#Mr50*Wj$?g4_O0e8)(%hw%H$-w?e=zHNWpK2ii#d|`pvuoQz@Y9LI>>( zGSdUa03Y7q+l$EDKS)=^cQDnB)ItDm+db9d(2ApXYH)&5!sg4Q zhc}O(%Z?YVC}A}+?sHZAtrw%dXPpwT7TnlbYSze`KmI^)f{pEvre>&ng+PpE=Unu| zhkn3jtgUw=0|(eR*t`!Wh-^$8Ilz1s;F9ouI({_*>glbrNA5;MFga0}#V|_uCAVw! z{E>wh=S9p+ZVK6{lWBI4DJ_5dHn8K~W@cv8SgzG7`68sI1lC_)O?_XzggyiuOQ@=& z02zpJJn^;AHS2^z1)SBwbp#&)8Ge7Bx}h=BXGAB9isxEF;1S=Y$J$_#?ZYsuf5pxG z2wH-;)*N1Ukk#bO zVzQ#8rDc@9vRw?0Ax0V-z-|theIukR+RaXF+xd)nkujCh< z1Z`{e7eC?^3t&tL>h;3LMWcn|*yO}(=Ua)1ie5)72Pm0H6Jt|`ylb8ya_(s1gENC> z$mfw)-GM+RMx_%Kvlt=q1nsB22rFPa9Dry&i#}P-4i`?&d!C7aUOM}&(+y21OOsp> ztzeLKPm8>VeJ=U%MUaJ$!zAz~pRLr8Y`8 z8F_?yNoNIP7ZFOqT$fIwk{>Ax6?|wuV>@l}zh56qW>SJ3co+kbaA?TPy2;7OXHm{A z-2c5JD@kL1wp4NEV>=j8R9$fm>XXnGr71QhCKe&h*WX;t{Z=(J}YcgW; zVWgj(DHuJ|SOsW=&!-u}n!UN5^6%spjBSOp0as<1`tec6SX^<|EA>#49uzOX6}wAd zoI@tx@KEBfpI4;n8ykJ09sw8>D~Y3z!7rvC4EbvR`_2WMRDJ8M{Srwoi<5#T1;(H? zBSjOm5avglC}JjhCML|4rHxki2MryKc4b!LJfflu$fHP2lZg2y)#sgEqrw-losVxV zBAtyNx1&MiU$!ha+KV z19&X(X!C8(N<#aJ>JvsBLO+Z)I-TM~&4Vq2hpDKphNNqL zQ^ei7H{hhGF4@@F7&e4r(>&@ZjWOXoDhez`*ERS58=koUs+ruW_+=5Wql$z?(PUz)WLeYd@_l z3h0nf{kKsE+ZrSH#$fgs;L3?w8qVLc)F>u%gS{P;mv;~o>I#(o@l)r)Z`ZL(J1>nD ziE9Z(7Up8W+995BqBA^P+d*`DiL3(RyN%yrD;I{T>n33qsC;)P)+uVX9C|#Fk?{X=aut5d}DRLPxCc;BF5-a)t>TUct#D&5G{4!|` ze;j+{;wMMgR)z4s-pk$3Zej8d-mOm=I>L!F0CKl||9+>#0$VvaZk(RAJ_*Z^05TLl zbl4Ar7qBy=z|hY3=F8zdaDWwDra&~5g6Fn*&fN$-#DGV3mS1v^wmD$%>ECBZrz4&n z+BYfRpB}o;8T_-a4^OsjolgggyU^y3YPCG)Fqi|!Ou^e*9%Mo<5E*aJ?KDYlG(|Lc zSoTIXz8@4Nj-6&yMx_fgn6bJMU?8?!=6>(~6bU{i1%^~Pm~4QE;L540sqwZk>nHha zI=W|?R*0WDD6%nVd$rAho_R`#OQ|iStUyurz*s(Dm-=GYebQ_Da9Chu?y5eS_2Q{J z2d(7Wh}w}yQhKidmH;v3O4uql|Cq`l=*84tU9@(4*b%gpNUh}L2qAtc>-&FsRLaj83TJ&EiNm& z304E~AQ4o#hI?TGTTh&YcY$FNp7yA#8$GZyH$7*s zSKy1jframE>e6$?-q|nyxOC6W{VVQ{K4sl(jq7`*nKd*uF>`hejr55VC!oTcV08}> zdk@OE$`}&_8#yPmCsY6iCAB%WE9i*dvI&(QTcey*Kl%^V)k_OL45hyH=bluXBWOj` z#pA7V##!L%^!Ss)j0ND!BxI1>psA%r2Oo?=1ik%%QV`|I#7$HoOszTVzn3q&rWPaw zBu8p*=jwm@Nvd-X+n6+)(dnx)u=@BpuVc;7D+SW!2U~)X4D)HOSR$Won6}Da5j%RG z(8P`;j7o(hB_sdBgqI^2Y@eGep`OaCFTH#|JyO!rj+&YApngQQE`JdfuNQSvt!fw% zCuC$|(m}IPjQ?~7UfY2KKTEE6#Di%@tVdVSD)*T`yO2MSv6uK^X)S^V@&$-!VN^`5 zxBvGsVln3H`12n$SF-+LrA`8>gs*t3>dk*26NR6jT`)0sEQU6FjKaI}I96dG&{8BgB!tWh zFZI^ol0UWligL?a)!fwQiIG}3{L+4;E z598)FtW$3V=atW+7sc4Y}1~@S>2(&SLgr|)|KY+xw$O;raZrsRz33KQx<%N@iaU=oy zsZ}V>D72jM5D}DM#^fb7KvyUYj~8}B+e3jQ1L1ab+;TULKUYKvoJ4g(FnLJFEHGo> z#&ajdixELMPuJ$lO7rt2L6*ZDD2MYWdGr%egu_FlP!@%WH7e|QDvWPhbC@0-CG%-h zI47uVLKoRSP{MS62Dvuu2WV!$T=H=p4ryl^B+R9Y3+@R1vkr(ZWiD%+F=Ysw3V?}X z!7fGSbI4(W?7QZW3Jl{KE9(@?yl22EO2$S zb0y*=XsUOxQ2zcsOuuFhz1iE_Z~V2yTvzN!%pmiwB<#N@$7|eg1`?vf@NAz65Tp7WoJ&w*q1n8)D4`VZz-QYdL?somFBh&{xw38N zPAVWV8>b?(2ri1-hr?a6UsX%?i@pfSD( zK9LTEMX$(W??pKnW4vac=H_OR?AunC%$JV6UK}do2*QY(frp1o!-wsOBJALo16;>} z2FH!1|K|$4gBf^uyia5bb7^{pX<1p~Sfdgm2)}FBt~_WTmYu_i--PI#M6R%51FM&8 zSot_=((&D$Lg&P z7V1Kd`Ic|r*bsdN0MC>0oLR~;k7JPO;=7|+G|MYhOBwA_7;MQUQs0Q)!fk08{EoT1 zOM`#{pOIvJbpZQ2Pp$P;h-DiluvOmmrI*cOz2ZaFU{-5+ZfiO}8 z5hQDSxli+PY-R;4I}jP{B)ER^3WTBp!WvTg2$TcO2h%H85DoDpo;n~U6^#GhjzAOr6$DAW5^-P8nZ%|QunTaDLoSs- z70@qkBG(2D{f%wzMDv=PB<+CJLF7GI_@K7;HQ*02P0Q&`sN%(y%P)Um z3p@Lpa9-t?=*~jctTeYhR59zSagi(0ptk8K;RN_z{_UIIt3JU;K_?Eky`xo2tAunIW*q3|ro3_B z+}(KoJeLtJFo>}XA)r4XvM|HGM3ktusxg)=1}QTR6IOMVkO8Fsu;~eoOq|%vnwa$zgswx_&^N2lG~6!Q~-|$pSgO9BLDj40Ac_nj(cn)F`@|E6gURCdYnqS&ThnNN`7N}vxm&ps`(E}ae)DE(Sbore_v^aT zGl=ZpPlf59ph?34!JOG?e7s$hsJ&(dc(Xv;0sUEgUd!tZ?&LZx2OP4 z8QFSyaRGwC+c`r|TSVoLbLxTVE+kcmcMCo18mbRa3s$($gh|-~qF`f_Eq3PU!3EzM z#{g@5Sr`og&>HCFBKZaWAjsR;o*QK;T~QxXIiT0tw91bN=l~!=%KEKXFpgKPd%&y^ z89-~o+a_ngc;2%j+6IxAWmt1bQi+=eV-IsI?zo?EkgTJW42yb2EWfQAUqR8+K|=fa z^GV=U#9zWAld$JXV_>@;l!7r+suGe4+ahZT^n*q{8R*V6Xc&aE1SGksGmb@%ja zzo)uAqGnsTN-O^d=!yBC-0cU^SOCO$q406{ABaSvW)7qa05Jf6^twQAAHq}o`1^LZ zK2Cvqs-+254$@|3W|+rSV8Mxq7Xg!sib|RPCU%%Xnta31A<=L-yfr5mEm4#ezsOiaPqKjju;Zk$03%Fh2q(nwz;PQ((>_Iu*a z-sHyhI3v$b1|#}#kp`p5s3PC$>TT#=be!@D}zqJ_YydI@1Bu3Xz zgHe6*8WaZDO?l|BuK}xsl*V!9Wnr-qK6$j!xlwP>0J9Ulv>T>2r;$SU->V2mFV+O! z={x3%4MqsN-Kn|lM*x;y^9~3=4{?E3gT%l17I?vAhMb`x2cWafhWgnDnbCTgFI>(j zU%gKzkbj^=GYhNJ8qaI|^&DDwP`X5TzgMr?3||`WF@CH}8^^pauAvC`2Ve(q!{D8| zF9QTh0%gpyYzRWaUKG>ImnZ(=q;rsW9hP=znfK$#NKL!y5xE7- zHO6ZxAOS$uB`P9PM*V;()u+Gz0-l(3VqtCY_sGHzAt=L$Z$Ds!iUmO_KeH9We<7qo z&(dLJ+63Sm`riB3i(|Q$veRuJz_w2BcyDXi5Su3*GZqm`RY_O4UH@E>BN zjngSxgDad&^6bkk1zzdxU74#!qqH#DWz87|EDg4#Nw&&v>#|XPyM>F35LJ zOJGz)JrYp~d9!^^uG=^M~`WN;Y8^fl&z z*0$THHY(jj3u@&!+7g0TeiSv4>SFMH$*T7vBr0v@kz-P`_q z=mLw7kfNKF4f_^KLfg>jFzZE)(gI#QOfwN9LFEzU_iFUQI)D~J`sDc{f-0|?|AYO6 z?Nb5MO_miOJ(Au8UIB8R!jTrZVRAh*jE}-*Ie9Kz67v&arh5H}Sr4Zcw#Oc!W4c6| zTVY2P5J}7wJBm04J{tQ-`dVNFJ+f`A7q5hbOS#4r&c<+rCyX@CU*hr@MuQw1hsD*I z=tE4uUNzx)b5{LP5UYnD59HZlnqkZ-0)Z!YSHb{5<*`UJ3*G~^|2M5P%BTnn03c35 zHQWbL`fIa{sn#@%^`UC%y2!nDgHo*|*ze}$a*Qp!#!`Byl4GYqvm>AX*60JPE~iij zfs&5;_XGg>Qtd_WiI5OLEV>xl_&uz%zkAxH>zP@Nb6m2_`0DQFMO`s*DO-PN;SCus zyO;H5N1s%h1j9z9>qY$u7l6o-BdMaIXMbm?#zKGQ?1{Qv|5Vl%R(QY2{_fX!3e8~U zR^kOF6CCrSbJQg$Uaa*kpI-n+6|x#o%w`8FYn<#q`PEXUCBs$K)|>92QLCoIZ=24J zByO@qxej9jp;P%NBVjt<@cJztmm=G2Oq?MF)IpR810+l2!xO z&ck$Ccm|$!Z@m}xx=?B-@{-88k(-xcJhg|%Tu4d9XN%wlZRWRE=`_I2L#5#$24Y(_ zj+u}B`8*JmJNx|C-|Va`WcX>{P5i;QKurFzRJ^onC)XnIITaTN9v=Pc``Lq6ovBTD zjznTfdQC7tI-YfWa$Doy*ERz$Oh&^j|bMi zsP6cpsHoUAT7_RRmJlCm&aAexa?Cf3LhTyK6()6i%??QbMaqlkZv=ljIyzcqWGzqd zwuoJMvn4)8p@D&cMFtWHZ!Pq%Mija-Ee>RLG)W;MClw;}g7n~q@B za6oR??!D*<4#3{^8hCW*2O=^?B7o`bf(;D~q;LU{L3rv#uQ3k@4Mmz;I0Y+)od3}^QfZ5t~3O0yO7&webI))B<~RtT06RX2g#&sg-fq24g#e{S%vlHx$?X3 z^oL55?@i`-)g3_E=MqTV4PlF?o-RBa483P1Lpyc#_dZPLOj`CXD47^`bYF;5D)~Mv z*_M?zQZfH?B>Pap+sxv)p)sdhGJ;&ECgv6)#T|cXLl(F0)j5xlVXE)Rm>w*9Z_+U| zyU$_&Qt&-IGU7-X=)N@ZqwS*0%gW9Y>>+#TiiO1*M6Sl8x7C6a zeUMJaC!htKI0!@nAV)(P3ndMMT!cT6n;TVdnG%auN4ktZ!_@A<{O?L~$jmj^OBg&PB?NebW=C=8 z(P`^h3|75Eom^E>@#xtzfoDxS7=vb4W|w^5LxSwllF;zv$|UQ!#l_C@)$x}cr5<`w zdK^RJb0>va2jz@DW*E1QbSwwf&<$l7YO3_?(2cF69u1D~+Y+qKcS5^5q{v)=hlgiF zm=jAd(YtwT@rtT0#1+*h$k#zt0sll;52r+`@wD79A25T5tgV0h)Kf*&{Gc3vgiL}k z24M5xXNMWq!K@=wLYT=$<4;BTgpd==6BMrzdSi&rmtrrh8i4m5J9iSLT399QV8p^M z@{h7oQ$NfvAb~+Py|-Ct>~Stwd3^_RQNGi%9dee&WYCvrOW&FB)}*EKHW8f3=MMa* zv40fQ{X*XdrA@2>JU9cmII6^j%9f}n-v&Soao_mrw z>E=;J1_MHw;U-z(v9Zm;h&Ui3;DF93)FYDMcM*63-XNT5LXSXC6Y4lf9P)*?t7>Re zLi)LSC;yjrxmw82DAN@^{N-}x3Z5Gd9ZU^OylLq>5RbkF01nXF7_K{}q49TXut&C$ z%=IwThe3f`K>}ttU1-G8PJQpz{tUr0>{}B3hIOIFIaaUCJuQ1Q&S$++`**??ji1fH z48b$ibq2FQwIZ{%BHdpU`|&t%E_`RP>7aW`C%hmt=2^}mF&>%#(Ri}5#uyI)Aj*@&?MFzT6l%{43zSlG6hk4+FdPr*9bNLcaI|o@8#ZptxYTk0 zK&a3j=9LRte-t=_=d#-j-qJUj04^NeZ(ISL*GZqgr*FlU?#{lp`&hDBQ%{EoQ`9}VZ??Et?Z#e8_;^roarmPfm_*>gIM^=6jk{Hm`{86G_J8?(RJKe3&L+F3v$B6#r_;FU|XdHi&Sss&c zFG8!=5aC;uquZ+6KACjThvog)#22r+=)XSA$+fay7mkFNI#0Kx$9c*}$qfoJHxErd z3T1bz)`sI^<^nltm4{XqfGxzfg`MX|0b@{VUKk2hSB0<_4+juUu)pcvAYxrve1QRg z-WaDt#8p-dyX%6xwhH;+ljA{Pp9rqw@1DVc^c%PU@Bt)uI3u%5`85Jtn4-X-Ae7rG zOcusB4+8Z$!z8$apWhrcTVrLi=V&D2m^R}SLn!y^Lo3s*c^^Zf+6SiRNz1QY#H+W9mrnCFIU)BlgQ0^OkRHjc$chU1J z;C)QYWxq0z@i+E!cd++Wp`00&-Y|DU~`aCDER@@0?cg_7m{-So5^jqaw zN2J6%atJSXTa z2vj^giKAy>n1hegD3J&TrCmkle;39VM^iv`*>6!R)Jy%4ER6kd{&HQ}=3sa0q7S2e z(-W2Py%&EDB%18~Fcoas2=p-+)Rp2lPE5X_nfYekMDvcj`W{3nKU{F|MUGiD}eMu z30*E;x<|5LTWD}#(hh{N_;aQNT+=ZTj`MB9q_y{C0NVL?BdV#`#qXDK@ zTLMvDCIbV&M;Y{5H;B_hvJT2+4;k*c{^q#KI+pRt!3U6|rp$aeKjAa~b4xH>0g_77 znWoj&zMGV~pM~Q9$PZLyeu%5nANSy^?+zESqoWjKBo*0_@YczVTRw~NIB*BX_cu#; zaLU`wer@rh$h5c5C_nPbzaz)~epX;^dE@yeyrlyw2Rx0$PT)Z7-_HVO7clM>L>Og> zMMv0Y%Y>{N&UOD{S2$BZjuKJ+fZd;h?gsAA*Q>N|0kzko`ubbp9-u+hR=4?;ek!;? ziue(MLRS)!fC*!8J4RF?T)>4rP~SlKG+7`EQw)Y4c-5p5vb+jIgk%&H zbQrh*Qq)Ked6U_%fYfXb@FGgZu0{3*IS`B=kedxC^~!IMWB=s|&B%ZE;*S8=?pOj! z-9QckX5BW>7co7aG&;8o5!~wdaYnFpw}-0`Fwj&9y7eU`?VNge;XYoa{P58rg#%Ja zg8xLQ2!!>pxj8QuBjNb-!jaRzlNO-P&BN`*xHOCxx z{~LwmQu7j^OI=mlx3#PO*x}U4UrnuS}D)thyNkekI!FuwR6ks?)75*!5VrYtTs) zG;vUi&gO_Ytf`)O{O$7NLr;$9j|8osoWHpxK?z)1IpMM2gM(M%cR*zed&U$kwV;eSY(W5vmc8i*hNe3co|Tp^ zW(&m^!jO<0k1~I(d@nC!%NV+G^1>_u*Dj;19{y%_k#%nVLa`qpY2XNX?n=wWU&F(b z&BE{)!80#Poy3^`XEmoWA%4l9|D1q3hJyd9G9UIImFz*80(q{1cgGs_-|Uq!{sWdtJ9#1FT*+k`nDG3iW_TcYOr{|b=q031w$}!U^(Yo zzS?+xOL%S&E6{mx)Y>9T+;ZM@loW&B3{wJp0eJxf#(-ru58^PmxXk|F4+BBT^OJpO z#qW)G?}{$ga4B*%Sv%{c6<0UoaF9cd>rug!)7ZX>3t7b)se)di=@*hJpH~!Xcn%HS zuo*iLII>w@_*+13@ZwMk+_%TS?i<4hj9zufg~C3L-p`5?3Bcr>%YVhQK^W4m|k z*cG04qBl*&j`}9~wtC~1(y6s3Z;zjqap01$%LeQ~H%~Xj=5Wj0(Q&P}NUXQQ7eD>G zx}Q50YlNr9er;jqn%Xkm5r4$E>(~!Z69960FX%rvjjMZ1pR(sw$}p)JJLSVVQxyMF zVv&DPP~f$kf~e!B@D5s5@^y(N8`Q`bZ5Cc+`uS6H&Z}c>OH#7^Ese9*)@!|^Vq(g_ z-CR#2yXC0M$Tt1GbZ2dcD?WHHg!-GbIQ0CKC71AfL__UWQ%dENNJX#=sb5A1Wann;Ivfh~nNsgl|8f%vtX6o##_nQf z{oPOg{rkMp@!lQ&%Ep~tNy)$ZIV(memtJO3l7@`A@%2lW@R4%tmbr7nC)R5F_G5m< z(@J?KU8r@_bGv`adn-5E8RfNn_r0I<)(#2^WH}8}DKlp;j6jm)68W<0<(95;GX6o4 zC!*q_E4dBR&ZujC=&a0Rs*4Nj8v7)|C3n?-A;9@h%iynES@4SYo?iF6ui>VOS}lzj z^RDm{+P4ZWy41U-aF%BOc{E?bB1^Y+?2-4n`LA#7&}>h>P~Y=_^bGfRQ};j2VFCVQ z9(1eAWSBTP9 ze_K;k^)Sj+(y!+EmiKw*MI|Hx`)Wq@B^1SH&q1T^3)9~>pFMVI4qg1j( z|8b10-2O}ZF2!@bt+@VZOB>gpNx7;|5ex^b_(mHfsVtdon3f;SXdl@TpR+bL?#r~# z|0#m&1IL_Oxx$z#$?g5ekEYI(rw(Ba_MWz~K7XEd-##Iu`yyK#2{6i{;LN0~8r{w8#%N+euJX$ocMcTola)`br>&{L z)oXGsOf+Fd*BT`^MP76+7j{|N#Cj#Qu{+5DKVpaKFch+lj0JYf1o_7f<+V(%Acu#` z?Rrg(F3PvUZUk2WS3Xc+)oI4y$<1+!Z_yULVbEE#1nem-84|SB z;g^Du8Yn6_QQHBgz?GZVA6; z8C$K2@S^EHS-Sglg^M11*a*7Ko58`>JAe0a0IQ@5z=~Pji&p0YJ8_*)XC~+%a1X}Uc7MoOwEXAzR9Q+LIB^iaMu^fgFiewIo%Iff8$2oB!9gPwU=e80_V+otxG3;i@a#I{ zJCl+-_Q-A>9d%q+kSDXbIk`ajt&3khGAp~S5fI5(6BFZ)Zn7;>nsHZ!Cn-(MUEYO|1Ms76?>@{TQB|uQqj-CS()^X1a~xw$Gq$Tt|JmV? zo4T3UL{}@e(2U5a2M?~-?yo(B9rJ^ntNPtc@yEpX_4qVO`cZqX{+1+s$gnln%BCoP zcRXU;z;EANJt71iy?A|N&)?Fnt4UNEE(N2rp6pz-GH*slH>wvsc>SmJXb`ze>7@-A z6(3(cILPrd*@!LPK5+=;gzv>~wbw(1-Zj+;$lW$UjgW(9wgzi{?L6MbX;|DIY>+Dr zcc5&tNI$5>$;KUD0dtm_$*~igX`F0N0Y$vVF2@gMj@D~oxaTIE_uOgR|1DdYF6B!> zqSGXW!Yl1AQ8FdAzRLXGv*(wN7C%R=W5Oj%kLywHqNx8M??$26o?<+);sQy>{Q_sj zq?-0Vh}g%*=^mt(%~#PV;8G+dV6I^mAlnKDm$fct;nd#gG;s>V4Op-bs4C@(hU@-s9;Fy zzp&Z3j#qFoRI_GzRwdj<;E6{ zx(95^3D6pwn`YzVdy1oUv-!+gtYzZarH8+MP=oUM?#3Rbh+lb&D+-MARa7-AL0XwF z0n4oLc5TGiUy1&Me<#kN{o41Ug#K7v3&ml?WzS5i*63jKx0E23r-n3SEo(s`RAlB$ z=QECa1MewZ_0X!oo$mQR>Q+u?K%)6O6Nf%PD{(0gmdIO7N~iKpw%kg2db(9?G4!iD z-RPr5(Ks1SlwmiK^&Fh+*t;2xJ?mqZaar!8$V=NJB-)rA91Ys>Sic+5Q55*YxY zDymvKT3WM?5*d}p9i3$f$3GihINFxYD&B6bTwBWZN$QUUcKP~){FOm09$}1b8@V$x zGr{g+LxsJwa~m2Az=re%)D3ysq|_m<;r8rD`S~p8C+zZ^Qr3rroHs08*rWb57PJ&y z@dGgq1E-nZ|LpkG+8SKwA_y`_HR|msviYW^QM-R@E9pEs9S~_y`RV#?B8>B%3FNre#qHvb`spaap{}tM5 z+paLtW_!h%uCqR=k8QrGVnes5BG?j9adA}>eZ0Shvb#S%JP@V6=~-Gy;P`kZlEy0V z1;;>-HMg@B$~tof902W<{o2nzFV5Iy&suH`VYPPR`)tjLKjK?C#baK0pUSEB9%!vC z(wAe}s`1lj@$~a7?dRh7Js3zLp9SKem-yDP6Aq&9K0Y}7#qVa`)#8;OO0ypo7Sd_O z)4u6{@Op6Yf%|NQnJc!`m!<80K90`WbJ}r(udkNFXs4*k4inNyhY5xUFF#!c^xpaL z(~_oZS3WyHXNGCY#!mbo5{Ne4X(I0ER{!y_`e^)F$b#me3H zR@_tFm_2ifjbU{V)Wgt$%(ssz=Dj)yEgNSkeIOz$5TPf~F|?06GRiL+1|y>+lUYz8 z!pthPT$bP4qf2I7f$EQW$svBbeWLm*k5C5a45hIZePfuRFeLwAp^Q0}B zsAy2;IBL-1iGo*oZ;X-1KNa>cKs?0Xtc!-f`SD}N)vL1(89z5{@IH7=OYUALL~iOJ zB}jez#20LDw4b~I(c57tW<6!3qZ-qw;8A$m=AMywnKb8>dUK;DPI&Q4&CjIm;HdwG z{(fuhfv!`-l@o#xIwnDNMd?rA-c}3(WkY1Ggji~cHum1> z0y+}VWRK>RYFHPL4{v5=(I8&iE|I=M!gekg{okUpJ+E(Fyq~0uOS3KcYml_Ipp_rg z#SvNslqMluUxrR`w+7DhARD=&4GAO&RN~k9@lbVmCYPldx!Y&_6kE&PA}Txd8nK^p z7#4$`EXH;*h%^+Wjw^M##8mU11wn|M_rkh}{zY+sB6+ zY+5GQZ`eTlD5a227_n`PBlbt{GlVr#1Z&88hu%TbLbZ(5fY`y?ppkeEvB)93=kD&3 zs>P1>V$c1aeT!U+-seAjuuDC2G3{q=fh8p|({iLk-{@g%|6qS$Dy#NNhQqzgIyx>? zwWAZ-ocat@*<5VaO1CG_5b`?u?e;b6L^55ilo#F%du?`1hErOiS_3 zX$BcCx=ouxIHc~r4!>(Io_(b==5o)N(5qi`?H3;hg$JrkX)^}}+Ju8?2(d6VFpgjj zT8cTFSAm4aA$Ldh=y_Hn**g1!ZF^l=$7WY=;AIFGNhDv#gGxk2Rn_rRr%-1M7d(09 zjFQF4y(WewRX3d02AF#Z-nxIr_%tqlW3^Iv;9FLBP$+QSfl=h3t#-Ck&bj@jtMgli zdNzDORWIhfM4h+0Owe&k+-=XF79ypFe?ZHJW{rr>$Lo^bnyf*p1 zIUT1Z8GYIP%;$4gcz8??>+IlpMTJ0i8n7=M?~JpZQu{S@{7>|idc2FAru_Q7-+W8F z*;mo9rh$$r?xTncCy$exvvP8}2Ws_bY{#5G_G}MjHrHM4mEW9~JUEcu@{1ELKYkeZ zT&UiLuN-uyp0MR!c+%PU3!(4O6D-5}`rp5IpF77g*W_KSrKq?DRr|eYps@Lb1KRn5@KGdN`-+`Q-+QuWlhz+E{*UA^alL0N8|;jW8x9=Go z@-(M=*mnNCx$^@diJQSZ4B@$Pi7JXa6l0T~L5eB%Llxq?V_I7LQc^KU#kk}=-oj$; z*;7FI(Pwq;oFDcNex`Et=vss}q$vyyC4lhZMau@b)q0KhuQE_K?5xjZxCWKf(Je0&lVpK6u z`?(VyUJjfU_!E1zZD`_me_N>ne^G9LQb&3Vu7JR(Cz5v_t6(ACmmc1W8e>y@}69pJT13#a6A@Pr}zM)~o`ONy3 z7B#eMf=9_GArXmi9;}I1V{w)^v(w|}&=&(*<~I6uMU(qklz4c$G_a=`6TJ@v8}~XF zLJ;p!QPG2!9ueUDDTxXaH5?w#|ErTjspZpI^&;1FQWJEs(akv+)bj&if8RQFt#rXuUQjRu91sM2*qcP66Ea5OICWsht3%QN_&?C< zePUv-u~*Pc1gYCOuf@8btLJcNFxNG=&>bID9 zMFO<7zM!%EiEI!1OX1(QF9K~gxDiFr2S5@kZ2JhBS6F-U|GcBDQ#ya7F!Uw4u?Eeg zxPKXssoSq#A3;w@8I&L<8!Rkj?|*IjnGQk;T3Ns&B4+dV=UtE_AUlk_Re5>Bz5pS( z5>&r@cZv|K9SYp`=uyLIgzQxhS{kvnVE&X)3Pb}n)DLc~doCH*GWdAN4s8Gt6@|)x zeU=~XyDNf1=+BtMuD0-8l|4O>&b8<{;FLaA&_vXsAf&JzpF@Wsw2D~B1H)fFOG!y8 zF6Knb$`|W%wzk6|igk24#9B)H*IFUaIxAwM#yrnfTU$#cJkgy~_z(h}@ZP^hM$p$A z0B$^Z(`ac!;~NTftf*67u(5euQWA#&eK>yLB|pJ`U~nz@n+q4ZAajD8%3ORaW@9Jf z0+0Bt|c>?cp|*YyOs zbrl`v1@hzNbH$^iGqv>N5Bm9&Iu;^qQI=d{0J!jiQPR`N6sGJztZ4A#p@EI~svVD*<%0R;0_) z`E)r!!8&B*k{q3J+?C=>5d#178my#~P;Ft@yjdCZ9uLHZfF3`N9z#a_;N(eWLf?aM z3{;AHo(NoRb2y!H55#4!=~|Ol=n_XUjOgvw)YVlF{4JT333yYEw4og74Au;e194wD z?qa2ttt}t?6qwA6@PBxE9CW+E;_ue~YwI{4Whg^DKQ+}8);~D-80!jl9X2siPUHn- zjq0sh^E_4ww}T1p2rON!!w_>U1=`wG;3|v@a5r90UE19&d&cu2ZW%_#up#j&$)H@^L%h@L*d@m& zA5hzerGjsSFB*q_NjQXsnvRCo_Ff%w=wMNT0xD?-M50?n)-Yr2M&XCZy57FNeIg=< z&|ry4hwW-w9}AJ~vEJ+rDK;@U_CFi=`!KcOT)&q0_jR`b*oCNl!`Yo~g9s~~&L7X} zROR{+??rc*uLDA!H-m$rS3R8FhkiA99-==!+P%veeiGeW5Q%H`{d!nhmesQgRU`{vDk=+(ZR9k z(k-1~0fQQUMYaNo51MV#Wnt(2Um+Mw7sYutfX{9xj@Tl(M-+CejrW$`;6X!j((IQOlmy88_GtpEKX(2+AKC~Cb9Wek>I+`?F=u6d zdrIuu-&@^(4RV=Yc^}%?i;$1(w(fM2@T$F~ki&bKxewS^pS5{ub&Hg92yviIBrgi(?U&)%9=O~b0B4IiH9d19m z&fWaZu7c^n;NP?{`ZN9PZ04_}d@r`YNt7=eAAjd;cM5^@e{Uak{He%QY|`$>)TGN3 z6m}t!>K=2=ad#i*McnwCeXEMf!S};$>kU5^DxXne-~ZQ0=8|{Sr`s%rZ9(qk)eQ|| zd-lXI1_c&+ z?DeHvc)Kvao?sF{q}vScjv$1~_g<89n57#nU7%1Sjq3gV_qZx|_HmuI!*6=Hq;4tD z&>FbO^;&!!I#GC|sQp z#ki)M%{F}W>ue~_RO{BPLZpr#so`&UoR3ai_;dJ`<9PlABO0 zko@fmlgpQ%r>2-&TdQ(E^ESgTBe&7f)m26Z*K7~ntBD@Z!S;t`HI0#ZZpkqX%38b9 zZIYj+-K^G{>HoF0N}P>`C%~L5%rgARlg`zwe<(~0ZnNZU=6sro_%*k%*;HIovi8&H z4h^lVHKnJI9BI&zYtIgg%2PakydmFpj0Yhqp3y_D!+CLoX-(e*W*4HJ;0JV^cJL=> zy4bDa_WZL;$DPjMK<>2`inXiW!d>N4LnoV@8bbQ;NC{B_q7-q zsi`8_3~O!FFf{_gLmlIIi8h$AXFz&?X>Xm*=l;$EQGGj);nS zUlOG#*UVY_QOm5^dz)|L88>ET*&i(p{C9P;bg*AfUE)VVDK6XJccEpURG~7PNQgO? z=f}sF?ngIE{%kWYD%m-w7Q7u6=rKu)6?`acRNP;Rf6;Z0%|ypiM5LtyhVoa}PBHr` zoW43M$R-_d;gb8&Qgxh z*@@U5p%r}p76{(=U-55K;8=Bi1s)49AOc>{zgi1j!itK7C7phY!}8#_&zq<-7CKi? z^o8*>Pdm`852}`QnAs@g{nsV9^uiBQCH7wIkgsgd(*_==WyE5qT3vGY&$xV}-D{(Q z!f9*+n>tIf=C&Vwt25uiNZom=fcK(C-iv?gix)48ie51&8;|fz*wWEf%QzSMjs;yf z`u;%NCe2Tc^1&GwqjDxKWiAXQFE~ihy^Gl;u(x-jb=C1r&59!$7S$h%2fr7`7th`a zY>8KYU2Z|kNvnAuVD?8yz)p|X3g<&j0GTk#rijha)P5@@L{wJx!|T_tbEr-t3o$jl zj*d$7Bw|n?Xm*GQ$bmpu_M_MHnDgWrTuRg0S}K4x*>T(U=%{ZBibKabdyE|B+?2%& zdFkv0dc_xo2lkAY?C#QZ5TvU$a69?sBiWnQAviWVEuS>ZPY7%2&$@kIpfT?gk@ZZ9 zTFcKS+QJqaRb}fUG7x3?k+bNet%GP;L&JF0Y8Gbf*{&ro;-BgrWn9`MK(ALdLf83s zCfa4z{-Yo^Kv>(bg_+~p+Ng(JUB}kOg)}x=mVeuS#Jzf3>LosSgbP-`pS(!CXOO$6 zX7=~UgAe(tRbz&XbdZk3fMTzrNKR?W%Ynv&lY?qI&U=f^(mlRyFXH!D;W>xo9Zl7D zIt`6sW+H3{y<{R@yr`4(URVV<#xVbm*5UH~pz7y4^zfN@d&WX)MCbVUCOR&eM@Sw~ zP5=ggR?^O{H)4cbr>a`g)n05?vM@snUgP7JFK;6@Of#(EhYIdQpD^)j)nS(S9u>8H zw;$Maj)q^kL;D0ZZAe+vR8(^E?UuU!Fur0ulG8nK%9SqMot7~^>hSOSI!RByu*)VM z8Vi4q54YJpe(@><2C7`G%UbIB^O3|fQMN-Gg7aB9(N+U&6<8Flc)#nGJv4M$V%8b^ zL?wN(bmyIE`&w5`Y&0%1_O=(x%2MC<@|7s(aeCxg!ie?XYW-5$mWpwNBa-8SLS28S z9fYUsKe$CXJvQkv>E8^U$gD-O24iI)%l zDa;@`IJe`zmh*_E%a4`tp7h!L*Ps1blQ_w-!`g(=-HbLvcv2)|HjJJ<{>b3V~uqfuu*z?#^ALo7%m|zA$-8)WpLr zY-8kz{cyLSV_iq*#AT)bBQyld`()=9^7(%kl6$_0+zYojf9Vbv^6qi@t75*)FX5|# z`{ZALKta(%uHSsb&AZhUf78f=@>a^LgO|2dRCiEOZKSf=NL7uIs@l%rrEcrN)7V2} zQ!kI7^wHGP&y%ME!O2hiGuk?a=;#`uyVp!_e{cdcIA~>fWD>K*&e+5>*2!7yb|=%* zbIdyCan3C;H}A#m_5~+Gi%a;Ig7*srV`z0FToptjBL6-VMIs{GZ1ePJBa)Va_aCiK zkrup*xEFlP&wFsX7J}2HX&29*JFrg9GH#v5GCs92RT>7ba2mAv(zxYiT^=VQB8nmrk)MUl(~0k#A_W5Ymjd|xFQ!Qz z&*H{J$u;i@PL-T)W@hG@o_1lkJ9+-x!K7`L@yQv+CZ-u3pJK%FoDs8);b9v?!&U}| ztUMdEVj7%az%)+3X^g&sG5SmvdIv1@^uJi$eWP^un(68ZuFmfDHL|vXU+?Y>uCCru zy8A}y=?|{n0SkR53w@?B`b}dDtVND#Fu0GQ;kDQ?+b~;#!80~7&4hJ^N!u*XpF5bE z3Qm4zX6A4>=W)8+xaK_@6CjUg@x>I#zxKWbUQC06A*6|rh={zPC=wC*8QVNXT3_oA zYX}6EHzrDpYq8|>`SE!DEO-`idwd(yrMbD_gvsG_Gvk+$5oW^*t( zIg5327OQQBiOCtpCubP9&M;=3W^7^_%fu9xaXX{qc1FkSn8)mxEt}TZ+V{roSjO#G z)}m%?Vw!R5G~<)O*R|Sau-ay^*=DiX96W#S#BO&oHRWP@+QrOF@NzeYGdS^?n|m?! zaeIQ3ACK3M&lilJ_4gn+0Sd15DbVKogA_m_BJy1nMIs_^fmbI<>(iw5wLVn}1eVt( zOPi-lOKZUtTN#4-_qK|XKk%bef(>`XJFIxXMFJ&&ZBqAa|L{TIn5+?pJnqHnRZC>kBrlqBowY7}jzqXbFEG`8nFTS<4xEP#7eb@5& zHcf24bG>*S-}+Q*X+7A2Kl9bSY@YVKI`MgR@}uYx5s^^+e|O~Eky<}v&Hw-a07*qo IM6N<$g88E7qyPW_ literal 0 HcmV?d00001 diff --git a/_a_p_i_8dox.html b/_a_p_i_8dox.html new file mode 100644 index 0000000000..ad027bab77 --- /dev/null +++ b/_a_p_i_8dox.html @@ -0,0 +1,78 @@ + + + + + + + +tgstation-server: docs/API.dox File Reference + + + + + + + + + +

+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
docs/API.dox File Reference
+
+
+
+ + + + diff --git a/_administration_8cs.html b/_administration_8cs.html new file mode 100644 index 0000000000..0269829f2f --- /dev/null +++ b/_administration_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Administration.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Administration.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.Administration
 Represents administrative server information More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + diff --git a/_administration_8cs_source.html b/_administration_8cs_source.html new file mode 100644 index 0000000000..63a6f79ee1 --- /dev/null +++ b/_administration_8cs_source.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Administration.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Administration.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
8  public sealed class Administration
9  {
13  public bool WindowsHost { get; set; }
14 
18  public Uri TrackedRepositoryUrl { get; set; }
19 
23  public Version LatestVersion { get; set; }
24 
28  public Version NewVersion { get; set; }
29  }
30 }
+
Represents administrative server information
+
Uri TrackedRepositoryUrl
The GitHub repository the server is built to recieve updates from
+
bool WindowsHost
If the server is running on a windows operating system
+
Version LatestVersion
The latest available version of the Tgstation.Server.Host assembly from the upstream repository....
+
Version NewVersion
Changes the version of Tgstation.Server.Host to the given version from the upstream repository
+
+ + + + diff --git a/_administration_client_8cs.html b/_administration_client_8cs.html new file mode 100644 index 0000000000..79bf51c886 --- /dev/null +++ b/_administration_client_8cs.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/AdministrationClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
AdministrationClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Client.AdministrationClient
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_administration_client_8cs_source.html b/_administration_client_8cs_source.html new file mode 100644 index 0000000000..4aeaf06601 --- /dev/null +++ b/_administration_client_8cs_source.html @@ -0,0 +1,99 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/AdministrationClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
AdministrationClient.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4 using Tgstation.Server.Api;
6 
8 {
11  {
16 
22  {
23  this.apiClient = apiClient;
24  }
25 
27  public Task<Administration> Read(CancellationToken cancellationToken) => apiClient.Read<Administration>(Routes.Administration, cancellationToken);
28 
30  public Task Update(Administration administration, CancellationToken cancellationToken) => apiClient.Update(Routes.Administration, administration ?? throw new ArgumentNullException(nameof(administration)), cancellationToken);
31 
33  public Task Restart(CancellationToken cancellationToken) => apiClient.Delete(Routes.Administration, cancellationToken);
34  }
35 }
Task< Administration > Read(CancellationToken cancellationToken)
Get the Administration represented by the IAdministrationClient
+ +
AdministrationClient(IApiClient apiClient)
Construct an AdministrationClient
+ + +
Task Update(Administration administration, CancellationToken cancellationToken)
Updates the Administration setttings
+
const string Administration
The Models.Administration controller
Definition: Routes.cs:19
+ +
readonly IApiClient apiClient
The apiClient for the AdministrationClient
+
Represents administrative server information
+
Routes to a server actions
Definition: Routes.cs:9
+ +
Task Delete(string route, CancellationToken cancellationToken)
Run an HTTP DELETE request
+ +
Web interface for the API
Definition: IApiClient.cs:11
+
Task Restart(CancellationToken cancellationToken)
Restarts the TGS server
+ +
+ + + + diff --git a/_administration_controller_8cs.html b/_administration_controller_8cs.html new file mode 100644 index 0000000000..1b60d20c3e --- /dev/null +++ b/_administration_controller_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/AdministrationController.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
AdministrationController.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Controllers.AdministrationController
 ModelController<TModel> for Administration More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Controllers
 
+
+ + + + diff --git a/_administration_controller_8cs_source.html b/_administration_controller_8cs_source.html new file mode 100644 index 0000000000..1b05df23da --- /dev/null +++ b/_administration_controller_8cs_source.html @@ -0,0 +1,136 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/AdministrationController.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
AdministrationController.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Mvc;
2 using Microsoft.Extensions.Logging;
3 using Microsoft.Extensions.Options;
4 using Microsoft.Extensions.Primitives;
5 using Octokit;
6 using System;
7 using System.Collections.Generic;
8 using System.Globalization;
9 using System.Linq;
10 using System.Net;
11 using System.Threading;
12 using System.Threading.Tasks;
13 using Tgstation.Server.Api;
18 using Tgstation.Server.Host.IO;
21 
23 {
27  [Route(Routes.Administration)]
28  public sealed class AdministrationController : ModelController<Administration>
29  {
30  const string RestartNotSupportedException = "This deployment of tgstation-server is lacking the Tgstation.Server.Host.Watchdog component. Restarts and version changes cannot be completed!";
31 
32  const string OctokitException = "Bad GitHub API response, check configuration! Exception: {0}";
33 
38 
43 
48 
53 
58 
63 
68 
82  public AdministrationController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IGitHubClientFactory gitHubClientFactory, IServerControl serverUpdater, IApplication application, IIOManager ioManager, IPlatformIdentifier platformIdentifier, ILogger<AdministrationController> logger, IOptions<UpdatesConfiguration> updatesConfigurationOptions, IOptions<GeneralConfiguration> generalConfigurationOptions) : base(databaseContext, authenticationContextFactory, logger, false)
83  {
84  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
85  this.serverUpdater = serverUpdater ?? throw new ArgumentNullException(nameof(serverUpdater));
86  this.application = application ?? throw new ArgumentNullException(nameof(application));
87  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
88  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
89  updatesConfiguration = updatesConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(updatesConfigurationOptions));
90  generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
91  }
92 
93  StatusCodeResult RateLimit(RateLimitExceededException exception)
94  {
95  Logger.LogWarning("Exceeded GitHub rate limit! Exception {0}", exception);
96  var secondsString = Math.Ceiling((exception.Reset - DateTimeOffset.Now).TotalSeconds).ToString(CultureInfo.InvariantCulture);
97  Response.Headers.Add("Retry-After", new StringValues(secondsString));
98  return StatusCode(429);
99  }
100 
107  async Task<IActionResult> CheckReleasesAndApplyUpdate(Version newVersion, CancellationToken cancellationToken)
108  {
109  Logger.LogDebug("Looking for GitHub releases version {0}...", newVersion);
110  IEnumerable<Release> releases;
111  try
112  {
113  var gitHubClient = GetGitHubClient();
114  releases = await gitHubClient
115  .Repository
116  .Release
118  .WithToken(cancellationToken)
119  .ConfigureAwait(false);
120  }
121  catch (RateLimitExceededException e)
122  {
123  return RateLimit(e);
124  }
125  catch (ApiException e)
126  {
127  Logger.LogWarning(OctokitException, e);
128  return StatusCode((int)HttpStatusCode.FailedDependency);
129  }
130 
131  releases = releases.Where(x => x.TagName.StartsWith(updatesConfiguration.GitTagPrefix, StringComparison.InvariantCulture));
132 
133  Logger.LogTrace("Release query complete!");
134 
135  foreach (var release in releases)
136  if (Version.TryParse(release.TagName.Replace(updatesConfiguration.GitTagPrefix, String.Empty, StringComparison.Ordinal), out var version) && version == newVersion)
137  {
138  var asset = release.Assets.Where(x => x.Name.Equals(updatesConfiguration.UpdatePackageAssetName, StringComparison.Ordinal)).FirstOrDefault();
139  if (asset == default)
140  continue;
141 
142  if (!serverUpdater.ApplyUpdate(version, new Uri(asset.BrowserDownloadUrl), ioManager))
143  return Conflict(new ErrorMessage
144  {
145  Message = "An update operation is already in progress!"
146  });
147  return Accepted(); // gtfo of here before all the cancellation tokens fire
148  }
149 
150  return StatusCode((int)HttpStatusCode.Gone);
151  }
152 
154 
156  [TgsAuthorize]
157  public override async Task<IActionResult> Read(CancellationToken cancellationToken)
158  {
159  try
160  {
161  Version greatestVersion = null;
162  Uri repoUrl = null;
163  try
164  {
165  var gitHubClient = GetGitHubClient();
166  var repositoryTask = gitHubClient.Repository.Get(updatesConfiguration.GitHubRepositoryId);
167  var releases = (await gitHubClient.Repository.Release.GetAll(updatesConfiguration.GitHubRepositoryId).ConfigureAwait(false)).Where(x => x.TagName.StartsWith(updatesConfiguration.GitTagPrefix, StringComparison.InvariantCulture));
168 
169  foreach (var I in releases)
170  if (Version.TryParse(I.TagName.Replace(updatesConfiguration.GitTagPrefix, String.Empty, StringComparison.Ordinal), out var version)
171  && version.Major == application.Version.Major
172  && (greatestVersion == null || version > greatestVersion))
173  greatestVersion = version;
174  repoUrl = new Uri((await repositoryTask.ConfigureAwait(false)).HtmlUrl);
175  }
176  catch (NotFoundException e)
177  {
178  Logger.LogWarning("Not found exception while retrieving upstream repository info: {0}", e);
179  }
180 
181  return Json(new Administration
182  {
183  LatestVersion = greatestVersion,
184  TrackedRepositoryUrl = repoUrl,
185  WindowsHost = platformIdentifier.IsWindows
186  });
187  }
188  catch (RateLimitExceededException e)
189  {
190  return RateLimit(e);
191  }
192  catch (ApiException e)
193  {
194  Logger.LogWarning(OctokitException, e);
195  return StatusCode((int)HttpStatusCode.FailedDependency);
196  }
197  }
198 
200  [TgsAuthorize(AdministrationRights.ChangeVersion)]
201  public override async Task<IActionResult> Update([FromBody] Administration model, CancellationToken cancellationToken)
202  {
203  if (model == null)
204  throw new ArgumentNullException(nameof(model));
205 
206  if (model.NewVersion == null)
207  return BadRequest(new ErrorMessage { Message = "Missing new version!" });
208 
209  if (model.NewVersion.Major != application.Version.Major)
210  return BadRequest(new ErrorMessage { Message = "Cannot update to a different suite version!" });
211 
213  return UnprocessableEntity(new ErrorMessage
214  {
216  });
217 
218  return await CheckReleasesAndApplyUpdate(model.NewVersion, cancellationToken).ConfigureAwait(false);
219  }
220 
225  [HttpDelete]
226  [TgsAuthorize(AdministrationRights.RestartHost)]
227  public async Task<IActionResult> Delete()
228  {
229  try
230  {
232  {
233  Logger.LogDebug("Restart request failed due to lack of host watchdog!");
234  return UnprocessableEntity(new ErrorMessage
235  {
237  });
238  }
239 
240  await serverUpdater.Restart().ConfigureAwait(false);
241  return Ok();
242  }
243  catch (InvalidOperationException)
244  {
245  return StatusCode((int)HttpStatusCode.ServiceUnavailable);
246  }
247  }
248  }
249 }
+ + +
override async Task< IActionResult > Read(CancellationToken cancellationToken)
Attempt to read a TModel
+
bool ApplyUpdate(Version version, Uri updateZipUrl, IIOManager ioManager)
Run a new Host assembly and stop the current one. This will likely trigger all active CancellationTok...
+
string GitTagPrefix
Prefix before the System.Version of TGS published in git tags
+
string GitHubAccessToken
A GitHub personal access token to use for bypassing rate limits on requests. Requires no scopes
+
async Task< IActionResult > Delete()
Attempts to restart the server
+ +
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+
readonly IIOManager ioManager
The IIOManager for the AdministrationController
+
long GitHubRepositoryId
The Octokit.Repository.Id of the tgstation-server fork to recieve updates from
+
readonly IGitHubClientFactory gitHubClientFactory
The IGitHubClientFactory for the AdministrationController
+
string UpdatePackageAssetName
Asset package containing the new Host assembly in zip form
+ +
readonly UpdatesConfiguration updatesConfiguration
The UpdatesConfiguration for the AdministrationController
+
bool WatchdogPresent
true if live updates are supported, false. ApplyUpdate(Version, Uri, IIOManager) and Restart will fai...
+ +
readonly IApplication application
The IApplication for the AdministrationController
+
AdministrationRights
Rights for Models.Administration
+
const string Administration
The Models.Administration controller
Definition: Routes.cs:19
+ + +
StatusCodeResult RateLimit(RateLimitExceededException exception)
+ +
override async Task< IActionResult > Update([FromBody] Administration model, CancellationToken cancellationToken)
+ +
Represents administrative server information
+
Configuration for the automatic update system
+
Routes to a server actions
Definition: Routes.cs:9
+ + +
async Task< IActionResult > CheckReleasesAndApplyUpdate(Version newVersion, CancellationToken cancellationToken)
Try to download and apply an update with a given newVersion .
+
AdministrationController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IGitHubClientFactory gitHubClientFactory, IServerControl serverUpdater, IApplication application, IIOManager ioManager, IPlatformIdentifier platformIdentifier, ILogger< AdministrationController > logger, IOptions< UpdatesConfiguration > updatesConfigurationOptions, IOptions< GeneralConfiguration > generalConfigurationOptions)
Construct an AdministrationController
+
bool IsWindows
If the current platform is a Windows platform
+ + +
IGitHubClient CreateClient()
Create a client with anonymous authentication. Low rate limit
+
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the AdministrationController
+
An ApiController representing a TModel
+ + + + +
Interface for using filesystems
Definition: IIOManager.cs:11
+
For identifying the current platform
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
readonly IServerControl serverUpdater
The IServerControl for the AdministrationController
+ +
Version Version
The version of the Application
Definition: IApplication.cs:23
+
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the AdministrationController
+ +
Represents a service that may take an updated Host assembly and run it, stopping the current assembly...
+ +
+ + + + diff --git a/_administration_rights_8cs.html b/_administration_rights_8cs.html new file mode 100644 index 0000000000..1f48510dd9 --- /dev/null +++ b/_administration_rights_8cs.html @@ -0,0 +1,114 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/AdministrationRights.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
AdministrationRights.cs File Reference
+
+ + + + + diff --git a/_administration_rights_8cs_source.html b/_administration_rights_8cs_source.html new file mode 100644 index 0000000000..8964646551 --- /dev/null +++ b/_administration_rights_8cs_source.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/AdministrationRights.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
AdministrationRights.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
8  [Flags]
9  public enum AdministrationRights : ulong
10  {
14  None = 0,
15 
19  WriteUsers = 1,
20 
24  RestartHost = 2,
25 
29  ChangeVersion = 4,
30 
34  EditOwnPassword = 8,
35 
39  ReadUsers = 16
40  }
41 }
User can edit themself and other Models.Users and also create others
+
AdministrationRights
Rights for Models.Administration
+ + +
User can read info and rights of other users
+ +
User can change Models.Administration.NewVersion
+ +
+ + + + diff --git a/_administration_test_8cs.html b/_administration_test_8cs.html new file mode 100644 index 0000000000..be0c01ac5c --- /dev/null +++ b/_administration_test_8cs.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/AdministrationTest.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
AdministrationTest.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Tests.AdministrationTest
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Tests
 
+
+ + + + diff --git a/_administration_test_8cs_source.html b/_administration_test_8cs_source.html new file mode 100644 index 0000000000..0e5c1c37d1 --- /dev/null +++ b/_administration_test_8cs_source.html @@ -0,0 +1,99 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/AdministrationTest.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
AdministrationTest.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using System;
3 using System.Runtime.InteropServices;
4 using System.Threading;
5 using System.Threading.Tasks;
8 
10 {
11  sealed class AdministrationTest
12  {
14 
16  {
17  this.client = client ?? throw new ArgumentNullException(nameof(client));
18  }
19 
20  public async Task Run(CancellationToken cancellationToken)
21  {
22  await TestRead(cancellationToken).ConfigureAwait(false);
23  }
24 
25  async Task TestRead(CancellationToken cancellationToken)
26  {
27  Administration model;
28  try
29  {
30  model = await client.Read(cancellationToken).ConfigureAwait(false);
31  }
32  catch (RateLimitException)
33  {
34  Assert.Inconclusive("GitHub rate limit hit while testing administration endpoint. Set environment variable TGS4_TEST_GITHUB_TOKEN to fix this!");
35  return; //c# needs the equivalent of [noreturn]
36  }
37  Assert.AreEqual(RuntimeInformation.IsOSPlatform(OSPlatform.Windows), model.WindowsHost);
38 
39  //we've released a few 4.x versions now, check the release checker is at least somewhat functional
40  Assert.AreEqual(4, model.LatestVersion.Major);
41  }
42  }
43 }
async Task Run(CancellationToken cancellationToken)
+ + +
async Task TestRead(CancellationToken cancellationToken)
+ +
Occurs when a GitHub rate limit occurs
+ + +
Represents administrative server information
+ +
AdministrationTest(IAdministrationClient client)
+
bool WindowsHost
If the server is running on a windows operating system
+
Task< Administration > Read(CancellationToken cancellationToken)
Get the Administration represented by the IAdministrationClient
+
Version LatestVersion
The latest available version of the Tgstation.Server.Host assembly from the upstream repository....
+ +
readonly IAdministrationClient client
+ +
+ + + + diff --git a/_api_client_8cs.html b/_api_client_8cs.html new file mode 100644 index 0000000000..dc4d7af42a --- /dev/null +++ b/_api_client_8cs.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/ApiClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ApiClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Client.ApiClient
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_api_client_8cs_source.html b/_api_client_8cs_source.html new file mode 100644 index 0000000000..036f230f82 --- /dev/null +++ b/_api_client_8cs_source.html @@ -0,0 +1,130 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/ApiClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ApiClient.cs
+
+
+Go to the documentation of this file.
1 using Newtonsoft.Json;
2 using Newtonsoft.Json.Converters;
3 using Newtonsoft.Json.Serialization;
4 using System;
5 using System.Collections.Generic;
6 using System.Linq;
7 using System.Net;
8 using System.Net.Http;
9 using System.Text;
10 using System.Threading;
11 using System.Threading.Tasks;
12 using Tgstation.Server.Api;
14 
16 {
18  sealed class ApiClient : IApiClient
19  {
21  public Uri Url { get; }
22 
24  public ApiHeaders Headers
25  {
26  get => headers;
27  set => headers = value ?? throw new InvalidOperationException("Cannot set null headers!");
28  }
29 
31  public TimeSpan Timeout
32  {
33  get => httpClient.Timeout;
34  set => httpClient.Timeout = value;
35  }
36 
41 
45  readonly List<IRequestLogger> requestLoggers;
46 
51 
52  static JsonSerializerSettings GetSerializerSettings() => new JsonSerializerSettings
53  {
54  ContractResolver = new CamelCasePropertyNamesContractResolver(),
55  Converters = new[] { new VersionConverter() }
56  };
57 
58  static void HandleBadResponse(HttpResponseMessage response, string json)
59  {
60  ErrorMessage errorMessage = null;
61  try
62  {
63  // check if json serializes to an error message
64  errorMessage = JsonConvert.DeserializeObject<ErrorMessage>(json, GetSerializerSettings());
65  }
66  catch (JsonException) { }
67 
68  const string BadSpecExtension = " This is not part of TGS4 communication specification and should be reported if it was returned from a TGS4 server!";
69 
70 #pragma warning disable IDE0010 // Add missing cases
71  switch (response.StatusCode)
72 #pragma warning restore IDE0010 // Add missing cases
73  {
74  case HttpStatusCode.UpgradeRequired:
75  throw new ApiMismatchException(errorMessage ?? new ErrorMessage
76  {
77  Message = "API Mismatch but no current API version provided!" + BadSpecExtension,
78  SeverApiVersion = null
79  });
80  case HttpStatusCode.Unauthorized:
81  throw new UnauthorizedException();
82  case HttpStatusCode.RequestTimeout:
83  throw new RequestTimeoutException();
84  case HttpStatusCode.Forbidden:
86  case HttpStatusCode.ServiceUnavailable:
87  throw new ServiceUnavailableException();
88  case HttpStatusCode.Gone:
89  errorMessage = errorMessage ?? new ErrorMessage
90  {
91  Message = "The requested resource could not be found!",
92  SeverApiVersion = null
93  };
94  goto case HttpStatusCode.Conflict;
95  case HttpStatusCode.NotFound:
96  // our fault somehow
97  errorMessage = errorMessage ?? new ErrorMessage
98  {
99  Message = "This is not a valid route!" + BadSpecExtension,
100  SeverApiVersion = null
101  };
102  goto case HttpStatusCode.Conflict;
103  case HttpStatusCode.Conflict:
104  throw new ConflictException(errorMessage ?? new ErrorMessage
105  {
106  Message = "An undescribed conflict occurred!" + BadSpecExtension,
107  SeverApiVersion = null
108  }, response.StatusCode);
109  case HttpStatusCode.NotImplemented:
110  // unprocessable entity
111  case (HttpStatusCode)422:
112  throw new MethodNotSupportedException();
113  case HttpStatusCode.InternalServerError:
114  // response json is html
115  throw new ServerErrorException(json);
116  case (HttpStatusCode)429:
117  // rate limited
118  response.Headers.TryGetValues("Retry-After", out var values);
119  throw new RateLimitException(values?.FirstOrDefault());
120  default:
121  throw new ApiConflictException(errorMessage, response.StatusCode);
122  }
123  }
124 
131  public ApiClient(IHttpClient httpClient, Uri url, ApiHeaders apiHeaders)
132  {
133  this.httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient));
134  Url = url ?? throw new ArgumentNullException(nameof(url));
135  headers = apiHeaders ?? throw new ArgumentNullException(nameof(apiHeaders));
136 
137  requestLoggers = new List<IRequestLogger>();
138  }
139 
141  public void Dispose() => httpClient.Dispose();
142 
153  async Task<TResult> RunRequest<TResult>(string route, object body, HttpMethod method, long? instanceId, CancellationToken cancellationToken)
154  {
155  if (route == null)
156  throw new ArgumentNullException(nameof(route));
157  if (method == null)
158  throw new ArgumentNullException(nameof(method));
159  if (body == null && (method == HttpMethod.Post || method == HttpMethod.Put))
160  throw new InvalidOperationException("Body cannot be null for POST or PUT!");
161 
162  HttpResponseMessage response;
163  var fullUri = new Uri(Url, route);
164  var serializerSettings = GetSerializerSettings();
165  using (var request = new HttpRequestMessage(method, fullUri))
166  {
167  if (body != null)
168  request.Content = new StringContent(JsonConvert.SerializeObject(body, serializerSettings), Encoding.UTF8, ApiHeaders.ApplicationJson);
169 
170  headers.SetRequestHeaders(request.Headers, instanceId);
171 
172  await Task.WhenAll(requestLoggers.Select(x => x.LogRequest(request, cancellationToken))).ConfigureAwait(false);
173 
174  response = await httpClient.SendAsync(request, cancellationToken).ConfigureAwait(false);
175  }
176 
177  using (response)
178  {
179  await Task.WhenAll(requestLoggers.Select(x => x.LogResponse(response, cancellationToken))).ConfigureAwait(false);
180 
181  var json = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
182 
183  if (!response.IsSuccessStatusCode)
184  HandleBadResponse(response, json);
185 
186  if (String.IsNullOrWhiteSpace(json))
187  json = JsonConvert.SerializeObject(new object());
188 
189  try
190  {
191  return JsonConvert.DeserializeObject<TResult>(json, serializerSettings);
192  }
193  catch (JsonException)
194  {
195  throw new UnrecognizedResponseException(json, response.StatusCode);
196  }
197  }
198  }
199 
201  public Task<TResult> Create<TResult>(string route, CancellationToken cancellationToken) => RunRequest<TResult>(route, new object(), HttpMethod.Put, null, cancellationToken);
202 
204  public Task<TResult> Read<TResult>(string route, CancellationToken cancellationToken) => RunRequest<TResult>(route, null, HttpMethod.Get, null, cancellationToken);
205 
207  public Task<TResult> Update<TResult>(string route, CancellationToken cancellationToken) => RunRequest<TResult>(route, new object(), HttpMethod.Post, null, cancellationToken);
208 
210  public Task<TResult> Update<TBody, TResult>(string route, TBody body, CancellationToken cancellationToken) => RunRequest<TResult>(route, body, HttpMethod.Post, null, cancellationToken);
211 
213  public Task Update<TBody>(string route, TBody body, CancellationToken cancellationToken) => RunRequest<object>(route, body, HttpMethod.Post, null, cancellationToken);
214 
216  public Task<TResult> Create<TBody, TResult>(string route, TBody body, CancellationToken cancellationToken) => RunRequest<TResult>(route, body, HttpMethod.Put, null, cancellationToken);
217 
219  public Task Delete(string route, CancellationToken cancellationToken) => RunRequest<object>(route, null, HttpMethod.Delete, null, cancellationToken);
220 
222  public Task<TResult> Create<TBody, TResult>(string route, TBody body, long instanceId, CancellationToken cancellationToken) => RunRequest<TResult>(route, body, HttpMethod.Put, instanceId, cancellationToken);
223 
225  public Task<TResult> Read<TResult>(string route, long instanceId, CancellationToken cancellationToken) => RunRequest<TResult>(route, null, HttpMethod.Get, instanceId, cancellationToken);
226 
228  public Task<TResult> Update<TBody, TResult>(string route, TBody body, long instanceId, CancellationToken cancellationToken) => RunRequest<TResult>(route, body, HttpMethod.Post, instanceId, cancellationToken);
229 
231  public Task Delete(string route, long instanceId, CancellationToken cancellationToken) => RunRequest<object>(route, null, HttpMethod.Delete, instanceId, cancellationToken);
232 
234  public Task Delete<TBody>(string route, TBody body, long instanceId, CancellationToken cancellationToken) => RunRequest<object>(route, body, HttpMethod.Delete, instanceId, cancellationToken);
235 
237  public Task<TResult> Delete<TResult>(string route, long instanceId, CancellationToken cancellationToken) => RunRequest<TResult>(route, null, HttpMethod.Delete, instanceId, cancellationToken);
238 
240  public Task<TResult> Create<TResult>(string route, long instanceId, CancellationToken cancellationToken) => RunRequest<TResult>(route, new object(), HttpMethod.Put, instanceId, cancellationToken);
241 
243  public Task<TResult> Patch<TResult>(string route, long instanceId, CancellationToken cancellationToken) => RunRequest<TResult>(route, new object(), new HttpMethod("PATCH"), instanceId, cancellationToken);
244 
246  public void AddRequestLogger(IRequestLogger requestLogger) => requestLoggers.Add(requestLogger ?? throw new ArgumentNullException(nameof(requestLogger)));
247  }
248 }
+
async Task< TResult > RunRequest< TResult >(string route, object body, HttpMethod method, long? instanceId, CancellationToken cancellationToken)
Main request method
Definition: ApiClient.cs:153
+
TimeSpan Timeout
The request timeout
Definition: IHttpClient.cs:16
+
Occurs when a response is received that did not deserialize to one of the expected Api....
+ + +
Task< TResult > Update< TResult >(string route, CancellationToken cancellationToken)
Run an HTTP POST request
+ +
const string ApplicationJson
TODO: Remove this when https://github.com/dotnet/corefx/pull/26701 makes it into the sdk
Definition: ApiHeaders.cs:21
+
Occurs when a GitHub rate limit occurs
+
Occurs when an error occurs in the server
+
Task< TResult > Read< TResult >(string route, CancellationToken cancellationToken)
Run an HTTP GET request
+
Occurs when the server returns an unknown response
+
Task< TResult > Delete< TResult >(string route, long instanceId, CancellationToken cancellationToken)
Run an HTTP DELETE request
+
ApiHeaders headers
Backing field for Headers
Definition: ApiClient.cs:50
+ +
Task< TResult > Update< TBody, TResult >(string route, TBody body, CancellationToken cancellationToken)
Run an HTTP POST request
+
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
Task< TResult > Patch< TResult >(string route, long instanceId, CancellationToken cancellationToken)
Run an HTTP PATCH request
+
Task< TResult > Create< TBody, TResult >(string route, TBody body, CancellationToken cancellationToken)
Run an HTTP PUT request
+
Occurs when the client makes a request while the server is starting or stopping
+
void AddRequestLogger(IRequestLogger requestLogger)
Adds a requestLogger to the request pipeline
+
For sending HTTP requests
Definition: IHttpClient.cs:11
+ +
readonly List< IRequestLogger > requestLoggers
The IRequestLoggers used by the ApiClient
Definition: ApiClient.cs:45
+
Task Update< TBody >(string route, TBody body, CancellationToken cancellationToken)
Run an HTTP POST request
+
static void HandleBadResponse(HttpResponseMessage response, string json)
Definition: ApiClient.cs:58
+
Occurs when the client provides invalid credentials
+
ApiClient(IHttpClient httpClient, Uri url, ApiHeaders apiHeaders)
Construct an ApiClient
Definition: ApiClient.cs:131
+
Task Delete(string route, CancellationToken cancellationToken)
Run an HTTP DELETE request
+
Occurs when the API version of the client is not compatible with the server's
+ +
void SetRequestHeaders(HttpRequestHeaders headers, long? instanceId=null)
Set HttpRequestHeaders using the ApiHeaders. This initially clears headers
Definition: ApiHeaders.cs:232
+
Occurs when the client performs an action that would result in data conflict
+
Occurs when the client attempts to perform an action they do not have the rights for
+ +
Task Delete< TBody >(string route, TBody body, long instanceId, CancellationToken cancellationToken)
Run an HTTP DELETE request
+
For logging HTTP requests and responses
+
Occurs when the client provides invalid credentials
+ +
Task< TResult > Create< TResult >(string route, CancellationToken cancellationToken)
Run an HTTP PUT request
+
Web interface for the API
Definition: IApiClient.cs:11
+
Occurs when the client tries to use a currently unsupported API
+
readonly IHttpClient httpClient
The HttpClient for the ApiClient
Definition: ApiClient.cs:40
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
Task< HttpResponseMessage > SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
Send an HTTP request
+ +
static JsonSerializerSettings GetSerializerSettings()
+
+ + + + diff --git a/_api_client_factory_8cs.html b/_api_client_factory_8cs.html new file mode 100644 index 0000000000..0bc740480d --- /dev/null +++ b/_api_client_factory_8cs.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/ApiClientFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ApiClientFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Client.ApiClientFactory
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_api_client_factory_8cs_source.html b/_api_client_factory_8cs_source.html new file mode 100644 index 0000000000..59f01de3e2 --- /dev/null +++ b/_api_client_factory_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/ApiClientFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ApiClientFactory.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using Tgstation.Server.Api;
3 
5 {
8  {
10  public IApiClient CreateApiClient(Uri url, ApiHeaders apiHeaders) => new ApiClient(new HttpClient(), url, apiHeaders);
11  }
12 }
+ + +
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
IApiClient CreateApiClient(Uri url, ApiHeaders apiHeaders)
Create an IApiClient
+ + + +
Web interface for the API
Definition: IApiClient.cs:11
+ + +
+ + + + diff --git a/_api_conflict_exception_8cs.html b/_api_conflict_exception_8cs.html new file mode 100644 index 0000000000..1ea9d42380 --- /dev/null +++ b/_api_conflict_exception_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/ApiConflictException.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ApiConflictException.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Client.ApiConflictException
 Occurs when the server returns an unknown response More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_api_conflict_exception_8cs_source.html b/_api_conflict_exception_8cs_source.html new file mode 100644 index 0000000000..498e2a5de2 --- /dev/null +++ b/_api_conflict_exception_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/ApiConflictException.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ApiConflictException.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Net;
4 
6 {
10  public sealed class ApiConflictException : ClientException
11  {
17  public ApiConflictException(ErrorMessage errorMessage, HttpStatusCode statusCode) : base(errorMessage ?? new ErrorMessage
18  {
19  Message = "An unknown API error occurred!",
20  SeverApiVersion = null
21  }, statusCode)
22  { }
23 
27  public ApiConflictException() { }
28 
33  public ApiConflictException(string message) : base(message) { }
34 
40  public ApiConflictException(string message, Exception innerException) : base(message, innerException) { }
41  }
42 }
+ +
Occurs when the server returns an unknown response
+
ApiConflictException(string message)
Construct an ApiConflictException with a message
+ +
ApiConflictException(string message, Exception innerException)
Construct an ApiConflictException with a message and innerException
+ +
ApiConflictException()
Construct an ApiConflictException
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
Exceptions thrown by IServerClients
+
+ + + + diff --git a/_api_controller_8cs.html b/_api_controller_8cs.html new file mode 100644 index 0000000000..9802154efb --- /dev/null +++ b/_api_controller_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/ApiController.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ApiController.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Controllers.ApiController
 A Controller for API functions More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Controllers
 
+
+ + + + diff --git a/_api_controller_8cs_source.html b/_api_controller_8cs_source.html new file mode 100644 index 0000000000..34d5e2374f --- /dev/null +++ b/_api_controller_8cs_source.html @@ -0,0 +1,117 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/ApiController.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ApiController.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Http;
2 using Microsoft.AspNetCore.Mvc;
3 using Microsoft.AspNetCore.Mvc.Filters;
4 using Microsoft.Extensions.Logging;
5 using System;
6 using System.Globalization;
7 using System.Linq;
8 using System.Net;
9 using System.Threading.Tasks;
10 using Tgstation.Server.Api;
14 
16 {
20  [Produces(ApiHeaders.ApplicationJson)]
21  public abstract class ApiController : Controller
22  {
26  protected ApiHeaders ApiHeaders { get; private set; }
27 
31  protected IDatabaseContext DatabaseContext { get; }
32 
37 
41  protected ILogger Logger { get; }
42 
46  protected Models.Instance Instance { get; }
47 
51  readonly bool requireInstance;
52 
56  readonly bool requireHeaders;
57 
66  public ApiController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance, bool requireHeaders)
67  {
68  DatabaseContext = databaseContext ?? throw new ArgumentNullException(nameof(databaseContext));
69  if (authenticationContextFactory == null)
70  throw new ArgumentNullException(nameof(authenticationContextFactory));
71  Logger = logger ?? throw new ArgumentNullException(nameof(logger));
72  AuthenticationContext = authenticationContextFactory.CurrentAuthenticationContext;
74  this.requireInstance = requireInstance;
75  this.requireHeaders = requireHeaders;
76  }
77 
79  #pragma warning disable CA1506 // TODO: Decomplexify
80  public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
81  {
82  // ALL valid token and login requests that match a route go through this function
83  // 404 is returned before
84  if (AuthenticationContext != null && AuthenticationContext.User == null)
85  {
86  // valid token, expired password
87  await Unauthorized().ExecuteResultAsync(context).ConfigureAwait(false);
88  return;
89  }
90 
91  // validate the headers
92  try
93  {
94  ApiHeaders = new ApiHeaders(Request.GetTypedHeaders());
95 
96  if (!ApiHeaders.Compatible())
97  {
98  await StatusCode((int)HttpStatusCode.UpgradeRequired, new ErrorMessage
99  {
100  Message = "Provided API version is incompatible with server version!"
101  }).ExecuteResultAsync(context).ConfigureAwait(false);
102  return;
103  }
104 
105  if (requireInstance)
106  {
107  if (!ApiHeaders.InstanceId.HasValue)
108  {
109  await BadRequest(new ErrorMessage { Message = "Missing Instance header!" }).ExecuteResultAsync(context).ConfigureAwait(false);
110  return;
111  }
112 
114  {
115  // accessing an instance they don't have access to or one that's disabled
116  await Forbid().ExecuteResultAsync(context).ConfigureAwait(false);
117  return;
118  }
119  }
120  }
121  catch (InvalidOperationException e)
122  {
123  if (requireHeaders)
124  {
125  await BadRequest(new ErrorMessage { Message = e.Message }).ExecuteResultAsync(context).ConfigureAwait(false);
126  return;
127  }
128  }
129 
130  if (ModelState?.IsValid == false)
131  {
132  var errorMessages = ModelState.SelectMany(x => x.Value.Errors).Select(x => x.ErrorMessage).ToList();
133 
134  // HACK
135  // do some fuckery to remove RequiredAttribute errors
136  for (var I = 0; I < errorMessages.Count; ++I)
137  {
138  var message = errorMessages[I];
139  if (message.StartsWith("The ", StringComparison.Ordinal) && message.EndsWith(" field is required.", StringComparison.Ordinal))
140  {
141  errorMessages.RemoveAt(I);
142  --I;
143  }
144  }
145 
146  if (errorMessages.Count > 0)
147  {
148  await BadRequest(new ErrorMessage { Message = String.Join(Environment.NewLine, errorMessages) }).ExecuteResultAsync(context).ConfigureAwait(false);
149  return;
150  }
151  }
152 
153  if (ApiHeaders != null)
154  Logger.LogDebug("Request made by User ID {0}. Api version: {1}. User-Agent: {2}. Type: {3}. Route {4}{5} to Instance {6}", AuthenticationContext?.User.Id.ToString(CultureInfo.InvariantCulture), ApiHeaders.ApiVersion, ApiHeaders.RawUserAgent, Request.Method, Request.Path, Request.QueryString, ApiHeaders.InstanceId);
155 
156  try
157  {
158  await base.OnActionExecutionAsync(context, next).ConfigureAwait(false);
159  }
160  catch (OperationCanceledException e)
161  {
162  Logger.LogDebug("Request cancelled! Exception: {0}", e);
163  throw;
164  }
165  }
166  #pragma warning restore CA1506
167  }
168 }
+ + +
ApiController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance, bool requireHeaders)
Construct an ApiController
+ + +
override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
+ +
const string ApplicationJson
TODO: Remove this when https://github.com/dotnet/corefx/pull/26701 makes it into the sdk
Definition: ApiHeaders.cs:21
+
Version ApiVersion
The client's API version
Definition: ApiHeaders.cs:76
+
bool Compatible()
Checks if the ApiVersion is compatible with Version
+
Represents the currently authenticated Api.Models.User
+ +
ApiHeaders ApiHeaders
The ApiHeaders for the operation
+
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+ +
string Message
A human readable description of the error
Definition: ErrorMessage.cs:13
+ + + +
string RawUserAgent
The client's raw user agent
Definition: ApiHeaders.cs:71
+ + +
readonly bool requireHeaders
If ApiHeaders are required
+
long? InstanceId
The Models.Instance.Id being accessed
Definition: ApiHeaders.cs:61
+
long Id
The ID of the User
Definition: User.cs:15
+
ILogger Logger
The ILogger for the ApiController
+
readonly bool requireInstance
If IAuthenticationContext.InstanceUser permissions are required to access the ApiController
+
Metadata about a server instance
Definition: Instance.cs:9
+ +
IAuthenticationContext CurrentAuthenticationContext
The IAuthenticationContext the IAuthenticationContextFactory created
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ + + +
+ + + + diff --git a/_api_headers_8cs.html b/_api_headers_8cs.html new file mode 100644 index 0000000000..a425a072b7 --- /dev/null +++ b/_api_headers_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/ApiHeaders.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ApiHeaders.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.ApiHeaders
 Represents the header that must be present for every server request More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
+
+ + + + diff --git a/_api_headers_8cs_source.html b/_api_headers_8cs_source.html new file mode 100644 index 0000000000..e70f381181 --- /dev/null +++ b/_api_headers_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/ApiHeaders.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ApiHeaders.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Http.Headers;
2 using Microsoft.Extensions.Primitives;
3 using Microsoft.Net.Http.Headers;
4 using System;
5 using System.Collections.Generic;
6 using System.Globalization;
7 using System.Linq;
8 using System.Net.Http.Headers;
9 using System.Reflection;
10 
12 {
16  public sealed class ApiHeaders
17  {
21  public const string ApplicationJson = "application/json";
22 
26  const string ApiVersionHeader = "Api";
27 
31  const string UsernameHeader = "Username";
32 
36  const string InstanceIdHeader = "Instance";
37 
41  const string JwtAuthenticationScheme = "Bearer";
42 
46  const string PasswordAuthenticationScheme = "Password";
47 
51  static readonly AssemblyName AssemblyName = Assembly.GetExecutingAssembly().GetName();
52 
56  public static Version Version => AssemblyName.Version;
57 
61  public long? InstanceId { get; set; }
62 
66  public ProductHeaderValue UserAgent => ProductInfoHeaderValue.TryParse(RawUserAgent, out var userAgent) ? userAgent.Product : null;
67 
71  public string RawUserAgent { get; }
72 
76  public Version ApiVersion { get; }
77 
81  public string Token { get; }
82 
86  public string Username { get; }
87 
91  public string Password { get; }
92 
96  public bool IsTokenAuthentication => Token != null;
97 
103  public static bool CheckCompatibility(Version otherVersion) => !(Version.Major != (otherVersion?.Major ?? throw new ArgumentNullException(nameof(otherVersion))) || Version.Minor > otherVersion.Minor);
104 
110  public ApiHeaders(ProductHeaderValue userAgent, string token) : this(userAgent, token, null, null)
111  {
112  if (userAgent == null)
113  throw new ArgumentNullException(nameof(userAgent));
114  if (token == null)
115  throw new ArgumentNullException(nameof(token));
116  }
117 
124  public ApiHeaders(ProductHeaderValue userAgent, string username, string password) : this(userAgent, null, username, password)
125  {
126  if (userAgent == null)
127  throw new ArgumentNullException(nameof(userAgent));
128  if (username == null)
129  throw new ArgumentNullException(nameof(username));
130  if (password == null)
131  throw new ArgumentNullException(nameof(password));
132  }
133 
138  public ApiHeaders(RequestHeaders requestHeaders)
139  {
140  if (requestHeaders == null)
141  throw new ArgumentNullException(nameof(requestHeaders));
142 
143  var jsonAccept = new Microsoft.Net.Http.Headers.MediaTypeHeaderValue(ApplicationJson);
144  if (!requestHeaders.Accept.Any(x => x.MediaType == jsonAccept.MediaType))
145  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Client does not accept {0}!", ApplicationJson));
146 
147  if (!requestHeaders.Headers.TryGetValue(HeaderNames.UserAgent, out var userAgentValues) || userAgentValues.Count == 0)
148  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Missing {0} headers!", HeaderNames.UserAgent));
149 
150  RawUserAgent = userAgentValues.First();
151  if (String.IsNullOrWhiteSpace(RawUserAgent))
152  throw new InvalidOperationException("Malformed client User-Agent!");
153 
154  // make sure the api header matches ours
155  if (!requestHeaders.Headers.TryGetValue(ApiVersionHeader, out var apiUserAgentHeaderValues) || !ProductInfoHeaderValue.TryParse(apiUserAgentHeaderValues.FirstOrDefault(), out var apiUserAgent) || apiUserAgent.Product.Name != AssemblyName.Name)
156  throw new InvalidOperationException("Missing API version!");
157 
158  if (!Version.TryParse(apiUserAgent.Product.Version, out var apiVersion))
159  throw new InvalidOperationException("Malformed API version!");
160 
161  ApiVersion = apiVersion;
162 
163  if (!requestHeaders.Headers.TryGetValue(HeaderNames.Authorization, out StringValues authorization))
164  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Missing {0} header!", HeaderNames.Authorization));
165  var auth = authorization.First();
166  var splits = new List<string>(auth.Split(' '));
167  var scheme = splits.First();
168  if (String.IsNullOrWhiteSpace(scheme))
169  throw new InvalidOperationException("Missing authentication scheme!");
170 
171  splits.RemoveAt(0);
172  var parameter = String.Concat(splits);
173  if (String.IsNullOrEmpty(parameter))
174  throw new InvalidOperationException("Missing authentication parameter!");
175 
176  if (requestHeaders.Headers.TryGetValue(InstanceIdHeader, out var instanceIdValues))
177  {
178  var instanceIdString = instanceIdValues.FirstOrDefault();
179  if (instanceIdString != default && Int64.TryParse(instanceIdString, out var instanceId))
180  InstanceId = instanceId;
181  }
182 
183  switch (scheme)
184  {
186  Token = parameter;
187  break;
189  Password = parameter;
190  var fail = !requestHeaders.Headers.TryGetValue(UsernameHeader, out var values);
191  if (!fail)
192  {
193  Username = values.FirstOrDefault();
194  fail = String.IsNullOrWhiteSpace(Username);
195  }
196 
197  if (fail)
198  throw new InvalidOperationException("Missing Username header!");
199  break;
200  default:
201  throw new InvalidOperationException("Invalid authentication scheme!");
202  }
203  }
204 
212  ApiHeaders(ProductHeaderValue userAgent, string token, string username, string password)
213  {
214  RawUserAgent = userAgent?.ToString();
215  Token = token;
216  Username = username;
217  Password = password;
219  }
220 
225  public bool Compatible() => CheckCompatibility(ApiVersion);
226 
232  public void SetRequestHeaders(HttpRequestHeaders headers, long? instanceId = null)
233  {
234  if (headers == null)
235  throw new ArgumentNullException(nameof(headers));
236  if (instanceId.HasValue && InstanceId.HasValue && instanceId != InstanceId)
237  throw new InvalidOperationException("Specified instance ID in constructor and SetRequestHeaders!");
238 
239  headers.Clear();
240  headers.Accept.Add(new MediaTypeWithQualityHeaderValue(ApplicationJson));
242  headers.Authorization = new AuthenticationHeaderValue(JwtAuthenticationScheme, Token);
243  else
244  {
245  headers.Authorization = new AuthenticationHeaderValue(PasswordAuthenticationScheme, Password);
246  headers.Add(UsernameHeader, Username);
247  }
248 
249  headers.UserAgent.Add(new ProductInfoHeaderValue(UserAgent));
250  headers.Add(ApiVersionHeader, new ProductHeaderValue(AssemblyName.Name, ApiVersion.ToString()).ToString());
251  instanceId = instanceId ?? InstanceId;
252  if (instanceId.HasValue)
253  headers.Add(InstanceIdHeader, instanceId.ToString());
254  }
255  }
256 }
static readonly AssemblyName AssemblyName
The current System.Reflection.AssemblyName
Definition: ApiHeaders.cs:51
+ +
const string ApplicationJson
TODO: Remove this when https://github.com/dotnet/corefx/pull/26701 makes it into the sdk
Definition: ApiHeaders.cs:21
+
Version ApiVersion
The client's API version
Definition: ApiHeaders.cs:76
+
bool Compatible()
Checks if the ApiVersion is compatible with Version
+
const string PasswordAuthenticationScheme
The password authentication header scheme
Definition: ApiHeaders.cs:46
+
string Username
The client's username
Definition: ApiHeaders.cs:86
+
ApiHeaders(ProductHeaderValue userAgent, string username, string password)
Construct ApiHeaders for password authentication
Definition: ApiHeaders.cs:124
+
ApiHeaders(ProductHeaderValue userAgent, string token)
Construct ApiHeaders for JWT authentication
Definition: ApiHeaders.cs:110
+
ProductHeaderValue UserAgent
The client's user agent as a ProductHeaderValue if valid
Definition: ApiHeaders.cs:66
+
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
ApiHeaders(ProductHeaderValue userAgent, string token, string username, string password)
Construct ApiHeaders
Definition: ApiHeaders.cs:212
+
string Password
The client's password
Definition: ApiHeaders.cs:91
+
bool IsTokenAuthentication
If the header uses password or JWT authentication
Definition: ApiHeaders.cs:96
+
string RawUserAgent
The client's raw user agent
Definition: ApiHeaders.cs:71
+
ApiHeaders(RequestHeaders requestHeaders)
Construct and validates ApiHeaders from a set of requestHeaders
Definition: ApiHeaders.cs:138
+
void SetRequestHeaders(HttpRequestHeaders headers, long? instanceId=null)
Set HttpRequestHeaders using the ApiHeaders. This initially clears headers
Definition: ApiHeaders.cs:232
+
long? InstanceId
The Models.Instance.Id being accessed
Definition: ApiHeaders.cs:61
+
const string JwtAuthenticationScheme
The JWT authentication header scheme
Definition: ApiHeaders.cs:41
+
static bool CheckCompatibility(Version otherVersion)
Checks if a given otherVersion is compatible with our own
+
const string ApiVersionHeader
The ApiVersion header key
Definition: ApiHeaders.cs:26
+
const string InstanceIdHeader
The InstanceId header key
Definition: ApiHeaders.cs:36
+
string Token
The client's JWT
Definition: ApiHeaders.cs:81
+
const string UsernameHeader
The Username header key
Definition: ApiHeaders.cs:31
+
static Version Version
Get the version of the Api the caller is using
Definition: ApiHeaders.cs:56
+
+ + + + diff --git a/_api_mismatch_exception_8cs.html b/_api_mismatch_exception_8cs.html new file mode 100644 index 0000000000..8a743f4ca2 --- /dev/null +++ b/_api_mismatch_exception_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/ApiMismatchException.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ApiMismatchException.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Client.ApiMismatchException
 Occurs when the API version of the client is not compatible with the server's More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_api_mismatch_exception_8cs_source.html b/_api_mismatch_exception_8cs_source.html new file mode 100644 index 0000000000..f8a9916e11 --- /dev/null +++ b/_api_mismatch_exception_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/ApiMismatchException.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ApiMismatchException.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Net;
4 
6 {
10  public sealed class ApiMismatchException : ClientException
11  {
16  public ApiMismatchException(ErrorMessage errorMessage) : base(errorMessage, HttpStatusCode.BadRequest)
17  {
18  if (errorMessage == null)
19  throw new ArgumentNullException(nameof(errorMessage));
20  }
21 
25  public ApiMismatchException() { }
26 
31  public ApiMismatchException(string message) : base(message) { }
32 
38  public ApiMismatchException(string message, Exception innerException) : base(message, innerException) { }
39  }
40 }
+ + +
Occurs when the API version of the client is not compatible with the server's
+
ApiMismatchException(ErrorMessage errorMessage)
Construct an ApiMismatchException using an errorMessage
+
ApiMismatchException(string message, Exception innerException)
Construct an ApiMismatchException with a message and innerException
+ +
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
ApiMismatchException()
Construct an ApiMismatchException
+
Exceptions thrown by IServerClients
+
ApiMismatchException(string message)
Construct an ApiMismatchException with a message
+
+ + + + diff --git a/_api_validation_status_8cs.html b/_api_validation_status_8cs.html new file mode 100644 index 0000000000..465861f42e --- /dev/null +++ b/_api_validation_status_8cs.html @@ -0,0 +1,116 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/ApiValidationStatus.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ApiValidationStatus.cs File Reference
+
+ + + + + diff --git a/_api_validation_status_8cs_source.html b/_api_validation_status_8cs_source.html new file mode 100644 index 0000000000..4da6e7bb3c --- /dev/null +++ b/_api_validation_status_8cs_source.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/ApiValidationStatus.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ApiValidationStatus.cs
+
+
+Go to the documentation of this file.
2 {
7  {
12 
17 
22 
27 
32 
37  }
38 }
The DMAPI never contacted the server for validation
+
The server was contacted for validation but it was never requested
+ +
Valid API. The game must be run with a minimum security level of Api.Models.DreamDaemonSecurity....
+ +
Valid API. The game must be run with a minimum security level of Api.Models.DreamDaemonSecurity....
+
Valid API. The game must be run with a security level of Api.Models.DreamDaemonSecurity....
+
ApiValidationStatus
Status of DMAPI validation
+
+ + + + diff --git a/_application_8cs.html b/_application_8cs.html new file mode 100644 index 0000000000..1da67958e3 --- /dev/null +++ b/_application_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/Application.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Application.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Core.Application
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_application_8cs_source.html b/_application_8cs_source.html new file mode 100644 index 0000000000..57b3a37dfc --- /dev/null +++ b/_application_8cs_source.html @@ -0,0 +1,191 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/Application.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
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 Newtonsoft.Json.Converters;
16 using Serilog;
17 using Serilog.Events;
18 using Serilog.Formatting.Display;
19 using System;
20 using System.Globalization;
21 using System.IdentityModel.Tokens.Jwt;
22 using System.Reflection;
23 using System.Threading.Tasks;
30 using Tgstation.Server.Host.IO;
33 
35 {
37  #pragma warning disable CA1506
38  sealed class Application : IApplication
39  {
41  public string VersionPrefix => "tgstation-server";
42 
44  public Version Version { get; }
45 
47  public string VersionString { get; }
48 
52  readonly IConfiguration configuration;
53 
57  readonly Microsoft.AspNetCore.Hosting.IHostingEnvironment hostingEnvironment;
58 
62  readonly TaskCompletionSource<object> startupTcs;
63 
68 
74  public Application(IConfiguration configuration, Microsoft.AspNetCore.Hosting.IHostingEnvironment hostingEnvironment)
75  {
76  this.configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
77  this.hostingEnvironment = hostingEnvironment ?? throw new ArgumentNullException(nameof(hostingEnvironment));
78 
79  startupTcs = new TaskCompletionSource<object>();
80 
81  Version = Assembly.GetExecutingAssembly().GetName().Version;
82  VersionString = String.Format(CultureInfo.InvariantCulture, "{0} v{1}", VersionPrefix, Version);
83  }
84 
89  public void ConfigureServices(IServiceCollection services)
90  {
91  if (services == null)
92  throw new ArgumentNullException(nameof(services));
93 
94  // needful
95  services.AddSingleton<IApplication>(this);
96 
97  // configure configuration
98  services.UseStandardConfig<UpdatesConfiguration>(configuration);
99  services.UseStandardConfig<DatabaseConfiguration>(configuration);
100  services.UseStandardConfig<GeneralConfiguration>(configuration);
101  services.UseStandardConfig<FileLoggingConfiguration>(configuration);
102  services.UseStandardConfig<ControlPanelConfiguration>(configuration);
103 
104  // enable options which give us config reloading
105  services.AddOptions();
106 
107  // this is needful for the setup wizard
108  services.AddLogging();
109 
110  // other stuff needed for for setup wizard and configuration
111  services.AddSingleton<IIOManager, DefaultIOManager>();
112  services.AddSingleton<IConsole, IO.Console>();
113  services.AddSingleton<IDBConnectionFactory, DBConnectionFactory>();
114  services.AddSingleton<ISetupWizard, SetupWizard>();
115  services.AddSingleton<IPlatformIdentifier, PlatformIdentifier>();
116  services.AddSingleton<IAsyncDelayer, AsyncDelayer>();
117 
118  GeneralConfiguration generalConfiguration;
119  DatabaseConfiguration databaseConfiguration;
120  FileLoggingConfiguration fileLoggingConfiguration;
121  ControlPanelConfiguration controlPanelConfiguration;
122  IIOManager ioManager;
123  IPlatformIdentifier platformIdentifier;
124 
125  // temporarily build the service provider in it's current state
126  // do it here so we can run the setup wizard if necessary
127  // also allows us to get some options and other services we need for continued configuration
128  using (var provider = services.BuildServiceProvider())
129  {
130  // run the wizard if necessary
131  var setupWizard = provider.GetRequiredService<ISetupWizard>();
132  var applicationLifetime = provider.GetRequiredService<Microsoft.AspNetCore.Hosting.IApplicationLifetime>();
133  var setupWizardRan = setupWizard.CheckRunWizard(applicationLifetime.ApplicationStopping).GetAwaiter().GetResult();
134 
135  // load the configuration options we need
136  var generalOptions = provider.GetRequiredService<IOptions<GeneralConfiguration>>();
137  generalConfiguration = generalOptions.Value;
138 
139  // unless this is set, in which case, we leave
140  if (setupWizardRan && generalConfiguration.SetupWizardMode == SetupWizardMode.Only)
141  throw new OperationCanceledException("Exiting due to SetupWizardMode configuration!"); // we don't inject a logger in the constuctor to log this because it's not yet configured
142 
143  var dbOptions = provider.GetRequiredService<IOptions<DatabaseConfiguration>>();
144  databaseConfiguration = dbOptions.Value;
145 
146  var loggingOptions = provider.GetRequiredService<IOptions<FileLoggingConfiguration>>();
147  fileLoggingConfiguration = loggingOptions.Value;
148 
149  var controlPanelOptions = provider.GetRequiredService<IOptions<ControlPanelConfiguration>>();
150  controlPanelConfiguration = controlPanelOptions.Value;
151 
152  ioManager = provider.GetRequiredService<IIOManager>();
153  platformIdentifier = provider.GetRequiredService<IPlatformIdentifier>();
154  }
155 
156  // setup file logging via serilog
157  if (!fileLoggingConfiguration.Disable)
158  services.AddLogging(builder =>
159  {
160  // common app data is C:/ProgramData on windows, else /usr/shar
161  var logPath = !String.IsNullOrEmpty(fileLoggingConfiguration.Directory) ? fileLoggingConfiguration.Directory : ioManager.ConcatPath(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), VersionPrefix, "Logs");
162 
163  logPath = ioManager.ConcatPath(logPath, "tgs-{Date}.log");
164 
165  LogEventLevel? ConvertLogLevel(LogLevel logLevel)
166  {
167  switch (logLevel)
168  {
169  case LogLevel.Critical:
170  return LogEventLevel.Fatal;
171  case LogLevel.Debug:
172  return LogEventLevel.Debug;
173  case LogLevel.Error:
174  return LogEventLevel.Error;
175  case LogLevel.Information:
176  return LogEventLevel.Information;
177  case LogLevel.Trace:
178  return LogEventLevel.Verbose;
179  case LogLevel.Warning:
180  return LogEventLevel.Warning;
181  case LogLevel.None:
182  return null;
183  default:
184  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid log level {0}", logLevel));
185  }
186  }
187 
188  var logEventLevel = ConvertLogLevel(fileLoggingConfiguration.LogLevel);
189  var microsoftEventLevel = ConvertLogLevel(fileLoggingConfiguration.MicrosoftLogLevel);
190 
191  var formatter = new MessageTemplateTextFormatter("{Timestamp:o} {RequestId,13} [{Level:u3}] {SourceContext:l}: {Message} ({EventId:x8}){NewLine}{Exception}", null);
192 
193  var configuration = new LoggerConfiguration()
194  .Enrich.FromLogContext()
195  .WriteTo.Async(w => w.RollingFile(formatter, logPath, shared: true, flushToDiskInterval: TimeSpan.FromSeconds(2)));
196 
197  if (logEventLevel.HasValue)
198  configuration.MinimumLevel.Is(logEventLevel.Value);
199 
200  if (microsoftEventLevel.HasValue)
201  configuration.MinimumLevel.Override("Microsoft", microsoftEventLevel.Value);
202 
203  builder.AddSerilog(configuration.CreateLogger(), true);
204  });
205 
206  // configure bearer token validation
207  services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(jwtBearerOptions =>
208  {
209  // this line isn't actually run until the first request is made
210  // at that point tokenFactory will be populated
211  jwtBearerOptions.TokenValidationParameters = tokenFactory.ValidationParameters;
212  jwtBearerOptions.Events = new JwtBearerEvents
213  {
214  // Application is our composition root so this monstrosity of a line is okay
215  OnTokenValidated = ctx => ctx.HttpContext.RequestServices.GetRequiredService<IClaimsInjector>().InjectClaimsIntoContext(ctx, ctx.HttpContext.RequestAborted)
216  };
217  });
218 
219  // fucking prevents converting 'sub' to M$ bs
220  // can't be done in the above lambda, that's too late
221  JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
222 
223  // add mvc, configure the json serializer settings
224  services.AddMvc().AddJsonOptions(options =>
225  {
226  options.AllowInputFormatterExceptionMessages = true;
227  options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
228  options.SerializerSettings.CheckAdditionalContent = true;
229  options.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Error;
230  options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
231  options.SerializerSettings.Converters = new[] { new VersionConverter() };
232  });
233 
234  // enable browser detection
235  services.AddDetectionCore().AddBrowser();
236 
237  // CORS conditionally enabled later
238  services.AddCors();
239 
240  void AddTypedContext<TContext>() where TContext : DatabaseContext<TContext>
241  {
242  services.AddDbContext<TContext>(builder =>
243  {
244  if (hostingEnvironment.IsDevelopment())
245  builder.EnableSensitiveDataLogging();
246  });
247  services.AddScoped<IDatabaseContext>(x => x.GetRequiredService<TContext>());
248  }
249 
250  // add the correct database context type
251  var dbType = databaseConfiguration.DatabaseType;
252  switch (dbType)
253  {
254  case DatabaseType.MySql:
255  case DatabaseType.MariaDB:
256  AddTypedContext<MySqlDatabaseContext>();
257  break;
258  case DatabaseType.SqlServer:
259  AddTypedContext<SqlServerDatabaseContext>();
260  break;
261  default:
262  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid {0}: {1}!", nameof(DatabaseType), dbType));
263  }
264 
265  // configure other database services
266  services.AddSingleton<IDatabaseContextFactory, DatabaseContextFactory>();
267  services.AddSingleton<IDatabaseSeeder, DatabaseSeeder>();
268 
269  // configure security services
271  services.AddScoped<IClaimsInjector, ClaimsInjector>();
272  services.AddSingleton<IIdentityCache, IdentityCache>();
273  services.AddSingleton<ICryptographySuite, CryptographySuite>();
274  services.AddSingleton<ITokenFactory, TokenFactory>();
275  services.AddSingleton<IPasswordHasher<Models.User>, PasswordHasher<Models.User>>();
276 
277  // configure platform specific services
278  if (platformIdentifier.IsWindows)
279  {
280  services.AddSingleton<ISystemIdentityFactory, WindowsSystemIdentityFactory>();
281  services.AddSingleton<ISymlinkFactory, WindowsSymlinkFactory>();
282  services.AddSingleton<IByondInstaller, WindowsByondInstaller>();
283  services.AddSingleton<IPostWriteHandler, WindowsPostWriteHandler>();
284 
285  services.AddSingleton<WindowsNetworkPromptReaper>();
286  services.AddSingleton<INetworkPromptReaper>(x => x.GetRequiredService<WindowsNetworkPromptReaper>());
287  services.AddSingleton<IHostedService>(x => x.GetRequiredService<WindowsNetworkPromptReaper>());
288  }
289  else
290  {
291  services.AddSingleton<ISystemIdentityFactory, PosixSystemIdentityFactory>();
292  services.AddSingleton<ISymlinkFactory, PosixSymlinkFactory>();
293  services.AddSingleton<IByondInstaller, PosixByondInstaller>();
294  services.AddSingleton<IPostWriteHandler, PosixPostWriteHandler>();
295  services.AddSingleton<INetworkPromptReaper, PosixNetworkPromptReaper>();
296  }
297 
298  // configure misc services
299  services.AddSingleton<ISynchronousIOManager, SynchronousIOManager>();
300  services.AddSingleton<IGitHubClientFactory, GitHubClientFactory>();
301  services.AddSingleton<IProcessExecutor, ProcessExecutor>();
302  services.AddSingleton<IByondTopicSender>(new ByondTopicSender
303  {
304  ReceiveTimeout = generalConfiguration.ByondTopicTimeout,
305  SendTimeout = generalConfiguration.ByondTopicTimeout
306  });
307 
308  // configure component services
309  services.AddSingleton<ICredentialsProvider, CredentialsProvider>();
310  services.AddSingleton<IProviderFactory, ProviderFactory>();
311  services.AddSingleton<IChatFactory, ChatFactory>();
312  services.AddSingleton<IWatchdogFactory, WatchdogFactory>();
313  services.AddSingleton<IInstanceFactory, InstanceFactory>();
314 
315  // configure root services
316  services.AddSingleton<InstanceManager>();
317  services.AddSingleton<IInstanceManager>(x => x.GetRequiredService<InstanceManager>());
318  services.AddSingleton<IHostedService>(x => x.GetRequiredService<InstanceManager>());
319 
320  services.AddSingleton<IJobManager, JobManager>();
321  }
322 
331  public void Configure(IApplicationBuilder applicationBuilder, IServerControl serverControl, ITokenFactory tokenFactory, IOptions<ControlPanelConfiguration> controlPanelConfigurationOptions, ILogger<Application> logger)
332  {
333  if (applicationBuilder == null)
334  throw new ArgumentNullException(nameof(applicationBuilder));
335  if (serverControl == null)
336  throw new ArgumentNullException(nameof(serverControl));
337 
338  this.tokenFactory = tokenFactory ?? throw new ArgumentNullException(nameof(tokenFactory));
339 
340  var controlPanelConfiguration = controlPanelConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(controlPanelConfigurationOptions));
341 
342  if (logger == null)
343  throw new ArgumentNullException(nameof(logger));
344 
345  logger.LogInformation(VersionString);
346  logger.LogDebug("Content Root: {0}", hostingEnvironment.ContentRootPath);
347  logger.LogTrace("Web Root: {0}", hostingEnvironment.WebRootPath);
348 
349  // attempt to restart the server if the configuration changes
350  if(serverControl.WatchdogPresent)
351  ChangeToken.OnChange(configuration.GetReloadToken, () => serverControl.Restart());
352 
353  // setup the HTTP request pipeline
354 
355  // should anything after this throw an exception, catch it and display a detailed html page
356  applicationBuilder.UseDeveloperExceptionPage(); // it is not worth it to limit this, you should only ever get it if you're an authorized user
357 
358  // suppress OperationCancelledExceptions, they are just aborted HTTP requests
359  applicationBuilder.UseCancelledRequestSuppression();
360 
361  // Set up CORS based on configuration if necessary
362  Action<CorsPolicyBuilder> corsBuilder = null;
363  if (controlPanelConfiguration.AllowAnyOrigin)
364  {
365  logger.LogTrace("Access-Control-Allow-Origin: *");
366  corsBuilder = builder => builder.AllowAnyOrigin();
367  }
368  else if (controlPanelConfiguration.AllowedOrigins?.Count > 0)
369  {
370  logger.LogTrace("Access-Control-Allow-Origin: ", String.Join(',', controlPanelConfiguration.AllowedOrigins));
371  corsBuilder = builder => builder.WithOrigins(controlPanelConfiguration.AllowedOrigins.ToArray());
372  }
373 
374  var originalBuilder = corsBuilder;
375  corsBuilder = builder =>
376  {
377  builder.AllowAnyHeader().AllowAnyMethod();
378  originalBuilder?.Invoke(builder);
379  };
380  applicationBuilder.UseCors(corsBuilder);
381 
382  // Do not service requests until Ready is called, this will return 503 until that point
383  applicationBuilder.UseAsyncInitialization(async cancellationToken =>
384  {
385  using (cancellationToken.Register(() => startupTcs.SetCanceled()))
386  await startupTcs.Task.ConfigureAwait(false);
387  });
388 
389  // spa loading if necessary
390  if (controlPanelConfiguration.Enable)
391  {
392  logger.LogWarning("Web control panel enabled. This is a highly WIP feature!");
393  applicationBuilder.UseStaticFiles();
394  }
395  else
396  logger.LogDebug("Web control panel disabled!");
397 
398  // authenticate JWT tokens using our security pipeline if present, returns 401 if bad
399  applicationBuilder.UseAuthentication();
400 
401  // suppress and log database exceptions
402  applicationBuilder.UseDbConflictHandling();
403 
404  // majority of handling is done in the controllers
405  applicationBuilder.UseMvc();
406 
407  // 404 anything that gets this far
408  }
409 
411  public void Ready(Exception initializationError)
412  {
413  lock (startupTcs)
414  {
415  if (startupTcs.Task.IsCompleted)
416  throw new InvalidOperationException("Ready has already been called!");
417  if (initializationError == null)
418  startupTcs.SetResult(null);
419  else
420  startupTcs.SetException(initializationError);
421  }
422  }
423  }
424 }
LogLevel MicrosoftLogLevel
The minimum Microsoft.Extensions.Logging.LogLevel to display in logs for Microsoft library sources
+ +
Manages the runtime of Jobs
Definition: IJobManager.cs:12
+ + + + +
readonly Microsoft.AspNetCore.Hosting.IHostingEnvironment hostingEnvironment
The Microsoft.AspNetCore.Hosting.IHostingEnvironment for the Application
Definition: Application.cs:57
+
IPostWriteHandler for POSIX systems
+ +
Handles changing file modes/permissions after writing
+ + +
void Configure(IApplicationBuilder applicationBuilder, IServerControl serverControl, ITokenFactory tokenFactory, IOptions< ControlPanelConfiguration > controlPanelConfigurationOptions, ILogger< Application > logger)
Configure the Application
Definition: Application.cs:331
+
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+ + + +
SetupWizardMode
Determines if the Core.ISetupWizard will run
+
Abstraction for System.Console
Definition: IConsole.cs:9
+
bool WatchdogPresent
true if live updates are supported, false. ApplyUpdate(Version, Uri, IIOManager) and Restart will fai...
+ +
LogLevel LogLevel
The minimum Microsoft.Extensions.Logging.LogLevel to display in logs
+
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
+ + +
ITokenFactory tokenFactory
The ITokenFactory for the Application
Definition: Application.cs:67
+ +
For initially seeding a database
+ + + + + + + + +
ISystemIdentityFactory for windows systems. Uses long running tasks due to potential networked domain...
+
Contains various cryptographic functions
+ + + + + +
Configuration for the automatic update system
+
For downloading and installing BYOND extractions for a given system
+ +
For accessing the disk in a synchronous manner
+
DatabaseType DatabaseType
The Configuration.DatabaseType to create
+ + +
void Ready(Exception initializationError)
Mark the IApplication as ready to run
Definition: Application.cs:411
+ + + + +
IPostWriteHandler for Windows systems
+ + + +
bool IsWindows
If the current platform is a Windows platform
+
readonly TaskCompletionSource< object > startupTcs
The TaskCompletionSource<TResult> used for determining when the Application is Ready(Exception)
Definition: Application.cs:62
+ + + + + + +
void ConfigureServices(IServiceCollection services)
Configure dependency injected services
Definition: Application.cs:89
+ + + +
TokenValidationParameters ValidationParameters
The TokenValidationParameters for the ITokenFactory
+ + + +
Configuration options for the Models.DatabaseContext<TParentContext>
+ + +
IIOManager that resolves paths to Environment.CurrentDirectory
+
Application(IConfiguration configuration, Microsoft.AspNetCore.Hosting.IHostingEnvironment hostingEnvironment)
Construct an Application
Definition: Application.cs:74
+
For injecting System.Security.Claims.Claims that Controllers.TgsAuthorizeAttribute can look for
+ +
DatabaseType
Type of database to user
Definition: DatabaseType.cs:6
+ + + + +
The command line Configuration setup wizard
Definition: ISetupWizard.cs:9
+ +
Task< bool > CheckRunWizard(CancellationToken cancellationToken)
Run the setup wizard if necessary
+
Interface for using filesystems
Definition: IIOManager.cs:11
+ +
On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort()....
+
For identifying the current platform
+ + + +
readonly IConfiguration configuration
The IConfiguration for the Application
Definition: Application.cs:52
+ +
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+ +
Represents a service that may take an updated Host assembly and run it, stopping the current assembly...
+ + + + + + +
+ + + + diff --git a/_application_builder_extensions_8cs.html b/_application_builder_extensions_8cs.html new file mode 100644 index 0000000000..42208a160b --- /dev/null +++ b/_application_builder_extensions_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/ApplicationBuilderExtensions.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ApplicationBuilderExtensions.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Core.ApplicationBuilderExtensions
 Extensions for IApplicationBuilder More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_application_builder_extensions_8cs_source.html b/_application_builder_extensions_8cs_source.html new file mode 100644 index 0000000000..c40e9dc005 --- /dev/null +++ b/_application_builder_extensions_8cs_source.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/ApplicationBuilderExtensions.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ApplicationBuilderExtensions.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Builder;
2 using Microsoft.AspNetCore.Http;
3 using Microsoft.AspNetCore.Mvc;
4 using Microsoft.EntityFrameworkCore;
5 using Microsoft.Extensions.DependencyInjection;
6 using Microsoft.Extensions.Logging;
7 using System;
8 using System.Globalization;
10 
12 {
17  {
23  static ILogger GetLogger(HttpContext httpContext) => httpContext.RequestServices.GetRequiredService<ILogger<Application>>();
24 
29  public static void UseDbConflictHandling(this IApplicationBuilder applicationBuilder)
30  {
31  if (applicationBuilder == null)
32  throw new ArgumentNullException(nameof(applicationBuilder));
33  applicationBuilder.Use(async (context, next) =>
34  {
35  var logger = GetLogger(context);
36  try
37  {
38  await next().ConfigureAwait(false);
39  }
40  catch (DbUpdateException e)
41  {
42  logger.LogDebug("Database conflict: {0}", e.Message);
43  await new ConflictObjectResult(new ErrorMessage { Message = String.Format(CultureInfo.InvariantCulture, "A database conflict has occurred: {0}", (e.InnerException ?? e).Message) }).ExecuteResultAsync(new ActionContext
44  {
45  HttpContext = context
46  }).ConfigureAwait(false);
47  }
48  });
49  }
50 
55  public static void UseCancelledRequestSuppression(this IApplicationBuilder applicationBuilder)
56  {
57  if (applicationBuilder == null)
58  throw new ArgumentNullException(nameof(applicationBuilder));
59  applicationBuilder.Use(async (context, next) =>
60  {
61  var logger = GetLogger(context);
62  try
63  {
64  await next().ConfigureAwait(false);
65  }
66  catch (OperationCanceledException)
67  {
68  logger.LogDebug("Request cancelled!");
69  }
70  });
71  }
72  }
73 }
+ + +
static ILogger GetLogger(HttpContext httpContext)
Gets a ILogger from a given httpContext
+ +
static void UseDbConflictHandling(this IApplicationBuilder applicationBuilder)
Return a ConflictObjectResult for DbUpdateExceptions
+ +
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
static void UseCancelledRequestSuppression(this IApplicationBuilder applicationBuilder)
Suppress TaskCanceledException warnings when a user aborts a request
+ +
+ + + + diff --git a/_architecture_8dox.html b/_architecture_8dox.html new file mode 100644 index 0000000000..1eb7065c3d --- /dev/null +++ b/_architecture_8dox.html @@ -0,0 +1,78 @@ + + + + + + + +tgstation-server: docs/Architecture.dox File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
docs/Architecture.dox File Reference
+
+
+
+ + + + diff --git a/_async_delayer_8cs.html b/_async_delayer_8cs.html new file mode 100644 index 0000000000..b3b3fdb3db --- /dev/null +++ b/_async_delayer_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/AsyncDelayer.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
AsyncDelayer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Core.AsyncDelayer
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_async_delayer_8cs_source.html b/_async_delayer_8cs_source.html new file mode 100644 index 0000000000..1c7ee20b9a --- /dev/null +++ b/_async_delayer_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/AsyncDelayer.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
AsyncDelayer.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4 
6 {
8  sealed class AsyncDelayer : IAsyncDelayer
9  {
11  public Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken) => Task.Delay(timeSpan, cancellationToken);
12  }
13 }
+ + +
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+
+ + + + diff --git a/_authentication_context_8cs.html b/_authentication_context_8cs.html new file mode 100644 index 0000000000..c7db7e6e91 --- /dev/null +++ b/_authentication_context_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/AuthenticationContext.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
AuthenticationContext.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Security.AuthenticationContext
 Manages Api.Models.Users for a scope More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Security
 
+
+ + + + diff --git a/_authentication_context_8cs_source.html b/_authentication_context_8cs_source.html new file mode 100644 index 0000000000..55c7deb311 --- /dev/null +++ b/_authentication_context_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/AuthenticationContext.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
AuthenticationContext.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Linq;
5 
7 {
12  {
14  public User User { get; }
15 
17  public InstanceUser InstanceUser { get; }
18 
21 
25  public AuthenticationContext() { }
26 
33  public AuthenticationContext(ISystemIdentity systemIdentity, User user, InstanceUser instanceUser)
34  {
35  User = user ?? throw new ArgumentNullException(nameof(user));
36  if (systemIdentity == null && User.SystemIdentifier != null)
37  throw new ArgumentNullException(nameof(systemIdentity));
38  InstanceUser = instanceUser;
39  SystemIdentity = systemIdentity;
40  }
41 
43  public void Dispose() => SystemIdentity?.Dispose();
44 
46  public ulong GetRight(RightsType rightsType)
47  {
48  var isInstance = RightsHelper.IsInstanceRight(rightsType);
49 
50  if (User == null)
51  throw new InvalidOperationException("Authentication context has no user!");
52 
53  if (isInstance && InstanceUser == null)
54  return 0;
55  var rightsEnum = RightsHelper.RightToType(rightsType);
56 
57  // use the api versions because they're the ones that contain the actual properties
58  var typeToCheck = isInstance ? typeof(InstanceUser) : typeof(User);
59 
60  var nullableType = typeof(Nullable<>);
61  var nullableRightsType = nullableType.MakeGenericType(rightsEnum);
62 
63  var prop = typeToCheck.GetProperties().Where(x => x.PropertyType == nullableRightsType).First();
64 
65  var right = prop.GetMethod.Invoke(isInstance ? (object)InstanceUser : User, Array.Empty<object>());
66 
67  if (right == null)
68  throw new InvalidOperationException("A user right was null!");
69  return (ulong)right;
70  }
71  }
72 }
static bool IsInstanceRight(RightsType rightsType)
Check if a given rightsType is meant for an Models.Instance
+
AuthenticationContext(ISystemIdentity systemIdentity, User user, InstanceUser instanceUser)
Construct an AuthenticationContext
+ +
AuthenticationContext()
Construct an empty AuthenticationContext
+ +
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+ +
Represents a user on the current System.Runtime.InteropServices.OSPlatform
+ +
Represents the currently authenticated Api.Models.User
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+ + + + + +
static Type RightToType(RightsType rightsType)
Map a given rightsType to its respective Enum Type
+ + + +
string SystemIdentifier
The SID/UID of the User on Windows/POSIX respectively
Definition: User.cs:32
+ +
+ + + + diff --git a/_authentication_context_factory_8cs.html b/_authentication_context_factory_8cs.html new file mode 100644 index 0000000000..d9131816bc --- /dev/null +++ b/_authentication_context_factory_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/AuthenticationContextFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
AuthenticationContextFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Security.AuthenticationContextFactory
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Security
 
+
+ + + + diff --git a/_authentication_context_factory_8cs_source.html b/_authentication_context_factory_8cs_source.html new file mode 100644 index 0000000000..f189390ff0 --- /dev/null +++ b/_authentication_context_factory_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/AuthenticationContextFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
AuthenticationContextFactory.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore;
2 using System;
3 using System.Linq;
4 using System.Threading;
5 using System.Threading.Tasks;
7 
9 {
12  {
15 
20 
25 
30 
38  {
39  this.systemIdentityFactory = systemIdentityFactory ?? throw new ArgumentNullException(nameof(systemIdentityFactory));
40  this.databaseContext = databaseContext ?? throw new ArgumentNullException(nameof(databaseContext));
41  this.identityCache = identityCache ?? throw new ArgumentNullException(nameof(identityCache));
42  }
43 
45  public void Dispose() => CurrentAuthenticationContext?.Dispose();
46 
48  public async Task CreateAuthenticationContext(long userId, long? instanceId, DateTimeOffset validAfter, CancellationToken cancellationToken)
49  {
50  if (CurrentAuthenticationContext != null)
51  throw new InvalidOperationException("Authentication context has already been loaded");
52 
53  var userQuery = databaseContext.Users.Where(x => x.Id == userId)
54  .Include(x => x.CreatedBy)
55  .FirstOrDefaultAsync(cancellationToken);
56 
57  var instanceUserQuery = instanceId.HasValue ? databaseContext.InstanceUsers
58  .Where(x => x.UserId == userId && x.InstanceId == instanceId && x.Instance.Online.Value)
59  .Include(x => x.Instance)
60  .FirstOrDefaultAsync(cancellationToken) : Task.FromResult<InstanceUser>(null);
61 
62  var user = await userQuery.ConfigureAwait(false);
63  if (user == default)
64  {
66  return;
67  }
68 
69  ISystemIdentity systemIdentity;
70  if (user.SystemIdentifier != null)
71  systemIdentity = identityCache.LoadCachedIdentity(user);
72  else
73  {
74  if (user.LastPasswordUpdate.HasValue && user.LastPasswordUpdate > validAfter)
75  {
77  return;
78  }
79 
80  systemIdentity = null;
81  }
82 
83  try
84  {
85  var instanceUser = await instanceUserQuery.ConfigureAwait(false);
86 
87  CurrentAuthenticationContext = new AuthenticationContext(systemIdentity, user, instanceUser);
88  }
89  catch
90  {
91  systemIdentity?.Dispose();
92  throw;
93  }
94  }
95  }
96 }
+ + +
AuthenticationContextFactory(ISystemIdentityFactory systemIdentityFactory, IDatabaseContext databaseContext, IIdentityCache identityCache)
Construct an AuthenticationContextFactory
+
Represents a user on the current System.Runtime.InteropServices.OSPlatform
+ +
ISystemIdentity LoadCachedIdentity(User user)
Attempt to load a cached ISystemIdentity
+
DbSet< User > Users
The Users in the IDatabaseContext
+
Represents the currently authenticated Api.Models.User
+ + +
readonly IIdentityCache identityCache
The IIdentityCache for the AuthenticationContextFactory
+ + + +
readonly ISystemIdentityFactory systemIdentityFactory
The ISystemIdentityFactory for the AuthenticationContextFactory
+
readonly IDatabaseContext databaseContext
The IDatabaseContext for the AuthenticationContextFactory
+ + + + + +
DbSet< InstanceUser > InstanceUsers
The InstanceUsers in the IDatabaseContext
+
async Task CreateAuthenticationContext(long userId, long? instanceId, DateTimeOffset validAfter, CancellationToken cancellationToken)
Create an IAuthenticationContext to populate CurrentAuthenticationContext
+ +
+ + + + diff --git a/_basic_watchdog_8cs.html b/_basic_watchdog_8cs.html new file mode 100644 index 0000000000..65c3ceb6df --- /dev/null +++ b/_basic_watchdog_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/BasicWatchdog.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
BasicWatchdog.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Watchdog.BasicWatchdog
 A IWatchdog that manages one server. More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Watchdog
 
+
+ + + + diff --git a/_basic_watchdog_8cs_source.html b/_basic_watchdog_8cs_source.html new file mode 100644 index 0000000000..ba48e6bc1c --- /dev/null +++ b/_basic_watchdog_8cs_source.html @@ -0,0 +1,163 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/BasicWatchdog.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
BasicWatchdog.cs
+
+
+Go to the documentation of this file.
1 using Byond.TopicSender;
2 using Microsoft.Extensions.Logging;
3 using System;
4 using System.Globalization;
5 using System.Threading;
6 using System.Threading.Tasks;
11 
13 {
17  sealed class BasicWatchdog : WatchdogBase
18  {
20  public override bool AlphaIsActive => true;
21 
23  public override Models.CompileJob ActiveCompileJob => server?.Dmb.CompileJob;
24 
26  public override RebootState? RebootState => server?.RebootState;
27 
32 
50  public BasicWatchdog(
51  IChat chat,
52  ISessionControllerFactory sessionControllerFactory,
53  IDmbFactory dmbFactory,
56  IByondTopicSender byondTopicSender,
59  IServerControl serverControl,
60  IAsyncDelayer asyncDelayer,
61  ILogger<BasicWatchdog> logger,
62  DreamDaemonLaunchParameters initialLaunchParameters,
63  Api.Models.Instance instance,
64  bool autoStart)
65  : base(
66  chat,
67  sessionControllerFactory,
68  dmbFactory,
73  jobManager,
74  serverControl,
75  asyncDelayer,
76  logger,
77  initialLaunchParameters,
78  instance,
79  autoStart)
80  { }
81 
82  async Task<MonitorAction> HandleMonitorWakeup(MonitorActivationReason reason, CancellationToken cancellationToken)
83  {
84  switch (reason)
85  {
86  case MonitorActivationReason.ActiveServerCrashed:
87  string exitWord = server.TerminationWasRequested ? "exited" : "crashed";
88  if (server.RebootState == Watchdog.RebootState.Shutdown)
89  {
90  // the time for graceful shutdown is now
91  await Chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Server {0}! Exiting due to graceful termination request...", exitWord), cancellationToken).ConfigureAwait(false);
93  return MonitorAction.Exit;
94  }
95 
96  await Chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Server {0}! Rebooting...", exitWord), cancellationToken).ConfigureAwait(false);
97  return MonitorAction.Restart;
98  case MonitorActivationReason.ActiveServerRebooted:
99  var rebootState = server.RebootState;
101 
102  switch (rebootState)
103  {
104  case Watchdog.RebootState.Normal:
105  bool dmbUpdatePending = ActiveLaunchParameters != LastLaunchParameters;
106  return dmbUpdatePending ? MonitorAction.Restart : MonitorAction.Continue;
107  case Watchdog.RebootState.Restart:
108  return MonitorAction.Restart;
109  case Watchdog.RebootState.Shutdown:
110  // graceful shutdown time
111  await Chat.SendWatchdogMessage("Active server rebooted! Exiting due to graceful termination request...", cancellationToken).ConfigureAwait(false);
113  return MonitorAction.Exit;
114  default:
115  throw new InvalidOperationException($"Invalid reboot state: {rebootState}");
116  }
117 
118  case MonitorActivationReason.ActiveLaunchParametersUpdated:
119  case MonitorActivationReason.NewDmbAvailable:
120  await server.SetRebootState(Watchdog.RebootState.Restart, cancellationToken).ConfigureAwait(false);
121  return MonitorAction.Continue;
122  case MonitorActivationReason.InactiveServerCrashed:
123  case MonitorActivationReason.InactiveServerRebooted:
124  case MonitorActivationReason.InactiveServerStartupComplete:
125  throw new NotSupportedException($"Unsupported activation reason: {reason}");
126  default:
127  throw new InvalidOperationException($"Invalid activation reason: {reason}");
128  }
129  }
130 
134  {
135  AlphaIsActive = true,
136  Alpha = server?.Release()
137  };
138 
140  protected override void DisposeAndNullControllers()
141  {
142  server?.Dispose();
143  server = null;
144  Running = false;
145  }
146 
148  protected override ISessionController GetActiveController() => server;
149 
151  protected override async Task InitControllers(Action callBeforeRecurse, Task chatTask, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
152  {
153  // good ole sanity, should never fucking trigger but i don't trust myself even though I should
154  // TODO: Unit test this instead?
155  if (server != null)
156  throw new InvalidOperationException("Entered LaunchNoLock with server not being null!");
157 
158  // don't need a new dmb if reattaching
159  var doesntNeedNewDmb = reattachInfo?.Alpha != null && reattachInfo?.Bravo != null;
160  var dmbToUse = doesntNeedNewDmb ? null : DmbFactory.LockNextDmb(1);
161 
162  var serverToReattach = reattachInfo?.Alpha ?? reattachInfo?.Bravo;
163  var serverToKill = reattachInfo?.Bravo ?? reattachInfo?.Alpha;
164 
165  // vice versa
166  if (reattachInfo?.AlphaIsActive == false)
167  {
168  var temp = serverToReattach;
169  serverToReattach = serverToKill;
170  serverToKill = temp;
171  }
172 
173  // if this try catches something, both servers are killed
174  bool inactiveServerWasKilled = false;
175  try
176  {
177  // start the alpha server task, either by launch a new process or attaching to an existing one
178  // The tasks returned are mainly for writing interop files to the directories among other things and should generally never fail
179  // The tasks pertaining to server startup times are in the ISessionControllers
180  Task<ISessionController> serverLaunchTask, inactiveReattachTask;
181  if (!doesntNeedNewDmb)
182  serverLaunchTask = SessionControllerFactory.LaunchNew(ActiveLaunchParameters, dmbToUse, null, true, true, false, cancellationToken);
183  else
184  serverLaunchTask = SessionControllerFactory.Reattach(serverToReattach, cancellationToken);
185 
186  bool thereIsAnInactiveServerToKill = serverToKill != null;
187  if (thereIsAnInactiveServerToKill)
188  inactiveReattachTask = SessionControllerFactory.Reattach(serverToKill, cancellationToken);
189  else
190  inactiveReattachTask = Task.FromResult<ISessionController>(null);
191 
192  // retrieve the session controller
193  server = await serverLaunchTask.ConfigureAwait(false);
194 
195  // failed reattaches will return null
197 
198  var inactiveServerController = await inactiveReattachTask.ConfigureAwait(false);
199  inactiveServerController?.Dispose();
200  inactiveServerWasKilled = inactiveServerController != null;
201 
202  // possiblity of null servers due to failed reattaches
203  if (server == null)
204  {
205  callBeforeRecurse();
206  await NotifyOfFailedReattach(thereIsAnInactiveServerToKill && !inactiveServerWasKilled, cancellationToken).ConfigureAwait(false);
207  return;
208  }
209 
210  await CheckLaunchResult(server, "Server", cancellationToken).ConfigureAwait(false);
211 
213  }
214  catch
215  {
216  // kill the controllers
217  bool serverWasActive = server != null;
219 
220  // server didn't get control of this dmb
221  if (dmbToUse != null && !serverWasActive)
222  dmbToUse.Dispose();
223 
224  if (serverToKill != null && !inactiveServerWasKilled)
225  serverToKill.Dmb.Dispose();
226  throw;
227  }
228  }
229 
231  protected override async Task MonitorLifetimes(CancellationToken cancellationToken)
232  {
233  Logger.LogTrace("Entered MonitorLifetimes");
234 
235  // this function is responsible for calling HandlerMonitorWakeup when necessary and manitaining the MonitorState
236  var iteration = 1;
237  for (MonitorAction nextAction = MonitorAction.Continue; nextAction != MonitorAction.Exit; ++iteration)
238  {
239  // always start out with continue
240  nextAction = MonitorAction.Continue;
241 
242  // dump some info to the logs
243  Logger.LogDebug("Iteration {0} of monitor loop", iteration);
244  try
245  {
246  Logger.LogDebug("Server Compile Job ID: {0}", server.Dmb.CompileJob.Id);
247 
248  // load the activation tasks into local variables
249  Task activeServerLifetime = server.Lifetime;
250  var activeServerReboot = server.OnReboot;
251  Task activeLaunchParametersChanged = ActiveParametersUpdated.Task;
252  var newDmbAvailable = DmbFactory.OnNewerDmb;
253 
254  // cancel waiting if requested
255  var cancelTcs = new TaskCompletionSource<object>();
256  using (cancellationToken.Register(() => cancelTcs.SetCanceled()))
257  {
258  var toWaitOn = Task.WhenAny(activeServerLifetime, activeServerReboot, newDmbAvailable, cancelTcs.Task, activeLaunchParametersChanged);
259 
260  // wait for something to happen
261  await toWaitOn.ConfigureAwait(false);
262  cancellationToken.ThrowIfCancellationRequested();
263  }
264 
265  var chatTask = Task.CompletedTask;
266  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
267  {
268  // always run HandleMonitorWakeup from the context of the semaphore lock
269  // multiple things may have happened, handle them one at a time
270  for (var moreActivationsToProcess = true; moreActivationsToProcess && (nextAction == MonitorAction.Continue || nextAction == MonitorAction.Skip);)
271  {
272  MonitorActivationReason activationReason = default; // this will always be assigned before being used
273 
274  // process the tasks in this order and call HandlerMonitorWakup for each
275  bool CheckActivationReason(ref Task task, MonitorActivationReason testActivationReason)
276  {
277  var taskCompleted = task?.IsCompleted == true;
278  task = null;
279  if (nextAction == MonitorAction.Skip)
280  nextAction = MonitorAction.Continue;
281  else if (taskCompleted)
282  {
283  activationReason = testActivationReason;
284  return true;
285  }
286 
287  return false;
288  }
289 
290  if (CheckActivationReason(ref activeServerLifetime, MonitorActivationReason.ActiveServerCrashed)
291  || CheckActivationReason(ref activeServerReboot, MonitorActivationReason.ActiveServerRebooted)
292  || CheckActivationReason(ref newDmbAvailable, MonitorActivationReason.NewDmbAvailable)
293  || CheckActivationReason(ref activeLaunchParametersChanged, MonitorActivationReason.ActiveLaunchParametersUpdated))
294  nextAction = await HandleMonitorWakeup(activationReason, cancellationToken).ConfigureAwait(false);
295  else
296  moreActivationsToProcess = false;
297  }
298  }
299 
300  // full reboot required
301  if (nextAction == MonitorAction.Restart)
302  {
303  Logger.LogDebug("Next state action is to restart");
305 
306  for (var retryAttempts = 1; nextAction == MonitorAction.Restart; ++retryAttempts)
307  {
308  Exception launchException = null;
309  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
310  try
311  {
312  // use LaunchImplNoLock without announcements or restarting the monitor
313  await LaunchImplNoLock(false, false, null, cancellationToken).ConfigureAwait(false);
314  if (Running)
315  {
316  Logger.LogDebug("Relaunch successful, resetting monitor state...");
317  break; // continue on main loop
318  }
319  }
320  catch (OperationCanceledException)
321  {
322  throw;
323  }
324  catch (Exception e)
325  {
326  launchException = e;
327  }
328 
329  await chatTask.ConfigureAwait(false);
330  if (!Running)
331  {
332  if (launchException == null)
333  Logger.LogWarning("Failed to automatically restart the watchdog! Attempt: {0}", retryAttempts);
334  else
335  Logger.LogWarning("Failed to automatically restart the watchdog! Attempt: {0}, Exception: {1}", retryAttempts, launchException);
336  var retryDelay = Math.Min(Math.Pow(2, retryAttempts), 3600); // max of one hour, increasing by a power of 2 each time
337  chatTask = Chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Failed to restart watchdog (Attempt: {0}), retrying in {1} seconds...", retryAttempts, retryDelay), cancellationToken);
338  await Task.WhenAll(AsyncDelayer.Delay(TimeSpan.FromSeconds(retryDelay), cancellationToken), chatTask).ConfigureAwait(false);
339  }
340  }
341  }
342  }
343  catch (OperationCanceledException)
344  {
345  Logger.LogDebug("Monitor cancelled");
346  break;
347  }
348  catch (Exception e)
349  {
350  // really, this should NEVER happen
351  Logger.LogError("Monitor crashed! Iteration: {0}, NextAction: {1}, Exception: {2}", iteration, nextAction, e);
352  await Chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Monitor crashed, this should NEVER happen! Please report this, full details in logs! Restarting monitor... Error: {0}", e.Message), cancellationToken).ConfigureAwait(false);
353  }
354  }
355 
356  Logger.LogTrace("Monitor exiting...");
357  }
358  }
359 }
+
Manages the runtime of Jobs
Definition: IJobManager.cs:12
+
readonly bool autoStart
If the WatchdogBase should LaunchImplNoLock(bool, bool, WatchdogReattachInformation,...
+ + + +
override ISessionController GetActiveController()
Get the active ISessionController.
+
CompileJob CompileJob
The CompileJob of the .dmb
Definition: IDmbProvider.cs:29
+
Task< int > Lifetime
The Task<TResult> resulting in the exit code of the process
Definition: IProcessBase.cs:14
+ + + +
async Task LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
Launches the watchdog.
+ + + +
Consumes EventTypes and takes the appropriate actions
+ + +
SemaphoreSlim Semaphore
The SemaphoreSlim for the WatchdogBase.
Definition: WatchdogBase.cs:55
+ +
void EnableCustomChatCommands()
Enables the reading of custom chat commands from the ISessionController
+
Task< bool > SetRebootState(RebootState newRebootState, CancellationToken cancellationToken)
Attempts to change the current RebootState to newRebootState
+
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
+
override async Task InitControllers(Action callBeforeRecurse, Task chatTask, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
Starts all ISessionControllers.
+
async Task< MonitorAction > HandleMonitorWakeup(MonitorActivationReason reason, CancellationToken cancellationToken)
+ +
BasicWatchdog(IChat chat, ISessionControllerFactory sessionControllerFactory, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IEventConsumer eventConsumer, IJobManager jobManager, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILogger< BasicWatchdog > logger, DreamDaemonLaunchParameters initialLaunchParameters, Api.Models.Instance instance, bool autoStart)
Initializes a new instance of the ExperimentalWatchdog class.
+
Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured watchdog channels
Definition: Chat.cs:514
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the ExperimentalWatchdog
+ + +
ISessionController server
The single ISessionController.
+
readonly IJobManager jobManager
The IJobManager for the ExperimentalWatchdog
+
For managing connected chat services
Definition: IChat.cs:13
+ +
readonly IReattachInfoHandler reattachInfoHandler
The IReattachInfoHandler for the WatchdogBase
Definition: WatchdogBase.cs:90
+ +
Handles communication with a DreamDaemon IProcess
+ +
void SetHighPriority()
Set's the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass....
+
bool TerminationWasRequested
If the DreamDaemon instance sent a
+ + + + +
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the ExperimentalWatchdog
Definition: WatchdogBase.cs:95
+
async Task< ISessionController > LaunchNew(DreamDaemonLaunchParameters launchParameters, IDmbProvider dmbProvider, IByondExecutableLock currentByondLock, bool primaryPort, bool primaryDirectory, bool apiValidate, CancellationToken cancellationToken)
Create a ISessionController from a freshly launch DreamDaemon instance
+
TaskCompletionSource< object > ActiveParametersUpdated
TaskCompletionSource<TResult> that completes when ActiveLaunchParameters are changed and we are Runni...
Definition: WatchdogBase.cs:50
+ + +
ReattachInformation Alpha
ReattachInformation for the Alpha session
+
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+
MonitorActivationReason
Reasons for the monitor to wake up
+
async Task< ISessionController > Reattach(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Create a ISessionController from an existing DreamDaemon instance
+
ReattachInformation Release()
Releases the IProcess without terminating it. Also calls System.IDisposable.Dispose
+ + +
IDmbProvider LockNextDmb(int lockCount)
Gets the next IDmbProvider
Definition: DmbFactory.cs:149
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the ExperimentalWatchdog
+ +
async Task NotifyOfFailedReattach(bool inactiveReattachSuccess, CancellationToken cancellationToken)
Send a chat message and log about a failed reattach operation and attempts another call to LaunchImpl...
+
async Task CheckLaunchResult(ISessionController controller, string serverName, CancellationToken cancellationToken)
Check the LaunchResult of a given controller for errors and throw a JobException if any are detected...
+ +
ILogger Logger
The ILogger for the WatchdogBase.
Definition: WatchdogBase.cs:60
+
override WatchdogReattachInformation CreateReattachInformation()
Create the WatchdogReattachInformation for the ISessionControllers.
+
readonly Api.Models.Instance instance
The Api.Models.Instance for the WatchdogBase.
Definition: WatchdogBase.cs:85
+
ReattachInformation Bravo
ReattachInformation for the Bravo session
+
override async Task MonitorLifetimes(CancellationToken cancellationToken)
The loop that watches the watchdog
+
Task OnReboot
A Task that completes when the server calls /world/Reboot()
+
MonitorAction
The action for the monitor loop to take when control is returned to it
Definition: MonitorAction.cs:6
+
Handles saving and loading WatchdogReattachInformation
+ +
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+
void ResetRebootState()
Changes RebootState to Components.Watchdog.RebootState.Normal without telling the DMAPI
+
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
+ + + +
override void DisposeAndNullControllers()
Call IDisposable.Dispose and null the fields for all ISessionControllers and set Running to false.
+
Represents a service that may take an updated Host assembly and run it, stopping the current assembly...
+
+ + + + diff --git a/_bool_converter_8cs.html b/_bool_converter_8cs.html new file mode 100644 index 0000000000..f17b3fe39c --- /dev/null +++ b/_bool_converter_8cs.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands/BoolConverter.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
BoolConverter.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Chat.Commands.BoolConverter
 JsonConverter for decoding bools returned by BYOND More...
 
+ + + + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
namespace  Tgstation.Server.Host.Components.Chat.Commands
 
+
+ + + + diff --git a/_bool_converter_8cs_source.html b/_bool_converter_8cs_source.html new file mode 100644 index 0000000000..4eb85a1839 --- /dev/null +++ b/_bool_converter_8cs_source.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands/BoolConverter.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
BoolConverter.cs
+
+
+Go to the documentation of this file.
1 using Newtonsoft.Json;
2 using System;
3 
5 {
9  sealed class BoolConverter : JsonConverter
10  {
12  public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => writer.WriteValue(((bool)value) ? 1 : 0);
13 
15  public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) => reader.Value.ToString() == "1";
16 
18  public override bool CanConvert(Type objectType) => objectType == typeof(bool);
19  }
20 }
JsonConverter for decoding bools returned by BYOND
Definition: BoolConverter.cs:9
+ +
override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+
override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+ + +
+ + + + diff --git a/_byond_8cs.html b/_byond_8cs.html new file mode 100644 index 0000000000..cd370476b7 --- /dev/null +++ b/_byond_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Byond.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Byond.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.Byond
 Represents a BYOND installation More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + diff --git a/_byond_8cs_source.html b/_byond_8cs_source.html new file mode 100644 index 0000000000..05f5bd8e97 --- /dev/null +++ b/_byond_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Byond.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Byond.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
8  public sealed class Byond
9  {
13  public Version Version { get; set; }
14 
18  public Job InstallJob { get; set; }
19  }
20 }
Job InstallJob
The Job being used to install a new Version
Definition: Byond.cs:18
+ +
Represents a BYOND installation
Definition: Byond.cs:8
+
Version Version
The System.Version of the Byond installation used for new compiles. Will be null if the user does not...
Definition: Byond.cs:13
+
Represents a long running job on the server. Model is read-only, updates attempt to cancel the job
Definition: Job.cs:6
+
+ + + + diff --git a/_byond_client_8cs.html b/_byond_client_8cs.html new file mode 100644 index 0000000000..3f8f85624b --- /dev/null +++ b/_byond_client_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/ByondClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ByondClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Client.Components.ByondClient
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
namespace  Tgstation.Server.Client.Components
 
+
+ + + + diff --git a/_byond_client_8cs_source.html b/_byond_client_8cs_source.html new file mode 100644 index 0000000000..04498a82fb --- /dev/null +++ b/_byond_client_8cs_source.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/ByondClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ByondClient.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Threading;
4 using System.Threading.Tasks;
5 using Tgstation.Server.Api;
7 
9 {
11  sealed class ByondClient : IByondClient
12  {
17 
21  readonly Instance instance;
22 
29  {
30  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
31  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
32  }
33 
35  public Task<Byond> ActiveVersion(CancellationToken cancellationToken) => apiClient.Read<Byond>(Routes.Byond, instance.Id, cancellationToken);
36 
38  public Task<IReadOnlyList<Byond>> InstalledVersions(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<Byond>>(Routes.List(Routes.Byond), instance.Id, cancellationToken);
39 
41  public Task<Byond> SetActiveVersion(Byond byond, CancellationToken cancellationToken) => apiClient.Update<Byond, Byond>(Routes.Byond, byond ?? throw new ArgumentNullException(nameof(byond)), instance.Id, cancellationToken);
42  }
43 }
const string Byond
The Models.Byond controller
Definition: Routes.cs:34
+
Task< Byond > Byond(Routes.Byond, byond ?? throw new ArgumentNullException(nameof(byond)), instance.Id, cancellationToken)
+ +
Task< Byond > SetActiveVersion(Byond byond, CancellationToken cancellationToken)
Updates the Byond information
+
For managing the Byond installation
Definition: IByondClient.cs:11
+
ByondClient(IApiClient apiClient, Instance instance)
Construct a ByondClient
Definition: ByondClient.cs:28
+
readonly IApiClient apiClient
The IApiClient for the ByondClient
Definition: ByondClient.cs:16
+ +
Routes to a server actions
Definition: Routes.cs:9
+ +
readonly Instance instance
The Instance for the ByondClient
Definition: ByondClient.cs:21
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+ +
Task< IReadOnlyList< Byond > > InstalledVersions(CancellationToken cancellationToken)
Get all installed Byond System.Versions
+
Metadata about a server instance
Definition: Instance.cs:9
+
Represents a BYOND installation
Definition: Byond.cs:8
+
static string List(string route)
Get the /List postfix for a route
+ +
Web interface for the API
Definition: IApiClient.cs:11
+
Task< Byond > ActiveVersion(CancellationToken cancellationToken)
Get the Byond active System.Version information
+ +
+ + + + diff --git a/_byond_command_8cs.html b/_byond_command_8cs.html new file mode 100644 index 0000000000..b584822931 --- /dev/null +++ b/_byond_command_8cs.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands/ByondCommand.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ByondCommand.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Chat.Commands.ByondCommand
 For displaying the installed Byond version More...
 
+ + + + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
namespace  Tgstation.Server.Host.Components.Chat.Commands
 
+
+ + + + diff --git a/_byond_command_8cs_source.html b/_byond_command_8cs_source.html new file mode 100644 index 0000000000..fbc5d08238 --- /dev/null +++ b/_byond_command_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands/ByondCommand.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ByondCommand.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Globalization;
3 using System.Linq;
4 using System.Threading;
5 using System.Threading.Tasks;
8 
10 {
14  sealed class ByondCommand : ICommand
15  {
17  public string Name => "byond";
18 
20  public string HelpText => "Displays the running Byond version. Use --active for the version used in future deployments";
21 
23  public bool AdminOnly => false;
24 
29 
33  readonly IWatchdog watchdog;
34 
41  {
42  this.byondManager = byondManager ?? throw new ArgumentNullException(nameof(byondManager));
43  this.watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
44  }
45 
47  public Task<string> Invoke(string arguments, User user, CancellationToken cancellationToken)
48  {
49  if (arguments.Split(' ').Any(x => x.ToUpperInvariant() == "--ACTIVE"))
50  return Task.FromResult(byondManager.ActiveVersion == null ? "None!" : String.Format(CultureInfo.InvariantCulture, "{0}.{1}", byondManager.ActiveVersion.Major, byondManager.ActiveVersion.Minor));
51  if (!watchdog.Running)
52  return Task.FromResult("Server offline!");
53  return Task.FromResult(watchdog.ActiveCompileJob.ByondVersion);
54  }
55  }
56 }
+ +
readonly IByondManager byondManager
The IByondManager for the ByondCommand
Definition: ByondCommand.cs:28
+ +
Models.CompileJob ActiveCompileJob
The CompileJob currently running on the server
Definition: IWatchdog.cs:27
+
Version ActiveVersion
The currently active BYOND version
+ + +
Represents a tgs_chat_user datum
Definition: User.cs:10
+ +
For displaying the installed Byond version
Definition: ByondCommand.cs:14
+ +
readonly IWatchdog watchdog
The IWatchdog for the ByondCommand
Definition: ByondCommand.cs:33
+ +
bool Running
If the watchdog is running
Definition: IWatchdog.cs:17
+ +
Task< string > Invoke(string arguments, User user, CancellationToken cancellationToken)
Invoke the ICommand
Definition: ByondCommand.cs:47
+ +
Represents a command that can be invoked by talking to chat bots
Definition: ICommand.cs:9
+ +
Runs and monitors the twin server controllers
Definition: IWatchdog.cs:12
+
ByondCommand(IByondManager byondManager, IWatchdog watchdog)
Construct a ByondCommand
Definition: ByondCommand.cs:40
+
+ + + + diff --git a/_byond_controller_8cs.html b/_byond_controller_8cs.html new file mode 100644 index 0000000000..5ef764ebe6 --- /dev/null +++ b/_byond_controller_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/ByondController.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ByondController.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Controllers.ByondController
 Controller for managing Api.Models.Byond.Versions More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Controllers
 
+
+ + + + diff --git a/_byond_controller_8cs_source.html b/_byond_controller_8cs_source.html new file mode 100644 index 0000000000..c9b7e53abf --- /dev/null +++ b/_byond_controller_8cs_source.html @@ -0,0 +1,119 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/ByondController.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ByondController.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Mvc;
2 using Microsoft.Extensions.Logging;
3 using System;
4 using System.Globalization;
5 using System.Linq;
6 using System.Threading;
7 using System.Threading.Tasks;
8 using Tgstation.Server.Api;
15 
17 {
21  [Route(Routes.Byond)]
22  public sealed class ByondController : ModelController<Api.Models.Byond>
23  {
28 
33 
42  public ByondController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IJobManager jobManager, ILogger<ByondController> logger) : base(databaseContext, authenticationContextFactory, logger, true)
43  {
44  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
45  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
46  }
47 
49  [TgsAuthorize(ByondRights.ReadActive)]
50  public override Task<IActionResult> Read(CancellationToken cancellationToken) => Task.FromResult<IActionResult>(
51  Json(new Api.Models.Byond
52  {
53  Version = instanceManager.GetInstance(Instance).ByondManager.ActiveVersion
54  }));
55 
57  [TgsAuthorize(ByondRights.ListInstalled)]
58  public override Task<IActionResult> List(CancellationToken cancellationToken) => Task.FromResult<IActionResult>(
59  Json(instanceManager.GetInstance(Instance).ByondManager.InstalledVersions.Select(x => new Api.Models.Byond
60  {
61  Version = x
62  })));
63 
65  [TgsAuthorize(ByondRights.ChangeVersion)]
66  public override async Task<IActionResult> Update([FromBody] Api.Models.Byond model, CancellationToken cancellationToken)
67  {
68  if (model == null)
69  throw new ArgumentNullException(nameof(model));
70 
71  if (model.Version == null)
72  return BadRequest(new ErrorMessage { Message = "Missing version!" });
73 
75 
76  // remove cruff fields
77  var installingVersion = new Version(model.Version.Major, model.Version.Minor);
78 
79  var result = new Api.Models.Byond();
80 
81  if (byondManager.InstalledVersions.Any(x => x == model.Version))
82  {
83  Logger.LogInformation("User ID {0} changing instance ID {1} BYOND version to {2}", AuthenticationContext.User.Id, Instance.Id, installingVersion);
84  await byondManager.ChangeVersion(model.Version, cancellationToken).ConfigureAwait(false);
85  }
86  else
87  {
88  Logger.LogInformation("User ID {0} installing BYOND version to {2} on instance ID {1}", AuthenticationContext.User.Id, Instance.Id, installingVersion);
89 
90  // run the install through the job manager
91  var job = new Models.Job
92  {
93  Description = String.Format(CultureInfo.InvariantCulture, "Install BYOND version {0}", installingVersion),
94  StartedBy = AuthenticationContext.User,
95  CancelRightsType = RightsType.Byond,
96  CancelRight = (ulong)ByondRights.CancelInstall,
98  };
99  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressHandler, ct) => byondManager.ChangeVersion(installingVersion, ct), cancellationToken).ConfigureAwait(false);
100  result.InstallJob = job.ToApi();
101  }
102 
103  if ((AuthenticationContext.GetRight(RightsType.Byond) & (ulong)ByondRights.ReadActive) != 0)
104  result.Version = byondManager.ActiveVersion;
105  return result.InstallJob != null ? (IActionResult)Accepted(result) : Json(result);
106  }
107  }
108 }
+
const string Byond
The Models.Byond controller
Definition: Routes.cs:34
+
Manages the runtime of Jobs
Definition: IJobManager.cs:12
+ + + +
ByondRights
Rights for Models.Byond
Definition: ByondRights.cs:9
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+ +
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+ +
override Task< IActionResult > List(CancellationToken cancellationToken)
Attempt to list entries of the TModel
+
Controller for managing Api.Models.Byond.Versions
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+ +
Task RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
Registers a given Job and begins running it
+
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
+
readonly IInstanceManager instanceManager
The IInstanceManager for the ByondController
+
An ApiController representing a TModel
+ + + +
long Id
The ID of the User
Definition: User.cs:15
+
override async Task< IActionResult > Update([FromBody] Api.Models.Byond model, CancellationToken cancellationToken)
+
Metadata about a server instance
Definition: Instance.cs:9
+ + +
override Task< IActionResult > Read(CancellationToken cancellationToken)
Attempt to read a TModel
+
IByondManager ByondManager
The IByondManager for the IInstance
Definition: IInstance.cs:27
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ + + +
+ + + + diff --git a/_byond_executable_lock_8cs.html b/_byond_executable_lock_8cs.html new file mode 100644 index 0000000000..0a992bfba2 --- /dev/null +++ b/_byond_executable_lock_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Byond/ByondExecutableLock.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ByondExecutableLock.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Components.Byond.ByondExecutableLock
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Byond
 
+
+ + + + diff --git a/_byond_executable_lock_8cs_source.html b/_byond_executable_lock_8cs_source.html new file mode 100644 index 0000000000..d7efe6b62b --- /dev/null +++ b/_byond_executable_lock_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Byond/ByondExecutableLock.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ByondExecutableLock.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
7  {
9  public Version Version { get; }
10 
12  public string DreamDaemonPath { get; }
13 
15  public string DreamMakerPath { get; }
16 
23  public ByondExecutableLock(Version version, string dreamDaemonPath, string dreamMakerPath)
24  {
25  Version = version ?? throw new ArgumentNullException(nameof(version));
26  DreamDaemonPath = dreamDaemonPath ?? throw new ArgumentNullException(nameof(dreamDaemonPath));
27  DreamMakerPath = dreamMakerPath ?? throw new ArgumentNullException(nameof(dreamMakerPath));
28  }
29 
30  // at one point in design, byond versions were to delete themselves if they weren't the active version
31  // That changed at some point so these functions are intentioanlly left blank
32 
34  public void Dispose() { }
35 
37  public void DoNotDeleteThisSession() { }
38  }
39 }
ByondExecutableLock(Version version, string dreamDaemonPath, string dreamMakerPath)
Construct a ByondExecutableLock
+ + +
void DoNotDeleteThisSession()
Call if, during a detach, this version should not be deleted
+
Represents usage of the two primary BYOND server executables
+ + + + +
+ + + + diff --git a/_byond_manager_8cs.html b/_byond_manager_8cs.html new file mode 100644 index 0000000000..3c2adf8b4c --- /dev/null +++ b/_byond_manager_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Byond/ByondManager.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ByondManager.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Components.Byond.ByondManager
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Byond
 
+
+ + + + diff --git a/_byond_manager_8cs_source.html b/_byond_manager_8cs_source.html new file mode 100644 index 0000000000..338ad2e155 --- /dev/null +++ b/_byond_manager_8cs_source.html @@ -0,0 +1,132 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Byond/ByondManager.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ByondManager.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using System;
3 using System.Collections.Generic;
4 using System.Globalization;
5 using System.Linq;
6 using System.Net;
7 using System.Text;
8 using System.Threading;
9 using System.Threading.Tasks;
11 using Tgstation.Server.Host.IO;
12 
14 {
16  sealed class ByondManager : IByondManager
17  {
21  public const string BinPath = "byond/bin";
22 
26  const string VersionFileName = "Version.txt";
27 
31  const string ActiveVersionFileName = "ActiveVersion.txt";
32 
34  public Version ActiveVersion { get; private set; }
35 
37  public IReadOnlyList<Version> InstalledVersions
38  {
39  get
40  {
41  lock (installedVersions)
42  return installedVersions.Select(x => Version.Parse(x.Key)).ToList();
43  }
44  }
45 
50 
55 
60 
64  readonly ILogger<ByondManager> logger;
65 
69  readonly Dictionary<string, Task> installedVersions;
70 
74  readonly SemaphoreSlim semaphore;
75 
81  static string VersionKey(Version version) => new Version(version.Major, version.Minor).ToString();
82 
91  {
92  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
93  this.byondInstaller = byondInstaller ?? throw new ArgumentNullException(nameof(byondInstaller));
94  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
95  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
96 
97  installedVersions = new Dictionary<string, Task>();
98  semaphore = new SemaphoreSlim(1);
99  }
100 
102  public void Dispose() => semaphore.Dispose();
103 
110  async Task InstallVersion(Version version, CancellationToken cancellationToken)
111  {
112  var ourTcs = new TaskCompletionSource<object>();
113  Task inProgressTask;
114 
115  var versionKey = VersionKey(version);
116  bool installed;
117  lock (installedVersions)
118  {
119  installed = installedVersions.TryGetValue(versionKey, out inProgressTask);
120  if (!installed)
121  installedVersions.Add(versionKey, ourTcs.Task);
122  }
123 
124  if (installed)
125  using (cancellationToken.Register(() => ourTcs.SetCanceled()))
126  {
127  await Task.WhenAny(ourTcs.Task, inProgressTask).ConfigureAwait(false);
128  cancellationToken.ThrowIfCancellationRequested();
129  return;
130  }
131 
132  // okay up to us to install it then
133  try
134  {
135  await eventConsumer.HandleEvent(EventType.ByondInstallStart, new List<string> { versionKey }, cancellationToken).ConfigureAwait(false);
136  var downloadTask = byondInstaller.DownloadVersion(version, cancellationToken);
137 
138  await ioManager.DeleteDirectory(versionKey, cancellationToken).ConfigureAwait(false);
139  await ioManager.CreateDirectory(versionKey, cancellationToken).ConfigureAwait(false);
140 
141  try
142  {
143  var download = await downloadTask.ConfigureAwait(false);
144  await ioManager.ZipToDirectory(versionKey, download, cancellationToken).ConfigureAwait(false);
145  await byondInstaller.InstallByond(ioManager.ResolvePath(versionKey), version, cancellationToken).ConfigureAwait(false);
146 
147  // make sure to do this last because this is what tells us we have a valid version in the future
148  await ioManager.WriteAllBytes(ioManager.ConcatPath(versionKey, VersionFileName), Encoding.UTF8.GetBytes(version.ToString()), cancellationToken).ConfigureAwait(false);
149  }
150  catch (WebException e)
151  {
152  // since the user can easily provide non-exitent version numbers, we'll turn this into a JobException
153  throw new JobException(String.Format(CultureInfo.InvariantCulture, "Error downloading BYOND version: {0}", e.Message));
154  }
155  catch (OperationCanceledException)
156  {
157  throw;
158  }
159  catch
160  {
161  await ioManager.DeleteDirectory(versionKey, cancellationToken).ConfigureAwait(false);
162  throw;
163  }
164 
165  ourTcs.SetResult(null);
166  }
167  catch (Exception e)
168  {
169  if (!(e is OperationCanceledException))
170  await eventConsumer.HandleEvent(EventType.ByondInstallFail, new List<string> { e.Message }, cancellationToken).ConfigureAwait(false);
171  lock (installedVersions)
172  installedVersions.Remove(versionKey);
173  ourTcs.SetException(e);
174  throw;
175  }
176  }
177 
179  public async Task ChangeVersion(Version version, CancellationToken cancellationToken)
180  {
181  if (version == null)
182  throw new ArgumentNullException(nameof(version));
183  var versionKey = VersionKey(version);
184  await InstallVersion(version, cancellationToken).ConfigureAwait(false);
185  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
186  {
187  await ioManager.WriteAllBytes(ActiveVersionFileName, Encoding.UTF8.GetBytes(versionKey), cancellationToken).ConfigureAwait(false);
188  await eventConsumer.HandleEvent(EventType.ByondActiveVersionChange, new List<string> { ActiveVersion != null ? VersionKey(ActiveVersion) : null, versionKey }, cancellationToken).ConfigureAwait(false);
189  ActiveVersion = version;
190  }
191  }
192 
194  public async Task<IByondExecutableLock> UseExecutables(Version requiredVersion, CancellationToken cancellationToken)
195  {
196  var versionToUse = requiredVersion ?? ActiveVersion;
197  if (versionToUse == null)
198  throw new JobException("No BYOND versions installed!");
199  await InstallVersion(versionToUse, cancellationToken).ConfigureAwait(false);
200 
201  var versionKey = VersionKey(versionToUse);
202 
204  }
205 
207  public async Task StartAsync(CancellationToken cancellationToken)
208  {
209  async Task<byte[]> GetActiveVersion()
210  {
211  var activeVersionFileExists = await ioManager.FileExists(ActiveVersionFileName, cancellationToken).ConfigureAwait(false);
212  return !activeVersionFileExists ? null : await ioManager.ReadAllBytes(ActiveVersionFileName, cancellationToken).ConfigureAwait(false);
213  }
214 
215  var activeVersionBytesTask = GetActiveVersion();
216 
217  await ioManager.CreateDirectory(".", cancellationToken).ConfigureAwait(false);
218  var directories = await ioManager.GetDirectories(".", cancellationToken).ConfigureAwait(false);
219 
220  async Task ReadVersion(string path)
221  {
222  var versionFile = ioManager.ConcatPath(path, VersionFileName);
223  if (!await ioManager.FileExists(versionFile, cancellationToken).ConfigureAwait(false))
224  {
225  logger.LogInformation("Cleaning unparsable version path: {0}", ioManager.ResolvePath(path));
226  await ioManager.DeleteDirectory(path, cancellationToken).ConfigureAwait(false); // cleanup
227  return;
228  }
229 
230  var bytes = await ioManager.ReadAllBytes(versionFile, cancellationToken).ConfigureAwait(false);
231  var text = Encoding.UTF8.GetString(bytes);
232  if (Version.TryParse(text, out var version))
233  {
234  var key = VersionKey(version);
235  lock (installedVersions)
236  if (!installedVersions.ContainsKey(key))
237  {
238  installedVersions.Add(key, Task.CompletedTask);
239  return;
240  }
241  }
242 
243  await ioManager.DeleteDirectory(path, cancellationToken).ConfigureAwait(false);
244  }
245 
246  await Task.WhenAll(directories.Select(x => ReadVersion(x))).ConfigureAwait(false);
247 
248  var activeVersionBytes = await activeVersionBytesTask.ConfigureAwait(false);
249  if (activeVersionBytes != null)
250  {
251  var activeVersionString = Encoding.UTF8.GetString(activeVersionBytes);
252  if (Version.TryParse(activeVersionString, out var activeVersion))
253  ActiveVersion = activeVersion;
254  else
255  await ioManager.DeleteFile(ActiveVersionFileName, cancellationToken).ConfigureAwait(false);
256  }
257  }
258 
260  public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
261  }
262 }
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
readonly IIOManager ioManager
The IIOManager for the ByondManager
Definition: ByondManager.cs:49
+
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+
Consumes EventTypes and takes the appropriate actions
+ +
const string ActiveVersionFileName
The file in which we store the VersionKey(Version) for the active installation
Definition: ByondManager.cs:31
+
Task ZipToDirectory(string path, byte[] zipFileBytes, CancellationToken cancellationToken)
Extract a set of zipFileBytes to a given path
+
Task< IReadOnlyList< string > > GetDirectories(string path, CancellationToken cancellationToken)
Returns directory names in a given path
+
string DreamMakerName
Get the file name of the DreamMaker executable
+
Task< byte[]> DownloadVersion(Version version, CancellationToken cancellationToken)
Download a given BYOND version
+
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+ +
async Task StartAsync(CancellationToken cancellationToken)
+
Task InstallByond(string path, Version version, CancellationToken cancellationToken)
Does actions necessary to get an extracted BYOND installation working
+
Task CreateDirectory(string path, CancellationToken cancellationToken)
Create a directory at path
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
async Task< IByondExecutableLock > UseExecutables(Version requiredVersion, CancellationToken cancellationToken)
Lock the current installation's location and return a IByondExecutableLock
+ + +
For downloading and installing BYOND extractions for a given system
+
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists
+
async Task InstallVersion(Version version, CancellationToken cancellationToken)
Installs a BYOND version if it isn't already
+ +
readonly Dictionary< string, Task > installedVersions
Map of byond Versions to Tasks that complete when they are installed
Definition: ByondManager.cs:69
+
ByondManager(IIOManager ioManager, IByondInstaller byondInstaller, IEventConsumer eventConsumer, ILogger< ByondManager > logger)
Construct a ByondManager
Definition: ByondManager.cs:90
+
readonly ILogger< ByondManager > logger
The ILogger for the ByondManager
Definition: ByondManager.cs:64
+
string DreamDaemonName
Get the file name of the DreamDaemon executable
+
const string VersionFileName
The file in which we store the VersionKey(Version) for installations
Definition: ByondManager.cs:26
+ +
async Task ChangeVersion(Version version, CancellationToken cancellationToken)
Change the active BYOND version
+ + +
readonly IByondInstaller byondInstaller
The IByondInstaller for the ByondManager
Definition: ByondManager.cs:54
+
Interface for using filesystems
Definition: IIOManager.cs:11
+
Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+
Task StopAsync(CancellationToken cancellationToken)
+
static string VersionKey(Version version)
Converts a BYOND version to a string
+
Task< byte[]> ReadAllBytes(string path, CancellationToken cancellationToken)
Returns all the contents of a file at path as a byte array
+
Task DeleteFile(string path, CancellationToken cancellationToken)
Deletes a file at path
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the ByondManager
Definition: ByondManager.cs:74
+ +
const string BinPath
The path to the BYOND bin folder
Definition: ByondManager.cs:21
+ +
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the ByondManager
Definition: ByondManager.cs:59
+ + + +
+ + + + diff --git a/_byond_rights_8cs.html b/_byond_rights_8cs.html new file mode 100644 index 0000000000..786e2d8cba --- /dev/null +++ b/_byond_rights_8cs.html @@ -0,0 +1,113 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/ByondRights.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ByondRights.cs File Reference
+
+ + + + + diff --git a/_byond_rights_8cs_source.html b/_byond_rights_8cs_source.html new file mode 100644 index 0000000000..74d7e057b5 --- /dev/null +++ b/_byond_rights_8cs_source.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/ByondRights.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ByondRights.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
8  [Flags]
9  public enum ByondRights : ulong
10  {
14  None = 0,
15 
19  ReadActive = 1,
20 
24  ListInstalled = 2,
25 
29  ChangeVersion = 4,
30 
34  CancelInstall = 8
35  }
36 }
ByondRights
Rights for Models.Byond
Definition: ByondRights.cs:9
+
User may list all installed BYOND versions
+
User may check the active installed BYOND version
+ +
User may cancel version installations
+ +
User can change Models.Administration.NewVersion
+
+ + + + diff --git a/_byond_test_8cs.html b/_byond_test_8cs.html new file mode 100644 index 0000000000..d4f78b95b7 --- /dev/null +++ b/_byond_test_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/Instance/ByondTest.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ByondTest.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Tests.Instance.ByondTest
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Tests
 
namespace  Tgstation.Server.Tests.Instance
 
+
+ + + + diff --git a/_byond_test_8cs_source.html b/_byond_test_8cs_source.html new file mode 100644 index 0000000000..db47f0a716 --- /dev/null +++ b/_byond_test_8cs_source.html @@ -0,0 +1,101 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/Instance/ByondTest.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ByondTest.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using System;
3 using System.Threading;
4 using System.Threading.Tasks;
6 
8 {
9  sealed class ByondTest
10  {
13 
15  {
16  this.byondClient = byondClient ?? throw new ArgumentNullException(nameof(byondClient));
17  this.jobsClient = jobsClient ?? throw new ArgumentNullException(nameof(jobsClient));
18  }
19 
20  public async Task Run(CancellationToken cancellationToken)
21  {
22  await TestNoVersion(cancellationToken).ConfigureAwait(false);
23  await TestInstall511(cancellationToken).ConfigureAwait(false);
24  }
25 
26  async Task TestInstall511(CancellationToken cancellationToken)
27  {
28  var newModel = new Api.Models.Byond
29  {
30  Version = new Version(511, 1385)
31  };
32  var test = await byondClient.SetActiveVersion(newModel, cancellationToken).ConfigureAwait(false);
33  Assert.IsNotNull(test.InstallJob);
34  Assert.IsNull(test.Version);
35  var job = test.InstallJob;
36  var maxWait = 60; //it's 10MB max give me a break
37  do
38  {
39  await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
40  job = await jobsClient.GetId(job, cancellationToken).ConfigureAwait(false);
41  --maxWait;
42  }
43  while (!job.StoppedAt.HasValue && maxWait > 0);
44  if (!job.StoppedAt.HasValue)
45  {
46  await jobsClient.Cancel(job, cancellationToken).ConfigureAwait(false);
47  Assert.Fail("Byond installation job timed out!");
48  }
49 
50  if (job.ExceptionDetails != null)
51  Assert.Fail(job.ExceptionDetails);
52 
53  var currentShit = await byondClient.ActiveVersion(cancellationToken).ConfigureAwait(false);
54  Assert.AreEqual(newModel.Version, currentShit.Version);
55  }
56 
57  async Task TestNoVersion(CancellationToken cancellationToken)
58  {
59  var allVersionsTask = byondClient.InstalledVersions(cancellationToken);
60  var currentShit = await byondClient.ActiveVersion(cancellationToken).ConfigureAwait(false);
61  Assert.IsNotNull(currentShit);
62  Assert.IsNull(currentShit.InstallJob);
63  Assert.IsNull(currentShit.Version);
64  var otherShit = await allVersionsTask.ConfigureAwait(false);
65  Assert.IsNotNull(otherShit);
66  Assert.AreEqual(0, otherShit.Count);
67  }
68  }
69 }
+
For managing the Byond installation
Definition: IByondClient.cs:11
+ +
Task< IReadOnlyList< Byond > > InstalledVersions(CancellationToken cancellationToken)
Get all installed Byond System.Versions
+ +
ByondTest(IByondClient byondClient, IJobsClient jobsClient)
Definition: ByondTest.cs:14
+ +
async Task TestInstall511(CancellationToken cancellationToken)
Definition: ByondTest.cs:26
+ + + +
async Task TestNoVersion(CancellationToken cancellationToken)
Definition: ByondTest.cs:57
+
Task< Byond > ActiveVersion(CancellationToken cancellationToken)
Get the Byond active System.Version information
+
Task< Byond > SetActiveVersion(Byond byond, CancellationToken cancellationToken)
Updates the Byond information
+ +
Task< Job > GetId(Job job, CancellationToken cancellationToken)
Get a job
+
async Task Run(CancellationToken cancellationToken)
Definition: ByondTest.cs:20
+ +
Task Cancel(Job job, CancellationToken cancellationToken)
Cancels a job
+
+ + + + diff --git a/_channel_8cs.html b/_channel_8cs.html new file mode 100644 index 0000000000..96d06484dc --- /dev/null +++ b/_channel_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Channel.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Channel.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Chat.Channel
 Represents a Providers.IProvider channel More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
+
+ + + + diff --git a/_channel_8cs_source.html b/_channel_8cs_source.html new file mode 100644 index 0000000000..ca556402c2 --- /dev/null +++ b/_channel_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Channel.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Channel.cs
+
+
+Go to the documentation of this file.
1 using Newtonsoft.Json;
2 using System;
3 using System.Globalization;
4 
6 {
10  public sealed class Channel
11  {
15  public string Id { get; set; }
16 
21  [JsonIgnore]
22  public ulong RealId
23  {
24  get => UInt64.Parse(Id, CultureInfo.InvariantCulture);
25  set => Id = value.ToString(CultureInfo.InvariantCulture);
26  }
27 
31  public string FriendlyName { get; set; }
32 
36  public string ConnectionName { get; set; }
37 
41  public bool IsAdminChannel { get; set; }
42 
46  public bool IsPrivateChannel { get; set; }
47 
51  public string Tag { get; set; }
52  }
53 }
+ +
string FriendlyName
The user friendly name of the Channel
Definition: Channel.cs:31
+
bool IsPrivateChannel
If this is a 1-to-1 chat channel
Definition: Channel.cs:46
+
Represents a Providers.IProvider channel
Definition: Channel.cs:10
+
string Id
Backing field for RealId. Represented as a string to avoid BYOND percision loss
Definition: Channel.cs:15
+
string ConnectionName
The name of the connection the Channel belongs to
Definition: Channel.cs:36
+
ulong RealId
The Providers.IProvider channel Id.
Definition: Channel.cs:23
+
bool IsAdminChannel
If this is considered a channel for admin commands
Definition: Channel.cs:41
+
+ + + + diff --git a/_channel_mapping_8cs.html b/_channel_mapping_8cs.html new file mode 100644 index 0000000000..e763d04bbd --- /dev/null +++ b/_channel_mapping_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/ChannelMapping.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ChannelMapping.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Chat.ChannelMapping
 Represents a mapping of a Channel.RealId More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
+
+ + + + diff --git a/_channel_mapping_8cs_source.html b/_channel_mapping_8cs_source.html new file mode 100644 index 0000000000..c979d7afbb --- /dev/null +++ b/_channel_mapping_8cs_source.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/ChannelMapping.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ChannelMapping.cs
+
+
+Go to the documentation of this file.
2 {
6  sealed class ChannelMapping
7  {
11  public long ProviderId { get; set; }
12 
16  public ulong ProviderChannelId { get; set; }
17 
21  public bool IsWatchdogChannel { get; set; }
22 
26  public bool IsUpdatesChannel { get; set; }
27 
31  public Channel Channel { get; set; }
32  }
33 }
bool IsWatchdogChannel
If Channel is a watchdog channel
+
Represents a mapping of a Channel.RealId
+ +
bool IsUpdatesChannel
If the Channel is an updates channel
+
long ProviderId
The Id of the Providers.IProvider
+
Represents a Providers.IProvider channel
Definition: Channel.cs:10
+
ulong ProviderChannelId
The original Components.Chat.Channel.RealId
+
+ + + + diff --git a/_chat_8cs.html b/_chat_8cs.html new file mode 100644 index 0000000000..d658fc8d4a --- /dev/null +++ b/_chat_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Chat.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Chat.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Components.Chat.Chat
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
+
+ + + + diff --git a/_chat_8cs_source.html b/_chat_8cs_source.html new file mode 100644 index 0000000000..bbb71ae2e3 --- /dev/null +++ b/_chat_8cs_source.html @@ -0,0 +1,166 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Chat.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Chat.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using Newtonsoft.Json;
3 using System;
4 using System.Collections.Generic;
5 using System.Globalization;
6 using System.Linq;
7 using System.Threading;
8 using System.Threading.Tasks;
13 using Tgstation.Server.Host.IO;
14 
16 {
18  // TODO: Decomplexify
19  #pragma warning disable CA1506
20  sealed class Chat : IChat, IRestartHandler
21  {
22  const string CommonMention = "!tgs";
23 
28 
33 
38 
43 
48 
52  readonly ILoggerFactory loggerFactory;
53 
57  readonly ILogger<Chat> logger;
58 
62  readonly Dictionary<string, ICommand> builtinCommands;
63 
67  readonly Dictionary<long, IProvider> providers;
68 
72  readonly Dictionary<ulong, ChannelMapping> mappedChannels;
73 
77  readonly List<IJsonTrackingContext> trackingContexts;
78 
82  readonly CancellationTokenSource handlerCts;
83 
87  readonly List<Models.ChatBot> initialChatBots;
88 
93 
98 
102  TaskCompletionSource<object> connectionsUpdated;
103 
108 
112  bool started;
113 
126  {
127  this.providerFactory = providerFactory ?? throw new ArgumentNullException(nameof(providerFactory));
128  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
129  this.commandFactory = commandFactory ?? throw new ArgumentNullException(nameof(commandFactory));
130  if (serverControl == null)
131  throw new ArgumentNullException(nameof(serverControl));
132  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
133  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
134  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
135  this.initialChatBots = initialChatBots?.ToList() ?? throw new ArgumentNullException(nameof(initialChatBots));
136 
137  restartRegistration = serverControl.RegisterForRestart(this);
138 
139  builtinCommands = new Dictionary<string, ICommand>();
140  providers = new Dictionary<long, IProvider>();
141  mappedChannels = new Dictionary<ulong, ChannelMapping>();
142  trackingContexts = new List<IJsonTrackingContext>();
143  handlerCts = new CancellationTokenSource();
144  connectionsUpdated = new TaskCompletionSource<object>();
145  channelIdCounter = 1;
146  }
147 
149  public void Dispose()
150  {
151  restartRegistration.Dispose();
152  handlerCts.Dispose();
153  foreach (var I in providers)
154  I.Value.Dispose();
155  }
156 
164  async Task<IProvider> RemoveProvider(long connectionId, bool updateTrackings, CancellationToken cancellationToken)
165  {
166  IProvider provider;
167  lock (providers)
168  if (!providers.TryGetValue(connectionId, out provider))
169  return null;
170  Task task;
171  lock (mappedChannels)
172  {
173  foreach (var I in mappedChannels.Where(x => x.Value.ProviderId == connectionId).Select(x => x.Key).ToList())
174  mappedChannels.Remove(I);
175 
176  if (updateTrackings)
177  lock (trackingContexts)
178  task = Task.WhenAll(trackingContexts.Select(x => x.SetChannels(mappedChannels.Select(y => y.Value.Channel), cancellationToken)));
179  else
180  task = Task.CompletedTask;
181  }
182 
183  await task.ConfigureAwait(false);
184  return provider;
185  }
186 
194  async Task ProcessMessage(IProvider provider, Message message, CancellationToken cancellationToken)
195  {
196  // map the channel if it's private and we haven't seen it
197  lock (providers)
198  {
199  var providerId = providers.Where(x => x.Value == provider).Select(x => x.Key).First();
200  var enumerable = mappedChannels.Where(x => x.Value.ProviderId == providerId && x.Value.ProviderChannelId == message.User.Channel.RealId);
201  if (message.User.Channel.IsPrivateChannel)
202  lock (mappedChannels)
203  {
204  if (!provider.Connected)
205  return;
206  if (!enumerable.Any())
207  {
208  ulong newId;
209  lock (this)
210  newId = channelIdCounter++;
211  mappedChannels.Add(newId, new ChannelMapping
212  {
213  IsWatchdogChannel = false,
214  ProviderChannelId = message.User.Channel.RealId,
215  ProviderId = providerId,
216  Channel = message.User.Channel
217  });
218  message.User.Channel.RealId = newId;
219  }
220  else
221  message.User.Channel.RealId = enumerable.First().Key;
222  }
223  else
224  {
225  // need to add tag and isAdminChannel
226  var mapping = enumerable.First().Value;
227  message.User.Channel.Id = mapping.Channel.Id;
228  message.User.Channel.Tag = mapping.Channel.Tag;
229  message.User.Channel.IsAdminChannel = mapping.Channel.IsAdminChannel;
230  }
231  }
232 
233  var splits = new List<string>(message.Content.Trim().Split(' '));
234  var address = splits[0];
235  if (address.Length > 1 && (address[address.Length - 1] == ':' || address[address.Length - 1] == ','))
236  address = address.Substring(0, address.Length - 1);
237 
238  address = address.ToUpperInvariant();
239 
240  var addressed = address == CommonMention.ToUpperInvariant() || address == provider.BotMention.ToUpperInvariant();
241 
242  // no mention
243  if (!addressed && !message.User.Channel.IsPrivateChannel)
244  return;
245 
246  logger.LogTrace("Chat command: {0}. User (True provider Id): {1}", message.Content, JsonConvert.SerializeObject(message.User));
247 
248  if (addressed)
249  splits.RemoveAt(0);
250 
251  if (splits.Count == 0)
252  {
253  // just a mention
254  await SendMessage("Hi!", new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
255  return;
256  }
257 
258  var command = splits[0].ToUpperInvariant();
259  splits.RemoveAt(0);
260  var arguments = String.Join(" ", splits);
261 
262  try
263  {
264  async Task<ICommand> GetCommand(string commandName)
265  {
266  if (!builtinCommands.TryGetValue(commandName, out var handler))
267  {
268  var tasks = trackingContexts.Select(x => x.GetCustomCommands(cancellationToken));
269  await Task.WhenAll(tasks).ConfigureAwait(false);
270  handler = tasks.SelectMany(x => x.Result).Where(x => x.Name.ToUpperInvariant() == commandName).FirstOrDefault();
271  }
272 
273  return handler;
274  }
275 
276  const string UnknownCommandMessage = "Unknown command! Type '?' or 'help' for available commands.";
277 
278  if (command == "HELP" || command == "?")
279  {
280  string helpText;
281  if (splits.Count == 0)
282  {
283  var allCommands = builtinCommands.Select(x => x.Value).ToList();
284  var tasks = trackingContexts.Select(x => x.GetCustomCommands(cancellationToken)).ToList();
285  await Task.WhenAll(tasks).ConfigureAwait(false);
286  allCommands.AddRange(tasks.SelectMany(x => x.Result));
287  helpText = String.Format(CultureInfo.InvariantCulture, "Available commands (Type '?' or 'help' and then a command name for more details): {0}", String.Join(", ", allCommands.Select(x => x.Name)));
288  }
289  else
290  {
291  var helpHandler = await GetCommand(splits[0].ToUpperInvariant()).ConfigureAwait(false);
292  if (helpHandler != default)
293  helpText = String.Format(CultureInfo.InvariantCulture, "{0}: {1}{2}", helpHandler.Name, helpHandler.HelpText, helpHandler.AdminOnly ? " - May only be used in admin channels" : String.Empty);
294  else
295  helpText = UnknownCommandMessage;
296  }
297 
298  await SendMessage(helpText, new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
299  return;
300  }
301 
302  var commandHandler = await GetCommand(command).ConfigureAwait(false);
303 
304  if (commandHandler == default)
305  {
306  await SendMessage(UnknownCommandMessage, new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
307  return;
308  }
309 
310  if (commandHandler.AdminOnly && !message.User.Channel.IsAdminChannel)
311  {
312  await SendMessage("Use this command in an admin channel!", new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
313  return;
314  }
315 
316  var result = await commandHandler.Invoke(arguments, message.User, cancellationToken).ConfigureAwait(false);
317  if (result != null)
318  await SendMessage(result, new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
319  }
320  catch (OperationCanceledException)
321  {
322  throw;
323  }
324  catch (Exception e)
325  {
326  // error bc custom commands should reply about why it failed
327  logger.LogError("Error processing chat command: {0}", e);
328  await SendMessage("Internal error processing command!", new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
329  }
330  }
331 
337  async Task MonitorMessages(CancellationToken cancellationToken)
338  {
339  var messageTasks = new Dictionary<IProvider, Task<Message>>();
340  try
341  {
342  while (!cancellationToken.IsCancellationRequested)
343  {
344  // prune disconnected providers
345  foreach (var I in messageTasks.Where(x => !x.Key.Connected).ToList())
346  messageTasks.Remove(I.Key);
347 
348  // add new ones
349  Task updatedTask;
350  lock (this)
351  updatedTask = connectionsUpdated.Task;
352  lock (providers)
353  foreach (var I in providers)
354  if (I.Value.Connected && !messageTasks.ContainsKey(I.Value))
355  messageTasks.Add(I.Value, I.Value.NextMessage(cancellationToken));
356 
357  if (messageTasks.Count == 0)
358  {
359  await asyncDelayer.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
360  continue;
361  }
362 
363  // wait for a message
364  await Task.WhenAny(updatedTask, Task.WhenAny(messageTasks.Select(x => x.Value))).ConfigureAwait(false);
365 
366  // process completed ones
367  foreach (var I in messageTasks.Where(x => x.Value.IsCompleted).ToList())
368  {
369  var message = await I.Value.ConfigureAwait(false);
370 
371  await ProcessMessage(I.Key, message, cancellationToken).ConfigureAwait(false);
372 
373  messageTasks.Remove(I.Key);
374  }
375  }
376  }
377  catch (OperationCanceledException)
378  {
379  logger.LogTrace("Message processing loop cancelled!");
380  }
381  catch (Exception e)
382  {
383  logger.LogError("Message monitor crashed! Exception: {0}", e);
384  }
385  }
386 
388  public async Task ChangeChannels(long connectionId, IEnumerable<Api.Models.ChatChannel> newChannels, CancellationToken cancellationToken)
389  {
390  if (newChannels == null)
391  throw new ArgumentNullException(nameof(newChannels));
392  var provider = await RemoveProvider(connectionId, false, cancellationToken).ConfigureAwait(false);
393  if (provider == null)
394  return;
395  var results = await provider.MapChannels(newChannels, cancellationToken).ConfigureAwait(false);
396  if (results == null) // aborted
397  return;
398  var mappings = Enumerable.Zip(newChannels, results, (x, y) => new ChannelMapping
399  {
400  IsWatchdogChannel = x.IsWatchdogChannel == true,
401  IsUpdatesChannel = x.IsUpdatesChannel == true,
402  ProviderChannelId = y.RealId,
403  ProviderId = connectionId,
404  Channel = y
405  });
406 
407  ulong baseId;
408  lock (this)
409  {
410  baseId = channelIdCounter;
411  channelIdCounter += (ulong)results.Count;
412  }
413 
414  Task task;
415  lock (mappedChannels)
416  {
417  lock (providers)
418  if (!providers.TryGetValue(connectionId, out IProvider verify) || verify != provider) // aborted again
419  return;
420  foreach (var I in mappings)
421  {
422  var newId = baseId++;
423  mappedChannels.Add(newId, I);
424  I.Channel.RealId = newId;
425  }
426 
427  lock (trackingContexts)
428  task = Task.WhenAll(trackingContexts.Select(x => x.SetChannels(mappedChannels.Select(y => y.Value.Channel), cancellationToken)));
429  }
430 
431  await task.ConfigureAwait(false);
432  }
433 
435  public async Task ChangeSettings(ChatBot newSettings, CancellationToken cancellationToken)
436  {
437  if (newSettings == null)
438  throw new ArgumentNullException(nameof(newSettings));
439  IProvider provider;
440 
441  async Task DisconnectProvider(IProvider p)
442  {
443  try
444  {
445  await p.Disconnect(cancellationToken).ConfigureAwait(false);
446  }
447  finally
448  {
449  p.Dispose();
450  }
451  }
452 
453  Task disconnectTask;
454  lock (providers)
455  {
456  // raw settings changes forces a rebuild of the provider
457  if (providers.TryGetValue(newSettings.Id, out provider))
458  {
459  providers.Remove(newSettings.Id);
460  disconnectTask = DisconnectProvider(provider);
461  }
462  else
463  disconnectTask = Task.CompletedTask;
464  if (newSettings.Enabled.Value)
465  {
466  provider = providerFactory.CreateProvider(newSettings);
467  providers.Add(newSettings.Id, provider);
468  }
469  }
470 
471  lock (mappedChannels)
472  foreach (var I in mappedChannels.Where(x => x.Value.ProviderId == newSettings.Id).Select(x => x.Key).ToList())
473  mappedChannels.Remove(I);
474 
475  await disconnectTask.ConfigureAwait(false);
476 
477  if (started)
478  {
479  if (newSettings.Enabled.Value)
480  await provider.Connect(cancellationToken).ConfigureAwait(false);
481  lock (this)
482  {
483  // same thread shennanigans
484  var oldOne = connectionsUpdated;
485  connectionsUpdated = new TaskCompletionSource<object>();
486  oldOne.SetResult(null);
487  }
488  }
489  }
490 
492  public Task SendMessage(string message, IEnumerable<ulong> channelIds, CancellationToken cancellationToken)
493  {
494  if (message == null)
495  throw new ArgumentNullException(nameof(message));
496  if (channelIds == null)
497  throw new ArgumentNullException(nameof(channelIds));
498 
499  return Task.WhenAll(channelIds.Select(x =>
500  {
501  ChannelMapping channelMapping;
502  lock (mappedChannels)
503  if (!mappedChannels.TryGetValue(x, out channelMapping))
504  return Task.CompletedTask;
505  IProvider provider;
506  lock (providers)
507  if (!providers.TryGetValue(channelMapping.ProviderId, out provider))
508  return Task.CompletedTask;
509  return provider.SendMessage(channelMapping.ProviderChannelId, message, cancellationToken);
510  }));
511  }
512 
514  public Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
515  {
516  List<ulong> wdChannels;
517  message = String.Format(CultureInfo.InvariantCulture, "WD: {0}", message);
518  lock (mappedChannels) // so it doesn't change while we're using it
519  wdChannels = mappedChannels.Where(x => x.Value.IsWatchdogChannel).Select(x => x.Key).ToList();
520  return SendMessage(message, wdChannels, cancellationToken);
521  }
522 
524  public Task SendUpdateMessage(string message, CancellationToken cancellationToken)
525  {
526  List<ulong> wdChannels;
527  message = String.Format(CultureInfo.InvariantCulture, "DM: {0}", message);
528  lock (mappedChannels) // so it doesn't change while we're using it
529  wdChannels = mappedChannels.Where(x => x.Value.IsUpdatesChannel).Select(x => x.Key).ToList();
530  return SendMessage(message, wdChannels, cancellationToken);
531  }
532 
534  public async Task StartAsync(CancellationToken cancellationToken)
535  {
536  foreach (var I in commandFactory.GenerateCommands())
537  builtinCommands.Add(I.Name.ToUpperInvariant(), I);
538  await Task.WhenAll(initialChatBots.Select(x => ChangeSettings(x, cancellationToken))).ConfigureAwait(false);
539  await Task.WhenAll(providers.Select(x => x.Value).Select(x => x.Connect(cancellationToken))).ConfigureAwait(false);
540  await Task.WhenAll(initialChatBots.Select(x => ChangeChannels(x.Id, x.Channels, cancellationToken))).ConfigureAwait(false);
542  started = true;
543  }
544 
546  public async Task StopAsync(CancellationToken cancellationToken)
547  {
548  handlerCts.Cancel();
549  await chatHandler.ConfigureAwait(false);
550  await Task.WhenAll(providers.Select(x => x.Value).Select(x => x.Disconnect(cancellationToken))).ConfigureAwait(false);
551  }
552 
554  public async Task<IJsonTrackingContext> TrackJsons(string basePath, string channelsJsonName, string commandsJsonName, CancellationToken cancellationToken)
555  {
556  if (customCommandHandler == null)
557  throw new InvalidOperationException("RegisterCommandHandler() hasn't been called!");
558  JsonTrackingContext context = null;
559  context = new JsonTrackingContext(
560  ioManager,
562  loggerFactory.CreateLogger<JsonTrackingContext>(),
563  () =>
564  {
565  lock (trackingContexts)
566  trackingContexts.Remove(context);
567  },
568  ioManager.ConcatPath(basePath, commandsJsonName),
569  ioManager.ConcatPath(basePath, channelsJsonName));
570  Task task;
571  lock (trackingContexts)
572  {
573  trackingContexts.Add(context);
574  lock (mappedChannels)
575  task = context.SetChannels(mappedChannels.Select(y => y.Value.Channel), cancellationToken);
576  }
577 
578  await task.ConfigureAwait(false);
579  return context;
580  }
581 
583  public bool Connected(long connectionId)
584  {
585  lock (providers)
586  return providers.TryGetValue(connectionId, out var provider) && provider.Connected;
587  }
588 
591  {
592  if (this.customCommandHandler != null)
593  throw new InvalidOperationException("RegisterCommandHandler() already called!");
594  this.customCommandHandler = customCommandHandler ?? throw new ArgumentNullException(nameof(customCommandHandler));
595  }
596 
598  public async Task DeleteConnection(long connectionId, CancellationToken cancellationToken)
599  {
600  var provider = await RemoveProvider(connectionId, true, cancellationToken).ConfigureAwait(false);
601  if (provider != null)
602  try
603  {
604  await provider.Disconnect(cancellationToken).ConfigureAwait(false);
605  }
606  finally
607  {
608  provider.Dispose();
609  }
610  }
611 
613  public Task HandleRestart(Version updateVersion, CancellationToken cancellationToken)
614  {
615  var message = updateVersion == null ? "TGS: Restart requested..." : String.Format(CultureInfo.InvariantCulture, "TGS: Updating to version {0}...", updateVersion);
616  List<ulong> wdChannels;
617  lock (mappedChannels) // so it doesn't change while we're using it
618  wdChannels = mappedChannels.Select(x => x.Key).ToList();
619  return SendMessage(message, wdChannels, cancellationToken);
620  }
621  }
622 }
void RegisterCommandHandler(ICustomCommandHandler customCommandHandler)
Registers a customCommandHandler to use
Definition: Chat.cs:590
+
bool IsWatchdogChannel
If Channel is a watchdog channel
+
Represents a mapping of a Channel.RealId
+
User User
The Components.Chat.User who sent the Message
Definition: Message.cs:16
+
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the Chat
Definition: Chat.cs:52
+ + +
async Task SetChannels(IEnumerable< Channel > channels, CancellationToken cancellationToken)
Writes information about connected channels to the IJsonTrackingContext
+ + + + +
Task Disconnect(CancellationToken cancellationToken)
Gracefully disconnects the provider. Implies a call to IDisposable.Dispose
+
Channel Channel
The Components.Chat.Channel the user spoke from
Definition: User.cs:40
+
Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured watchdog channels
Definition: Chat.cs:514
+
bool started
If StartAsync(CancellationToken) has been called
Definition: Chat.cs:112
+
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:67
+
Represents a message recieved by a IProvider
Definition: Message.cs:6
+
readonly List< Models.ChatBot > initialChatBots
The initial Models.ChatBot for the Chat
Definition: Chat.cs:87
+
Chat(IProviderFactory providerFactory, IIOManager ioManager, ICommandFactory commandFactory, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILoggerFactory loggerFactory, ILogger< Chat > logger, IEnumerable< Models.ChatBot > initialChatBots)
Construct a Chat
Definition: Chat.cs:125
+ +
IProvider CreateProvider(ChatBot settings)
Create a IProvider
+ + +
Manage the server chat bots
Definition: ChatBot.cs:9
+ + +
bool Connected(long connectionId)
If a given set of ChatBot is connected
Definition: Chat.cs:583
+
For managing connected chat services
Definition: IChat.cs:13
+
async Task DeleteConnection(long connectionId, CancellationToken cancellationToken)
Disconnects and deletes a given connection
Definition: Chat.cs:598
+ + +
async Task< IProvider > RemoveProvider(long connectionId, bool updateTrackings, CancellationToken cancellationToken)
Remove a IProvider from providers and mappedChannels optionally updating the trackingContexts as well
Definition: Chat.cs:164
+ +
readonly IProviderFactory providerFactory
The IProviderFactory for the Chat
Definition: Chat.cs:27
+ +
IReadOnlyList< ICommand > GenerateCommands()
Generate builtin ICommands
+
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+
bool IsPrivateChannel
If this is a 1-to-1 chat channel
Definition: Channel.cs:46
+
TaskCompletionSource< object > connectionsUpdated
The TaskCompletionSource<TResult> that completes when ChatBots change
Definition: Chat.cs:102
+
readonly ILogger< Chat > logger
The ILogger for the Chat
Definition: Chat.cs:57
+ +
readonly ICommandFactory commandFactory
The ICommandFactory for the Chat
Definition: Chat.cs:37
+
Task SendUpdateMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured update channels
Definition: Chat.cs:524
+ +
async Task ProcessMessage(IProvider provider, Message message, CancellationToken cancellationToken)
Processes a message
Definition: Chat.cs:194
+
async Task StopAsync(CancellationToken cancellationToken)
Definition: Chat.cs:546
+
bool? Enabled
If the connection is enabled
Definition: ChatBot.cs:25
+
Represents a Providers.IProvider channel
Definition: Channel.cs:10
+
string Id
Backing field for RealId. Represented as a string to avoid BYOND percision loss
Definition: Channel.cs:15
+ +
async Task MonitorMessages(CancellationToken cancellationToken)
Monitors active providers for new Messages
Definition: Chat.cs:337
+ + +
readonly IIOManager ioManager
The IIOManager for the Chat
Definition: Chat.cs:32
+
readonly Dictionary< ulong, ChannelMapping > mappedChannels
Map of Channel.RealIds to ChannelMappings
Definition: Chat.cs:72
+
string BotMention
The string that indicates the IProvider was mentioned
Definition: IProvider.cs:21
+
ulong channelIdCounter
Used for remapping Channel.RealIds
Definition: Chat.cs:107
+
ulong RealId
The Providers.IProvider channel Id.
Definition: Channel.cs:23
+ +
async Task ChangeSettings(ChatBot newSettings, CancellationToken cancellationToken)
Change chat settings. If the ChatBot.Id is not currently in use, a new connection will be made instea...
Definition: Chat.cs:435
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the Chat
Definition: Chat.cs:47
+
Handles Commands.ICommands that map to those defined in a IJsonTrackingContext
+
async Task StartAsync(CancellationToken cancellationToken)
Definition: Chat.cs:534
+ +
Task chatHandler
The Task that monitors incoming chat messages
Definition: Chat.cs:97
+
readonly Dictionary< string, ICommand > builtinCommands
Unchanging ICommands in the Chat mapped by ICommand.Name
Definition: Chat.cs:62
+
async Task< IJsonTrackingContext > TrackJsons(string basePath, string channelsJsonName, string commandsJsonName, CancellationToken cancellationToken)
Start tracking json files for commands and channels
Definition: Chat.cs:554
+
Interface for using filesystems
Definition: IIOManager.cs:11
+
Task SendMessage(string message, IEnumerable< ulong > channelIds, CancellationToken cancellationToken)
Send a chat message to a given set of channelIds
Definition: Chat.cs:492
+
Represents the lifetime of a IRestartHandler registration
+
readonly List< IJsonTrackingContext > trackingContexts
The active IJsonTrackingContexts for the Chat
Definition: Chat.cs:77
+
bool IsAdminChannel
If this is considered a channel for admin commands
Definition: Channel.cs:41
+
IRestartRegistration RegisterForRestart(IRestartHandler handler)
Register a given handler to run before stopping the server for a restart
+ +
async Task ChangeChannels(long connectionId, IEnumerable< Api.Models.ChatChannel > newChannels, CancellationToken cancellationToken)
Change chat channels
Definition: Chat.cs:388
+
ICustomCommandHandler customCommandHandler
The ICustomCommandHandler for the ChangeChannels(long, IEnumerable<Api.Models.ChatChannel>,...
Definition: Chat.cs:92
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
Task HandleRestart(Version updateVersion, CancellationToken cancellationToken)
Handle a restart of the server
Definition: Chat.cs:613
+
readonly IRestartRegistration restartRegistration
The IRestartRegistration for the Chat
Definition: Chat.cs:42
+
readonly CancellationTokenSource handlerCts
The CancellationTokenSource for chatHandler
Definition: Chat.cs:82
+ +
Represents a service that may take an updated Host assembly and run it, stopping the current assembly...
+ +
+ + + + diff --git a/_chat_bot_rights_8cs.html b/_chat_bot_rights_8cs.html new file mode 100644 index 0000000000..cdc71ef007 --- /dev/null +++ b/_chat_bot_rights_8cs.html @@ -0,0 +1,119 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/ChatBotRights.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ChatBotRights.cs File Reference
+
+ + + + + diff --git a/_chat_bot_rights_8cs_source.html b/_chat_bot_rights_8cs_source.html new file mode 100644 index 0000000000..de63779b69 --- /dev/null +++ b/_chat_bot_rights_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/ChatBotRights.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ChatBotRights.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
8  [Flags]
9  public enum ChatBotRights : ulong
10  {
14  None = 0,
15 
19  WriteEnabled = 1,
20 
24  WriteProvider = 2,
25 
29  WriteChannels = 4,
30 
35 
40 
44  Read = 32,
45 
49  Create = 64,
50 
54  Delete = 128,
55 
59  WriteName = 256,
60  }
61 }
User can read Models.Internal.ChatBot.ConnectionString requires Read
+
User can change Models.Internal.ChatBot.Name
+
User can change Models.Internal.ChatBot.Provider
+ + +
User can change Models.Internal.ChatBot.ConnectionString
+
User can create new Models.ChatBot
+
User can change Models.Internal.ChatBot.Enabled
+ +
User can change Models.ChatBot.Channels
+
User can read all chat settings except Models.Internal.ChatBot.ConnectionString
+
ChatBotRights
Rights for Models.ChatBot
Definition: ChatBotRights.cs:9
+
+ + + + diff --git a/_chat_bots_client_8cs.html b/_chat_bots_client_8cs.html new file mode 100644 index 0000000000..adb17ed7a4 --- /dev/null +++ b/_chat_bots_client_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/ChatBotsClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ChatBotsClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Client.Components.ChatBotsClient
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
namespace  Tgstation.Server.Client.Components
 
+
+ + + + diff --git a/_chat_bots_client_8cs_source.html b/_chat_bots_client_8cs_source.html new file mode 100644 index 0000000000..da032b1184 --- /dev/null +++ b/_chat_bots_client_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/ChatBotsClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ChatBotsClient.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Threading;
4 using System.Threading.Tasks;
5 using Tgstation.Server.Api;
7 
9 {
12  {
17 
21  readonly Instance instance;
22 
29  {
30  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
31  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
32  }
33 
35  public Task<ChatBot> Create(ChatBot settings, CancellationToken cancellationToken) => apiClient.Create<ChatBot, ChatBot>(Routes.Chat, settings ?? throw new ArgumentNullException(nameof(settings)), instance.Id, cancellationToken);
36 
38  public Task Delete(ChatBot settings, CancellationToken cancellationToken) => apiClient.Delete(Routes.SetID(Routes.Chat, settings?.Id ?? throw new ArgumentNullException(nameof(settings))), instance.Id, cancellationToken);
39 
41  public Task<IReadOnlyList<ChatBot>> List(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<ChatBot>>(Routes.List(Routes.Chat), instance.Id, cancellationToken);
42 
44  public Task<ChatBot> Update(ChatBot settings, CancellationToken cancellationToken) => apiClient.Update<ChatBot, ChatBot>(Routes.Chat, settings ?? throw new ArgumentNullException(nameof(settings)), instance.Id, cancellationToken);
45 
47  public Task<ChatBot> GetId(ChatBot settings, CancellationToken cancellationToken) => apiClient.Read<ChatBot>(Routes.SetID(Routes.Chat, (settings ?? throw new ArgumentNullException(nameof(settings))).Id), instance.Id, cancellationToken);
48  }
49 }
Task< ChatBot > Update(ChatBot settings, CancellationToken cancellationToken)
Updates a ChatBot's setttings
+
Task< IReadOnlyList< ChatBot > > List(CancellationToken cancellationToken)
List the ChatBots
+ +
Task< ChatBot > GetId(ChatBot settings, CancellationToken cancellationToken)
Get a ChatBot's setttings
+ +
Task< ChatBot > Create(ChatBot settings, CancellationToken cancellationToken)
Create a ChatBot
+ +
Routes to a server actions
Definition: Routes.cs:9
+ +
Task< ChatBot > ChatBot(Routes.Chat, settings ?? throw new ArgumentNullException(nameof(settings)), instance.Id, cancellationToken)
+ +
const string Chat
The Models.ChatBot controller
Definition: Routes.cs:69
+
Task Delete(ChatBot settings, CancellationToken cancellationToken)
Delete a ChatBot
+ +
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Metadata about a server instance
Definition: Instance.cs:9
+
static string SetID(string route, long id)
Apply an id postfix to a route
+
Task Delete(string route, CancellationToken cancellationToken)
Run an HTTP DELETE request
+
static string List(string route)
Get the /List postfix for a route
+ +
readonly Instance instance
The Instance for the ChatBotsClient
+
Web interface for the API
Definition: IApiClient.cs:11
+
readonly IApiClient apiClient
The IApiClient for the ChatBotsClient
+
ChatBotsClient(IApiClient apiClient, Instance instance)
Construct a ChatBotsClient
+ +
+ + + + diff --git a/_chat_command_8cs.html b/_chat_command_8cs.html new file mode 100644 index 0000000000..c7e4f284ba --- /dev/null +++ b/_chat_command_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/ChatCommand.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ChatCommand.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Interop.ChatCommand
 Represents a chat command to be handled by DD More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Interop
 
+
+ + + + diff --git a/_chat_command_8cs_source.html b/_chat_command_8cs_source.html new file mode 100644 index 0000000000..1278424d91 --- /dev/null +++ b/_chat_command_8cs_source.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/ChatCommand.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ChatCommand.cs
+
+ + + + + diff --git a/_chat_connection_string_builder_8cs.html b/_chat_connection_string_builder_8cs.html new file mode 100644 index 0000000000..22054fe1ee --- /dev/null +++ b/_chat_connection_string_builder_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/ChatConnectionStringBuilder.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ChatConnectionStringBuilder.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.Internal.ChatConnectionStringBuilder
 Helper for building ChatBot.ConnectionStrings More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
namespace  Tgstation.Server.Api.Models.Internal
 
+
+ + + + diff --git a/_chat_connection_string_builder_8cs_source.html b/_chat_connection_string_builder_8cs_source.html new file mode 100644 index 0000000000..665a63658f --- /dev/null +++ b/_chat_connection_string_builder_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/ChatConnectionStringBuilder.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ChatConnectionStringBuilder.cs
+
+
+Go to the documentation of this file.
2 {
6  public abstract class ChatConnectionStringBuilder
7  {
11  public abstract bool Valid { get; }
12 
17  public abstract override string ToString();
18  }
19 }
abstract override string ToString()
Gets the ChatBot.ConnectionString associated with the ChatConnectionStringBuilder
+ + +
abstract bool Valid
If the ChatConnectionStringBuilder evaluates to a valid ChatBot.ConnectionString
+
+ + + + diff --git a/_chat_controller_8cs.html b/_chat_controller_8cs.html new file mode 100644 index 0000000000..688d8e75b0 --- /dev/null +++ b/_chat_controller_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/ChatController.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ChatController.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Controllers.ChatController
 ModelController<TModel> for managing Api.Models.ChatBots More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Controllers
 
+
+ + + + diff --git a/_chat_controller_8cs_source.html b/_chat_controller_8cs_source.html new file mode 100644 index 0000000000..fb9811556f --- /dev/null +++ b/_chat_controller_8cs_source.html @@ -0,0 +1,123 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/ChatController.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ChatController.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Linq.Expressions;
5 using System.Net;
6 using System.Reflection;
7 using System.Threading;
8 using System.Threading.Tasks;
9 using Microsoft.AspNetCore.Mvc;
10 using Microsoft.EntityFrameworkCore;
11 using Microsoft.Extensions.Logging;
12 using Tgstation.Server.Api;
18 using Z.EntityFramework.Plus;
19 
21 {
25  [Route(Routes.Chat)]
26  public sealed class ChatController : ModelController<Api.Models.ChatBot>
27  {
32 
40  public ChatController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, ILogger<ChatController> logger) : base(databaseContext, authenticationContextFactory, logger, true)
41  {
42  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
43  }
44 
50  static Models.ChatChannel ConvertApiChatChannel(Api.Models.ChatChannel api) => new Models.ChatChannel
51  {
52  DiscordChannelId = api.DiscordChannelId,
53  IrcChannel = api.IrcChannel,
54  IsAdminChannel = api.IsAdminChannel ?? false,
55  IsWatchdogChannel = api.IsWatchdogChannel ?? false,
56  IsUpdatesChannel = api.IsUpdatesChannel ?? false,
57  Tag = api.Tag
58  };
59 
61  [TgsAuthorize(ChatBotRights.Create)]
62  public override async Task<IActionResult> Create([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)
63  {
64  if (model == null)
65  throw new ArgumentNullException(nameof(model));
66 
67  if (String.IsNullOrWhiteSpace(model.Name))
68  return BadRequest(new ErrorMessage { Message = "name cannot be null or whitespace!" });
69 
70  if (String.IsNullOrWhiteSpace(model.ConnectionString))
71  return BadRequest(new ErrorMessage { Message = "connection_string cannot be null or whitespace!" });
72 
73  if (!model.Provider.HasValue)
74  return BadRequest(new ErrorMessage { Message = "provider cannot be null!" });
75 
76  switch (model.Provider)
77  {
78  case ChatProvider.Discord:
79  case ChatProvider.Irc:
80  break;
81  default:
82  return BadRequest(new ErrorMessage { Message = "Invalid provider!" });
83  }
84 
85  if (!model.ValidateProviderChannelTypes())
86  return BadRequest(new ErrorMessage { Message = "One or more of channels aren't formatted correctly for the given provider!" });
87 
88  model.Enabled = model.Enabled ?? false;
89 
90  // try to update das db first
91  var dbModel = new Models.ChatBot
92  {
93  Name = model.Name,
94  ConnectionString = model.ConnectionString,
95  Enabled = model.Enabled,
96  Channels = model.Channels?.Select(x => ConvertApiChatChannel(x)).ToList() ?? new List<Models.ChatChannel>(), // important that this isn't null
97  InstanceId = Instance.Id,
98  Provider = model.Provider,
99  };
100 
101  DatabaseContext.ChatBots.Add(dbModel);
102 
103  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
104 
105  try
106  {
107  try
108  {
109  // try to create it
110  var instance = instanceManager.GetInstance(Instance);
111  await instance.Chat.ChangeSettings(dbModel, cancellationToken).ConfigureAwait(false);
112 
113  if (dbModel.Channels.Count > 0)
114  await instance.Chat.ChangeChannels(dbModel.Id, dbModel.Channels, cancellationToken).ConfigureAwait(false);
115  }
116  catch
117  {
118  // undo the add
119  DatabaseContext.ChatBots.Remove(dbModel);
120  await DatabaseContext.Save(default).ConfigureAwait(false);
121  throw;
122  }
123  }
124  catch (InvalidOperationException e)
125  {
126  return BadRequest(new ErrorMessage { Message = e.Message });
127  }
128 
129  return StatusCode((int)HttpStatusCode.Created, dbModel.ToApi());
130  }
131 
133  [TgsAuthorize(ChatBotRights.Delete)]
134  public override async Task<IActionResult> Delete(long id, CancellationToken cancellationToken)
135  {
136  var instance = instanceManager.GetInstance(Instance);
137  await Task.WhenAll(instance.Chat.DeleteConnection(id, cancellationToken), DatabaseContext.ChatBots.Where(x => x.Id == id).DeleteAsync(cancellationToken)).ConfigureAwait(false);
138 
139  return Ok();
140  }
141 
143  [TgsAuthorize(ChatBotRights.Read)]
144  public override async Task<IActionResult> List(CancellationToken cancellationToken)
145  {
146  var query = DatabaseContext.ChatBots.Where(x => x.InstanceId == Instance.Id).Include(x => x.Channels);
147 
148  var results = await query.ToListAsync(cancellationToken).ConfigureAwait(false);
149 
150  var connectionStrings = (AuthenticationContext.GetRight(RightsType.ChatBots) & (ulong)ChatBotRights.ReadConnectionString) != 0;
151 
152  if (!connectionStrings)
153  foreach (var I in results)
154  I.ConnectionString = null;
155 
156  return Json(results.Select(x => x.ToApi()));
157  }
158 
160  [TgsAuthorize(ChatBotRights.Read)]
161  public override async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
162  {
163  var query = DatabaseContext.ChatBots.Where(x => x.Id == id).Include(x => x.Channels);
164 
165  var results = await query.FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
166  if (results == default)
167  return StatusCode((int)HttpStatusCode.Gone);
168 
169  var connectionStrings = (AuthenticationContext.GetRight(RightsType.ChatBots) & (ulong)ChatBotRights.ReadConnectionString) != 0;
170 
171  if (!connectionStrings)
172  results.ConnectionString = null;
173 
174  return Json(results.ToApi());
175  }
176 
178  #pragma warning disable CA1506 // TODO: Decomplexify
179  [TgsAuthorize(ChatBotRights.WriteChannels | ChatBotRights.WriteConnectionString | ChatBotRights.WriteEnabled | ChatBotRights.WriteName | ChatBotRights.WriteProvider)]
180  public override async Task<IActionResult> Update([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)
181  {
182  if (model == null)
183  throw new ArgumentNullException(nameof(model));
184 
185  if (model.Provider.HasValue && !model.ValidateProviderChannelTypes())
186  return BadRequest(new ErrorMessage { Message = "One or more of channels aren't formatted correctly for the given provider!" });
187 
188  var query = DatabaseContext.ChatBots.Where(x => x.InstanceId == Instance.Id && x.Id == model.Id).Include(x => x.Channels);
189 
190  var current = await query.FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
191 
192  if (current == default)
193  return StatusCode((int)HttpStatusCode.Gone);
194 
195  var userRights = (ChatBotRights)AuthenticationContext.GetRight(RightsType.ChatBots);
196 
197  bool anySettingsModified = false;
198 
199  bool CheckModified<T>(Expression<Func<Api.Models.Internal.ChatBot, T>> expression, ChatBotRights requiredRight)
200  {
201  var memberSelectorExpression = (MemberExpression)expression.Body;
202  var property = (PropertyInfo)memberSelectorExpression.Member;
203 
204  var newVal = property.GetValue(model);
205  if (newVal == null)
206  return false;
207  if (!userRights.HasFlag(requiredRight) && property.GetValue(current) != newVal)
208  return true;
209 
210  property.SetValue(current, newVal);
211  anySettingsModified = true;
212  return false;
213  }
214 
215  var oldProvider = current.Provider;
216 
217  if (CheckModified(x => x.ConnectionString, ChatBotRights.WriteConnectionString)
218  || CheckModified(x => x.Enabled, ChatBotRights.WriteEnabled)
219  || CheckModified(x => x.Name, ChatBotRights.WriteName)
220  || CheckModified(x => x.Provider, ChatBotRights.WriteProvider)
221  || (model.Channels != null && !userRights.HasFlag(ChatBotRights.WriteChannels)))
222  return Forbid();
223 
224  var hasChannels = model.Channels != null;
225  if (hasChannels || (model.Provider.HasValue && model.Provider != oldProvider))
226  {
227  DatabaseContext.ChatChannels.RemoveRange(current.Channels);
228  if (hasChannels)
229  {
230  var dbChannels = model.Channels.Select(x => ConvertApiChatChannel(x)).ToList();
231  DatabaseContext.ChatChannels.AddRange(dbChannels);
232  current.Channels = dbChannels;
233  }
234  else
235  current.Channels.Clear();
236  }
237 
238  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
239 
241 
242  if (anySettingsModified)
243  await chat.ChangeSettings(current, cancellationToken).ConfigureAwait(false); // have to rebuild the thing first
244 
245  if (model.Channels != null || anySettingsModified)
246  await chat.ChangeChannels(current.Id, current.Channels, cancellationToken).ConfigureAwait(false);
247 
248  if (userRights.HasFlag(ChatBotRights.Read))
249  {
250  if (!userRights.HasFlag(ChatBotRights.ReadConnectionString))
251  current.ConnectionString = null;
252  return Json(current.ToApi());
253  }
254 
255  return Ok();
256  }
257  #pragma warning restore CA1506
258  }
259 }
+ + + + +
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+ +
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+ + +
override async Task< IActionResult > Delete(long id, CancellationToken cancellationToken)
Attempt to delete a model with a particular id
+
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+ +
Routes to a server actions
Definition: Routes.cs:9
+
ChatController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, ILogger< ChatController > logger)
Construct a ChatController
+
IChat Chat
The IChat for the IInstance
Definition: IInstance.cs:37
+
override async Task< IActionResult > Update([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)
+
string Message
A human readable description of the error
Definition: ErrorMessage.cs:13
+
const string Chat
The Models.ChatBot controller
Definition: Routes.cs:69
+
override async Task< IActionResult > GetId(long id, CancellationToken cancellationToken)
Attempt to get a specific a TModel
+ +
ulong? DiscordChannelId
The Discord channel ID
Definition: ChatChannel.cs:18
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
override async Task< IActionResult > Create([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)
+
An ApiController representing a TModel
+ + + +
override async Task< IActionResult > List(CancellationToken cancellationToken)
Attempt to list entries of the TModel
+
Metadata about a server instance
Definition: Instance.cs:9
+ +
ModelController<TModel> for managing Api.Models.ChatBots
+
static Models.ChatChannel ConvertApiChatChannel(Api.Models.ChatChannel api)
Converts api to a ChatChannel
+
readonly IInstanceManager instanceManager
The IInstanceManager for the ChatController
+ +
ChatProvider
Represents a chat service provider
Definition: ChatProvider.cs:6
+
ChatBotRights
Rights for Models.ChatBot
Definition: ChatBotRights.cs:9
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ + +
+ + + + diff --git a/_chat_factory_8cs.html b/_chat_factory_8cs.html new file mode 100644 index 0000000000..4e80425acd --- /dev/null +++ b/_chat_factory_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/ChatFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ChatFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Components.Chat.ChatFactory
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
+
+ + + + diff --git a/_chat_factory_8cs_source.html b/_chat_factory_8cs_source.html new file mode 100644 index 0000000000..453d221ab0 --- /dev/null +++ b/_chat_factory_8cs_source.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/ChatFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ChatFactory.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using System;
3 using System.Collections.Generic;
6 using Tgstation.Server.Host.IO;
7 
9 {
11  sealed class ChatFactory : IChatFactory
12  {
16  readonly ILoggerFactory loggerFactory;
17 
22 
27 
32 
41  {
42  this.providerFactory = providerFactory ?? throw new ArgumentNullException(nameof(providerFactory));
43  this.serverControl = serverControl ?? throw new ArgumentNullException(nameof(serverControl));
44  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
45  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
46  }
47 
49  public IChat CreateChat(IIOManager ioManager, ICommandFactory commandFactory, IEnumerable<Models.ChatBot> initialChatBots) => new Chat(providerFactory, ioManager, commandFactory, serverControl, asyncDelayer, loggerFactory, loggerFactory.CreateLogger<Chat>(), initialChatBots);
50  }
51 }
+ + + +
ChatFactory(IProviderFactory providerFactory, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILoggerFactory loggerFactory)
Construct a ChatFactory
Definition: ChatFactory.cs:40
+
For managing connected chat services
Definition: IChat.cs:13
+ + +
readonly IServerControl serverControl
The IServerControl for the ChatFactory
Definition: ChatFactory.cs:26
+ +
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the ChatFactory
Definition: ChatFactory.cs:31
+
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the ChatFactory
Definition: ChatFactory.cs:16
+ + + + +
Interface for using filesystems
Definition: IIOManager.cs:11
+
readonly IProviderFactory providerFactory
The IProviderFactory for the ChatFactory
Definition: ChatFactory.cs:21
+ + +
IChat CreateChat(IIOManager ioManager, ICommandFactory commandFactory, IEnumerable< Models.ChatBot > initialChatBots)
Create a IChat
+
Represents a service that may take an updated Host assembly and run it, stopping the current assembly...
+ +
+ + + + diff --git a/_chat_provider_8cs.html b/_chat_provider_8cs.html new file mode 100644 index 0000000000..6cbcbd5f46 --- /dev/null +++ b/_chat_provider_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/ChatProvider.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ChatProvider.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+ + + + +

+Enumerations

enum  Tgstation.Server.Api.Models.ChatProvider { Tgstation.Server.Api.Models.ChatProvider.Irc, +Tgstation.Server.Api.Models.ChatProvider.Discord + }
 Represents a chat service provider More...
 
+
+ + + + diff --git a/_chat_provider_8cs_source.html b/_chat_provider_8cs_source.html new file mode 100644 index 0000000000..3bade4f02c --- /dev/null +++ b/_chat_provider_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/ChatProvider.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ChatProvider.cs
+
+
+Go to the documentation of this file.
2 {
6  public enum ChatProvider
7  {
11  Irc,
12 
16  Discord
17  }
18 }
+ + +
ChatProvider
Represents a chat service provider
Definition: ChatProvider.cs:6
+
+ + + + diff --git a/_claims_injector_8cs.html b/_claims_injector_8cs.html new file mode 100644 index 0000000000..1e94c5c7e8 --- /dev/null +++ b/_claims_injector_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/ClaimsInjector.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ClaimsInjector.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Security.ClaimsInjector
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Security
 
+
+ + + + diff --git a/_claims_injector_8cs_source.html b/_claims_injector_8cs_source.html new file mode 100644 index 0000000000..f66b99a923 --- /dev/null +++ b/_claims_injector_8cs_source.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/ClaimsInjector.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ClaimsInjector.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Authentication.JwtBearer;
2 using Microsoft.AspNetCore.Http;
3 using System;
4 using System.Collections.Generic;
5 using System.Globalization;
6 using System.IdentityModel.Tokens.Jwt;
7 using System.Security.Claims;
8 using System.Threading;
9 using System.Threading.Tasks;
10 using Tgstation.Server.Api;
13 
15 {
18  {
23 
28 
35  {
36  this.databaseContext = databaseContext ?? throw new ArgumentNullException(nameof(databaseContext));
37  this.authenticationContextFactory = authenticationContextFactory ?? throw new ArgumentNullException(nameof(authenticationContextFactory));
38  }
39 
41  public async Task InjectClaimsIntoContext(TokenValidatedContext tokenValidatedContext, CancellationToken cancellationToken)
42  {
43  if (tokenValidatedContext == null)
44  throw new ArgumentNullException(nameof(tokenValidatedContext));
45 
46  // Find the user id in the token
47  var userIdClaim = tokenValidatedContext.Principal.FindFirst(JwtRegisteredClaimNames.Sub);
48  if (userIdClaim == default)
49  throw new InvalidOperationException("Missing required claim!");
50 
51  long userId;
52  try
53  {
54  userId = Int64.Parse(userIdClaim.Value, CultureInfo.InvariantCulture);
55  }
56  catch (Exception e)
57  {
58  throw new InvalidOperationException("Failed to parse user ID!", e);
59  }
60 
61  ApiHeaders apiHeaders;
62  try
63  {
64  apiHeaders = new ApiHeaders(tokenValidatedContext.HttpContext.Request.GetTypedHeaders());
65  }
66  catch (InvalidOperationException)
67  {
68  // we are not responsible for handling header validation issues
69  return;
70  }
71 
72  // This populates the CurrentAuthenticationContext field for use by us and subsequent controllers
73  await authenticationContextFactory.CreateAuthenticationContext(userId, apiHeaders.InstanceId, tokenValidatedContext.SecurityToken.ValidFrom, cancellationToken).ConfigureAwait(false);
74 
76 
77  var enumerator = Enum.GetValues(typeof(RightsType));
78  var claims = new List<Claim>();
79  foreach (RightsType I in enumerator)
80  {
81  // if there's no instance user, do a weird thing and add all the instance roles
82  // we need it so we can get to OnActionExecutionAsync where we can properly decide between BadRequest and Forbid
83  // if user is null that means they got the token with an expired password
84  var rightInt = authenticationContext.User == null || (RightsHelper.IsInstanceRight(I) && authenticationContext.InstanceUser == null) ? ~0U : authenticationContext.GetRight(I);
85  var rightEnum = RightsHelper.RightToType(I);
86  var right = (Enum)Enum.ToObject(rightEnum, rightInt);
87  foreach (Enum J in Enum.GetValues(rightEnum))
88  if (right.HasFlag(J))
89  claims.Add(new Claim(ClaimTypes.Role, RightsHelper.RoleName(I, J)));
90  }
91 
92  tokenValidatedContext.Principal.AddIdentity(new ClaimsIdentity(claims));
93  }
94  }
95 }
static bool IsInstanceRight(RightsType rightsType)
Check if a given rightsType is meant for an Models.Instance
+ + + +
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+ + +
Task CreateAuthenticationContext(long userId, long? instanceId, DateTimeOffset validAfter, CancellationToken cancellationToken)
Create an IAuthenticationContext to populate CurrentAuthenticationContext
+
async Task InjectClaimsIntoContext(TokenValidatedContext tokenValidatedContext, CancellationToken cancellationToken)
Setup the System.Security.Claims.Claims for a given tokenValidatedContext
+
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
ClaimsInjector(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory)
Construct a ClaimsInjector
+
readonly IAuthenticationContextFactory authenticationContextFactory
The IAuthenticationContextFactory for the ClaimsInjector
+ + +
long? InstanceId
The Models.Instance.Id being accessed
Definition: ApiHeaders.cs:61
+
static Type RightToType(RightsType rightsType)
Map a given rightsType to its respective Enum Type
+
For injecting System.Security.Claims.Claims that Controllers.TgsAuthorizeAttribute can look for
+
readonly IDatabaseContext databaseContext
The IDatabaseContext for the ClaimsInjector
+ +
IAuthenticationContext CurrentAuthenticationContext
The IAuthenticationContext the IAuthenticationContextFactory created
+ + +
static string RoleName(RightsType rightsType, Enum right)
Gets the role claim name used for a given rightsType and right
Definition: RightsHelper.cs:61
+ +
+ + + + diff --git a/_client_exception_8cs.html b/_client_exception_8cs.html new file mode 100644 index 0000000000..4870890731 --- /dev/null +++ b/_client_exception_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/ClientException.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ClientException.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Client.ClientException
 Exceptions thrown by IServerClients More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_client_exception_8cs_source.html b/_client_exception_8cs_source.html new file mode 100644 index 0000000000..0a81d3a2ca --- /dev/null +++ b/_client_exception_8cs_source.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/ClientException.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ClientException.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Net;
4 
6 {
10  public abstract class ClientException : Exception
11  {
15  public HttpStatusCode StatusCode { get; }
16 
20  public Version ServerApiVersion { get; }
21 
27  protected ClientException(ErrorMessage errorMessage, HttpStatusCode statusCode) : base(errorMessage == null ? throw new ArgumentNullException(nameof(errorMessage)) : errorMessage.Message ?? "Unknown Error")
28  {
29  StatusCode = statusCode;
30  ServerApiVersion = errorMessage?.SeverApiVersion;
31  }
32 
36  protected ClientException() { }
37 
42  protected ClientException(string message) : base(message) { }
43 
49  protected ClientException(string message, Exception innerException) : base(message, innerException) { }
50  }
51 }
ClientException()
Construct a ClientException
+ + +
ClientException(string message, Exception innerException)
Construct a ClientException with a message and innerException
+
HttpStatusCode StatusCode
The HttpStatusCode of the ClientException
+ +
ClientException(string message)
Construct a ClientException with a message
+
Version ServerApiVersion
The Version of the server's API
+
Version SeverApiVersion
The version of the API the server is using
Definition: ErrorMessage.cs:18
+ +
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
Exceptions thrown by IServerClients
+
+ + + + diff --git a/_comm_command_8cs.html b/_comm_command_8cs.html new file mode 100644 index 0000000000..06144b2a8a --- /dev/null +++ b/_comm_command_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/CommCommand.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
CommCommand.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Interop.CommCommand
 Represents a command from DD More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Interop
 
+
+ + + + diff --git a/_comm_command_8cs_source.html b/_comm_command_8cs_source.html new file mode 100644 index 0000000000..f59c249c8d --- /dev/null +++ b/_comm_command_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/CommCommand.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
CommCommand.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 
4 {
8  sealed class CommCommand
9  {
13  public IReadOnlyDictionary<string, object> Parameters { get; set; }
14 
18  public string RawJson { get; set; }
19  }
20 }
IReadOnlyDictionary< string, object > Parameters
The dictionary of the CommCommand
Definition: CommCommand.cs:13
+
string RawJson
The raw JSON of the CommCommand
Definition: CommCommand.cs:18
+ + +
+ + + + diff --git a/_comm_context_8cs.html b/_comm_context_8cs.html new file mode 100644 index 0000000000..c6a68a68e1 --- /dev/null +++ b/_comm_context_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/CommContext.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
CommContext.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Components.Interop.CommContext
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Interop
 
+
+ + + + diff --git a/_comm_context_8cs_source.html b/_comm_context_8cs_source.html new file mode 100644 index 0000000000..601c0d9fc0 --- /dev/null +++ b/_comm_context_8cs_source.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/CommContext.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
CommContext.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using Newtonsoft.Json;
3 using System;
4 using System.Collections.Generic;
5 using System.IO;
6 using System.Text;
7 using System.Threading;
8 using System.Threading.Tasks;
9 using Tgstation.Server.Host.IO;
10 
12 {
14  sealed class CommContext : ICommContext
15  {
20 
24  readonly ILogger<CommContext> logger;
25 
29  readonly FileSystemWatcher fileSystemWatcher;
30 
34  readonly CancellationTokenSource cancellationTokenSource;
35 
39  readonly CancellationToken cancellationToken;
40 
45 
49  bool disposed;
50 
58  public CommContext(IIOManager ioManager, ILogger<CommContext> logger, string directory, string filter)
59  {
60  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
61  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
62 
63  directory = ioManager.ResolvePath(directory) ?? throw new ArgumentNullException(nameof(directory));
64  if (filter == null)
65  throw new ArgumentNullException(nameof(filter));
66 
67  fileSystemWatcher = new FileSystemWatcher(directory, filter)
68  {
69  EnableRaisingEvents = true,
70  IncludeSubdirectories = false,
71  NotifyFilter = NotifyFilters.LastWrite
72  };
73 
74  fileSystemWatcher.Created += HandleWrite;
75  fileSystemWatcher.Changed += HandleWrite;
76 
77  cancellationTokenSource = new CancellationTokenSource();
79  disposed = false;
80  }
81 
83  public void Dispose()
84  {
85  if (disposed)
86  return;
87  disposed = true;
88  fileSystemWatcher.Dispose();
89  cancellationTokenSource.Cancel();
90  cancellationTokenSource.Dispose();
91  }
92 
98  async void HandleWrite(object sender, FileSystemEventArgs e) // this is what async void was made for
99  {
100  try
101  {
102  var fileBytes = await ioManager.ReadAllBytes(e.FullPath, cancellationToken).ConfigureAwait(false);
103  var file = Encoding.UTF8.GetString(fileBytes);
104 
105  logger.LogTrace("Read interop command json: {0}", file);
106 
107  CommCommand command;
108  try
109  {
110  command = new CommCommand
111  {
112  Parameters = JsonConvert.DeserializeObject<IReadOnlyDictionary<string, object>>(file),
113  RawJson = file
114  };
115  }
116  catch (JsonException ex)
117  {
118  // file not fully written yet
119  logger.LogDebug("Suppressing json convert exception for command file write: {0}", ex);
120  return;
121  }
122 
123  await (handler?.HandleInterop(command, cancellationToken) ?? Task.CompletedTask).ConfigureAwait(false);
124  }
125  catch (OperationCanceledException) { }
126  catch (Exception ex)
127  {
128  logger.LogDebug("Exception while trying to handle command json write: {0}", ex);
129  }
130  }
131 
134  {
135  if (this.handler != null)
136  throw new InvalidOperationException("RegisterHandler already called!");
137  this.handler = handler ?? throw new ArgumentNullException(nameof(handler));
138  }
139  }
140 }
readonly CancellationToken cancellationToken
The CancellationToken for the CommContext
Definition: CommContext.cs:39
+
Represents a registration of an interop session
Definition: ICommContext.cs:8
+
readonly FileSystemWatcher fileSystemWatcher
The FileSystemWatcher for the CommContext
Definition: CommContext.cs:29
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
readonly ILogger< CommContext > logger
The ILogger for the CommContext
Definition: CommContext.cs:24
+
void RegisterHandler(ICommHandler handler)
Register a handler with the ICommContext
Definition: CommContext.cs:133
+
ICommHandler handler
The ICommHandler for the CommContext
Definition: CommContext.cs:44
+ + + + +
CommContext(IIOManager ioManager, ILogger< CommContext > logger, string directory, string filter)
Construct an CommContext
Definition: CommContext.cs:58
+
readonly IIOManager ioManager
The IIOManager for the CommContext
Definition: CommContext.cs:19
+
bool disposed
If the CommContext has been disposed
Definition: CommContext.cs:49
+
readonly CancellationTokenSource cancellationTokenSource
The CancellationTokenSource for the CommContext
Definition: CommContext.cs:34
+ +
async void HandleWrite(object sender, FileSystemEventArgs e)
Runs when the fileSystemWatcher triggers
Definition: CommContext.cs:98
+
Interface for using filesystems
Definition: IIOManager.cs:11
+
Task< byte[]> ReadAllBytes(string path, CancellationToken cancellationToken)
Returns all the contents of a file at path as a byte array
+ + + + +
+ + + + diff --git a/_command_factory_8cs.html b/_command_factory_8cs.html new file mode 100644 index 0000000000..f1e4ce8f3a --- /dev/null +++ b/_command_factory_8cs.html @@ -0,0 +1,108 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands/CommandFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
CommandFactory.cs File Reference
+
+ + + + + diff --git a/_command_factory_8cs_source.html b/_command_factory_8cs_source.html new file mode 100644 index 0000000000..f8470d27bd --- /dev/null +++ b/_command_factory_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands/CommandFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
CommandFactory.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
7 
9 {
12  {
17 
22 
27 
32 
36  readonly Models.Instance instance;
37 
42 
52  {
53  this.application = application ?? throw new ArgumentNullException(nameof(application));
54  this.byondManager = byondManager ?? throw new ArgumentNullException(nameof(byondManager));
55  this.repositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
56  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
57  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
58  }
59 
65  {
66  if (this.watchdog != null)
67  throw new InvalidOperationException("SetWatchdog has already been called!");
68  this.watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
69  }
70 
72  public IReadOnlyList<ICommand> GenerateCommands()
73  {
74  if (watchdog == null)
75  throw new InvalidOperationException("SetWatchdog has not been called!");
76  return new List<ICommand>
77  {
82  new KekCommand()
83  };
84  }
85  }
86 }
+
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+
readonly IByondManager byondManager
The IByondManager for the CommandFactory
+
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
+
readonly Models.Instance instance
The Models.Instance for the CommandFactory
+ + +
ICommand to return the IApplication.VersionString
+ + + +
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the CommandFactory
+
Command for reading the active Api.Models.TestMerges
+ + +
IWatchdog watchdog
The IWatchdog for the CommandFactory
+
CommandFactory(IApplication application, IByondManager byondManager, IRepositoryManager repositoryManager, IDatabaseContextFactory databaseContextFactory, Models.Instance instance)
Construct a CommandFactory
+
IReadOnlyList< ICommand > GenerateCommands()
Generate builtin ICommands
+
For displaying Api.Models.Internal.RevisionInformation
+ +
For displaying the installed Byond version
Definition: ByondCommand.cs:14
+ + +
void SetWatchdog(IWatchdog watchdog)
Set a watchdog for the CommandFactory
+ +
readonly IApplication application
The IApplication for the CommandFactory
+ + +
readonly IRepositoryManager repositoryManager
The IRepositoryManager for the CommandFactory
+
Runs and monitors the twin server controllers
Definition: IWatchdog.cs:12
+
+ + + + diff --git a/_components_2_watchdog_2_i_watchdog_8cs.html b/_components_2_watchdog_2_i_watchdog_8cs.html new file mode 100644 index 0000000000..892fa936e2 --- /dev/null +++ b/_components_2_watchdog_2_i_watchdog_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/IWatchdog.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IWatchdog.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Watchdog.IWatchdog
 Runs and monitors the twin server controllers More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Watchdog
 
+
+ + + + diff --git a/_components_2_watchdog_2_i_watchdog_8cs_source.html b/_components_2_watchdog_2_i_watchdog_8cs_source.html new file mode 100644 index 0000000000..e2b34b2d2e --- /dev/null +++ b/_components_2_watchdog_2_i_watchdog_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/IWatchdog.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IWatchdog.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Hosting;
2 using System;
3 using System.Threading;
4 using System.Threading.Tasks;
6 
8 {
13  {
17  bool Running { get; }
18 
22  bool AlphaIsActive { get; }
23 
27  Models.CompileJob ActiveCompileJob { get; }
28 
33 
38 
43 
49  Task Launch(CancellationToken cancellationToken);
50 
57  Task ChangeSettings(DreamDaemonLaunchParameters launchParameters, CancellationToken cancellationToken);
58 
65  Task Restart(bool graceful, CancellationToken cancellationToken);
66 
73  Task Terminate(bool graceful, CancellationToken cancellationToken);
74 
80  Task ResetRebootState(CancellationToken cancellationToken);
81  }
82 }
+
Consumes EventTypes and takes the appropriate actions
+ + +
bool AlphaIsActive
If the alpha server is the active server
Definition: IWatchdog.cs:22
+
Task Launch(CancellationToken cancellationToken)
Start the IWatchdog
+
Models.CompileJob ActiveCompileJob
The CompileJob currently running on the server
Definition: IWatchdog.cs:27
+ +
DreamDaemonLaunchParameters ActiveLaunchParameters
The DreamDaemonLaunchParameters the active server is using
Definition: IWatchdog.cs:32
+
Task ChangeSettings(DreamDaemonLaunchParameters launchParameters, CancellationToken cancellationToken)
Changes the ActiveLaunchParameters. If currently Running triggers a graceful restart
+
Task Restart(bool graceful, CancellationToken cancellationToken)
Restarts the watchdog
+ +
Task ResetRebootState(CancellationToken cancellationToken)
Cancels pending graceful actions
+
DreamDaemonLaunchParameters LastLaunchParameters
The DreamDaemonLaunchParameters to be applied
Definition: IWatchdog.cs:37
+ + +
bool Running
If the watchdog is running
Definition: IWatchdog.cs:17
+ +
Task Terminate(bool graceful, CancellationToken cancellationToken)
Stops the watchdog
+
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
+ +
Runs and monitors the twin server controllers
Definition: IWatchdog.cs:12
+
+ + + + diff --git a/_components_2_watchdog_2_i_watchdog_factory_8cs.html b/_components_2_watchdog_2_i_watchdog_factory_8cs.html new file mode 100644 index 0000000000..d9cf8cd806 --- /dev/null +++ b/_components_2_watchdog_2_i_watchdog_factory_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/IWatchdogFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IWatchdogFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Watchdog.IWatchdogFactory
 For creating IWatchdogs More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Watchdog
 
+
+ + + + diff --git a/_components_2_watchdog_2_i_watchdog_factory_8cs_source.html b/_components_2_watchdog_2_i_watchdog_factory_8cs_source.html new file mode 100644 index 0000000000..5d9ffecb8b --- /dev/null +++ b/_components_2_watchdog_2_i_watchdog_factory_8cs_source.html @@ -0,0 +1,101 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/IWatchdogFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IWatchdogFactory.cs
+
+
+Go to the documentation of this file.
4 
6 {
10  interface IWatchdogFactory
11  {
23  IWatchdog CreateWatchdog(IChat chat, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IEventConsumer eventConsumer, ISessionControllerFactory sessionControllerFactory, Api.Models.Instance instance, DreamDaemonSettings settings);
24  }
25 }
+ + +
IWatchdog CreateWatchdog(IChat chat, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IEventConsumer eventConsumer, ISessionControllerFactory sessionControllerFactory, Api.Models.Instance instance, DreamDaemonSettings settings)
Creates a IWatchdog
+
Consumes EventTypes and takes the appropriate actions
+ +
For managing connected chat services
Definition: IChat.cs:13
+ + + + + + + + +
Handles saving and loading WatchdogReattachInformation
+ + +
Runs and monitors the twin server controllers
Definition: IWatchdog.cs:12
+
+ + + + diff --git a/_components_2_watchdog_2_reattach_information_8cs.html b/_components_2_watchdog_2_reattach_information_8cs.html new file mode 100644 index 0000000000..1b7d88ebf3 --- /dev/null +++ b/_components_2_watchdog_2_reattach_information_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/ReattachInformation.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ReattachInformation.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Watchdog.ReattachInformation
 Parameters necessary for duplicating a ISessionController session More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Watchdog
 
+
+ + + + diff --git a/_components_2_watchdog_2_reattach_information_8cs_source.html b/_components_2_watchdog_2_reattach_information_8cs_source.html new file mode 100644 index 0000000000..ea777d7e19 --- /dev/null +++ b/_components_2_watchdog_2_reattach_information_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/ReattachInformation.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ReattachInformation.cs
+
+
+Go to the documentation of this file.
1 using System;
3 
5 {
10  {
14  public IDmbProvider Dmb { get; set; }
15 
19  public ReattachInformation() { }
20 
26  public ReattachInformation(Models.ReattachInformation copy, IDmbProvider dmb) : base(copy)
27  {
28  Dmb = dmb ?? throw new ArgumentNullException(nameof(dmb));
29  }
30  }
31 }
+ + +
IDmbProvider Dmb
The IDmbProvider used by DreamDaemon
+
ReattachInformation(Models.ReattachInformation copy, IDmbProvider dmb)
Construct a ReattachInformation from a given copy and dmb
+ +
Provides absolute paths to the latest compiled .dmbs
Definition: IDmbProvider.cs:9
+ +
Parameters necessary for duplicating a ISessionController session
+ + +
+ + + + diff --git a/_components_2_watchdog_2_watchdog_factory_8cs.html b/_components_2_watchdog_2_watchdog_factory_8cs.html new file mode 100644 index 0000000000..6476fdd52c --- /dev/null +++ b/_components_2_watchdog_2_watchdog_factory_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/WatchdogFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
WatchdogFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Components.Watchdog.WatchdogFactory
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Watchdog
 
+
+ + + + diff --git a/_components_2_watchdog_2_watchdog_factory_8cs_source.html b/_components_2_watchdog_2_watchdog_factory_8cs_source.html new file mode 100644 index 0000000000..d0fea87f65 --- /dev/null +++ b/_components_2_watchdog_2_watchdog_factory_8cs_source.html @@ -0,0 +1,122 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/WatchdogFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
WatchdogFactory.cs
+
+
+Go to the documentation of this file.
1 using Byond.TopicSender;
2 using Microsoft.Extensions.Logging;
3 using Microsoft.Extensions.Options;
4 using System;
10 
12 {
15  {
20 
24  readonly ILoggerFactory loggerFactory;
25 
30 
34  readonly IByondTopicSender byondTopicSender;
35 
40 
45 
50 
61  public WatchdogFactory(IServerControl serverControl, ILoggerFactory loggerFactory, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IJobManager jobManager, IAsyncDelayer asyncDelayer, IOptions<GeneralConfiguration> generalConfigurationOptions)
62  {
63  this.serverControl = serverControl ?? throw new ArgumentNullException(nameof(serverControl));
64  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
65  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
66  this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
67  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
68  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
69  generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
70  }
71 
73  public IWatchdog CreateWatchdog(IChat chat, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IEventConsumer eventConsumer, ISessionControllerFactory sessionControllerFactory, Api.Models.Instance instance, DreamDaemonSettings settings)
74  {
76  return new ExperimentalWatchdog(chat, sessionControllerFactory, dmbFactory, reattachInfoHandler, databaseContextFactory, byondTopicSender, eventConsumer, jobManager, serverControl, asyncDelayer, loggerFactory.CreateLogger<ExperimentalWatchdog>(), settings, instance, settings.AutoStart.Value);
77 
78  return new BasicWatchdog(chat, sessionControllerFactory, dmbFactory, reattachInfoHandler, databaseContextFactory, byondTopicSender, eventConsumer, jobManager, serverControl, asyncDelayer, loggerFactory.CreateLogger<BasicWatchdog>(), settings, instance, settings.AutoStart.Value);
79  }
80  }
81 }
Manages the runtime of Jobs
Definition: IJobManager.cs:12
+ +
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the WatchdogFactory
+ + +
Consumes EventTypes and takes the appropriate actions
+ +
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
+
readonly IJobManager jobManager
The IJobManager for the WatchdogFactory
+
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the WatchdogFactory
+ +
IWatchdog CreateWatchdog(IChat chat, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IEventConsumer eventConsumer, ISessionControllerFactory sessionControllerFactory, Api.Models.Instance instance, DreamDaemonSettings settings)
Creates a IWatchdog
+ +
bool? AutoStart
If DreamDaemon starts when it's Instance starts
+
For managing connected chat services
Definition: IChat.cs:13
+ +
A IWatchdog that tries to manage 2 servers at once for maximum uptime.
+
readonly IServerControl serverControl
The IServerControl for the WatchdogFactory
+ + + + + + + + +
bool UseExperimentalWatchdog
If the Components.Watchdog.ExperimentalWatchdog should be used.
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the WatchdogFactory
+ + +
WatchdogFactory(IServerControl serverControl, ILoggerFactory loggerFactory, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IJobManager jobManager, IAsyncDelayer asyncDelayer, IOptions< GeneralConfiguration > generalConfigurationOptions)
Construct a WatchdogFactory
+ +
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the WatchdogFactory
+ +
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the WatchdogFactory
+
Handles saving and loading WatchdogReattachInformation
+ + +
Runs and monitors the twin server controllers
Definition: IWatchdog.cs:12
+
Represents a service that may take an updated Host assembly and run it, stopping the current assembly...
+
+ + + + diff --git a/_components_2_watchdog_2_watchdog_reattach_information_8cs.html b/_components_2_watchdog_2_watchdog_reattach_information_8cs.html new file mode 100644 index 0000000000..9fab51c99c --- /dev/null +++ b/_components_2_watchdog_2_watchdog_reattach_information_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/WatchdogReattachInformation.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
WatchdogReattachInformation.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation
 Reattach information for a IWatchdog More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Watchdog
 
+
+ + + + diff --git a/_components_2_watchdog_2_watchdog_reattach_information_8cs_source.html b/_components_2_watchdog_2_watchdog_reattach_information_8cs_source.html new file mode 100644 index 0000000000..0ab516cbb8 --- /dev/null +++ b/_components_2_watchdog_2_watchdog_reattach_information_8cs_source.html @@ -0,0 +1,96 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/WatchdogReattachInformation.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
WatchdogReattachInformation.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Globalization;
4 
6 {
11  {
15  public ReattachInformation Alpha { get; set; }
16 
20  public ReattachInformation Bravo { get; set; }
21 
26 
33  public WatchdogReattachInformation(Models.WatchdogReattachInformation copy, IDmbProvider dmbAlpha, IDmbProvider dmbBravo) : base(copy)
34  {
35  if (copy.Alpha != null)
36  Alpha = new ReattachInformation(copy.Alpha, dmbAlpha);
37  if (copy.Bravo != null)
38  Bravo = new ReattachInformation(copy.Bravo, dmbBravo);
39  }
40 
42  public override string ToString() => String.Format(CultureInfo.InvariantCulture, "Alpha: {0}, Bravo {1}", Alpha, Bravo);
43  }
44 }
+ + + +
ReattachInformation Alpha
ReattachInformation for the Alpha session
+ + +
WatchdogReattachInformation(Models.WatchdogReattachInformation copy, IDmbProvider dmbAlpha, IDmbProvider dmbBravo)
Construct a WatchdogReattachInformation from a given copy with a given dmbAlpha and dmbBravo
+ +
Provides absolute paths to the latest compiled .dmbs
Definition: IDmbProvider.cs:9
+
ReattachInformation Bravo
ReattachInformation for the Bravo session
+ +
Parameters necessary for duplicating a ISessionController session
+ +
+ + + + diff --git a/_configuration_8cs.html b/_configuration_8cs.html new file mode 100644 index 0000000000..cb73fb94e2 --- /dev/null +++ b/_configuration_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/StaticFiles/Configuration.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Configuration.cs File Reference
+
+ + + + + diff --git a/_configuration_8cs_source.html b/_configuration_8cs_source.html new file mode 100644 index 0000000000..08f46a8e87 --- /dev/null +++ b/_configuration_8cs_source.html @@ -0,0 +1,153 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/StaticFiles/Configuration.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Configuration.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using System;
3 using System.Collections.Generic;
4 using System.Globalization;
5 using System.IO;
6 using System.Linq;
7 using System.Security.Cryptography;
8 using System.Text;
9 using System.Threading;
10 using System.Threading.Tasks;
13 using Tgstation.Server.Host.IO;
15 
17 {
20  {
21  const string CodeModificationsSubdirectory = "CodeModifications";
22  const string EventScriptsSubdirectory = "EventScripts";
23  const string GameStaticFilesSubdirectory = "GameStaticFiles";
24 
28  const string StaticIgnoreFile = ".tgsignore";
29 
30  const string CodeModificationsHeadFile = "HeadInclude.dm";
31  const string CodeModificationsTailFile = "TailInclude.dm";
32 
33  static readonly IReadOnlyDictionary<EventType, string> EventTypeScriptFileNameMap = new Dictionary<EventType, string>
34  {
35  { EventType.CompileStart, "PreCompile" },
36  { EventType.CompileComplete, "PostCompile" },
37  { EventType.RepoPreSynchronize, "PreSynchronize" }
38  };
39 
44 
49 
54 
59 
64 
69 
73  readonly ILogger<Configuration> logger;
74 
78  readonly SemaphoreSlim semaphore;
79 
91  {
92  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
93  this.synchronousIOManager = synchronousIOManager ?? throw new ArgumentNullException(nameof(synchronousIOManager));
94  this.symlinkFactory = symlinkFactory ?? throw new ArgumentNullException(nameof(symlinkFactory));
95  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
96  this.postWriteHandler = postWriteHandler ?? throw new ArgumentNullException(nameof(postWriteHandler));
97  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
98  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
99 
100  semaphore = new SemaphoreSlim(1);
101  }
102 
104  public void Dispose() => semaphore.Dispose();
105 
111 
117  async Task EnsureDirectories(CancellationToken cancellationToken)
118  {
119  async Task ValidateStaticFolder()
120  {
121  await ioManager.CreateDirectory(GameStaticFilesSubdirectory, cancellationToken).ConfigureAwait(false);
122  var staticIgnorePath = StaticIgnorePath();
123  if(!await ioManager.FileExists(staticIgnorePath, cancellationToken).ConfigureAwait(false))
124  await ioManager.WriteAllBytes(staticIgnorePath, Array.Empty<byte>(), cancellationToken).ConfigureAwait(false);
125  }
126 
127  await Task.WhenAll(ioManager.CreateDirectory(CodeModificationsSubdirectory, cancellationToken), ioManager.CreateDirectory(EventScriptsSubdirectory, cancellationToken), ValidateStaticFolder()).ConfigureAwait(false);
128  }
129 
131  public async Task<ServerSideModifications> CopyDMFilesTo(string dmeFile, string destination, CancellationToken cancellationToken)
132  {
133  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
134  {
135  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
136 
137  // just assume no other fs race conditions here
138  var dmeExistsTask = ioManager.FileExists(ioManager.ConcatPath(CodeModificationsSubdirectory, dmeFile), cancellationToken);
141  var copyTask = ioManager.CopyDirectory(CodeModificationsSubdirectory, destination, null, cancellationToken);
142 
143  await Task.WhenAll(dmeExistsTask, headFileExistsTask, tailFileExistsTask, copyTask).ConfigureAwait(false);
144 
145  if (!dmeExistsTask.Result && !headFileExistsTask.Result && !tailFileExistsTask.Result)
146  return null;
147 
148  if (dmeExistsTask.Result)
149  return new ServerSideModifications(null, null, true);
150 
151  if (!headFileExistsTask.Result && !tailFileExistsTask.Result)
152  return null;
153 
154  string IncludeLine(string filePath) => String.Format(CultureInfo.InvariantCulture, "#include \"{0}\"", filePath);
155 
156  return new ServerSideModifications(headFileExistsTask.Result ? IncludeLine(CodeModificationsHeadFile) : null, tailFileExistsTask.Result ? IncludeLine(CodeModificationsTailFile) : null, false);
157  }
158  }
159 
160  string ValidateConfigRelativePath(string configurationRelativePath)
161  {
162  var nullOrEmptyCheck = String.IsNullOrEmpty(configurationRelativePath);
163  if (nullOrEmptyCheck)
164  configurationRelativePath = ".";
165  if (configurationRelativePath[0] == Path.DirectorySeparatorChar || configurationRelativePath[0] == Path.AltDirectorySeparatorChar)
166  configurationRelativePath = '.' + configurationRelativePath;
167  var resolved = ioManager.ResolvePath(configurationRelativePath);
168  var local = !nullOrEmptyCheck ? ioManager.ResolvePath(".") : null;
169  if (!nullOrEmptyCheck && resolved.Length < local.Length) // .. fuccbois
170  throw new InvalidOperationException("Attempted to access file outside of configuration manager!");
171  return resolved;
172  }
173 
175  public async Task<IReadOnlyList<ConfigurationFile>> ListDirectory(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
176  {
177  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
178  var path = ValidateConfigRelativePath(configurationRelativePath);
179 
180  if (configurationRelativePath == null)
181  configurationRelativePath = "/";
182 
183  List<ConfigurationFile> result = new List<ConfigurationFile>();
184 
185  void ListImpl()
186  {
187  var enumerator = synchronousIOManager.GetDirectories(path, cancellationToken);
188  try
189  {
190  result.AddRange(enumerator.Select(x => new ConfigurationFile
191  {
192  IsDirectory = true,
193  Path = ioManager.ConcatPath(configurationRelativePath, x),
194  }));
195  }
196  catch (IOException e)
197  {
198  logger.LogDebug("IOException while writing {0}: {1}", path, e);
199  result = null;
200  return;
201  }
202 
203  enumerator = synchronousIOManager.GetFiles(path, cancellationToken);
204  result.AddRange(enumerator.Select(x => new ConfigurationFile
205  {
206  IsDirectory = false,
207  Path = ioManager.ConcatPath(configurationRelativePath, x),
208  }));
209  }
210 
211  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
212  if (systemIdentity == null)
213  ListImpl();
214  else
215  await systemIdentity.RunImpersonated(ListImpl, cancellationToken).ConfigureAwait(false);
216 
217  return result;
218  }
219 
221  public async Task<ConfigurationFile> Read(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
222  {
223  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
224  var path = ValidateConfigRelativePath(configurationRelativePath);
225 
226  ConfigurationFile result = null;
227 
228  void ReadImpl()
229  {
230  lock (this)
231  try
232  {
233  var content = synchronousIOManager.ReadFile(path);
234  string sha1String;
235 #pragma warning disable CA5350 // Do not use insecure cryptographic algorithm SHA1.
236  using (var sha1 = new SHA1Managed())
237 #pragma warning restore CA5350 // Do not use insecure cryptographic algorithm SHA1.
238  sha1String = String.Join(String.Empty, sha1.ComputeHash(content).Select(b => b.ToString("x2", CultureInfo.InvariantCulture)));
239  result = new ConfigurationFile
240  {
241  Content = content,
242  IsDirectory = false,
243  LastReadHash = sha1String,
244  AccessDenied = false,
245  Path = configurationRelativePath
246  };
247  }
248  catch (UnauthorizedAccessException)
249  {
250  // this happens on windows, dunno about linux
251  bool isDirectory;
252  try
253  {
254  isDirectory = synchronousIOManager.IsDirectory(path);
255  }
256  catch
257  {
258  isDirectory = false;
259  }
260 
261  result = new ConfigurationFile
262  {
263  Path = configurationRelativePath
264  };
265  if (!isDirectory)
266  result.AccessDenied = true;
267  else
268  result.IsDirectory = true;
269  }
270  }
271 
272  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
273  if (systemIdentity == null)
274  await Task.Factory.StartNew(ReadImpl, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
275  else
276  await systemIdentity.RunImpersonated(ReadImpl, cancellationToken).ConfigureAwait(false);
277 
278  return result;
279  }
280 
282  public async Task SymlinkStaticFilesTo(string destination, CancellationToken cancellationToken)
283  {
284  async Task<IReadOnlyList<string>> GetIgnoreFiles()
285  {
286  var ignoreFileBytes = await ioManager.ReadAllBytes(StaticIgnorePath(), cancellationToken).ConfigureAwait(false);
287  var ignoreFileText = Encoding.UTF8.GetString(ignoreFileBytes);
288 
289  var results = new List<string> { StaticIgnoreFile };
290 
291  // we don't want to lose trailing whitespace on linux
292  using (var reader = new StringReader(ignoreFileText))
293  {
294  cancellationToken.ThrowIfCancellationRequested();
295  var line = await reader.ReadLineAsync().ConfigureAwait(false);
296  if (!String.IsNullOrEmpty(line))
297  results.Add(line);
298  }
299 
300  return results;
301  }
302 
303  IReadOnlyList<string> ignoreFiles;
304 
305  async Task SymlinkBase(bool files)
306  {
307  Task<IReadOnlyList<string>> task;
308  if (files)
309  task = ioManager.GetFiles(GameStaticFilesSubdirectory, cancellationToken);
310  else
311  task = ioManager.GetDirectories(GameStaticFilesSubdirectory, cancellationToken);
312  var entries = await task.ConfigureAwait(false);
313 
314  await Task.WhenAll(entries.Select(async x =>
315  {
316  var fileName = ioManager.GetFileName(x);
317 
318  // need to normalize
319  bool ignored;
320  if (platformIdentifier.IsWindows)
321  ignored = ignoreFiles.Any(y => fileName.ToUpperInvariant() == y.ToUpperInvariant());
322  else
323  ignored = ignoreFiles.Any(y => fileName == y);
324 
325  if (ignored)
326  {
327  logger.LogTrace("Ignoring static file {0}...", fileName);
328  return;
329  }
330 
331  var destPath = ioManager.ConcatPath(destination, fileName);
332  logger.LogTrace("Symlinking {0} to {1}...", x, destPath);
333  var fileExistsTask = ioManager.FileExists(destPath, cancellationToken);
334  if (await ioManager.DirectoryExists(destPath, cancellationToken).ConfigureAwait(false))
335  await ioManager.DeleteDirectory(destPath, cancellationToken).ConfigureAwait(false);
336  var fileExists = await fileExistsTask.ConfigureAwait(false);
337  if (fileExists)
338  await ioManager.DeleteFile(destPath, cancellationToken).ConfigureAwait(false);
339  await symlinkFactory.CreateSymbolicLink(ioManager.ResolvePath(x), ioManager.ResolvePath(destPath), cancellationToken).ConfigureAwait(false);
340  })).ConfigureAwait(false);
341  }
342 
343  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
344  {
345  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
346  ignoreFiles = await GetIgnoreFiles().ConfigureAwait(false);
347  await Task.WhenAll(SymlinkBase(true), SymlinkBase(false)).ConfigureAwait(false);
348  }
349  }
350 
352  public async Task<ConfigurationFile> Write(string configurationRelativePath, ISystemIdentity systemIdentity, byte[] data, string previousHash, CancellationToken cancellationToken)
353  {
354  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
355  var path = ValidateConfigRelativePath(configurationRelativePath);
356 
357  ConfigurationFile result = null;
358 
359  void WriteImpl()
360  {
361  lock (this)
362  try
363  {
364  var fileHash = previousHash;
365  var success = synchronousIOManager.WriteFileChecked(path, data, ref fileHash, cancellationToken);
366  if (!success)
367  return;
368  if (data != null)
369  postWriteHandler.HandleWrite(path);
370  result = new ConfigurationFile
371  {
372  Content = data,
373  IsDirectory = false,
374  LastReadHash = fileHash,
375  AccessDenied = false,
376  Path = configurationRelativePath
377  };
378  }
379  catch (UnauthorizedAccessException)
380  {
381  // this happens on windows, dunno about linux
382  bool isDirectory;
383  try
384  {
385  isDirectory = synchronousIOManager.IsDirectory(path);
386  }
387  catch
388  {
389  isDirectory = false;
390  }
391 
392  result = new ConfigurationFile
393  {
394  Path = configurationRelativePath
395  };
396  if (!isDirectory)
397  result.AccessDenied = true;
398  else
399  result.IsDirectory = true;
400  }
401  }
402 
403  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
404  if (systemIdentity == null)
405  await Task.Factory.StartNew(WriteImpl, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
406  else
407  await systemIdentity.RunImpersonated(WriteImpl, cancellationToken).ConfigureAwait(false);
408 
409  return result;
410  }
411 
413  public async Task<bool> CreateDirectory(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
414  {
415  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
416  var path = ValidateConfigRelativePath(configurationRelativePath);
417 
418  bool? result = null;
419  void DoCreate() => result = synchronousIOManager.CreateDirectory(path, cancellationToken);
420 
421  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
422  if (systemIdentity == null)
423  await Task.Factory.StartNew(DoCreate, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
424  else
425  await systemIdentity.RunImpersonated(DoCreate, cancellationToken).ConfigureAwait(false);
426 
427  return result.Value;
428  }
429 
431  public Task StartAsync(CancellationToken cancellationToken) => EnsureDirectories(cancellationToken);
432 
434  public Task StopAsync(CancellationToken cancellationToken) => EnsureDirectories(cancellationToken);
435 
437  public async Task<bool> HandleEvent(EventType eventType, IEnumerable<string> parameters, CancellationToken cancellationToken)
438  {
439  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
440 
441  if (!EventTypeScriptFileNameMap.TryGetValue(eventType, out var scriptName))
442  return true;
443 
444  // always execute in serial
445  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
446  {
447  var files = await ioManager.GetFilesWithExtension(EventScriptsSubdirectory, platformIdentifier.ScriptFileExtension, cancellationToken).ConfigureAwait(false);
448  var resolvedScriptsDir = ioManager.ResolvePath(EventScriptsSubdirectory);
449 
450  foreach (var I in files.Select(x => ioManager.GetFileName(x)).Where(x => x.StartsWith(scriptName, StringComparison.Ordinal)))
451  using (var script = processExecutor.LaunchProcess(ioManager.ConcatPath(resolvedScriptsDir, I), resolvedScriptsDir, String.Join(' ', parameters), noShellExecute: true))
452  using (cancellationToken.Register(() => script.Terminate()))
453  {
454  var exitCode = await script.Lifetime.ConfigureAwait(false);
455  cancellationToken.ThrowIfCancellationRequested();
456  if (exitCode != 0)
457  return false;
458  }
459  }
460 
461  return true;
462  }
463 
465  public async Task<bool> DeleteDirectory(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
466  {
467  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
468  var path = ValidateConfigRelativePath(configurationRelativePath);
469 
470  var result = false;
471  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
472  {
473  void CheckDeleteImpl() => result = synchronousIOManager.DeleteDirectory(path);
474 
475  if (systemIdentity != null)
476  await systemIdentity.RunImpersonated(CheckDeleteImpl, cancellationToken).ConfigureAwait(false);
477  else
478  CheckDeleteImpl();
479  }
480 
481  return result;
482  }
483  }
484 }
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
string StaticIgnorePath()
Get the proper path to StaticIgnoreFile
+ +
readonly ISynchronousIOManager synchronousIOManager
The ISynchronousIOManager for Configuration
+ +
async Task< bool > DeleteDirectory(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
Attempt to delete an empty directory at configurationRelativePath
+
Handles changing file modes/permissions after writing
+
async Task< ServerSideModifications > CopyDMFilesTo(string dmeFile, string destination, CancellationToken cancellationToken)
Copies all files in the CodeModifications directory to destination
+
async Task EnsureDirectories(CancellationToken cancellationToken)
Ensures standard configuration directories exist
+
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+
async Task< bool > CreateDirectory(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
Create an empty directory at configurationRelativePath
+
async Task< ConfigurationFile > Write(string configurationRelativePath, ISystemIdentity systemIdentity, byte[] data, string previousHash, CancellationToken cancellationToken)
Writes to a given configurationRelativePath
+ +
Represents a user on the current System.Runtime.InteropServices.OSPlatform
+
Task CopyDirectory(string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)
Copies a directory from src to dest
+
Task< IReadOnlyList< string > > GetDirectories(string path, CancellationToken cancellationToken)
Returns directory names in a given path
+ +
Configuration(IIOManager ioManager, ISynchronousIOManager synchronousIOManager, ISymlinkFactory symlinkFactory, IProcessExecutor processExecutor, IPostWriteHandler postWriteHandler, IPlatformIdentifier platformIdentifier, ILogger< Configuration > logger)
Construct Configuration
+
async Task< IReadOnlyList< ConfigurationFile > > ListDirectory(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
Get ConfigurationFile for all items in a given configurationRelativePath
+
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+
static readonly IReadOnlyDictionary< EventType, string > EventTypeScriptFileNameMap
+ +
bool? IsDirectory
If Path represents a directory
+
readonly IProcessExecutor processExecutor
The IProcessExecutor for Configuration
+
Task CreateDirectory(string path, CancellationToken cancellationToken)
Create a directory at path
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+ +
readonly ILogger< Configuration > logger
The ILogger for Configuration
+
async Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+
byte [] ReadFile(string path)
Read the bytes of a file at a given path
+
const string StaticIgnoreFile
Name of the ignore file in GameStaticFilesSubdirectory
+ +
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for Configuration
+
For accessing the disk in a synchronous manner
+
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists
+
string ValidateConfigRelativePath(string configurationRelativePath)
+
readonly ISymlinkFactory symlinkFactory
The ISymlinkFactory for Configuration
+
Task RunImpersonated(Action action, CancellationToken cancellationToken)
Runs a given action in the context of the ISystemIdentity
+ + +
readonly IIOManager ioManager
The IIOManager for Configuration
+
async Task< ConfigurationFile > Read(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
Reads a given configurationRelativePath
+
IEnumerable< string > GetDirectories(string path, CancellationToken cancellationToken)
Enumerate directories in a given path
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for Configuration
+
Represents a game configuration file. Create and delete actions uncerimonuously overwrite/delete file...
+ + +
readonly IPostWriteHandler postWriteHandler
The IPostWriteHandler for Configuration
+
IEnumerable< string > GetFiles(string path, CancellationToken cancellationToken)
Enumerate files in a given path
+
bool IsDirectory(string path)
Checks if a given path is a directory
+ + + + +
Task< IReadOnlyList< string > > GetFiles(string path, CancellationToken cancellationToken)
Returns file names in a given path
+
Interface for using filesystems
Definition: IIOManager.cs:11
+ +
async Task SymlinkStaticFilesTo(string destination, CancellationToken cancellationToken)
Symlinks all directories in the GameData directory to destination
+
For identifying the current platform
+
bool? AccessDenied
If access to the ConfigurationFile file was denied for the operation
+
Task< byte[]> ReadAllBytes(string path, CancellationToken cancellationToken)
Returns all the contents of a file at path as a byte array
+
Task DeleteFile(string path, CancellationToken cancellationToken)
Deletes a file at path
+
Task< bool > DirectoryExists(string path, CancellationToken cancellationToken)
Check that the directory at path exists
+ +
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+ + + + +
+ + + + diff --git a/_configuration_client_8cs.html b/_configuration_client_8cs.html new file mode 100644 index 0000000000..8a1ad570ee --- /dev/null +++ b/_configuration_client_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/ConfigurationClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ConfigurationClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Client.Components.ConfigurationClient
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
namespace  Tgstation.Server.Client.Components
 
+
+ + + + diff --git a/_configuration_client_8cs_source.html b/_configuration_client_8cs_source.html new file mode 100644 index 0000000000..2f38d6e7d5 --- /dev/null +++ b/_configuration_client_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/ConfigurationClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ConfigurationClient.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Threading;
4 using System.Threading.Tasks;
5 using Tgstation.Server.Api;
7 
9 {
12  {
17 
21  readonly Instance instance;
22 
28  static string SanitizeGetPath(string path)
29  {
30  if (path == null)
31  path = String.Empty;
32  if (path.Length == 0 || path[0] != '/')
33  path = '/' + path;
34  return path;
35  }
36 
43  {
44  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
45  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
46  }
47 
49  public Task DeleteEmptyDirectory(ConfigurationFile directory, CancellationToken cancellationToken) => apiClient.Delete(Routes.Configuration, directory, instance.Id, cancellationToken);
50 
52  public Task<ConfigurationFile> CreateDirectory(ConfigurationFile directory, CancellationToken cancellationToken) => apiClient.Create<ConfigurationFile, ConfigurationFile>(Routes.Configuration, directory, instance.Id, cancellationToken);
53 
55  public Task<IReadOnlyList<ConfigurationFile>> List(string directory, CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<ConfigurationFile>>(Routes.List(Routes.Configuration) + SanitizeGetPath(directory), instance.Id, cancellationToken);
56 
58  public Task<ConfigurationFile> Read(ConfigurationFile file, CancellationToken cancellationToken)
59  {
60  if (file == null)
61  throw new ArgumentNullException(nameof(file));
62  return apiClient.Read<ConfigurationFile>(Routes.ConfigurationFile + SanitizeGetPath(file.Path), instance.Id, cancellationToken);
63  }
64 
66  public Task<ConfigurationFile> Write(ConfigurationFile file, CancellationToken cancellationToken) => apiClient.Update<ConfigurationFile, ConfigurationFile>(Routes.Configuration, file ?? throw new ArgumentNullException(nameof(file)), instance.Id, cancellationToken);
67  }
68 }
Task< ConfigurationFile > ConfigurationFile(Routes.Configuration, directory, instance.Id, cancellationToken)
+
const string Configuration
The Models.ConfigurationFile controller
Definition: Routes.cs:49
+ +
Task< ConfigurationFile > CreateDirectory(ConfigurationFile directory, CancellationToken cancellationToken)
Creates an empty directory
+
readonly IApiClient apiClient
The IApiClient for the ConfigurationClient
+ +
Task< ConfigurationFile > Read(ConfigurationFile file, CancellationToken cancellationToken)
Read a ConfigurationFile file
+
string Path
The path to the ConfigurationFile file
+
Routes to a server actions
Definition: Routes.cs:9
+ +
readonly Instance instance
The Instance for the ConfigurationClient
+
static string SanitizeGetPath(string path)
Sanitize a ConfigurationFile path for use in a GET Uri
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Represents a game configuration file. Create and delete actions uncerimonuously overwrite/delete file...
+
Task< IReadOnlyList< ConfigurationFile > > List(string directory, CancellationToken cancellationToken)
List configuration files
+
Task< ConfigurationFile > Write(ConfigurationFile file, CancellationToken cancellationToken)
Overwrite a ConfigurationFile file
+
ConfigurationClient(IApiClient apiClient, Instance instance)
Construct a ConfigurationClient
+
Metadata about a server instance
Definition: Instance.cs:9
+ + +
Task Delete(string route, CancellationToken cancellationToken)
Run an HTTP DELETE request
+
static string List(string route)
Get the /List postfix for a route
+ +
Web interface for the API
Definition: IApiClient.cs:11
+
Task DeleteEmptyDirectory(ConfigurationFile directory, CancellationToken cancellationToken)
Delete an empty directory
+
const string ConfigurationFile
Full combination of Configuration and File
Definition: Routes.cs:59
+ +
+ + + + diff --git a/_configuration_controller_8cs.html b/_configuration_controller_8cs.html new file mode 100644 index 0000000000..351f5614e7 --- /dev/null +++ b/_configuration_controller_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/ConfigurationController.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ConfigurationController.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Controllers.ConfigurationController
 The ModelController<TModel> for ConfigurationFiles More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Controllers
 
+
+ + + + diff --git a/_configuration_controller_8cs_source.html b/_configuration_controller_8cs_source.html new file mode 100644 index 0000000000..0e99a5dacc --- /dev/null +++ b/_configuration_controller_8cs_source.html @@ -0,0 +1,125 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/ConfigurationController.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ConfigurationController.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Mvc;
2 using Microsoft.Extensions.Logging;
3 using System;
4 using System.IO;
5 using System.Net;
6 using System.Threading;
7 using System.Threading.Tasks;
8 using Tgstation.Server.Api;
12 using Tgstation.Server.Host.IO;
15 
17 {
21  [Route(Routes.Configuration)]
22  public sealed class ConfigurationController : ModelController<ConfigurationFile>
23  {
28 
33 
42  public ConfigurationController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IIOManager ioManager, ILogger<ConfigurationController> logger) : base(databaseContext, authenticationContextFactory, logger, true)
43  {
44  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
45  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
46  }
47 
54  bool ForbidDueToModeConflicts(string path, out ISystemIdentity systemIdentityToUse)
55  {
57  {
58  systemIdentityToUse = null;
59  return true;
60  }
61 
62  systemIdentityToUse = Instance.ConfigurationType == ConfigurationType.SystemIdentityWrite ? AuthenticationContext.SystemIdentity : null;
63  return false;
64  }
65 
67  [TgsAuthorize(ConfigurationRights.Write)]
68  public override async Task<IActionResult> Update([FromBody] ConfigurationFile model, CancellationToken cancellationToken)
69  {
70  if (model == null)
71  throw new ArgumentNullException(nameof(model));
72  if (ForbidDueToModeConflicts(model.Path, out var systemIdentity))
73  return Forbid();
74 
76  try
77  {
78  var newFile = await config.Write(model.Path, systemIdentity, model.Content, model.LastReadHash, cancellationToken).ConfigureAwait(false);
79  if (newFile == null)
80  return Conflict(new ErrorMessage
81  {
82  Message = "This file has been updated since you last viewed it!"
83  });
84 
85  newFile.Content = null;
86 
87  return model.LastReadHash == null ? (IActionResult)StatusCode((int)HttpStatusCode.Created, newFile) : Json(newFile);
88  }
89  catch(IOException e)
90  {
91  Logger.LogInformation("IOException while updating file {0}: {1}", model.Path, e);
92  return Conflict(new ErrorMessage
93  {
94  Message = e.Message
95  });
96  }
97  catch (NotImplementedException)
98  {
99  return StatusCode((int)HttpStatusCode.NotImplemented);
100  }
101  }
102 
109  [HttpGet(Routes.File + "/{*filePath}")]
110  [TgsAuthorize(ConfigurationRights.Read)]
111  public async Task<IActionResult> File(string filePath, CancellationToken cancellationToken)
112  {
113  if (ForbidDueToModeConflicts(filePath, out var systemIdentity))
114  return Forbid();
115 
116  try
117  {
118  var result = await instanceManager.GetInstance(Instance).Configuration.Read(filePath, systemIdentity, cancellationToken).ConfigureAwait(false);
119  if (result == null)
120  return StatusCode((int)HttpStatusCode.Gone);
121 
122  return Json(result);
123  }
124  catch (IOException e)
125  {
126  Logger.LogInformation("IOException while reading file {0}: {1}", filePath, e);
127  return Conflict(new ErrorMessage
128  {
129  Message = e.Message
130  });
131  }
132  catch (NotImplementedException)
133  {
134  return StatusCode((int)HttpStatusCode.NotImplemented);
135  }
136  }
137 
144  [HttpGet("List/{*directoryPath}")]
145  [TgsAuthorize(ConfigurationRights.List)]
146  public async Task<IActionResult> Directory(string directoryPath, CancellationToken cancellationToken)
147  {
148  if (ForbidDueToModeConflicts(directoryPath, out var systemIdentity))
149  return Forbid();
150 
151  try
152  {
153  var result = await instanceManager.GetInstance(Instance).Configuration.ListDirectory(directoryPath, systemIdentity, cancellationToken).ConfigureAwait(false);
154  if (result == null)
155  return StatusCode((int)HttpStatusCode.Gone);
156 
157  return Json(result);
158  }
159  catch (NotImplementedException)
160  {
161  return StatusCode((int)HttpStatusCode.NotImplemented);
162  }
163  catch (UnauthorizedAccessException)
164  {
165  return Forbid();
166  }
167  }
168 
170  [TgsAuthorize(ConfigurationRights.List)]
171  public override Task<IActionResult> List(CancellationToken cancellationToken) => Directory(null, cancellationToken);
172 
174  [TgsAuthorize(ConfigurationRights.Write)]
175  public override async Task<IActionResult> Create([FromBody] ConfigurationFile model, CancellationToken cancellationToken)
176  {
177  if (model == null)
178  throw new ArgumentNullException(nameof(model));
179 
180  if (ForbidDueToModeConflicts(model.Path, out var systemIdentity))
181  return Forbid();
182 
183  try
184  {
185  model.IsDirectory = true;
186  return await instanceManager.GetInstance(Instance).Configuration.CreateDirectory(model.Path, systemIdentity, cancellationToken).ConfigureAwait(false) ? (IActionResult)Json(model) : StatusCode((int)HttpStatusCode.Created, model);
187  }
188  catch (NotImplementedException)
189  {
190  return StatusCode((int)HttpStatusCode.NotImplemented);
191  }
192  catch (UnauthorizedAccessException)
193  {
194  return Forbid();
195  }
196  }
197 
204  [HttpDelete]
205  [TgsAuthorize(ConfigurationRights.Delete)]
206  public async Task<IActionResult> Delete([FromBody] ConfigurationFile directory, CancellationToken cancellationToken)
207  {
208  if (directory == null)
209  throw new ArgumentNullException(nameof(directory));
210 
211  if (ForbidDueToModeConflicts(directory.Path, out var systemIdentity))
212  return Forbid();
213 
214  try
215  {
216  return await instanceManager.GetInstance(Instance).Configuration.DeleteDirectory(directory.Path, systemIdentity, cancellationToken).ConfigureAwait(false) ? (IActionResult)Ok() : Conflict(new ErrorMessage
217  {
218  Message = "Directory not empty!"
219  });
220  }
221  catch (NotImplementedException)
222  {
223  return StatusCode((int)HttpStatusCode.NotImplemented);
224  }
225  catch (UnauthorizedAccessException)
226  {
227  return Forbid();
228  }
229  }
230  }
231 }
+ +
ConfigurationRights
Rights for Models.ConfigurationFile
+ + +
const string Configuration
The Models.ConfigurationFile controller
Definition: Routes.cs:49
+ +
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+
Represents a user on the current System.Runtime.InteropServices.OSPlatform
+ +
override async Task< IActionResult > Create([FromBody] ConfigurationFile model, CancellationToken cancellationToken)
+
bool ForbidDueToModeConflicts(string path, out ISystemIdentity systemIdentityToUse)
If a ForbidResult should be returned from actions due to conflicts with one or both of the Api....
+
readonly IInstanceManager instanceManager
The IInstanceManager for the ConfigurationController
+
const string File
To be paired with Configuration for accessing Models.ConfigurationFiles
Definition: Routes.cs:54
+
async Task< IActionResult > Delete([FromBody] ConfigurationFile directory, CancellationToken cancellationToken)
Deletes an empty directory
+
ConfigurationType
The type of configuration allowed on an Instance
+
ConfigurationController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IIOManager ioManager, ILogger< ConfigurationController > logger)
Construct a UserController
+ +
The ModelController<TModel> for ConfigurationFiles
+
Routes to a server actions
Definition: Routes.cs:9
+
readonly IIOManager ioManager
The IIOManager for the ConfigurationController
+
string Message
A human readable description of the error
Definition: ErrorMessage.cs:13
+
IConfiguration Configuration
The IConfiguration for the IInstance
Definition: IInstance.cs:42
+
Represents a game configuration file. Create and delete actions uncerimonuously overwrite/delete file...
+
An ApiController representing a TModel
+ + + +
async Task< IActionResult > File(string filePath, CancellationToken cancellationToken)
Get the contents of a file at a filePath
+ +
ConfigurationType? ConfigurationType
If ConfigurationFile can be used on the Instance
Definition: Instance.cs:38
+
Metadata about a server instance
Definition: Instance.cs:9
+ +
bool PathContainsParentAccess(string path)
Check if a path contains the '..' parent directory accessor
+
override Task< IActionResult > List(CancellationToken cancellationToken)
Attempt to list entries of the TModel
+ +
Interface for using filesystems
Definition: IIOManager.cs:11
+
async Task< IActionResult > Directory(string directoryPath, CancellationToken cancellationToken)
Get the contents of a directory at a directoryPath
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
override async Task< IActionResult > Update([FromBody] ConfigurationFile model, CancellationToken cancellationToken)
+ + +
+ + + + diff --git a/_configuration_file_8cs.html b/_configuration_file_8cs.html new file mode 100644 index 0000000000..dfbafd623b --- /dev/null +++ b/_configuration_file_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/ConfigurationFile.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ConfigurationFile.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.ConfigurationFile
 Represents a game configuration file. Create and delete actions uncerimonuously overwrite/delete files More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + diff --git a/_configuration_file_8cs_source.html b/_configuration_file_8cs_source.html new file mode 100644 index 0000000000..1178bc0a3f --- /dev/null +++ b/_configuration_file_8cs_source.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/ConfigurationFile.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ConfigurationFile.cs
+
+
+Go to the documentation of this file.
2 {
6  public sealed class ConfigurationFile
7  {
11  public string Path { get; set; }
12 
16  public bool? AccessDenied { get; set; }
17 
21  public bool? IsDirectory { get; set; }
22 
26  public string LastReadHash { get; set; }
27 
31 #pragma warning disable CA1819 // Properties should not return arrays
32  public byte[] Content { get; set; }
33 #pragma warning restore CA1819 // Properties should not return arrays
34  }
35 }
string LastReadHash
The MD5 hash of the file when last read by the user. If this doesn't match during update actions,...
+
bool? IsDirectory
If Path represents a directory
+ +
string Path
The path to the ConfigurationFile file
+
Represents a game configuration file. Create and delete actions uncerimonuously overwrite/delete file...
+
byte [] Content
The content of the ConfigurationFile. Will be null if AccessDenied is true or during listing and writ...
+
bool? AccessDenied
If access to the ConfigurationFile file was denied for the operation
+
+ + + + diff --git a/_configuration_rights_8cs.html b/_configuration_rights_8cs.html new file mode 100644 index 0000000000..e34380959a --- /dev/null +++ b/_configuration_rights_8cs.html @@ -0,0 +1,113 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/ConfigurationRights.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ConfigurationRights.cs File Reference
+
+ + + + + diff --git a/_configuration_rights_8cs_source.html b/_configuration_rights_8cs_source.html new file mode 100644 index 0000000000..2f796f2de3 --- /dev/null +++ b/_configuration_rights_8cs_source.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/ConfigurationRights.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ConfigurationRights.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
8  [Flags]
9  public enum ConfigurationRights : ulong
10  {
14  None = 0,
15 
19  Read = 1,
20 
24  Write = 2,
25 
29  List = 4,
30 
34  Delete = 8
35  }
36 }
ConfigurationRights
Rights for Models.ConfigurationFile
+ + + + +
User can read all chat settings except Models.Internal.ChatBot.ConnectionString
+ +
+ + + + diff --git a/_configuration_test_8cs.html b/_configuration_test_8cs.html new file mode 100644 index 0000000000..6a3dd86256 --- /dev/null +++ b/_configuration_test_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/Instance/ConfigurationTest.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ConfigurationTest.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Tests.Instance.ConfigurationTest
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Tests
 
namespace  Tgstation.Server.Tests.Instance
 
+
+ + + + diff --git a/_configuration_test_8cs_source.html b/_configuration_test_8cs_source.html new file mode 100644 index 0000000000..5e680a4991 --- /dev/null +++ b/_configuration_test_8cs_source.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/Instance/ConfigurationTest.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ConfigurationTest.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using System;
3 using System.IO;
4 using System.Text;
5 using System.Threading;
6 using System.Threading.Tasks;
10 
12 {
13  sealed class ConfigurationTest
14  {
16  readonly Api.Models.Instance instance;
17 
19  {
20  this.configurationClient = configurationClient ?? throw new ArgumentNullException(nameof(configurationClient));
21  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
22  }
23 
25  {
26  var tmp = (file.Path?.StartsWith('/') ?? false) ? '.' + file.Path : file.Path;
27  var path = Path.Combine(instance.Path, "Configuration", tmp);
28  return File.Exists(path);
29  }
30 
31  async Task TestDeleteDirectory(CancellationToken cancellationToken)
32  {
33  //try to delete non-existent
34  var TestDir = new ConfigurationFile
35  {
36  Path = "/TestDeleteDir"
37  };
38 
39  await configurationClient.DeleteEmptyDirectory(TestDir, cancellationToken).ConfigureAwait(false);
40 
41  //try to delete non-empty
42  var file = await configurationClient.Write(new ConfigurationFile
43  {
44  Content = Encoding.UTF8.GetBytes("Hello world!"),
45  Path = TestDir.Path + "/test.txt"
46  }, cancellationToken).ConfigureAwait(false);
47 
48  Assert.IsTrue(FileExists(file));
49 
50  await Assert.ThrowsExceptionAsync<ConflictException>(() => configurationClient.DeleteEmptyDirectory(TestDir, cancellationToken)).ConfigureAwait(false);
51 
52  file.Content = null;
53  await configurationClient.Write(file, cancellationToken).ConfigureAwait(false);
54 
55  await configurationClient.DeleteEmptyDirectory(TestDir, cancellationToken).ConfigureAwait(false);
56  }
57 
58  public async Task Run(CancellationToken cancellationToken)
59  {
60  await TestDeleteDirectory(cancellationToken).ConfigureAwait(false);
61  }
62  }
63 }
Task< ConfigurationFile > Write(ConfigurationFile file, CancellationToken cancellationToken)
Overwrite a ConfigurationFile file
+ + + + + + +
string Path
The path to where the Instance is located. Can only be changed while the Instance is offline....
Definition: Instance.cs:26
+
string Path
The path to the ConfigurationFile file
+ +
async Task TestDeleteDirectory(CancellationToken cancellationToken)
+ +
Task DeleteEmptyDirectory(ConfigurationFile directory, CancellationToken cancellationToken)
Delete an empty directory
+
Represents a game configuration file. Create and delete actions uncerimonuously overwrite/delete file...
+
Occurs when the client performs an action that would result in data conflict
+ + + +
ConfigurationTest(IConfigurationClient configurationClient, Api.Models.Instance instance)
+
async Task Run(CancellationToken cancellationToken)
+ +
+ + + + diff --git a/_configuration_type_8cs.html b/_configuration_type_8cs.html new file mode 100644 index 0000000000..ea48b9330f --- /dev/null +++ b/_configuration_type_8cs.html @@ -0,0 +1,108 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/ConfigurationType.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ConfigurationType.cs File Reference
+
+ + + + + diff --git a/_configuration_type_8cs_source.html b/_configuration_type_8cs_source.html new file mode 100644 index 0000000000..20da482701 --- /dev/null +++ b/_configuration_type_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/ConfigurationType.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ConfigurationType.cs
+
+
+Go to the documentation of this file.
2 {
6  public enum ConfigurationType
7  {
11  Disallowed,
12 
16  HostWrite,
17 
22  }
23 }
ConfigurationType
The type of configuration allowed on an Instance
+ + + +
Configuration editing is allowed by all users on all files
+
+ + + + diff --git a/_conflict_exception_8cs.html b/_conflict_exception_8cs.html new file mode 100644 index 0000000000..28925ffa7e --- /dev/null +++ b/_conflict_exception_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/ConflictException.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ConflictException.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Client.ConflictException
 Occurs when the client performs an action that would result in data conflict More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_conflict_exception_8cs_source.html b/_conflict_exception_8cs_source.html new file mode 100644 index 0000000000..f4b7476487 --- /dev/null +++ b/_conflict_exception_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/ConflictException.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ConflictException.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Net;
4 
6 {
10  public sealed class ConflictException : ClientException
11  {
17  public ConflictException(ErrorMessage errorMessage, HttpStatusCode statusCode) : base(errorMessage, statusCode)
18  { }
19 
23  public ConflictException() { }
24 
29  public ConflictException(string message) : base(message) { }
30 
36  public ConflictException(string message, Exception innerException) : base(message, innerException) { }
37  }
38 }
ConflictException()
Construct a ConflictException
+
ConflictException(string message, Exception innerException)
Construct an ConflictException with a message and innerException
+ +
ConflictException(string message)
Construct an ConflictException with a message
+ +
ConflictException(ErrorMessage errorMessage, HttpStatusCode statusCode)
Construct an ConflictException with a errorMessage and statusCode
+ +
Occurs when the client performs an action that would result in data conflict
+ +
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
Exceptions thrown by IServerClients
+
+ + + + diff --git a/_console_8cs.html b/_console_8cs.html new file mode 100644 index 0000000000..f065598f73 --- /dev/null +++ b/_console_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/Console.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Console.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.IO.Console
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.IO
 
+
+ + + + diff --git a/_console_8cs_source.html b/_console_8cs_source.html new file mode 100644 index 0000000000..726154c060 --- /dev/null +++ b/_console_8cs_source.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/Console.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Console.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Text;
3 using System.Threading;
4 using System.Threading.Tasks;
5 
7 {
9  sealed class Console : IConsole
10  {
12  public bool Available => Environment.UserInteractive;
13 
15  {
16  if (!Available)
17  throw new InvalidOperationException("Console unavailable");
18  }
19 
21  public Task PressAnyKeyAsync(CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
22  {
24  System.Console.Read();
25  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
26 
28  public Task<string> ReadLineAsync(bool usePasswordChar, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
29  {
30  // TODO: Make this better: https://stackoverflow.com/questions/9479573/how-to-interrupt-console-readline
32  if (!usePasswordChar)
33  return System.Console.ReadLine();
34 
35  var passwordBuilder = new StringBuilder();
36  do
37  {
38  var keyDescription = System.Console.ReadKey(true);
39  if (keyDescription.Key == ConsoleKey.Enter)
40  break;
41  else if (keyDescription.Key == ConsoleKey.Backspace)
42  {
43  if (passwordBuilder.Length > 0)
44  {
45  --passwordBuilder.Length;
46  System.Console.Write("\b \b");
47  }
48  }
49  else if (keyDescription.KeyChar != '\u0000')
50  {
51  // KeyChar == '\u0000' if the key pressed does not correspond to a printable character, e.g. F1, Pause-Break, etc
52  passwordBuilder.Append(keyDescription.KeyChar);
53  System.Console.Write('*');
54  }
55  }
56  while (!cancellationToken.IsCancellationRequested);
57 
58  cancellationToken.ThrowIfCancellationRequested();
59  System.Console.WriteLine();
60  return passwordBuilder.ToString();
61  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
62 
64  public Task WriteAsync(string text, bool newLine, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
65  {
67  if (text == null)
68  {
69  if (!newLine)
70  throw new InvalidOperationException("Cannot write null text without a new line!");
71  System.Console.WriteLine();
72  }
73  else if (newLine)
74  System.Console.WriteLine(text);
75  else
76  System.Console.Write(text);
77  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
78  }
79 }
+ + +
Abstraction for System.Console
Definition: IConsole.cs:9
+
Task PressAnyKeyAsync(CancellationToken cancellationToken)
Wait for a key press on the IConsole
+
Task< string > ReadLineAsync(bool usePasswordChar, CancellationToken cancellationToken)
Read a line from the IConsole
+
Task WriteAsync(string text, bool newLine, CancellationToken cancellationToken)
Write some text to the IConsole
+ +
+ + + + diff --git a/_constants_8cs.html b/_constants_8cs.html new file mode 100644 index 0000000000..d3507a8630 --- /dev/null +++ b/_constants_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/Constants.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Constants.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Interop.Constants
 Constants used for communication with the DMAPI More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Interop
 
+
+ + + + diff --git a/_constants_8cs_source.html b/_constants_8cs_source.html new file mode 100644 index 0000000000..c07b1ab609 --- /dev/null +++ b/_constants_8cs_source.html @@ -0,0 +1,101 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/Constants.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Constants.cs
+
+
+Go to the documentation of this file.
2 {
6  static class Constants
7  {
11  public const string DMParamHostVersion = "server_service_version";
12 
16  public const string DMParamInfoJson = "tgs_json";
17 
21  public const string DMInteropAccessIdentifier = "tgs_tok";
22 
26  public const string DMResponseSuccess = "tgs_succ";
27 
31  public const string DMTopicChangePort = "tgs_port";
32 
36  public const string DMTopicChangeReboot = "tgs_rmode";
37 
41  public const string DMTopicChatCommand = "tgs_chat_comm";
42 
46  public const string DMTopicEvent = "tgs_event";
47 
51  public const string DMTopicInteropResponse = "tgs_interop";
52 
56  public const string DMCommandNewPort = "tgs_new_port";
57 
61  public const string DMCommandApiValidate = "tgs_validate";
62 
66  public const string DMCommandServerPrimed = "tgs_prime";
67 
71  public const string DMCommandWorldReboot = "tgs_reboot";
72 
76  public const string DMCommandEndProcess = "tgs_kill";
77 
81  public const string DMCommandChat = "tgs_chat_send";
82 
86  public const string DMParameterCommand = "tgs_com";
87 
91  public const string DMParameterData = "tgs_data";
92  }
93 }
const string DMCommandWorldReboot
World reboot command
Definition: Constants.cs:71
+
const string DMParamInfoJson
Path to the JsonFile
Definition: Constants.cs:16
+ +
const string DMTopicEvent
Notify of an EventType
Definition: Constants.cs:46
+
const string DMCommandEndProcess
Terminate process command
Definition: Constants.cs:76
+
const string DMCommandApiValidate
API validation command
Definition: Constants.cs:61
+ +
const string DMTopicInteropResponse
Response to an interop export from DM
Definition: Constants.cs:51
+
const string DMCommandServerPrimed
Server primed command
Definition: Constants.cs:66
+ +
const string DMParamHostVersion
Identifies a TGS execution. The server version
Definition: Constants.cs:11
+
Constants used for communication with the DMAPI
Definition: Constants.cs:6
+ +
const string DMResponseSuccess
Generic OK response
Definition: Constants.cs:26
+
const string DMParameterCommand
Topic command parameter
Definition: Constants.cs:86
+
const string DMCommandNewPort
Set port command
Definition: Constants.cs:56
+
const string DMInteropAccessIdentifier
The JsonFile.AccessIdentifier
Definition: Constants.cs:21
+
const string DMTopicChangeReboot
Change reboot mode
Definition: Constants.cs:36
+
const string DMCommandChat
Chat send command
Definition: Constants.cs:81
+
+ + + + diff --git a/_control_panel_configuration_8cs.html b/_control_panel_configuration_8cs.html new file mode 100644 index 0000000000..5c53db7384 --- /dev/null +++ b/_control_panel_configuration_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Configuration/ControlPanelConfiguration.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ControlPanelConfiguration.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Configuration.ControlPanelConfiguration
 Configuration options for the web control panel More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Configuration
 
+
+ + + + diff --git a/_control_panel_configuration_8cs_source.html b/_control_panel_configuration_8cs_source.html new file mode 100644 index 0000000000..00db0cd026 --- /dev/null +++ b/_control_panel_configuration_8cs_source.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Configuration/ControlPanelConfiguration.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ControlPanelConfiguration.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 
4 {
8  public sealed class ControlPanelConfiguration
9  {
13  public const string Section = "ControlPanel";
14 
18  public bool Enable { get; set; }
19 
23  public bool AllowAnyOrigin { get; set; }
24 
28  public List<string> AllowedOrigins { get; set; }
29  }
30 }
List< string > AllowedOrigins
Origins allowed for CORS requests
+ +
bool AllowAnyOrigin
If any origin is allowed for CORS requests. This overrides AllowedOrigins
+
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the ControlPanelConfiguratio...
+ + +
+ + + + diff --git a/_credentials_provider_8cs.html b/_credentials_provider_8cs.html new file mode 100644 index 0000000000..b9a19da021 --- /dev/null +++ b/_credentials_provider_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Repository/CredentialsProvider.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
CredentialsProvider.cs File Reference
+
+ + + + + diff --git a/_credentials_provider_8cs_source.html b/_credentials_provider_8cs_source.html new file mode 100644 index 0000000000..976d507c29 --- /dev/null +++ b/_credentials_provider_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Repository/CredentialsProvider.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
CredentialsProvider.cs
+
+
+Go to the documentation of this file.
1 using LibGit2Sharp;
2 using LibGit2Sharp.Handlers;
3 using Microsoft.Extensions.Logging;
4 using System;
6 
8 {
11  {
15  readonly ILogger<CredentialsProvider> logger;
16 
21  public CredentialsProvider(ILogger<CredentialsProvider> logger)
22  {
23  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
24  }
25 
27  public CredentialsHandler GenerateHandler(string username, string password) => (a, b, supportedCredentialTypes) =>
28  {
29  var hasCreds = username != null;
30  var supportsUserPass = supportedCredentialTypes.HasFlag(SupportedCredentialTypes.UsernamePassword);
31  var supportsAnonymous = supportedCredentialTypes.HasFlag(SupportedCredentialTypes.Default);
32 
33  logger.LogTrace("Credentials requested. Present: {0}. Supports anonymous: {1}. Supports user/pass: {2}", hasCreds, supportsAnonymous, supportsUserPass);
34  if (supportsUserPass)
35  {
36  if (hasCreds)
37  return new UsernamePasswordCredentials
38  {
39  Username = username,
40  Password = password
41  };
42  }
43 
44  if (supportsAnonymous)
45  return new DefaultCredentials();
46 
47  if (hasCreds)
48  throw new JobException("Remote does not support anonymous authentication!");
49 
50  throw new JobException("Server does not support anonymous or username/password authentication!");
51  };
52  }
53 }
CredentialsHandler GenerateHandler(string username, string password)
Generate a CredentialsHandler from a given username and password
+
CredentialsProvider(ILogger< CredentialsProvider > logger)
Construct a CredentialsProvider
+ + + + +
readonly ILogger< CredentialsProvider > logger
The ILogger for the CredentialsProvider
+ + +
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+ +
+ + + + diff --git a/_cryptography_suite_8cs.html b/_cryptography_suite_8cs.html new file mode 100644 index 0000000000..0ae1c5d2a0 --- /dev/null +++ b/_cryptography_suite_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/CryptographySuite.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
CryptographySuite.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Security.CryptographySuite
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Security
 
+
+ + + + diff --git a/_cryptography_suite_8cs_source.html b/_cryptography_suite_8cs_source.html new file mode 100644 index 0000000000..665754f9fb --- /dev/null +++ b/_cryptography_suite_8cs_source.html @@ -0,0 +1,99 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/CryptographySuite.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
CryptographySuite.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Identity;
2 using System;
3 using System.Globalization;
4 using System.Security.Cryptography;
6 
8 {
11  {
15  const uint SecureStringLength = 30;
16 
20  readonly IPasswordHasher<User> passwordHasher;
21 
26  public CryptographySuite(IPasswordHasher<User> passwordHasher)
27  {
28  this.passwordHasher = passwordHasher ?? throw new ArgumentNullException(nameof(passwordHasher));
29  }
30 
32  public byte[] GetSecureBytes(uint amount)
33  {
34  using (var rng = new RNGCryptoServiceProvider())
35  {
36  var byt = new byte[amount];
37  rng.GetBytes(byt);
38  return byt;
39  }
40  }
41 
43  public void SetUserPassword(User user, string newPassword, bool newUser)
44  {
45  if (user == null)
46  throw new ArgumentNullException(nameof(user));
47  if (newPassword == null)
48  throw new ArgumentNullException(nameof(newPassword));
49  user.PasswordHash = passwordHasher.HashPassword(user, newPassword);
50  if (!newUser)
51  user.LastPasswordUpdate = DateTimeOffset.Now;
52  }
53 
55  public bool CheckUserPassword(User user, string password)
56  {
57  var result = passwordHasher.VerifyHashedPassword(user, user.PasswordHash, password);
58  switch (result)
59  {
60  case PasswordVerificationResult.Failed:
61  return false;
62  case PasswordVerificationResult.SuccessRehashNeeded:
63  SetUserPassword(user, password, false);
64  break;
65  case PasswordVerificationResult.Success:
66  break;
67  default:
68  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Password hasher return unknown PasswordVerificationResult: {0}", result));
69  }
70 
71  return true;
72  }
73 
75  public string GetSecureString() => Convert.ToBase64String(GetSecureBytes(SecureStringLength));
76  }
77 }
string PasswordHash
The hash of the user's password
Definition: User.cs:13
+
string GetSecureString()
Generates a 40-length secure ascii string
+
readonly IPasswordHasher< User > passwordHasher
The IPasswordHasher<TUser> for the CryptographySuite
+ +
void SetUserPassword(User user, string newPassword, bool newUser)
Sets a User.PasswordHash for a given user
+
Contains various cryptographic functions
+ +
const uint SecureStringLength
Length in bytes of generated base64 secure string
+
DateTimeOffset? LastPasswordUpdate
When PasswordHash was last changed
Definition: User.cs:29
+ +
bool CheckUserPassword(User user, string password)
Checks a given password matches a given user 's User.PasswordHash. This may result in User....
+ + +
byte [] GetSecureBytes(uint amount)
Generates a secure set of bytes
+
CryptographySuite(IPasswordHasher< User > passwordHasher)
Construct a CryptographySuite
+ + +
+ + + + diff --git a/_custom_command_8cs.html b/_custom_command_8cs.html new file mode 100644 index 0000000000..5476910da7 --- /dev/null +++ b/_custom_command_8cs.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands/CustomCommand.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
CustomCommand.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Chat.Commands.CustomCommand
 Represents a command made from DM code More...
 
+ + + + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
namespace  Tgstation.Server.Host.Components.Chat.Commands
 
+
+ + + + diff --git a/_custom_command_8cs_source.html b/_custom_command_8cs_source.html new file mode 100644 index 0000000000..0f44923aaf --- /dev/null +++ b/_custom_command_8cs_source.html @@ -0,0 +1,96 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands/CustomCommand.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
CustomCommand.cs
+
+
+Go to the documentation of this file.
1 using Newtonsoft.Json;
2 using System;
3 using System.Threading;
4 using System.Threading.Tasks;
5 
7 {
11  public sealed class CustomCommand : ICommand
12  {
14  public string Name { get; set; }
15 
17  public string HelpText { get; set; }
18 
20  [JsonConverter(typeof(BoolConverter))]
21  public bool AdminOnly { get; set; }
22 
27 
33  {
34  if (this.handler != null)
35  throw new InvalidOperationException("SetHandler() already called!");
36  this.handler = handler ?? throw new ArgumentNullException(nameof(handler));
37  }
38 
40  public Task<string> Invoke(string arguments, User user, CancellationToken cancellationToken)
41  {
42  if (handler == null)
43  throw new InvalidOperationException("SetHandler() has not been called!");
44  return handler.HandleChatCommand(Name, arguments, user, cancellationToken);
45  }
46  }
47 }
void SetHandler(ICustomCommandHandler handler)
Set a new handler
+ + +
Task< string > Invoke(string arguments, User user, CancellationToken cancellationToken)
Invoke the ICommand
+
JsonConverter for decoding bools returned by BYOND
Definition: BoolConverter.cs:9
+ + + +
ICustomCommandHandler handler
The ICustomCommandHandler for the CustomCommand
+ +
Represents a tgs_chat_user datum
Definition: User.cs:10
+
Handles Commands.ICommands that map to those defined in a IJsonTrackingContext
+
Task< string > HandleChatCommand(string commandName, string arguments, User sender, CancellationToken cancellationToken)
Handle a chat command
+
Represents a command that can be invoked by talking to chat bots
Definition: ICommand.cs:9
+
+ + + + diff --git a/_d_b_connection_factory_8cs.html b/_d_b_connection_factory_8cs.html new file mode 100644 index 0000000000..53f838f42d --- /dev/null +++ b/_d_b_connection_factory_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/DBConnectionFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DBConnectionFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Core.DBConnectionFactory
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_d_b_connection_factory_8cs_source.html b/_d_b_connection_factory_8cs_source.html new file mode 100644 index 0000000000..4f1012e891 --- /dev/null +++ b/_d_b_connection_factory_8cs_source.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/DBConnectionFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DBConnectionFactory.cs
+
+
+Go to the documentation of this file.
1 using MySql.Data.MySqlClient;
2 using System;
3 using System.Data.Common;
4 using System.Data.SqlClient;
5 using System.Globalization;
7 
9 {
12  {
14  public DbConnection CreateConnection(string connectionString, DatabaseType databaseType)
15  {
16  if (connectionString == null)
17  throw new ArgumentNullException(nameof(connectionString));
18 
19  switch (databaseType)
20  {
21  case DatabaseType.MariaDB:
22  case DatabaseType.MySql:
23  return new MySqlConnection
24  {
25  ConnectionString = connectionString
26  };
27  case DatabaseType.SqlServer:
28  return new SqlConnection
29  {
30  ConnectionString = connectionString
31  };
32  default:
33  throw new ArgumentOutOfRangeException(nameof(databaseType), databaseType, "Invalid DatabaseType!");
34  }
35  }
36  }
37 }
+ + + +
DbConnection CreateConnection(string connectionString, DatabaseType databaseType)
Create a DbConnection
+ +
DatabaseType
Type of database to user
Definition: DatabaseType.cs:6
+ + + +
+ + + + diff --git a/_database_configuration_8cs.html b/_database_configuration_8cs.html new file mode 100644 index 0000000000..3973d1f548 --- /dev/null +++ b/_database_configuration_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Configuration/DatabaseConfiguration.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DatabaseConfiguration.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Configuration.DatabaseConfiguration
 Configuration options for the Models.DatabaseContext<TParentContext> More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Configuration
 
+
+ + + + diff --git a/_database_configuration_8cs_source.html b/_database_configuration_8cs_source.html new file mode 100644 index 0000000000..44b243e696 --- /dev/null +++ b/_database_configuration_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Configuration/DatabaseConfiguration.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DatabaseConfiguration.cs
+
+
+Go to the documentation of this file.
1 using Newtonsoft.Json;
2 using Newtonsoft.Json.Converters;
3 
5 {
9  sealed class DatabaseConfiguration
10  {
14  public const string Section = "Database";
15 
19  [JsonConverter(typeof(StringEnumConverter))]
20  public DatabaseType DatabaseType { get; set; }
21 
25  public bool ResetAdminPassword { get; set; }
26 
30  public string ConnectionString { get; set; }
31 
35  public bool DropDatabase { get; set; }
36 
40  public string MySqlServerVersion { get; set; }
41  }
42 }
string ConnectionString
The connection string for the database
+
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the DatabaseConfiguration re...
+ + +
bool ResetAdminPassword
If the admin user should be enabled and have it's password reset
+
string MySqlServerVersion
The string form of the System.Version of a target MySQL/MariaDB server
+
Configuration options for the Models.DatabaseContext<TParentContext>
+
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!
+
+ + + + diff --git a/_database_context_8cs.html b/_database_context_8cs.html new file mode 100644 index 0000000000..38bc1cda8e --- /dev/null +++ b/_database_context_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/DatabaseContext.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DatabaseContext.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Models.DatabaseContext< TParentContext >
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + diff --git a/_database_context_8cs_source.html b/_database_context_8cs_source.html new file mode 100644 index 0000000000..8ff14299bd --- /dev/null +++ b/_database_context_8cs_source.html @@ -0,0 +1,130 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/DatabaseContext.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
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;
14 
16 {
18  #pragma warning disable CA1506 // TODO: Decomplexify
19  abstract class DatabaseContext<TParentContext> : DbContext, IDatabaseContext where TParentContext : DbContext
20  {
22  public DbSet<User> Users { get; set; }
23 
25  public DbSet<Instance> Instances { get; set; }
26 
28  public DbSet<CompileJob> CompileJobs { get; set; }
29 
31  public DbSet<RevisionInformation> RevisionInformations { get; set; }
32 
34  public DbSet<DreamMakerSettings> DreamMakerSettings { get; set; }
35 
37  public DbSet<ChatBot> ChatBots { get; set; }
38 
40  public DbSet<DreamDaemonSettings> DreamDaemonSettings { get; set; }
41 
43  public DbSet<RepositorySettings> RepositorySettings { get; set; }
44 
46  public DbSet<InstanceUser> InstanceUsers { get; set; }
47 
49  public DbSet<ChatChannel> ChatChannels { get; set; }
50 
52  public DbSet<Job> Jobs { get; set; }
53 
55  public DbSet<ReattachInformation> ReattachInformations { get; set; }
56 
58  public DbSet<WatchdogReattachInformation> WatchdogReattachInformations { get; set; }
59 
63  public DbSet<TestMerge> TestMerges { get; set; }
64 
68  public DbSet<RevInfoTestMerge> RevInfoTestMerges { get; set; }
69 
73  protected ILogger Logger { get; }
74 
79 
84 
92  public DatabaseContext(DbContextOptions<TParentContext> dbContextOptions, IOptions<DatabaseConfiguration> databaseConfigurationOptions, IDatabaseSeeder databaseSeeder, ILogger logger) : base(dbContextOptions)
93  {
94  DatabaseConfiguration = databaseConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(databaseConfigurationOptions));
95  this.databaseSeeder = databaseSeeder ?? throw new ArgumentNullException(nameof(databaseSeeder));
96  Logger = logger ?? throw new ArgumentNullException(nameof(logger));
97  }
98 
100  protected override void OnModelCreating(ModelBuilder modelBuilder)
101  {
102  Logger.LogTrace("Building entity framework context...");
103  base.OnModelCreating(modelBuilder);
104 
105  var userModel = modelBuilder.Entity<User>();
106  userModel.HasIndex(x => x.CanonicalName).IsUnique();
107  userModel.HasMany(x => x.TestMerges).WithOne(x => x.MergedBy).OnDelete(DeleteBehavior.Restrict);
108 
109  modelBuilder.Entity<InstanceUser>().HasIndex(x => new { x.UserId, x.InstanceId }).IsUnique();
110 
111  modelBuilder.Entity<TestMerge>().HasMany(x => x.RevisonInformations).WithOne(x => x.TestMerge).OnDelete(DeleteBehavior.Cascade);
112 
113  var revInfo = modelBuilder.Entity<RevisionInformation>();
114  revInfo.HasMany(x => x.CompileJobs).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.Cascade);
115  revInfo.HasMany(x => x.ActiveTestMerges).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.Cascade);
116  revInfo.HasOne(x => x.PrimaryTestMerge).WithOne(x => x.PrimaryRevisionInformation).OnDelete(DeleteBehavior.Restrict);
117  revInfo.HasIndex(x => new { x.InstanceId, x.CommitSha }).IsUnique();
118 
119  modelBuilder.Entity<CompileJob>().HasIndex(x => x.DirectoryName);
120 
121  modelBuilder.Entity<Job>().HasOne<CompileJob>().WithOne(x => x.Job).OnDelete(DeleteBehavior.Restrict);
122 
123  var chatChannel = modelBuilder.Entity<ChatChannel>();
124  chatChannel.HasIndex(x => new { x.ChatSettingsId, x.IrcChannel }).IsUnique();
125  chatChannel.HasIndex(x => new { x.ChatSettingsId, x.DiscordChannelId }).IsUnique();
126  chatChannel.HasOne(x => x.ChatSettings).WithMany(x => x.Channels).HasForeignKey(x => x.ChatSettingsId).OnDelete(DeleteBehavior.Cascade);
127 
128  modelBuilder.Entity<ChatBot>().HasIndex(x => x.Name).IsUnique();
129 
130  var instanceModel = modelBuilder.Entity<Instance>();
131  instanceModel.HasIndex(x => x.Path).IsUnique();
132  instanceModel.HasMany(x => x.ChatSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
133  instanceModel.HasOne(x => x.DreamDaemonSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
134  instanceModel.HasOne(x => x.DreamMakerSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
135  instanceModel.HasOne(x => x.RepositorySettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
136  instanceModel.HasMany(x => x.RevisionInformations).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
137  instanceModel.HasMany(x => x.InstanceUsers).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
138  instanceModel.HasMany(x => x.Jobs).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
139  instanceModel.HasOne(x => x.WatchdogReattachInformation).WithOne().OnDelete(DeleteBehavior.Cascade);
140  }
141 
143  public async Task Initialize(CancellationToken cancellationToken)
144  {
146  {
147  Logger.LogCritical("DropDatabase configuration option set! Dropping any existing database...");
148  await Database.EnsureDeletedAsync(cancellationToken).ConfigureAwait(false);
149  }
150 
151  var migrations = await Database.GetAppliedMigrationsAsync(cancellationToken).ConfigureAwait(false);
152  var wasEmpty = !migrations.Any();
153 
154  if (wasEmpty || (await Database.GetPendingMigrationsAsync(cancellationToken).ConfigureAwait(false)).Any())
155  {
156  Logger.LogInformation("Migrating database...");
157  await Database.MigrateAsync(cancellationToken).ConfigureAwait(false);
158  }
159  else
160  Logger.LogDebug("No migrations to apply.");
161 
162  wasEmpty |= (await Users.CountAsync(cancellationToken).ConfigureAwait(false)) == 0;
163 
164  if (wasEmpty)
165  {
166  Logger.LogInformation("Seeding database...");
167  await databaseSeeder.SeedDatabase(this, cancellationToken).ConfigureAwait(false);
168  }
170  {
171  Logger.LogWarning("Enabling and resetting admin password due to configuration!");
172  await databaseSeeder.ResetAdminPassword(this, cancellationToken).ConfigureAwait(false);
173  }
174  }
175 
177  public Task Save(CancellationToken cancellationToken) => SaveChangesAsync(cancellationToken);
178 
183  protected abstract bool UseMySQLMigrations();
184 
186  public async Task SchemaDowngradeForServerVersion(Version version, CancellationToken cancellationToken)
187  {
188  if (version == null)
189  throw new ArgumentNullException(nameof(version));
190  if (version < new Version(4, 0))
191  throw new ArgumentOutOfRangeException(nameof(version), version, "Not a valid V4 version!");
192 
193  string targetMigration = null;
194 
195  // Update this with new migrations as they are made
196  // Always use the MS class
197  if (version < new Version(4, 0, 2))
198  targetMigration = nameof(MSReattachCompileJobRequired);
199 
200  if (targetMigration == null)
201  return;
202 
203  if (UseMySQLMigrations())
204  targetMigration = String.Format(CultureInfo.InvariantCulture, "MY{0}", targetMigration.Substring(2));
205 
206  // even though it clearly implements it in the DatabaseFacade definition this won't work without casting (╯ಠ益ಠ)╯︵ ┻━┻
207  var dbServiceProvider = ((IInfrastructure<IServiceProvider>)Database).Instance;
208  var migrator = dbServiceProvider.GetRequiredService<IMigrator>();
209 
210  Logger.LogInformation("Migrating down to version {0}. Target: {1}", version, targetMigration);
211  try
212  {
213  await migrator.MigrateAsync(targetMigration, cancellationToken).ConfigureAwait(false);
214  }
215  catch (Exception e)
216  {
217  Logger.LogCritical("Failed to migrate! Exception: {0}", e);
218  }
219  }
220  }
221 }
+
DbSet< TestMerge > TestMerges
The TestMerges in the DatabaseContext<TParentContext>
+ + + +
DbSet< ReattachInformation > ReattachInformations
+
abstract bool UseMySQLMigrations()
If the MY_ class of migrations should be used instead of the MS_ class
+ + + + +
Task ResetAdminPassword(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Changes the admin password in IDatabaseContext back to it's default and enables the account
+ + +
For initially seeding a database
+ +
DbSet< RevisionInformation > RevisionInformations
+
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+ + + +
async Task Initialize(CancellationToken cancellationToken)
Creates and migrates the IDatabaseContext
+ +
bool ResetAdminPassword
If the admin user should be enabled and have it's password reset
+
override void OnModelCreating(ModelBuilder modelBuilder)
+
async Task SchemaDowngradeForServerVersion(Version version, CancellationToken cancellationToken)
Attempt to downgrade the schema to the migration used for a given server version
+
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+ + + +
Marks the CompileJobs of ReattachInformations as non-nullable for MSSQL
+
DatabaseContext(DbContextOptions< TParentContext > dbContextOptions, IOptions< DatabaseConfiguration > databaseConfigurationOptions, IDatabaseSeeder databaseSeeder, ILogger logger)
Construct a DatabaseContext<TParentContext>
+ +
Configuration options for the Models.DatabaseContext<TParentContext>
+
DbSet< RevInfoTestMerge > RevInfoTestMerges
The RevInfoTestMerges om the DatabaseContext<TParentContext>
+ +
DbSet< WatchdogReattachInformation > WatchdogReattachInformations
+
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>
+
ILogger Logger
The ILogger for the DatabaseContext<TParentContext>
+ + + +
Task SeedDatabase(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Initially seed a given databaseContext
+ + + + +
+ + + + diff --git a/_database_context_factory_8cs.html b/_database_context_factory_8cs.html new file mode 100644 index 0000000000..695e55f26f --- /dev/null +++ b/_database_context_factory_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/DatabaseContextFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DatabaseContextFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Core.DatabaseContextFactory
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_database_context_factory_8cs_source.html b/_database_context_factory_8cs_source.html new file mode 100644 index 0000000000..e4113ae7f8 --- /dev/null +++ b/_database_context_factory_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/DatabaseContextFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DatabaseContextFactory.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.DependencyInjection;
2 using System;
3 using System.Threading.Tasks;
5 
7 {
10  {
14  readonly IServiceScopeFactory scopeFactory;
15 
20  public DatabaseContextFactory(IServiceScopeFactory scopeFactory)
21  {
22  this.scopeFactory = scopeFactory ?? throw new ArgumentNullException(nameof(scopeFactory));
23 
24  using (var scope = scopeFactory.CreateScope())
25  scope.ServiceProvider.GetRequiredService<IDatabaseContext>();
26  }
27 
29  public async Task UseContext(Func<IDatabaseContext, Task> operation)
30  {
31  if (operation == null)
32  throw new ArgumentNullException(nameof(operation));
33 
34  using (var scope = scopeFactory.CreateScope())
35  await operation(scope.ServiceProvider.GetRequiredService<IDatabaseContext>()).ConfigureAwait(false);
36  }
37  }
38 }
+ +
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
+
DatabaseContextFactory(IServiceScopeFactory scopeFactory)
Construct a DatabaseContextFactory
+ + +
readonly IServiceScopeFactory scopeFactory
The IServiceScopeFactory for the DatabaseContextFactory
+
async Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+ + + +
+ + + + diff --git a/_database_seeder_8cs.html b/_database_seeder_8cs.html new file mode 100644 index 0000000000..502b140e4f --- /dev/null +++ b/_database_seeder_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/DatabaseSeeder.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DatabaseSeeder.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Models.DatabaseSeeder
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + diff --git a/_database_seeder_8cs_source.html b/_database_seeder_8cs_source.html new file mode 100644 index 0000000000..92091faef5 --- /dev/null +++ b/_database_seeder_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/DatabaseSeeder.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DatabaseSeeder.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore;
2 using System;
3 using System.Linq;
4 using System.Threading;
5 using System.Threading.Tasks;
8 
10 {
13  {
18 
23  public DatabaseSeeder(ICryptographySuite cryptographySuite) => this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
24 
29  void SeedAdminUser(IDatabaseContext databaseContext)
30  {
31  var admin = new User
32  {
34  CreatedAt = DateTimeOffset.Now,
36  Name = Api.Models.User.AdminName,
37  CanonicalName = Api.Models.User.AdminName.ToUpperInvariant(),
38  Enabled = true,
39  };
40  cryptographySuite.SetUserPassword(admin, Api.Models.User.DefaultAdminPassword, true);
41  databaseContext.Users.Add(admin);
42  }
43 
45  public async Task SeedDatabase(IDatabaseContext databaseContext, CancellationToken cancellationToken)
46  {
47  SeedAdminUser(databaseContext);
48  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
49  }
50 
52  public async Task ResetAdminPassword(IDatabaseContext databaseContext, CancellationToken cancellationToken)
53  {
54  var admin = await databaseContext.Users.Where(x => x.CanonicalName == Api.Models.User.AdminName.ToUpperInvariant()).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
55  if (admin == default)
56  SeedAdminUser(databaseContext);
57  else
58  {
59  admin.Enabled = true;
60  cryptographySuite.SetUserPassword(admin, Api.Models.User.DefaultAdminPassword, false);
61  }
62 
63  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
64  }
65  }
66 }
+
async Task ResetAdminPassword(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Changes the admin password in IDatabaseContext back to it's default and enables the account
+ +
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the DatabaseContext<TParentContext>
+ +
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
For initially seeding a database
+
DbSet< User > Users
The Users in the IDatabaseContext
+
AdministrationRights
Rights for Models.Administration
+
async Task SeedDatabase(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Initially seed a given databaseContext
+
Contains various cryptographic functions
+ +
DatabaseSeeder(ICryptographySuite cryptographySuite)
Construct a DatabaseSeeder
+
InstanceManagerRights
Rights for managing Models.Instances
+
void SeedAdminUser(IDatabaseContext databaseContext)
Add a default admin User to a given databaseContext
+ + +
void SetUserPassword(User user, string newPassword, bool newUser)
Sets a User.PasswordHash for a given user
+ + + + +
+ + + + diff --git a/_database_type_8cs.html b/_database_type_8cs.html new file mode 100644 index 0000000000..60de80e18b --- /dev/null +++ b/_database_type_8cs.html @@ -0,0 +1,108 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Configuration/DatabaseType.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DatabaseType.cs File Reference
+
+ + + + + diff --git a/_database_type_8cs_source.html b/_database_type_8cs_source.html new file mode 100644 index 0000000000..6ecc38f08f --- /dev/null +++ b/_database_type_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Configuration/DatabaseType.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DatabaseType.cs
+
+ + + + + diff --git a/_dead_session_controller_8cs.html b/_dead_session_controller_8cs.html new file mode 100644 index 0000000000..3b745cf670 --- /dev/null +++ b/_dead_session_controller_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/DeadSessionController.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DeadSessionController.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Watchdog.DeadSessionController
 Implements a fake "dead" ISessionController More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Watchdog
 
+
+ + + + diff --git a/_dead_session_controller_8cs_source.html b/_dead_session_controller_8cs_source.html new file mode 100644 index 0000000000..684de69c70 --- /dev/null +++ b/_dead_session_controller_8cs_source.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/DeadSessionController.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DeadSessionController.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4 
6 {
11  {
13  public Task<LaunchResult> LaunchResult { get; }
14 
16  public bool IsPrimary => false;
17 
19  public bool TerminationWasRequested => false;
20 
22  public ApiValidationStatus ApiValidationStatus => throw new NotSupportedException();
23 
25  public IDmbProvider Dmb { get; }
26 
28  public ushort? Port => null;
29 
31  public bool ClosePortOnReboot
32  {
33  get => false;
34  set => throw new NotSupportedException();
35  }
36 
38  public RebootState RebootState => throw new NotSupportedException();
39 
41  public Task OnReboot { get; }
42 
44  public Task<int> Lifetime { get; }
45 
49  bool disposed;
50 
55  public DeadSessionController(IDmbProvider dmbProvider)
56  {
57  Dmb = dmbProvider ?? throw new ArgumentNullException(nameof(dmbProvider));
58  LaunchResult = Task.FromResult(new LaunchResult
59  {
60  StartupTime = TimeSpan.FromSeconds(0)
61  });
62  Lifetime = Task.FromResult(-1);
63  OnReboot = new TaskCompletionSource<object>().Task;
64  }
65 
67  public void Dispose()
68  {
69  lock (this)
70  {
71  if (disposed)
72  return;
73  disposed = true;
74  }
75 
76  Dmb.Dispose();
77  }
78 
80  public void EnableCustomChatCommands() => throw new NotSupportedException();
81 
83  public ReattachInformation Release() => throw new NotSupportedException();
84 
86  public void ResetRebootState() => throw new NotSupportedException();
87 
89  public Task<string> SendCommand(string command, CancellationToken cancellationToken) => throw new NotSupportedException();
90 
92  public void SetHighPriority() => throw new NotSupportedException();
93 
95  public Task<bool> SetPort(ushort newPort, CancellationToken cancellatonToken) => throw new NotSupportedException();
96 
98  public Task<bool> SetRebootState(RebootState newRebootState, CancellationToken cancellationToken) => throw new NotSupportedException();
99  }
100 }
+ + +
Represents the result of trying to start a DD process
Definition: LaunchResult.cs:9
+ +
Task< bool > SetPort(ushort newPort, CancellationToken cancellatonToken)
Causes the world to start listening on a newPort
+
Handles communication with a DreamDaemon IProcess
+
ReattachInformation Release()
Releases the IProcess without terminating it. Also calls System.IDisposable.Dispose
+
Task< string > SendCommand(string command, CancellationToken cancellationToken)
Sends a command to DreamDaemon through /world/Topic()
+
void SetHighPriority()
Set's the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass....
+ +
void ResetRebootState()
Changes RebootState to Components.Watchdog.RebootState.Normal without telling the DMAPI
+ +
Task< bool > SetRebootState(RebootState newRebootState, CancellationToken cancellationToken)
Attempts to change the current RebootState to newRebootState
+ + +
void EnableCustomChatCommands()
Enables the reading of custom chat commands from the ISessionController
+ + +
Provides absolute paths to the latest compiled .dmbs
Definition: IDmbProvider.cs:9
+
DeadSessionController(IDmbProvider dmbProvider)
Construct a DeadSessionController
+
bool disposed
If the DeadSessionController was Disposed
+
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
+
Parameters necessary for duplicating a ISessionController session
+
ApiValidationStatus
Status of DMAPI validation
+
+ + + + diff --git a/_default_i_o_manager_8cs.html b/_default_i_o_manager_8cs.html new file mode 100644 index 0000000000..6fe39afd63 --- /dev/null +++ b/_default_i_o_manager_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/DefaultIOManager.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DefaultIOManager.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.IO.DefaultIOManager
 IIOManager that resolves paths to Environment.CurrentDirectory More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.IO
 
+
+ + + + diff --git a/_default_i_o_manager_8cs_source.html b/_default_i_o_manager_8cs_source.html new file mode 100644 index 0000000000..035aa9edf1 --- /dev/null +++ b/_default_i_o_manager_8cs_source.html @@ -0,0 +1,111 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/DefaultIOManager.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DefaultIOManager.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Globalization;
4 using System.IO;
5 using System.IO.Compression;
6 using System.Linq;
7 using System.Net;
8 using System.Threading;
9 using System.Threading.Tasks;
10 
12 {
17  {
21  public const int DefaultBufferSize = 4096;
22 
29  static async Task NormalizeAndDelete(DirectoryInfo dir, CancellationToken cancellationToken)
30  {
31  var tasks = new List<Task>();
32 
33  foreach (var subDir in dir.EnumerateDirectories())
34  {
35  cancellationToken.ThrowIfCancellationRequested();
36 
37  // if below succeeds this is probably a symlink
38  if (!subDir.Attributes.HasFlag(FileAttributes.Directory) || subDir.Attributes.HasFlag(FileAttributes.ReparsePoint))
39  subDir.Delete();
40  else
41  tasks.Add(NormalizeAndDelete(subDir, cancellationToken));
42  }
43 
44  foreach (var file in dir.EnumerateFiles())
45  {
46  cancellationToken.ThrowIfCancellationRequested();
47  file.Attributes = FileAttributes.Normal;
48  file.Delete();
49  }
50 
51  await Task.WhenAll(tasks).ConfigureAwait(false);
52  cancellationToken.ThrowIfCancellationRequested();
53  dir.Delete(true);
54  }
55 
61  static FileStream OpenWriteStream(string path) => new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.ReadWrite, DefaultBufferSize, true);
62 
71  IEnumerable<Task> CopyDirectoryImpl(string src, string dest, IEnumerable<string> ignore, CancellationToken cancellationToken)
72  {
73  var dir = new DirectoryInfo(src);
74  var atLeastOneSubDir = false;
75  foreach (var I in dir.EnumerateDirectories())
76  {
77  if (ignore != null && ignore.Contains(I.Name))
78  continue;
79  foreach (var J in CopyDirectoryImpl(I.FullName, Path.Combine(dest, I.Name), null, cancellationToken))
80  {
81  atLeastOneSubDir = true;
82  yield return J;
83  }
84  }
85 
86  async Task CopyThisDirectory()
87  {
88  if (!atLeastOneSubDir)
89  await CreateDirectory(dest, cancellationToken).ConfigureAwait(false); // save on createdir calls
90 
91  var tasks = new List<Task>();
92 
93  await dir.EnumerateFiles().ToAsyncEnumerable().ForEachAsync(fileInfo =>
94  {
95  if (ignore != null && ignore.Contains(fileInfo.Name))
96  return;
97  tasks.Add(CopyFile(fileInfo.FullName, Path.Combine(dest, fileInfo.Name), cancellationToken));
98  }).ConfigureAwait(false);
99 
100  await Task.WhenAll(tasks).ConfigureAwait(false);
101  }
102 
103  yield return CopyThisDirectory();
104  }
105 
107  public async Task CopyDirectory(string src, string dest, IEnumerable<string> ignore, CancellationToken cancellationToken)
108  {
109  if (dest == null)
110  throw new ArgumentNullException(nameof(src));
111  if (dest == null)
112  throw new ArgumentNullException(nameof(src));
113 
114  src = ResolvePath(src);
115  dest = ResolvePath(dest);
116  foreach (var directoryCopy in CopyDirectoryImpl(src, dest, ignore, cancellationToken))
117  await directoryCopy.ConfigureAwait(false);
118  }
119 
121  public string ConcatPath(params string[] paths)
122  {
123  if (paths == null)
124  throw new ArgumentNullException(nameof(paths));
125  return Path.Combine(paths);
126  }
127 
129  public async Task CopyFile(string src, string dest, CancellationToken cancellationToken)
130  {
131  if (src == null)
132  throw new ArgumentNullException(nameof(src));
133  if (dest == null)
134  throw new ArgumentNullException(nameof(dest));
135  using (var srcStream = new FileStream(ResolvePath(src), FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete, DefaultBufferSize, true))
136  using (var destStream = new FileStream(ResolvePath(dest), FileMode.Create, FileAccess.Write, FileShare.ReadWrite | FileShare.Delete, DefaultBufferSize, true))
137  await srcStream.CopyToAsync(destStream, 81920, cancellationToken).ConfigureAwait(false);
138  }
139 
141  public Task CreateDirectory(string path, CancellationToken cancellationToken) => Task.Factory.StartNew(() => Directory.CreateDirectory(ResolvePath(path)), cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
142 
144  public async Task DeleteDirectory(string path, CancellationToken cancellationToken)
145  {
146  path = ResolvePath(path);
147  var di = new DirectoryInfo(path);
148  if (!di.Exists)
149  return;
150  await NormalizeAndDelete(di, cancellationToken).ConfigureAwait(false);
151  }
152 
154  public Task DeleteFile(string path, CancellationToken cancellationToken) => Task.Factory.StartNew(() => File.Delete(ResolvePath(path)), cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
155 
157  public Task<bool> FileExists(string path, CancellationToken cancellationToken) => Task.Factory.StartNew(() => File.Exists(ResolvePath(path)), cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
158 
160  public Task<bool> DirectoryExists(string path, CancellationToken cancellationToken) => Task.Factory.StartNew(() => Directory.Exists(ResolvePath(path)), cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
161 
163  public string GetDirectoryName(string path) => Path.GetDirectoryName(path ?? throw new ArgumentNullException(nameof(path)));
164 
166  public string GetFileName(string path) => Path.GetFileName(path ?? throw new ArgumentNullException(nameof(path)));
167 
169  public string GetFileNameWithoutExtension(string path) => Path.GetFileNameWithoutExtension(path ?? throw new ArgumentNullException(nameof(path)));
170 
172  public Task<List<string>> GetFilesWithExtension(string path, string extension, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
173  {
174  path = ResolvePath(path);
175  if (extension == null)
176  throw new ArgumentNullException(extension);
177  var results = new List<string>();
178  foreach (var I in Directory.EnumerateFiles(path, String.Format(CultureInfo.InvariantCulture, "*.{0}", extension), SearchOption.TopDirectoryOnly))
179  {
180  cancellationToken.ThrowIfCancellationRequested();
181  results.Add(I);
182  }
183 
184  return results;
185  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
186 
188  public Task MoveFile(string source, string destination, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
189  {
190  if (destination == null)
191  throw new ArgumentNullException(nameof(destination));
192  source = ResolvePath(source ?? throw new ArgumentNullException(nameof(source)));
193  destination = ResolvePath(destination);
194  File.Move(source, destination);
195  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
196 
198  public Task MoveDirectory(string source, string destination, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
199  {
200  if (destination == null)
201  throw new ArgumentNullException(nameof(destination));
202  source = ResolvePath(source ?? throw new ArgumentNullException(nameof(source)));
203  destination = ResolvePath(destination);
204  Directory.Move(source, destination);
205  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
206 
208  public async Task<byte[]> ReadAllBytes(string path, CancellationToken cancellationToken)
209  {
210  path = ResolvePath(path);
211  using (var file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete, DefaultBufferSize, true))
212  {
213  byte[] buf;
214  buf = new byte[file.Length];
215  await file.ReadAsync(buf, 0, (int)file.Length, cancellationToken).ConfigureAwait(false);
216  return buf;
217  }
218  }
219 
221  public virtual string ResolvePath(string path) => Path.GetFullPath(path ?? throw new ArgumentNullException(nameof(path)));
222 
224  public async Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
225  {
226  path = ResolvePath(path);
227  using (var file = OpenWriteStream(path))
228  await file.WriteAsync(contents, 0, contents.Length, cancellationToken).ConfigureAwait(false);
229  }
230 
232  public Task<IReadOnlyList<string>> GetDirectories(string path, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
233  {
234  path = ResolvePath(path);
235  var results = new List<string>();
236  cancellationToken.ThrowIfCancellationRequested();
237  foreach (var I in Directory.EnumerateDirectories(path))
238  {
239  results.Add(I);
240  cancellationToken.ThrowIfCancellationRequested();
241  }
242 
243  return (IReadOnlyList<string>)results;
244  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
245 
247  public Task<IReadOnlyList<string>> GetFiles(string path, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
248  {
249  path = ResolvePath(path);
250  var results = new List<string>();
251  cancellationToken.ThrowIfCancellationRequested();
252  foreach (var I in Directory.EnumerateFiles(path))
253  {
254  results.Add(I);
255  cancellationToken.ThrowIfCancellationRequested();
256  }
257 
258  return (IReadOnlyList<string>)results;
259  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
260 
262  public async Task<byte[]> DownloadFile(Uri url, CancellationToken cancellationToken)
263  {
264  // DownloadDataTaskAsync can't be cancelled and is shittily written, don't use it
265  using (var wc = new WebClient())
266  {
267  var tcs = new TaskCompletionSource<byte[]>();
268  wc.DownloadDataCompleted += (a, b) =>
269  {
270  if (b.Error != null)
271  tcs.TrySetException(b.Error);
272  else if (b.Cancelled)
273  tcs.TrySetCanceled();
274  else
275  tcs.TrySetResult(b.Result);
276  };
277  wc.DownloadDataAsync(url);
278  using (cancellationToken.Register(() =>
279  {
280  wc.CancelAsync();
281  tcs.TrySetCanceled();
282  }))
283  return await tcs.Task.ConfigureAwait(false);
284  }
285  }
286 
288  public Task ZipToDirectory(string path, byte[] zipFileBytes, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
289  {
290  path = ResolvePath(path);
291  if (zipFileBytes == null)
292  throw new ArgumentNullException(nameof(zipFileBytes));
293 
294  using (var ms = new MemoryStream(zipFileBytes))
295  using (var archive = new ZipArchive(ms, ZipArchiveMode.Read))
296  archive.ExtractToDirectory(path);
297  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
298 
300  public bool PathContainsParentAccess(string path) => path?.Split(new[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar }).Any(x => x == "..") ?? throw new ArgumentNullException(nameof(path));
301  }
302 }
async Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
Task< bool > DirectoryExists(string path, CancellationToken cancellationToken)
Check that the directory at path exists
+
async Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
async Task CopyFile(string src, string dest, CancellationToken cancellationToken)
Copy a file from src to dest
+
Task MoveFile(string source, string destination, CancellationToken cancellationToken)
Moves a file at source to destination
+
string GetDirectoryName(string path)
Gets the directory portion of a given path
+
static async Task NormalizeAndDelete(DirectoryInfo dir, CancellationToken cancellationToken)
Recursively empty a directory
+
Task ZipToDirectory(string path, byte[] zipFileBytes, CancellationToken cancellationToken)
Extract a set of zipFileBytes to a given path
+
async Task CopyDirectory(string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)
Copies a directory from src to dest
+
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists
+
async Task< byte[]> ReadAllBytes(string path, CancellationToken cancellationToken)
Returns all the contents of a file at path as a byte array
+
string GetFileNameWithoutExtension(string path)
Gets the file name portion of a path with
+
IEnumerable< Task > CopyDirectoryImpl(string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)
Copies a directory from src to dest
+
Task< List< string > > GetFilesWithExtension(string path, string extension, CancellationToken cancellationToken)
Gets a list of files in path with the given extension
+
async Task< byte[]> DownloadFile(Uri url, CancellationToken cancellationToken)
Downloads a file from url
+
Task< IReadOnlyList< string > > GetFiles(string path, CancellationToken cancellationToken)
Returns file names in a given path
+
Task MoveDirectory(string source, string destination, CancellationToken cancellationToken)
Moves a directory at source to destination
+
IIOManager that resolves paths to Environment.CurrentDirectory
+
static FileStream OpenWriteStream(string path)
Opens a FileStream for async writing at a given path
+
Task< IReadOnlyList< string > > GetDirectories(string path, CancellationToken cancellationToken)
Returns directory names in a given path
+
Task DeleteFile(string path, CancellationToken cancellationToken)
Deletes a file at path
+
virtual string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
Interface for using filesystems
Definition: IIOManager.cs:11
+
const int DefaultBufferSize
Default FileStream buffer size used by .NET
+
bool PathContainsParentAccess(string path)
Check if a path contains the '..' parent directory accessor
+
Task CreateDirectory(string path, CancellationToken cancellationToken)
Create a directory at path
+
string GetFileName(string path)
Gets the file name portion of a path
+ +
+ + + + diff --git a/_design_time_db_context_factory_helpers_8cs.html b/_design_time_db_context_factory_helpers_8cs.html new file mode 100644 index 0000000000..b0e9596729 --- /dev/null +++ b/_design_time_db_context_factory_helpers_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/DesignTimeDbContextFactoryHelpers.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DesignTimeDbContextFactoryHelpers.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.DesignTimeDbContextFactoryHelpers
 Contains helpers for creating design time DatabaseContext<TParentContext>s More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + diff --git a/_design_time_db_context_factory_helpers_8cs_source.html b/_design_time_db_context_factory_helpers_8cs_source.html new file mode 100644 index 0000000000..d6266e9900 --- /dev/null +++ b/_design_time_db_context_factory_helpers_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/DesignTimeDbContextFactoryHelpers.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DesignTimeDbContextFactoryHelpers.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Configuration;
2 using Microsoft.Extensions.Options;
3 using System.IO;
4 using System.Reflection;
6 
8 {
13  {
17  const string RootJson = "appsettings.json";
18 
22  const string DevJson = "appsettings.Development.json";
23 
28  public static IOptions<DatabaseConfiguration> GetDbContextOptions()
29  {
30  var builder = new ConfigurationBuilder();
31  builder.SetBasePath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
32  builder.AddJsonFile(RootJson);
33  builder.AddJsonFile(DevJson);
34  var configuration = builder.Build();
35  return Options.Create(configuration.GetSection(DatabaseConfiguration.Section).Get<DatabaseConfiguration>());
36  }
37  }
38 }
static IOptions< DatabaseConfiguration > GetDbContextOptions()
Get the IOptions<TOptions> for the DatabaseConfiguration
+ +
Contains helpers for creating design time DatabaseContext<TParentContext>s
+
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the DatabaseConfiguration re...
+
const string DevJson
Path to the development json file to use for migrations configuration
+ +
Configuration options for the Models.DatabaseContext<TParentContext>
+ +
const string RootJson
Path to the json file to use for migrations configuration
+ + +
+ + + + diff --git a/_discord_connection_string_builder_8cs.html b/_discord_connection_string_builder_8cs.html new file mode 100644 index 0000000000..aad75c6773 --- /dev/null +++ b/_discord_connection_string_builder_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/DiscordConnectionStringBuilder.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DiscordConnectionStringBuilder.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.DiscordConnectionStringBuilder
 ChatConnectionStringBuilder for ChatProvider.Discord More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + diff --git a/_discord_connection_string_builder_8cs_source.html b/_discord_connection_string_builder_8cs_source.html new file mode 100644 index 0000000000..401a2803ff --- /dev/null +++ b/_discord_connection_string_builder_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/DiscordConnectionStringBuilder.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DiscordConnectionStringBuilder.cs
+
+
+Go to the documentation of this file.
1 using System;
3 
5 {
10  {
12  public override bool Valid => !String.IsNullOrEmpty(BotToken);
13 
18  public string BotToken { get; set; }
19 
24 
29  public DiscordConnectionStringBuilder(string connectionString)
30  {
31  BotToken = connectionString ?? throw new ArgumentNullException(nameof(connectionString));
32  }
33 
35  public override string ToString() => BotToken;
36  }
37 }
+
ChatConnectionStringBuilder for ChatProvider.Discord
+ +
override string ToString()
Gets the ChatBot.ConnectionString associated with the ChatConnectionStringBuilder
+ +
DiscordConnectionStringBuilder(string connectionString)
Construct a DiscordConnectionStringBuilder from a connectionString
+ +
DiscordConnectionStringBuilder()
Construct a DiscordConnectionStringBuilder
+ + + + +
+ + + + diff --git a/_discord_provider_8cs.html b/_discord_provider_8cs.html new file mode 100644 index 0000000000..8bd00063ac --- /dev/null +++ b/_discord_provider_8cs.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Providers/DiscordProvider.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DiscordProvider.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider
 IProvider for the Discord app More...
 
+ + + + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
namespace  Tgstation.Server.Host.Components.Chat.Providers
 
+
+ + + + diff --git a/_discord_provider_8cs_source.html b/_discord_provider_8cs_source.html new file mode 100644 index 0000000000..afcffe85f8 --- /dev/null +++ b/_discord_provider_8cs_source.html @@ -0,0 +1,115 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Providers/DiscordProvider.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DiscordProvider.cs
+
+
+Go to the documentation of this file.
1 using Discord;
2 using Discord.WebSocket;
3 using Microsoft.Extensions.Logging;
4 using System;
5 using System.Collections.Generic;
6 using System.Linq;
7 using System.Threading;
8 using System.Threading.Tasks;
10 
12 {
16  sealed class DiscordProvider : Provider
17  {
19  public override bool Connected => client.ConnectionState == ConnectionState.Connected;
20 
22  public override string BotMention
23  {
24  get
25  {
26  if (!Connected)
27  throw new InvalidOperationException("Provider not connected");
28  return NormalizeMention(client.CurrentUser.Mention);
29  }
30  }
31 
35  readonly ILogger<DiscordProvider> logger;
36 
40  readonly DiscordSocketClient client;
41 
45  readonly string botToken;
46 
50  readonly List<ulong> mappedChannels;
51 
57  static string NormalizeMention(string fromDiscord) => fromDiscord.Replace("!", String.Empty, StringComparison.Ordinal);
58 
64  public DiscordProvider(ILogger<DiscordProvider> logger, string botToken)
65  {
66  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
67  this.botToken = botToken ?? throw new ArgumentNullException(nameof(botToken));
68  client = new DiscordSocketClient();
69  client.MessageReceived += Client_MessageReceived;
70  mappedChannels = new List<ulong>();
71  logger.LogTrace("Created.");
72  }
73 
75  public override void Dispose()
76  {
77  logger.LogTrace("Disposed.");
78  client.Dispose();
79  }
80 
86  async Task Client_MessageReceived(SocketMessage e)
87  {
88  if (e.Author.Id == client.CurrentUser.Id)
89  return;
90 
91  var pm = e.Channel is IPrivateChannel;
92 
93  if (!pm && !mappedChannels.Contains(e.Channel.Id))
94  {
95  var mentionedUs = e.MentionedUsers.Any(x => x.Id == client.CurrentUser.Id);
96  if (mentionedUs)
97  {
98  logger.LogTrace("Ignoring mention from {0} ({1}) by {2} ({3}). Channel not mapped!", e.Channel.Id, e.Channel.Name, e.Author.Id, e.Author.Username);
99  await SendMessage(e.Channel.Id, "I do not respond to this channel!", default).ConfigureAwait(false);
100  }
101 
102  return;
103  }
104 
105  var result = new Message
106  {
107  Content = e.Content,
108  User = new User
109  {
110  RealId = e.Author.Id,
111  Channel = new Channel
112  {
113  RealId = e.Channel.Id,
114  IsPrivateChannel = pm,
115  ConnectionName = pm ? e.Author.Username : (e.Channel as ITextChannel)?.Guild.Name ?? "UNKNOWN",
116  FriendlyName = e.Channel.Name
117 
118  // isAdmin and Tag populated by manager
119  },
120  FriendlyName = e.Author.Username,
121  Mention = NormalizeMention(e.Author.Mention)
122  }
123  };
124  EnqueueMessage(result);
125  }
126 
128  public override async Task<bool> Connect(CancellationToken cancellationToken)
129  {
130  logger.LogTrace("Connecting...");
131  if (Connected)
132  {
133  logger.LogTrace("Already connected not doing connection attempt!");
134  return true;
135  }
136 
137  try
138  {
139  await client.LoginAsync(TokenType.Bot, botToken, true).ConfigureAwait(false);
140 
141  logger.LogTrace("Logged in.");
142  cancellationToken.ThrowIfCancellationRequested();
143 
144  await client.StartAsync().ConfigureAwait(false);
145 
146  logger.LogTrace("Started.");
147 
148  var channelsAvailable = new TaskCompletionSource<object>();
149  client.Ready += () =>
150  {
151  channelsAvailable.TrySetResult(null);
152  return Task.CompletedTask;
153  };
154  using (cancellationToken.Register(() => channelsAvailable.SetCanceled()))
155  await channelsAvailable.Task.ConfigureAwait(false);
156  logger.LogDebug("Connection established!");
157  }
158  catch (OperationCanceledException)
159  {
160  throw;
161  }
162  catch (Exception e)
163  {
164  logger.LogWarning("Error connecting to Discord: {0}", e);
165  return false;
166  }
167 
168  return true;
169  }
170 
172  public override async Task Disconnect(CancellationToken cancellationToken)
173  {
174  logger.LogTrace("Disconnecting...");
175  if (!Connected)
176  {
177  logger.LogTrace("Already disconnected not doing disconnection attempt!");
178  return;
179  }
180 
181  try
182  {
183  await client.StopAsync().ConfigureAwait(false);
184  logger.LogTrace("Stopped.");
185  cancellationToken.ThrowIfCancellationRequested();
186  await client.LogoutAsync().ConfigureAwait(false);
187  logger.LogDebug("Disconnected!");
188  }
189  catch (OperationCanceledException)
190  {
191  throw;
192  }
193  catch (Exception e)
194  {
195  logger.LogWarning("Error disconnecting from discord: {0}", e);
196  }
197  }
198 
200  public override Task<IReadOnlyList<Channel>> MapChannels(IEnumerable<ChatChannel> channels, CancellationToken cancellationToken)
201  {
202  if (channels == null)
203  throw new ArgumentNullException(nameof(channels));
204 
205  if (!Connected)
206  throw new InvalidOperationException("Provider not connected!");
207 
208  Channel GetModelChannelFromDBChannel(ChatChannel channelFromDB)
209  {
210  if (!channelFromDB.DiscordChannelId.HasValue)
211  throw new InvalidOperationException("ChatChannel missing DiscordChannelId!");
212 
213  var channelId = channelFromDB.DiscordChannelId.Value;
214  var discordChannel = client.GetChannel(channelId);
215  if (discordChannel is ITextChannel textChannel)
216  {
217  var channelModel = new Channel
218  {
219  RealId = discordChannel.Id,
220  IsAdminChannel = channelFromDB.IsAdminChannel == true,
221  ConnectionName = textChannel.Guild.Name,
222  FriendlyName = textChannel.Name,
223  IsPrivateChannel = false,
224  Tag = channelFromDB.Tag
225  };
226  logger.LogTrace("Mapped channel {0}: {1}", channelModel.RealId, channelModel.FriendlyName);
227  return channelModel;
228  }
229 
230  logger.LogWarning("Cound not map channel {0}! Incorrect type: {1}", channelId, discordChannel.GetType());
231  return null;
232  }
233 
234  var enumerator = channels.Select(x => GetModelChannelFromDBChannel(x)).Where(x => x != null).ToList();
235 
236  lock (this)
237  {
238  mappedChannels.Clear();
239  mappedChannels.AddRange(enumerator.Select(x => x.RealId));
240  }
241 
242  return Task.FromResult<IReadOnlyList<Channel>>(enumerator);
243  }
244 
246  public override async Task SendMessage(ulong channelId, string message, CancellationToken cancellationToken)
247  {
248  try
249  {
250  var channel = client.GetChannel(channelId) as IMessageChannel;
251  await (channel?.SendMessageAsync(message, false, null, new RequestOptions
252  {
253  CancelToken = cancellationToken
254  }) ?? Task.CompletedTask).ConfigureAwait(false);
255  }
256  catch (OperationCanceledException)
257  {
258  throw;
259  }
260  catch (Exception e)
261  {
262  logger.LogWarning("Error sending discord message: {0}", e);
263  }
264  }
265  }
266 }
+
async Task Client_MessageReceived(SocketMessage e)
Handle a message recieved from Discord
+ + + + +
override async Task SendMessage(ulong channelId, string message, CancellationToken cancellationToken)
Send a message to the IProvider
+ +
override Task< IReadOnlyList< Channel > > MapChannels(IEnumerable< ChatChannel > channels, CancellationToken cancellationToken)
+
Represents a message recieved by a IProvider
Definition: Message.cs:6
+ +
override async Task Disconnect(CancellationToken cancellationToken)
Gracefully disconnects the provider. Implies a call to IDisposable.Dispose
+ + +
override async Task< bool > Connect(CancellationToken cancellationToken)
Attempt to connect the IProvider
+
readonly ILogger< DiscordProvider > logger
The ILogger for the DiscordProvider
+ +
readonly string botToken
The token used for connecting to discord
+
static string NormalizeMention(string fromDiscord)
Normalize a discord mention string
+
readonly DiscordSocketClient client
The DiscordSocketClient for the DiscordProvider
+
string Tag
A custom tag users can define to group channels together
Definition: ChatChannel.cs:41
+
bool? IsAdminChannel
If the ChatChannel is an admin channel
Definition: ChatChannel.cs:24
+
ulong? DiscordChannelId
The Discord channel ID
Definition: ChatChannel.cs:18
+
DiscordProvider(ILogger< DiscordProvider > logger, string botToken)
Construct a DiscordProvider
+
Represents a Providers.IProvider channel
Definition: Channel.cs:10
+
string Id
Backing field for RealId. Represented as a string to avoid BYOND percision loss
Definition: Channel.cs:15
+
readonly List< ulong > mappedChannels
List<T> of mapped ITextChannel IEntity<TId>.Ids
+
Represents a tgs_chat_user datum
Definition: User.cs:10
+ + +
string Id
Backing field for RealId. Represented as a string to avoid BYOND percision loss
Definition: User.cs:15
+
void EnqueueMessage(Message message)
Queues a message for NextMessage(CancellationToken)
Definition: Provider.cs:40
+ +
+ + + + diff --git a/_dmb_factory_8cs.html b/_dmb_factory_8cs.html new file mode 100644 index 0000000000..fa127f4c53 --- /dev/null +++ b/_dmb_factory_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Compiler/DmbFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DmbFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Compiler.DmbFactory
 Standard IDmbFactory More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Compiler
 
+
+ + + + diff --git a/_dmb_factory_8cs_source.html b/_dmb_factory_8cs_source.html new file mode 100644 index 0000000000..69442c79bf --- /dev/null +++ b/_dmb_factory_8cs_source.html @@ -0,0 +1,127 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Compiler/DmbFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
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;
9 using Tgstation.Server.Host.IO;
11 
13 {
18  {
20  public Task OnNewerDmb
21  {
22  get
23  {
24  lock (this)
25  return newerDmbTcs.Task;
26  }
27  }
28 
30  public bool DmbAvailable => nextDmbProvider != null;
31 
36 
41 
45  readonly ILogger<DmbFactory> logger;
46 
50  readonly Api.Models.Instance instance;
51 
55  readonly CancellationTokenSource cleanupCts;
56 
60  readonly IDictionary<long, int> jobLockCounts;
61 
66 
70  TaskCompletionSource<object> newerDmbTcs;
71 
76 
85  {
86  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
87  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
88  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
89  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
90 
91  cleanupTask = Task.CompletedTask;
92  newerDmbTcs = new TaskCompletionSource<object>();
93  cleanupCts = new CancellationTokenSource();
94  jobLockCounts = new Dictionary<long, int>();
95  }
96 
98  public void Dispose() => cleanupCts.Dispose(); // we don't dispose nextDmbProvider here, since it might be the only thing we have
99 
105  {
106  async Task HandleCleanup()
107  {
108  var deleteJob = ioManager.DeleteDirectory(job.DirectoryName.ToString(), cleanupCts.Token);
109  Task otherTask;
110 
111  // lock (this) //already locked below
112  otherTask = cleanupTask;
113  await Task.WhenAll(otherTask, deleteJob).ConfigureAwait(false);
114  }
115 
116  lock (this)
117  if (!jobLockCounts.TryGetValue(job.Id, out var currentVal) || currentVal == 1)
118  {
119  jobLockCounts.Remove(job.Id);
120  logger.LogDebug("Cleaning compile job {0} => {1}", job.Id, job.DirectoryName);
121  cleanupTask = HandleCleanup();
122  }
123  else
124  {
125  var decremented = --jobLockCounts[job.Id];
126  logger.LogTrace("Compile job {0} lock count now: {1}", job.Id, decremented);
127  }
128  }
129 
131  public async Task LoadCompileJob(CompileJob job, CancellationToken cancellationToken)
132  {
133  if (job == null)
134  throw new ArgumentNullException(nameof(job));
135 
136  var newProvider = await FromCompileJob(job, cancellationToken).ConfigureAwait(false);
137  if (newProvider == null)
138  return;
139  lock (this)
140  {
141  nextDmbProvider?.Dispose();
142  nextDmbProvider = newProvider;
143  newerDmbTcs.SetResult(nextDmbProvider);
144  newerDmbTcs = new TaskCompletionSource<object>();
145  }
146  }
147 
149  public IDmbProvider LockNextDmb(int lockCount)
150  {
151  if (!DmbAvailable)
152  throw new InvalidOperationException("No .dmb available!");
153  if (lockCount < 0)
154  throw new ArgumentOutOfRangeException(nameof(lockCount), lockCount, "lockCount must be greater than or equal to 0!");
155  lock (this)
156  {
157  var jobId = nextDmbProvider.CompileJob.Id;
158  var incremented = jobLockCounts[jobId] += lockCount;
159  logger.LogTrace("Compile job {0} lock count now: {1}", jobId, incremented);
160  return nextDmbProvider;
161  }
162  }
163 
165  public Task StartAsync(CancellationToken cancellationToken) => databaseContextFactory.UseContext(async (db) =>
166  {
167  // where complete clause not necessary, only successful COMPILEjobs get in the db
168  var cj = await db.CompileJobs.Where(x => x.Job.Instance.Id == instance.Id)
169  .OrderByDescending(x => x.Job.StoppedAt).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
170  if (cj == default(CompileJob))
171  return;
172  await LoadCompileJob(cj, cancellationToken).ConfigureAwait(false);
173 
174  // we dont do CleanUnusedCompileJobs here because the watchdog may have plans for them yet
175  });
176 
178  public async Task StopAsync(CancellationToken cancellationToken)
179  {
180  using (cancellationToken.Register(() => cleanupCts.Cancel()))
181  await cleanupTask.ConfigureAwait(false);
182  }
183 
185  #pragma warning disable CA1506 // TODO: Decomplexify
186  public async Task<IDmbProvider> FromCompileJob(CompileJob compileJob, CancellationToken cancellationToken)
187  {
188  if (compileJob == null)
189  throw new ArgumentNullException(nameof(compileJob));
190 
191  // ensure we have the entire compile job tree
192  await databaseContextFactory.UseContext(async db => compileJob = await db.CompileJobs.Where(x => x.Id == compileJob.Id)
193  .Include(x => x.Job).ThenInclude(x => x.StartedBy)
194  .Include(x => x.RevisionInformation).ThenInclude(x => x.PrimaryTestMerge).ThenInclude(x => x.MergedBy)
195  .Include(x => x.RevisionInformation).ThenInclude(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy)
196  .FirstAsync(cancellationToken).ConfigureAwait(false)).ConfigureAwait(false); // can't wait to see that query
197 
198  logger.LogTrace("Loading compile job {0}...", compileJob.Id);
199  var providerSubmitted = false;
200  var newProvider = new DmbProvider(compileJob, ioManager, () =>
201  {
202  if (providerSubmitted)
203  CleanJob(compileJob);
204  });
205 
206  try
207  {
208  var primaryCheckTask = ioManager.FileExists(ioManager.ConcatPath(newProvider.PrimaryDirectory, newProvider.DmbName), cancellationToken);
209  var secondaryCheckTask = ioManager.FileExists(ioManager.ConcatPath(newProvider.PrimaryDirectory, newProvider.DmbName), cancellationToken);
210 
211  if (!(await primaryCheckTask.ConfigureAwait(false) && await secondaryCheckTask.ConfigureAwait(false)))
212  {
213  logger.LogWarning("Error loading compile job, .dmb missing!");
214  return null; // omae wa mou shinderu
215  }
216 
217  lock (this)
218  {
219  if (!jobLockCounts.TryGetValue(compileJob.Id, out int value))
220  {
221  value = 1;
222  jobLockCounts.Add(compileJob.Id, 1);
223  }
224  else
225  jobLockCounts[compileJob.Id] = ++value;
226 
227  logger.LogTrace("Compile job {0} lock count now: {1}", compileJob.Id, value);
228 
229  providerSubmitted = true;
230  return newProvider;
231  }
232  }
233  finally
234  {
235  if (!providerSubmitted)
236  newProvider.Dispose();
237  }
238  }
239  #pragma warning restore CA1506
240 
242  #pragma warning disable CA1506 // TODO: Decomplexify
243  public async Task CleanUnusedCompileJobs(CompileJob exceptThisOne, CancellationToken cancellationToken)
244  {
245  List<long> jobIdsToSkip;
246 
247  // don't clean locked directories
248  lock (this)
249  jobIdsToSkip = jobLockCounts.Select(x => x.Key).ToList();
250 
251  List<string> jobUidsToNotErase = null;
252 
253  // find the uids of locked directories
254  await databaseContextFactory.UseContext(async db =>
255  {
256  jobUidsToNotErase = await db.CompileJobs.Where(x => x.Job.Instance.Id == instance.Id && jobIdsToSkip.Contains(x.Id)).Select(x => x.DirectoryName.Value.ToString().ToUpperInvariant()).ToListAsync(cancellationToken).ConfigureAwait(false);
257  }).ConfigureAwait(false);
258 
259  // add the other exemption
260  if (exceptThisOne != null)
261  jobUidsToNotErase.Add(exceptThisOne.DirectoryName.Value.ToString().ToUpperInvariant());
262 
263  // cleanup
264  await ioManager.CreateDirectory(".", cancellationToken).ConfigureAwait(false);
265  var directories = await ioManager.GetDirectories(".", cancellationToken).ConfigureAwait(false);
266  int deleting = 0;
267  var tasks = directories.Select(async x =>
268  {
269  var nameOnly = ioManager.GetFileName(x);
270  if (jobUidsToNotErase.Contains(nameOnly.ToUpperInvariant()))
271  return;
272  try
273  {
274  ++deleting;
275  await ioManager.DeleteDirectory(x, cancellationToken).ConfigureAwait(false);
276  }
277  catch (OperationCanceledException)
278  {
279  throw;
280  }
281  catch (Exception e)
282  {
283  logger.LogWarning("Error deleting directory {0}! Exception: {1}", x, e);
284  }
285  }).ToList();
286  if (deleting > 0)
287  {
288  logger.LogDebug("Cleaning {0} unused game folders...", deleting);
289  await Task.WhenAll().ConfigureAwait(false);
290  }
291  }
292  #pragma warning restore CA1506
293  }
294 }
+
IDmbProvider nextDmbProvider
The latest DmbProvider
Definition: DmbFactory.cs:75
+
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
Task cleanupTask
Task representing calls to CleanJob(CompileJob)
Definition: DmbFactory.cs:65
+
CompileJob CompileJob
The CompileJob of the .dmb
Definition: IDmbProvider.cs:29
+ + +
Task StartAsync(CancellationToken cancellationToken)
+ + + +
Task< IReadOnlyList< string > > GetDirectories(string path, CancellationToken cancellationToken)
Returns directory names in a given path
+
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
+
async Task StopAsync(CancellationToken cancellationToken)
Definition: DmbFactory.cs:178
+
readonly IIOManager ioManager
The IIOManager for the DmbFactory
Definition: DmbFactory.cs:40
+
Guid? DirectoryName
The Game folder the results were compiled into
Definition: CompileJob.cs:32
+
Task CreateDirectory(string path, CancellationToken cancellationToken)
Create a directory at path
+ + + +
async Task< IDmbProvider > FromCompileJob(CompileJob compileJob, CancellationToken cancellationToken)
Gets a IDmbProvider for a given CompileJob
Definition: DmbFactory.cs:186
+
string GetFileName(string path)
Gets the file name portion of a path
+
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists
+
DmbFactory(IDatabaseContextFactory databaseContextFactory, IIOManager ioManager, ILogger< DmbFactory > logger, Api.Models.Instance instance)
Construct a DmbFactory
Definition: DmbFactory.cs:84
+
async Task CleanUnusedCompileJobs(CompileJob exceptThisOne, CancellationToken cancellationToken)
Deletes all compile jobs that are inactive in the Game folder exceptThisOne
Definition: DmbFactory.cs:243
+ +
readonly CancellationTokenSource cleanupCts
The CancellationTokenSource for cleanupTask
Definition: DmbFactory.cs:55
+
readonly ILogger< DmbFactory > logger
The ILogger for the DmbFactory
Definition: DmbFactory.cs:45
+
readonly IDictionary< long, int > jobLockCounts
Map of CompileJob.JobIds to locks on them.
Definition: DmbFactory.cs:60
+
readonly Api.Models.Instance instance
The Api.Models.Instance for the DmbFactory
Definition: DmbFactory.cs:50
+
void CleanJob(CompileJob job)
Delete the Api.Models.Internal.CompileJob.DirectoryName of job
Definition: DmbFactory.cs:104
+
IDmbProvider LockNextDmb(int lockCount)
Gets the next IDmbProvider
Definition: DmbFactory.cs:149
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the DmbFactory
Definition: DmbFactory.cs:35
+ +
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+
TaskCompletionSource< object > newerDmbTcs
TaskCompletionSource<TResult> resulting in the latest DmbProvider yet to exist
Definition: DmbFactory.cs:70
+
async Task LoadCompileJob(CompileJob job, CancellationToken cancellationToken)
Load a new job into the ICompileJobConsumer
Definition: DmbFactory.cs:131
+
Provides absolute paths to the latest compiled .dmbs
Definition: IDmbProvider.cs:9
+
Interface for using filesystems
Definition: IIOManager.cs:11
+ + +
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+ + + +
+ + + + diff --git a/_dmb_provider_8cs.html b/_dmb_provider_8cs.html new file mode 100644 index 0000000000..fc314c0a1c --- /dev/null +++ b/_dmb_provider_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Compiler/DmbProvider.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DmbProvider.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Components.Compiler.DmbProvider
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Compiler
 
+
+ + + + diff --git a/_dmb_provider_8cs_source.html b/_dmb_provider_8cs_source.html new file mode 100644 index 0000000000..85afc93c16 --- /dev/null +++ b/_dmb_provider_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Compiler/DmbProvider.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DmbProvider.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using Tgstation.Server.Host.IO;
4 
6 {
8  sealed class DmbProvider : IDmbProvider
9  {
11  public string DmbName => String.Concat(CompileJob.DmeName, DreamMaker.DmbExtension);
12 
15 
18 
22  public CompileJob CompileJob { get; }
23 
28 
32  Action onDispose;
33 
40  public DmbProvider(CompileJob compileJob, IIOManager ioManager, Action onDispose)
41  {
42  CompileJob = compileJob ?? throw new ArgumentNullException(nameof(compileJob));
43  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
44  this.onDispose = onDispose ?? throw new ArgumentNullException(nameof(onDispose));
45  }
46 
48  public void Dispose() => onDispose?.Invoke();
49 
51  public void KeepAlive() => onDispose = null;
52  }
53 }
+ +
string DmeName
The .dme file used for compilation
Definition: CompileJob.cs:20
+ + + +
const string BDirectoryName
Name of the secondary directory used for compilation
Definition: DreamMaker.cs:31
+ +
Guid? DirectoryName
The Game folder the results were compiled into
Definition: CompileJob.cs:32
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
const string ADirectoryName
Name of the primary directory used for compilation
Definition: DreamMaker.cs:26
+ +
DmbProvider(CompileJob compileJob, IIOManager ioManager, Action onDispose)
Construct a DmbProvider
Definition: DmbProvider.cs:40
+
Action onDispose
The Action to run when Dispose is called
Definition: DmbProvider.cs:32
+
const string DmbExtension
Extension for .dmbs
Definition: DreamMaker.cs:36
+
readonly IIOManager ioManager
The IIOManager for the DmbProvider
Definition: DmbProvider.cs:27
+ + +
void KeepAlive()
Disposing the IDmbProvider won't cause a cleanup of the working directory
+
Provides absolute paths to the latest compiled .dmbs
Definition: IDmbProvider.cs:9
+
Interface for using filesystems
Definition: IIOManager.cs:11
+ +
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+ + + +
+ + + + diff --git a/_dream_daemon_8cs.html b/_dream_daemon_8cs.html new file mode 100644 index 0000000000..6187bb8d96 --- /dev/null +++ b/_dream_daemon_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/DreamDaemon.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamDaemon.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.DreamDaemon
 Represents an instance of BYOND's DreamDaemon game server. Create action starts the server. Delete action shuts down the server More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + diff --git a/_dream_daemon_8cs_source.html b/_dream_daemon_8cs_source.html new file mode 100644 index 0000000000..62ebc13107 --- /dev/null +++ b/_dream_daemon_8cs_source.html @@ -0,0 +1,97 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/DreamDaemon.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DreamDaemon.cs
+
+
+Go to the documentation of this file.
2 
4 {
8  public sealed class DreamDaemon : DreamDaemonSettings
9  {
13  public CompileJob ActiveCompileJob { get; set; }
14 
18  public CompileJob StagedCompileJob { get; set; }
19 
23  public bool? Running { get; set; }
24 
28  public DreamDaemonSecurity? CurrentSecurity { get; set; }
29 
33  public ushort? CurrentPort { get; set; }
34 
38  public bool? CurrentAllowWebclient { get; set; }
39  }
40 }
+ + + +
DreamDaemonSecurity? CurrentSecurity
The current DreamDaemonSecurity of DreamDaemon. May be downgraded due to requirements of ActiveCompil...
Definition: DreamDaemon.cs:28
+ +
CompileJob StagedCompileJob
The next revision to go live
Definition: DreamDaemon.cs:18
+
CompileJob ActiveCompileJob
The live revision
Definition: DreamDaemon.cs:13
+
ushort? CurrentPort
The port the running DreamDaemon instance is set to
Definition: DreamDaemon.cs:33
+ +
DreamDaemonSecurity
DreamDaemon's security level
+
bool? Running
The current status of DreamDaemon
Definition: DreamDaemon.cs:23
+
Represents an instance of BYOND's DreamDaemon game server. Create action starts the server....
Definition: DreamDaemon.cs:8
+
bool? CurrentAllowWebclient
The webclient status the running DreamDaemon instance is set to
Definition: DreamDaemon.cs:38
+ +
+ + + + diff --git a/_dream_daemon_client_8cs.html b/_dream_daemon_client_8cs.html new file mode 100644 index 0000000000..4f5f91d2fb --- /dev/null +++ b/_dream_daemon_client_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/DreamDaemonClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamDaemonClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Client.Components.DreamDaemonClient
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
namespace  Tgstation.Server.Client.Components
 
+
+ + + + diff --git a/_dream_daemon_client_8cs_source.html b/_dream_daemon_client_8cs_source.html new file mode 100644 index 0000000000..a8e17a18c6 --- /dev/null +++ b/_dream_daemon_client_8cs_source.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/DreamDaemonClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DreamDaemonClient.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4 using Tgstation.Server.Api;
6 
8 {
11  {
16 
20  readonly Instance instance;
21 
28  {
29  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
30  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
31  }
32 
34  public Task Shutdown(CancellationToken cancellationToken) => apiClient.Delete(Routes.DreamDaemon, instance.Id, cancellationToken);
35 
37  public Task<Job> Start(CancellationToken cancellationToken) => apiClient.Create<Job>(Routes.DreamDaemon, instance.Id, cancellationToken);
38 
40  public Task<Job> Restart(CancellationToken cancellationToken) => apiClient.Patch<Job>(Routes.DreamDaemon, instance.Id, cancellationToken);
41 
43  public Task<DreamDaemon> Read(CancellationToken cancellationToken) => apiClient.Read<DreamDaemon>(Routes.DreamDaemon, instance.Id, cancellationToken);
44 
46  public Task<DreamDaemon> Update(DreamDaemon dreamDaemon, CancellationToken cancellationToken) => apiClient.Update<DreamDaemon, DreamDaemon>(Routes.DreamDaemon, dreamDaemon ?? throw new ArgumentNullException(nameof(dreamDaemon)), instance.Id, cancellationToken);
47  }
48 }
Task< Job > Start(CancellationToken cancellationToken)
Start DreamDaemon
+
DreamDaemonClient(IApiClient apiClient, Instance instance)
Construct a DreamDaemonClient
+ +
Task Shutdown(CancellationToken cancellationToken)
Shutdown DreamDaemon
+
Task< DreamDaemon > Update(DreamDaemon dreamDaemon, CancellationToken cancellationToken)
Update DreamDaemon. This may trigger Api.Models.Internal.DreamDaemonSettings.SoftRestart
+ +
Routes to a server actions
Definition: Routes.cs:9
+ +
Task< Job > Restart(CancellationToken cancellationToken)
Restart DreamDaemon
+
Task< DreamDaemon > Read(CancellationToken cancellationToken)
Get the DreamDaemon represented by the IDreamDaemonClient
+ +
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
const string DreamDaemon
The Models.DreamDaemon controller
Definition: Routes.cs:44
+
readonly Instance instance
The Instance for the DreamDaemonClient
+ +
Metadata about a server instance
Definition: Instance.cs:9
+
Task Delete(string route, CancellationToken cancellationToken)
Run an HTTP DELETE request
+ +
Web interface for the API
Definition: IApiClient.cs:11
+
Represents an instance of BYOND's DreamDaemon game server. Create action starts the server....
Definition: DreamDaemon.cs:8
+
readonly IApiClient apiClient
The IApiClient for the DreamDaemonClient
+
Task< DreamDaemon > DreamDaemon(Routes.DreamDaemon, dreamDaemon ?? throw new ArgumentNullException(nameof(dreamDaemon)), instance.Id, cancellationToken)
+ +
Represents a long running job on the server. Model is read-only, updates attempt to cancel the job
Definition: Job.cs:6
+
+ + + + diff --git a/_dream_daemon_controller_8cs.html b/_dream_daemon_controller_8cs.html new file mode 100644 index 0000000000..0397fd92f2 --- /dev/null +++ b/_dream_daemon_controller_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/DreamDaemonController.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamDaemonController.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Controllers.DreamDaemonController
 ModelController<TModel> for managing the DreamDaemon More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Controllers
 
+
+ + + + diff --git a/_dream_daemon_controller_8cs_source.html b/_dream_daemon_controller_8cs_source.html new file mode 100644 index 0000000000..c3929460fd --- /dev/null +++ b/_dream_daemon_controller_8cs_source.html @@ -0,0 +1,136 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/DreamDaemonController.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DreamDaemonController.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Mvc;
2 using Microsoft.EntityFrameworkCore;
3 using Microsoft.Extensions.Logging;
4 using System;
5 using System.Linq;
6 using System.Linq.Expressions;
7 using System.Net;
8 using System.Reflection;
9 using System.Threading;
10 using System.Threading.Tasks;
11 using Tgstation.Server.Api;
19 
21 {
25  [Route(Routes.DreamDaemon)]
26  public sealed class DreamDaemonController : ModelController<DreamDaemon>
27  {
32 
37 
46  public DreamDaemonController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger<DreamDaemonController> logger) : base(databaseContext, authenticationContextFactory, logger, true)
47  {
48  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
49  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
50  }
51 
53  [TgsAuthorize(DreamDaemonRights.Start)]
54  public override async Task<IActionResult> Create([FromBody] DreamDaemon model, CancellationToken cancellationToken)
55  {
56  // alias for launching DD
57  var instance = instanceManager.GetInstance(Instance);
58 
59  if (instance.Watchdog.Running)
60  return StatusCode((int)HttpStatusCode.Gone);
61 
62  var job = new Models.Job
63  {
64  Description = "Launch DreamDaemon",
65  CancelRight = (ulong)DreamDaemonRights.Shutdown,
66  CancelRightsType = RightsType.DreamDaemon,
68  StartedBy = AuthenticationContext.User
69  };
70  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressHandler, innerCt) => instance.Watchdog.Launch(innerCt), cancellationToken).ConfigureAwait(false);
71  return Accepted(job.ToApi());
72  }
73 
75  [TgsAuthorize(DreamDaemonRights.ReadMetadata | DreamDaemonRights.ReadRevision)]
76  public override Task<IActionResult> Read(CancellationToken cancellationToken) => ReadImpl(null, cancellationToken);
77 
84  async Task<IActionResult> ReadImpl(DreamDaemonSettings settings, CancellationToken cancellationToken)
85  {
86  var instance = instanceManager.GetInstance(Instance);
87  var dd = instance.Watchdog;
88 
89  var metadata = (AuthenticationContext.GetRight(RightsType.DreamDaemon) & (ulong)DreamDaemonRights.ReadMetadata) != 0;
90  var revision = (AuthenticationContext.GetRight(RightsType.DreamDaemon) & (ulong)DreamDaemonRights.ReadRevision) != 0;
91 
92  if (settings == null)
93  {
94  settings = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).Select(x => x.DreamDaemonSettings).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
95  if (settings == default)
96  return StatusCode((int)HttpStatusCode.Gone);
97  }
98 
99  var result = new DreamDaemon();
100  if (metadata)
101  {
102  var alphaActive = dd.AlphaIsActive;
103  var llp = dd.LastLaunchParameters;
104  var rstate = dd.RebootState;
105  result.AutoStart = settings.AutoStart;
106  result.CurrentPort = alphaActive ? llp?.PrimaryPort : llp?.SecondaryPort;
107  result.CurrentSecurity = llp?.SecurityLevel;
108  result.CurrentAllowWebclient = llp?.AllowWebClient;
109  result.PrimaryPort = settings.PrimaryPort;
110  result.AllowWebClient = settings.AllowWebClient;
111  result.Running = dd.Running;
112  result.SecondaryPort = settings.SecondaryPort;
113  result.SecurityLevel = settings.SecurityLevel;
114  result.SoftRestart = rstate == RebootState.Restart;
115  result.SoftShutdown = rstate == RebootState.Shutdown;
116  result.StartupTimeout = settings.StartupTimeout;
117  }
118 
119  if (revision)
120  {
121  var latestCompileJob = instance.LatestCompileJob();
122  result.ActiveCompileJob = (dd.ActiveCompileJob ?? latestCompileJob)?.ToApi();
123  if (latestCompileJob?.Id != result.ActiveCompileJob?.Id)
124  result.StagedCompileJob = latestCompileJob?.ToApi();
125  }
126 
127  return Json(result);
128  }
129 
135  [HttpDelete]
136  [TgsAuthorize(DreamDaemonRights.Shutdown)]
137  public async Task<IActionResult> Delete(CancellationToken cancellationToken)
138  {
139  var instance = instanceManager.GetInstance(Instance);
140  await instance.Watchdog.Terminate(false, cancellationToken).ConfigureAwait(false);
141  return Ok();
142  }
143 
145  #pragma warning disable CA1506 // TODO: Decomplexify
146  [TgsAuthorize(DreamDaemonRights.SetAutoStart | DreamDaemonRights.SetPorts | DreamDaemonRights.SetSecurity | DreamDaemonRights.SetWebClient | DreamDaemonRights.SoftRestart | DreamDaemonRights.SoftShutdown | DreamDaemonRights.Start | DreamDaemonRights.SetStartupTimeout)]
147  public override async Task<IActionResult> Update([FromBody] DreamDaemon model, CancellationToken cancellationToken)
148  {
149  if (model == null)
150  throw new ArgumentNullException(nameof(model));
151 
152  if (model.PrimaryPort == 0)
153  return BadRequest(new ErrorMessage { Message = "Primary port cannot be 0!" });
154 
155  if (model.SecurityLevel == DreamDaemonSecurity.Ultrasafe)
156  return BadRequest(new ErrorMessage { Message = "This version of TGS does not support the ultrasafe DreamDaemon configuration!" });
157 
158  // alias for changing DD settings
159  var current = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).Select(x => x.DreamDaemonSettings).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
160 
161  if (current == default)
162  return StatusCode((int)HttpStatusCode.Gone);
163 
164  var userRights = (DreamDaemonRights)AuthenticationContext.GetRight(RightsType.DreamDaemon);
165 
166  bool CheckModified<T>(Expression<Func<Api.Models.Internal.DreamDaemonSettings, T>> expression, DreamDaemonRights requiredRight)
167  {
168  var memberSelectorExpression = (MemberExpression)expression.Body;
169  var property = (PropertyInfo)memberSelectorExpression.Member;
170 
171  var newVal = property.GetValue(model);
172  if (newVal == null)
173  return false;
174  if (!userRights.HasFlag(requiredRight) && property.GetValue(current) != newVal)
175  return true;
176 
177  property.SetValue(current, newVal);
178  return false;
179  }
180 
181  var oldSoftRestart = current.SoftRestart;
182  var oldSoftShutdown = current.SoftShutdown;
183 
184  if (CheckModified(x => x.AllowWebClient, DreamDaemonRights.SetWebClient)
185  || CheckModified(x => x.AutoStart, DreamDaemonRights.SetAutoStart)
186  || CheckModified(x => x.PrimaryPort, DreamDaemonRights.SetPorts)
187  || CheckModified(x => x.SecondaryPort, DreamDaemonRights.SetPorts)
188  || CheckModified(x => x.SecurityLevel, DreamDaemonRights.SetSecurity)
189  || CheckModified(x => x.SoftRestart, DreamDaemonRights.SoftRestart)
190  || CheckModified(x => x.SoftShutdown, DreamDaemonRights.SoftShutdown)
191  || CheckModified(x => x.StartupTimeout, DreamDaemonRights.SetStartupTimeout))
192  return Forbid();
193 
194  if (current.PrimaryPort == current.SecondaryPort)
195  return BadRequest(new ErrorMessage { Message = "Primary port and secondary port cannot be the same!" });
196 
198 
199  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
200 
201  // run this second because current may be modified by it
202  await wd.ChangeSettings(current, cancellationToken).ConfigureAwait(false);
203 
204  if (!oldSoftRestart.Value && current.SoftRestart.Value)
205  await wd.Restart(true, cancellationToken).ConfigureAwait(false);
206  else if (!oldSoftShutdown.Value && current.SoftShutdown.Value)
207  await wd.Terminate(true, cancellationToken).ConfigureAwait(false);
208  else if ((oldSoftRestart.Value && !current.SoftRestart.Value) || (oldSoftShutdown.Value && !current.SoftShutdown.Value))
209  await wd.ResetRebootState(cancellationToken).ConfigureAwait(false);
210 
211  return await ReadImpl(current, cancellationToken).ConfigureAwait(false);
212  }
213  #pragma warning restore CA1506
214 
220  [HttpPatch]
221  [TgsAuthorize(DreamDaemonRights.Restart)]
222  public async Task<IActionResult> Restart(CancellationToken cancellationToken)
223  {
224  var job = new Models.Job
225  {
226  Instance = Instance,
227  CancelRightsType = RightsType.DreamDaemon,
228  CancelRight = (ulong)DreamDaemonRights.Shutdown,
229  StartedBy = AuthenticationContext.User,
230  Description = "Restart Watchdog"
231  };
232 
234 
235  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressReporter, ct) => watchdog.Restart(false, ct), cancellationToken).ConfigureAwait(false);
236  return Accepted(job.ToApi());
237  }
238  }
239 }
async Task< IActionResult > Delete(CancellationToken cancellationToken)
Stops DreamDaemon if it's running
+ +
Manages the runtime of Jobs
Definition: IJobManager.cs:12
+ + + +
ushort? PrimaryPort
The first port DreamDaemon uses. This should be the publically advertised port
+ +
override Task< IActionResult > Read(CancellationToken cancellationToken)
Attempt to read a TModel
+ +
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+ +
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+ + +
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+
bool? AutoStart
If DreamDaemon starts when it's Instance starts
+ + +
Task RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
Registers a given Job and begins running it
+ + +
async Task< IActionResult > ReadImpl(DreamDaemonSettings settings, CancellationToken cancellationToken)
Implementation of Read(CancellationToken)
+
async Task< IActionResult > Restart(CancellationToken cancellationToken)
Handle a HTTP PATCH to the DreamDaemonController
+
Routes to a server actions
Definition: Routes.cs:9
+
DreamDaemonRights
Rights for Models.DreamDaemon
+
override async Task< IActionResult > Update([FromBody] DreamDaemon model, CancellationToken cancellationToken)
+ +
DreamDaemonController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger< DreamDaemonController > logger)
Construct a DreamDaemonController
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
ModelController<TModel> for managing the DreamDaemon
+
const string DreamDaemon
The Models.DreamDaemon controller
Definition: Routes.cs:44
+
readonly IInstanceManager instanceManager
The IInstanceManager for the DreamMakerController
+
An ApiController representing a TModel
+ + +
readonly IJobManager jobManager
The IJobManager for the DreamMakerController
+ +
IWatchdog Watchdog
The IWatchdog for the IInstance
Definition: IInstance.cs:32
+
Metadata about a server instance
Definition: Instance.cs:9
+
override async Task< IActionResult > Create([FromBody] DreamDaemon model, CancellationToken cancellationToken)
+ + +
DreamDaemonSecurity
DreamDaemon's security level
+
Represents an instance of BYOND's DreamDaemon game server. Create action starts the server....
Definition: DreamDaemon.cs:8
+
bool? AllowWebClient
If the BYOND web client can be used to connect to the game server
+
Task Terminate(bool graceful, CancellationToken cancellationToken)
Stops the watchdog
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ + +
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
+ +
DreamDaemonSecurity? SecurityLevel
The DreamDaemonSecurity level of DreamDaemon
+
+ + + + diff --git a/_dream_daemon_launch_parameters_8cs.html b/_dream_daemon_launch_parameters_8cs.html new file mode 100644 index 0000000000..1947711fcc --- /dev/null +++ b/_dream_daemon_launch_parameters_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/DreamDaemonLaunchParameters.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamDaemonLaunchParameters.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters
 Launch settings for DreamDaemon More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
namespace  Tgstation.Server.Api.Models.Internal
 
+
+ + + + diff --git a/_dream_daemon_launch_parameters_8cs_source.html b/_dream_daemon_launch_parameters_8cs_source.html new file mode 100644 index 0000000000..df9e324ccd --- /dev/null +++ b/_dream_daemon_launch_parameters_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/DreamDaemonLaunchParameters.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DreamDaemonLaunchParameters.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.ComponentModel.DataAnnotations;
3 
5 {
10  {
14  [Required]
15  public bool? AllowWebClient { get; set; }
16 
20  [Required]
21  public DreamDaemonSecurity? SecurityLevel { get; set; }
22 
26  [Required]
27  public ushort? PrimaryPort { get; set; }
28 
32  [Required]
33  public ushort? SecondaryPort { get; set; }
34 
38  [Required]
39  public uint? StartupTimeout { get; set; }
40 
46  public bool Match(DreamDaemonLaunchParameters otherParameters) =>
47  AllowWebClient == (otherParameters?.AllowWebClient ?? throw new ArgumentNullException(nameof(otherParameters)))
48  && SecurityLevel == otherParameters.SecurityLevel
49  && PrimaryPort == otherParameters.PrimaryPort
50  && SecondaryPort == otherParameters.SecondaryPort
51  && StartupTimeout == otherParameters.StartupTimeout;
52  }
53 }
ushort? PrimaryPort
The first port DreamDaemon uses. This should be the publically advertised port
+ + + + +
DreamDaemonSecurity
DreamDaemon's security level
+
bool? AllowWebClient
If the BYOND web client can be used to connect to the game server
+
bool Match(DreamDaemonLaunchParameters otherParameters)
Check if we match a given set of otherParameters
+
DreamDaemonSecurity? SecurityLevel
The DreamDaemonSecurity level of DreamDaemon
+
+ + + + diff --git a/_dream_daemon_rights_8cs.html b/_dream_daemon_rights_8cs.html new file mode 100644 index 0000000000..dc90684a60 --- /dev/null +++ b/_dream_daemon_rights_8cs.html @@ -0,0 +1,123 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/DreamDaemonRights.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamDaemonRights.cs File Reference
+
+ + + + + diff --git a/_dream_daemon_rights_8cs_source.html b/_dream_daemon_rights_8cs_source.html new file mode 100644 index 0000000000..0c4b665abc --- /dev/null +++ b/_dream_daemon_rights_8cs_source.html @@ -0,0 +1,97 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/DreamDaemonRights.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DreamDaemonRights.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
8  [Flags]
9  public enum DreamDaemonRights : ulong
10  {
14  None = 0,
15 
19  ReadRevision = 1,
20 
24  SetPorts = 2,
25 
29  SetAutoStart = 4,
30 
34  SetSecurity = 8,
35 
39  ReadMetadata = 16,
40 
44  SetWebClient = 32,
45 
49  SoftRestart = 64,
50 
54  SoftShutdown = 128,
55 
59  Restart = 256,
60 
64  Shutdown = 512,
65 
69  Start = 1024,
70 
74  SetStartupTimeout = 2048
75  }
76 }
User can enable Models.Internal.DreamDaemonSettings.SoftRestart
+
User can change Models.Internal.DreamDaemonLaunchParameters.AllowWebClient
+
User can change both primary and secondary ports
+ +
User can change Models.Internal.DreamDaemonLaunchParameters.StartupTimeout
+
DreamDaemonRights
Rights for Models.DreamDaemon
+
User can read all ports, Models.Internal.DreamDaemonSettings.SoftRestart, Models.Internal....
+ +
User can immediately restart Models.DreamDaemon
+
User can read Models.DreamDaemon.ActiveCompileJob and Models.DreamDaemon.StagedCompileJob
+
User can start Models.DreamDaemon and disable Models.Internal.DreamDaemonSettings....
+
User set Models.Internal.DreamDaemonLaunchParameters.SecurityLevel
+
User can enable Models.Internal.DreamDaemonSettings.SoftShutdown
+
User can change Models.Internal.DreamDaemonSettings.AutoStart
+
User can immediately shutdown Models.DreamDaemon
+
+ + + + diff --git a/_dream_daemon_security_8cs.html b/_dream_daemon_security_8cs.html new file mode 100644 index 0000000000..67af585b0e --- /dev/null +++ b/_dream_daemon_security_8cs.html @@ -0,0 +1,108 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/DreamDaemonSecurity.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamDaemonSecurity.cs File Reference
+
+ + + + + diff --git a/_dream_daemon_security_8cs_source.html b/_dream_daemon_security_8cs_source.html new file mode 100644 index 0000000000..7b4f74ca85 --- /dev/null +++ b/_dream_daemon_security_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/DreamDaemonSecurity.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DreamDaemonSecurity.cs
+
+
+Go to the documentation of this file.
2 {
6  public enum DreamDaemonSecurity
7  {
11  Trusted,
12 
16  Safe,
17 
21  Ultrasafe
22  }
23 }
+
Server will not be able to run shell commands or access files outside it's working directory
+
Server will not be able to run shell commands or access anything but temporary files....
+
Server is unrestricted in terms of file access and shell commands
+
DreamDaemonSecurity
DreamDaemon's security level
+
+ + + + diff --git a/_dream_daemon_status_8cs.html b/_dream_daemon_status_8cs.html new file mode 100644 index 0000000000..0201674866 --- /dev/null +++ b/_dream_daemon_status_8cs.html @@ -0,0 +1,108 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/DreamDaemonStatus.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamDaemonStatus.cs File Reference
+
+ + + + + diff --git a/_dream_daemon_status_8cs_source.html b/_dream_daemon_status_8cs_source.html new file mode 100644 index 0000000000..665f08711b --- /dev/null +++ b/_dream_daemon_status_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/DreamDaemonStatus.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DreamDaemonStatus.cs
+
+
+Go to the documentation of this file.
2 {
6 #pragma warning disable CA1717 // Only FlagsAttribute enums should have plural names
7  public enum DreamDaemonStatus
8 #pragma warning restore CA1717 // Only FlagsAttribute enums should have plural names
9  {
13  Offline,
14 
19 
23  Online,
24  }
25 }
DreamDaemonStatus
The status of DreamDaemon
+ + + + +
+ + + + diff --git a/_dream_maker_client_8cs.html b/_dream_maker_client_8cs.html new file mode 100644 index 0000000000..a45374f918 --- /dev/null +++ b/_dream_maker_client_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/DreamMakerClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamMakerClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Client.Components.DreamMakerClient
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
namespace  Tgstation.Server.Client.Components
 
+
+ + + + diff --git a/_dream_maker_client_8cs_source.html b/_dream_maker_client_8cs_source.html new file mode 100644 index 0000000000..4245fca33d --- /dev/null +++ b/_dream_maker_client_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/DreamMakerClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DreamMakerClient.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Threading;
4 using System.Threading.Tasks;
5 using Tgstation.Server.Api;
7 
9 {
12  {
17 
21  readonly Instance instance;
22 
29  {
30  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
31  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
32  }
33 
35  public Task<Job> Compile(CancellationToken cancellationToken) => apiClient.Create<Job>(Routes.DreamMaker, instance.Id, cancellationToken);
36 
38  public Task<CompileJob> GetCompileJob(CompileJob compileJob, CancellationToken cancellationToken) => apiClient.Read<CompileJob>(Routes.SetID(Routes.DreamMaker, compileJob?.Id ?? throw new ArgumentNullException(nameof(compileJob))), instance.Id, cancellationToken);
39 
41  public Task<IReadOnlyList<CompileJob>> GetJobIds(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<CompileJob>>(Routes.List(Routes.DreamMaker), instance.Id, cancellationToken);
42 
44  public Task<DreamMaker> Read(CancellationToken cancellationToken) => apiClient.Read<DreamMaker>(Routes.DreamMaker, instance.Id, cancellationToken);
45 
47  public Task<DreamMaker> Update(DreamMaker dreamMaker, CancellationToken cancellationToken) => apiClient.Update<DreamMaker, DreamMaker>(Routes.DreamMaker, dreamMaker ?? throw new ArgumentNullException(nameof(dreamMaker)), instance.Id, cancellationToken);
48  }
49 }
Represents the state of the DreamMaker compiler. Create action starts a new compile....
Definition: DreamMaker.cs:8
+ +
Task< DreamMaker > Read(CancellationToken cancellationToken)
Get the DreamMaker information
+ + +
Task< Job > Compile(CancellationToken cancellationToken)
Compile the current repository revision
+
DreamMakerClient(IApiClient apiClient, Instance instance)
Construct a DreamMakerClient
+ +
readonly IApiClient apiClient
The IApiClient for the DreamMakerClient
+
Routes to a server actions
Definition: Routes.cs:9
+ +
Task< DreamMaker > DreamMaker(Routes.DreamMaker, dreamMaker ?? throw new ArgumentNullException(nameof(dreamMaker)), instance.Id, cancellationToken)
+
Task< IReadOnlyList< CompileJob > > GetJobIds(CancellationToken cancellationToken)
Gets the Api.Models.Internal.CompileJob.Ids of all CompileJobs for the instance
+
readonly Instance instance
The Instance for the DreamMakerClient
+
const string DreamMaker
The Models.DreamMaker controller
Definition: Routes.cs:74
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Task< CompileJob > GetCompileJob(CompileJob compileJob, CancellationToken cancellationToken)
Get a compileJob
+
Metadata about a server instance
Definition: Instance.cs:9
+
static string SetID(string route, long id)
Apply an id postfix to a route
+
static string List(string route)
Get the /List postfix for a route
+ +
Web interface for the API
Definition: IApiClient.cs:11
+
Task< DreamMaker > Update(DreamMaker dreamMaker, CancellationToken cancellationToken)
Updates the DreamMaker setttings
+ + +
Represents a long running job on the server. Model is read-only, updates attempt to cancel the job
Definition: Job.cs:6
+
+ + + + diff --git a/_dream_maker_controller_8cs.html b/_dream_maker_controller_8cs.html new file mode 100644 index 0000000000..5522e218ea --- /dev/null +++ b/_dream_maker_controller_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/DreamMakerController.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamMakerController.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Controllers.DreamMakerController
 Controller for managing the compiler More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Controllers
 
+
+ + + + diff --git a/_dream_maker_controller_8cs_source.html b/_dream_maker_controller_8cs_source.html new file mode 100644 index 0000000000..ae0fd08838 --- /dev/null +++ b/_dream_maker_controller_8cs_source.html @@ -0,0 +1,128 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/DreamMakerController.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DreamMakerController.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Mvc;
2 using Microsoft.EntityFrameworkCore;
3 using Microsoft.Extensions.Logging;
4 using System;
5 using System.Linq;
6 using System.Net;
7 using System.Threading;
8 using System.Threading.Tasks;
9 using Tgstation.Server.Api;
16 
18 {
22  [Route(Routes.DreamMaker)]
23  #pragma warning disable CA1506 // TODO: Decomplexify
24  public sealed class DreamMakerController : ModelController<DreamMaker>
25  {
30 
35 
44  public DreamMakerController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger<DreamMakerController> logger) : base(databaseContext, authenticationContextFactory, logger, true)
45  {
46  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
47  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
48  }
49 
51  [TgsAuthorize(DreamMakerRights.Read)]
52  public override async Task<IActionResult> Read(CancellationToken cancellationToken)
53  {
54  var instance = instanceManager.GetInstance(Instance);
55  var dreamMakerSettings = await DatabaseContext.DreamMakerSettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
56  return Json(dreamMakerSettings.ToApi());
57  }
58 
60  [TgsAuthorize(DreamMakerRights.CompileJobs)]
61  public override async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
62  {
63  var compileJob = await DatabaseContext.CompileJobs
64  .Where(x => x.Id == id && x.Job.Instance.Id == Instance.Id)
65  .Include(x => x.Job).ThenInclude(x => x.StartedBy)
66  .Include(x => x.RevisionInformation).ThenInclude(x => x.PrimaryTestMerge).ThenInclude(x => x.MergedBy)
67  .Include(x => x.RevisionInformation).ThenInclude(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy)
68  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
69  if (compileJob == default)
70  return NotFound();
71  return Json(compileJob.ToApi());
72  }
73 
75  [TgsAuthorize(DreamMakerRights.CompileJobs)]
76  public override async Task<IActionResult> List(CancellationToken cancellationToken)
77  {
78  var compileJobs = await DatabaseContext.CompileJobs.Where(x => x.Job.Instance.Id == Instance.Id).OrderByDescending(x => x.Job.StoppedAt).Select(x => new Api.Models.CompileJob
79  {
80  Id = x.Id
81  }).ToListAsync(cancellationToken).ConfigureAwait(false);
82  return Json(compileJobs);
83  }
84 
86  [TgsAuthorize(DreamMakerRights.Compile)]
87  public override async Task<IActionResult> Create([FromBody] DreamMaker model, CancellationToken cancellationToken)
88  {
89  var job = new Models.Job
90  {
91  Description = "Compile active repository code",
92  StartedBy = AuthenticationContext.User,
93  CancelRightsType = RightsType.DreamMaker,
94  CancelRight = (ulong)DreamMakerRights.CancelCompile,
96  };
97  await jobManager.RegisterOperation(job, instanceManager.GetInstance(Instance).CompileProcess, cancellationToken).ConfigureAwait(false);
98  return Accepted(job.ToApi());
99  }
100 
102  [TgsAuthorize(DreamMakerRights.SetDme | DreamMakerRights.SetApiValidationPort | DreamMakerRights.SetApiValidationPort)]
103  public override async Task<IActionResult> Update([FromBody] DreamMaker model, CancellationToken cancellationToken)
104  {
105  if (model.ApiValidationPort == 0)
106  return BadRequest(new ErrorMessage { Message = "API Validation port cannot be 0!" });
107 
108  if (model.ApiValidationSecurityLevel == DreamDaemonSecurity.Ultrasafe)
109  return BadRequest(new ErrorMessage { Message = "This version of TGS does not support the ultrasafe DreamDaemon configuration!" });
110 
111  var hostModel = await DatabaseContext.DreamMakerSettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
112  if (hostModel == null)
113  return StatusCode((int)HttpStatusCode.Gone);
114 
115  if (model.ProjectName != null)
116  {
118  return Forbid();
119  if (model.ProjectName.Length == 0)
120  hostModel.ProjectName = null;
121  else
122  hostModel.ProjectName = model.ProjectName;
123  }
124 
125  if (model.ApiValidationPort.HasValue)
126  {
127  if (!AuthenticationContext.InstanceUser.DreamMakerRights.Value.HasFlag(DreamMakerRights.SetApiValidationPort))
128  return Forbid();
129  hostModel.ApiValidationPort = model.ApiValidationPort;
130  }
131 
132  if (model.ApiValidationSecurityLevel.HasValue)
133  {
134  if (!AuthenticationContext.InstanceUser.DreamMakerRights.Value.HasFlag(DreamMakerRights.SetSecurityLevel))
135  return Forbid();
136  hostModel.ApiValidationSecurityLevel = model.ApiValidationSecurityLevel;
137  }
138 
139  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
140 
141  if ((AuthenticationContext.GetRight(RightsType.DreamMaker) & (ulong)DreamMakerRights.Read) == 0)
142  return Ok();
143 
144  return await Read(cancellationToken).ConfigureAwait(false);
145  }
146  }
147 }
+
Manages the runtime of Jobs
Definition: IJobManager.cs:12
+ +
readonly IInstanceManager instanceManager
The IInstanceManager for the DreamMakerController
+ + +
Represents the state of the DreamMaker compiler. Create action starts a new compile....
Definition: DreamMaker.cs:8
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+ +
DbSet< DreamMakerSettings > DreamMakerSettings
+ +
override async Task< IActionResult > GetId(long id, CancellationToken cancellationToken)
Attempt to get a specific a TModel
+
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+ +
override async Task< IActionResult > Update([FromBody] DreamMaker model, CancellationToken cancellationToken)
+
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
Task CompileProcess(Job job, IDatabaseContext databaseContext, Action< int > progressReporter, CancellationToken cancellationToken)
Run the compile job and insert it into the database. Meant to be called by a Core....
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+ +
Task RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
Registers a given Job and begins running it
+ + +
Routes to a server actions
Definition: Routes.cs:9
+
DreamMakerRights? DreamMakerRights
The Rights.DreamMakerRights of the InstanceUser
Definition: InstanceUser.cs:39
+
const string DreamMaker
The Models.DreamMaker controller
Definition: Routes.cs:74
+
DreamMakerRights
Rights for Models.DreamMaker
+ +
override async Task< IActionResult > List(CancellationToken cancellationToken)
Attempt to list entries of the TModel
+
DreamMakerController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger< DreamMakerController > logger)
Construct a DreamMakerController
+
readonly IJobManager jobManager
The IJobManager for the DreamMakerController
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
An ApiController representing a TModel
+ + + +
override async Task< IActionResult > Create([FromBody] DreamMaker model, CancellationToken cancellationToken)
+
override async Task< IActionResult > Read(CancellationToken cancellationToken)
Attempt to read a TModel
+
Metadata about a server instance
Definition: Instance.cs:9
+ + +
DreamDaemonSecurity
DreamDaemon's security level
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ + + + +
+ + + + diff --git a/_dream_maker_rights_8cs.html b/_dream_maker_rights_8cs.html new file mode 100644 index 0000000000..93f5786291 --- /dev/null +++ b/_dream_maker_rights_8cs.html @@ -0,0 +1,116 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/DreamMakerRights.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamMakerRights.cs File Reference
+
+ + + + + diff --git a/_dream_maker_rights_8cs_source.html b/_dream_maker_rights_8cs_source.html new file mode 100644 index 0000000000..becbc446d7 --- /dev/null +++ b/_dream_maker_rights_8cs_source.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/DreamMakerRights.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DreamMakerRights.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
8  [Flags]
9  public enum DreamMakerRights : ulong
10  {
14  None = 0,
15 
19  Read = 1,
20 
24  Compile = 2,
25 
29  CancelCompile = 4,
30 
34  SetDme = 8,
35 
40 
44  CompileJobs = 32,
45 
49  SetSecurityLevel = 64
50  }
51 }
User may modify Models.DreamMaker.ApiValidationPort
+ + +
User may modify Models.DreamMaker.ApiValidationSecurityLevel
+
User may list and read all Models.CompileJobs
+
DreamMakerRights
Rights for Models.DreamMaker
+ +
User may modify Models.DreamMaker.ProjectName
+
User can read all chat settings except Models.Internal.ChatBot.ConnectionString
+ +
+ + + + diff --git a/_dream_maker_settings_8cs.html b/_dream_maker_settings_8cs.html new file mode 100644 index 0000000000..1cd91fb9c0 --- /dev/null +++ b/_dream_maker_settings_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/DreamMakerSettings.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamMakerSettings.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Models.DreamMakerSettings
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + diff --git a/_dream_maker_settings_8cs_source.html b/_dream_maker_settings_8cs_source.html new file mode 100644 index 0000000000..1d766994da --- /dev/null +++ b/_dream_maker_settings_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/DreamMakerSettings.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DreamMakerSettings.cs
+
+
+Go to the documentation of this file.
1 using System.ComponentModel.DataAnnotations;
2 
4 {
6  public sealed class DreamMakerSettings : Api.Models.DreamMaker
7  {
11  public long Id { get; set; }
12 
16  public long InstanceId { get; set; }
17 
21  [Required]
22  public Instance Instance { get; set; }
23 
28  public Api.Models.DreamMaker ToApi() => new Api.Models.DreamMaker
29  {
33  };
34  }
35 }
+ +
ushort? ApiValidationPort
The port used during compilation to validate the DMAPI
Definition: DreamMaker.cs:19
+
string ProjectName
The .dme file DreamMaker tries to compile with without the extension
Definition: DreamMaker.cs:13
+
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+
DreamDaemonSecurity? ApiValidationSecurityLevel
The DreamDaemonSecurity level used to validate the DMAPI
Definition: DreamMaker.cs:25
+ + +
Api.Models.DreamMaker ToApi()
Convert the DreamDaemonSettings to it's API form
+
+ + + + diff --git a/_error_message_8cs.html b/_error_message_8cs.html new file mode 100644 index 0000000000..5c3aeeb67e --- /dev/null +++ b/_error_message_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/ErrorMessage.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ErrorMessage.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.ErrorMessage
 Represents an error message returned by the server More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + diff --git a/_error_message_8cs_source.html b/_error_message_8cs_source.html new file mode 100644 index 0000000000..10a63b1d59 --- /dev/null +++ b/_error_message_8cs_source.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/ErrorMessage.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ErrorMessage.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
8  public sealed class ErrorMessage
9  {
13  public string Message { get; set; }
14 
18  public Version SeverApiVersion { get; set; } = ApiHeaders.Version;
19  }
20 }
+
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
string Message
A human readable description of the error
Definition: ErrorMessage.cs:13
+
Version SeverApiVersion
The version of the API the server is using
Definition: ErrorMessage.cs:18
+
static Version Version
Get the version of the Api the caller is using
Definition: ApiHeaders.cs:56
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+ + + + diff --git a/_event_consumer_8cs.html b/_event_consumer_8cs.html new file mode 100644 index 0000000000..42982f2018 --- /dev/null +++ b/_event_consumer_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/EventConsumer.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EventConsumer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Components.EventConsumer
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
+
+ + + + diff --git a/_event_consumer_8cs_source.html b/_event_consumer_8cs_source.html new file mode 100644 index 0000000000..d2746ec60c --- /dev/null +++ b/_event_consumer_8cs_source.html @@ -0,0 +1,99 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/EventConsumer.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EventConsumer.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Threading;
4 using System.Threading.Tasks;
7 
9 {
12  {
17 
22 
28  {
29  this.configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
30  }
31 
33  public async Task<bool> HandleEvent(EventType eventType, IEnumerable<string> parameters, CancellationToken cancellationToken)
34  {
35  if (watchdog == null)
36  throw new InvalidOperationException("EventConsumer used without watchdog set!");
37 
38  if (!await configuration.HandleEvent(eventType, parameters, cancellationToken).ConfigureAwait(false))
39  return false;
40  return await watchdog.HandleEvent(eventType, parameters, cancellationToken).ConfigureAwait(false);
41  }
42 
48  {
49 #pragma warning disable IDE0016 // Use 'throw' expression
50  if (watchdog == null)
51  throw new ArgumentNullException(nameof(watchdog));
52 #pragma warning restore IDE0016 // Use 'throw' expression
53  if (this.watchdog != null)
54  throw new InvalidOperationException("watchdog already set!");
55  this.watchdog = watchdog;
56  }
57  }
58 }
async Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+ +
Consumes EventTypes and takes the appropriate actions
+
IWatchdog watchdog
The IWatchdog for the EventConsumer
+
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+ +
readonly IConfiguration configuration
The IConfiguration for the EventConsumer
+
EventConsumer(IConfiguration configuration)
Construct an IEventConsumer
+ + + + +
Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+ +
void SetWatchdog(IWatchdog watchdog)
Set the watchdog for the EventConsumer
+ +
Runs and monitors the twin server controllers
Definition: IWatchdog.cs:12
+
+ + + + diff --git a/_event_notification_8cs.html b/_event_notification_8cs.html new file mode 100644 index 0000000000..9331009969 --- /dev/null +++ b/_event_notification_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/EventNotification.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EventNotification.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Interop.EventNotification
 For notifying DD of EventTypes More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Interop
 
+
+ + + + diff --git a/_event_notification_8cs_source.html b/_event_notification_8cs_source.html new file mode 100644 index 0000000000..d9091e75bd --- /dev/null +++ b/_event_notification_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/EventNotification.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EventNotification.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 
4 {
8  sealed class EventNotification
9  {
13  public EventType Type { get; set; }
14 
18  public IEnumerable<string> Parameters { get; set; }
19  }
20 }
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+ + +
IEnumerable< string > Parameters
The event parameters
+ +
+ + + + diff --git a/_event_type_8cs.html b/_event_type_8cs.html new file mode 100644 index 0000000000..27628b5b84 --- /dev/null +++ b/_event_type_8cs.html @@ -0,0 +1,124 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/EventType.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EventType.cs File Reference
+
+ + + + + diff --git a/_event_type_8cs_source.html b/_event_type_8cs_source.html new file mode 100644 index 0000000000..caa6bbdf4b --- /dev/null +++ b/_event_type_8cs_source.html @@ -0,0 +1,98 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/EventType.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EventType.cs
+
+
+Go to the documentation of this file.
2 {
6  public enum EventType
7  {
11  RepoResetOrigin = 0,
12 
16  RepoCheckout = 1,
17 
21  RepoFetch = 2,
22 
27 
32 
37 
41  ByondInstallFail = 6,
42 
47 
51  CompileStart = 8,
52 
56  CompileCancelled = 9,
57 
61  CompileFailure = 10,
62 
66  CompileComplete = 11,
67 
72 
76  RepoMergeConflict = 13,
77  }
78 }
+ +
Parameters: Base sha, target sha, base reference, target reference
+
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+
Parameters: Pull request number, pull request sha, merger message
+ +
Parameters: Absolute path to repository root
+ + +
Parameters: Game directory path, origin commit sha
+
Parameters: Game directory path, "1" if compile succeeded and api validation failed,...
+
Parameters: Old active version, new active version
+ + + + +
+ + + + diff --git a/_experimental_watchdog_8cs.html b/_experimental_watchdog_8cs.html new file mode 100644 index 0000000000..d02c1c6d87 --- /dev/null +++ b/_experimental_watchdog_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/ExperimentalWatchdog.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ExperimentalWatchdog.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog
 A IWatchdog that tries to manage 2 servers at once for maximum uptime. More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Watchdog
 
+
+ + + + diff --git a/_experimental_watchdog_8cs_source.html b/_experimental_watchdog_8cs_source.html new file mode 100644 index 0000000000..7ee5e282df --- /dev/null +++ b/_experimental_watchdog_8cs_source.html @@ -0,0 +1,178 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/ExperimentalWatchdog.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ExperimentalWatchdog.cs
+
+
+Go to the documentation of this file.
1 using Byond.TopicSender;
2 using Microsoft.Extensions.Logging;
3 using Newtonsoft.Json;
4 using System;
5 using System.Diagnostics;
6 using System.Globalization;
7 using System.Threading;
8 using System.Threading.Tasks;
13 
15 {
20  {
24  const int AlphaBravoStartupSeperationInterval = 10; // TODO: Make this configurable
25 
27  public override bool AlphaIsActive => alphaIsActive;
28 
30  public override Models.CompileJob ActiveCompileJob => (AlphaIsActive ? alphaServer : bravoServer)?.Dmb.CompileJob;
31 
34 
39 
44 
49 
67  public ExperimentalWatchdog(IChat chat, ISessionControllerFactory sessionControllerFactory, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IEventConsumer eventConsumer, IJobManager jobManager, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILogger<ExperimentalWatchdog> logger, DreamDaemonLaunchParameters initialLaunchParameters, Api.Models.Instance instance, bool autoStart)
68  : base(
69  chat,
70  sessionControllerFactory,
71  dmbFactory,
76  jobManager,
77  serverControl,
78  asyncDelayer,
79  logger,
80  initialLaunchParameters,
81  instance,
82  autoStart)
83  {
84  alphaIsActive = true;
85  }
86 
94  #pragma warning disable CA1502 // TODO: Decomplexify
95  async Task HandlerMonitorWakeup(MonitorActivationReason activationReason, MonitorState monitorState, CancellationToken cancellationToken)
96  {
97  Logger.LogDebug("Monitor activation. Reason: {0}", activationReason);
98 
99  // this is where the bulk of the watchdog handling code lives and is fraught with lambdas, sorry not sorry
100  // I'll do my best to walk you through it
101 
102  // returns true if the inactive server can't be used immediately
103  // also sets monitor to restart if the above holds
104  bool FullRestartDeadInactive()
105  {
106  if (monitorState.RebootingInactiveServer || monitorState.InactiveServerCritFail)
107  {
108  Logger.LogInformation("Inactive server is {0}! Restarting monitor...", monitorState.InactiveServerCritFail ? "critically failed" : "still rebooting");
109  monitorState.NextAction = MonitorAction.Restart; // will dispose server
110  return true;
111  }
112 
113  return false;
114  }
115 
116  // trys to set inactive server's port to the public game port
117  // doesn't handle closing active server's port
118  // returns true on success and swaps inactiveserver and activeserver also sets LastLaunchParameters to ActiveLaunchParameters
119  // on failure, sets monitor to restart
120  async Task<bool> MakeInactiveActive()
121  {
122  Logger.LogDebug("Setting inactive server to port {0}...", ActiveLaunchParameters.PrimaryPort.Value);
123  var result = await monitorState.InactiveServer.SetPort(ActiveLaunchParameters.PrimaryPort.Value, cancellationToken).ConfigureAwait(false);
124 
125  if (!result)
126  {
127  Logger.LogWarning("Failed to activate inactive server! Restarting monitor...");
128  monitorState.NextAction = MonitorAction.Restart; // will dispose server
129  return false;
130  }
131 
132  // inactive server should always be using active launch parameters
134 
135  var tmp = monitorState.ActiveServer;
136  monitorState.ActiveServer = monitorState.InactiveServer;
137  monitorState.InactiveServer = tmp;
139  monitorState.ActiveServer.EnableCustomChatCommands();
140  return true;
141  }
142 
143  // Kills and tries to launch inactive server with the latest dmb
144  // falls back to current dmb on failure
145  // Sets critfail on inactive server failing that
146  // returns false if the backup dmb was used successfully, true otherwise
147  async Task UpdateAndRestartInactiveServer(bool breakAfter)
148  {
149  ActiveParametersUpdated = new TaskCompletionSource<object>();
150  monitorState.InactiveServer.Dispose(); // kill or recycle it
151  var desiredNextAction = breakAfter ? MonitorAction.Break : MonitorAction.Continue;
152  monitorState.NextAction = desiredNextAction;
153 
154  Logger.LogInformation("Rebooting inactive server...");
155  var newDmb = DmbFactory.LockNextDmb(1);
156  try
157  {
158  monitorState.InactiveServer = await SessionControllerFactory.LaunchNew(ActiveLaunchParameters, newDmb, null, false, !monitorState.ActiveServer.IsPrimary, false, cancellationToken).ConfigureAwait(false);
159  monitorState.InactiveServer.SetHighPriority();
160  }
161  catch (OperationCanceledException)
162  {
163  throw;
164  }
165  catch (Exception e)
166  {
167  Logger.LogError("Error occurred while recreating server! Attempting backup strategy of running DMB of running server! Exception: {0}", e.ToString());
168 
169  // ahh jeez, what do we do here?
170  // this is our fault, so it should never happen but
171  // idk maybe a database error while handling the newest dmb?
172  // either way try to start it using the active server's dmb as a backup
173  try
174  {
175  var dmbBackup = await DmbFactory.FromCompileJob(monitorState.ActiveServer.Dmb.CompileJob, cancellationToken).ConfigureAwait(false);
176 
177  if (dmbBackup == null) // NANI!?
178  throw new JobException("Creating backup DMB provider failed!"); // just give up, if THAT compile job is failing then the ActiveServer is gonna crash soon too or already has
179 
180  monitorState.InactiveServer = await SessionControllerFactory.LaunchNew(ActiveLaunchParameters, dmbBackup, null, false, !monitorState.ActiveServer.IsPrimary, false, cancellationToken).ConfigureAwait(false);
181  monitorState.InactiveServer.SetHighPriority();
182  await Chat.SendWatchdogMessage("Staging newest DMB on inactive server failed: {0} Falling back to previous dmb...", cancellationToken).ConfigureAwait(false);
183  }
184  catch (OperationCanceledException)
185  {
186  throw;
187  }
188  catch (Exception e2)
189  {
190  // fuuuuucckkk
191  Logger.LogError("Backup strategy failed! Monitor will restart when active server reboots! Exception: {0}", e2.ToString());
192  monitorState.InactiveServerCritFail = true;
193  await Chat.SendWatchdogMessage("Attempted reboot of inactive server failed. Watchdog will reset when active server fails or exits", cancellationToken).ConfigureAwait(false);
194  return;
195  }
196  }
197 
198  Logger.LogInformation("Successfully relaunched inactive server!");
199  monitorState.RebootingInactiveServer = true;
200  }
201 
202  string ExitWord(ISessionController controller) => controller.TerminationWasRequested ? "exited" : "crashed";
203 
204  // reason handling
205  switch (activationReason)
206  {
207  case MonitorActivationReason.ActiveServerCrashed:
208  if (monitorState.ActiveServer.RebootState == Watchdog.RebootState.Shutdown)
209  {
210  // the time for graceful shutdown is now
211  await Chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Active server {0}! Exiting due to graceful termination request...", ExitWord(monitorState.ActiveServer)), cancellationToken).ConfigureAwait(false);
213  monitorState.NextAction = MonitorAction.Exit;
214  break;
215  }
216 
217  if (FullRestartDeadInactive())
218  {
219  // tell chat about it and go ahead
220  await Chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Active server {0}! Inactive server unable to online!", ExitWord(monitorState.ActiveServer)), cancellationToken).ConfigureAwait(false);
221 
222  // we've already been set to restart
223  break;
224  }
225 
226  // tell chat about it
227  await Chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Active server {0}! Onlining inactive server...", ExitWord(monitorState.ActiveServer)), cancellationToken).ConfigureAwait(false);
228 
229  // try to activate the inactive server
230  if (!await MakeInactiveActive().ConfigureAwait(false))
231  break; // failing that, we've already been set to restart
232 
233  // bring up another inactive server
234  await UpdateAndRestartInactiveServer(true).ConfigureAwait(false);
235  break;
236  case MonitorActivationReason.InactiveServerCrashed:
237  // just announce and try to bring it back
238  await Chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Inactive server {0}! Rebooting...", ExitWord(monitorState.InactiveServer)), cancellationToken).ConfigureAwait(false);
239  await UpdateAndRestartInactiveServer(false).ConfigureAwait(false);
240  break;
241  case MonitorActivationReason.ActiveServerRebooted:
242  // ideal goal: active server just closed its port
243  // tell inactive server to open it's port and that's now the active server
244  var rebootState = monitorState.ActiveServer.RebootState;
245  monitorState.ActiveServer.ResetRebootState(); // the DMAPI has already done this internally
246 
247  if (FullRestartDeadInactive() && rebootState != Watchdog.RebootState.Shutdown)
248  break; // full restart if the inactive server is being fucky
249 
250  // what matters here is the RebootState
251  var restartOnceSwapped = false;
252 
253  switch (rebootState)
254  {
255  case Watchdog.RebootState.Normal:
256  // life as normal
257  break;
258  case Watchdog.RebootState.Restart:
259  // reboot the current active server once the inactive one activates
260  restartOnceSwapped = true;
261  break;
262  case Watchdog.RebootState.Shutdown:
263  // graceful shutdown time
264  await Chat.SendWatchdogMessage("Active server rebooted! Exiting due to graceful termination request...", cancellationToken).ConfigureAwait(false);
266  monitorState.NextAction = MonitorAction.Exit;
267  return;
268  default:
269  throw new InvalidOperationException($"Invalid reboot state: {rebootState}");
270  }
271 
272  // are both servers now running the same CompileJob?
273  var sameCompileJob = monitorState.InactiveServer.Dmb.CompileJob.Id == monitorState.ActiveServer.Dmb.CompileJob.Id;
274 
275  if (!sameCompileJob || ActiveLaunchParameters != LastLaunchParameters)
276  restartOnceSwapped = true; // need a new launch to update either settings or compile job
277 
278  if (restartOnceSwapped)
279  /*
280  * we need to manually restart active server
281  * just kill it here, easier that way
282  */
283  monitorState.ActiveServer.Dispose();
284 
285  var activeServerStillHasPortOpen = !restartOnceSwapped && !monitorState.ActiveServer.ClosePortOnReboot;
286 
287  if (activeServerStillHasPortOpen)
288  /* we didn't want active server to swap for some reason and it still has it's port open
289  * just continue as normal
290  */
291  break;
292 
293  if (!await MakeInactiveActive().ConfigureAwait(false))
294  break; // monitor will restart
295 
296  // servers now swapped
297  // enable this now if inactive server is not still valid
298  monitorState.ActiveServer.ClosePortOnReboot = restartOnceSwapped;
299 
300  if (!restartOnceSwapped)
301  /*
302  * now try to reopen it on the private port
303  * failing that, just reboot it
304  */
305  restartOnceSwapped = !await monitorState.InactiveServer.SetPort(ActiveLaunchParameters.SecondaryPort.Value, cancellationToken).ConfigureAwait(false);
306 
307  // break either way because any issues past this point would be solved by the reboot
308  if (restartOnceSwapped) // for one reason or another
309  await UpdateAndRestartInactiveServer(true).ConfigureAwait(false); // update and reboot
310  else
311  monitorState.NextAction = MonitorAction.Skip; // only skip checking inactive server rebooted, it's guaranteed InactiveServerStartup complete wouldn't fire this iteration
312  break;
313  case MonitorActivationReason.InactiveServerRebooted:
314  // just don't let the active server close it's port if the inactive server isn't ready
315  monitorState.RebootingInactiveServer = true;
316  monitorState.InactiveServer.ResetRebootState();
317  monitorState.ActiveServer.ClosePortOnReboot = false;
318  monitorState.NextAction = MonitorAction.Continue;
319  break;
320  case MonitorActivationReason.InactiveServerStartupComplete:
321  // opposite of above case
322  monitorState.RebootingInactiveServer = false;
323  monitorState.ActiveServer.ClosePortOnReboot = true;
324  monitorState.NextAction = MonitorAction.Continue;
325  break;
326  case MonitorActivationReason.NewDmbAvailable:
327  case MonitorActivationReason.ActiveLaunchParametersUpdated:
328  // just reload the inactive server and wait for a swap to apply the changes
329  await UpdateAndRestartInactiveServer(true).ConfigureAwait(false);
330  break;
331  default:
332  Trace.Assert(false, String.Format(CultureInfo.InvariantCulture, "Invalid monitor activation reason: {0}!", activationReason));
333  break;
334  }
335  }
336  #pragma warning restore CA1502
337 
341  protected override void DisposeAndNullControllers()
342  {
343  alphaServer?.Dispose();
344  alphaServer = null;
345  bravoServer?.Dispose();
346  bravoServer = null;
347  Running = false;
348  }
349 
351  #pragma warning disable CA1502 // TODO: Decomplexify
352  protected override async Task MonitorLifetimes(CancellationToken cancellationToken)
353  {
354  Logger.LogTrace("Entered MonitorLifetimes");
355 
356  // this function is responsible for calling HandlerMonitorWakeup when necessary and manitaining the MonitorState
357  var iteration = 1;
358  for (var monitorState = new MonitorState(); monitorState.NextAction != MonitorAction.Exit; ++iteration)
359  {
360  // always start out with continue
361  monitorState.NextAction = MonitorAction.Continue;
362 
363  // dump some info to the logs
364  Logger.LogDebug("Iteration {0} of monitor loop", iteration);
365  try
366  {
367  if (AlphaIsActive)
368  Logger.LogDebug("Alpha is the active server");
369  else
370  Logger.LogDebug("Bravo is the active server");
371 
372  if (monitorState.RebootingInactiveServer)
373  Logger.LogDebug("Inactive server is rebooting");
374 
375  // update the monitor state with the inactive/active servers
376  monitorState.ActiveServer = AlphaIsActive ? alphaServer : bravoServer;
377  monitorState.InactiveServer = AlphaIsActive ? bravoServer : alphaServer;
378 
379  if (monitorState.ActiveServer.ClosePortOnReboot)
380  Logger.LogDebug("Active server will close port on reboot");
381  if (monitorState.InactiveServer.ClosePortOnReboot)
382  Logger.LogDebug("Inactive server will close port on reboot");
383 
384  Logger.LogDebug("Active server Compile Job ID: {0}", monitorState.ActiveServer.Dmb.CompileJob.Id);
385  Logger.LogDebug("Inactive server Compile Job ID: {0}", monitorState.InactiveServer.Dmb.CompileJob.Id);
386 
387  // load the activation tasks into local variables
388  Task activeServerLifetime = monitorState.ActiveServer.Lifetime;
389  Task inactiveServerLifetime = monitorState.InactiveServer.Lifetime;
390  var activeServerReboot = monitorState.ActiveServer.OnReboot;
391  var inactiveServerReboot = monitorState.InactiveServer.OnReboot;
392  Task inactiveServerStartup = monitorState.RebootingInactiveServer ? monitorState.InactiveServer.LaunchResult : null;
393  Task activeLaunchParametersChanged = ActiveParametersUpdated.Task;
394  var newDmbAvailable = DmbFactory.OnNewerDmb;
395 
396  // cancel waiting if requested
397  var cancelTcs = new TaskCompletionSource<object>();
398  using (cancellationToken.Register(() => cancelTcs.SetCanceled()))
399  {
400  var toWaitOn = Task.WhenAny(activeServerLifetime, inactiveServerLifetime, activeServerReboot, inactiveServerReboot, newDmbAvailable, cancelTcs.Task, activeLaunchParametersChanged);
401  if (monitorState.RebootingInactiveServer)
402  toWaitOn = Task.WhenAny(toWaitOn, inactiveServerStartup);
403 
404  // wait for something to happen
405  await toWaitOn.ConfigureAwait(false);
406  cancellationToken.ThrowIfCancellationRequested();
407  }
408 
409  var chatTask = Task.CompletedTask;
410  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
411  {
412  // always run HandleMonitorWakeup from the context of the semaphore lock
413  // multiple things may have happened, handle them one at a time
414  for (var moreActivationsToProcess = true; moreActivationsToProcess && (monitorState.NextAction == MonitorAction.Continue || monitorState.NextAction == MonitorAction.Skip);)
415  {
416  MonitorActivationReason activationReason = default; // this will always be assigned before being used
417 
418  // process the tasks in this order and call HandlerMonitorWakup for each
419  bool CheckActivationReason(ref Task task, MonitorActivationReason testActivationReason)
420  {
421  var taskCompleted = task?.IsCompleted == true;
422  task = null;
423  if (monitorState.NextAction == MonitorAction.Skip)
424  monitorState.NextAction = MonitorAction.Continue;
425  else if (taskCompleted)
426  {
427  activationReason = testActivationReason;
428  return true;
429  }
430 
431  return false;
432  }
433 
434  if (CheckActivationReason(ref activeServerLifetime, MonitorActivationReason.ActiveServerCrashed)
435  || CheckActivationReason(ref inactiveServerLifetime, MonitorActivationReason.InactiveServerCrashed)
436  || CheckActivationReason(ref activeServerReboot, MonitorActivationReason.ActiveServerRebooted)
437  || CheckActivationReason(ref inactiveServerReboot, MonitorActivationReason.InactiveServerRebooted)
438  || CheckActivationReason(ref inactiveServerStartup, MonitorActivationReason.InactiveServerStartupComplete)
439  || CheckActivationReason(ref newDmbAvailable, MonitorActivationReason.NewDmbAvailable)
440  || CheckActivationReason(ref activeLaunchParametersChanged, MonitorActivationReason.ActiveLaunchParametersUpdated))
441  await HandlerMonitorWakeup(activationReason, monitorState, cancellationToken).ConfigureAwait(false);
442  else
443  moreActivationsToProcess = false;
444  }
445 
446  // writeback alphaServer and bravoServer from monitor state in case they changesd
447  alphaServer = AlphaIsActive ? monitorState.ActiveServer : monitorState.InactiveServer;
448  bravoServer = !AlphaIsActive ? monitorState.ActiveServer : monitorState.InactiveServer;
449  }
450 
451  // full reboot required
452  if (monitorState.NextAction == MonitorAction.Restart)
453  {
454  Logger.LogDebug("Next state action is to restart");
456  chatTask = Chat.SendWatchdogMessage("Restarting entirely due to complications...", cancellationToken);
457 
458  for (var retryAttempts = 1; monitorState.NextAction == MonitorAction.Restart; ++retryAttempts)
459  {
460  Exception launchException = null;
461  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
462  try
463  {
464  // use LaunchImplNoLock without announcements or restarting the monitor
465  await LaunchImplNoLock(false, false, null, cancellationToken).ConfigureAwait(false);
466  if (Running)
467  {
468  Logger.LogDebug("Relaunch successful, resetting monitor state...");
469  monitorState = new MonitorState(); // clean the slate and continue
470  }
471  }
472  catch (OperationCanceledException)
473  {
474  throw;
475  }
476  catch (Exception e)
477  {
478  launchException = e;
479  }
480 
481  await chatTask.ConfigureAwait(false);
482  if (!Running)
483  {
484  if (launchException == null)
485  Logger.LogWarning("Failed to automatically restart the watchdog! Attempt: {0}", retryAttempts);
486  else
487  Logger.LogWarning("Failed to automatically restart the watchdog! Attempt: {0}, Exception: {1}", retryAttempts, launchException);
488  var retryDelay = Math.Min(Math.Pow(2, retryAttempts), 3600); // max of one hour, increasing by a power of 2 each time
489  chatTask = Chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Failed to restart watchdog (Attempt: {0}), retrying in {1} seconds...", retryAttempts, retryDelay), cancellationToken);
490  await Task.WhenAll(AsyncDelayer.Delay(TimeSpan.FromSeconds(retryDelay), cancellationToken), chatTask).ConfigureAwait(false);
491  }
492  }
493  }
494  }
495  catch (OperationCanceledException)
496  {
497  Logger.LogDebug("Monitor cancelled");
498  break;
499  }
500  catch (Exception e)
501  {
502  // really, this should NEVER happen
503  Logger.LogError("Monitor crashed! Iteration: {0}, State: {1}, Exception: {2}", iteration, JsonConvert.SerializeObject(monitorState), e);
504  await Chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Monitor crashed, this should NEVER happen! Please report this, full details in logs! Restarting monitor... Error: {0}", e.Message), cancellationToken).ConfigureAwait(false);
505  }
506  }
507 
508  Logger.LogTrace("Monitor exiting...");
509  }
510  #pragma warning restore CA1502
511 
513  #pragma warning disable CA1502 // TODO: Decomplexify
514  protected override async Task InitControllers(Action callBeforeRecurse, Task chatTask, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
515  {
516  // good ole sanity, should never fucking trigger but i don't trust myself even though I should
517  // TODO: Unit test this instead?
518  if (alphaServer != null || bravoServer != null)
519  throw new InvalidOperationException("Entered LaunchNoLock with one or more of the servers not being null!");
520 
521  // don't need a new dmb if reattaching
522  var doesntNeedNewDmb = reattachInfo?.Alpha != null && reattachInfo?.Bravo != null;
523  var dmbToUse = doesntNeedNewDmb ? null : DmbFactory.LockNextDmb(2);
524 
525  // if this try catches something, both servers are killed
526  try
527  {
528  // start the alpha server task, either by launch a new process or attaching to an existing one
529  // The tasks returned are mainly for writing interop files to the directories among other things and should generally never fail
530  // The tasks pertaining to server startup times are in the ISessionControllers
531  Task<ISessionController> alphaServerTask;
532  if (!doesntNeedNewDmb)
533  alphaServerTask = SessionControllerFactory.LaunchNew(ActiveLaunchParameters, dmbToUse, null, true, true, false, cancellationToken);
534  else
535  alphaServerTask = SessionControllerFactory.Reattach(reattachInfo.Alpha, cancellationToken);
536 
537  // retrieve the session controller
538  var startTime = DateTimeOffset.Now;
539  alphaServer = await alphaServerTask.ConfigureAwait(false);
540 
541  // failed reattaches will return null
543 
544  // extra delay for total ordering
545  var now = DateTimeOffset.Now;
546  var delay = now - startTime;
547 
548  // definitely not if reattaching though
549  if (reattachInfo == null && delay.TotalSeconds < AlphaBravoStartupSeperationInterval)
550  await AsyncDelayer.Delay(startTime.AddSeconds(AlphaBravoStartupSeperationInterval) - now, cancellationToken).ConfigureAwait(false);
551 
552  // now bring bravo up
553  if (!doesntNeedNewDmb)
554  bravoServer = await SessionControllerFactory.LaunchNew(ActiveLaunchParameters, dmbToUse, null, false, false, false, cancellationToken).ConfigureAwait(false);
555  else
556  bravoServer = await SessionControllerFactory.Reattach(reattachInfo.Bravo, cancellationToken).ConfigureAwait(false);
557 
558  // failed reattaches will return null
560 
561  // possiblity of null servers due to failed reattaches
562  if (alphaServer == null || bravoServer == null)
563  {
564  await chatTask.ConfigureAwait(false);
565  var bothServersDead = alphaServer == null && bravoServer == null;
566  if (bothServersDead
567  || (alphaServer == null && reattachInfo.AlphaIsActive)
568  || (bravoServer == null && !reattachInfo.AlphaIsActive))
569  {
570  // we lost the active server, just restart entirely
572  const string FailReattachMessage = "Unable to properly reattach to active server! Restarting...";
573  Logger.LogWarning(FailReattachMessage);
574  Logger.LogDebug(bothServersDead ? "Also could not reattach to inactive server!" : "Inactive server was reattached successfully!");
575  chatTask = Chat.SendWatchdogMessage(FailReattachMessage, cancellationToken);
576  callBeforeRecurse();
577  await LaunchImplNoLock(true, false, null, cancellationToken).ConfigureAwait(false);
578  await chatTask.ConfigureAwait(false);
579  return;
580  }
581 
582  // we still have the active server but the other one is dead to us, hand it off to the monitor to restart
583  const string InactiveReattachFailureMessage = "Unable to reattach to inactive server. Leaving for monitor to reboot...";
584  chatTask = Chat.SendWatchdogMessage(InactiveReattachFailureMessage, cancellationToken);
585  Logger.LogWarning(InactiveReattachFailureMessage);
586 
587  if (reattachInfo.AlphaIsActive)
589  else
591  }
592 
593  var alphaLrt = CheckLaunchResult(alphaServer, "Alpha", cancellationToken);
594  var bravoLrt = CheckLaunchResult(bravoServer, "Bravo", cancellationToken);
595 
596  // this task completes when both serers have finished booting
597  var allTask = Task.WhenAll(alphaLrt, bravoLrt);
598 
599  await allTask.ConfigureAwait(false);
600 
601  // both servers are now running, alpha is the active server(unless reattach), huzzah
602  alphaIsActive = reattachInfo?.AlphaIsActive ?? true;
603 
604  var activeServer = AlphaIsActive ? alphaServer : bravoServer;
605  activeServer.EnableCustomChatCommands();
606  activeServer.ClosePortOnReboot = true;
607  }
608  catch
609  {
610  if (dmbToUse != null)
611  {
612  // we locked 2 dmbs
613  if (bravoServer == null)
614  {
615  // bravo didn't get control of his
616  dmbToUse.Dispose();
617  if (alphaServer == null)
618  dmbToUse.Dispose(); // alpha didn't get control of his
619  }
620  }
621  else if (doesntNeedNewDmb) // we have reattachInfo
622  if (bravoServer == null)
623  {
624  // bravo didn't get control of his
625  reattachInfo.Bravo?.Dmb.Dispose();
626  if (alphaServer == null)
627  reattachInfo.Alpha?.Dmb.Dispose(); // alpha didn't get control of his
628  }
629 
630  // kill the controllers
632  throw;
633  }
634  }
635  #pragma warning restore CA1502
636 
639 
643  {
645  Alpha = alphaServer?.Release(),
646  Bravo = bravoServer?.Release()
647  };
648  }
649 }
+
bool InactiveServerCritFail
If the inactive server is in an unrecoverable state
Definition: MonitorState.cs:18
+
Manages the runtime of Jobs
Definition: IJobManager.cs:12
+
readonly bool autoStart
If the WatchdogBase should LaunchImplNoLock(bool, bool, WatchdogReattachInformation,...
+ +
const int AlphaBravoStartupSeperationInterval
The time in seconds to wait from starting alphaServer to start bravoServer. Does not take responsiven...
+ + + +
ushort? PrimaryPort
The first port DreamDaemon uses. This should be the publically advertised port
+
CompileJob CompileJob
The CompileJob of the .dmb
Definition: IDmbProvider.cs:29
+ + +
async Task LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
Launches the watchdog.
+
MonitorAction NextAction
The next MonitorAction to take in ExperimentalWatchdog.MonitorLifetimes(System.Threading....
Definition: MonitorState.cs:23
+ + + +
Consumes EventTypes and takes the appropriate actions
+ + +
ExperimentalWatchdog(IChat chat, ISessionControllerFactory sessionControllerFactory, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IEventConsumer eventConsumer, IJobManager jobManager, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILogger< ExperimentalWatchdog > logger, DreamDaemonLaunchParameters initialLaunchParameters, Api.Models.Instance instance, bool autoStart)
Initializes a new instance of the ExperimentalWatchdog class.
+ +
SemaphoreSlim Semaphore
The SemaphoreSlim for the WatchdogBase.
Definition: WatchdogBase.cs:55
+ +
void EnableCustomChatCommands()
Enables the reading of custom chat commands from the ISessionController
+
override ISessionController GetActiveController()
Get the active ISessionController.
+
bool ClosePortOnReboot
If the port should be rotated off when the world reboots
+
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
+ +
Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured watchdog channels
Definition: Chat.cs:514
+ +
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the ExperimentalWatchdog
+ + +
readonly IJobManager jobManager
The IJobManager for the ExperimentalWatchdog
+
For managing connected chat services
Definition: IChat.cs:13
+
ISessionController CreateDeadSession(IDmbProvider dmbProvider)
Creates a ISessionController that appears to have started and died with exit code -1
+ + +
readonly IReattachInfoHandler reattachInfoHandler
The IReattachInfoHandler for the WatchdogBase
Definition: WatchdogBase.cs:90
+ +
Handles communication with a DreamDaemon IProcess
+
bool IsPrimary
If the IDmbProvider.PrimaryDirectory of Dmb is being used
+ +
void SetHighPriority()
Set's the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass....
+
A IWatchdog that tries to manage 2 servers at once for maximum uptime.
+
bool TerminationWasRequested
If the DreamDaemon instance sent a
+ + +
bool RebootingInactiveServer
If the inactive server is being rebooted
Definition: MonitorState.cs:13
+ +
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the ExperimentalWatchdog
Definition: WatchdogBase.cs:95
+
async Task< ISessionController > LaunchNew(DreamDaemonLaunchParameters launchParameters, IDmbProvider dmbProvider, IByondExecutableLock currentByondLock, bool primaryPort, bool primaryDirectory, bool apiValidate, CancellationToken cancellationToken)
Create a ISessionController from a freshly launch DreamDaemon instance
+
TaskCompletionSource< object > ActiveParametersUpdated
TaskCompletionSource<TResult> that completes when ActiveLaunchParameters are changed and we are Runni...
Definition: WatchdogBase.cs:50
+
async Task< IDmbProvider > FromCompileJob(CompileJob compileJob, CancellationToken cancellationToken)
Gets a IDmbProvider for a given CompileJob
Definition: DmbFactory.cs:186
+
override async Task InitControllers(Action callBeforeRecurse, Task chatTask, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
Starts all ISessionControllers.
+ +
ReattachInformation Alpha
ReattachInformation for the Alpha session
+ +
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+
MonitorActivationReason
Reasons for the monitor to wake up
+
async Task< ISessionController > Reattach(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Create a ISessionController from an existing DreamDaemon instance
+
Task< bool > SetPort(ushort newPort, CancellationToken cancellatonToken)
Causes the world to start listening on a newPort
+
IDmbProvider Dmb
The IDmbProvider used by DreamDaemon
+
ReattachInformation Release()
Releases the IProcess without terminating it. Also calls System.IDisposable.Dispose
+
override async Task MonitorLifetimes(CancellationToken cancellationToken)
The loop that watches the watchdog
+ + +
ISessionController ActiveServer
The active ISessionController
Definition: MonitorState.cs:29
+
IDmbProvider LockNextDmb(int lockCount)
Gets the next IDmbProvider
Definition: DmbFactory.cs:149
+
ISessionController InactiveServer
The inactive ISessionController
Definition: MonitorState.cs:35
+ +
readonly IEventConsumer eventConsumer
The IEventConsumer for the ExperimentalWatchdog
+ +
async Task CheckLaunchResult(ISessionController controller, string serverName, CancellationToken cancellationToken)
Check the LaunchResult of a given controller for errors and throw a JobException if any are detected...
+ +
ILogger Logger
The ILogger for the WatchdogBase.
Definition: WatchdogBase.cs:60
+ +
override WatchdogReattachInformation CreateReattachInformation()
Create the WatchdogReattachInformation for the ISessionControllers.
+
readonly Api.Models.Instance instance
The Api.Models.Instance for the WatchdogBase.
Definition: WatchdogBase.cs:85
+
async Task HandlerMonitorWakeup(MonitorActivationReason activationReason, MonitorState monitorState, CancellationToken cancellationToken)
Handles the actions to take when the monitor has to "wake up"
+
ReattachInformation Bravo
ReattachInformation for the Bravo session
+
MonitorAction
The action for the monitor loop to take when control is returned to it
Definition: MonitorAction.cs:6
+
The (absolute) state of the ExperimentalWatchdog
Definition: MonitorState.cs:8
+
Handles saving and loading WatchdogReattachInformation
+ +
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+
void ResetRebootState()
Changes RebootState to Components.Watchdog.RebootState.Normal without telling the DMAPI
+
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+ + + +
Represents a service that may take an updated Host assembly and run it, stopping the current assembly...
+
override void DisposeAndNullControllers()
Call IDisposable.Dispose on alphaServer and bravoServer and set them to null
+
+ + + + diff --git a/_file_logging_configuration_8cs.html b/_file_logging_configuration_8cs.html new file mode 100644 index 0000000000..0c13518107 --- /dev/null +++ b/_file_logging_configuration_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Configuration/FileLoggingConfiguration.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
FileLoggingConfiguration.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Configuration.FileLoggingConfiguration
 File logging configuration options More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Configuration
 
+
+ + + + diff --git a/_file_logging_configuration_8cs_source.html b/_file_logging_configuration_8cs_source.html new file mode 100644 index 0000000000..14a2c30c8e --- /dev/null +++ b/_file_logging_configuration_8cs_source.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Configuration/FileLoggingConfiguration.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
FileLoggingConfiguration.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using Newtonsoft.Json;
3 using Newtonsoft.Json.Converters;
4 
6 {
11  {
15  public const string Section = "FileLogging";
16 
21 
26 
30  public string Directory { get; set; }
31 
35  public bool Disable { get; set; }
36 
40  [JsonConverter(typeof(StringEnumConverter))]
41  public LogLevel LogLevel { get; set; } = DefaultLogLevel;
42 
46  [JsonConverter(typeof(StringEnumConverter))]
48  }
49 }
LogLevel MicrosoftLogLevel
The minimum Microsoft.Extensions.Logging.LogLevel to display in logs for Microsoft library sources
+ +
LogLevel LogLevel
The minimum Microsoft.Extensions.Logging.LogLevel to display in logs
+ + + + + +
const LogLevel DefaultMicrosoftLogLevel
Default value for MicrosoftLogLevel
+
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the FileLoggingConfiguration...
+
+ + + + diff --git a/_general_configuration_8cs.html b/_general_configuration_8cs.html new file mode 100644 index 0000000000..1b9cc46ec5 --- /dev/null +++ b/_general_configuration_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Configuration/GeneralConfiguration.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
GeneralConfiguration.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Configuration.GeneralConfiguration
 General configuration options More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Configuration
 
+
+ + + + diff --git a/_general_configuration_8cs_source.html b/_general_configuration_8cs_source.html new file mode 100644 index 0000000000..2f55f2d205 --- /dev/null +++ b/_general_configuration_8cs_source.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Configuration/GeneralConfiguration.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
GeneralConfiguration.cs
+
+
+Go to the documentation of this file.
1 using Newtonsoft.Json;
2 using Newtonsoft.Json.Converters;
3 
5 {
9  public sealed class GeneralConfiguration
10  {
14  public const string Section = "General";
15 
20 
24  const int DefaultByondTopicTimeout = 5000;
25 
29  const int DefaultRestartTimeout = 10000;
30 
35 
39  public string GitHubAccessToken { get; set; }
40 
44  [JsonConverter(typeof(StringEnumConverter))]
45  public SetupWizardMode SetupWizardMode { get; set; }
46 
50  public int ByondTopicTimeout { get; set; } = DefaultByondTopicTimeout;
51 
55  public int RestartTimeout { get; set; } = DefaultRestartTimeout;
56 
60  public bool UseExperimentalWatchdog { get; set; }
61  }
62 }
string GitHubAccessToken
A GitHub personal access token to use for bypassing rate limits on requests. Requires no scopes
+
SetupWizardMode
Determines if the Core.ISetupWizard will run
+
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the GeneralConfiguration res...
+
const int DefaultByondTopicTimeout
The default value for ByondTopicTimeout
+
const uint DefaultMinimumPasswordLength
The default value for MinimumPasswordLength
+ +
int RestartTimeout
The timeout milliseconds for restarting the server
+ +
bool UseExperimentalWatchdog
If the Components.Watchdog.ExperimentalWatchdog should be used.
+ +
int ByondTopicTimeout
The timeout in milliseconds for sending and receiving topics to/from DreamDaemon. Note that a single ...
+
const int DefaultRestartTimeout
The default value for RestartTimeout
+
uint MinimumPasswordLength
Minimum length of database user passwords
+
+ + + + diff --git a/_git_hub_client_factory_8cs.html b/_git_hub_client_factory_8cs.html new file mode 100644 index 0000000000..b4589a5366 --- /dev/null +++ b/_git_hub_client_factory_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/GitHubClientFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
GitHubClientFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Core.GitHubClientFactory
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_git_hub_client_factory_8cs_source.html b/_git_hub_client_factory_8cs_source.html new file mode 100644 index 0000000000..cdf23266dc --- /dev/null +++ b/_git_hub_client_factory_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/GitHubClientFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
GitHubClientFactory.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using Octokit;
3 
5 {
8  {
13 
19  {
20  this.application = application ?? throw new ArgumentNullException(nameof(application));
21  }
22 
27  GitHubClient CreateBaseClient() => new GitHubClient(new ProductHeaderValue(application.VersionPrefix, application.Version.ToString()));
28 
30  public IGitHubClient CreateClient() => CreateBaseClient();
31 
33  public IGitHubClient CreateClient(string accessToken)
34  {
35  if (accessToken == null)
36  throw new ArgumentNullException(nameof(accessToken));
37  var result = CreateBaseClient();
38  result.Credentials = new Credentials(accessToken);
39  return result;
40  }
41  }
42 }
IGitHubClient CreateClient(string accessToken)
Create a client with authentication using a personal access token
+
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+
string VersionPrefix
Prefix to VersionString
Definition: IApplication.cs:13
+
GitHubClientFactory(IApplication application)
Construct a GitHubClientFactory
+ +
GitHubClient CreateBaseClient()
Create a GitHubClient
+ +
readonly IApplication application
The IApplication for the GitHubClientFactory
+ +
IGitHubClient CreateClient()
Create a client with anonymous authentication. Low rate limit
+
Version Version
The version of the Application
Definition: IApplication.cs:23
+
+ + + + diff --git a/_global_suppressions_8cs.html b/_global_suppressions_8cs.html new file mode 100644 index 0000000000..9c1b1e52e3 --- /dev/null +++ b/_global_suppressions_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Service/GlobalSuppressions.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
GlobalSuppressions.cs File Reference
+
+ + + + + diff --git a/_global_suppressions_8cs_source.html b/_global_suppressions_8cs_source.html new file mode 100644 index 0000000000..350cd59cb1 --- /dev/null +++ b/_global_suppressions_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Service/GlobalSuppressions.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
GlobalSuppressions.cs
+
+
+Go to the documentation of this file.
1 [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2232:MarkWindowsFormsEntryPointsWithStaThread", Justification = "No don't, it breaks shit")]
2 
3 // This file is used by Code Analysis to maintain SuppressMessage
4 // attributes that are applied to this project.
5 // Project-level suppressions either have no target or are given
6 // a specific target and scoped to a namespace, type, member, etc.
7 //
8 // To add a suppression to this file, right-click the message in the
9 // Code Analysis results, point to "Suppress Message", and click
10 // "In Suppression File".
11 // You do not need to add suppressions to this file manually.
+ + + + diff --git a/_home_controller_8cs.html b/_home_controller_8cs.html new file mode 100644 index 0000000000..566d3a4eed --- /dev/null +++ b/_home_controller_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/HomeController.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
HomeController.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Controllers.HomeController
 Main ApiController for the Application More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Controllers
 
+
+ + + + diff --git a/_home_controller_8cs_source.html b/_home_controller_8cs_source.html new file mode 100644 index 0000000000..37f7595bad --- /dev/null +++ b/_home_controller_8cs_source.html @@ -0,0 +1,133 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/HomeController.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
HomeController.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Authorization;
2 using Microsoft.AspNetCore.Mvc;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.Extensions.Logging;
5 using Microsoft.Extensions.Options;
6 using System;
7 using System.Linq;
8 using System.Net.Mime;
9 using System.Threading;
10 using System.Threading.Tasks;
11 using Tgstation.Server.Api;
16 using Wangkanai.Detection;
17 
19 {
23  [Route(Routes.Root)]
24  public sealed class HomeController : ApiController
25  {
30 
35 
40 
45 
50 
54  readonly IBrowserResolver browserResolver;
55 
60 
74  public HomeController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ITokenFactory tokenFactory, ISystemIdentityFactory systemIdentityFactory, ICryptographySuite cryptographySuite, IApplication application, IIdentityCache identityCache, IBrowserResolver browserResolver, IOptions<ControlPanelConfiguration> controlPanelConfigurationOptions, ILogger<HomeController> logger) : base(databaseContext, authenticationContextFactory, logger, false, false)
75  {
76  this.tokenFactory = tokenFactory ?? throw new ArgumentNullException(nameof(tokenFactory));
77  this.systemIdentityFactory = systemIdentityFactory ?? throw new ArgumentNullException(nameof(systemIdentityFactory));
78  this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
79  this.application = application ?? throw new ArgumentNullException(nameof(application));
80  this.identityCache = identityCache ?? throw new ArgumentNullException(nameof(identityCache));
81  this.browserResolver = browserResolver ?? throw new ArgumentNullException(nameof(browserResolver));
82  controlPanelConfiguration = controlPanelConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(controlPanelConfigurationOptions));
83  }
84 
89  [TgsAuthorize]
90  [AllowAnonymous]
91  [HttpGet]
92  public IActionResult Home()
93  {
94  if (AuthenticationContext != null)
95  return Json(new Api.Models.ServerInformation
96  {
97  Version = application.Version,
98  ApiVersion = ApiHeaders.Version
99  });
100 
101  // if we are using a browser and the control panel, soft redirect to the app page
102  if (controlPanelConfiguration.Enable && browserResolver.Browser.Type != BrowserType.Generic)
103  {
104  Logger.LogDebug("Unauthorized browser request (User-Agent: \"{0}\"), loading control panel...", browserResolver.UserAgent);
105  return File("~/index.html", MediaTypeNames.Text.Html);
106  }
107 
108  return Unauthorized();
109  }
110 
116  [HttpPost]
117  #pragma warning disable CA1506 // TODO: Decomplexify
118  public async Task<IActionResult> CreateToken(CancellationToken cancellationToken)
119  {
120  if (ApiHeaders == null)
121  return BadRequest(new Api.Models.ErrorMessage { Message = "Missing API headers!" });
122 
124  return BadRequest(new Api.Models.ErrorMessage { Message = "Cannot create a token using another token!" });
125 
126  ISystemIdentity systemIdentity;
127  try
128  {
129  // trust the system over the database because a user's name can change while still having the same SID
130  systemIdentity = await systemIdentityFactory.CreateSystemIdentity(ApiHeaders.Username, ApiHeaders.Password, cancellationToken).ConfigureAwait(false);
131  }
132  catch (NotImplementedException)
133  {
134  systemIdentity = null;
135  }
136 
137  using (systemIdentity)
138  {
139  IQueryable<User> query;
140  if (systemIdentity == null)
141  query = DatabaseContext.Users.Where(x => x.CanonicalName == ApiHeaders.Username.ToUpperInvariant());
142  else
143  query = DatabaseContext.Users.Where(x => x.SystemIdentifier == systemIdentity.Uid);
144  var user = await query.Select(x => new User
145  {
146  Id = x.Id,
147  PasswordHash = x.PasswordHash,
148  Enabled = x.Enabled,
149  Name = x.Name
150  }).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
151 
152  if (user == null)
153  return Unauthorized();
154 
155  if (systemIdentity == null)
156  {
157  var originalHash = user.PasswordHash;
159  return Unauthorized();
160  if (user.PasswordHash != originalHash)
161  {
162  Logger.LogDebug("User ID {0}'s password hash needs a refresh, updating database.", user.Id);
163  var updatedUser = new User
164  {
165  Id = user.Id
166  };
167  DatabaseContext.Users.Attach(updatedUser);
168  updatedUser.PasswordHash = user.PasswordHash;
169  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
170  }
171  }
172 
173  // check if the name changed and updoot accordingly
174  else if (systemIdentity.Username != user.Name)
175  {
176  Logger.LogDebug("User ID {0}'s system identity needs a refresh, updating database.", user.Id);
177  DatabaseContext.Users.Attach(user);
178  user.Name = systemIdentity.Username;
179  user.CanonicalName = user.Name.ToUpperInvariant();
180  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
181  }
182 
183  // Now that the bookeeping is done, tell them to fuck off if necessary
184  if (!user.Enabled.Value)
185  return Forbid();
186 
187  var token = await tokenFactory.CreateToken(user, cancellationToken).ConfigureAwait(false);
188  if (systemIdentity != null)
189  {
190  // expire the identity slightly after the auth token in case of lag
191  var identExpiry = token.ExpiresAt.Value;
192  identExpiry += tokenFactory.ValidationParameters.ClockSkew;
193  identExpiry += TimeSpan.FromSeconds(15);
194  identityCache.CacheSystemIdentity(user, systemIdentity, identExpiry);
195  }
196 
197  Logger.LogDebug("Successfully logged in user {0}!", user.Id);
198 
199  return Json(token);
200  }
201  }
202  #pragma warning restore CA1506
203  }
204 }
+ + +
async Task< IActionResult > CreateToken(CancellationToken cancellationToken)
Attempt to authenticate a User using ApiController.ApiHeaders
+ +
bool CheckUserPassword(User user, string password)
Checks a given password matches a given user 's User.PasswordHash. This may result in User....
+ +
Task< ISystemIdentity > CreateSystemIdentity(User user, CancellationToken cancellationToken)
Create a ISystemIdentity for a given user
+
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+
Task< Token > CreateToken(Models.User user, CancellationToken cancellationToken)
Create a Token for a given user
+ +
Represents a user on the current System.Runtime.InteropServices.OSPlatform
+ + +
IActionResult Home()
Main page of the Application
+
string Username
The client's username
Definition: ApiHeaders.cs:86
+
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
HomeController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ITokenFactory tokenFactory, ISystemIdentityFactory systemIdentityFactory, ICryptographySuite cryptographySuite, IApplication application, IIdentityCache identityCache, IBrowserResolver browserResolver, IOptions< ControlPanelConfiguration > controlPanelConfigurationOptions, ILogger< HomeController > logger)
Construct a HomeController
+
Contains various cryptographic functions
+
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the HomeController
+
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
readonly ControlPanelConfiguration controlPanelConfiguration
The ControlPanelConfiguration for the HomeController
+ +
string Password
The client's password
Definition: ApiHeaders.cs:91
+
readonly IApplication application
The IApplication for the HomeController
+ +
Routes to a server actions
Definition: Routes.cs:9
+
Main ApiController for the Application
+ + +
readonly IIdentityCache identityCache
The IIdentityCache for the HomeController
+ + +
bool IsTokenAuthentication
If the header uses password or JWT authentication
Definition: ApiHeaders.cs:96
+ +
const string Root
The root controller
Definition: Routes.cs:14
+ + +
TokenValidationParameters ValidationParameters
The TokenValidationParameters for the ITokenFactory
+
long Id
The ID of the User
Definition: User.cs:15
+
ILogger Logger
The ILogger for the ApiController
+ + +
readonly IBrowserResolver browserResolver
The IBrowserResolver for the HomeController
+
void CacheSystemIdentity(User user, ISystemIdentity systemIdentity, DateTimeOffset expiry)
Keep a user 's systemIdentity alive until an expiry time
+
readonly ISystemIdentityFactory systemIdentityFactory
The ISystemIdentityFactory for the HomeController
+ +
readonly ITokenFactory tokenFactory
The ITokenFactory for the HomeController
+
string Uid
A unique identifier for the user
+ + +
+ + + + diff --git a/_http_client_8cs.html b/_http_client_8cs.html new file mode 100644 index 0000000000..20b5343bff --- /dev/null +++ b/_http_client_8cs.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/HttpClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
HttpClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Client.HttpClient
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_http_client_8cs_source.html b/_http_client_8cs_source.html new file mode 100644 index 0000000000..cf08b2136c --- /dev/null +++ b/_http_client_8cs_source.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/HttpClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
HttpClient.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Net.Http;
3 using System.Threading;
4 using System.Threading.Tasks;
5 
7 {
9  sealed class HttpClient : IHttpClient
10  {
12  public TimeSpan Timeout
13  {
14  get => httpClient.Timeout;
15  set => httpClient.Timeout = value;
16  }
17 
21  readonly System.Net.Http.HttpClient httpClient;
22 
26  public HttpClient()
27  {
28  httpClient = new System.Net.Http.HttpClient();
29  }
30 
32  public void Dispose() => httpClient.Dispose();
33 
35  public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) => httpClient.SendAsync(request, cancellationToken);
36  }
37 }
+ +
readonly System.Net.Http.HttpClient httpClient
The real System.Net.Http.HttpClient
Definition: HttpClient.cs:21
+
For sending HTTP requests
Definition: IHttpClient.cs:11
+ +
HttpClient()
Construct an HttpClient
Definition: HttpClient.cs:26
+ +
Task< HttpResponseMessage > SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
Send an HTTP request
+
+ + + + diff --git a/_i_administration_client_8cs.html b/_i_administration_client_8cs.html new file mode 100644 index 0000000000..847bfa835d --- /dev/null +++ b/_i_administration_client_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/IAdministrationClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IAdministrationClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Client.IAdministrationClient
 For managing server administration More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_i_administration_client_8cs_source.html b/_i_administration_client_8cs_source.html new file mode 100644 index 0000000000..ac1a32ceda --- /dev/null +++ b/_i_administration_client_8cs_source.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/IAdministrationClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IAdministrationClient.cs
+
+
+Go to the documentation of this file.
1 using System.Threading;
2 using System.Threading.Tasks;
4 
6 {
10  public interface IAdministrationClient
11  {
17  Task<Administration> Read(CancellationToken cancellationToken);
18 
25  Task Update(Administration administration, CancellationToken cancellationToken);
26 
32  Task Restart(CancellationToken cancellationToken);
33  }
34 }
Task Restart(CancellationToken cancellationToken)
Restarts the TGS server
+ + + + +
Represents administrative server information
+
Task< Administration > Read(CancellationToken cancellationToken)
Get the Administration represented by the IAdministrationClient
+ +
Task Update(Administration administration, CancellationToken cancellationToken)
Updates the Administration setttings
+ +
+ + + + diff --git a/_i_api_client_8cs.html b/_i_api_client_8cs.html new file mode 100644 index 0000000000..cb9037ce0e --- /dev/null +++ b/_i_api_client_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/IApiClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IApiClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Client.IApiClient
 Web interface for the API More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_i_api_client_8cs_source.html b/_i_api_client_8cs_source.html new file mode 100644 index 0000000000..fc150f8646 --- /dev/null +++ b/_i_api_client_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/IApiClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IApiClient.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4 using Tgstation.Server.Api;
5 
7 {
11  interface IApiClient : IDisposable
12  {
16  ApiHeaders Headers { get; set; }
17 
21  Uri Url { get; }
22 
26  TimeSpan Timeout { get; set; }
27 
32  void AddRequestLogger(IRequestLogger requestLogger);
33 
43  Task<TResult> Create<TBody, TResult>(string route, TBody body, CancellationToken cancellationToken);
44 
52  Task<TResult> Create<TResult>(string route, CancellationToken cancellationToken);
53 
61  Task<TResult> Read<TResult>(string route, CancellationToken cancellationToken);
62 
72  Task<TResult> Update<TBody, TResult>(string route, TBody body, CancellationToken cancellationToken);
73 
81  Task<TResult> Update<TResult>(string route, CancellationToken cancellationToken);
82 
91  Task Update<TBody>(string route, TBody body, CancellationToken cancellationToken);
92 
99  Task Delete(string route, CancellationToken cancellationToken);
100 
111  Task<TResult> Create<TBody, TResult>(string route, TBody body, long instanceId, CancellationToken cancellationToken);
112 
121  Task<TResult> Create<TResult>(string route, long instanceId, CancellationToken cancellationToken);
122 
131  Task<TResult> Patch<TResult>(string route, long instanceId, CancellationToken cancellationToken);
132 
141  Task<TResult> Read<TResult>(string route, long instanceId, CancellationToken cancellationToken);
142 
153  Task<TResult> Update<TBody, TResult>(string route, TBody body, long instanceId, CancellationToken cancellationToken);
154 
162  Task Delete(string route, long instanceId, CancellationToken cancellationToken);
163 
173  Task Delete<TBody>(string route, TBody body, long instanceId, CancellationToken cancellationToken);
174 
183  Task<TResult> Delete<TResult>(string route, long instanceId, CancellationToken cancellationToken);
184  }
185 }
ApiHeaders Headers
The ApiHeaders the IApiClient uses
Definition: IApiClient.cs:16
+ + +
TimeSpan Timeout
The request timeout
Definition: IApiClient.cs:26
+
Task Delete< TBody >(string route, TBody body, long instanceId, CancellationToken cancellationToken)
Run an HTTP DELETE request
+
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
Task< TResult > Patch< TResult >(string route, long instanceId, CancellationToken cancellationToken)
Run an HTTP PATCH request
+
Task< TResult > Create< TResult >(string route, CancellationToken cancellationToken)
Run an HTTP PUT request
+
Task Update< TBody >(string route, TBody body, CancellationToken cancellationToken)
Run an HTTP POST request
+
Task< TResult > Delete< TResult >(string route, long instanceId, CancellationToken cancellationToken)
Run an HTTP DELETE request
+
Task< TResult > Read< TResult >(string route, CancellationToken cancellationToken)
Run an HTTP GET request
+
Task< TResult > Create< TBody, TResult >(string route, TBody body, CancellationToken cancellationToken)
Run an HTTP PUT request
+
For logging HTTP requests and responses
+
Task Delete(string route, CancellationToken cancellationToken)
Run an HTTP DELETE request
+
Task< TResult > Update< TBody, TResult >(string route, TBody body, CancellationToken cancellationToken)
Run an HTTP POST request
+
Uri Url
The Uri pointing the tgstation-server
Definition: IApiClient.cs:21
+
void AddRequestLogger(IRequestLogger requestLogger)
Adds a requestLogger to the request pipeline
+ +
Task< TResult > Update< TResult >(string route, CancellationToken cancellationToken)
Run an HTTP POST request
+ +
Web interface for the API
Definition: IApiClient.cs:11
+ +
+ + + + diff --git a/_i_api_client_factory_8cs.html b/_i_api_client_factory_8cs.html new file mode 100644 index 0000000000..a91e8e5696 --- /dev/null +++ b/_i_api_client_factory_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/IApiClientFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IApiClientFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Client.IApiClientFactory
 For creating IApiClients More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_i_api_client_factory_8cs_source.html b/_i_api_client_factory_8cs_source.html new file mode 100644 index 0000000000..7b0a00e287 --- /dev/null +++ b/_i_api_client_factory_8cs_source.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/IApiClientFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IApiClientFactory.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using Tgstation.Server.Api;
3 
5 {
9  interface IApiClientFactory
10  {
17  IApiClient CreateApiClient(Uri url, ApiHeaders apiHeaders);
18  }
19 }
+ +
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
IApiClient CreateApiClient(Uri url, ApiHeaders apiHeaders)
Create an IApiClient
+ +
Web interface for the API
Definition: IApiClient.cs:11
+ + +
+ + + + diff --git a/_i_application_8cs.html b/_i_application_8cs.html new file mode 100644 index 0000000000..51ce4cdef9 --- /dev/null +++ b/_i_application_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IApplication.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IApplication.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Core.IApplication
 Configures the ASP.NET Core web application More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_i_application_8cs_source.html b/_i_application_8cs_source.html new file mode 100644 index 0000000000..c9ccab6d79 --- /dev/null +++ b/_i_application_8cs_source.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IApplication.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IApplication.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
8  public interface IApplication
9  {
13  string VersionPrefix { get; }
14 
18  string VersionString { get; }
19 
23  Version Version { get; }
24 
29  void Ready(Exception initializationError);
30  }
31 }
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+
string VersionPrefix
Prefix to VersionString
Definition: IApplication.cs:13
+ +
void Ready(Exception initializationError)
Mark the IApplication as ready to run
+
string VersionString
A more verbose version of Version
Definition: IApplication.cs:18
+
Version Version
The version of the Application
Definition: IApplication.cs:23
+
+ + + + diff --git a/_i_async_delayer_8cs.html b/_i_async_delayer_8cs.html new file mode 100644 index 0000000000..6769b7d56d --- /dev/null +++ b/_i_async_delayer_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IAsyncDelayer.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IAsyncDelayer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Core.IAsyncDelayer
 For waiting asynchronously More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_i_async_delayer_8cs_source.html b/_i_async_delayer_8cs_source.html new file mode 100644 index 0000000000..2bcc3c5791 --- /dev/null +++ b/_i_async_delayer_8cs_source.html @@ -0,0 +1,85 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IAsyncDelayer.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IAsyncDelayer.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4 
6 {
10  interface IAsyncDelayer
11  {
18  Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken);
19  }
20 }
+ +
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+
+ + + + diff --git a/_i_authentication_context_8cs.html b/_i_authentication_context_8cs.html new file mode 100644 index 0000000000..cdc4f363e5 --- /dev/null +++ b/_i_authentication_context_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/IAuthenticationContext.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IAuthenticationContext.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Security.IAuthenticationContext
 Represents the currently authenticated Api.Models.User More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Security
 
+
+ + + + diff --git a/_i_authentication_context_8cs_source.html b/_i_authentication_context_8cs_source.html new file mode 100644 index 0000000000..d1bf62dd1f --- /dev/null +++ b/_i_authentication_context_8cs_source.html @@ -0,0 +1,97 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/IAuthenticationContext.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IAuthenticationContext.cs
+
+
+Go to the documentation of this file.
1 using System;
4 
6 {
11  {
15  User User { get; }
16 
21 
27  ulong GetRight(RightsType rightsType);
28 
33  }
34 }
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+ +
Represents a user on the current System.Runtime.InteropServices.OSPlatform
+ +
Represents the currently authenticated Api.Models.User
+
ISystemIdentity SystemIdentity
The ISystemIdentity of User if applicable
+ + + + + + + + +
+ + + + diff --git a/_i_authentication_context_factory_8cs.html b/_i_authentication_context_factory_8cs.html new file mode 100644 index 0000000000..a5b8c76bcf --- /dev/null +++ b/_i_authentication_context_factory_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/IAuthenticationContextFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IAuthenticationContextFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Security.IAuthenticationContextFactory
 For creating and accessing authentication contexts More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Security
 
+
+ + + + diff --git a/_i_authentication_context_factory_8cs_source.html b/_i_authentication_context_factory_8cs_source.html new file mode 100644 index 0000000000..0ba456cda9 --- /dev/null +++ b/_i_authentication_context_factory_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/IAuthenticationContextFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IAuthenticationContextFactory.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4 
6 {
11  {
16 
25  Task CreateAuthenticationContext(long userId, long? instanceId, DateTimeOffset validAfter, CancellationToken cancellationToken);
26  }
27 }
+
Task CreateAuthenticationContext(long userId, long? instanceId, DateTimeOffset validAfter, CancellationToken cancellationToken)
Create an IAuthenticationContext to populate CurrentAuthenticationContext
+
Represents the currently authenticated Api.Models.User
+ +
IAuthenticationContext CurrentAuthenticationContext
The IAuthenticationContext the IAuthenticationContextFactory created
+
+ + + + diff --git a/_i_byond_client_8cs.html b/_i_byond_client_8cs.html new file mode 100644 index 0000000000..41e85e5d83 --- /dev/null +++ b/_i_byond_client_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/IByondClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IByondClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Client.Components.IByondClient
 For managing the Byond installation More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
namespace  Tgstation.Server.Client.Components
 
+
+ + + + diff --git a/_i_byond_client_8cs_source.html b/_i_byond_client_8cs_source.html new file mode 100644 index 0000000000..6ad789c69f --- /dev/null +++ b/_i_byond_client_8cs_source.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/IByondClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IByondClient.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 using System.Threading;
3 using System.Threading.Tasks;
5 
7 {
11  public interface IByondClient
12  {
18  Task<Byond> ActiveVersion(CancellationToken cancellationToken);
19 
25  Task<IReadOnlyList<Byond>> InstalledVersions(CancellationToken cancellationToken);
26 
33  Task<Byond> SetActiveVersion(Byond byond, CancellationToken cancellationToken);
34  }
35 }
+
For managing the Byond installation
Definition: IByondClient.cs:11
+
Task< IReadOnlyList< Byond > > InstalledVersions(CancellationToken cancellationToken)
Get all installed Byond System.Versions
+ + +
Task< Byond > ActiveVersion(CancellationToken cancellationToken)
Get the Byond active System.Version information
+
Task< Byond > SetActiveVersion(Byond byond, CancellationToken cancellationToken)
Updates the Byond information
+
Represents a BYOND installation
Definition: Byond.cs:8
+ + +
+ + + + diff --git a/_i_byond_executable_lock_8cs.html b/_i_byond_executable_lock_8cs.html new file mode 100644 index 0000000000..8aaf1983cb --- /dev/null +++ b/_i_byond_executable_lock_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Byond/IByondExecutableLock.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IByondExecutableLock.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Byond.IByondExecutableLock
 Represents usage of the two primary BYOND server executables More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Byond
 
+
+ + + + diff --git a/_i_byond_executable_lock_8cs_source.html b/_i_byond_executable_lock_8cs_source.html new file mode 100644 index 0000000000..99087f77b3 --- /dev/null +++ b/_i_byond_executable_lock_8cs_source.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Byond/IByondExecutableLock.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IByondExecutableLock.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
8  public interface IByondExecutableLock : IDisposable
9  {
13  Version Version { get; }
14 
18  string DreamDaemonPath { get; }
19 
23  string DreamMakerPath { get; }
24 
29  }
30 }
+
string DreamMakerPath
The path to the dm/DreamMaker executable
+
Represents usage of the two primary BYOND server executables
+
string DreamDaemonPath
The path to the DreamDaemon executable
+
void DoNotDeleteThisSession()
Call if, during a detach, this version should not be deleted
+ +
Version Version
The System.Version of the locked executables
+
+ + + + diff --git a/_i_byond_installer_8cs.html b/_i_byond_installer_8cs.html new file mode 100644 index 0000000000..1891e5203a --- /dev/null +++ b/_i_byond_installer_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Byond/IByondInstaller.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IByondInstaller.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Byond.IByondInstaller
 For downloading and installing BYOND extractions for a given system More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Byond
 
+
+ + + + diff --git a/_i_byond_installer_8cs_source.html b/_i_byond_installer_8cs_source.html new file mode 100644 index 0000000000..edb4a1facb --- /dev/null +++ b/_i_byond_installer_8cs_source.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Byond/IByondInstaller.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IByondInstaller.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4 
6 {
10  interface IByondInstaller
11  {
15  string DreamDaemonName { get; }
16 
20  string DreamMakerName { get; }
21 
28  Task<byte[]> DownloadVersion(Version version, CancellationToken cancellationToken);
29 
37  Task InstallByond(string path, Version version, CancellationToken cancellationToken);
38 
44  Task CleanCache(CancellationToken cancellationToken);
45  }
46 }
string DreamMakerName
Get the file name of the DreamMaker executable
+
Task< byte[]> DownloadVersion(Version version, CancellationToken cancellationToken)
Download a given BYOND version
+ +
Task InstallByond(string path, Version version, CancellationToken cancellationToken)
Does actions necessary to get an extracted BYOND installation working
+
For downloading and installing BYOND extractions for a given system
+
Task CleanCache(CancellationToken cancellationToken)
Attempts to cleans the BYOND cache folder for the system
+
string DreamDaemonName
Get the file name of the DreamDaemon executable
+
+ + + + diff --git a/_i_byond_manager_8cs.html b/_i_byond_manager_8cs.html new file mode 100644 index 0000000000..ac51ae2c2e --- /dev/null +++ b/_i_byond_manager_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Byond/IByondManager.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IByondManager.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Byond.IByondManager
 For managing the BYOND installation More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Byond
 
+
+ + + + diff --git a/_i_byond_manager_8cs_source.html b/_i_byond_manager_8cs_source.html new file mode 100644 index 0000000000..4b3dd6a0f4 --- /dev/null +++ b/_i_byond_manager_8cs_source.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Byond/IByondManager.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IByondManager.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Hosting;
2 using System;
3 using System.Collections.Generic;
4 using System.Threading;
5 using System.Threading.Tasks;
6 
8 {
13  {
17  Version ActiveVersion { get; }
18 
22  IReadOnlyList<Version> InstalledVersions { get; }
23 
30  Task ChangeVersion(Version version, CancellationToken cancellationToken);
31 
38  Task<IByondExecutableLock> UseExecutables(Version requiredVersion, CancellationToken cancellationToken);
39  }
40 }
+
Version ActiveVersion
The currently active BYOND version
+
Task ChangeVersion(Version version, CancellationToken cancellationToken)
Change the active BYOND version
+ +
IReadOnlyList< Version > InstalledVersions
The installed BYOND versions
+ +
Task< IByondExecutableLock > UseExecutables(Version requiredVersion, CancellationToken cancellationToken)
Lock the current installation's location and return a IByondExecutableLock
+ +
+ + + + diff --git a/_i_chat_8cs.html b/_i_chat_8cs.html new file mode 100644 index 0000000000..9f1102f41b --- /dev/null +++ b/_i_chat_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/IChat.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IChat.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Chat.IChat
 For managing connected chat services More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
+
+ + + + diff --git a/_i_chat_8cs_source.html b/_i_chat_8cs_source.html new file mode 100644 index 0000000000..7f3bd1f57f --- /dev/null +++ b/_i_chat_8cs_source.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/IChat.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IChat.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Hosting;
2 using System;
3 using System.Collections.Generic;
4 using System.Threading;
5 using System.Threading.Tasks;
7 
9 {
13  public interface IChat : IHostedService, IDisposable
14  {
20  bool Connected(long connectionId);
21 
26  void RegisterCommandHandler(ICustomCommandHandler customCommandHandler);
27 
34  Task ChangeSettings(ChatBot newSettings, CancellationToken cancellationToken);
35 
42  Task DeleteConnection(long connectionId, CancellationToken cancellationToken);
43 
51  Task ChangeChannels(long connectionId, IEnumerable<Api.Models.ChatChannel> newChannels, CancellationToken cancellationToken);
52 
60  Task SendMessage(string message, IEnumerable<ulong> channelIds, CancellationToken cancellationToken);
61 
68  Task SendWatchdogMessage(string message, CancellationToken cancellationToken);
69 
76  Task SendUpdateMessage(string message, CancellationToken cancellationToken);
77 
86  Task<IJsonTrackingContext> TrackJsons(string basePath, string channelsJsonName, string commandsJsonName, CancellationToken cancellationToken);
87  }
88 }
+
void RegisterCommandHandler(ICustomCommandHandler customCommandHandler)
Registers a customCommandHandler to use
+ +
Task SendUpdateMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured update channels
+
Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured watchdog channels
+
Task ChangeSettings(ChatBot newSettings, CancellationToken cancellationToken)
Change chat settings. If the ChatBot.Id is not currently in use, a new connection will be made instea...
+
Manage the server chat bots
Definition: ChatBot.cs:9
+
For managing connected chat services
Definition: IChat.cs:13
+ +
Task< IJsonTrackingContext > TrackJsons(string basePath, string channelsJsonName, string commandsJsonName, CancellationToken cancellationToken)
Start tracking json files for commands and channels
+ +
Task ChangeChannels(long connectionId, IEnumerable< Api.Models.ChatChannel > newChannels, CancellationToken cancellationToken)
Change chat channels
+
bool Connected(long connectionId)
If a given set of ChatBot is connected
+
Task DeleteConnection(long connectionId, CancellationToken cancellationToken)
Disconnects and deletes a given connection
+
Task SendMessage(string message, IEnumerable< ulong > channelIds, CancellationToken cancellationToken)
Send a chat message to a given set of channelIds
+
Handles Commands.ICommands that map to those defined in a IJsonTrackingContext
+ + + + +
+ + + + diff --git a/_i_chat_bots_client_8cs.html b/_i_chat_bots_client_8cs.html new file mode 100644 index 0000000000..ba2b25170b --- /dev/null +++ b/_i_chat_bots_client_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/IChatBotsClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IChatBotsClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Client.Components.IChatBotsClient
 For managing the chat bots More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
namespace  Tgstation.Server.Client.Components
 
+
+ + + + diff --git a/_i_chat_bots_client_8cs_source.html b/_i_chat_bots_client_8cs_source.html new file mode 100644 index 0000000000..a6a599631a --- /dev/null +++ b/_i_chat_bots_client_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/IChatBotsClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IChatBotsClient.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 using System.Threading;
3 using System.Threading.Tasks;
5 
7 {
11  public interface IChatBotsClient
12  {
18  Task<IReadOnlyList<ChatBot>> List(CancellationToken cancellationToken);
19 
26  Task<ChatBot> Create(ChatBot settings, CancellationToken cancellationToken);
27 
34  Task<ChatBot> Update(ChatBot settings, CancellationToken cancellationToken);
35 
42  Task<ChatBot> GetId(ChatBot settings, CancellationToken cancellationToken);
43 
50  Task Delete(ChatBot settings, CancellationToken cancellationToken);
51  }
52 }
+ + +
Task< ChatBot > Update(ChatBot settings, CancellationToken cancellationToken)
Updates a ChatBot's setttings
+ + +
Task Delete(ChatBot settings, CancellationToken cancellationToken)
Delete a ChatBot
+
Task< ChatBot > Create(ChatBot settings, CancellationToken cancellationToken)
Create a ChatBot
+ +
Task< IReadOnlyList< ChatBot > > List(CancellationToken cancellationToken)
List the ChatBots
+
Task< ChatBot > GetId(ChatBot settings, CancellationToken cancellationToken)
Get a ChatBot's setttings
+ +
+ + + + diff --git a/_i_chat_factory_8cs.html b/_i_chat_factory_8cs.html new file mode 100644 index 0000000000..db6f304939 --- /dev/null +++ b/_i_chat_factory_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/IChatFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IChatFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Chat.IChatFactory
 For creating IChats More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
+
+ + + + diff --git a/_i_chat_factory_8cs_source.html b/_i_chat_factory_8cs_source.html new file mode 100644 index 0000000000..e16fed2c9b --- /dev/null +++ b/_i_chat_factory_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/IChatFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IChatFactory.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
3 using Tgstation.Server.Host.IO;
4 
6 {
10  interface IChatFactory
11  {
19  IChat CreateChat(IIOManager ioManager, ICommandFactory commandFactory, IEnumerable<Models.ChatBot> initialChatBots);
20  }
21 }
+
IChat CreateChat(IIOManager ioManager, ICommandFactory commandFactory, IEnumerable< Models.ChatBot > initialChatBots)
Create a IChat
+ +
For managing connected chat services
Definition: IChat.cs:13
+ + + + +
Interface for using filesystems
Definition: IIOManager.cs:11
+ + + +
+ + + + diff --git a/_i_claims_injector_8cs.html b/_i_claims_injector_8cs.html new file mode 100644 index 0000000000..3705a7ef95 --- /dev/null +++ b/_i_claims_injector_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/IClaimsInjector.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IClaimsInjector.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Security.IClaimsInjector
 For injecting System.Security.Claims.Claims that Controllers.TgsAuthorizeAttribute can look for More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Security
 
+
+ + + + diff --git a/_i_claims_injector_8cs_source.html b/_i_claims_injector_8cs_source.html new file mode 100644 index 0000000000..40bbf40a83 --- /dev/null +++ b/_i_claims_injector_8cs_source.html @@ -0,0 +1,85 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/IClaimsInjector.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IClaimsInjector.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Authentication.JwtBearer;
2 using System.Threading;
3 using System.Threading.Tasks;
4 
6 {
10  interface IClaimsInjector
11  {
18  Task InjectClaimsIntoContext(TokenValidatedContext tokenValidatedContext, CancellationToken cancellationToken);
19  }
20 }
Task InjectClaimsIntoContext(TokenValidatedContext tokenValidatedContext, CancellationToken cancellationToken)
Setup the System.Security.Claims.Claims for a given tokenValidatedContext
+ +
For injecting System.Security.Claims.Claims that Controllers.TgsAuthorizeAttribute can look for
+
+ + + + diff --git a/_i_comm_context_8cs.html b/_i_comm_context_8cs.html new file mode 100644 index 0000000000..45f928c6e6 --- /dev/null +++ b/_i_comm_context_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/ICommContext.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ICommContext.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Interop.ICommContext
 Represents a registration of an interop session More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Interop
 
+
+ + + + diff --git a/_i_comm_context_8cs_source.html b/_i_comm_context_8cs_source.html new file mode 100644 index 0000000000..f058970ec5 --- /dev/null +++ b/_i_comm_context_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/ICommContext.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ICommContext.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
9  {
14  void RegisterHandler(ICommHandler handler);
15  }
16 }
Represents a registration of an interop session
Definition: ICommContext.cs:8
+
void RegisterHandler(ICommHandler handler)
Register a handler with the ICommContext
+ + + +
+ + + + diff --git a/_i_comm_handler_8cs.html b/_i_comm_handler_8cs.html new file mode 100644 index 0000000000..bd7e4c827e --- /dev/null +++ b/_i_comm_handler_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/ICommHandler.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ICommHandler.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Interop.ICommHandler
 Handles CommCommands More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Interop
 
+
+ + + + diff --git a/_i_comm_handler_8cs_source.html b/_i_comm_handler_8cs_source.html new file mode 100644 index 0000000000..eccca6e1f9 --- /dev/null +++ b/_i_comm_handler_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/ICommHandler.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ICommHandler.cs
+
+
+Go to the documentation of this file.
1 using System.Threading;
2 using System.Threading.Tasks;
3 
5 {
9  interface ICommHandler
10  {
17  Task HandleInterop(CommCommand command, CancellationToken cancellationToken);
18  }
19 }
Task HandleInterop(CommCommand command, CancellationToken cancellationToken)
Handle a command
+ + + +
+ + + + diff --git a/_i_command_8cs.html b/_i_command_8cs.html new file mode 100644 index 0000000000..680171a083 --- /dev/null +++ b/_i_command_8cs.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands/ICommand.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ICommand.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Chat.Commands.ICommand
 Represents a command that can be invoked by talking to chat bots More...
 
+ + + + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
namespace  Tgstation.Server.Host.Components.Chat.Commands
 
+
+ + + + diff --git a/_i_command_8cs_source.html b/_i_command_8cs_source.html new file mode 100644 index 0000000000..798187232b --- /dev/null +++ b/_i_command_8cs_source.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands/ICommand.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ICommand.cs
+
+
+Go to the documentation of this file.
1 using System.Threading;
2 using System.Threading.Tasks;
3 
5 {
9  public interface ICommand
10  {
14  string Name { get; }
15 
19  string HelpText { get; }
20 
24  bool AdminOnly { get; }
25 
33  Task<string> Invoke(string arguments, User user, CancellationToken cancellationToken);
34  }
35 }
Task< string > Invoke(string arguments, User user, CancellationToken cancellationToken)
Invoke the ICommand
+
bool AdminOnly
If the command should only be available to Users who's User.Channel has Channel.IsAdminChannel set
Definition: ICommand.cs:24
+ +
Represents a tgs_chat_user datum
Definition: User.cs:10
+
string Name
The text to invoke the command. May not be "?" or "help" (case-insensitive)
Definition: ICommand.cs:14
+
Represents a command that can be invoked by talking to chat bots
Definition: ICommand.cs:9
+
string HelpText
The help text to display when queires are made about the command
Definition: ICommand.cs:19
+
+ + + + diff --git a/_i_command_factory_8cs.html b/_i_command_factory_8cs.html new file mode 100644 index 0000000000..e01d5cfe3d --- /dev/null +++ b/_i_command_factory_8cs.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands/ICommandFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ICommandFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Chat.Commands.ICommandFactory
 Factory for built in ICommands More...
 
+ + + + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
namespace  Tgstation.Server.Host.Components.Chat.Commands
 
+
+ + + + diff --git a/_i_command_factory_8cs_source.html b/_i_command_factory_8cs_source.html new file mode 100644 index 0000000000..808df8769d --- /dev/null +++ b/_i_command_factory_8cs_source.html @@ -0,0 +1,85 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands/ICommandFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ICommandFactory.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 
4 {
8  interface ICommandFactory
9  {
14  IReadOnlyList<ICommand> GenerateCommands();
15  }
16 }
+
IReadOnlyList< ICommand > GenerateCommands()
Generate builtin ICommands
+ +
+ + + + diff --git a/_i_compile_job_consumer_8cs.html b/_i_compile_job_consumer_8cs.html new file mode 100644 index 0000000000..7b05f13190 --- /dev/null +++ b/_i_compile_job_consumer_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Compiler/ICompileJobConsumer.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ICompileJobConsumer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Compiler.ICompileJobConsumer
 Sink for CompileJobs More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Compiler
 
+
+ + + + diff --git a/_i_compile_job_consumer_8cs_source.html b/_i_compile_job_consumer_8cs_source.html new file mode 100644 index 0000000000..a45da3cbfd --- /dev/null +++ b/_i_compile_job_consumer_8cs_source.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Compiler/ICompileJobConsumer.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ICompileJobConsumer.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Hosting;
2 using System;
3 using System.Threading;
4 using System.Threading.Tasks;
6 
8 {
13  {
20  Task LoadCompileJob(CompileJob job, CancellationToken cancellationToken);
21  }
22 }
Task LoadCompileJob(CompileJob job, CancellationToken cancellationToken)
Load a new job into the ICompileJobConsumer
+ + + + + + + + + +
+ + + + diff --git a/_i_configuration_8cs.html b/_i_configuration_8cs.html new file mode 100644 index 0000000000..4bef0bfc76 --- /dev/null +++ b/_i_configuration_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/StaticFiles/IConfiguration.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IConfiguration.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.StaticFiles.IConfiguration
 For managing the Configuration directory More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.StaticFiles
 
+
+ + + + diff --git a/_i_configuration_8cs_source.html b/_i_configuration_8cs_source.html new file mode 100644 index 0000000000..270b73e490 --- /dev/null +++ b/_i_configuration_8cs_source.html @@ -0,0 +1,101 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/StaticFiles/IConfiguration.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IConfiguration.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Hosting;
2 using System;
3 using System.Collections.Generic;
4 using System.Threading;
5 using System.Threading.Tasks;
8 
10 {
15  {
23  Task<ServerSideModifications> CopyDMFilesTo(string dmeFile, string destination, CancellationToken cancellationToken);
24 
31  Task SymlinkStaticFilesTo(string destination, CancellationToken cancellationToken);
32 
40  Task<IReadOnlyList<ConfigurationFile>> ListDirectory(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken);
41 
49  Task<ConfigurationFile> Read(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken);
50 
58  Task<bool> CreateDirectory(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken);
59 
67  Task<bool> DeleteDirectory(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken);
68 
78  Task<ConfigurationFile> Write(string configurationRelativePath, ISystemIdentity systemIdentity, byte[] data, string previousHash, CancellationToken cancellationToken);
79  }
80 }
Consumes EventTypes and takes the appropriate actions
+ +
Represents a user on the current System.Runtime.InteropServices.OSPlatform
+ +
Task< ConfigurationFile > Write(string configurationRelativePath, ISystemIdentity systemIdentity, byte[] data, string previousHash, CancellationToken cancellationToken)
Writes to a given configurationRelativePath
+
Task< bool > DeleteDirectory(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
Attempt to delete an empty directory at configurationRelativePath
+
Task< bool > CreateDirectory(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
Create an empty directory at configurationRelativePath
+ + +
Task< ServerSideModifications > CopyDMFilesTo(string dmeFile, string destination, CancellationToken cancellationToken)
Copies all files in the CodeModifications directory to destination
+ + +
Task< ConfigurationFile > Read(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
Reads a given configurationRelativePath
+ + +
Task< IReadOnlyList< ConfigurationFile > > ListDirectory(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
Get ConfigurationFile for all items in a given configurationRelativePath
+
Task SymlinkStaticFilesTo(string destination, CancellationToken cancellationToken)
Symlinks all directories in the GameData directory to destination
+ + +
+ + + + diff --git a/_i_configuration_client_8cs.html b/_i_configuration_client_8cs.html new file mode 100644 index 0000000000..9f4aa455fc --- /dev/null +++ b/_i_configuration_client_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/IConfigurationClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IConfigurationClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Client.Components.IConfigurationClient
 For managing ConfigurationFile files More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
namespace  Tgstation.Server.Client.Components
 
+
+ + + + diff --git a/_i_configuration_client_8cs_source.html b/_i_configuration_client_8cs_source.html new file mode 100644 index 0000000000..2c3b23d7fd --- /dev/null +++ b/_i_configuration_client_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/IConfigurationClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IConfigurationClient.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 using System.Threading;
3 using System.Threading.Tasks;
5 
7 {
11  public interface IConfigurationClient
12  {
19  Task<IReadOnlyList<ConfigurationFile>> List(string directory, CancellationToken cancellationToken);
20 
27  Task<ConfigurationFile> Read(ConfigurationFile file, CancellationToken cancellationToken);
28 
35  Task<ConfigurationFile> Write(ConfigurationFile file, CancellationToken cancellationToken);
36 
43  Task DeleteEmptyDirectory(ConfigurationFile directory, CancellationToken cancellationToken);
44 
51  Task<ConfigurationFile> CreateDirectory(ConfigurationFile directory, CancellationToken cancellationToken);
52  }
53 }
Task< ConfigurationFile > Write(ConfigurationFile file, CancellationToken cancellationToken)
Overwrite a ConfigurationFile file
+ +
Task< ConfigurationFile > CreateDirectory(ConfigurationFile directory, CancellationToken cancellationToken)
Creates an empty directory
+
Task< IReadOnlyList< ConfigurationFile > > List(string directory, CancellationToken cancellationToken)
List configuration files
+ + +
Task DeleteEmptyDirectory(ConfigurationFile directory, CancellationToken cancellationToken)
Delete an empty directory
+
Represents a game configuration file. Create and delete actions uncerimonuously overwrite/delete file...
+ + +
Task< ConfigurationFile > Read(ConfigurationFile file, CancellationToken cancellationToken)
Read a ConfigurationFile file
+ +
+ + + + diff --git a/_i_console_8cs.html b/_i_console_8cs.html new file mode 100644 index 0000000000..5497d3c8f7 --- /dev/null +++ b/_i_console_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/IConsole.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IConsole.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.IO.IConsole
 Abstraction for System.Console More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.IO
 
+
+ + + + diff --git a/_i_console_8cs_source.html b/_i_console_8cs_source.html new file mode 100644 index 0000000000..86bb465bb9 --- /dev/null +++ b/_i_console_8cs_source.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/IConsole.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IConsole.cs
+
+
+Go to the documentation of this file.
1 using System.Threading;
2 using System.Threading.Tasks;
3 
5 {
9  interface IConsole
10  {
14  bool Available { get; }
15 
23  Task WriteAsync(string text, bool newLine, CancellationToken cancellationToken);
24 
30  Task PressAnyKeyAsync(CancellationToken cancellationToken);
31 
38  Task<string> ReadLineAsync(bool usePasswordChar, CancellationToken cancellationToken);
39  }
40 }
Abstraction for System.Console
Definition: IConsole.cs:9
+
bool Available
If the IConsole is visible to the user
Definition: IConsole.cs:14
+
Task< string > ReadLineAsync(bool usePasswordChar, CancellationToken cancellationToken)
Read a line from the IConsole
+
Task WriteAsync(string text, bool newLine, CancellationToken cancellationToken)
Write some text to the IConsole
+
Task PressAnyKeyAsync(CancellationToken cancellationToken)
Wait for a key press on the IConsole
+ +
+ + + + diff --git a/_i_credentials_provider_8cs.html b/_i_credentials_provider_8cs.html new file mode 100644 index 0000000000..71bbe2ee2f --- /dev/null +++ b/_i_credentials_provider_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Repository/ICredentialsProvider.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ICredentialsProvider.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Repository.ICredentialsProvider
 For generating CredentialsHandlers More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Repository
 
+
+ + + + diff --git a/_i_credentials_provider_8cs_source.html b/_i_credentials_provider_8cs_source.html new file mode 100644 index 0000000000..072f1905f8 --- /dev/null +++ b/_i_credentials_provider_8cs_source.html @@ -0,0 +1,85 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Repository/ICredentialsProvider.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ICredentialsProvider.cs
+
+
+Go to the documentation of this file.
1 using LibGit2Sharp.Handlers;
2 
4 {
9  {
16  CredentialsHandler GenerateHandler(string username, string password);
17  }
18 }
+
CredentialsHandler GenerateHandler(string username, string password)
Generate a CredentialsHandler from a given username and password
+ +
+ + + + diff --git a/_i_cryptography_suite_8cs.html b/_i_cryptography_suite_8cs.html new file mode 100644 index 0000000000..9972c5d8ed --- /dev/null +++ b/_i_cryptography_suite_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/ICryptographySuite.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ICryptographySuite.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Security.ICryptographySuite
 Contains various cryptographic functions More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Security
 
+
+ + + + diff --git a/_i_cryptography_suite_8cs_source.html b/_i_cryptography_suite_8cs_source.html new file mode 100644 index 0000000000..f67de7a822 --- /dev/null +++ b/_i_cryptography_suite_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/ICryptographySuite.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ICryptographySuite.cs
+
+
+Go to the documentation of this file.
2 
4 {
8  public interface ICryptographySuite
9  {
15  byte[] GetSecureBytes(uint amount);
16 
23  void SetUserPassword(User user, string newPassword, bool newUser);
24 
31  bool CheckUserPassword(User user, string password);
32 
37  string GetSecureString();
38  }
39 }
bool CheckUserPassword(User user, string password)
Checks a given password matches a given user 's User.PasswordHash. This may result in User....
+ +
byte [] GetSecureBytes(uint amount)
Generates a secure set of bytes
+
Contains various cryptographic functions
+ + +
void SetUserPassword(User user, string newPassword, bool newUser)
Sets a User.PasswordHash for a given user
+
string GetSecureString()
Generates a 40-length secure ascii string
+ + + +
+ + + + diff --git a/_i_custom_command_handler_8cs.html b/_i_custom_command_handler_8cs.html new file mode 100644 index 0000000000..c2f8fb7d47 --- /dev/null +++ b/_i_custom_command_handler_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/ICustomCommandHandler.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ICustomCommandHandler.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Chat.ICustomCommandHandler
 Handles Commands.ICommands that map to those defined in a IJsonTrackingContext More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
+
+ + + + diff --git a/_i_custom_command_handler_8cs_source.html b/_i_custom_command_handler_8cs_source.html new file mode 100644 index 0000000000..f6c508a297 --- /dev/null +++ b/_i_custom_command_handler_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/ICustomCommandHandler.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ICustomCommandHandler.cs
+
+
+Go to the documentation of this file.
1 using System.Threading;
2 using System.Threading.Tasks;
3 
5 {
9  public interface ICustomCommandHandler
10  {
19  Task<string> HandleChatCommand(string commandName, string arguments, User sender, CancellationToken cancellationToken);
20  }
21 }
+
Represents a tgs_chat_user datum
Definition: User.cs:10
+
Handles Commands.ICommands that map to those defined in a IJsonTrackingContext
+
Task< string > HandleChatCommand(string commandName, string arguments, User sender, CancellationToken cancellationToken)
Handle a chat command
+
+ + + + diff --git a/_i_d_b_connection_factory_8cs.html b/_i_d_b_connection_factory_8cs.html new file mode 100644 index 0000000000..154d781989 --- /dev/null +++ b/_i_d_b_connection_factory_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IDBConnectionFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IDBConnectionFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Core.IDBConnectionFactory
 For creating DbConnection More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_i_d_b_connection_factory_8cs_source.html b/_i_d_b_connection_factory_8cs_source.html new file mode 100644 index 0000000000..5f73fd0f0e --- /dev/null +++ b/_i_d_b_connection_factory_8cs_source.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IDBConnectionFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IDBConnectionFactory.cs
+
+
+Go to the documentation of this file.
1 using System.Data.Common;
3 
5 {
10  {
17  DbConnection CreateConnection(string connectionString, DatabaseType databaseType);
18  }
19 }
+
DbConnection CreateConnection(string connectionString, DatabaseType databaseType)
Create a DbConnection
+ + +
DatabaseType
Type of database to user
Definition: DatabaseType.cs:6
+ + + +
+ + + + diff --git a/_i_database_context_8cs.html b/_i_database_context_8cs.html new file mode 100644 index 0000000000..d9e4a8d19f --- /dev/null +++ b/_i_database_context_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/IDatabaseContext.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IDatabaseContext.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Models.IDatabaseContext
 Represents the database More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + diff --git a/_i_database_context_8cs_source.html b/_i_database_context_8cs_source.html new file mode 100644 index 0000000000..334e7122b5 --- /dev/null +++ b/_i_database_context_8cs_source.html @@ -0,0 +1,100 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/IDatabaseContext.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IDatabaseContext.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore;
2 using System;
3 using System.Threading;
4 using System.Threading.Tasks;
5 
7 {
11  public interface IDatabaseContext
12  {
16  DbSet<User> Users { get; }
17 
21  DbSet<Instance> Instances { get; }
22 
26  DbSet<InstanceUser> InstanceUsers { get; }
27 
31  DbSet<Job> Jobs { get; }
32 
36  DbSet<CompileJob> CompileJobs { get; }
37 
41  DbSet<RevisionInformation> RevisionInformations { get; }
42 
46  DbSet<DreamMakerSettings> DreamMakerSettings { get; set; }
47 
51  DbSet<DreamDaemonSettings> DreamDaemonSettings { get; set; }
52 
56  DbSet<ChatBot> ChatBots { get; set; }
57 
61  DbSet<ChatChannel> ChatChannels { get; set; }
62 
66  DbSet<RepositorySettings> RepositorySettings { get; set; }
67 
71  DbSet<ReattachInformation> ReattachInformations { get; set; }
72 
76  DbSet<WatchdogReattachInformation> WatchdogReattachInformations { get; set; }
77 
83  Task Save(CancellationToken cancellationToken);
84 
90  Task Initialize(CancellationToken cancellationToken);
91 
98  Task SchemaDowngradeForServerVersion(Version version, CancellationToken cancellationToken);
99  }
100 }
+
DbSet< Instance > Instances
The Instances in the IDatabaseContext
+ + +
DbSet< WatchdogReattachInformation > WatchdogReattachInformations
The DbSet<TEntity> for Models.WatchdogReattachInformations
+
DbSet< ReattachInformation > ReattachInformations
The DbSet<TEntity> for Models.ReattachInformations
+ +
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+ +
DbSet< Job > Jobs
The Jobs in the IDatabaseContext
+
DbSet< User > Users
The Users in the IDatabaseContext
+
Task SchemaDowngradeForServerVersion(Version version, CancellationToken cancellationToken)
Attempt to downgrade the schema to the migration used for a given server version
+
DbSet< ChatChannel > ChatChannels
The ChatChannel in the IDatabaseContext
+
DbSet< CompileJob > CompileJobs
The CompileJobs in the IDatabaseContext
+
Task Initialize(CancellationToken cancellationToken)
Creates and migrates the IDatabaseContext
+
DbSet< RevisionInformation > RevisionInformations
The RevisionInformations in the IDatabaseContext
+
DbSet< ChatBot > ChatBots
The Models.ChatBot in the IDatabaseContext
+
DbSet< InstanceUser > InstanceUsers
The InstanceUsers in the IDatabaseContext
+
+ + + + diff --git a/_i_database_context_factory_8cs.html b/_i_database_context_factory_8cs.html new file mode 100644 index 0000000000..25e36111c0 --- /dev/null +++ b/_i_database_context_factory_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IDatabaseContextFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IDatabaseContextFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Core.IDatabaseContextFactory
 Factory for scoping usage of IDatabaseContexts. Meant for use by Components More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_i_database_context_factory_8cs_source.html b/_i_database_context_factory_8cs_source.html new file mode 100644 index 0000000000..22fd333f40 --- /dev/null +++ b/_i_database_context_factory_8cs_source.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IDatabaseContextFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IDatabaseContextFactory.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading.Tasks;
4 
6 {
11  {
17  Task UseContext(Func<IDatabaseContext, Task> operation);
18  }
19 }
+
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
+ + +
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+ + +
+ + + + diff --git a/_i_database_seeder_8cs.html b/_i_database_seeder_8cs.html new file mode 100644 index 0000000000..7c8d78457a --- /dev/null +++ b/_i_database_seeder_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/IDatabaseSeeder.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IDatabaseSeeder.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Models.IDatabaseSeeder
 For initially seeding a database More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + diff --git a/_i_database_seeder_8cs_source.html b/_i_database_seeder_8cs_source.html new file mode 100644 index 0000000000..a8a7eb1319 --- /dev/null +++ b/_i_database_seeder_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/IDatabaseSeeder.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IDatabaseSeeder.cs
+
+
+Go to the documentation of this file.
1 using System.Threading;
2 using System.Threading.Tasks;
3 
5 {
9  interface IDatabaseSeeder
10  {
17  Task SeedDatabase(IDatabaseContext databaseContext, CancellationToken cancellationToken);
18 
25  Task ResetAdminPassword(IDatabaseContext databaseContext, CancellationToken cancellationToken);
26  }
27 }
+ +
Task ResetAdminPassword(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Changes the admin password in IDatabaseContext back to it's default and enables the account
+
For initially seeding a database
+
Task SeedDatabase(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Initially seed a given databaseContext
+
+ + + + diff --git a/_i_dmb_factory_8cs.html b/_i_dmb_factory_8cs.html new file mode 100644 index 0000000000..49e6e2ed75 --- /dev/null +++ b/_i_dmb_factory_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Compiler/IDmbFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IDmbFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Compiler.IDmbFactory
 Factory for IDmbProviders More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Compiler
 
+
+ + + + diff --git a/_i_dmb_factory_8cs_source.html b/_i_dmb_factory_8cs_source.html new file mode 100644 index 0000000000..2797120e44 --- /dev/null +++ b/_i_dmb_factory_8cs_source.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Compiler/IDmbFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IDmbFactory.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
5 
7 {
11  public interface IDmbFactory
12  {
17  Task OnNewerDmb { get; }
18 
22  bool DmbAvailable { get; }
23 
29  IDmbProvider LockNextDmb(int lockCount);
30 
37  Task<IDmbProvider> FromCompileJob(CompileJob compileJob, CancellationToken cancellationToken);
38 
45  Task CleanUnusedCompileJobs(CompileJob exceptThisOne, CancellationToken cancellationToken);
46  }
47 }
+ + +
Task CleanUnusedCompileJobs(CompileJob exceptThisOne, CancellationToken cancellationToken)
Deletes all compile jobs that are inactive in the Game folder exceptThisOne
+
IDmbProvider LockNextDmb(int lockCount)
Gets the next IDmbProvider
+
bool DmbAvailable
If LockNextDmb will succeed
Definition: IDmbFactory.cs:22
+
Task OnNewerDmb
Get a Task that completes when the result of a call to LockNextDmb will be different than the previou...
Definition: IDmbFactory.cs:17
+ +
Provides absolute paths to the latest compiled .dmbs
Definition: IDmbProvider.cs:9
+
Task< IDmbProvider > FromCompileJob(CompileJob compileJob, CancellationToken cancellationToken)
Gets a IDmbProvider for a given CompileJob
+ + + +
+ + + + diff --git a/_i_dmb_provider_8cs.html b/_i_dmb_provider_8cs.html new file mode 100644 index 0000000000..5e0df9d4ca --- /dev/null +++ b/_i_dmb_provider_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/IDmbProvider.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IDmbProvider.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.IDmbProvider
 Provides absolute paths to the latest compiled .dmbs More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
+
+ + + + diff --git a/_i_dmb_provider_8cs_source.html b/_i_dmb_provider_8cs_source.html new file mode 100644 index 0000000000..60e522d8da --- /dev/null +++ b/_i_dmb_provider_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/IDmbProvider.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IDmbProvider.cs
+
+
+Go to the documentation of this file.
1 using System;
3 
5 {
9  public interface IDmbProvider : IDisposable
10  {
14  string DmbName { get; }
15 
19  string PrimaryDirectory { get; }
20 
24  string SecondaryDirectory { get; }
25 
30 
34  void KeepAlive();
35  }
36 }
string DmbName
The file name of the .dmb
Definition: IDmbProvider.cs:14
+ +
string SecondaryDirectory
The secondary game directory with a trailing directory separator
Definition: IDmbProvider.cs:24
+
string PrimaryDirectory
The primary game directory with a trailing directory separator
Definition: IDmbProvider.cs:19
+
void KeepAlive()
Disposing the IDmbProvider won't cause a cleanup of the working directory
+ + +
Provides absolute paths to the latest compiled .dmbs
Definition: IDmbProvider.cs:9
+ + + + +
+ + + + diff --git a/_i_dream_daemon_client_8cs.html b/_i_dream_daemon_client_8cs.html new file mode 100644 index 0000000000..84af78ce74 --- /dev/null +++ b/_i_dream_daemon_client_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/IDreamDaemonClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IDreamDaemonClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Client.Components.IDreamDaemonClient
 For managing DreamDaemon More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
namespace  Tgstation.Server.Client.Components
 
+
+ + + + diff --git a/_i_dream_daemon_client_8cs_source.html b/_i_dream_daemon_client_8cs_source.html new file mode 100644 index 0000000000..0b33836f84 --- /dev/null +++ b/_i_dream_daemon_client_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/IDreamDaemonClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IDreamDaemonClient.cs
+
+
+Go to the documentation of this file.
1 using System.Threading;
2 using System.Threading.Tasks;
4 
6 {
10  public interface IDreamDaemonClient
11  {
17  Task<DreamDaemon> Read(CancellationToken cancellationToken);
18 
24  Task<Job> Start(CancellationToken cancellationToken);
25 
31  Task<Job> Restart(CancellationToken cancellationToken);
32 
38  Task Shutdown(CancellationToken cancellationToken);
39 
46  Task<DreamDaemon> Update(DreamDaemon dreamDaemon, CancellationToken cancellationToken);
47  }
48 }
+ + +
Task< Job > Start(CancellationToken cancellationToken)
Start DreamDaemon
+
Task Shutdown(CancellationToken cancellationToken)
Shutdown DreamDaemon
+
Task< DreamDaemon > Read(CancellationToken cancellationToken)
Get the DreamDaemon represented by the IDreamDaemonClient
+ +
Task< DreamDaemon > Update(DreamDaemon dreamDaemon, CancellationToken cancellationToken)
Update DreamDaemon. This may trigger Api.Models.Internal.DreamDaemonSettings.SoftRestart
+ +
Task< Job > Restart(CancellationToken cancellationToken)
Restart DreamDaemon
+
Represents an instance of BYOND's DreamDaemon game server. Create action starts the server....
Definition: DreamDaemon.cs:8
+ +
+ + + + diff --git a/_i_dream_maker_8cs.html b/_i_dream_maker_8cs.html new file mode 100644 index 0000000000..8ef3812aa9 --- /dev/null +++ b/_i_dream_maker_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Compiler/IDreamMaker.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IDreamMaker.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Compiler.IDreamMaker
 For managing the compiler More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Compiler
 
+
+ + + + diff --git a/_i_dream_maker_8cs_source.html b/_i_dream_maker_8cs_source.html new file mode 100644 index 0000000000..f0ed6ebfa4 --- /dev/null +++ b/_i_dream_maker_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Compiler/IDreamMaker.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IDreamMaker.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
5 
7 {
11  public interface IDreamMaker
12  {
24  Task<Models.CompileJob> Compile(Models.RevisionInformation revisionInformation, Api.Models.DreamMaker dreamMakerSettings, uint apiValidateTimeout, IRepository repository, Action<int> progressReporter, TimeSpan? estimatedDuration, CancellationToken cancellationToken);
25  }
26 }
+ +
Represents an on-disk git repository
Definition: IRepository.cs:11
+ +
Task< Models.CompileJob > Compile(Models.RevisionInformation revisionInformation, Api.Models.DreamMaker dreamMakerSettings, uint apiValidateTimeout, IRepository repository, Action< int > progressReporter, TimeSpan? estimatedDuration, CancellationToken cancellationToken)
Starts a compile
+ + + + +
+ + + + diff --git a/_i_dream_maker_client_8cs.html b/_i_dream_maker_client_8cs.html new file mode 100644 index 0000000000..8182b7e7bf --- /dev/null +++ b/_i_dream_maker_client_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/IDreamMakerClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IDreamMakerClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Client.Components.IDreamMakerClient
 For managing the compiler More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
namespace  Tgstation.Server.Client.Components
 
+
+ + + + diff --git a/_i_dream_maker_client_8cs_source.html b/_i_dream_maker_client_8cs_source.html new file mode 100644 index 0000000000..75dbc4e45c --- /dev/null +++ b/_i_dream_maker_client_8cs_source.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/IDreamMakerClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IDreamMakerClient.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 using System.Threading;
3 using System.Threading.Tasks;
5 
7 {
11  public interface IDreamMakerClient
12  {
18  Task<DreamMaker> Read(CancellationToken cancellationToken);
19 
26  Task<DreamMaker> Update(DreamMaker dreamMaker, CancellationToken cancellationToken);
27 
33  Task<Job> Compile(CancellationToken cancellationToken);
34 
40  Task<IReadOnlyList<CompileJob>> GetJobIds(CancellationToken cancellationToken);
41 
48  Task<CompileJob> GetCompileJob(CompileJob compileJob, CancellationToken cancellationToken);
49  }
50 }
Represents the state of the DreamMaker compiler. Create action starts a new compile....
Definition: DreamMaker.cs:8
+ + + +
Task< DreamMaker > Read(CancellationToken cancellationToken)
Get the DreamMaker information
+
Task< Job > Compile(CancellationToken cancellationToken)
Compile the current repository revision
+ + +
Task< CompileJob > GetCompileJob(CompileJob compileJob, CancellationToken cancellationToken)
Get a compileJob
+
Task< DreamMaker > Update(DreamMaker dreamMaker, CancellationToken cancellationToken)
Updates the DreamMaker setttings
+ +
Task< IReadOnlyList< CompileJob > > GetJobIds(CancellationToken cancellationToken)
Gets the Api.Models.Internal.CompileJob.Ids of all CompileJobs for the instance
+ +
+ + + + diff --git a/_i_event_consumer_8cs.html b/_i_event_consumer_8cs.html new file mode 100644 index 0000000000..8723664cd9 --- /dev/null +++ b/_i_event_consumer_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/IEventConsumer.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IEventConsumer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.IEventConsumer
 Consumes EventTypes and takes the appropriate actions More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
+
+ + + + diff --git a/_i_event_consumer_8cs_source.html b/_i_event_consumer_8cs_source.html new file mode 100644 index 0000000000..6d3e1012d7 --- /dev/null +++ b/_i_event_consumer_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/IEventConsumer.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IEventConsumer.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 using System.Threading;
3 using System.Threading.Tasks;
4 
6 {
10  public interface IEventConsumer
11  {
19  Task<bool> HandleEvent(EventType eventType, IEnumerable<string> parameters, CancellationToken cancellationToken);
20  }
21 }
Consumes EventTypes and takes the appropriate actions
+
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+ +
Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+
+ + + + diff --git a/_i_git_hub_client_factory_8cs.html b/_i_git_hub_client_factory_8cs.html new file mode 100644 index 0000000000..a809684e7e --- /dev/null +++ b/_i_git_hub_client_factory_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IGitHubClientFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IGitHubClientFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Core.IGitHubClientFactory
 For creating IGitHubClients More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_i_git_hub_client_factory_8cs_source.html b/_i_git_hub_client_factory_8cs_source.html new file mode 100644 index 0000000000..18df6a5a99 --- /dev/null +++ b/_i_git_hub_client_factory_8cs_source.html @@ -0,0 +1,85 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IGitHubClientFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IGitHubClientFactory.cs
+
+
+Go to the documentation of this file.
1 using Octokit;
2 
4 {
8  public interface IGitHubClientFactory
9  {
14  IGitHubClient CreateClient();
15 
21  IGitHubClient CreateClient(string accessToken);
22  }
23 }
+ +
IGitHubClient CreateClient()
Create a client with anonymous authentication. Low rate limit
+
+ + + + diff --git a/_i_http_client_8cs.html b/_i_http_client_8cs.html new file mode 100644 index 0000000000..a588c1cffe --- /dev/null +++ b/_i_http_client_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/IHttpClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IHttpClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Client.IHttpClient
 For sending HTTP requests More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_i_http_client_8cs_source.html b/_i_http_client_8cs_source.html new file mode 100644 index 0000000000..155e50378b --- /dev/null +++ b/_i_http_client_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/IHttpClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IHttpClient.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Net.Http;
3 using System.Threading;
4 using System.Threading.Tasks;
5 
7 {
12  {
16  TimeSpan Timeout { get; set; }
17 
24  Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken);
25  }
26 }
TimeSpan Timeout
The request timeout
Definition: IHttpClient.cs:16
+ +
For sending HTTP requests
Definition: IHttpClient.cs:11
+ +
Task< HttpResponseMessage > SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
Send an HTTP request
+
+ + + + diff --git a/_i_i_o_manager_8cs.html b/_i_i_o_manager_8cs.html new file mode 100644 index 0000000000..e1ac1dfd32 --- /dev/null +++ b/_i_i_o_manager_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/IIOManager.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IIOManager.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.IO.IIOManager
 Interface for using filesystems More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.IO
 
+
+ + + + diff --git a/_i_i_o_manager_8cs_source.html b/_i_i_o_manager_8cs_source.html new file mode 100644 index 0000000000..1ec261af44 --- /dev/null +++ b/_i_i_o_manager_8cs_source.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/IIOManager.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IIOManager.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Threading;
4 using System.Threading.Tasks;
5 
7 {
11  public interface IIOManager
12  {
18  string ResolvePath(string path);
19 
25  string GetFileName(string path);
26 
32  string GetFileNameWithoutExtension(string path);
33 
39  bool PathContainsParentAccess(string path);
40 
49  Task CopyDirectory(string src, string dest, IEnumerable<string> ignore, CancellationToken cancellationToken);
50 
57  Task<bool> FileExists(string path, CancellationToken cancellationToken);
58 
65  Task<bool> DirectoryExists(string path, CancellationToken cancellationToken);
66 
73  Task<byte[]> ReadAllBytes(string path, CancellationToken cancellationToken);
74 
81  Task<IReadOnlyList<string>> GetDirectories(string path, CancellationToken cancellationToken);
82 
89  Task<IReadOnlyList<string>> GetFiles(string path, CancellationToken cancellationToken);
90 
98  Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken);
99 
107  Task CopyFile(string src, string dest, CancellationToken cancellationToken);
108 
114  string GetDirectoryName(string path);
115 
123  Task<List<string>> GetFilesWithExtension(string path, string extension, CancellationToken cancellationToken);
124 
131  Task DeleteFile(string path, CancellationToken cancellationToken);
132 
139  Task CreateDirectory(string path, CancellationToken cancellationToken);
140 
147  Task DeleteDirectory(string path, CancellationToken cancellationToken);
148 
154  string ConcatPath(params string[] paths);
155 
163  Task MoveFile(string source, string destination, CancellationToken cancellationToken);
164 
172  Task MoveDirectory(string source, string destination, CancellationToken cancellationToken);
173 
180  Task<byte[]> DownloadFile(Uri url, CancellationToken cancellationToken);
181 
189  Task ZipToDirectory(string path, byte[] zipFileBytes, CancellationToken cancellationToken);
190  }
191 }
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
Task MoveDirectory(string source, string destination, CancellationToken cancellationToken)
Moves a directory at source to destination
+
Task< List< string > > GetFilesWithExtension(string path, string extension, CancellationToken cancellationToken)
Gets a list of files in path with the given extension
+
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+
Task CopyDirectory(string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)
Copies a directory from src to dest
+
Task< byte[]> DownloadFile(Uri url, CancellationToken cancellationToken)
Downloads a file from url
+
Task ZipToDirectory(string path, byte[] zipFileBytes, CancellationToken cancellationToken)
Extract a set of zipFileBytes to a given path
+
Task< IReadOnlyList< string > > GetDirectories(string path, CancellationToken cancellationToken)
Returns directory names in a given path
+
Task CopyFile(string src, string dest, CancellationToken cancellationToken)
Copy a file from src to dest
+
string GetDirectoryName(string path)
Gets the directory portion of a given path
+
Task CreateDirectory(string path, CancellationToken cancellationToken)
Create a directory at path
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
string GetFileName(string path)
Gets the file name portion of a path
+
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists
+
string GetFileNameWithoutExtension(string path)
Gets the file name portion of a path with
+
bool PathContainsParentAccess(string path)
Check if a path contains the '..' parent directory accessor
+
Task< IReadOnlyList< string > > GetFiles(string path, CancellationToken cancellationToken)
Returns file names in a given path
+
Interface for using filesystems
Definition: IIOManager.cs:11
+
Task MoveFile(string source, string destination, CancellationToken cancellationToken)
Moves a file at source to destination
+
Task< byte[]> ReadAllBytes(string path, CancellationToken cancellationToken)
Returns all the contents of a file at path as a byte array
+
Task DeleteFile(string path, CancellationToken cancellationToken)
Deletes a file at path
+
Task< bool > DirectoryExists(string path, CancellationToken cancellationToken)
Check that the directory at path exists
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+ +
+ + + + diff --git a/_i_identity_cache_8cs.html b/_i_identity_cache_8cs.html new file mode 100644 index 0000000000..3c1fd7bbad --- /dev/null +++ b/_i_identity_cache_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/IIdentityCache.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IIdentityCache.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Security.IIdentityCache
 For caching ISystemIdentitys More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Security
 
+
+ + + + diff --git a/_i_identity_cache_8cs_source.html b/_i_identity_cache_8cs_source.html new file mode 100644 index 0000000000..414d39fc8a --- /dev/null +++ b/_i_identity_cache_8cs_source.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/IIdentityCache.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IIdentityCache.cs
+
+
+Go to the documentation of this file.
1 using System;
3 
5 {
9  public interface IIdentityCache
10  {
17  void CacheSystemIdentity(User user, ISystemIdentity systemIdentity, DateTimeOffset expiry);
18 
25  }
26 }
Represents a user on the current System.Runtime.InteropServices.OSPlatform
+ +
ISystemIdentity LoadCachedIdentity(User user)
Attempt to load a cached ISystemIdentity
+ + + +
void CacheSystemIdentity(User user, ISystemIdentity systemIdentity, DateTimeOffset expiry)
Keep a user 's systemIdentity alive until an expiry time
+ + + +
+ + + + diff --git a/_i_instance_8cs.html b/_i_instance_8cs.html new file mode 100644 index 0000000000..22c6a2b76e --- /dev/null +++ b/_i_instance_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/IInstance.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IInstance.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.IInstance
 For interacting with the instance services More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
+
+ + + + diff --git a/_i_instance_8cs_source.html b/_i_instance_8cs_source.html new file mode 100644 index 0000000000..48bb108934 --- /dev/null +++ b/_i_instance_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/IInstance.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IInstance.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Hosting;
2 using System;
3 using System.Threading;
4 using System.Threading.Tasks;
11 
13 {
17  public interface IInstance : IHostedService, IDisposable
18  {
23 
28 
33 
37  IChat Chat { get; }
38 
43 
49 
54  void Rename(string newName);
55 
61  Task SetAutoUpdateInterval(uint newInterval);
62 
71  Task CompileProcess(Job job, IDatabaseContext databaseContext, Action<int> progressReporter, CancellationToken cancellationToken);
72  }
73 }
+ + + + + + +
Task CompileProcess(Job job, IDatabaseContext databaseContext, Action< int > progressReporter, CancellationToken cancellationToken)
Run the compile job and insert it into the database. Meant to be called by a Core....
+
For managing connected chat services
Definition: IChat.cs:13
+ +
For interacting with the instance services
Definition: IInstance.cs:17
+ + +
void Rename(string newName)
Rename the IInstance
+
IWatchdog Watchdog
The IWatchdog for the IInstance
Definition: IInstance.cs:32
+ + + + + + + + + +
CompileJob LatestCompileJob()
The latest staged CompileJob
+ +
Task SetAutoUpdateInterval(uint newInterval)
Change the Api.Models.Instance.AutoUpdateInterval for the IInstance
+ + +
Runs and monitors the twin server controllers
Definition: IWatchdog.cs:12
+
+ + + + diff --git a/_i_instance_client_8cs.html b/_i_instance_client_8cs.html new file mode 100644 index 0000000000..21a910a1f2 --- /dev/null +++ b/_i_instance_client_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/IInstanceClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IInstanceClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Client.Components.IInstanceClient
 For managing a single Instance More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
namespace  Tgstation.Server.Client.Components
 
+
+ + + + diff --git a/_i_instance_client_8cs_source.html b/_i_instance_client_8cs_source.html new file mode 100644 index 0000000000..e05c7ee8c1 --- /dev/null +++ b/_i_instance_client_8cs_source.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/IInstanceClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IInstanceClient.cs
+
+
+Go to the documentation of this file.
1 using System;
3 
5 {
9  public interface IInstanceClient
10  {
14  Instance Metadata { get; }
15 
20 
25 
30 
35 
40 
45 
50 
54  IJobsClient Jobs { get; }
55  }
56 }
IInstanceUserClient Users
Access the IInstanceUserClient
+ +
Represents the state of the DreamMaker compiler. Create action starts a new compile....
Definition: DreamMaker.cs:8
+ + + +
For managing the Byond installation
Definition: IByondClient.cs:11
+
Instance Metadata
The Instance used to create the IInstanceClient
+
IConfigurationClient Configuration
Access the IConfigurationClient
+ + + + + +
Represents a git repository
Definition: Repository.cs:8
+
IChatBotsClient ChatBots
Access the IChatBotsClient
+ +
Metadata about a server instance
Definition: Instance.cs:9
+ +
Represents a BYOND installation
Definition: Byond.cs:8
+ +
Represents an instance of BYOND's DreamDaemon game server. Create action starts the server....
Definition: DreamDaemon.cs:8
+ + +
+ + + + diff --git a/_i_instance_factory_8cs.html b/_i_instance_factory_8cs.html new file mode 100644 index 0000000000..8333e7a884 --- /dev/null +++ b/_i_instance_factory_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/IInstanceFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IInstanceFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.IInstanceFactory
 Factory for creating IInstances More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
+
+ + + + diff --git a/_i_instance_factory_8cs_source.html b/_i_instance_factory_8cs_source.html new file mode 100644 index 0000000000..4682cfb21e --- /dev/null +++ b/_i_instance_factory_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/IInstanceFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IInstanceFactory.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Hosting;
2 
4 {
9  {
15  IInstance CreateInstance(Models.Instance metadata);
16  }
17 }
IInstance CreateInstance(Models.Instance metadata)
Create an IInstance
+ +
For interacting with the instance services
Definition: IInstance.cs:17
+ + +
+ + + + diff --git a/_i_instance_manager_8cs.html b/_i_instance_manager_8cs.html new file mode 100644 index 0000000000..26e98f80e4 --- /dev/null +++ b/_i_instance_manager_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/IInstanceManager.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IInstanceManager.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.IInstanceManager
 For managing IInstances More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
+
+ + + + diff --git a/_i_instance_manager_8cs_source.html b/_i_instance_manager_8cs_source.html new file mode 100644 index 0000000000..9865275da4 --- /dev/null +++ b/_i_instance_manager_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/IInstanceManager.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IInstanceManager.cs
+
+
+Go to the documentation of this file.
1 using System.Threading;
2 using System.Threading.Tasks;
4 
6 {
10  public interface IInstanceManager
11  {
17  IInstance GetInstance(Models.Instance metadata);
18 
25  Task OnlineInstance(Models.Instance metadata, CancellationToken cancellationToken);
26 
34  Task OfflineInstance(Models.Instance metadata, User user, CancellationToken cancellationToken);
35 
43  Task MoveInstance(Models.Instance metadata, string newPath, CancellationToken cancellationToken);
44  }
45 }
Task MoveInstance(Models.Instance metadata, string newPath, CancellationToken cancellationToken)
Move an IInstance
+
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+ + +
Task OfflineInstance(Models.Instance metadata, User user, CancellationToken cancellationToken)
Offline an IInstance
+
Task OnlineInstance(Models.Instance metadata, CancellationToken cancellationToken)
Online an IInstance
+
For interacting with the instance services
Definition: IInstance.cs:17
+ + + + + +
+ + + + diff --git a/_i_instance_manager_client_8cs.html b/_i_instance_manager_client_8cs.html new file mode 100644 index 0000000000..86e8806dc0 --- /dev/null +++ b/_i_instance_manager_client_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/IInstanceManagerClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IInstanceManagerClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Client.IInstanceManagerClient
 For managing Instances More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_i_instance_manager_client_8cs_source.html b/_i_instance_manager_client_8cs_source.html new file mode 100644 index 0000000000..db0ba67e3d --- /dev/null +++ b/_i_instance_manager_client_8cs_source.html @@ -0,0 +1,97 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/IInstanceManagerClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IInstanceManagerClient.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 using System.Threading;
3 using System.Threading.Tasks;
6 
8 {
12  public interface IInstanceManagerClient
13  {
19  Task<IReadOnlyList<Instance>> List(CancellationToken cancellationToken);
20 
27  Task<Instance> CreateOrAttach(Instance instance, CancellationToken cancellationToken);
28 
35  Task<Instance> Update(Instance instance, CancellationToken cancellationToken);
36 
43  Task<Instance> GetId(Instance instance, CancellationToken cancellationToken);
44 
51  Task Detach(Instance instance, CancellationToken cancellationToken);
52 
59  }
60 }
+ + +
Task< Instance > CreateOrAttach(Instance instance, CancellationToken cancellationToken)
Create or attach an instance
+
IInstanceClient CreateClient(Instance instance)
Create an IInstanceClient for a given Instance
+
Task< IReadOnlyList< Instance > > List(CancellationToken cancellationToken)
Get all IInstanceClients for Instances the user can view
+ +
Task< Instance > GetId(Instance instance, CancellationToken cancellationToken)
Get a specific instance
+
Task Detach(Instance instance, CancellationToken cancellationToken)
Deletes an instance
+ +
Task< Instance > Update(Instance instance, CancellationToken cancellationToken)
Relocates, renamed, and/or on/offlines an instance
+ +
Metadata about a server instance
Definition: Instance.cs:9
+ + +
+ + + + diff --git a/_i_instance_user_client_8cs.html b/_i_instance_user_client_8cs.html new file mode 100644 index 0000000000..ff716c6d6c --- /dev/null +++ b/_i_instance_user_client_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/IInstanceUserClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IInstanceUserClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Client.Components.IInstanceUserClient
 For managing InstanceUsers More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
namespace  Tgstation.Server.Client.Components
 
+
+ + + + diff --git a/_i_instance_user_client_8cs_source.html b/_i_instance_user_client_8cs_source.html new file mode 100644 index 0000000000..e1cc9d95dd --- /dev/null +++ b/_i_instance_user_client_8cs_source.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/IInstanceUserClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IInstanceUserClient.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 using System.Threading;
3 using System.Threading.Tasks;
5 
7 {
11  public interface IInstanceUserClient
12  {
18  Task<InstanceUser> Read(CancellationToken cancellationToken);
19 
26  Task<InstanceUser> GetId(InstanceUser instanceUser, CancellationToken cancellationToken);
27 
33  Task<IReadOnlyList<InstanceUser>> List(CancellationToken cancellationToken);
34 
41  Task<InstanceUser> Update(InstanceUser instanceUser, CancellationToken cancellationToken);
42 
49  Task<InstanceUser> Create(InstanceUser instanceUser, CancellationToken cancellationToken);
50 
57  Task Delete(InstanceUser instanceUser, CancellationToken cancellationToken);
58  }
59 }
Task< InstanceUser > GetId(InstanceUser instanceUser, CancellationToken cancellationToken)
Get a specific instanceUser
+ +
Task< InstanceUser > Update(InstanceUser instanceUser, CancellationToken cancellationToken)
Update a instanceUser
+ + + +
Represents a Users permissions in an Instance
Definition: InstanceUser.cs:9
+
Task< IReadOnlyList< InstanceUser > > List(CancellationToken cancellationToken)
Get the InstanceUsers in the Instance
+
Task< InstanceUser > Read(CancellationToken cancellationToken)
Get the InstanceUser associated with the logged on user
+
Task< InstanceUser > Create(InstanceUser instanceUser, CancellationToken cancellationToken)
Create a instanceUser
+
Task Delete(InstanceUser instanceUser, CancellationToken cancellationToken)
Delete a instanceUser
+ + +
+ + + + diff --git a/_i_job_manager_8cs.html b/_i_job_manager_8cs.html new file mode 100644 index 0000000000..51ae5e6d27 --- /dev/null +++ b/_i_job_manager_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IJobManager.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IJobManager.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Core.IJobManager
 Manages the runtime of Jobs More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_i_job_manager_8cs_source.html b/_i_job_manager_8cs_source.html new file mode 100644 index 0000000000..9abd0525aa --- /dev/null +++ b/_i_job_manager_8cs_source.html @@ -0,0 +1,96 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IJobManager.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IJobManager.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Hosting;
2 using System;
3 using System.Threading;
4 using System.Threading.Tasks;
6 
8 {
12  public interface IJobManager : IHostedService
13  {
19  int? JobProgress(Job job);
20 
28  Task RegisterOperation(Job job, Func<Job, IDatabaseContext, Action<int>, CancellationToken, Task> operation, CancellationToken cancellationToken);
29 
38 #pragma warning disable CA1068 // CancellationToken parameters must come last https://github.com/dotnet/roslyn-analyzers/issues/1816
39  Task WaitForJobCompletion(Job job, User canceller, CancellationToken jobCancellationToken, CancellationToken cancellationToken);
40 #pragma warning restore CA1068 // CancellationToken parameters must come last
41 
50  Task<bool> CancelJob(Job job, User user, bool blocking, CancellationToken cancellationToken);
51  }
52 }
+
Manages the runtime of Jobs
Definition: IJobManager.cs:12
+ +
Task RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
Registers a given Job and begins running it
+ + +
Task< bool > CancelJob(Job job, User user, bool blocking, CancellationToken cancellationToken)
Cancels a give job
+ + + +
Task WaitForJobCompletion(Job job, User canceller, CancellationToken jobCancellationToken, CancellationToken cancellationToken)
Wait for a given job to complete
+ + +
int? JobProgress(Job job)
Get the Api.Models.Job.Progress for a job
+
+ + + + diff --git a/_i_jobs_client_8cs.html b/_i_jobs_client_8cs.html new file mode 100644 index 0000000000..30f5a5e5b0 --- /dev/null +++ b/_i_jobs_client_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/IJobsClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IJobsClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Client.Components.IJobsClient
 Access to running jobs More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
namespace  Tgstation.Server.Client.Components
 
+
+ + + + diff --git a/_i_jobs_client_8cs_source.html b/_i_jobs_client_8cs_source.html new file mode 100644 index 0000000000..95f8fd3475 --- /dev/null +++ b/_i_jobs_client_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/IJobsClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IJobsClient.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Threading;
4 using System.Threading.Tasks;
6 
8 {
12  public interface IJobsClient
13  {
19  Task<IReadOnlyList<Job>> List(CancellationToken cancellationToken);
20 
26  Task<IReadOnlyList<Job>> ListActive(CancellationToken cancellationToken);
27 
34  Task<Job> GetId(Job job, CancellationToken cancellationToken);
35 
42  Task Cancel(Job job, CancellationToken cancellationToken);
43  }
44 }
+ + +
Task< IReadOnlyList< Job > > ListActive(CancellationToken cancellationToken)
List the active Jobs in the Instance
+ +
Task< IReadOnlyList< Job > > List(CancellationToken cancellationToken)
List the Api.Models.Internal.Job.Ids in the Instance
+ +
Task< Job > GetId(Job job, CancellationToken cancellationToken)
Get a job
+ +
Represents a long running job on the server. Model is read-only, updates attempt to cancel the job
Definition: Job.cs:6
+
Task Cancel(Job job, CancellationToken cancellationToken)
Cancels a job
+
+ + + + diff --git a/_i_json_tracking_context_8cs.html b/_i_json_tracking_context_8cs.html new file mode 100644 index 0000000000..da5b6b150b --- /dev/null +++ b/_i_json_tracking_context_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/IJsonTrackingContext.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IJsonTrackingContext.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Chat.IJsonTrackingContext
 Represents a tracking of dynamic chat json files More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
+
+ + + + diff --git a/_i_json_tracking_context_8cs_source.html b/_i_json_tracking_context_8cs_source.html new file mode 100644 index 0000000000..3f1c88a3cb --- /dev/null +++ b/_i_json_tracking_context_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/IJsonTrackingContext.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IJsonTrackingContext.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Threading;
4 using System.Threading.Tasks;
6 
8 {
12  public interface IJsonTrackingContext : IDisposable
13  {
17  bool Active { get; set; }
18 
24  Task<IReadOnlyList<CustomCommand>> GetCustomCommands(CancellationToken cancellationToken);
25 
32  Task SetChannels(IEnumerable<Channel> channels, CancellationToken cancellationToken);
33  }
34 }
+
bool Active
If the IJsonTrackingContext should be used for GetCustomCommands(CancellationToken)
+
Task< IReadOnlyList< CustomCommand > > GetCustomCommands(CancellationToken cancellationToken)
Read CustomCommands from the IJsonTrackingContext
+ +
Represents a tracking of dynamic chat json files
+ + + +
Task SetChannels(IEnumerable< Channel > channels, CancellationToken cancellationToken)
Writes information about connected channels to the IJsonTrackingContext
+ + +
+ + + + diff --git a/_i_network_prompt_reaper_8cs.html b/_i_network_prompt_reaper_8cs.html new file mode 100644 index 0000000000..a9679dc2ba --- /dev/null +++ b/_i_network_prompt_reaper_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/INetworkPromptReaper.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
INetworkPromptReaper.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Watchdog.INetworkPromptReaper
 On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort(). This looks out for those prompts and immediately clicks "Yes" if the owning process has registered for it More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Watchdog
 
+
+ + + + diff --git a/_i_network_prompt_reaper_8cs_source.html b/_i_network_prompt_reaper_8cs_source.html new file mode 100644 index 0000000000..37f712e9da --- /dev/null +++ b/_i_network_prompt_reaper_8cs_source.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/INetworkPromptReaper.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
INetworkPromptReaper.cs
+
+
+Go to the documentation of this file.
2 
4 {
9  {
14  void RegisterProcess(IProcess process);
15  }
16 }
+ +
Abstraction over a System.Diagnostics.Process
Definition: IProcess.cs:9
+ +
void RegisterProcess(IProcess process)
Register a given process for network prompt reaping
+
On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort()....
+ + +
+ + + + diff --git a/_i_platform_identifier_8cs.html b/_i_platform_identifier_8cs.html new file mode 100644 index 0000000000..cb531bc420 --- /dev/null +++ b/_i_platform_identifier_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IPlatformIdentifier.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IPlatformIdentifier.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Core.IPlatformIdentifier
 For identifying the current platform More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_i_platform_identifier_8cs_source.html b/_i_platform_identifier_8cs_source.html new file mode 100644 index 0000000000..88316115b2 --- /dev/null +++ b/_i_platform_identifier_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IPlatformIdentifier.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IPlatformIdentifier.cs
+
+
+Go to the documentation of this file.
2 {
6  public interface IPlatformIdentifier
7  {
11  bool IsWindows { get; }
12 
16  string ScriptFileExtension { get; }
17  }
18 }
+
bool IsWindows
If the current platform is a Windows platform
+
string ScriptFileExtension
The extension of executable script files for the system
+
For identifying the current platform
+
+ + + + diff --git a/_i_post_write_handler_8cs.html b/_i_post_write_handler_8cs.html new file mode 100644 index 0000000000..fbe375af97 --- /dev/null +++ b/_i_post_write_handler_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/IPostWriteHandler.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IPostWriteHandler.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.IO.IPostWriteHandler
 Handles changing file modes/permissions after writing More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.IO
 
+
+ + + + diff --git a/_i_post_write_handler_8cs_source.html b/_i_post_write_handler_8cs_source.html new file mode 100644 index 0000000000..8f04047716 --- /dev/null +++ b/_i_post_write_handler_8cs_source.html @@ -0,0 +1,85 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/IPostWriteHandler.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IPostWriteHandler.cs
+
+
+Go to the documentation of this file.
2 {
6  interface IPostWriteHandler
7  {
12  void HandleWrite(string filePath);
13  }
14 }
Handles changing file modes/permissions after writing
+
void HandleWrite(string filePath)
For handling system specific necessities after a write
+ +
+ + + + diff --git a/_i_process_8cs.html b/_i_process_8cs.html new file mode 100644 index 0000000000..dad416e84b --- /dev/null +++ b/_i_process_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IProcess.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IProcess.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Core.IProcess
 Abstraction over a System.Diagnostics.Process More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_i_process_8cs_source.html b/_i_process_8cs_source.html new file mode 100644 index 0000000000..52b26db15c --- /dev/null +++ b/_i_process_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IProcess.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IProcess.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading.Tasks;
3 
5 {
9  interface IProcess : IProcessBase
10  {
14  int Id { get; }
15 
19  Task Startup { get; }
20 
25  string GetErrorOutput();
26 
31  string GetStandardOutput();
32 
37  string GetCombinedOutput();
38 
42  void Terminate();
43  }
44 }
string GetStandardOutput()
Get the stdout output of the IProcess
+
Task Startup
The Task representing the time until the IProcess becomes "idle"
Definition: IProcess.cs:19
+ +
string GetErrorOutput()
Get the stderr output of the IProcess
+
void Terminate()
Terminates the process
+
Abstraction over a System.Diagnostics.Process
Definition: IProcess.cs:9
+
string GetCombinedOutput()
Get the stderr and stdout output of the IProcess
+
Represents process lifetime
Definition: IProcessBase.cs:9
+ +
+ + + + diff --git a/_i_process_base_8cs.html b/_i_process_base_8cs.html new file mode 100644 index 0000000000..12c9c40c5f --- /dev/null +++ b/_i_process_base_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IProcessBase.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IProcessBase.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Core.IProcessBase
 Represents process lifetime More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_i_process_base_8cs_source.html b/_i_process_base_8cs_source.html new file mode 100644 index 0000000000..f21f914dfc --- /dev/null +++ b/_i_process_base_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IProcessBase.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IProcessBase.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading.Tasks;
3 
5 {
10  {
14  Task<int> Lifetime { get; }
15 
19  void SetHighPriority();
20  }
21 }
Task< int > Lifetime
The Task<TResult> resulting in the exit code of the process
Definition: IProcessBase.cs:14
+
void SetHighPriority()
Set's the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass....
+ +
Represents process lifetime
Definition: IProcessBase.cs:9
+ +
+ + + + diff --git a/_i_process_executor_8cs.html b/_i_process_executor_8cs.html new file mode 100644 index 0000000000..ee19cfcc87 --- /dev/null +++ b/_i_process_executor_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IProcessExecutor.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IProcessExecutor.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Core.IProcessExecutor
 For launching IProcess' More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_i_process_executor_8cs_source.html b/_i_process_executor_8cs_source.html new file mode 100644 index 0000000000..930be08f04 --- /dev/null +++ b/_i_process_executor_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IProcessExecutor.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IProcessExecutor.cs
+
+
+Go to the documentation of this file.
2 {
6  interface IProcessExecutor
7  {
18  IProcess LaunchProcess(string fileName, string workingDirectory, string arguments = null, bool readOutput = false, bool readError = false, bool noShellExecute = false);
19 
25  IProcess GetProcess(int id);
26  }
27 }
+ +
IProcess LaunchProcess(string fileName, string workingDirectory, string arguments=null, bool readOutput=false, bool readError=false, bool noShellExecute=false)
Launch a IProcess
+
Abstraction over a System.Diagnostics.Process
Definition: IProcess.cs:9
+
IProcess GetProcess(int id)
Get a IProcess by id
+
+ + + + diff --git a/_i_provider_8cs.html b/_i_provider_8cs.html new file mode 100644 index 0000000000..5487e20a3d --- /dev/null +++ b/_i_provider_8cs.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Providers/IProvider.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IProvider.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Chat.Providers.IProvider
 For interacting with a chat service More...
 
+ + + + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
namespace  Tgstation.Server.Host.Components.Chat.Providers
 
+
+ + + + diff --git a/_i_provider_8cs_source.html b/_i_provider_8cs_source.html new file mode 100644 index 0000000000..c6d9489a31 --- /dev/null +++ b/_i_provider_8cs_source.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Providers/IProvider.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IProvider.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Threading;
4 using System.Threading.Tasks;
5 
7 {
11  interface IProvider : IDisposable
12  {
16  bool Connected { get; }
17 
21  string BotMention { get; }
22 
29  Task<Message> NextMessage(CancellationToken cancellationToken);
30 
36  Task<bool> Connect(CancellationToken cancellationToken);
37 
43  Task Disconnect(CancellationToken cancellationToken);
44 
51  Task<IReadOnlyList<Channel>> MapChannels(IEnumerable<Api.Models.ChatChannel> channels, CancellationToken cancellationToken);
52 
60  Task SendMessage(ulong channelId, string message, CancellationToken cancellationToken);
61  }
62 }
Task SendMessage(ulong channelId, string message, CancellationToken cancellationToken)
Send a message to the IProvider
+
Task Disconnect(CancellationToken cancellationToken)
Gracefully disconnects the provider. Implies a call to IDisposable.Dispose
+ + +
Task< IReadOnlyList< Channel > > MapChannels(IEnumerable< Api.Models.ChatChannel > channels, CancellationToken cancellationToken)
Get the Channels for given channels
+
Task< bool > Connect(CancellationToken cancellationToken)
Attempt to connect the IProvider
+ +
string BotMention
The string that indicates the IProvider was mentioned
Definition: IProvider.cs:21
+ +
Task< Message > NextMessage(CancellationToken cancellationToken)
Get a Task<TResult> resulting in the next Message the IProvider recieves or null on a disconnect
+
+ + + + diff --git a/_i_provider_factory_8cs.html b/_i_provider_factory_8cs.html new file mode 100644 index 0000000000..03a91772d6 --- /dev/null +++ b/_i_provider_factory_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/IProviderFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IProviderFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Chat.IProviderFactory
 Factory for IProviders More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
+
+ + + + diff --git a/_i_provider_factory_8cs_source.html b/_i_provider_factory_8cs_source.html new file mode 100644 index 0000000000..1e092b79d7 --- /dev/null +++ b/_i_provider_factory_8cs_source.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/IProviderFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IProviderFactory.cs
+
+ + + + + diff --git a/_i_reattach_info_handler_8cs.html b/_i_reattach_info_handler_8cs.html new file mode 100644 index 0000000000..dd4e278c0f --- /dev/null +++ b/_i_reattach_info_handler_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/IReattachInfoHandler.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IReattachInfoHandler.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Watchdog.IReattachInfoHandler
 Handles saving and loading WatchdogReattachInformation More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Watchdog
 
+
+ + + + diff --git a/_i_reattach_info_handler_8cs_source.html b/_i_reattach_info_handler_8cs_source.html new file mode 100644 index 0000000000..30f8b4c695 --- /dev/null +++ b/_i_reattach_info_handler_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/IReattachInfoHandler.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IReattachInfoHandler.cs
+
+
+Go to the documentation of this file.
1 using System.Threading;
2 using System.Threading.Tasks;
3 
5 {
9  public interface IReattachInfoHandler
10  {
17  Task Save(WatchdogReattachInformation reattachInformation, CancellationToken cancellationToken);
18 
24  Task<WatchdogReattachInformation> Load(CancellationToken cancellationToken);
25  }
26 }
+
Task Save(WatchdogReattachInformation reattachInformation, CancellationToken cancellationToken)
Save some reattachInformation
+ +
Task< WatchdogReattachInformation > Load(CancellationToken cancellationToken)
Load a saved WatchdogReattachInformation
+
Handles saving and loading WatchdogReattachInformation
+
+ + + + diff --git a/_i_repository_8cs.html b/_i_repository_8cs.html new file mode 100644 index 0000000000..caddc32ada --- /dev/null +++ b/_i_repository_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Repository/IRepository.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IRepository.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Repository.IRepository
 Represents an on-disk git repository More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Repository
 
+
+ + + + diff --git a/_i_repository_8cs_source.html b/_i_repository_8cs_source.html new file mode 100644 index 0000000000..e824b982fc --- /dev/null +++ b/_i_repository_8cs_source.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Repository/IRepository.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IRepository.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
5 
7 {
11  public interface IRepository : IDisposable
12  {
16  bool IsGitHubRepository { get; }
17 
21  string GitHubOwner { get; }
22 
26  string GitHubRepoName { get; }
27 
31  bool Tracking { get; }
32 
36  string Head { get; }
37 
41  string Reference { get; }
42 
46  string Origin { get; }
47 
54  Task<bool> IsSha(string committish, CancellationToken cancellationToken);
55 
63  Task CheckoutObject(string committish, Action<int> progressReporter, CancellationToken cancellationToken);
64 
76  Task<bool?> AddTestMerge(TestMergeParameters testMergeParameters, string committerName, string committerEmail, string username, string password, Action<int> progressReporter, CancellationToken cancellationToken);
77 
86  Task FetchOrigin(string username, string password, Action<int> progressReporter, CancellationToken cancellationToken);
87 
94  Task ResetToOrigin(Action<int> progressReporter, CancellationToken cancellationToken);
95 
103  Task ResetToSha(string sha, Action<int> progressReporter, CancellationToken cancellationToken);
104 
113  Task<bool?> MergeOrigin(string committerName, string committerEmail, Action<int> progressReporter, CancellationToken cancellationToken);
114 
126  Task<bool> Sychronize(string username, string password, string committerName, string committerEmail, Action<int> progressReporter, bool synchronizeTrackedBranch, CancellationToken cancellationToken);
127 
134  Task CopyTo(string path, CancellationToken cancellationToken);
135  }
136 }
+
string GitHubOwner
The Octokit.Repository.Owner if this IsGitHubRepository
Definition: IRepository.cs:21
+
Task ResetToSha(string sha, Action< int > progressReporter, CancellationToken cancellationToken)
Requires the current HEAD to be a reference. Hard resets the reference to the given sha
+
Represents an on-disk git repository
Definition: IRepository.cs:11
+
Task< bool?> MergeOrigin(string committerName, string committerEmail, Action< int > progressReporter, CancellationToken cancellationToken)
Requires the current HEAD to be a tracked reference. Merges the reference to what it tracks on the or...
+
Task FetchOrigin(string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)
Fetch commits from the origin repository
+ + +
Task ResetToOrigin(Action< int > progressReporter, CancellationToken cancellationToken)
Requires the current HEAD to be a tracked reference. Hard resets the reference to what it tracks on t...
+
string GitHubRepoName
The Octokit.Repository.Name if this IsGitHubRepository
Definition: IRepository.cs:26
+
Task< bool > IsSha(string committish, CancellationToken cancellationToken)
Checks if a given committish is a sha
+
string Origin
The current origin remote the IRepository is using
Definition: IRepository.cs:46
+ +
Task CopyTo(string path, CancellationToken cancellationToken)
Copies the current working directory to a given path
+
bool Tracking
If Reference tracks an upstream branch
Definition: IRepository.cs:31
+
Task< bool?> AddTestMerge(TestMergeParameters testMergeParameters, string committerName, string committerEmail, string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)
Attempt to merge a GitHub pull request into HEAD
+
string Head
The SHA of the IRepository HEAD
Definition: IRepository.cs:36
+ +
bool IsGitHubRepository
If the IRepository was cloned from GitHub.com
Definition: IRepository.cs:16
+
Task< bool > Sychronize(string username, string password, string committerName, string committerEmail, Action< int > progressReporter, bool synchronizeTrackedBranch, CancellationToken cancellationToken)
Runs the synchronize event script and attempts to push any changes made to the IRepository if on a tr...
+ +
string Reference
The current reference the IRepository HEAD is using. This can be a branch or tag
Definition: IRepository.cs:41
+ +
Task CheckoutObject(string committish, Action< int > progressReporter, CancellationToken cancellationToken)
Checks out a given committish
+
+ + + + diff --git a/_i_repository_client_8cs.html b/_i_repository_client_8cs.html new file mode 100644 index 0000000000..0439b8f7e4 --- /dev/null +++ b/_i_repository_client_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/IRepositoryClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IRepositoryClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Client.Components.IRepositoryClient
 For managing the Repository More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
namespace  Tgstation.Server.Client.Components
 
+
+ + + + diff --git a/_i_repository_client_8cs_source.html b/_i_repository_client_8cs_source.html new file mode 100644 index 0000000000..130a6930dc --- /dev/null +++ b/_i_repository_client_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/IRepositoryClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IRepositoryClient.cs
+
+
+Go to the documentation of this file.
1 using System.Threading;
2 using System.Threading.Tasks;
4 
6 {
10  public interface IRepositoryClient
11  {
17  Task<Repository> Read(CancellationToken cancellationToken);
18 
25  Task<Repository> Update(Repository repository, CancellationToken cancellationToken);
26 
33  Task<Repository> Clone(Repository repository, CancellationToken cancellationToken);
34 
40  Task<Repository> Delete(CancellationToken cancellationToken);
41  }
42 }
+ +
Task< Repository > Read(CancellationToken cancellationToken)
Get the Repository represented by the IRepositoryClient
+
Task< Repository > Delete(CancellationToken cancellationToken)
Deletes the Repository
+
Task< Repository > Clone(Repository repository, CancellationToken cancellationToken)
Clones a repository
+ + +
Represents a git repository
Definition: Repository.cs:8
+ +
Task< Repository > Update(Repository repository, CancellationToken cancellationToken)
Update the Repository
+ +
+ + + + diff --git a/_i_repository_manager_8cs.html b/_i_repository_manager_8cs.html new file mode 100644 index 0000000000..3c41bf8362 --- /dev/null +++ b/_i_repository_manager_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Repository/IRepositoryManager.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IRepositoryManager.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Repository.IRepositoryManager
 Factory for creating and loading IRepositorys More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Repository
 
+
+ + + + diff --git a/_i_repository_manager_8cs_source.html b/_i_repository_manager_8cs_source.html new file mode 100644 index 0000000000..2dc2e41a01 --- /dev/null +++ b/_i_repository_manager_8cs_source.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Repository/IRepositoryManager.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IRepositoryManager.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4 
6 {
10  public interface IRepositoryManager : IDisposable
11  {
15  bool InUse { get; }
16 
20  bool CloneInProgress { get; }
21 
27  Task<IRepository> LoadRepository(CancellationToken cancellationToken);
28 
39  Task<IRepository> CloneRepository(Uri url, string initialBranch, string username, string password, Action<int> progressReporter, CancellationToken cancellationToken);
40 
46  Task DeleteRepository(CancellationToken cancellationToken);
47  }
48 }
Task< IRepository > CloneRepository(Uri url, string initialBranch, string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)
Clone the repository at url
+
Task DeleteRepository(CancellationToken cancellationToken)
Delete the current repository
+
bool InUse
If something is holding a lock on the repository
+ +
bool CloneInProgress
If a CloneRepository(Uri, string, string, string, Action<int>, CancellationToken) operation is in pro...
+
Task< IRepository > LoadRepository(CancellationToken cancellationToken)
Attempt to load the IRepository from the default location
+ + +
+ + + + diff --git a/_i_request_logger_8cs.html b/_i_request_logger_8cs.html new file mode 100644 index 0000000000..bd076f4e2d --- /dev/null +++ b/_i_request_logger_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/IRequestLogger.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IRequestLogger.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Client.IRequestLogger
 For logging HTTP requests and responses More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_i_request_logger_8cs_source.html b/_i_request_logger_8cs_source.html new file mode 100644 index 0000000000..777cabaa7a --- /dev/null +++ b/_i_request_logger_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/IRequestLogger.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IRequestLogger.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Net.Http;
3 using System.Threading;
4 using System.Threading.Tasks;
5 
7 {
11  public interface IRequestLogger
12  {
19  Task LogRequest(HttpRequestMessage requestMessage, CancellationToken cancellationToken);
20 
27  Task LogResponse(HttpResponseMessage responseMessage, CancellationToken cancellationToken);
28  }
29 }
Task LogResponse(HttpResponseMessage responseMessage, CancellationToken cancellationToken)
Log a response
+ +
For logging HTTP requests and responses
+
Task LogRequest(HttpRequestMessage requestMessage, CancellationToken cancellationToken)
Log a request
+
+ + + + diff --git a/_i_restart_handler_8cs.html b/_i_restart_handler_8cs.html new file mode 100644 index 0000000000..97ced4b655 --- /dev/null +++ b/_i_restart_handler_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IRestartHandler.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IRestartHandler.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Core.IRestartHandler
 Handler for server restarts More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_i_restart_handler_8cs_source.html b/_i_restart_handler_8cs_source.html new file mode 100644 index 0000000000..afedd6c3ee --- /dev/null +++ b/_i_restart_handler_8cs_source.html @@ -0,0 +1,85 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IRestartHandler.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IRestartHandler.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4 
6 {
10  public interface IRestartHandler
11  {
18  Task HandleRestart(Version updateVersion, CancellationToken cancellationToken);
19  }
20 }
+ +
Task HandleRestart(Version updateVersion, CancellationToken cancellationToken)
Handle a restart of the server
+
+ + + + diff --git a/_i_restart_registration_8cs.html b/_i_restart_registration_8cs.html new file mode 100644 index 0000000000..4a261c9fdd --- /dev/null +++ b/_i_restart_registration_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IRestartRegistration.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IRestartRegistration.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Core.IRestartRegistration
 Represents the lifetime of a IRestartHandler registration More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_i_restart_registration_8cs_source.html b/_i_restart_registration_8cs_source.html new file mode 100644 index 0000000000..9ee88cf2a7 --- /dev/null +++ b/_i_restart_registration_8cs_source.html @@ -0,0 +1,85 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IRestartRegistration.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IRestartRegistration.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
8  public interface IRestartRegistration : IDisposable
9  {
10  }
11 }
+ +
Represents the lifetime of a IRestartHandler registration
+
+ + + + diff --git a/_i_server_8cs.html b/_i_server_8cs.html new file mode 100644 index 0000000000..17f2b443a6 --- /dev/null +++ b/_i_server_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IServer.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IServer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.IServer
 Represents the host More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
+
+ + + + diff --git a/_i_server_8cs_source.html b/_i_server_8cs_source.html new file mode 100644 index 0000000000..b3923cd026 --- /dev/null +++ b/_i_server_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IServer.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IServer.cs
+
+
+Go to the documentation of this file.
1 using System.Threading;
2 using System.Threading.Tasks;
3 
4 namespace Tgstation.Server.Host
5 {
9  public interface IServer
10  {
14  bool RestartRequested { get; }
15 
21  Task RunAsync(CancellationToken cancellationToken);
22  }
23 }
bool RestartRequested
If the IServer should restart
Definition: IServer.cs:14
+
Represents the host
Definition: IServer.cs:9
+
Task RunAsync(CancellationToken cancellationToken)
Runs the IServer
+ +
+ + + + diff --git a/_i_server_client_8cs.html b/_i_server_client_8cs.html new file mode 100644 index 0000000000..6276877e65 --- /dev/null +++ b/_i_server_client_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/IServerClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IServerClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Client.IServerClient
 Main client for communicating with a server More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_i_server_client_8cs_source.html b/_i_server_client_8cs_source.html new file mode 100644 index 0000000000..e35fb5b4de --- /dev/null +++ b/_i_server_client_8cs_source.html @@ -0,0 +1,101 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/IServerClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IServerClient.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
5 
7 {
11  public interface IServerClient : IDisposable
12  {
16  Uri Url { get; }
17 
21  Token Token { get; set; }
22 
26  TimeSpan Timeout { get; set; }
27 
32 
37 
42 
48  Task<ServerInformation> Version(CancellationToken cancellationToken);
49 
54  void AddRequestLogger(IRequestLogger requestLogger);
55  }
56 }
+ + +
Task< ServerInformation > Version(CancellationToken cancellationToken)
The ServerInformation of the IServerClient
+ +
Uri Url
The connected server Uri
+
Represents administrative server information
+
Main client for communicating with a server
+ +
void AddRequestLogger(IRequestLogger requestLogger)
Adds a requestLogger to the request pipeline
+
Represents a JWT returned by the API
Definition: Token.cs:8
+
TimeSpan Timeout
The connection timeout
+ +
IUsersClient Users
Access the IUsersClient
+
IInstanceManagerClient Instances
Access the IInstanceManagerClient
+
For logging HTTP requests and responses
+ + + +
+ + + + diff --git a/_i_server_client_factory_8cs.html b/_i_server_client_factory_8cs.html new file mode 100644 index 0000000000..c3b3b0ace5 --- /dev/null +++ b/_i_server_client_factory_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/IServerClientFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IServerClientFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Client.IServerClientFactory
 Factory for creating IServerClients More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_i_server_client_factory_8cs_source.html b/_i_server_client_factory_8cs_source.html new file mode 100644 index 0000000000..a5ebb98b2e --- /dev/null +++ b/_i_server_client_factory_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/IServerClientFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IServerClientFactory.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
5 
7 {
11  public interface IServerClientFactory
12  {
22  Task<IServerClient> CreateServerClient(Uri host, string username, string password, TimeSpan timeout = default, CancellationToken cancellationToken = default);
23 
31  IServerClient CreateServerClient(Uri host, Token token, TimeSpan timeout = default);
32  }
33 }
+ + +
Main client for communicating with a server
+
Represents a JWT returned by the API
Definition: Token.cs:8
+
Factory for creating IServerClients
+ +
Task< IServerClient > CreateServerClient(Uri host, string username, string password, TimeSpan timeout=default, CancellationToken cancellationToken=default)
Create a IServerClient
+ +
+ + + + diff --git a/_i_server_control_8cs.html b/_i_server_control_8cs.html new file mode 100644 index 0000000000..bd3a1fbda3 --- /dev/null +++ b/_i_server_control_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IServerControl.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IServerControl.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Core.IServerControl
 Represents a service that may take an updated Host assembly and run it, stopping the current assembly in the process More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_i_server_control_8cs_source.html b/_i_server_control_8cs_source.html new file mode 100644 index 0000000000..65859448f5 --- /dev/null +++ b/_i_server_control_8cs_source.html @@ -0,0 +1,96 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/IServerControl.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IServerControl.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4 using Tgstation.Server.Host.IO;
5 
7 {
11  public interface IServerControl
12  {
16  bool WatchdogPresent { get; }
17 
25  bool ApplyUpdate(Version version, Uri updateZipUrl, IIOManager ioManager);
26 
33 
38  Task Restart();
39 
45  Task Die(Exception exception);
46  }
47 }
bool ApplyUpdate(Version version, Uri updateZipUrl, IIOManager ioManager)
Run a new Host assembly and stop the current one. This will likely trigger all active CancellationTok...
+
bool WatchdogPresent
true if live updates are supported, false. ApplyUpdate(Version, Uri, IIOManager) and Restart will fai...
+
Task Die(Exception exception)
Kill the server with a fatal exception
+ + + + +
Interface for using filesystems
Definition: IIOManager.cs:11
+
Represents the lifetime of a IRestartHandler registration
+
IRestartRegistration RegisterForRestart(IRestartHandler handler)
Register a given handler to run before stopping the server for a restart
+ + +
Represents a service that may take an updated Host assembly and run it, stopping the current assembly...
+ +
+ + + + diff --git a/_i_server_factory_8cs.html b/_i_server_factory_8cs.html new file mode 100644 index 0000000000..ef7d8b30da --- /dev/null +++ b/_i_server_factory_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IServerFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IServerFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.IServerFactory
 For creating IServers More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
+
+ + + + diff --git a/_i_server_factory_8cs_source.html b/_i_server_factory_8cs_source.html new file mode 100644 index 0000000000..3aa775c0aa --- /dev/null +++ b/_i_server_factory_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IServerFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IServerFactory.cs
+
+
+Go to the documentation of this file.
1 namespace Tgstation.Server.Host
2 {
6  public interface IServerFactory
7  {
14  IServer CreateServer(string[] args, string updatePath);
15  }
16 }
+
Represents the host
Definition: IServer.cs:9
+
IServer CreateServer(string[] args, string updatePath)
Create a IServer
+ +
+ + + + diff --git a/_i_session_controller_8cs.html b/_i_session_controller_8cs.html new file mode 100644 index 0000000000..ee8c7d6759 --- /dev/null +++ b/_i_session_controller_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/ISessionController.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ISessionController.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Components.Watchdog.ISessionController
 Handles communication with a DreamDaemon IProcess More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Watchdog
 
+
+ + + + diff --git a/_i_session_controller_8cs_source.html b/_i_session_controller_8cs_source.html new file mode 100644 index 0000000000..accb84a39d --- /dev/null +++ b/_i_session_controller_8cs_source.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/ISessionController.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ISessionController.cs
+
+
+Go to the documentation of this file.
1 using System.Threading;
2 using System.Threading.Tasks;
4 
6 {
11  {
15  Task<LaunchResult> LaunchResult { get; }
16 
20  bool IsPrimary { get; }
21 
26 
31 
35  IDmbProvider Dmb { get; }
36 
40  ushort? Port { get; }
41 
45  bool ClosePortOnReboot { get; set; }
46 
51 
55  Task OnReboot { get; }
56 
62 
69  Task<string> SendCommand(string command, CancellationToken cancellationToken);
70 
77  Task<bool> SetPort(ushort newPort, CancellationToken cancellatonToken);
78 
85  Task<bool> SetRebootState(RebootState newRebootState, CancellationToken cancellationToken);
86 
90  void ResetRebootState();
91 
96  }
97 }
+
Represents the result of trying to start a DD process
Definition: LaunchResult.cs:9
+ +
void EnableCustomChatCommands()
Enables the reading of custom chat commands from the ISessionController
+
Task< bool > SetRebootState(RebootState newRebootState, CancellationToken cancellationToken)
Attempts to change the current RebootState to newRebootState
+
bool ClosePortOnReboot
If the port should be rotated off when the world reboots
+
Handles communication with a DreamDaemon IProcess
+
bool IsPrimary
If the IDmbProvider.PrimaryDirectory of Dmb is being used
+
bool TerminationWasRequested
If the DreamDaemon instance sent a
+ +
Task< bool > SetPort(ushort newPort, CancellationToken cancellatonToken)
Causes the world to start listening on a newPort
+
ReattachInformation Release()
Releases the IProcess without terminating it. Also calls System.IDisposable.Dispose
+
ushort? Port
The current port DreamDaemon is listening on
+
Represents process lifetime
Definition: IProcessBase.cs:9
+ +
Provides absolute paths to the latest compiled .dmbs
Definition: IDmbProvider.cs:9
+
Task< string > SendCommand(string command, CancellationToken cancellationToken)
Sends a command to DreamDaemon through /world/Topic()
+
Task OnReboot
A Task that completes when the server calls /world/Reboot()
+ +
void ResetRebootState()
Changes RebootState to Components.Watchdog.RebootState.Normal without telling the DMAPI
+
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
+
Parameters necessary for duplicating a ISessionController session
+ +
ApiValidationStatus
Status of DMAPI validation
+
+ + + + diff --git a/_i_session_controller_factory_8cs.html b/_i_session_controller_factory_8cs.html new file mode 100644 index 0000000000..18b2ebef48 --- /dev/null +++ b/_i_session_controller_factory_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/ISessionControllerFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ISessionControllerFactory.cs File Reference
+
+ + + + + diff --git a/_i_session_controller_factory_8cs_source.html b/_i_session_controller_factory_8cs_source.html new file mode 100644 index 0000000000..4aac88a3ba --- /dev/null +++ b/_i_session_controller_factory_8cs_source.html @@ -0,0 +1,100 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/ISessionControllerFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ISessionControllerFactory.cs
+
+
+Go to the documentation of this file.
1 using System.Threading;
2 using System.Threading.Tasks;
5 
7 {
12  {
24  Task<ISessionController> LaunchNew(DreamDaemonLaunchParameters launchParameters, IDmbProvider dmbProvider, IByondExecutableLock currentByondLock, bool primaryPort, bool primaryDirectory, bool apiValidate, CancellationToken cancellationToken);
25 
32  Task<ISessionController> Reattach(ReattachInformation reattachInformation, CancellationToken cancellationToken);
33 
40  }
41 }
Task< ISessionController > Reattach(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Create a ISessionController from an existing DreamDaemon instance
+ +
ISessionController CreateDeadSession(IDmbProvider dmbProvider)
Creates a ISessionController that appears to have started and died with exit code -1
+ + + + +
Handles communication with a DreamDaemon IProcess
+
Task< ISessionController > LaunchNew(DreamDaemonLaunchParameters launchParameters, IDmbProvider dmbProvider, IByondExecutableLock currentByondLock, bool primaryPort, bool primaryDirectory, bool apiValidate, CancellationToken cancellationToken)
Create a ISessionController from a freshly launch DreamDaemon instance
+ + +
Represents usage of the two primary BYOND server executables
+ + +
Provides absolute paths to the latest compiled .dmbs
Definition: IDmbProvider.cs:9
+ +
Parameters necessary for duplicating a ISessionController session
+ +
+ + + + diff --git a/_i_setup_wizard_8cs.html b/_i_setup_wizard_8cs.html new file mode 100644 index 0000000000..65dafe3d1c --- /dev/null +++ b/_i_setup_wizard_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/ISetupWizard.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ISetupWizard.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Core.ISetupWizard
 The command line Configuration setup wizard More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_i_setup_wizard_8cs_source.html b/_i_setup_wizard_8cs_source.html new file mode 100644 index 0000000000..19566760af --- /dev/null +++ b/_i_setup_wizard_8cs_source.html @@ -0,0 +1,85 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/ISetupWizard.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ISetupWizard.cs
+
+
+Go to the documentation of this file.
1 using System.Threading;
2 using System.Threading.Tasks;
3 
5 {
9  interface ISetupWizard
10  {
16  Task<bool> CheckRunWizard(CancellationToken cancellationToken);
17  }
18 }
+
The command line Configuration setup wizard
Definition: ISetupWizard.cs:9
+
Task< bool > CheckRunWizard(CancellationToken cancellationToken)
Run the setup wizard if necessary
+
+ + + + diff --git a/_i_symlink_factory_8cs.html b/_i_symlink_factory_8cs.html new file mode 100644 index 0000000000..7f81cff349 --- /dev/null +++ b/_i_symlink_factory_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/ISymlinkFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ISymlinkFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.IO.ISymlinkFactory
 For creating filesystem symbolic links More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.IO
 
+
+ + + + diff --git a/_i_symlink_factory_8cs_source.html b/_i_symlink_factory_8cs_source.html new file mode 100644 index 0000000000..8b932acb9e --- /dev/null +++ b/_i_symlink_factory_8cs_source.html @@ -0,0 +1,85 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/ISymlinkFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ISymlinkFactory.cs
+
+
+Go to the documentation of this file.
1 using System.Threading;
2 using System.Threading.Tasks;
3 
5 {
9  interface ISymlinkFactory
10  {
18  Task CreateSymbolicLink(string targetPath, string linkPath, CancellationToken cancellationToken);
19  }
20 }
+ + +
+ + + + diff --git a/_i_synchronous_i_o_manager_8cs.html b/_i_synchronous_i_o_manager_8cs.html new file mode 100644 index 0000000000..6e699b47a3 --- /dev/null +++ b/_i_synchronous_i_o_manager_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/ISynchronousIOManager.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ISynchronousIOManager.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.IO.ISynchronousIOManager
 For accessing the disk in a synchronous manner More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.IO
 
+
+ + + + diff --git a/_i_synchronous_i_o_manager_8cs_source.html b/_i_synchronous_i_o_manager_8cs_source.html new file mode 100644 index 0000000000..df78b08e84 --- /dev/null +++ b/_i_synchronous_i_o_manager_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/ISynchronousIOManager.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ISynchronousIOManager.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 using System.Threading;
3 
5 {
10  {
17  IEnumerable<string> GetFiles(string path, CancellationToken cancellationToken);
18 
25  IEnumerable<string> GetDirectories(string path, CancellationToken cancellationToken);
26 
33  bool CreateDirectory(string path, CancellationToken cancellationToken);
34 
40  byte[] ReadFile(string path);
41 
47  bool DeleteDirectory(string path);
48 
57  bool WriteFileChecked(string path, byte[] data, ref string sha1InOut, CancellationToken cancellationToken);
58 
64  bool IsDirectory(string path);
65  }
66 }
bool DeleteDirectory(string path)
Deletes a directory at path if it's empty
+
bool WriteFileChecked(string path, byte[] data, ref string sha1InOut, CancellationToken cancellationToken)
Write data to a file at a given path
+
byte [] ReadFile(string path)
Read the bytes of a file at a given path
+
For accessing the disk in a synchronous manner
+
IEnumerable< string > GetDirectories(string path, CancellationToken cancellationToken)
Enumerate directories in a given path
+
IEnumerable< string > GetFiles(string path, CancellationToken cancellationToken)
Enumerate files in a given path
+
bool IsDirectory(string path)
Checks if a given path is a directory
+
bool CreateDirectory(string path, CancellationToken cancellationToken)
Create an empty directory at path
+ +
+ + + + diff --git a/_i_system_identity_8cs.html b/_i_system_identity_8cs.html new file mode 100644 index 0000000000..e92f4002e1 --- /dev/null +++ b/_i_system_identity_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/ISystemIdentity.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ISystemIdentity.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Security.ISystemIdentity
 Represents a user on the current System.Runtime.InteropServices.OSPlatform More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Security
 
+
+ + + + diff --git a/_i_system_identity_8cs_source.html b/_i_system_identity_8cs_source.html new file mode 100644 index 0000000000..c02bd66aa7 --- /dev/null +++ b/_i_system_identity_8cs_source.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/ISystemIdentity.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ISystemIdentity.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Threading;
4 using System.Threading.Tasks;
5 
7 {
11  public interface ISystemIdentity : IDisposable
12  {
16  string Uid { get; }
17 
21  string Username { get; }
22 
28 
35  Task RunImpersonated(Action action, CancellationToken cancellationToken);
36  }
37 }
Represents a user on the current System.Runtime.InteropServices.OSPlatform
+
Task RunImpersonated(Action action, CancellationToken cancellationToken)
Runs a given action in the context of the ISystemIdentity
+ + +
ISystemIdentity Clone()
Clone the ISystemIdentity creating another copy that must have IDisposable.Dispose called on it
+ +
string Uid
A unique identifier for the user
+
+ + + + diff --git a/_i_system_identity_factory_8cs.html b/_i_system_identity_factory_8cs.html new file mode 100644 index 0000000000..422241176d --- /dev/null +++ b/_i_system_identity_factory_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/ISystemIdentityFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ISystemIdentityFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Security.ISystemIdentityFactory
 Factory for ISystemIdentitys More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Security
 
+
+ + + + diff --git a/_i_system_identity_factory_8cs_source.html b/_i_system_identity_factory_8cs_source.html new file mode 100644 index 0000000000..6a3d8b841a --- /dev/null +++ b/_i_system_identity_factory_8cs_source.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/ISystemIdentityFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ISystemIdentityFactory.cs
+
+
+Go to the documentation of this file.
1 using System.Threading;
2 using System.Threading.Tasks;
4 
6 {
10  public interface ISystemIdentityFactory
11  {
18  Task<ISystemIdentity> CreateSystemIdentity(User user, CancellationToken cancellationToken);
19 
27  Task<ISystemIdentity> CreateSystemIdentity(string username, string password, CancellationToken cancellationToken);
28  }
29 }
Task< ISystemIdentity > CreateSystemIdentity(User user, CancellationToken cancellationToken)
Create a ISystemIdentity for a given user
+ + + + + + + +
+ + + + diff --git a/_i_token_factory_8cs.html b/_i_token_factory_8cs.html new file mode 100644 index 0000000000..622bcc7239 --- /dev/null +++ b/_i_token_factory_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/ITokenFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ITokenFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Security.ITokenFactory
 For creating Tokens More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Security
 
+
+ + + + diff --git a/_i_token_factory_8cs_source.html b/_i_token_factory_8cs_source.html new file mode 100644 index 0000000000..5b1801531d --- /dev/null +++ b/_i_token_factory_8cs_source.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/ITokenFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ITokenFactory.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.IdentityModel.Tokens;
2 using System.Threading;
3 using System.Threading.Tasks;
5 
7 {
11  public interface ITokenFactory
12  {
16  TokenValidationParameters ValidationParameters { get; }
17 
24  Task<Token> CreateToken(Models.User user, CancellationToken cancellationToken);
25  }
26 }
+
Task< Token > CreateToken(Models.User user, CancellationToken cancellationToken)
Create a Token for a given user
+ + +
TokenValidationParameters ValidationParameters
The TokenValidationParameters for the ITokenFactory
+ + + +
+ + + + diff --git a/_i_users_client_8cs.html b/_i_users_client_8cs.html new file mode 100644 index 0000000000..16e41437f8 --- /dev/null +++ b/_i_users_client_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/IUsersClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IUsersClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Client.IUsersClient
 For managing Users More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_i_users_client_8cs_source.html b/_i_users_client_8cs_source.html new file mode 100644 index 0000000000..7f39e1d64a --- /dev/null +++ b/_i_users_client_8cs_source.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/IUsersClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IUsersClient.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 using System.Threading;
3 using System.Threading.Tasks;
5 
7 {
11  public interface IUsersClient
12  {
18  Task<User> Read(CancellationToken cancellationToken);
19 
26  Task<User> GetId(User user, CancellationToken cancellationToken);
27 
33  Task<IReadOnlyList<User>> List(CancellationToken cancellationToken);
34 
41  Task<User> Create(UserUpdate user, CancellationToken cancellationToken);
42 
49  Task<User> Update(UserUpdate user, CancellationToken cancellationToken);
50  }
51 }
Task< User > Read(CancellationToken cancellationToken)
Read the current user's information and general rights
+ +
Task< User > GetId(User user, CancellationToken cancellationToken)
Get a specific user
+
Task< User > Create(UserUpdate user, CancellationToken cancellationToken)
Create a new user
+ + + +
Task< User > Update(UserUpdate user, CancellationToken cancellationToken)
Update a user
+ +
Task< IReadOnlyList< User > > List(CancellationToken cancellationToken)
List all Users
+ +
For editing a given User. Will never be returned by the API
Definition: UserUpdate.cs:6
+ +
+ + + + diff --git a/_identity_cache_8cs.html b/_identity_cache_8cs.html new file mode 100644 index 0000000000..8628abb14d --- /dev/null +++ b/_identity_cache_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/IdentityCache.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IdentityCache.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Security.IdentityCache
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Security
 
+
+ + + + diff --git a/_identity_cache_8cs_source.html b/_identity_cache_8cs_source.html new file mode 100644 index 0000000000..7a6965aead --- /dev/null +++ b/_identity_cache_8cs_source.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/IdentityCache.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IdentityCache.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using System;
3 using System.Collections.Generic;
4 using System.Linq;
7 
9 {
12  {
17 
21  readonly ILogger<IdentityCache> logger;
22 
26  readonly Dictionary<long, IdentityCacheObject> cachedIdentities;
27 
33  public IdentityCache(IAsyncDelayer asyncDelayer, ILogger<IdentityCache> logger)
34  {
35  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
36  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
37 
38  cachedIdentities = new Dictionary<long, IdentityCacheObject>();
39  }
40 
42  public void Dispose()
43  {
44  logger.LogTrace("Disposing...");
45  foreach (var I in cachedIdentities.Select(x => x.Value).ToList())
46  I.Dispose();
47  }
48 
50  public void CacheSystemIdentity(User user, ISystemIdentity systemIdentity, DateTimeOffset expiry)
51  {
52  if (user == null)
53  throw new ArgumentNullException(nameof(user));
54  if (systemIdentity == null)
55  throw new ArgumentNullException(nameof(systemIdentity));
56  lock (cachedIdentities)
57  {
58  var uid = systemIdentity.Uid;
59  logger.LogDebug("Caching system identity {0} of user {1}", uid, user.Id);
60 
61  if (cachedIdentities.TryGetValue(user.Id, out var identCache))
62  {
63  logger.LogTrace("Expiring previously cached identity...");
64  identCache.Dispose(); // also clears it out
65  }
66 
67  identCache = new IdentityCacheObject(systemIdentity.Clone(), asyncDelayer, () =>
68  {
69  logger.LogDebug("Expiring system identity cache for user {1}", uid, user.Id);
70  lock (cachedIdentities)
71  cachedIdentities.Remove(user.Id);
72  }, expiry);
73  cachedIdentities.Add(user.Id, identCache);
74  }
75  }
76 
79  {
80  if (user == null)
81  throw new ArgumentNullException(nameof(user));
82  lock (cachedIdentities)
83  if (cachedIdentities.TryGetValue(user.Id, out var identity))
84  return identity.SystemIdentity.Clone();
85  throw new InvalidOperationException("Cached system identity has expired!");
86  }
87  }
88 }
Represents a user on the current System.Runtime.InteropServices.OSPlatform
+ + +
readonly Dictionary< long, IdentityCacheObject > cachedIdentities
The map of Api.Models.Internal.User.Ids to IdentityCacheObjects
+ + + +
IdentityCache(IAsyncDelayer asyncDelayer, ILogger< IdentityCache > logger)
Construct an IdentityCache
+ +
void CacheSystemIdentity(User user, ISystemIdentity systemIdentity, DateTimeOffset expiry)
Keep a user 's systemIdentity alive until an expiry time
+
long Id
The ID of the User
Definition: User.cs:15
+
ISystemIdentity LoadCachedIdentity(User user)
Attempt to load a cached ISystemIdentity
+
ISystemIdentity Clone()
Clone the ISystemIdentity creating another copy that must have IDisposable.Dispose called on it
+
readonly ILogger< IdentityCache > logger
The ILogger for the IdentityCache
+ + + +
For keeping a specific ISystemIdentity alive for a period of time
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the IdentityCache
+ +
string Uid
A unique identifier for the user
+ + +
+ + + + diff --git a/_identity_cache_object_8cs.html b/_identity_cache_object_8cs.html new file mode 100644 index 0000000000..613eb5e8d6 --- /dev/null +++ b/_identity_cache_object_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/IdentityCacheObject.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IdentityCacheObject.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Security.IdentityCacheObject
 For keeping a specific ISystemIdentity alive for a period of time More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Security
 
+
+ + + + diff --git a/_identity_cache_object_8cs_source.html b/_identity_cache_object_8cs_source.html new file mode 100644 index 0000000000..9ee0d7bac3 --- /dev/null +++ b/_identity_cache_object_8cs_source.html @@ -0,0 +1,97 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/IdentityCacheObject.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IdentityCacheObject.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
5 
7 {
12  {
17 
21  readonly CancellationTokenSource cancellationTokenSource;
22 
26  readonly Task task;
27 
35  public IdentityCacheObject(ISystemIdentity systemIdentity, IAsyncDelayer asyncDelayer, Action onExpiry, DateTimeOffset expiry)
36  {
37  SystemIdentity = systemIdentity ?? throw new ArgumentNullException(nameof(systemIdentity));
38 
39  if (asyncDelayer == null)
40  throw new ArgumentNullException(nameof(asyncDelayer));
41 
42  if (onExpiry == null)
43  throw new ArgumentNullException(nameof(onExpiry));
44  var now = DateTimeOffset.Now;
45  if (expiry < now)
46  throw new ArgumentOutOfRangeException(nameof(expiry), expiry, "expiry must be greater than DateTimeOffset.Now!");
47 
48  cancellationTokenSource = new CancellationTokenSource();
49 
50  async Task DisposeOnExipiry(CancellationToken cancellationToken)
51  {
52  using (SystemIdentity)
53  try
54  {
55  await asyncDelayer.Delay(expiry - now, cancellationToken).ConfigureAwait(false);
56  }
57  finally
58  {
59  onExpiry();
60  }
61  }
62 
63  task = DisposeOnExipiry(cancellationTokenSource.Token);
64  }
65 
67  public void Dispose()
68  {
69  cancellationTokenSource.Cancel();
70  try
71  {
72  task.GetAwaiter().GetResult();
73  }
74  catch (OperationCanceledException) { }
75  cancellationTokenSource.Dispose();
76  }
77  }
78 }
readonly Task task
The Task to clean up SystemIdentity
+
IdentityCacheObject(ISystemIdentity systemIdentity, IAsyncDelayer asyncDelayer, Action onExpiry, DateTimeOffset expiry)
Construct an IdentityCache
+
ISystemIdentity SystemIdentity
The ISystemIdentity the IdentityCache manages
+
Represents a user on the current System.Runtime.InteropServices.OSPlatform
+ + + +
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+ +
readonly CancellationTokenSource cancellationTokenSource
The cancellationTokenSource for the IdentityCache
+ + +
For keeping a specific ISystemIdentity alive for a period of time
+ + +
+ + + + diff --git a/_instance_client_8cs.html b/_instance_client_8cs.html new file mode 100644 index 0000000000..9fafc7d7c0 --- /dev/null +++ b/_instance_client_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/InstanceClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InstanceClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Client.Components.InstanceClient
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
namespace  Tgstation.Server.Client.Components
 
+
+ + + + diff --git a/_instance_client_8cs_source.html b/_instance_client_8cs_source.html new file mode 100644 index 0000000000..5229aa7a77 --- /dev/null +++ b/_instance_client_8cs_source.html @@ -0,0 +1,118 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/InstanceClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
InstanceClient.cs
+
+
+Go to the documentation of this file.
1 using System;
3 
5 {
8  {
10  public Instance Metadata { get; }
11 
13  public IByondClient Byond { get; }
14 
16  public IRepositoryClient Repository { get; }
17 
20 
23 
25  public IInstanceUserClient Users { get; }
26 
28  public IChatBotsClient ChatBots { get; }
29 
31  public IDreamMakerClient DreamMaker { get; }
32 
34  public IJobsClient Jobs { get; }
35 
40 
47  {
48  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
49  Metadata = instance ?? throw new ArgumentNullException(nameof(instance));
50 
51  Byond = new ByondClient(apiClient, instance);
52  Repository = new RepositoryClient(apiClient, instance);
53  DreamDaemon = new DreamDaemonClient(apiClient, instance);
55  Users = new InstanceUserClient(apiClient, instance);
56  ChatBots = new ChatBotsClient(apiClient, instance);
57  DreamMaker = new DreamMakerClient(apiClient, instance);
58  Jobs = new JobsClient(apiClient, instance);
59  }
60  }
61 }
+ +
Represents the state of the DreamMaker compiler. Create action starts a new compile....
Definition: DreamMaker.cs:8
+ + + + + +
For managing the Byond installation
Definition: IByondClient.cs:11
+
readonly IApiClient apiClient
The IApiClient for the InstanceClient
+ + + + + + + + +
Represents a git repository
Definition: Repository.cs:8
+ + + + + + +
Metadata about a server instance
Definition: Instance.cs:9
+ + +
Represents a BYOND installation
Definition: Byond.cs:8
+ + +
Web interface for the API
Definition: IApiClient.cs:11
+
Represents an instance of BYOND's DreamDaemon game server. Create action starts the server....
Definition: DreamDaemon.cs:8
+
InstanceClient(IApiClient apiClient, Instance instance)
Construct a InstanceClient
+ + +
+ + + + diff --git a/_instance_controller_8cs.html b/_instance_controller_8cs.html new file mode 100644 index 0000000000..d936e7fb17 --- /dev/null +++ b/_instance_controller_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/InstanceController.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InstanceController.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Controllers.InstanceController
 Controller for managing Components.Instances More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Controllers
 
+
+ + + + diff --git a/_instance_controller_8cs_source.html b/_instance_controller_8cs_source.html new file mode 100644 index 0000000000..5ea4ff0039 --- /dev/null +++ b/_instance_controller_8cs_source.html @@ -0,0 +1,169 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/InstanceController.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
InstanceController.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Mvc;
2 using Microsoft.EntityFrameworkCore;
3 using Microsoft.Extensions.Logging;
4 using System;
5 using System.Collections.Generic;
6 using System.Globalization;
7 using System.IO;
8 using System.Linq;
9 using System.Linq.Expressions;
10 using System.Net;
11 using System.Reflection;
12 using System.Threading;
13 using System.Threading.Tasks;
14 using Tgstation.Server.Api;
19 using Tgstation.Server.Host.IO;
22 
24 {
28  [Route(Routes.InstanceManager)]
29  #pragma warning disable CA1506 // TODO: Decomplexify
30  public sealed class InstanceController : ModelController<Api.Models.Instance>
31  {
35  const string InstanceAttachFileName = "TGS4_ALLOW_INSTANCE_ATTACH";
36 
37  const string MoveInstanceJobPrefix = "Move instance ID ";
38 
43 
48 
53 
58 
63 
75  public InstanceController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, IIOManager ioManager, IApplication application, IPlatformIdentifier platformIdentifier, ILogger<InstanceController> logger) : base(databaseContext, authenticationContextFactory, logger, false)
76  {
77  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
78  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
79  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
80  this.application = application ?? throw new ArgumentNullException(nameof(application));
81  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
82  }
83 
84  void NormalizeModelPath(Api.Models.Instance model, out string absolutePath)
85  {
86  if (model.Path == null)
87  {
88  absolutePath = null;
89  return;
90  }
91 
92  absolutePath = ioManager.ResolvePath(model.Path);
94  model.Path = absolutePath.ToUpperInvariant();
95  else
96  model.Path = absolutePath;
97  }
98 
99  Models.InstanceUser InstanceAdminUser() => new Models.InstanceUser
100  {
101  ByondRights = (ByondRights)~0U,
108  UserId = AuthenticationContext.User.Id
109  };
110 
112  [TgsAuthorize(InstanceManagerRights.Create)]
113  public override async Task<IActionResult> Create([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
114  {
115  if (model == null)
116  throw new ArgumentNullException(nameof(model));
117 
118  if (String.IsNullOrWhiteSpace(model.Name))
119  return BadRequest(new ErrorMessage { Message = "name must not be empty!" });
120 
121  if (model.Path == null)
122  return BadRequest(new ErrorMessage { Message = "path must not be empty!" });
123 
124  NormalizeModelPath(model, out var rawPath);
125 
126  var localPath = ioManager.ResolvePath(".");
127  NormalizeModelPath(new Api.Models.Instance
128  {
129  Path = localPath
130  }, out var normalizedLocalPath);
131 
132  if (rawPath.StartsWith(normalizedLocalPath, StringComparison.Ordinal))
133  return Conflict("Instances cannot be created in the installation directory!");
134 
135  var dirExistsTask = ioManager.DirectoryExists(model.Path, cancellationToken);
136  bool attached = false;
137  if (await ioManager.FileExists(model.Path, cancellationToken).ConfigureAwait(false) || await dirExistsTask.ConfigureAwait(false))
138  if (!await ioManager.FileExists(ioManager.ConcatPath(model.Path, InstanceAttachFileName), cancellationToken).ConfigureAwait(false))
139  return Conflict(new ErrorMessage { Message = "Path not empty!" });
140  else
141  attached = true;
142 
143  var newInstance = new Models.Instance
144  {
145  ConfigurationType = model.ConfigurationType ?? ConfigurationType.Disallowed,
147  {
148  AllowWebClient = false,
149  AutoStart = false,
150  PrimaryPort = 1337,
151  SecondaryPort = 1338,
152  SecurityLevel = DreamDaemonSecurity.Safe,
153  SoftRestart = false,
154  SoftShutdown = false,
155  StartupTimeout = 20
156  },
158  {
159  ApiValidationPort = 1339,
160  ApiValidationSecurityLevel = DreamDaemonSecurity.Safe
161  },
162  Name = model.Name,
163  Online = false,
164  Path = model.Path,
165  AutoUpdateInterval = model.AutoUpdateInterval ?? 0,
167  {
168  CommitterEmail = "tgstation-server@users.noreply.github.com",
169  CommitterName = application.VersionPrefix,
170  PushTestMergeCommits = false,
171  ShowTestMergeCommitters = false,
172  AutoUpdatesKeepTestMerges = false,
173  AutoUpdatesSynchronize = false,
174  PostTestMergeComment = false
175  },
176  InstanceUsers = new List<Models.InstanceUser> // give this user full privileges on the instance
177  {
179  }
180  };
181 
182  DatabaseContext.Instances.Add(newInstance);
183  try
184  {
185  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
186 
187  try
188  {
189  // actually reserve it now
190  await ioManager.CreateDirectory(rawPath, cancellationToken).ConfigureAwait(false);
191  await ioManager.DeleteFile(ioManager.ConcatPath(rawPath, InstanceAttachFileName), cancellationToken).ConfigureAwait(false);
192  }
193  catch
194  {
195  // oh shit delete the model
196  DatabaseContext.Instances.Remove(newInstance);
197 
198  await DatabaseContext.Save(default).ConfigureAwait(false);
199  throw;
200  }
201  }
202  catch (IOException e)
203  {
204  return Conflict(new ErrorMessage { Message = e.Message });
205  }
206  catch (DbUpdateException e)
207  {
208  return Conflict(new ErrorMessage { Message = e.Message });
209  }
210 
211  Logger.LogInformation("{0} {1} instance {2}: {3} ({4})", AuthenticationContext.User.Name, attached ? "attached" : "created", newInstance.Name, newInstance.Id, newInstance.Path);
212 
213  var api = newInstance.ToApi();
214  return attached ? (IActionResult)Json(api) : StatusCode((int)HttpStatusCode.Created, api);
215  }
216 
218  [TgsAuthorize(InstanceManagerRights.Delete)]
219  public override async Task<IActionResult> Delete(long id, CancellationToken cancellationToken)
220  {
221  var originalModel = await DatabaseContext.Instances.Where(x => x.Id == id)
222  .Include(x => x.WatchdogReattachInformation)
223  .Include(x => x.WatchdogReattachInformation.Alpha)
224  .Include(x => x.WatchdogReattachInformation.Bravo)
225  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
226  if (originalModel == default)
227  return StatusCode((int)HttpStatusCode.Gone);
228  if (originalModel.Online.Value)
229  return Conflict(new ErrorMessage
230  {
231  Message = "Cannot detach an online instance!"
232  });
233 
234  if (originalModel.WatchdogReattachInformation != null)
235  {
236  DatabaseContext.WatchdogReattachInformations.Remove(originalModel.WatchdogReattachInformation);
237  if (originalModel.WatchdogReattachInformation.Alpha != null)
238  DatabaseContext.ReattachInformations.Remove(originalModel.WatchdogReattachInformation.Alpha);
239  if (originalModel.WatchdogReattachInformation.Bravo != null)
240  DatabaseContext.ReattachInformations.Remove(originalModel.WatchdogReattachInformation.Bravo);
241  }
242 
243  DatabaseContext.Instances.Remove(originalModel);
244 
245  var attachFileName = ioManager.ConcatPath(originalModel.Path, InstanceAttachFileName);
246  await ioManager.WriteAllBytes(attachFileName, Array.Empty<byte>(), default).ConfigureAwait(false);
247  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false); // cascades everything
248  return Ok();
249  }
250 
252  [TgsAuthorize(InstanceManagerRights.Relocate | InstanceManagerRights.Rename | InstanceManagerRights.SetAutoUpdate | InstanceManagerRights.SetConfiguration | InstanceManagerRights.SetOnline)]
253  #pragma warning disable CA1502 // TODO: Decomplexify
254  public override async Task<IActionResult> Update([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
255  {
256  var instanceQuery = DatabaseContext.Instances.Where(x => x.Id == model.Id);
257 
258  var moveJob = await instanceQuery
259  .SelectMany(x => x.Jobs).
260 #pragma warning disable CA1307 // Specify StringComparison
261  Where(x => !x.StoppedAt.HasValue && x.Description.StartsWith(MoveInstanceJobPrefix))
262 #pragma warning restore CA1307 // Specify StringComparison
263  .Select(x => new Models.Job
264  {
265  Id = x.Id
266  }).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
267 
268  if (moveJob != default)
269  await jobManager.CancelJob(moveJob, AuthenticationContext.User, true, cancellationToken).ConfigureAwait(false); // cancel it now
270 
271  var usersInstanceUserTask = instanceQuery.SelectMany(x => x.InstanceUsers).Where(x => x.UserId == AuthenticationContext.User.Id).FirstOrDefaultAsync(cancellationToken);
272 
273  var originalModel = await instanceQuery
274  .Include(x => x.RepositorySettings)
275  .Include(x => x.ChatSettings)
276  .ThenInclude(x => x.Channels)
277  .Include(x => x.DreamDaemonSettings) // need these for onlining
278  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
279  if (originalModel == default(Models.Instance))
280  return StatusCode((int)HttpStatusCode.Gone);
281 
282  var userRights = (InstanceManagerRights)AuthenticationContext.GetRight(RightsType.InstanceManager);
283  bool CheckModified<T>(Expression<Func<Api.Models.Instance, T>> expression, InstanceManagerRights requiredRight)
284  {
285  var memberSelectorExpression = (MemberExpression)expression.Body;
286  var property = (PropertyInfo)memberSelectorExpression.Member;
287 
288  var newVal = property.GetValue(model);
289  if (newVal == null)
290  return false;
291  if (!userRights.HasFlag(requiredRight) && property.GetValue(originalModel) != newVal)
292  return true;
293 
294  property.SetValue(originalModel, newVal);
295  return false;
296  }
297 
298  string originalModelPath = null;
299  string rawPath = null;
300  if (model.Path != null)
301  {
302  NormalizeModelPath(model, out rawPath);
303 
304  if (model.Path != originalModel.Path)
305  {
306  if (!userRights.HasFlag(InstanceManagerRights.Relocate))
307  return Forbid();
308  if (originalModel.Online.Value && model.Online != true)
309  return Conflict(new ErrorMessage { Message = "Cannot relocate an online instance!" });
310 
311  var dirExistsTask = ioManager.DirectoryExists(model.Path, cancellationToken);
312  if (await ioManager.FileExists(model.Path, cancellationToken).ConfigureAwait(false) || await dirExistsTask.ConfigureAwait(false))
313  return Conflict(new ErrorMessage { Message = "Path not empty!" });
314 
315  originalModelPath = originalModel.Path;
316  originalModel.Path = model.Path;
317  }
318  }
319 
320  var oldAutoUpdateInterval = originalModel.AutoUpdateInterval.Value;
321  var originalOnline = originalModel.Online.Value;
322  var renamed = model.Name != null && originalModel.Name != model.Name;
323 
324  if (CheckModified(x => x.AutoUpdateInterval, InstanceManagerRights.SetAutoUpdate)
325  || CheckModified(x => x.ConfigurationType, InstanceManagerRights.SetConfiguration)
326  || CheckModified(x => x.Name, InstanceManagerRights.Rename)
327  || CheckModified(x => x.Online, InstanceManagerRights.SetOnline))
328  return Forbid();
329 
330  // ensure the current user has write privilege on the instance
331  var usersInstanceUser = await usersInstanceUserTask.ConfigureAwait(false);
332  if (usersInstanceUser == default)
333  {
334  var instanceAdminUser = InstanceAdminUser();
335  instanceAdminUser.InstanceId = originalModel.Id;
336  DatabaseContext.InstanceUsers.Add(instanceAdminUser);
337  }
338  else
339  usersInstanceUser.InstanceUserRights |= InstanceUserRights.WriteUsers;
340 
341  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
342 
343  if (renamed)
344  instanceManager.GetInstance(originalModel).Rename(originalModel.Name);
345 
346  var oldAutoStart = originalModel.DreamDaemonSettings.AutoStart;
347  try
348  {
349  if (originalOnline && model.Online == false)
350  await instanceManager.OfflineInstance(originalModel, AuthenticationContext.User, cancellationToken).ConfigureAwait(false);
351  else if (!originalOnline && model.Online == true)
352  {
353  // force autostart false here because we don't want any long running jobs right now
354  // remember to document this
355  originalModel.DreamDaemonSettings.AutoStart = false;
356  await instanceManager.OnlineInstance(originalModel, cancellationToken).ConfigureAwait(false);
357  }
358  }
359  catch (Exception e)
360  {
361  if(!(e is OperationCanceledException))
362  Logger.LogError("Error changing instance online state! Exception: {0}", e);
363  originalModel.Online = originalOnline;
364  originalModel.DreamDaemonSettings.AutoStart = oldAutoStart;
365  if (originalModelPath != null)
366  originalModel.Path = originalModelPath;
367  await DatabaseContext.Save(default).ConfigureAwait(false);
368  throw;
369  }
370 
371  var api = (AuthenticationContext.GetRight(RightsType.InstanceManager) & (ulong)InstanceManagerRights.Read) != 0 ? originalModel.ToApi() : new Api.Models.Instance
372  {
373  Id = originalModel.Id
374  };
375  if (originalModelPath != null)
376  {
377  var job = new Models.Job
378  {
379  Description = String.Format(CultureInfo.InvariantCulture, MoveInstanceJobPrefix + "{0} from {1} to {2}", originalModel.Id, originalModel.Path, rawPath),
380  Instance = originalModel,
381  CancelRightsType = RightsType.InstanceManager,
382  CancelRight = (ulong)InstanceManagerRights.Relocate,
383  StartedBy = AuthenticationContext.User
384  };
385 
386  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressHandler, ct) => instanceManager.MoveInstance(originalModel, rawPath, ct), cancellationToken).ConfigureAwait(false);
387  api.MoveJob = job.ToApi();
388  }
389 
390  if (originalModel.Online.Value && model.AutoUpdateInterval.HasValue && oldAutoUpdateInterval != model.AutoUpdateInterval)
391  await instanceManager.GetInstance(originalModel).SetAutoUpdateInterval(model.AutoUpdateInterval.Value).ConfigureAwait(false);
392 
393  return Json(api);
394  }
395  #pragma warning restore CA1502
396 
398  [TgsAuthorize(InstanceManagerRights.List | InstanceManagerRights.Read)]
399  public override async Task<IActionResult> List(CancellationToken cancellationToken)
400  {
401  IQueryable<Models.Instance> query = DatabaseContext.Instances;
403  query = query.Where(x => x.InstanceUsers.Any(y => y.UserId == AuthenticationContext.User.Id)).Where(x => x.InstanceUsers.Any(y => y.AnyRights));
404 
405  var moveJobTasks = query
406  .SelectMany(x => x.Jobs)
407 #pragma warning disable CA1307 // Specify StringComparison
408  .Where(x => !x.StoppedAt.HasValue && x.Description.StartsWith(MoveInstanceJobPrefix))
409 #pragma warning restore CA1307 // Specify StringComparison
410  .Include(x => x.StartedBy).ThenInclude(x => x.CreatedBy)
411  .Include(x => x.Instance)
412  .ToListAsync(cancellationToken);
413  var instances = await query.ToListAsync(cancellationToken).ConfigureAwait(false);
414  var apis = instances.Select(x => x.ToApi());
415  var moveJobs = await moveJobTasks.ConfigureAwait(false);
416  foreach(var I in moveJobs)
417  apis.Where(x => x.Id == I.Instance.Id).First().MoveJob = I.ToApi(); // if this .First() fails i will personally murder kevinz000 because I just know he is somehow responsible
418  return Json(apis);
419  }
420 
422  [TgsAuthorize(InstanceManagerRights.List | InstanceManagerRights.Read)]
423  public override async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
424  {
425  var query = DatabaseContext.Instances.Where(x => x.Id == id);
426  var cantList = !AuthenticationContext.User.InstanceManagerRights.Value.HasFlag(InstanceManagerRights.List);
427 
428  if (cantList)
429  query = query.Include(x => x.InstanceUsers);
430 
431  var moveJobTask = query
432  .SelectMany(x => x.Jobs)
433 #pragma warning disable CA1307 // Specify StringComparison
434  .Where(x => !x.StoppedAt.HasValue && x.Description.StartsWith(MoveInstanceJobPrefix))
435 #pragma warning restore CA1307 // Specify StringComparison
436  .Include(x => x.StartedBy).ThenInclude(x => x.CreatedBy)
437  .FirstOrDefaultAsync(cancellationToken);
438  var instance = await query.FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
439 
440  if (instance == null)
441  return StatusCode((int)HttpStatusCode.Gone);
442 
443  if (cantList && !instance.InstanceUsers.Any(x => x.UserId == AuthenticationContext.User.Id && x.AnyRights))
444  return Forbid();
445 
446  var api = instance.ToApi();
447  api.MoveJob = (await moveJobTask.ConfigureAwait(false))?.ToApi();
448  return Json(api);
449  }
450  }
451 }
string Name
The name of the User
Definition: User.cs:38
+ + +
Manages the runtime of Jobs
Definition: IJobManager.cs:12
+ +
ConfigurationRights
Rights for Models.ConfigurationFile
+
InstanceController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, IIOManager ioManager, IApplication application, IPlatformIdentifier platformIdentifier, ILogger< InstanceController > logger)
Construct a InstanceController
+ +
User can enable Models.Internal.DreamDaemonSettings.SoftRestart
+ +
Task MoveInstance(Models.Instance metadata, string newPath, CancellationToken cancellationToken)
Move an IInstance
+ + +
ByondRights
Rights for Models.Byond
Definition: ByondRights.cs:9
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
DbSet< ReattachInformation > ReattachInformations
+
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+
const string InstanceAttachFileName
File name to allow attaching instances
+ +
InstanceUserRights
Rights for an Models.Instance
+
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+
readonly IInstanceManager instanceManager
The IInstanceManager for the InstanceController
+
readonly IApplication application
The IApplication for the InstanceController
+
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+ + +
string VersionPrefix
Prefix to VersionString
Definition: IApplication.cs:13
+ +
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
ConfigurationType
The type of configuration allowed on an Instance
+
Task CreateDirectory(string path, CancellationToken cancellationToken)
Create a directory at path
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+
Controller for managing Components.Instances
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+ +
Task RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
Registers a given Job and begins running it
+
readonly IIOManager ioManager
The IIOManager for the InstanceController
+
readonly IJobManager jobManager
The IJobManager for the InstanceController
+ +
Routes to a server actions
Definition: Routes.cs:9
+
DreamDaemonRights
Rights for Models.DreamDaemon
+
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists
+
Task OfflineInstance(Models.Instance metadata, User user, CancellationToken cancellationToken)
Offline an IInstance
+
Task OnlineInstance(Models.Instance metadata, CancellationToken cancellationToken)
Online an IInstance
+
InstanceManagerRights
Rights for managing Models.Instances
+
string Message
A human readable description of the error
Definition: ErrorMessage.cs:13
+
bool IsWindows
If the current platform is a Windows platform
+
DreamMakerRights
Rights for Models.DreamMaker
+ +
InstanceManagerRights? InstanceManagerRights
The Rights.InstanceManagerRights for the User
Definition: User.cs:50
+ +
override async Task< IActionResult > Create([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
+
RepositoryRights
Rights for a Models.Repository
+
An ApiController representing a TModel
+ +
override async Task< IActionResult > List(CancellationToken cancellationToken)
Attempt to list entries of the TModel
+
Task< bool > CancelJob(Job job, User user, bool blocking, CancellationToken cancellationToken)
Cancels a give job
+ +
const string InstanceManager
The Models.Instance controller
Definition: Routes.cs:29
+
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the InstanceController
+
void Rename(string newName)
Rename the IInstance
+ +
long Id
The ID of the User
Definition: User.cs:15
+
Metadata about a server instance
Definition: Instance.cs:9
+ +
override async Task< IActionResult > Delete(long id, CancellationToken cancellationToken)
Attempt to delete a model with a particular id
+ + +
DbSet< WatchdogReattachInformation > WatchdogReattachInformations
+
DreamDaemonSecurity
DreamDaemon's security level
+
Interface for using filesystems
Definition: IIOManager.cs:11
+
override async Task< IActionResult > Update([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
+
override async Task< IActionResult > GetId(long id, CancellationToken cancellationToken)
Attempt to get a specific a TModel
+
For identifying the current platform
+
Task DeleteFile(string path, CancellationToken cancellationToken)
Deletes a file at path
+
ChatBotRights
Rights for Models.ChatBot
Definition: ChatBotRights.cs:9
+
void NormalizeModelPath(Api.Models.Instance model, out string absolutePath)
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
User can enable Models.Internal.DreamDaemonSettings.SoftShutdown
+ +
Task< bool > DirectoryExists(string path, CancellationToken cancellationToken)
Check that the directory at path exists
+ + +
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
Task SetAutoUpdateInterval(uint newInterval)
Change the Api.Models.Instance.AutoUpdateInterval for the IInstance
+ + +
+ + + + diff --git a/_instance_factory_8cs.html b/_instance_factory_8cs.html new file mode 100644 index 0000000000..16940797fb --- /dev/null +++ b/_instance_factory_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/InstanceFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InstanceFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Components.InstanceFactory
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
+
+ + + + diff --git a/_instance_factory_8cs_source.html b/_instance_factory_8cs_source.html new file mode 100644 index 0000000000..d44719ff4b --- /dev/null +++ b/_instance_factory_8cs_source.html @@ -0,0 +1,152 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/InstanceFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
InstanceFactory.cs
+
+
+Go to the documentation of this file.
1 using Byond.TopicSender;
2 using Microsoft.Extensions.Logging;
3 using System;
4 using System.Threading;
5 using System.Threading.Tasks;
13 using Tgstation.Server.Host.IO;
15 
17 {
20  {
25 
30 
35 
39  readonly ILoggerFactory loggerFactory;
40 
44  readonly IByondTopicSender byondTopicSender;
45 
50 
55 
60 
65 
70 
75 
80 
85 
90 
95 
100 
105 
110 
133  {
134  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
135  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
136  this.application = application ?? throw new ArgumentNullException(nameof(application));
137  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
138  this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
139  this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
140  this.synchronousIOManager = synchronousIOManager ?? throw new ArgumentNullException(nameof(synchronousIOManager));
141  this.symlinkFactory = symlinkFactory ?? throw new ArgumentNullException(nameof(symlinkFactory));
142  this.byondInstaller = byondInstaller ?? throw new ArgumentNullException(nameof(byondInstaller));
143  this.chatFactory = chatFactory ?? throw new ArgumentNullException(nameof(chatFactory));
144  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
145  this.postWriteHandler = postWriteHandler ?? throw new ArgumentNullException(nameof(postWriteHandler));
146  this.watchdogFactory = watchdogFactory ?? throw new ArgumentNullException(nameof(watchdogFactory));
147  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
148  this.credentialsProvider = credentialsProvider ?? throw new ArgumentNullException(nameof(credentialsProvider));
149  this.networkPromptReaper = networkPromptReaper ?? throw new ArgumentNullException(nameof(networkPromptReaper));
150  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
151  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
152  }
153 
155  #pragma warning disable CA1506 // TODO: Decomplexify
156  public IInstance CreateInstance(Models.Instance metadata)
157  {
158  // Create the ioManager for the instance
159  var instanceIoManager = new ResolvingIOManager(ioManager, metadata.Path);
160 
161  // various other ioManagers
162  var repoIoManager = new ResolvingIOManager(instanceIoManager, "Repository");
163  var byondIOManager = new ResolvingIOManager(instanceIoManager, "Byond");
164  var gameIoManager = new ResolvingIOManager(instanceIoManager, "Game");
165  var configurationIoManager = new ResolvingIOManager(instanceIoManager, "Configuration");
166 
167  var configuration = new StaticFiles.Configuration(configurationIoManager, synchronousIOManager, symlinkFactory, processExecutor, postWriteHandler, platformIdentifier, loggerFactory.CreateLogger<StaticFiles.Configuration>());
168  var eventConsumer = new EventConsumer(configuration);
169 
170  var dmbFactory = new DmbFactory(databaseContextFactory, gameIoManager, loggerFactory.CreateLogger<DmbFactory>(), metadata.CloneMetadata());
171  try
172  {
173  var repoManager = new RepositoryManager(metadata.RepositorySettings, repoIoManager, eventConsumer, credentialsProvider, loggerFactory.CreateLogger<Repository.Repository>(), loggerFactory.CreateLogger<RepositoryManager>());
174  try
175  {
176  var byond = new ByondManager(byondIOManager, byondInstaller, eventConsumer, loggerFactory.CreateLogger<ByondManager>());
177 
178  var commandFactory = new CommandFactory(application, byond, repoManager, databaseContextFactory, metadata);
179 
180  var chat = chatFactory.CreateChat(instanceIoManager, commandFactory, metadata.ChatSettings);
181  try
182  {
183  var sessionControllerFactory = new SessionControllerFactory(processExecutor, byond, byondTopicSender, cryptographySuite, application, gameIoManager, chat, networkPromptReaper, platformIdentifier, loggerFactory, metadata.CloneMetadata());
184  var reattachInfoHandler = new ReattachInfoHandler(databaseContextFactory, dmbFactory, loggerFactory.CreateLogger<ReattachInfoHandler>(), metadata.CloneMetadata());
185  var watchdog = watchdogFactory.CreateWatchdog(chat, dmbFactory, reattachInfoHandler, configuration, sessionControllerFactory, metadata.CloneMetadata(), metadata.DreamDaemonSettings);
186  eventConsumer.SetWatchdog(watchdog);
187  commandFactory.SetWatchdog(watchdog);
188  try
189  {
190  var dreamMaker = new DreamMaker(byond, gameIoManager, configuration, sessionControllerFactory, dmbFactory, application, eventConsumer, chat, processExecutor, watchdog, loggerFactory.CreateLogger<DreamMaker>());
191 
192  return new Instance(metadata.CloneMetadata(), repoManager, byond, dreamMaker, watchdog, chat, configuration, dmbFactory, databaseContextFactory, dmbFactory, jobManager, eventConsumer, gitHubClientFactory, loggerFactory.CreateLogger<Instance>());
193  }
194  catch
195  {
196  watchdog.Dispose();
197  throw;
198  }
199  }
200  catch
201  {
202  chat.Dispose();
203  throw;
204  }
205  }
206  catch
207  {
208  repoManager.Dispose();
209  throw;
210  }
211  }
212  catch
213  {
214  dmbFactory.Dispose();
215  throw;
216  }
217  }
218  #pragma warning restore CA1506
219 
221  public Task StartAsync(CancellationToken cancellationToken) => byondInstaller.CleanCache(cancellationToken);
222 
224  public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
225  }
226 }
+
readonly ISynchronousIOManager synchronousIOManager
The ISynchronousIOManager for the InstanceFactory
+
Manages the runtime of Jobs
Definition: IJobManager.cs:12
+
readonly IByondInstaller byondInstaller
The IByondInstaller for the InstanceFactory
+ +
IChat CreateChat(IIOManager ioManager, ICommandFactory commandFactory, IEnumerable< Models.ChatBot > initialChatBots)
Create a IChat
+ +
Task StartAsync(CancellationToken cancellationToken)
+ +
Handles changing file modes/permissions after writing
+ +
An IIOManager that resolve relative paths from another IIOManager to a subdirectory of that
+
IWatchdog CreateWatchdog(IChat chat, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IEventConsumer eventConsumer, ISessionControllerFactory sessionControllerFactory, Api.Models.Instance instance, DreamDaemonSettings settings)
Creates a IWatchdog
+
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+
Task StopAsync(CancellationToken cancellationToken)
+ +
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the InstanceFactory
+
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
+ + +
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the InstanceFactory
+
InstanceFactory(IIOManager ioManager, IDatabaseContextFactory databaseContextFactory, IApplication application, ILoggerFactory loggerFactory, IByondTopicSender byondTopicSender, ICryptographySuite cryptographySuite, ISynchronousIOManager synchronousIOManager, ISymlinkFactory symlinkFactory, IByondInstaller byondInstaller, IChatFactory chatFactory, IProcessExecutor processExecutor, IPostWriteHandler postWriteHandler, IWatchdogFactory watchdogFactory, IJobManager jobManager, ICredentialsProvider credentialsProvider, INetworkPromptReaper networkPromptReaper, IGitHubClientFactory gitHubClientFactory, IPlatformIdentifier platformIdentifier)
Construct an InstanceFactory
+ +
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the InstanceFactory
+ +
readonly IApplication application
The IApplication for the InstanceFactory
+ +
Repository(LibGit2Sharp.IRepository repository, IIOManager ioMananger, IEventConsumer eventConsumer, ICredentialsProvider credentialsProvider, ILogger< Repository > logger, Action onDispose)
Construct a Repository
Definition: Repository.cs:103
+
Contains various cryptographic functions
+
readonly IProcessExecutor processExecutor
The IProcessExecutor for the InstanceFactory
+ + +
readonly INetworkPromptReaper networkPromptReaper
The INetworkPromptReaper for the InstanceFactory
+
readonly IPostWriteHandler postWriteHandler
The IPostWriteHandler for the InstanceFactory
+ +
For downloading and installing BYOND extractions for a given system
+ +
For accessing the disk in a synchronous manner
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the InstanceFactory
+
readonly IWatchdogFactory watchdogFactory
The IWatchdogFactory for the InstanceFactory
+ + +
Task CleanCache(CancellationToken cancellationToken)
Attempts to cleans the BYOND cache folder for the system
+ + + +
For interacting with the instance services
Definition: IInstance.cs:17
+
readonly ICredentialsProvider credentialsProvider
The ICredentialsProvider for the InstanceFactory
+
readonly IIOManager ioManager
The IIOManager for the InstanceFactory
+
readonly IGitHubClientFactory gitHubClientFactory
The IGitHubClientFactory for the InstanceFactory
+
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the InstanceFactory
+ +
readonly ISymlinkFactory symlinkFactory
The ISymlinkFactory for the InstanceFactory
+
readonly IJobManager jobManager
The IJobManager for the InstanceFactory
+
readonly IChatFactory chatFactory
The IProviderFactory for the InstanceFactory
+ + + + +
IInstance CreateInstance(Models.Instance metadata)
Create an IInstance
+
Interface for using filesystems
Definition: IIOManager.cs:11
+ +
On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort()....
+
For identifying the current platform
+ + + + + + +
+ + + + diff --git a/_instance_manager_8cs.html b/_instance_manager_8cs.html new file mode 100644 index 0000000000..283b5d5c35 --- /dev/null +++ b/_instance_manager_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/InstanceManager.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InstanceManager.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Components.InstanceManager
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
+
+ + + + diff --git a/_instance_manager_8cs_source.html b/_instance_manager_8cs_source.html new file mode 100644 index 0000000000..2b053270e3 --- /dev/null +++ b/_instance_manager_8cs_source.html @@ -0,0 +1,128 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/InstanceManager.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
InstanceManager.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore;
2 using Microsoft.Extensions.Hosting;
3 using Microsoft.Extensions.Logging;
4 using System;
5 using System.Collections.Generic;
6 using System.Linq;
7 using System.Threading;
8 using System.Threading.Tasks;
10 using Tgstation.Server.Host.IO;
11 
13 {
16  {
21 
26 
31 
36 
41 
46 
50  readonly ILogger<InstanceManager> logger;
51 
55  readonly Dictionary<long, IInstance> instances;
56 
61 
65  bool disposed;
66 
78  {
79  this.instanceFactory = instanceFactory ?? throw new ArgumentNullException(nameof(instanceFactory));
80  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
81  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
82  this.application = application ?? throw new ArgumentNullException(nameof(application));
83  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
84  this.serverControl = serverControl ?? throw new ArgumentNullException(nameof(serverControl));
85  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
86 
88 
89  instances = new Dictionary<long, IInstance>();
90  }
91 
93  public void Dispose()
94  {
95  lock (this)
96  {
97  if (disposed)
98  return;
99  disposed = true;
100  }
101 
102  foreach (var I in instances)
103  I.Value.Dispose();
104  }
105 
107  public IInstance GetInstance(Models.Instance metadata)
108  {
109  if (metadata == null)
110  throw new ArgumentNullException(nameof(metadata));
111  lock (this)
112  {
113  if (!instances.TryGetValue(metadata.Id, out IInstance instance))
114  throw new InvalidOperationException("Instance not online!");
115  return instance;
116  }
117  }
118 
120  public async Task MoveInstance(Models.Instance instance, string newPath, CancellationToken cancellationToken)
121  {
122  if (newPath == null)
123  throw new ArgumentNullException(nameof(newPath));
124  if (instance.Online.Value)
125  throw new InvalidOperationException("Cannot move an online instance!");
126  var oldPath = instance.Path;
127  await ioManager.CopyDirectory(oldPath, newPath, null, cancellationToken).ConfigureAwait(false);
129  {
130  var targetInstance = new Models.Instance
131  {
132  Id = instance.Id
133  };
134  db.Instances.Attach(targetInstance);
135  targetInstance.Path = newPath;
136  return db.Save(cancellationToken);
137  }).ConfigureAwait(false);
138  await ioManager.DeleteDirectory(oldPath, cancellationToken).ConfigureAwait(false);
139  }
140 
142  public async Task OfflineInstance(Models.Instance metadata, Models.User user, CancellationToken cancellationToken)
143  {
144  if (metadata == null)
145  throw new ArgumentNullException(nameof(metadata));
146  logger.LogInformation("Offlining instance ID {0}", metadata.Id);
147  IInstance instance;
148  lock (this)
149  {
150  if (!instances.TryGetValue(metadata.Id, out instance))
151  throw new InvalidOperationException("Instance not online!");
152  instances.Remove(metadata.Id);
153  }
154 
155  try
156  {
157  // we are the one responsible for cancelling his jobs
158  var tasks = new List<Task>();
159  await databaseContextFactory.UseContext(async db =>
160  {
161  var jobs = db.Jobs.Where(x => x.Instance.Id == metadata.Id).Select(x => new Models.Job
162  {
163  Id = x.Id
164  }).ToAsyncEnumerable();
165  await jobs.ForEachAsync(job =>
166  {
167  lock (tasks)
168  tasks.Add(jobManager.CancelJob(job, user, true, cancellationToken));
169  }, cancellationToken).ConfigureAwait(false);
170  }).ConfigureAwait(false);
171 
172  await Task.WhenAll(tasks).ConfigureAwait(false);
173 
174  await instance.StopAsync(cancellationToken).ConfigureAwait(false);
175  }
176  finally
177  {
178  instance.Dispose();
179  }
180  }
181 
183  public async Task OnlineInstance(Models.Instance metadata, CancellationToken cancellationToken)
184  {
185  if (metadata == null)
186  throw new ArgumentNullException(nameof(metadata));
187  logger.LogInformation("Onlining instance ID {0} ({1}) at {2}", metadata.Id, metadata.Name, metadata.Path);
188  var instance = instanceFactory.CreateInstance(metadata);
189  try
190  {
191  lock (this)
192  {
193  if (instances.ContainsKey(metadata.Id))
194  throw new InvalidOperationException("Instance already online!");
195  instances.Add(metadata.Id, instance);
196  }
197  }
198  catch
199  {
200  instance.Dispose();
201  throw;
202  }
203 
204  await instance.StartAsync(cancellationToken).ConfigureAwait(false);
205  }
206 
208  #pragma warning disable CA1506 // TODO: Decomplexify
209  public Task StartAsync(CancellationToken cancellationToken) => databaseContextFactory.UseContext(async databaseContext =>
210  {
211  try
212  {
213  var factoryStartup = instanceFactory.StartAsync(cancellationToken);
214  await databaseContext.Initialize(cancellationToken).ConfigureAwait(false);
215  await jobManager.StartAsync(cancellationToken).ConfigureAwait(false);
216  var dbInstances = databaseContext.Instances.Where(x => x.Online.Value)
217  .Include(x => x.RepositorySettings)
218  .Include(x => x.ChatSettings)
219  .ThenInclude(x => x.Channels)
220  .Include(x => x.DreamDaemonSettings)
221  .ToAsyncEnumerable();
222  var tasks = new List<Task>();
223  await factoryStartup.ConfigureAwait(false);
224  await dbInstances.ForEachAsync(metadata => tasks.Add(metadata.Online.Value ? OnlineInstance(metadata, cancellationToken) : Task.CompletedTask), cancellationToken).ConfigureAwait(false);
225  await Task.WhenAll(tasks).ConfigureAwait(false);
226  logger.LogInformation("Server ready!");
227  application.Ready(null);
228  }
229  catch (OperationCanceledException)
230  {
231  logger.LogInformation("Cancelled instance manager initialization!");
232  }
233  catch (Exception e)
234  {
235  logger.LogCritical("Instance manager startup error! Exception: {0}", e);
236  application.Ready(e);
237  try
238  {
239  await serverControl.Die(e).ConfigureAwait(false);
240  }
241  catch (Exception e2)
242  {
243  logger.LogCritical("Failed to kill server! Exception: {0}", e2);
244  }
245  }
246  });
247  #pragma warning restore CA1506 // TODO: Decomplexify
248 
250  public async Task StopAsync(CancellationToken cancellationToken)
251  {
252  await jobManager.StopAsync(cancellationToken).ConfigureAwait(false);
253  await Task.WhenAll(instances.Select(x => x.Value.StopAsync(cancellationToken))).ConfigureAwait(false);
254  await instanceFactory.StopAsync(cancellationToken).ConfigureAwait(false);
255 
256  // downgrade the db if necessary
257  if (downgradeVersion != null)
258  await databaseContextFactory.UseContext(db => db.SchemaDowngradeForServerVersion(downgradeVersion, cancellationToken)).ConfigureAwait(false);
259  }
260 
262  public Task HandleRestart(Version updateVersion, CancellationToken cancellationToken)
263  {
264  downgradeVersion = updateVersion != null && updateVersion < application.Version ? updateVersion : null;
265  return Task.CompletedTask;
266  }
267  }
268 }
Manages the runtime of Jobs
Definition: IJobManager.cs:12
+
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
readonly IServerControl serverControl
The IServerControl for the InstanceManager
+
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+
IInstance CreateInstance(Models.Instance metadata)
Create an IInstance
+
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+
Task CopyDirectory(string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)
Copies a directory from src to dest
+
async Task OnlineInstance(Models.Instance metadata, CancellationToken cancellationToken)
Online an IInstance
+
Task Die(Exception exception)
Kill the server with a fatal exception
+
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
+
bool disposed
If the InstanceManager has been Disposed
+
Task HandleRestart(Version updateVersion, CancellationToken cancellationToken)
Handle a restart of the server
+
async Task OfflineInstance(Models.Instance metadata, Models.User user, CancellationToken cancellationToken)
+
Task StartAsync(CancellationToken cancellationToken)
+ + +
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the InstanceManager
+
readonly IJobManager jobManager
The IJobManager for the InstanceManager
+ +
Version downgradeVersion
Used in StopAsync(CancellationToken) to determine if database downgrades must be made
+
void Ready(Exception initializationError)
Mark the IApplication as ready to run
+
For interacting with the instance services
Definition: IInstance.cs:17
+ +
async Task StopAsync(CancellationToken cancellationToken)
+ +
readonly ILogger< InstanceManager > logger
The ILogger for the InstanceManager
+
Task< bool > CancelJob(Job job, User user, bool blocking, CancellationToken cancellationToken)
Cancels a give job
+ +
readonly IInstanceFactory instanceFactory
The IInstanceFactory for the InstanceManager
+ +
readonly Dictionary< long, IInstance > instances
Map of Api.Models.Instance.Ids to respective IInstances
+ + +
readonly IApplication application
The IApplication for the InstanceManager
+
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+ +
readonly IIOManager ioManager
The IIOManager for the InstanceManager
+
Interface for using filesystems
Definition: IIOManager.cs:11
+
async Task MoveInstance(Models.Instance instance, string newPath, CancellationToken cancellationToken)
Move an IInstance
+
IRestartRegistration RegisterForRestart(IRestartHandler handler)
Register a given handler to run before stopping the server for a restart
+ +
Version Version
The version of the Application
Definition: IApplication.cs:23
+ +
InstanceManager(IInstanceFactory instanceFactory, IIOManager ioManager, IDatabaseContextFactory databaseContextFactory, IApplication application, IJobManager jobManager, IServerControl serverControl, ILogger< InstanceManager > logger)
Construct an InstanceManager
+
Represents a service that may take an updated Host assembly and run it, stopping the current assembly...
+ +
+ + + + diff --git a/_instance_manager_client_8cs.html b/_instance_manager_client_8cs.html new file mode 100644 index 0000000000..65bbd0c923 --- /dev/null +++ b/_instance_manager_client_8cs.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/InstanceManagerClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InstanceManagerClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Client.InstanceManagerClient
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_instance_manager_client_8cs_source.html b/_instance_manager_client_8cs_source.html new file mode 100644 index 0000000000..cba2069604 --- /dev/null +++ b/_instance_manager_client_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/InstanceManagerClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
InstanceManagerClient.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Threading;
4 using System.Threading.Tasks;
5 using Tgstation.Server.Api;
8 
10 {
13  {
18 
22  readonly Dictionary<long, IInstanceClient> cachedClients;
23 
29  {
30  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
31 
32  cachedClients = new Dictionary<long, IInstanceClient>();
33  }
34 
36  public Task<Instance> CreateOrAttach(Instance instance, CancellationToken cancellationToken) => apiClient.Create<Instance, Instance>(Routes.InstanceManager, instance ?? throw new ArgumentNullException(nameof(instance)), cancellationToken);
37 
39  public Task Detach(Instance instance, CancellationToken cancellationToken) => apiClient.Delete(Routes.SetID(Routes.InstanceManager, instance?.Id ?? throw new ArgumentNullException(nameof(instance))), cancellationToken);
40 
42  public Task<IReadOnlyList<Instance>> List(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<Instance>>(Routes.List(Routes.InstanceManager), cancellationToken);
43 
45  public Task<Instance> Update(Instance instance, CancellationToken cancellationToken) => apiClient.Update<Instance, Instance>(Routes.InstanceManager, instance ?? throw new ArgumentNullException(nameof(instance)), cancellationToken);
46 
48  public Task<Instance> GetId(Instance instance, CancellationToken cancellationToken) => apiClient.Read<Instance>(Routes.SetID(Routes.InstanceManager, instance?.Id ?? throw new ArgumentNullException(nameof(instance))), cancellationToken);
49 
52  {
53  if (!cachedClients.TryGetValue(instance?.Id ?? throw new ArgumentNullException(nameof(instance)), out var client))
54  {
55  client = new InstanceClient(apiClient, instance);
56  cachedClients.Add(instance.Id, client);
57  }
58 
59  return client;
60  }
61  }
62 }
+ + + +
IInstanceClient CreateClient(Instance instance)
Create an IInstanceClient for a given Instance
+
Task< IReadOnlyList< Instance > > List(CancellationToken cancellationToken)
Get all IInstanceClients for Instances the user can view
+
Task Detach(Instance instance, CancellationToken cancellationToken)
Deletes an instance
+ +
Routes to a server actions
Definition: Routes.cs:9
+ +
readonly IApiClient apiClient
The IApiClient for the InstanceManagerClient
+
InstanceManagerClient(IApiClient apiClient)
Construct an InstanceManagerClient
+
Task< Instance > Update(Instance instance, CancellationToken cancellationToken)
Relocates, renamed, and/or on/offlines an instance
+ +
readonly Dictionary< long, IInstanceClient > cachedClients
Map of already created IInstanceClients
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Task< Instance > Instance(Routes.InstanceManager, instance ?? throw new ArgumentNullException(nameof(instance)), cancellationToken)
+ +
const string InstanceManager
The Models.Instance controller
Definition: Routes.cs:29
+
Metadata about a server instance
Definition: Instance.cs:9
+
static string SetID(string route, long id)
Apply an id postfix to a route
+
Task Delete(string route, CancellationToken cancellationToken)
Run an HTTP DELETE request
+
static string List(string route)
Get the /List postfix for a route
+ +
Web interface for the API
Definition: IApiClient.cs:11
+
Task< Instance > GetId(Instance instance, CancellationToken cancellationToken)
Get a specific instance
+
Task< Instance > CreateOrAttach(Instance instance, CancellationToken cancellationToken)
Create or attach an instance
+ +
+ + + + diff --git a/_instance_manager_rights_8cs.html b/_instance_manager_rights_8cs.html new file mode 100644 index 0000000000..8877f947e2 --- /dev/null +++ b/_instance_manager_rights_8cs.html @@ -0,0 +1,119 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/InstanceManagerRights.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InstanceManagerRights.cs File Reference
+
+ + + + + diff --git a/_instance_manager_rights_8cs_source.html b/_instance_manager_rights_8cs_source.html new file mode 100644 index 0000000000..22df8772f0 --- /dev/null +++ b/_instance_manager_rights_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/InstanceManagerRights.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
InstanceManagerRights.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
8  [Flags]
9  public enum InstanceManagerRights : ulong
10  {
14  None = 0,
15 
19  Read = 1,
20 
24  Create = 2,
25 
29  Rename = 4,
30 
34  Relocate = 8,
35 
39  SetOnline = 16,
40 
44  Delete = 32,
45 
49  List = 64,
50 
54  SetConfiguration = 128,
55 
59  SetAutoUpdate = 256
60  }
61 }
+
User can change Models.Instance.ConfigurationType
+ + +
InstanceManagerRights
Rights for managing Models.Instances
+
User can create new Models.ChatBot
+
User can change Models.Instance.AutoUpdateInterval
+
User can online Models.Instances they can view
+
User can relocate Models.Instances they can view
+ +
User can read all chat settings except Models.Internal.ChatBot.ConnectionString
+
User can rename Models.Instances they can view
+
+ + + + diff --git a/_instance_manager_test_8cs.html b/_instance_manager_test_8cs.html new file mode 100644 index 0000000000..8658a14192 --- /dev/null +++ b/_instance_manager_test_8cs.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/InstanceManagerTest.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InstanceManagerTest.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Tests.InstanceManagerTest
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Tests
 
+
+ + + + diff --git a/_instance_manager_test_8cs_source.html b/_instance_manager_test_8cs_source.html new file mode 100644 index 0000000000..5ae8b1424b --- /dev/null +++ b/_instance_manager_test_8cs_source.html @@ -0,0 +1,110 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/InstanceManagerTest.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
InstanceManagerTest.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using System;
3 using System.IO;
4 using System.Reflection;
5 using System.Threading;
6 using System.Threading.Tasks;
11 
12 namespace Tgstation.Server.Tests
13 {
14  sealed class InstanceManagerTest
15  {
17  readonly string testRootPath;
18 
19  long counter;
20 
22  {
23  this.instanceManagerClient = instanceManagerClient ?? throw new ArgumentNullException(nameof(instanceManagerClient));
24  this.testRootPath = testRootPath ?? throw new ArgumentNullException(nameof(testRootPath));
25 
26  counter = 0;
27  }
28 
29  Task<Api.Models.Instance> CreateTestInstance(CancellationToken cancellationToken) => instanceManagerClient.CreateOrAttach(new Api.Models.Instance
30  {
31  Name = "TestInstance-" + ++counter,
32  Path = Path.Combine(testRootPath, Guid.NewGuid().ToString()),
33  Online = true
34  }, cancellationToken);
35 
36  public async Task Run(CancellationToken cancellationToken)
37  {
38  var firstTest = await CreateTestInstance(cancellationToken).ConfigureAwait(false);
39  //instances always start offline
40  Assert.AreEqual(false, firstTest.Online);
41  //check it exists
42  Assert.IsTrue(Directory.Exists(firstTest.Path));
43 
44  //cant create instances in existent directories
45  var testNonEmpty = Path.Combine(testRootPath, Guid.NewGuid().ToString());
46  Directory.CreateDirectory(testNonEmpty);
47  await Assert.ThrowsExceptionAsync<ConflictException>(() => instanceManagerClient.CreateOrAttach(new Api.Models.Instance
48  {
49  Path = testNonEmpty,
50  Name = "NonEmptyTest"
51  }, cancellationToken)).ConfigureAwait(false);
52  await Assert.ThrowsExceptionAsync<ConflictException>(() => instanceManagerClient.CreateOrAttach(firstTest, cancellationToken)).ConfigureAwait(false);
53 
54  //can't create instances in installation directory
55  await Assert.ThrowsExceptionAsync<ConflictException>(() => instanceManagerClient.CreateOrAttach(new Api.Models.Instance
56  {
57  Path = "./A/Local/Path",
58  Name = "NoInstallDirTest"
59  }, cancellationToken)).ConfigureAwait(false);
60 
61  //can't move to existent directories
62  await Assert.ThrowsExceptionAsync<ConflictException>(() => instanceManagerClient.Update(new Api.Models.Instance
63  {
64  Id = firstTest.Id,
65  Path = testNonEmpty
66  }, cancellationToken)).ConfigureAwait(false);
67 
68  //test basic move
69  Directory.Delete(testNonEmpty);
70  var initialPath = firstTest.Path;
71  firstTest = await instanceManagerClient.Update(new Api.Models.Instance
72  {
73  Id = firstTest.Id,
74  Path = testNonEmpty
75  }, cancellationToken).ConfigureAwait(false);
76 
77  Assert.IsNotNull(firstTest.MoveJob);
78 
79  do
80  {
81  firstTest = await instanceManagerClient.GetId(firstTest, cancellationToken).ConfigureAwait(false);
82  await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
83  } while (firstTest.MoveJob != null);
84 
85 
86  //online it for real for component tests
87  firstTest.Online = true;
88  firstTest.ConfigurationType = ConfigurationType.HostWrite;
89  firstTest = await instanceManagerClient.Update(firstTest, cancellationToken).ConfigureAwait(false);
90  Assert.AreEqual(true, firstTest.Online);
91  Assert.AreEqual(ConfigurationType.HostWrite, firstTest.ConfigurationType);
92 
93  //can't move online instance
94  await Assert.ThrowsExceptionAsync<ConflictException>(() => instanceManagerClient.Update(new Api.Models.Instance
95  {
96  Id = firstTest.Id,
97  Path = initialPath
98  }, cancellationToken)).ConfigureAwait(false);
99 
100  var testSuite1 = new InstanceTest(instanceManagerClient.CreateClient(firstTest));
101  await testSuite1.RunTests(cancellationToken).ConfigureAwait(false);
102 
103  //can regain permissions on instance without instance user
104  var instanceClient = instanceManagerClient.CreateClient(firstTest);
105  var ourInstanceUser = await instanceClient.Users.Read(cancellationToken).ConfigureAwait(false);
106  await instanceClient.Users.Delete(ourInstanceUser, cancellationToken).ConfigureAwait(false);
107 
108  await Assert.ThrowsExceptionAsync<InsufficientPermissionsException>(() => instanceClient.Users.Read(cancellationToken)).ConfigureAwait(false);
109 
110  await instanceManagerClient.Update(new Api.Models.Instance
111  {
112  Id = firstTest.Id
113  }, cancellationToken).ConfigureAwait(false);
114  ourInstanceUser = await instanceClient.Users.Read(cancellationToken).ConfigureAwait(false);
115 
116  //can't detach online instance
117  await Assert.ThrowsExceptionAsync<ConflictException>(() => instanceManagerClient.Detach(firstTest, cancellationToken)).ConfigureAwait(false);
118 
119  firstTest.Online = false;
120  firstTest = await instanceManagerClient.Update(firstTest, cancellationToken).ConfigureAwait(false);
121  await instanceManagerClient.Detach(firstTest, cancellationToken).ConfigureAwait(false);
122 
123  var instanceAttachFileName = (string)typeof(InstanceController).GetField("InstanceAttachFileName", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null);
124  var attachPath = Path.Combine(firstTest.Path, instanceAttachFileName);
125  Assert.IsTrue(File.Exists(attachPath));
126 
127  //can recreate detached instance
128  firstTest = await instanceManagerClient.CreateOrAttach(firstTest, cancellationToken).ConfigureAwait(false);
129 
130  //but only if the attach file exists
131  await instanceManagerClient.Detach(firstTest, cancellationToken).ConfigureAwait(false);
132  File.Delete(attachPath);
133  await Assert.ThrowsExceptionAsync<ConflictException>(() => instanceManagerClient.CreateOrAttach(firstTest, cancellationToken)).ConfigureAwait(false);
134  }
135  }
136 }
+
async Task RunTests(CancellationToken cancellationToken)
Definition: InstanceTest.cs:17
+ + +
readonly IInstanceManagerClient instanceManagerClient
+ +
Task< Instance > CreateOrAttach(Instance instance, CancellationToken cancellationToken)
Create or attach an instance
+ +
IInstanceClient CreateClient(Instance instance)
Create an IInstanceClient for a given Instance
+
ConfigurationType
The type of configuration allowed on an Instance
+
Controller for managing Components.Instances
+ +
async Task Run(CancellationToken cancellationToken)
+
Task< Instance > GetId(Instance instance, CancellationToken cancellationToken)
Get a specific instance
+
Task Detach(Instance instance, CancellationToken cancellationToken)
Deletes an instance
+ + +
Task< Instance > Update(Instance instance, CancellationToken cancellationToken)
Relocates, renamed, and/or on/offlines an instance
+ + +
Occurs when the client performs an action that would result in data conflict
+ +
Occurs when the client attempts to perform an action they do not have the rights for
+
InstanceManagerTest(IInstanceManagerClient instanceManagerClient, string testRootPath)
+ +
Task< Api.Models.Instance > CreateTestInstance(CancellationToken cancellationToken)
+ + +
+ + + + diff --git a/_instance_test_8cs.html b/_instance_test_8cs.html new file mode 100644 index 0000000000..6d0ca9a288 --- /dev/null +++ b/_instance_test_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/Instance/InstanceTest.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InstanceTest.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Tests.Instance.InstanceTest
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Tests
 
namespace  Tgstation.Server.Tests.Instance
 
+
+ + + + diff --git a/_instance_test_8cs_source.html b/_instance_test_8cs_source.html new file mode 100644 index 0000000000..8671d9cd38 --- /dev/null +++ b/_instance_test_8cs_source.html @@ -0,0 +1,98 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/Instance/InstanceTest.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
InstanceTest.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
5 
7 {
8  sealed class InstanceTest
9  {
11 
13  {
14  this.instanceClient = instanceClient ?? throw new ArgumentNullException(nameof(instanceClient));
15  }
16 
17  public async Task RunTests(CancellationToken cancellationToken)
18  {
19  var byondTests = new ByondTest(instanceClient.Byond, instanceClient.Jobs);
21 
22  var byondTest = byondTests.Run(cancellationToken);
23  await configTests.Run(cancellationToken).ConfigureAwait(false);
24  await byondTest.ConfigureAwait(false);
25  }
26  }
27 }
+
async Task RunTests(CancellationToken cancellationToken)
Definition: InstanceTest.cs:17
+ + +
Instance Metadata
The Instance used to create the IInstanceClient
+
IConfigurationClient Configuration
Access the IConfigurationClient
+ +
IByondClient Byond
Access the IByondClient
+ + + +
InstanceTest(IInstanceClient instanceClient)
Definition: InstanceTest.cs:12
+ + + + +
+ + + + diff --git a/_instance_user_client_8cs.html b/_instance_user_client_8cs.html new file mode 100644 index 0000000000..e6c4bf2aac --- /dev/null +++ b/_instance_user_client_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/InstanceUserClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InstanceUserClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Client.Components.InstanceUserClient
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
namespace  Tgstation.Server.Client.Components
 
+
+ + + + diff --git a/_instance_user_client_8cs_source.html b/_instance_user_client_8cs_source.html new file mode 100644 index 0000000000..b72204b840 --- /dev/null +++ b/_instance_user_client_8cs_source.html @@ -0,0 +1,108 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/InstanceUserClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
InstanceUserClient.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Threading;
4 using System.Threading.Tasks;
5 using Tgstation.Server.Api;
7 
9 {
12  {
17 
21  readonly Instance instance;
22 
29  {
30  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
31  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
32  }
33 
35  public Task<InstanceUser> Create(InstanceUser instanceUser, CancellationToken cancellationToken) => apiClient.Create<InstanceUser, InstanceUser>(Routes.InstanceUser, instanceUser ?? throw new ArgumentNullException(nameof(instanceUser)), instance.Id, cancellationToken);
36 
38  public Task Delete(InstanceUser instanceUser, CancellationToken cancellationToken) => apiClient.Delete(Routes.SetID(Routes.InstanceUser, instanceUser.UserId.Value), instance.Id, cancellationToken);
39 
41  public Task<InstanceUser> Read(CancellationToken cancellationToken) => apiClient.Read<InstanceUser>(Routes.InstanceUser, instance.Id, cancellationToken);
42 
44  public Task<InstanceUser> Update(InstanceUser instanceUser, CancellationToken cancellationToken) => apiClient.Update<InstanceUser, InstanceUser>(Routes.InstanceUser, instanceUser ?? throw new ArgumentNullException(nameof(instanceUser)), instance.Id, cancellationToken);
45 
47  public Task<IReadOnlyList<InstanceUser>> List(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<InstanceUser>>(Routes.List(Routes.InstanceUser), instance.Id, cancellationToken);
48 
50  public Task<InstanceUser> GetId(InstanceUser instanceUser, CancellationToken cancellationToken) => apiClient.Read<InstanceUser>(Routes.SetID(Routes.InstanceUser, instanceUser?.UserId ?? throw new ArgumentNullException(nameof(instanceUser))), instance.Id, cancellationToken);
51  }
52 }
readonly IApiClient apiClient
The IApiClient for the InstanceUserClient
+ +
readonly Instance instance
The Instance for the InstanceUserClient
+
const string InstanceUser
The Models.InstanceUser controller
Definition: Routes.cs:64
+
Task< InstanceUser > GetId(InstanceUser instanceUser, CancellationToken cancellationToken)
Get a specific instanceUser
+
InstanceUserClient(IApiClient apiClient, Instance instance)
Construct an InstanceUserClient
+
Task Delete(InstanceUser instanceUser, CancellationToken cancellationToken)
Delete a instanceUser
+ +
Task< InstanceUser > Update(InstanceUser instanceUser, CancellationToken cancellationToken)
Update a instanceUser
+
Routes to a server actions
Definition: Routes.cs:9
+ + +
Represents a Users permissions in an Instance
Definition: InstanceUser.cs:9
+
Task< InstanceUser > Read(CancellationToken cancellationToken)
Get the InstanceUser associated with the logged on user
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+ +
Metadata about a server instance
Definition: Instance.cs:9
+
static string SetID(string route, long id)
Apply an id postfix to a route
+
Task Delete(string route, CancellationToken cancellationToken)
Run an HTTP DELETE request
+
static string List(string route)
Get the /List postfix for a route
+ +
Task< IReadOnlyList< InstanceUser > > List(CancellationToken cancellationToken)
Get the InstanceUsers in the Instance
+
Web interface for the API
Definition: IApiClient.cs:11
+
Task< InstanceUser > InstanceUser(Routes.InstanceUser, instanceUser ?? throw new ArgumentNullException(nameof(instanceUser)), instance.Id, cancellationToken)
+
Task< InstanceUser > Create(InstanceUser instanceUser, CancellationToken cancellationToken)
Create a instanceUser
+ +
+ + + + diff --git a/_instance_user_controller_8cs.html b/_instance_user_controller_8cs.html new file mode 100644 index 0000000000..a932650a1a --- /dev/null +++ b/_instance_user_controller_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/InstanceUserController.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InstanceUserController.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Controllers.InstanceUserController
 For managing Users More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Controllers
 
+
+ + + + diff --git a/_instance_user_controller_8cs_source.html b/_instance_user_controller_8cs_source.html new file mode 100644 index 0000000000..8affdc9869 --- /dev/null +++ b/_instance_user_controller_8cs_source.html @@ -0,0 +1,125 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/InstanceUserController.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
InstanceUserController.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Mvc;
2 using Microsoft.EntityFrameworkCore;
3 using Microsoft.Extensions.Logging;
4 using System;
5 using System.Linq;
6 using System.Net;
7 using System.Threading;
8 using System.Threading.Tasks;
9 using Tgstation.Server.Api;
14 using Z.EntityFramework.Plus;
15 
17 {
21  [Route(Routes.InstanceUser)]
22  public sealed class InstanceUserController : ModelController<Api.Models.InstanceUser>
23  {
30  public InstanceUserController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger<InstanceUserController> logger) : base(databaseContext, authenticationContextFactory, logger, true) // false instance requirement, we handle this ourself
31  { }
32 
38  BadRequestObjectResult StandardModelChecks(Api.Models.InstanceUser model)
39  {
40  if (model == null)
41  throw new ArgumentNullException(nameof(model));
42 
43  if (!model.UserId.HasValue)
44  return BadRequest(new ErrorMessage { Message = "Missing UserId!" });
45 
46  return null;
47  }
48 
50  [TgsAuthorize(InstanceUserRights.CreateUsers)]
51  public override async Task<IActionResult> Create([FromBody] Api.Models.InstanceUser model, CancellationToken cancellationToken)
52  {
53  var test = StandardModelChecks(model);
54  if (test != null)
55  return test;
56 
57  var dbUser = new Models.InstanceUser
58  {
59  ByondRights = model.ByondRights ?? ByondRights.None,
60  ChatBotRights = model.ChatBotRights ?? ChatBotRights.None,
61  ConfigurationRights = model.ConfigurationRights ?? ConfigurationRights.None,
62  DreamDaemonRights = model.DreamDaemonRights ?? DreamDaemonRights.None,
63  DreamMakerRights = model.DreamMakerRights ?? DreamMakerRights.None,
64  RepositoryRights = model.RepositoryRights ?? RepositoryRights.None,
65  InstanceUserRights = model.InstanceUserRights ?? InstanceUserRights.None,
66  UserId = model.UserId,
67  InstanceId = Instance.Id
68  };
69 
70  DatabaseContext.InstanceUsers.Add(dbUser);
71 
72  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
73  return StatusCode((int)HttpStatusCode.Created, dbUser.ToApi());
74  }
75 
77  [TgsAuthorize(InstanceUserRights.WriteUsers)]
78  #pragma warning disable CA1506 // TODO: Decomplexify
79  public override async Task<IActionResult> Update([FromBody] Api.Models.InstanceUser model, CancellationToken cancellationToken)
80  {
81  var test = StandardModelChecks(model);
82  if (test != null)
83  return test;
84 
85  var originalUser = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).SelectMany(x => x.InstanceUsers).Where(x => x.UserId == model.UserId).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
86  if (originalUser == null)
87  return StatusCode((int)HttpStatusCode.Gone);
88 
89  originalUser.ByondRights = model.ByondRights ?? originalUser.ByondRights;
90  originalUser.RepositoryRights = model.RepositoryRights ?? originalUser.RepositoryRights;
91  originalUser.InstanceUserRights = model.InstanceUserRights ?? originalUser.InstanceUserRights;
92  originalUser.ChatBotRights = model.ChatBotRights ?? originalUser.ChatBotRights;
93  originalUser.ConfigurationRights = model.ConfigurationRights ?? originalUser.ConfigurationRights;
94  originalUser.DreamDaemonRights = model.DreamDaemonRights ?? originalUser.DreamDaemonRights;
95  originalUser.DreamMakerRights = model.DreamMakerRights ?? originalUser.DreamMakerRights;
96 
97  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
98  return Json(originalUser.UserId == AuthenticationContext.User.Id || (AuthenticationContext.GetRight(RightsType.InstanceUser) & (ulong)InstanceUserRights.ReadUsers) != 0 ? originalUser.ToApi() : new Api.Models.InstanceUser
99  {
100  UserId = originalUser.UserId
101  });
102  }
103  #pragma warning restore CA1506
104 
106  [TgsAuthorize]
107  public override Task<IActionResult> Read(CancellationToken cancellationToken) => Task.FromResult(AuthenticationContext.InstanceUser != null ? (IActionResult)Json(AuthenticationContext.InstanceUser.ToApi()) : NotFound());
108 
110  [TgsAuthorize(InstanceUserRights.ReadUsers)]
111  public override async Task<IActionResult> List(CancellationToken cancellationToken)
112  {
113  var users = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).SelectMany(x => x.InstanceUsers).ToListAsync(cancellationToken).ConfigureAwait(false);
114  return Json(users.Select(x => x.ToApi()));
115  }
116 
118  [TgsAuthorize(InstanceUserRights.ReadUsers)]
119  public override async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
120  {
121  // this functions as userId
122  var user = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).SelectMany(x => x.InstanceUsers).Where(x => x.UserId == id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
123  if (user == default)
124  return StatusCode((int)HttpStatusCode.Gone);
125  return Json(user.ToApi());
126  }
127 
129  [TgsAuthorize(InstanceUserRights.WriteUsers)]
130  public override async Task<IActionResult> Delete(long id, CancellationToken cancellationToken)
131  {
132  await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).SelectMany(x => x.InstanceUsers).Where(x => x.UserId == id).DeleteAsync(cancellationToken).ConfigureAwait(false);
133  return Ok();
134  }
135  }
136 }
InstanceUserController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger< InstanceUserController > logger)
Construct a UserController
+ + +
ConfigurationRights
Rights for Models.ConfigurationFile
+ + +
override Task< IActionResult > Read(CancellationToken cancellationToken)
Attempt to read a TModel
+
ByondRights
Rights for Models.Byond
Definition: ByondRights.cs:9
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+ +
InstanceUserRights
Rights for an Models.Instance
+ +
const string InstanceUser
The Models.InstanceUser controller
Definition: Routes.cs:64
+ +
override async Task< IActionResult > Delete(long id, CancellationToken cancellationToken)
Attempt to delete a model with a particular id
+
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
override async Task< IActionResult > Create([FromBody] Api.Models.InstanceUser model, CancellationToken cancellationToken)
+
override async Task< IActionResult > List(CancellationToken cancellationToken)
Attempt to list entries of the TModel
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+ + +
Routes to a server actions
Definition: Routes.cs:9
+
DreamDaemonRights
Rights for Models.DreamDaemon
+ +
BadRequestObjectResult StandardModelChecks(Api.Models.InstanceUser model)
Checks a model for errors
+
DreamMakerRights
Rights for Models.DreamMaker
+ + +
RepositoryRights
Rights for a Models.Repository
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
override async Task< IActionResult > GetId(long id, CancellationToken cancellationToken)
Attempt to get a specific a TModel
+
An ApiController representing a TModel
+ + +
long Id
The ID of the User
Definition: User.cs:15
+
Metadata about a server instance
Definition: Instance.cs:9
+
override async Task< IActionResult > Update([FromBody] Api.Models.InstanceUser model, CancellationToken cancellationToken)
+ +
ChatBotRights
Rights for Models.ChatBot
Definition: ChatBotRights.cs:9
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ + + +
+ + + + diff --git a/_instance_user_rights_8cs.html b/_instance_user_rights_8cs.html new file mode 100644 index 0000000000..7c56c83ec3 --- /dev/null +++ b/_instance_user_rights_8cs.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/InstanceUserRights.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InstanceUserRights.cs File Reference
+
+ + + + + diff --git a/_instance_user_rights_8cs_source.html b/_instance_user_rights_8cs_source.html new file mode 100644 index 0000000000..bcf563a547 --- /dev/null +++ b/_instance_user_rights_8cs_source.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/InstanceUserRights.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
InstanceUserRights.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
8  [Flags]
9  public enum InstanceUserRights : ulong
10  {
14  None = 0,
15 
19  ReadUsers = 1,
20 
24  WriteUsers = 2,
25 
29  CreateUsers = 4
30  }
31 }
User can edit themself and other Models.Users and also create others
+
InstanceUserRights
Rights for an Models.Instance
+ +
User can read info and rights of other users
+ +
Allow adding additional Models.InstanceUser to the Models.Instance
+
+ + + + diff --git a/_insufficient_permissions_exception_8cs.html b/_insufficient_permissions_exception_8cs.html new file mode 100644 index 0000000000..0d86e3fccb --- /dev/null +++ b/_insufficient_permissions_exception_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/InsufficientPermissionsException.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InsufficientPermissionsException.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Client.InsufficientPermissionsException
 Occurs when the client attempts to perform an action they do not have the rights for More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_insufficient_permissions_exception_8cs_source.html b/_insufficient_permissions_exception_8cs_source.html new file mode 100644 index 0000000000..90ac2a2c68 --- /dev/null +++ b/_insufficient_permissions_exception_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/InsufficientPermissionsException.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
InsufficientPermissionsException.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Net;
4 
6 {
11  {
16  {
17  Message = "The credentials provided do not have sufficient rights to make this request!",
18  SeverApiVersion = null
19  }, HttpStatusCode.Forbidden)
20  { }
21 
26  public InsufficientPermissionsException(string message) : base(message) { }
27 
33  public InsufficientPermissionsException(string message, Exception innerException) : base(message, innerException) { }
34  }
35 }
+ + +
InsufficientPermissionsException(string message, Exception innerException)
Construct an InsufficientPermissionsException with a message and innerException
+
InsufficientPermissionsException(string message)
Construct an InsufficientPermissionsException with a message
+
Occurs when the client attempts to perform an action they do not have the rights for
+ +
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
InsufficientPermissionsException()
Construct an InsufficientPermissionsException
+ +
Exceptions thrown by IServerClients
+
+ + + + diff --git a/_integration_test_8cs.html b/_integration_test_8cs.html new file mode 100644 index 0000000000..cd676bc268 --- /dev/null +++ b/_integration_test_8cs.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/IntegrationTest.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IntegrationTest.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Tests.IntegrationTest
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Tests
 
+
+ + + + diff --git a/_integration_test_8cs_source.html b/_integration_test_8cs_source.html new file mode 100644 index 0000000000..205f740257 --- /dev/null +++ b/_integration_test_8cs_source.html @@ -0,0 +1,119 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/IntegrationTest.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IntegrationTest.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using System;
3 using System.Diagnostics;
4 using System.IO;
5 using System.Linq;
6 using System.Net.Http.Headers;
7 using System.Reflection;
8 using System.Threading;
9 using System.Threading.Tasks;
10 using Tgstation.Server.Api;
12 using Tgstation.Server.Client;
13 using Tgstation.Server.Host;
14 
15 namespace Tgstation.Server.Tests
16 {
17  [TestClass]
18  public sealed class IntegrationTest
19  {
20  readonly IServerClientFactory clientFactory = new ServerClientFactory(new ProductHeaderValue(Assembly.GetExecutingAssembly().GetName().Name, Assembly.GetExecutingAssembly().GetName().Version.ToString()));
21 
22  [TestMethod]
23  [TestCategory("SkipWhenLiveUnitTesting")]
24  public async Task TestUpdate()
25  {
26  var updatePathRoot = Path.GetTempFileName();
27  File.Delete(updatePathRoot);
28  Directory.CreateDirectory(updatePathRoot);
29  try
30  {
31  var updatePath = Path.Combine(updatePathRoot, Guid.NewGuid().ToString());
32  var server = new TestingServer(updatePath);
33  using (var serverCts = new CancellationTokenSource())
34  {
35  var cancellationToken = serverCts.Token;
36  var serverTask = server.RunAsync(cancellationToken);
37  try
38  {
39  IServerClient adminClient;
40 
41  var giveUpAt = DateTimeOffset.Now.AddSeconds(60);
42  do
43  {
44  try
45  {
46  adminClient = await clientFactory.CreateServerClient(server.Url, User.AdminName, User.DefaultAdminPassword).ConfigureAwait(false);
47  break;
48  }
50  {
51  //migrating, to be expected
52  if (DateTimeOffset.Now > giveUpAt)
53  throw;
54  await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
55  }
56  } while (true);
57 
58  var testUpdateVersion = new Version(4, 0, 0, 6);
59  using (adminClient)
60  //attempt to update to stable
61  await adminClient.Administration.Update(new Administration
62  {
63  NewVersion = testUpdateVersion
64  }, cancellationToken).ConfigureAwait(false);
65 
66  //wait up to 3 minutes for the dl and install
67  await Task.WhenAny(serverTask, Task.Delay(TimeSpan.FromMinutes(3), cancellationToken)).ConfigureAwait(false);
68 
69  Assert.IsTrue(serverTask.IsCompleted, "Sever still running!");
70 
71  Assert.IsTrue(Directory.Exists(updatePath), "Update directory not present!");
72 
73  var updatedAssemblyPath = Path.Combine(updatePath, "Tgstation.Server.Host.dll");
74  Assert.IsTrue(File.Exists(updatedAssemblyPath), "Updated assembly missing!");
75 
76  var updatedAssemblyVersion = FileVersionInfo.GetVersionInfo(updatedAssemblyPath);
77  Assert.AreEqual(testUpdateVersion, Version.Parse(updatedAssemblyVersion.FileVersion));
78  }
79  finally
80  {
81  serverCts.Cancel();
82  try
83  {
84  await serverTask.ConfigureAwait(false);
85  }
86  catch (OperationCanceledException) { }
87  }
88  Assert.IsTrue(server.RestartRequested, "Server not requesting restart!");
89  }
90  }
91  finally
92  {
93  Directory.Delete(updatePathRoot, true);
94  }
95  }
96 
97  [TestMethod]
98  [TestCategory("SkipWhenLiveUnitTesting")]
99  public async Task TestStandardOperation()
100  {
101  var server = new TestingServer(null);
102  using (var serverCts = new CancellationTokenSource())
103  {
104  var cancellationToken = serverCts.Token;
105  var serverTask = server.RunAsync(cancellationToken);
106  try
107  {
108  IServerClient adminClient;
109 
110  var giveUpAt = DateTimeOffset.Now.AddSeconds(60);
111  do
112  {
113  try
114  {
115  adminClient = await clientFactory.CreateServerClient(server.Url, User.AdminName, User.DefaultAdminPassword).ConfigureAwait(false);
116  break;
117  }
119  {
120  // migrating, to be expected
121  if (DateTimeOffset.Now > giveUpAt)
122  throw;
123  await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
124  }
125  } while (true);
126 
127  using (adminClient)
128  {
129  var serverInfo = await adminClient.Version(default).ConfigureAwait(false);
130 
131  Assert.AreEqual(ApiHeaders.Version, serverInfo.ApiVersion);
132  Assert.AreEqual(typeof(IServer).Assembly.GetName().Version, serverInfo.Version);
133 
134  //check that modifying the token even slightly fucks up the auth
135  var newToken = new Token
136  {
137  ExpiresAt = adminClient.Token.ExpiresAt,
138  Bearer = adminClient.Token.Bearer + '0'
139  };
140 
141  var badClient = clientFactory.CreateServerClient(server.Url, newToken);
142  await Assert.ThrowsExceptionAsync<UnauthorizedException>(() => badClient.Version(cancellationToken)).ConfigureAwait(false);
143 
144  await new AdministrationTest(adminClient.Administration).Run(cancellationToken).ConfigureAwait(false);
145  await new InstanceManagerTest(adminClient.Instances, server.Directory).Run(cancellationToken).ConfigureAwait(false);
146  }
147  }
148  finally
149  {
150  serverCts.Cancel();
151  try
152  {
153  await serverTask.ConfigureAwait(false);
154  }
155  catch (OperationCanceledException) { }
156  }
157  }
158  }
159  }
160 }
async Task Run(CancellationToken cancellationToken)
+ + +
Task< ServerInformation > Version(CancellationToken cancellationToken)
The ServerInformation of the IServerClient
+ + +
const string AdminName
The name of the default admin user
Definition: User.cs:9
+ + +
async Task Run(CancellationToken cancellationToken)
+
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
Represents administrative server information
+ +
Occurs when the client makes a request while the server is starting or stopping
+
Token Token
The Token used to access the server
+
Main client for communicating with a server
+
Represents the host
Definition: IServer.cs:9
+
readonly IServerClientFactory clientFactory
+ +
DateTimeOffset? ExpiresAt
When the Token expires
Definition: Token.cs:18
+
Represents a JWT returned by the API
Definition: Token.cs:8
+
Factory for creating IServerClients
+ +
const string DefaultAdminPassword
The default admin password
Definition: User.cs:14
+ + +
IInstanceManagerClient Instances
Access the IInstanceManagerClient
+ +
Occurs when the client provides invalid credentials
+ +
Task Update(Administration administration, CancellationToken cancellationToken)
Updates the Administration setttings
+
IAdministrationClient Administration
Access the IAdministrationClient
+
string Bearer
The value of the JWT
Definition: Token.cs:13
+
static Version Version
Get the version of the Api the caller is using
Definition: ApiHeaders.cs:56
+ +
Task< IServerClient > CreateServerClient(Uri host, string username, string password, TimeSpan timeout=default, CancellationToken cancellationToken=default)
Create a IServerClient
+ +
+ + + + diff --git a/_irc_connection_string_builder_8cs.html b/_irc_connection_string_builder_8cs.html new file mode 100644 index 0000000000..1f8af9f108 --- /dev/null +++ b/_irc_connection_string_builder_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/IrcConnectionStringBuilder.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IrcConnectionStringBuilder.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.IrcConnectionStringBuilder
 ChatConnectionStringBuilder for ChatProvider.Irc More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + diff --git a/_irc_connection_string_builder_8cs_source.html b/_irc_connection_string_builder_8cs_source.html new file mode 100644 index 0000000000..72d450022b --- /dev/null +++ b/_irc_connection_string_builder_8cs_source.html @@ -0,0 +1,100 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/IrcConnectionStringBuilder.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IrcConnectionStringBuilder.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
5 
7 {
12  {
14  public override bool Valid => Address != null && Port.HasValue && Port != 0 && UseSsl.HasValue && (PasswordType.HasValue ^ Password == null);
15 
19  public string Address { get; set; }
20 
24  public ushort? Port { get; set; }
25 
29  public string Nickname { get; set; }
30 
34  public bool? UseSsl { get; set; }
35 
39  public IrcPasswordType? PasswordType { get; set; }
40 
44  public string Password { get; set; }
45 
50 
55  public IrcConnectionStringBuilder(string connectionString)
56  {
57  if (connectionString == null)
58  throw new ArgumentNullException(nameof(connectionString));
59  var splits = connectionString.Split(';');
60 
61  Address = splits[0];
62 
63  if (splits.Length < 2)
64  return;
65 
66  if (UInt16.TryParse(splits[1], out var port))
67  Port = port;
68 
69  if (splits.Length < 3)
70  return;
71 
72  Nickname = splits[2];
73 
74  if (splits.Length < 4)
75  return;
76 
77  if (Int32.TryParse(splits[3], out var intSsl))
78  UseSsl = Convert.ToBoolean(intSsl);
79 
80  if (splits.Length < 5)
81  return;
82  if (Enum.TryParse<IrcPasswordType>(splits[4], out var passwordType))
83  switch (passwordType)
84  {
85  case IrcPasswordType.NickServ:
86  case IrcPasswordType.Sasl:
87  case IrcPasswordType.Server:
88  PasswordType = passwordType;
89  break;
90  default:
91  break;
92  }
93 
94  if (splits.Length < 6)
95  return;
96 
97  var rest = new List<string>(splits);
98  rest.RemoveRange(0, 5);
99  Password = String.Join(";", rest);
100  }
101 
103  public override string ToString()
104  {
105  var sb = new StringBuilder();
106  sb.Append(Address);
107  sb.Append(';');
108  sb.Append(Port);
109  sb.Append(';');
110  sb.Append(Nickname);
111  sb.Append(';');
112  if(UseSsl.HasValue)
113  sb.Append(Convert.ToInt32(UseSsl.Value));
114  if (PasswordType.HasValue)
115  {
116  sb.Append(';');
117  sb.Append((int)PasswordType);
118  sb.Append(';');
119  sb.Append(Password);
120  }
121 
122  return sb.ToString();
123  }
124  }
125 }
string Address
The IP address or URL of the IRC server
+ + + + + +
bool? UseSsl
If the connection should be made using SSL
+
IrcConnectionStringBuilder(string connectionString)
Construct a DiscordConnectionStringBuilder from a connectionString
+ + + +
IrcConnectionStringBuilder()
Construct an IrcConnectionStringBuilder
+
IrcPasswordType
Represents the type of a password for a ChatProvider.Irc
+ +
ChatConnectionStringBuilder for ChatProvider.Irc
+
override string ToString()
Gets the ChatBot.ConnectionString associated with the ChatConnectionStringBuilder
+
IrcPasswordType? PasswordType
The optional IrcPasswordType to use
+ +
+ + + + diff --git a/_irc_password_type_8cs.html b/_irc_password_type_8cs.html new file mode 100644 index 0000000000..fb20ef63f6 --- /dev/null +++ b/_irc_password_type_8cs.html @@ -0,0 +1,108 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/IrcPasswordType.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IrcPasswordType.cs File Reference
+
+ + + + + diff --git a/_irc_password_type_8cs_source.html b/_irc_password_type_8cs_source.html new file mode 100644 index 0000000000..32640120d7 --- /dev/null +++ b/_irc_password_type_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/IrcPasswordType.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IrcPasswordType.cs
+
+
+Go to the documentation of this file.
2 {
6  public enum IrcPasswordType
7  {
11  Server,
12 
16  Sasl,
17 
21  NickServ
22  }
23 }
+ + + +
IrcPasswordType
Represents the type of a password for a ChatProvider.Irc
+
+ + + + diff --git a/_irc_provider_8cs.html b/_irc_provider_8cs.html new file mode 100644 index 0000000000..eab4fa5af4 --- /dev/null +++ b/_irc_provider_8cs.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Providers/IrcProvider.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IrcProvider.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Chat.Providers.IrcProvider
 IProvider for internet relay chat More...
 
+ + + + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
namespace  Tgstation.Server.Host.Components.Chat.Providers
 
+
+ + + + diff --git a/_irc_provider_8cs_source.html b/_irc_provider_8cs_source.html new file mode 100644 index 0000000000..b6253e6ad4 --- /dev/null +++ b/_irc_provider_8cs_source.html @@ -0,0 +1,126 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Providers/IrcProvider.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IrcProvider.cs
+
+
+Go to the documentation of this file.
1 using Meebey.SmartIrc4net;
2 using Microsoft.Extensions.Logging;
3 using System;
4 using System.Collections.Generic;
5 using System.Globalization;
6 using System.Linq;
7 using System.Text;
8 using System.Threading;
9 using System.Threading.Tasks;
12 
14 {
18  sealed class IrcProvider : Provider
19  {
20  const int TimeoutSeconds = 5;
21 
23  public override bool Connected => client.IsConnected;
24 
26  public override string BotMention => client.Nickname;
27 
32 
36  readonly ILogger<IrcProvider> logger;
37 
41  readonly IrcFeatures client;
42 
46  readonly string address;
47 
51  readonly ushort port;
52 
56  readonly string nickname;
57 
61  readonly string password;
62 
67 
71  readonly Dictionary<ulong, string> channelIdMap;
72 
76  readonly Dictionary<ulong, string> queryChannelIdMap;
77 
82 
86  Task listenTask;
87 
92 
105  public IrcProvider(IApplication application, IAsyncDelayer asyncDelayer, ILogger<IrcProvider> logger, string address, ushort port, string nickname, string password, IrcPasswordType? passwordType, bool useSsl)
106  {
107  if (application == null)
108  throw new ArgumentNullException(nameof(application));
109  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
110  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
111 
112  this.address = address ?? throw new ArgumentNullException(nameof(address));
113  this.port = port;
114  this.nickname = nickname ?? throw new ArgumentNullException(nameof(nickname));
115 
116  if (passwordType.HasValue && password == null)
117  throw new ArgumentNullException(nameof(password));
118 
119  if (password != null && !passwordType.HasValue)
120  throw new ArgumentNullException(nameof(passwordType));
121 
122  this.password = password;
123  this.passwordType = passwordType;
124 
125  client = new IrcFeatures
126  {
127  SupportNonRfc = true,
128  CtcpUserInfo = "You are going to play. And I am going to watch. And everything will be just fine...",
129  AutoRejoin = true,
130  AutoRejoinOnKick = true,
131  AutoRelogin = true,
132  AutoRetry = true,
133  AutoRetryLimit = TimeoutSeconds,
134  AutoRetryDelay = TimeoutSeconds,
135  ActiveChannelSyncing = true,
136  AutoNickHandling = true,
137  CtcpVersion = application.VersionString,
138  UseSsl = useSsl
139  };
140  if (useSsl)
141  client.ValidateServerCertificate = true; // dunno if it defaults to that or what
142 
143  client.OnChannelMessage += Client_OnChannelMessage;
144  client.OnQueryMessage += Client_OnQueryMessage;
145 
146  channelIdMap = new Dictionary<ulong, string>();
147  queryChannelIdMap = new Dictionary<ulong, string>();
148  channelIdCounter = 1;
149  disconnecting = false;
150  }
151 
153  public override void Dispose()
154  {
155  if (Connected)
156  {
157  disconnecting = true;
158  client.Disconnect(); // just closes the socket
159  }
160  }
161 
167  void HandleMessage(IrcEventArgs e, bool isPrivate)
168  {
169  if (e.Data.Nick.ToUpperInvariant() == client.Nickname.ToUpperInvariant())
170  return;
171 
172  var username = e.Data.Nick;
173  var channelName = isPrivate ? username : e.Data.Channel;
174 
175  ulong MapAndGetChannelId(Dictionary<ulong, string> dicToCheck)
176  {
177  ulong? resultId = null;
178  if (!dicToCheck.Any(x =>
179  {
180  if (x.Value != channelName)
181  return false;
182  resultId = x.Key;
183  return true;
184  }))
185  {
186  resultId = channelIdCounter++;
187  dicToCheck.Add(resultId.Value, channelName);
188  if (dicToCheck == queryChannelIdMap)
189  channelIdMap.Add(resultId.Value, null);
190  }
191 
192  return resultId.Value;
193  }
194 
195  ulong userId, channelId;
196  lock (this)
197  {
198  userId = MapAndGetChannelId(queryChannelIdMap);
199  channelId = isPrivate ? userId : MapAndGetChannelId(channelIdMap);
200  }
201 
202  var message = new Message
203  {
204  Content = e.Data.Message,
205  User = new User
206  {
207  Channel = new Channel
208  {
209  ConnectionName = address,
210  FriendlyName = isPrivate ? String.Format(CultureInfo.InvariantCulture, "PM: {0}", channelName) : channelName,
211  RealId = channelId,
212  IsPrivateChannel = isPrivate
213 
214  // isAdmin and Tag populated by manager
215  },
216  FriendlyName = username,
217  RealId = userId,
218  Mention = username
219  }
220  };
221 
222  EnqueueMessage(message);
223  }
224 
230  void Client_OnQueryMessage(object sender, IrcEventArgs e) => HandleMessage(e, true);
231 
237  void Client_OnChannelMessage(object sender, IrcEventArgs e) => HandleMessage(e, false);
238 
240  public override Task<bool> Connect(CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
241  {
242  disconnecting = false;
243  lock (this)
244  try
245  {
246  client.Connect(address, port);
247 
248  cancellationToken.ThrowIfCancellationRequested();
249 
250  if (passwordType == IrcPasswordType.Server)
252  else
253  {
254  if (passwordType == IrcPasswordType.Sasl)
255  {
256  client.WriteLine("CAP REQ :sasl", Priority.Critical); // needs to be put in the buffer before anything else
257  cancellationToken.ThrowIfCancellationRequested();
258  }
259 
260  client.Login(nickname, nickname, 0, nickname);
261  }
262 
263  if (passwordType == IrcPasswordType.NickServ)
264  {
265  cancellationToken.ThrowIfCancellationRequested();
266  client.SendMessage(SendType.Message, "NickServ", String.Format(CultureInfo.InvariantCulture, "IDENTIFY {0}", password));
267  }
268  else if (passwordType == IrcPasswordType.Sasl)
269  {
270  // wait for the sasl ack or timeout
271  var recievedAck = false;
272  var recievedPlus = false;
273  client.OnReadLine += (sender, e) =>
274  {
275  if (e.Line.Contains("ACK :sasl", StringComparison.Ordinal))
276  recievedAck = true;
277  else if (e.Line.Contains("AUTHENTICATE +", StringComparison.Ordinal))
278  recievedPlus = true;
279  };
280 
281  var startTime = DateTimeOffset.Now;
282  var endTime = DateTimeOffset.Now.AddSeconds(TimeoutSeconds);
283  cancellationToken.ThrowIfCancellationRequested();
284 
285  var listenTimeSpan = TimeSpan.FromMilliseconds(10);
286  for (; !recievedAck && DateTimeOffset.Now <= endTime; asyncDelayer.Delay(listenTimeSpan, cancellationToken).GetAwaiter().GetResult())
287  client.Listen(false);
288 
289  client.WriteLine("AUTHENTICATE PLAIN", Priority.Critical);
290  cancellationToken.ThrowIfCancellationRequested();
291 
292  for (; !recievedPlus && DateTimeOffset.Now <= endTime; asyncDelayer.Delay(listenTimeSpan, cancellationToken).GetAwaiter().GetResult())
293  client.Listen(false);
294 
295  // Stolen! https://github.com/znc/znc/blob/1e697580155d5a38f8b5a377f3b1d94aaa979539/modules/sasl.cpp#L196
296  var authString = String.Format(CultureInfo.InvariantCulture, "{0}{1}{0}{1}{2}", nickname, '\0', password);
297  var b64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(authString));
298  var authLine = String.Format(CultureInfo.InvariantCulture, "AUTHENTICATE {0}", b64);
299  var chars = authLine.ToCharArray();
300  client.WriteLine(authLine, Priority.Critical);
301 
302  cancellationToken.ThrowIfCancellationRequested();
303  client.WriteLine("CAP END", Priority.Critical);
304  }
305 
306  client.Listen(false);
307 
308  listenTask = Task.Factory.StartNew(() =>
309  {
310  while (!disconnecting && client.IsConnected && client.Nickname != nickname)
311  {
312  client.ListenOnce(true);
313  if (disconnecting || !client.IsConnected)
314  break;
315  client.Listen(false);
316 
317  // ensure we have the correct nick
318  if (client.GetIrcUser(nickname) == null)
319  client.RfcNick(nickname);
320  }
321 
322  client.Listen();
323  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
324  }
325  catch (OperationCanceledException)
326  {
327  throw;
328  }
329  catch (Exception e)
330  {
331  logger.LogWarning("Unable to connect to IRC: {0}", e);
332  return false;
333  }
334 
335  return true;
336  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
337 
339  public override async Task Disconnect(CancellationToken cancellationToken)
340  {
341  if (!Connected)
342  return;
343  try
344  {
345  await Task.Factory.StartNew(() =>
346  {
347  try
348  {
349  client.RfcQuit("Mr. Stark, I don't feel so good...", Priority.Critical); // priocritical otherwise it wont go through
350  }
351  catch (Exception e)
352  {
353  logger.LogWarning("Error quitting IRC: {0}", e);
354  }
355  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
356  Dispose();
357  await listenTask.ConfigureAwait(false);
358  }
359  catch (OperationCanceledException)
360  {
361  throw;
362  }
363  catch (Exception e)
364  {
365  logger.LogWarning("Error disconnecting from IRC! Exception: {0}", e);
366  }
367  }
368 
370  public override Task<IReadOnlyList<Channel>> MapChannels(IEnumerable<ChatChannel> channels, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
371  {
372  if (channels.Any(x => x.IrcChannel == null))
373  throw new InvalidOperationException("ChatChannel missing IrcChannel!");
374  lock (this)
375  {
376  var hs = new HashSet<string>(); // for unique inserts
377  foreach (var I in channels)
378  hs.Add(I.IrcChannel);
379  var toPart = new List<string>();
380  foreach (var I in client.JoinedChannels)
381  if (!hs.Remove(I))
382  toPart.Add(I);
383 
384  foreach (var I in toPart)
385  client.RfcPart(I, "Pretty nice abscond!");
386  foreach (var I in hs)
387  client.RfcJoin(I);
388 
389  return (IReadOnlyList<Channel>)channels.Select(x =>
390  {
391  ulong? id = null;
392  if (!channelIdMap.Any(y =>
393  {
394  if (y.Value != x.IrcChannel)
395  return false;
396  id = y.Key;
397  return true;
398  }))
399  {
400  id = channelIdCounter++;
401  channelIdMap.Add(id.Value, x.IrcChannel);
402  }
403 
404  return new Channel
405  {
406  RealId = id.Value,
407  IsAdminChannel = x.IsAdminChannel == true,
408  ConnectionName = address,
409  FriendlyName = channelIdMap[id.Value],
410  IsPrivateChannel = false,
411  Tag = x.Tag
412  };
413  }).ToList();
414  }
415  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
416 
418  public override Task SendMessage(ulong channelId, string message, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
419  {
420  var channelName = channelIdMap[channelId];
421  SendType sendType;
422  if (channelName == null)
423  {
424  channelName = queryChannelIdMap[channelId];
425  sendType = SendType.Notice;
426  }
427  else
428  sendType = SendType.Message;
429  try
430  {
431  client.SendMessage(sendType, channelName, message);
432  }
433  catch (Exception e)
434  {
435  logger.LogWarning("Unable to send to channel: {0}", e);
436  }
437  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
438  }
439 }
+
readonly Dictionary< ulong, string > queryChannelIdMap
Map of Channel.RealIds to query users
Definition: IrcProvider.cs:76
+
readonly IrcFeatures client
The IrcFeatures client
Definition: IrcProvider.cs:41
+ +
readonly ushort port
Port of the server to connect to
Definition: IrcProvider.cs:51
+
readonly? IrcPasswordType passwordType
The IrcPasswordType of password
Definition: IrcProvider.cs:66
+
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+
readonly ILogger< IrcProvider > logger
The ILogger for the IrcProvider
Definition: IrcProvider.cs:36
+ + +
IrcProvider(IApplication application, IAsyncDelayer asyncDelayer, ILogger< IrcProvider > logger, string address, ushort port, string nickname, string password, IrcPasswordType? passwordType, bool useSsl)
Construct an IrcProvider
Definition: IrcProvider.cs:105
+
readonly string address
Address of the server to connect to
Definition: IrcProvider.cs:46
+
override async Task Disconnect(CancellationToken cancellationToken)
Gracefully disconnects the provider. Implies a call to IDisposable.Dispose
Definition: IrcProvider.cs:339
+
readonly Dictionary< ulong, string > channelIdMap
Map of Channel.RealIds to channel names
Definition: IrcProvider.cs:71
+
Represents a message recieved by a IProvider
Definition: Message.cs:6
+ + + +
void HandleMessage(IrcEventArgs e, bool isPrivate)
Handle an IRC message
Definition: IrcProvider.cs:167
+ + +
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the IrcProvider
Definition: IrcProvider.cs:31
+ +
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+
Task listenTask
The Task used for IrcConnection.Listen(bool)
Definition: IrcProvider.cs:86
+
Represents a Providers.IProvider channel
Definition: Channel.cs:10
+
override Task< bool > Connect(CancellationToken cancellationToken)
Attempt to connect the IProvider
+
override Task SendMessage(ulong channelId, string message, CancellationToken cancellationToken)
Send a message to the IProvider
+
Represents a tgs_chat_user datum
Definition: User.cs:10
+
IrcPasswordType
Represents the type of a password for a ChatProvider.Irc
+
string VersionString
A more verbose version of Version
Definition: IApplication.cs:18
+
void Client_OnChannelMessage(object sender, IrcEventArgs e)
When a channel message is received in IRC
+ + +
void Client_OnQueryMessage(object sender, IrcEventArgs e)
When a query message is received in IRC
+
override Task< IReadOnlyList< Channel > > MapChannels(IEnumerable< ChatChannel > channels, CancellationToken cancellationToken)
+
bool IsAdminChannel
If this is considered a channel for admin commands
Definition: Channel.cs:41
+ + +
readonly string password
Password which will used for authentication
Definition: IrcProvider.cs:61
+
void EnqueueMessage(Message message)
Queues a message for NextMessage(CancellationToken)
Definition: Provider.cs:40
+ + + +
+ + + + diff --git a/_job_controller_8cs.html b/_job_controller_8cs.html new file mode 100644 index 0000000000..d64028918c --- /dev/null +++ b/_job_controller_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/JobController.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
JobController.cs File Reference
+
+ + + + + diff --git a/_job_controller_8cs_source.html b/_job_controller_8cs_source.html new file mode 100644 index 0000000000..38ab36ffac --- /dev/null +++ b/_job_controller_8cs_source.html @@ -0,0 +1,113 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/JobController.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
JobController.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Mvc;
2 using Microsoft.EntityFrameworkCore;
3 using Microsoft.Extensions.Logging;
4 using System;
5 using System.Linq;
6 using System.Net;
7 using System.Threading;
8 using System.Threading.Tasks;
9 using Tgstation.Server.Api;
13 
15 {
19  [Route(Routes.Jobs)]
20  public sealed class JobController : ModelController<Api.Models.Job>
21  {
26 
34  public JobController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, ILogger<JobController> logger) : base(databaseContext, authenticationContextFactory, logger, true)
35  {
36  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
37  }
38 
40  [TgsAuthorize]
41  public override async Task<IActionResult> Read(CancellationToken cancellationToken)
42  {
43  var result = await DatabaseContext.Jobs.Where(x => x.Instance.Id == Instance.Id && !x.StoppedAt.HasValue).OrderByDescending(x => x.StartedAt).ToListAsync(cancellationToken).ConfigureAwait(false);
44  return Json(result.Select(x => x.ToApi()));
45  }
46 
48  [TgsAuthorize]
49  public override async Task<IActionResult> List(CancellationToken cancellationToken)
50  {
51  // you KNOW this will need pagination eventually right?
52  var jobs = await DatabaseContext.Jobs.Where(x => x.Instance.Id == Instance.Id).OrderByDescending(x => x.StartedAt).Select(x => new Api.Models.Job
53  {
54  Id = x.Id
55  }).ToListAsync(cancellationToken).ConfigureAwait(false);
56  return Json(jobs);
57  }
58 
60  [TgsAuthorize]
61  public override async Task<IActionResult> Delete(long id, CancellationToken cancellationToken)
62  {
63  // don't care if an instance post or not at this point
64  var job = await DatabaseContext.Jobs.Where(x => x.Id == id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
65  if (job == default(Job))
66  return NotFound();
67 
68  if (job.StoppedAt != null)
69  return StatusCode((int)HttpStatusCode.Gone);
70 
71  if (job.CancelRight.HasValue && job.CancelRightsType.HasValue && (AuthenticationContext.GetRight(job.CancelRightsType.Value) & job.CancelRight.Value) == 0)
72  return Forbid();
73 
74  var cancelled = await jobManager.CancelJob(job, AuthenticationContext.User, false, cancellationToken).ConfigureAwait(false);
75  return cancelled ? (IActionResult)Accepted() : StatusCode((int)HttpStatusCode.Gone);
76  }
77 
79  [TgsAuthorize]
80  public override async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
81  {
82  var job = await DatabaseContext.Jobs.Where(x => x.Id == id).Include(x => x.StartedBy).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
83  if (job == default(Job))
84  return NotFound();
85  var api = job.ToApi();
86  api.Progress = jobManager.JobProgress(job);
87  return Json(api);
88  }
89  }
90 }
+
Manages the runtime of Jobs
Definition: IJobManager.cs:12
+ + + +
override async Task< IActionResult > List(CancellationToken cancellationToken)
Attempt to list entries of the TModel
+
override async Task< IActionResult > Read(CancellationToken cancellationToken)
Attempt to read a TModel
+ + +
JobController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, ILogger< JobController > logger)
Construct a HomeController
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+
override async Task< IActionResult > GetId(long id, CancellationToken cancellationToken)
Attempt to get a specific a TModel
+ +
override async Task< IActionResult > Delete(long id, CancellationToken cancellationToken)
Attempt to delete a model with a particular id
+
Routes to a server actions
Definition: Routes.cs:9
+ +
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+ +
const string Jobs
The Models.Job controller
Definition: Routes.cs:79
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
An ApiController representing a TModel
+ +
Task< bool > CancelJob(Job job, User user, bool blocking, CancellationToken cancellationToken)
Cancels a give job
+ + +
readonly IJobManager jobManager
The IJobManager for the JobController
+
ModelController<TModel> for Api.Models.Jobs
+ + + +
int? JobProgress(Job job)
Get the Api.Models.Job.Progress for a job
+
+ + + + diff --git a/_job_exception_8cs.html b/_job_exception_8cs.html new file mode 100644 index 0000000000..2c10b79180 --- /dev/null +++ b/_job_exception_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/JobException.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
JobException.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Core.JobException
 Operation exceptions thrown from the context of a Models.Job More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_job_exception_8cs_source.html b/_job_exception_8cs_source.html new file mode 100644 index 0000000000..3fe06b6c48 --- /dev/null +++ b/_job_exception_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/JobException.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
JobException.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
8  public sealed class JobException : Exception
9  {
13  public JobException()
14  {
15  }
16 
21  public JobException(string message) : base(message)
22  {
23  }
24 
30  public JobException(string message, Exception innerException) : base(message, innerException)
31  {
32  }
33  }
34 }
JobException()
Construct a JobException
Definition: JobException.cs:13
+ +
JobException(string message, Exception innerException)
Construct a JobException with a message and innerException
Definition: JobException.cs:30
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+
JobException(string message)
Construct a JobException with a message
Definition: JobException.cs:21
+
+ + + + diff --git a/_job_handler_8cs.html b/_job_handler_8cs.html new file mode 100644 index 0000000000..b0a9772180 --- /dev/null +++ b/_job_handler_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/JobHandler.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
JobHandler.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Core.JobHandler
 Class for pairing Tasks with CancellationTokenSources More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_job_handler_8cs_source.html b/_job_handler_8cs_source.html new file mode 100644 index 0000000000..6d52beef47 --- /dev/null +++ b/_job_handler_8cs_source.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/JobHandler.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
JobHandler.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4 
6 {
10  sealed class JobHandler : IDisposable
11  {
15  readonly CancellationTokenSource cancellationTokenSource;
16 
20  readonly Task task;
21 
26  public JobHandler(Func<CancellationToken, Task> job)
27  {
28  if (job == null)
29  throw new ArgumentNullException(nameof(job));
30  cancellationTokenSource = new CancellationTokenSource();
31  task = job(cancellationTokenSource.Token);
32  }
33 
35  public void Dispose() => cancellationTokenSource.Dispose();
36 
40  public int? Progress { get; set; }
41 
47  public async Task Wait(CancellationToken cancellationToken)
48  {
49  TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
50  using (cancellationToken.Register(() => tcs.SetCanceled()))
51  await Task.WhenAny(tcs.Task, task).ConfigureAwait(false);
52  cancellationToken.ThrowIfCancellationRequested();
53  }
54 
58  public void Cancel() => cancellationTokenSource.Cancel();
59  }
60 }
int? Progress
The progress of the job
Definition: JobHandler.cs:40
+ + +
async Task Wait(CancellationToken cancellationToken)
Wait for task to complete
Definition: JobHandler.cs:47
+ +
JobHandler(Func< CancellationToken, Task > job)
Construct a JobHandler
Definition: JobHandler.cs:26
+
readonly CancellationTokenSource cancellationTokenSource
The CancellationTokenSource for task
Definition: JobHandler.cs:15
+
readonly Task task
The Task being run
Definition: JobHandler.cs:20
+ +
Class for pairing Tasks with CancellationTokenSources
Definition: JobHandler.cs:10
+
+ + + + diff --git a/_job_manager_8cs.html b/_job_manager_8cs.html new file mode 100644 index 0000000000..2019e7e4ad --- /dev/null +++ b/_job_manager_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/JobManager.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
JobManager.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Core.JobManager
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_job_manager_8cs_source.html b/_job_manager_8cs_source.html new file mode 100644 index 0000000000..6216c27d2d --- /dev/null +++ b/_job_manager_8cs_source.html @@ -0,0 +1,121 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/JobManager.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
JobManager.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;
9 
11 {
14  {
19 
23  readonly ILogger<JobManager> logger;
24 
28  readonly Dictionary<long, JobHandler> jobs;
29 
36  {
37  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
38  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
39  jobs = new Dictionary<long, JobHandler>();
40  }
41 
43  public void Dispose()
44  {
45  foreach (var job in jobs)
46  job.Value.Dispose();
47  }
48 
55  {
56  lock (this)
57  {
58  if (!jobs.TryGetValue(job.Id, out JobHandler jobHandler))
59  throw new InvalidOperationException("Job not running!");
60  return jobHandler;
61  }
62  }
63 
71  async Task RunJob(Job job, Func<Job, IDatabaseContext, CancellationToken, Task> operation, CancellationToken cancellationToken)
72  {
73  try
74  {
75  await databaseContextFactory.UseContext(async databaseContext =>
76  {
77  async Task HandleExceptions(Task task)
78  {
79  void LogRegularException() => logger.LogDebug("Job {0} exited with error! Exception: {1}", job.Id, job.ExceptionDetails);
80  try
81  {
82  await task.ConfigureAwait(false);
83  }
84  catch (OperationCanceledException)
85  {
86  logger.LogDebug("Job {0} cancelled!", job.Id);
87  job.Cancelled = true;
88  }
89  catch (JobException e)
90  {
91  job.ExceptionDetails = e.Message;
92  LogRegularException();
93  if (e.InnerException != null)
94  logger.LogDebug("Inner exception for job {0}: {1}", job.Id, e.InnerException);
95  }
96  catch (Exception e)
97  {
98  job.ExceptionDetails = e.ToString();
99  LogRegularException();
100  }
101  finally
102  {
103  job.StoppedAt = DateTimeOffset.Now;
104  }
105  }
106 
107  async Task RunJobInternal()
108  {
109  var oldJob = job;
110  job = new Job { Id = oldJob.Id };
111  databaseContext.Jobs.Attach(job);
112 
113  await operation(job, databaseContext, cancellationToken).ConfigureAwait(false);
114 
115  logger.LogDebug("Job {0} completed!", job.Id);
116  }
117 
118  await HandleExceptions(RunJobInternal()).ConfigureAwait(false);
119 
120  await databaseContext.Save(default).ConfigureAwait(false);
121 
122  bool JobErroredOrCancelled() => job.ExceptionDetails != null || job.Cancelled == true;
123 
124  // ok so, now it's time for the post commit step if it exists
125  if (!JobErroredOrCancelled() && job.PostComplete != null)
126  {
127  await HandleExceptions(job.PostComplete(cancellationToken)).ConfigureAwait(false);
128  if (JobErroredOrCancelled())
129  await databaseContext.Save(default).ConfigureAwait(false);
130  }
131  }).ConfigureAwait(false);
132  }
133  finally
134  {
135  lock (this)
136  {
137  var handler = jobs[job.Id];
138  jobs.Remove(job.Id);
139  handler.Dispose();
140  }
141  }
142  }
143 
145  public Task RegisterOperation(Job job, Func<Job, IDatabaseContext, Action<int>, CancellationToken, Task> operation, CancellationToken cancellationToken) => databaseContextFactory.UseContext(async databaseContext =>
146  {
147  if (job == null)
148  throw new ArgumentNullException(nameof(job));
149  if (operation == null)
150  throw new ArgumentNullException(nameof(operation));
151 
152  job.StartedAt = DateTimeOffset.Now;
153  job.Cancelled = false;
154 
155  job.Instance = new Instance
156  {
157  Id = job.Instance.Id
158  };
159  databaseContext.Instances.Attach(job.Instance);
160 
161  job.StartedBy = new User
162  {
163  Id = job.StartedBy.Id
164  };
165  databaseContext.Users.Attach(job.StartedBy);
166 
167  databaseContext.Jobs.Add(job);
168 
169  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
170  logger.LogDebug("Starting job {0}: {1}...", job.Id, job.Description);
171  var jobHandler = new JobHandler(x => RunJob(job, (jobParam, serviceProvider, ct) =>
172  operation(jobParam, serviceProvider, y =>
173  {
174  lock (this)
175  if (jobs.TryGetValue(job.Id, out var handler))
176  handler.Progress = y;
177  }, ct),
178  x));
179  lock (this)
180  jobs.Add(job.Id, jobHandler);
181  });
182 
184  public async Task StartAsync(CancellationToken cancellationToken)
185  {
186  logger.LogTrace("Starting job manager...");
187  await databaseContextFactory.UseContext(async databaseContext =>
188  {
189  // mark all jobs as cancelled
190  var badJobs = await databaseContext.Jobs.Where(y => !y.StoppedAt.HasValue).Select(y => y.Id).ToListAsync(cancellationToken).ConfigureAwait(false);
191  if (badJobs.Count > 0)
192  {
193  logger.LogTrace("Cleaning {0} unfinished jobs...", badJobs.Count);
194  foreach (var I in badJobs)
195  {
196  var job = new Job { Id = I };
197  databaseContext.Jobs.Attach(job);
198  job.Cancelled = true;
199  job.StoppedAt = DateTimeOffset.Now;
200  }
201 
202  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
203  }
204  }).ConfigureAwait(false);
205  logger.LogDebug("Job manager started!");
206  }
207 
209  public async Task StopAsync(CancellationToken cancellationToken)
210  {
211  var joinTasks = jobs.Select(x =>
212  {
213  x.Value.Cancel();
214  return x.Value.Wait(cancellationToken);
215  });
216  await Task.WhenAll(joinTasks).ConfigureAwait(false);
217  }
218 
220  public async Task<bool> CancelJob(Job job, User user, bool blocking, CancellationToken cancellationToken)
221  {
222  if (job == null)
223  throw new ArgumentNullException(nameof(job));
224  if (user == null)
225  throw new ArgumentNullException(nameof(user));
226  JobHandler handler;
227  try
228  {
229  handler = CheckGetJob(job);
230  }
231  catch (InvalidOperationException)
232  {
233  // this is fine
234  return false;
235  }
236 
237  handler.Cancel(); // this will ensure the db update is only done once
238  await databaseContextFactory.UseContext(async databaseContext =>
239  {
240  job = new Job { Id = job.Id };
241  databaseContext.Jobs.Attach(job);
242  user = new User { Id = user.Id };
243  databaseContext.Users.Attach(user);
244  job.CancelledBy = user;
245 
246  // let either startup or cancellation set job.cancelled
247  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
248  }).ConfigureAwait(false);
249  if (blocking)
250  await handler.Wait(cancellationToken).ConfigureAwait(false);
251  return true;
252  }
253 
255  public int? JobProgress(Job job)
256  {
257  if (job == null)
258  throw new ArgumentNullException(nameof(job));
259  lock (this)
260  {
261  if (!jobs.TryGetValue(job.Id, out var handler))
262  return null;
263  return handler.Progress;
264  }
265  }
266 
268  public async Task WaitForJobCompletion(Job job, User canceller, CancellationToken jobCancellationToken, CancellationToken cancellationToken)
269  {
270  if (job == null)
271  throw new ArgumentNullException(nameof(job));
272  if (canceller == null)
273  throw new ArgumentNullException(nameof(canceller));
274  JobHandler handler;
275  lock (this)
276  {
277  if (!jobs.TryGetValue(job.Id, out handler))
278  return;
279  }
280 
281  Task cancelTask = null;
282  using (jobCancellationToken.Register(() => cancelTask = CancelJob(job, canceller, true, cancellationToken)))
283  await handler.Wait(cancellationToken).ConfigureAwait(false);
284 
285  if (cancelTask != null)
286  await cancelTask.ConfigureAwait(false);
287  }
288  }
289 }
+
Manages the runtime of Jobs
Definition: IJobManager.cs:12
+ +
JobHandler CheckGetJob(Job job)
Gets the JobHandler for a given job if it exists
Definition: JobManager.cs:54
+
async Task StartAsync(CancellationToken cancellationToken)
Definition: JobManager.cs:184
+
int? JobProgress(Job job)
Get the Api.Models.Job.Progress for a job
Definition: JobManager.cs:255
+
readonly Dictionary< long, JobHandler > jobs
Dictionary<TKey, TValue> of Api.Models.Internal.Job.Id to running JobHandlers
Definition: JobManager.cs:28
+ +
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
+
async Task< bool > CancelJob(Job job, User user, bool blocking, CancellationToken cancellationToken)
Cancels a give job
Definition: JobManager.cs:220
+
async Task Wait(CancellationToken cancellationToken)
Wait for task to complete
Definition: JobHandler.cs:47
+
async Task WaitForJobCompletion(Job job, User canceller, CancellationToken jobCancellationToken, CancellationToken cancellationToken)
Wait for a given job to complete
Definition: JobManager.cs:268
+
string ExceptionDetails
Details of any exceptions caught during the Job
Definition: Job.cs:26
+
Task RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
Registers a given Job and begins running it
+
User CancelledBy
See Api.Models.Job.CancelledBy
Definition: Job.cs:21
+ + + +
DateTimeOffset? StoppedAt
When the Job stopped
Definition: Job.cs:37
+
bool? Cancelled
If the Job was cancelled
Definition: Job.cs:43
+
async Task StopAsync(CancellationToken cancellationToken)
Definition: JobManager.cs:209
+
JobManager(IDatabaseContextFactory databaseContextFactory, ILogger< JobManager > logger)
Construct a JobManager
Definition: JobManager.cs:35
+
Func< CancellationToken, Task > PostComplete
A Task to run after the job completes. This will not affect the Api.Models.Internal....
Definition: Job.cs:34
+ +
readonly ILogger< JobManager > logger
The ILogger for the JobManager
Definition: JobManager.cs:23
+
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
long Id
The ID of the User
Definition: User.cs:15
+ +
readonly IDatabaseContextFactory databaseContextFactory
The IServiceProvider for the JobManager
Definition: JobManager.cs:18
+ +
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+
async Task RunJob(Job job, Func< Job, IDatabaseContext, CancellationToken, Task > operation, CancellationToken cancellationToken)
Runner for JobHandlers
Definition: JobManager.cs:71
+ + + +
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+ +
Class for pairing Tasks with CancellationTokenSources
Definition: JobHandler.cs:10
+
+ + + + diff --git a/_jobs_client_8cs.html b/_jobs_client_8cs.html new file mode 100644 index 0000000000..cb34f32326 --- /dev/null +++ b/_jobs_client_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/JobsClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
JobsClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Client.Components.JobsClient
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
namespace  Tgstation.Server.Client.Components
 
+
+ + + + diff --git a/_jobs_client_8cs_source.html b/_jobs_client_8cs_source.html new file mode 100644 index 0000000000..6afad7a040 --- /dev/null +++ b/_jobs_client_8cs_source.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/JobsClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
JobsClient.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Threading;
4 using System.Threading.Tasks;
5 using Tgstation.Server.Api;
7 
9 {
11  sealed class JobsClient : IJobsClient
12  {
17 
21  readonly Instance instance;
22 
29  {
30  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
31  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
32  }
33 
35  public Task Cancel(Job job, CancellationToken cancellationToken) => apiClient.Delete(Routes.SetID(Routes.Jobs, job?.Id ?? throw new ArgumentNullException(nameof(job))), instance.Id, cancellationToken);
36 
38  public Task<IReadOnlyList<Job>> List(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<Job>>(Routes.List(Routes.Jobs), instance.Id, cancellationToken);
39 
41  public Task<IReadOnlyList<Job>> ListActive(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<Job>>(Routes.Jobs, instance.Id, cancellationToken);
42 
44  public Task<Job> GetId(Job job, CancellationToken cancellationToken) => apiClient.Read<Job>(Routes.SetID(Routes.Jobs, job?.Id ?? throw new ArgumentNullException(nameof(job))), instance.Id, cancellationToken);
45  }
46 }
+
Task< IReadOnlyList< Job > > ListActive(CancellationToken cancellationToken)
List the active Jobs in the Instance
+
JobsClient(IApiClient apiClient, Instance instance)
Construct a JobsClient
Definition: JobsClient.cs:28
+
Task< IReadOnlyList< Job > > List(CancellationToken cancellationToken)
List the Api.Models.Internal.Job.Ids in the Instance
+ +
Routes to a server actions
Definition: Routes.cs:9
+ + +
Task< Job > GetId(Job job, CancellationToken cancellationToken)
Get a job
+
const string Jobs
The Models.Job controller
Definition: Routes.cs:79
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
readonly IApiClient apiClient
The IApiClient for the JobsClient
Definition: JobsClient.cs:16
+ +
Metadata about a server instance
Definition: Instance.cs:9
+
static string SetID(string route, long id)
Apply an id postfix to a route
+
Task Delete(string route, CancellationToken cancellationToken)
Run an HTTP DELETE request
+
static string List(string route)
Get the /List postfix for a route
+ +
Web interface for the API
Definition: IApiClient.cs:11
+
readonly Instance instance
The Instance for the JobsClient
Definition: JobsClient.cs:21
+
Task Cancel(Job job, CancellationToken cancellationToken)
Cancels a job
+ +
Represents a long running job on the server. Model is read-only, updates attempt to cancel the job
Definition: Job.cs:6
+
+ + + + diff --git a/_json_file_8cs.html b/_json_file_8cs.html new file mode 100644 index 0000000000..a5a6b71b6b --- /dev/null +++ b/_json_file_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/JsonFile.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
JsonFile.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Interop.JsonFile
 Representation of the initial json passed to DreamDaemon More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Interop
 
+
+ + + + diff --git a/_json_file_8cs_source.html b/_json_file_8cs_source.html new file mode 100644 index 0000000000..6e2710cc5f --- /dev/null +++ b/_json_file_8cs_source.html @@ -0,0 +1,99 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/JsonFile.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
JsonFile.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
4 
6 {
10  sealed class JsonFile
11  {
15  public string AccessIdentifier { get; set; }
16 
20  public bool ApiValidateOnly { get; set; }
21 
25  public string InstanceName { get; set; }
26 
30  public string ChatChannelsJson { get; set; }
31 
35  public string ChatCommandsJson { get; set; }
36 
40  public string ServerCommandsJson { get; set; }
41 
45  public Api.Models.Internal.RevisionInformation Revision { get; set; }
46 
50  public DreamDaemonSecurity SecurityLevel { get; set; }
51 
55  public List<TestMerge> TestMerges { get; } = new List<TestMerge>();
56  }
57 }
+
string ChatCommandsJson
JSON file DD should write to with available chat commands
Definition: JsonFile.cs:35
+
Representation of the initial json passed to DreamDaemon
Definition: JsonFile.cs:10
+
string ServerCommandsJson
JSON file DD should write to to send commands to the server
Definition: JsonFile.cs:40
+ +
DreamDaemonSecurity SecurityLevel
The DreamDaemonSecurity level of the launch
Definition: JsonFile.cs:50
+
List< TestMerge > TestMerges
The TestMerges in the launch
Definition: JsonFile.cs:55
+ +
Api.Models.Internal.RevisionInformation Revision
The Api.Models.Internal.RevisionInformation of the launch
Definition: JsonFile.cs:45
+ +
string AccessIdentifier
The code used by the server to authenticate command Topics
Definition: JsonFile.cs:15
+
bool ApiValidateOnly
If DD should just respond if it's API is working and then exit
Definition: JsonFile.cs:20
+ +
string ChatChannelsJson
JSON file name that contains current active chat channel information
Definition: JsonFile.cs:30
+
DreamDaemonSecurity
DreamDaemon's security level
+
string InstanceName
The Api.Models.Instance.Name of the owner at the time of launch
Definition: JsonFile.cs:25
+ +
+ + + + diff --git a/_json_sub_file_list_8cs.html b/_json_sub_file_list_8cs.html new file mode 100644 index 0000000000..971a89fd68 --- /dev/null +++ b/_json_sub_file_list_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/JsonSubFileList.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
JsonSubFileList.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Interop.JsonSubFileList
 Information used in for reattaching and interop More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Interop
 
+
+ + + + diff --git a/_json_sub_file_list_8cs_source.html b/_json_sub_file_list_8cs_source.html new file mode 100644 index 0000000000..599ddb8280 --- /dev/null +++ b/_json_sub_file_list_8cs_source.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/JsonSubFileList.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
JsonSubFileList.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.ComponentModel.DataAnnotations;
3 
5 {
9  public class JsonSubFileList
10  {
14  [Required]
15  public string ChatCommandsJson { get; set; }
16 
20  [Required]
21  public string ChatChannelsJson { get; set; }
22 
26  [Required]
27  public string ServerCommandsJson { get; set; }
28 
32  protected JsonSubFileList() { }
33 
39  {
40  if (copy == null)
41  throw new ArgumentNullException(nameof(copy));
45  }
46  }
47 }
string ServerCommandsJson
Path to the server commands json file
+
string ChatCommandsJson
Path to the chat commands json file
+
JsonSubFileList(JsonSubFileList copy)
Construct an JsonSubFileList from a copy
+
Information used in for reattaching and interop
+ +
string ChatChannelsJson
Path to the chat channels json file
+ +
+ + + + diff --git a/_json_tracking_context_8cs.html b/_json_tracking_context_8cs.html new file mode 100644 index 0000000000..f60803bd78 --- /dev/null +++ b/_json_tracking_context_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/JsonTrackingContext.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
JsonTrackingContext.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Components.Chat.JsonTrackingContext
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
+
+ + + + diff --git a/_json_tracking_context_8cs_source.html b/_json_tracking_context_8cs_source.html new file mode 100644 index 0000000000..56cb36d505 --- /dev/null +++ b/_json_tracking_context_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/JsonTrackingContext.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
JsonTrackingContext.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using Newtonsoft.Json;
3 using Newtonsoft.Json.Serialization;
4 using System;
5 using System.Collections.Generic;
6 using System.Text;
7 using System.Threading;
8 using System.Threading.Tasks;
11 using Tgstation.Server.Host.IO;
12 
14 {
17  {
19  public bool Active
20  {
21  get => active;
22  set
23  {
24  active = true;
25  logger.LogDebug("Tracking {0}activated", !active ? "de" : String.Empty);
26  }
27  }
28 
31  readonly ILogger<JsonTrackingContext> logger;
32  readonly Action onDispose;
33 
34  readonly string commandsPath;
35  readonly string channelsPath;
36 
37  readonly SemaphoreSlim channelsSemaphore;
38 
39  bool active;
40 
51  {
52  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
53  this.customCommandHandler = customCommandHandler ?? throw new ArgumentNullException(nameof(customCommandHandler));
54  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
55  this.onDispose = onDispose ?? throw new ArgumentNullException(nameof(onDispose));
56  this.commandsPath = commandsPath ?? throw new ArgumentNullException(nameof(commandsPath));
57  this.channelsPath = channelsPath ?? throw new ArgumentNullException(nameof(channelsPath));
58 
59  channelsSemaphore = new SemaphoreSlim(1);
60  active = false;
61 
62  logger.LogTrace("Created tracking context for {0} and {1}", commandsPath, channelsPath);
63  }
64 
66  public void Dispose()
67  {
68  logger.LogTrace("Disposing...");
69  channelsSemaphore.Dispose();
70  onDispose();
71  }
72 
74  public async Task<IReadOnlyList<CustomCommand>> GetCustomCommands(CancellationToken cancellationToken)
75  {
76  try
77  {
78  if (Active && await ioManager.FileExists(commandsPath, cancellationToken).ConfigureAwait(false))
79  {
80  var resultBytes = await ioManager.ReadAllBytes(commandsPath, cancellationToken).ConfigureAwait(false);
81  var resultJson = Encoding.UTF8.GetString(resultBytes);
82  logger.LogTrace("Read commands JSON: {0}", resultJson);
83  var result = JsonConvert.DeserializeObject<List<CustomCommand>>(resultJson, new JsonSerializerSettings
84  {
85  ContractResolver = new DefaultContractResolver
86  {
87  NamingStrategy = new SnakeCaseNamingStrategy()
88  }
89  });
90  foreach (var I in result)
91  I.SetHandler(customCommandHandler);
92  return result;
93  }
94  }
95  catch (OperationCanceledException)
96  {
97  throw;
98  }
99  catch (Exception e)
100  {
101  logger.LogWarning("Error retrieving custom commands! Exception: {0}", e);
102  }
103 
104  return new List<CustomCommand>();
105  }
106 
108  public async Task SetChannels(IEnumerable<Channel> channels, CancellationToken cancellationToken)
109  {
110  using (await SemaphoreSlimContext.Lock(channelsSemaphore, cancellationToken).ConfigureAwait(false))
111  {
112  var json = JsonConvert.SerializeObject(channels, new JsonSerializerSettings
113  {
114  ContractResolver = new CamelCasePropertyNamesContractResolver()
115  });
116  logger.LogTrace("Writing channels JSON: {0}", json);
117  await ioManager.WriteAllBytes(channelsPath, Encoding.UTF8.GetBytes(json), cancellationToken).ConfigureAwait(false);
118  }
119  }
120  }
121 }
+ +
async Task SetChannels(IEnumerable< Channel > channels, CancellationToken cancellationToken)
Writes information about connected channels to the IJsonTrackingContext
+
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+ + + + + +
JsonTrackingContext(IIOManager ioManager, ICustomCommandHandler customCommandHandler, ILogger< JsonTrackingContext > logger, Action onDispose, string commandsPath, string channelsPath)
Construct a JsonTrackingContext
+ +
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists
+ + + +
Represents a tracking of dynamic chat json files
+ + + +
Handles Commands.ICommands that map to those defined in a IJsonTrackingContext
+ +
Interface for using filesystems
Definition: IIOManager.cs:11
+
Task< byte[]> ReadAllBytes(string path, CancellationToken cancellationToken)
Returns all the contents of a file at path as a byte array
+ +
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ + + + +
async Task< IReadOnlyList< CustomCommand > > GetCustomCommands(CancellationToken cancellationToken)
Read CustomCommands from the IJsonTrackingContext
+
+ + + + diff --git a/_kek_command_8cs.html b/_kek_command_8cs.html new file mode 100644 index 0000000000..a03c7ae50a --- /dev/null +++ b/_kek_command_8cs.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands/KekCommand.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
KekCommand.cs File Reference
+
+ + + + + diff --git a/_kek_command_8cs_source.html b/_kek_command_8cs_source.html new file mode 100644 index 0000000000..bee27daf43 --- /dev/null +++ b/_kek_command_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands/KekCommand.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
KekCommand.cs
+
+
+Go to the documentation of this file.
1 using System.Threading;
2 using System.Threading.Tasks;
3 
5 {
9  sealed class KekCommand : ICommand
10  {
14  const string Kek = "kek";
15 
17  public string Name => Kek;
18 
20  public string HelpText => Kek;
21 
23  public bool AdminOnly => false;
24 
26  public Task<string> Invoke(string arguments, User user, CancellationToken cancellationToken) => Task.FromResult(Kek);
27  }
28 }
+ + +
Task< string > Invoke(string arguments, User user, CancellationToken cancellationToken)
Invoke the ICommand
+ + +
Represents a tgs_chat_user datum
Definition: User.cs:10
+ +
Represents a command that can be invoked by talking to chat bots
Definition: ICommand.cs:9
+
+ + + + diff --git a/_launch_result_8cs.html b/_launch_result_8cs.html new file mode 100644 index 0000000000..d6a1a76167 --- /dev/null +++ b/_launch_result_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/LaunchResult.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
LaunchResult.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Watchdog.LaunchResult
 Represents the result of trying to start a DD process More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Watchdog
 
+
+ + + + diff --git a/_launch_result_8cs_source.html b/_launch_result_8cs_source.html new file mode 100644 index 0000000000..f66f974b01 --- /dev/null +++ b/_launch_result_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/LaunchResult.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
LaunchResult.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Globalization;
3 
5 {
9  public sealed class LaunchResult
10  {
14  public TimeSpan? StartupTime { get; set; }
15 
19  public int? ExitCode { get; set; }
20 
22  public override string ToString() => String.Format(CultureInfo.InvariantCulture, "Exit Code: {0}, Time {1}ms", ExitCode, StartupTime?.TotalMilliseconds);
23  }
24 }
+ +
Represents the result of trying to start a DD process
Definition: LaunchResult.cs:9
+
int? ExitCode
The System.Diagnostics.Process.ExitCode if it exited
Definition: LaunchResult.cs:19
+
TimeSpan? StartupTime
The time it took for System.Diagnostics.Process.WaitForInputIdle() to return. If null the startup tim...
Definition: LaunchResult.cs:14
+
+ + + + diff --git a/_message_8cs.html b/_message_8cs.html new file mode 100644 index 0000000000..1f0c586ebf --- /dev/null +++ b/_message_8cs.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Message.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Message.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Chat.Providers.Message
 Represents a message recieved by a IProvider More...
 
+ + + + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
namespace  Tgstation.Server.Host.Components.Chat.Providers
 
+
+ + + + diff --git a/_message_8cs_source.html b/_message_8cs_source.html new file mode 100644 index 0000000000..13b204b8fc --- /dev/null +++ b/_message_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Message.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Message.cs
+
+
+Go to the documentation of this file.
2 {
6  sealed class Message
7  {
11  public string Content { get; set; }
12 
16  public User User { get; set; }
17  }
18 }
Represents a message recieved by a IProvider
Definition: Message.cs:6
+ + +
Represents a tgs_chat_user datum
Definition: User.cs:10
+
+ + + + diff --git a/_method_not_supported_exception_8cs.html b/_method_not_supported_exception_8cs.html new file mode 100644 index 0000000000..0865f995ae --- /dev/null +++ b/_method_not_supported_exception_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/MethodNotSupportedException.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
MethodNotSupportedException.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Client.MethodNotSupportedException
 Occurs when the client tries to use a currently unsupported API More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_method_not_supported_exception_8cs_source.html b/_method_not_supported_exception_8cs_source.html new file mode 100644 index 0000000000..f41d02eb4b --- /dev/null +++ b/_method_not_supported_exception_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/MethodNotSupportedException.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
MethodNotSupportedException.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Net;
4 
6 {
11  {
16  {
17  Message = "This method is not currently supported!",
18  SeverApiVersion = null
19  }, HttpStatusCode.NotImplemented)
20  { }
21 
26  public MethodNotSupportedException(string message) : base(message) { }
27 
33  public MethodNotSupportedException(string message, Exception innerException) : base(message, innerException) { }
34  }
35 }
MethodNotSupportedException()
Construct an MethodNotSupportedException
+ + +
MethodNotSupportedException(string message, Exception innerException)
Construct an MethodNotSupportedException with a message and innerException
+
MethodNotSupportedException(string message)
Construct an MethodNotSupportedException with a message
+ + +
Occurs when the client tries to use a currently unsupported API
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
Exceptions thrown by IServerClients
+
+ + + + diff --git a/_model_controller_8cs.html b/_model_controller_8cs.html new file mode 100644 index 0000000000..31767f69f8 --- /dev/null +++ b/_model_controller_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/ModelController.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ModelController.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Controllers.ModelController< TModel >
 An ApiController representing a TModel More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Controllers
 
+
+ + + + diff --git a/_model_controller_8cs_source.html b/_model_controller_8cs_source.html new file mode 100644 index 0000000000..ff52c73724 --- /dev/null +++ b/_model_controller_8cs_source.html @@ -0,0 +1,100 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/ModelController.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ModelController.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Mvc;
2 using Microsoft.Extensions.Logging;
3 using System.Threading;
4 using System.Threading.Tasks;
7 
9 {
14  public abstract class ModelController<TModel> : ApiController where TModel : class
15  {
23  public ModelController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance) : base(databaseContext, authenticationContextFactory, logger, requireInstance, true) { }
24 
31  [HttpPut]
32  public virtual Task<IActionResult> Create([FromBody]TModel model, CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound());
33 
39  [HttpGet]
40  public virtual Task<IActionResult> Read(CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound());
41 
48  [HttpGet("{id}")]
49  public virtual Task<IActionResult> GetId(long id, CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound());
50 
57  [HttpPost]
58  public virtual Task<IActionResult> Update([FromBody]TModel model, CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound());
59 
66  [HttpDelete("{id}")]
67  public virtual Task<IActionResult> Delete(long id, CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound());
68 
74  [HttpGet("List")]
75  public virtual Task<IActionResult> List(CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound());
76  }
77 }
+ + +
ModelController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)
Construct a ModelController<TModel>
+ +
virtual Task< IActionResult > Delete(long id, CancellationToken cancellationToken)
Attempt to delete a model with a particular id
+
virtual Task< IActionResult > GetId(long id, CancellationToken cancellationToken)
Attempt to get a specific a TModel
+
virtual Task< IActionResult > Create([FromBody]TModel model, CancellationToken cancellationToken)
Attempt to create a model
+ +
An ApiController representing a TModel
+ +
readonly bool requireInstance
If IAuthenticationContext.InstanceUser permissions are required to access the ApiController
+
virtual Task< IActionResult > List(CancellationToken cancellationToken)
Attempt to list entries of the TModel
+ +
virtual Task< IActionResult > Read(CancellationToken cancellationToken)
Attempt to read a TModel
+ +
virtual Task< IActionResult > Update([FromBody]TModel model, CancellationToken cancellationToken)
Attempt to update a model
+ +
+ + + + diff --git a/_models_2_reattach_information_8cs.html b/_models_2_reattach_information_8cs.html new file mode 100644 index 0000000000..051952b22d --- /dev/null +++ b/_models_2_reattach_information_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/ReattachInformation.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ReattachInformation.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.ReattachInformation
 Database representation of Components.Watchdog.ReattachInformation More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + diff --git a/_models_2_reattach_information_8cs_source.html b/_models_2_reattach_information_8cs_source.html new file mode 100644 index 0000000000..98487de226 --- /dev/null +++ b/_models_2_reattach_information_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/ReattachInformation.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ReattachInformation.cs
+
+
+Go to the documentation of this file.
1 using System.ComponentModel.DataAnnotations;
2 
4 {
9  {
13  public long Id { get; set; }
14 
18  [Required]
19  public CompileJob CompileJob { get; set; }
20  }
21 }
+
Database representation of Components.Watchdog.ReattachInformation
+ + + +
+ + + + diff --git a/_models_2_watchdog_reattach_information_8cs.html b/_models_2_watchdog_reattach_information_8cs.html new file mode 100644 index 0000000000..d08d15007a --- /dev/null +++ b/_models_2_watchdog_reattach_information_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/WatchdogReattachInformation.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
WatchdogReattachInformation.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.WatchdogReattachInformation
 Database representation of Components.Watchdog.WatchdogReattachInformation More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + diff --git a/_models_2_watchdog_reattach_information_8cs_source.html b/_models_2_watchdog_reattach_information_8cs_source.html new file mode 100644 index 0000000000..15429d09e8 --- /dev/null +++ b/_models_2_watchdog_reattach_information_8cs_source.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/WatchdogReattachInformation.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
WatchdogReattachInformation.cs
+
+
+Go to the documentation of this file.
2 {
7  {
11  public long Id { get; set; }
12 
16  public long InstanceId { get; set; }
17 
21  public ReattachInformation Alpha { get; set; }
22 
26  public ReattachInformation Bravo { get; set; }
27  }
28 }
Database representation of Components.Watchdog.WatchdogReattachInformation
+
ReattachInformation Alpha
The ReattachInformation for the Alpha server
+
Database representation of Components.Watchdog.ReattachInformation
+ + + +
long InstanceId
The Api.Models.Instance.Id of the Instance the WatchdogReattachInformation belongs to
+
ReattachInformation Bravo
The ReattachInformation for the Bravo server
+
+ + + + diff --git a/_monitor_action_8cs.html b/_monitor_action_8cs.html new file mode 100644 index 0000000000..c4d60d37a2 --- /dev/null +++ b/_monitor_action_8cs.html @@ -0,0 +1,115 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/MonitorAction.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
MonitorAction.cs File Reference
+
+ + + + + diff --git a/_monitor_action_8cs_source.html b/_monitor_action_8cs_source.html new file mode 100644 index 0000000000..df66ea6eff --- /dev/null +++ b/_monitor_action_8cs_source.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/MonitorAction.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
MonitorAction.cs
+
+
+Go to the documentation of this file.
2 {
7  {
11  Continue,
12 
16  Skip,
17 
21  Restart,
22 
26  Break,
27 
31  Exit
32  }
33 }
+ +
Skips the next call to HandleMonitorWakeup action
+
The monitor should stop checking actions for this iteration and continue its loop
+
The monitor should exit. Does not kill servers
+
MonitorAction
The action for the monitor loop to take when control is returned to it
Definition: MonitorAction.cs:6
+
+ + + + diff --git a/_monitor_activation_reason_8cs.html b/_monitor_activation_reason_8cs.html new file mode 100644 index 0000000000..e993cdc8d8 --- /dev/null +++ b/_monitor_activation_reason_8cs.html @@ -0,0 +1,117 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/MonitorActivationReason.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
MonitorActivationReason.cs File Reference
+
+ + + + + diff --git a/_monitor_activation_reason_8cs_source.html b/_monitor_activation_reason_8cs_source.html new file mode 100644 index 0000000000..06c0bc4ba2 --- /dev/null +++ b/_monitor_activation_reason_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/MonitorActivationReason.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
MonitorActivationReason.cs
+
+
+Go to the documentation of this file.
2 {
7  {
12 
17 
22 
27 
32 
37 
42  }
43 }
+ + + + + +
MonitorActivationReason
Reasons for the monitor to wake up
+ +
The inactive server is past that point where DD hangs when you press "Go"
+
+ + + + diff --git a/_monitor_state_8cs.html b/_monitor_state_8cs.html new file mode 100644 index 0000000000..c4f790c1a5 --- /dev/null +++ b/_monitor_state_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/MonitorState.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
MonitorState.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Watchdog.MonitorState
 The (absolute) state of the ExperimentalWatchdog More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Watchdog
 
+
+ + + + diff --git a/_monitor_state_8cs_source.html b/_monitor_state_8cs_source.html new file mode 100644 index 0000000000..9ebde621df --- /dev/null +++ b/_monitor_state_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/MonitorState.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
MonitorState.cs
+
+
+Go to the documentation of this file.
1 using Newtonsoft.Json;
2 
4 {
8  sealed class MonitorState
9  {
13  public bool RebootingInactiveServer { get; set; }
14 
18  public bool InactiveServerCritFail { get; set; }
19 
23  public MonitorAction NextAction { get; set; }
24 
28  [JsonIgnore]
29  public ISessionController ActiveServer { get; set; }
30 
34  [JsonIgnore]
35  public ISessionController InactiveServer { get; set; }
36  }
37 }
bool InactiveServerCritFail
If the inactive server is in an unrecoverable state
Definition: MonitorState.cs:18
+
MonitorAction NextAction
The next MonitorAction to take in ExperimentalWatchdog.MonitorLifetimes(System.Threading....
Definition: MonitorState.cs:23
+ +
Handles communication with a DreamDaemon IProcess
+
bool RebootingInactiveServer
If the inactive server is being rebooted
Definition: MonitorState.cs:13
+
ISessionController ActiveServer
The active ISessionController
Definition: MonitorState.cs:29
+
ISessionController InactiveServer
The inactive ISessionController
Definition: MonitorState.cs:35
+
MonitorAction
The action for the monitor loop to take when control is returned to it
Definition: MonitorAction.cs:6
+
The (absolute) state of the ExperimentalWatchdog
Definition: MonitorState.cs:8
+
+ + + + diff --git a/_my_sql_database_context_8cs.html b/_my_sql_database_context_8cs.html new file mode 100644 index 0000000000..ce9955b129 --- /dev/null +++ b/_my_sql_database_context_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/MySqlDatabaseContext.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
MySqlDatabaseContext.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.MySqlDatabaseContext
 DatabaseContext<TParentContext> for MySQL More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + diff --git a/_my_sql_database_context_8cs_source.html b/_my_sql_database_context_8cs_source.html new file mode 100644 index 0000000000..bf89bcf2ae --- /dev/null +++ b/_my_sql_database_context_8cs_source.html @@ -0,0 +1,101 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/MySqlDatabaseContext.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
MySqlDatabaseContext.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore;
2 using Microsoft.Extensions.Logging;
3 using Microsoft.Extensions.Options;
4 using MySql.Data.MySqlClient;
5 using Pomelo.EntityFrameworkCore.MySql.Infrastructure;
6 using System;
8 
10 {
14  sealed class MySqlDatabaseContext : DatabaseContext<MySqlDatabaseContext>
15  {
23  public MySqlDatabaseContext(DbContextOptions<MySqlDatabaseContext> dbContextOptions, IOptions<DatabaseConfiguration> databaseConfiguration, IDatabaseSeeder databaseSeeder, ILogger<MySqlDatabaseContext> logger) : base(dbContextOptions, databaseConfiguration, databaseSeeder, logger)
24  { }
25 
27  protected override void OnConfiguring(DbContextOptionsBuilder options)
28  {
29  base.OnConfiguring(options);
30  var stringDeconstructor = new MySqlConnectionStringBuilder
31  {
32  ConnectionString = DatabaseConfiguration.ConnectionString
33  };
34  if (stringDeconstructor.Server == "localhost")
35  Logger.LogWarning("MariaDB/MySQL server address is set to 'localhost'! If there are connection issues, try setting it to '127.0.0.1'!");
36  if (!String.IsNullOrEmpty(DatabaseConfiguration.MySqlServerVersion))
37  options.UseMySql(DatabaseConfiguration.ConnectionString, mySqlOptions => mySqlOptions.ServerVersion(Version.Parse(DatabaseConfiguration.MySqlServerVersion), DatabaseConfiguration.DatabaseType == DatabaseType.MariaDB ? ServerType.MariaDb : ServerType.MySql));
38  else
39  options.UseMySql(DatabaseConfiguration.ConnectionString);
40  }
41 
43  protected override bool UseMySQLMigrations() => true;
44  }
45 }
string ConnectionString
The connection string for the database
+
MySqlDatabaseContext(DbContextOptions< MySqlDatabaseContext > dbContextOptions, IOptions< DatabaseConfiguration > databaseConfiguration, IDatabaseSeeder databaseSeeder, ILogger< MySqlDatabaseContext > logger)
Construct a MySqlDatabaseContext
+
override void OnConfiguring(DbContextOptionsBuilder options)
+ +
For initially seeding a database
+
DatabaseType DatabaseType
The Configuration.DatabaseType to create
+ + + +
string MySqlServerVersion
The string form of the System.Version of a target MySQL/MariaDB server
+
Configuration options for the Models.DatabaseContext<TParentContext>
+
DatabaseType
Type of database to user
Definition: DatabaseType.cs:6
+ +
readonly IDatabaseSeeder databaseSeeder
The IDatabaseSeeder for the DatabaseContext<TParentContext>
+
ILogger Logger
The ILogger for the DatabaseContext<TParentContext>
+
override bool UseMySQLMigrations()
If the MY_ class of migrations should be used instead of the MS_ class
+ +
DatabaseContext<TParentContext> for MySQL
+ +
+ + + + diff --git a/_my_sql_database_context_model_snapshot_8cs.html b/_my_sql_database_context_model_snapshot_8cs.html new file mode 100644 index 0000000000..712c1e8fd2 --- /dev/null +++ b/_my_sql_database_context_model_snapshot_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/MySqlDatabaseContextModelSnapshot.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
MySqlDatabaseContextModelSnapshot.cs File Reference
+
+ + + + + diff --git a/_my_sql_database_context_model_snapshot_8cs_source.html b/_my_sql_database_context_model_snapshot_8cs_source.html new file mode 100644 index 0000000000..21a9952cbf --- /dev/null +++ b/_my_sql_database_context_model_snapshot_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/MySqlDatabaseContextModelSnapshot.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
MySqlDatabaseContextModelSnapshot.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated />
2 using System;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.EntityFrameworkCore.Infrastructure;
5 
7 {
8  [DbContext(typeof(MySqlDatabaseContext))]
10  {
11  protected override void BuildModel(ModelBuilder modelBuilder)
12  {
13 #pragma warning disable 612, 618
14  modelBuilder
15  .HasAnnotation("ProductVersion", "2.1.4-rtm-31024")
16  .HasAnnotation("Relational:MaxIdentifierLength", 64);
17 
18  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
19  {
20  b.Property<long>("Id")
21  .ValueGeneratedOnAdd();
22 
23  b.Property<string>("ConnectionString")
24  .IsRequired();
25 
26  b.Property<bool?>("Enabled");
27 
28  b.Property<long>("InstanceId");
29 
30  b.Property<string>("Name")
31  .IsRequired();
32 
33  b.Property<int?>("Provider");
34 
35  b.HasKey("Id");
36 
37  b.HasIndex("InstanceId");
38 
39  b.HasIndex("Name")
40  .IsUnique();
41 
42  b.ToTable("ChatBots");
43  });
44 
45  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
46  {
47  b.Property<long>("Id")
48  .ValueGeneratedOnAdd();
49 
50  b.Property<long>("ChatSettingsId");
51 
52  b.Property<ulong?>("DiscordChannelId");
53 
54  b.Property<string>("IrcChannel");
55 
56  b.Property<bool?>("IsAdminChannel")
57  .IsRequired();
58 
59  b.Property<bool?>("IsUpdatesChannel")
60  .IsRequired();
61 
62  b.Property<bool?>("IsWatchdogChannel")
63  .IsRequired();
64 
65  b.Property<string>("Tag");
66 
67  b.HasKey("Id");
68 
69  b.HasIndex("ChatSettingsId", "DiscordChannelId")
70  .IsUnique();
71 
72  b.HasIndex("ChatSettingsId", "IrcChannel")
73  .IsUnique();
74 
75  b.ToTable("ChatChannels");
76  });
77 
78  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
79  {
80  b.Property<long>("Id")
81  .ValueGeneratedOnAdd();
82 
83  b.Property<string>("ByondVersion")
84  .IsRequired();
85 
86  b.Property<Guid?>("DirectoryName")
87  .IsRequired();
88 
89  b.Property<string>("DmeName")
90  .IsRequired();
91 
92  b.Property<long>("JobId");
93 
94  b.Property<int>("MinimumSecurityLevel");
95 
96  b.Property<string>("Output")
97  .IsRequired();
98 
99  b.Property<long>("RevisionInformationId");
100 
101  b.HasKey("Id");
102 
103  b.HasIndex("DirectoryName");
104 
105  b.HasIndex("JobId")
106  .IsUnique();
107 
108  b.HasIndex("RevisionInformationId");
109 
110  b.ToTable("CompileJobs");
111  });
112 
113  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
114  {
115  b.Property<long>("Id")
116  .ValueGeneratedOnAdd();
117 
118  b.Property<string>("AccessToken");
119 
120  b.Property<bool?>("AllowWebClient")
121  .IsRequired();
122 
123  b.Property<bool?>("AutoStart")
124  .IsRequired();
125 
126  b.Property<long>("InstanceId");
127 
128  b.Property<ushort?>("PrimaryPort")
129  .IsRequired();
130 
131  b.Property<int?>("ProcessId");
132 
133  b.Property<ushort?>("SecondaryPort")
134  .IsRequired();
135 
136  b.Property<int>("SecurityLevel");
137 
138  b.Property<bool?>("SoftRestart")
139  .IsRequired();
140 
141  b.Property<bool?>("SoftShutdown")
142  .IsRequired();
143 
144  b.Property<uint?>("StartupTimeout")
145  .IsRequired();
146 
147  b.HasKey("Id");
148 
149  b.HasIndex("InstanceId")
150  .IsUnique();
151 
152  b.ToTable("DreamDaemonSettings");
153  });
154 
155  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
156  {
157  b.Property<long>("Id")
158  .ValueGeneratedOnAdd();
159 
160  b.Property<ushort?>("ApiValidationPort")
161  .IsRequired();
162 
163  b.Property<int>("ApiValidationSecurityLevel");
164 
165  b.Property<long>("InstanceId");
166 
167  b.Property<string>("ProjectName");
168 
169  b.HasKey("Id");
170 
171  b.HasIndex("InstanceId")
172  .IsUnique();
173 
174  b.ToTable("DreamMakerSettings");
175  });
176 
177  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
178  {
179  b.Property<long>("Id")
180  .ValueGeneratedOnAdd();
181 
182  b.Property<uint?>("AutoUpdateInterval")
183  .IsRequired();
184 
185  b.Property<int>("ConfigurationType");
186 
187  b.Property<string>("Name")
188  .IsRequired();
189 
190  b.Property<bool?>("Online")
191  .IsRequired();
192 
193  b.Property<string>("Path")
194  .IsRequired();
195 
196  b.HasKey("Id");
197 
198  b.HasIndex("Path")
199  .IsUnique();
200 
201  b.ToTable("Instances");
202  });
203 
204  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
205  {
206  b.Property<long>("Id")
207  .ValueGeneratedOnAdd();
208 
209  b.Property<ulong>("ByondRights");
210 
211  b.Property<ulong>("ChatBotRights");
212 
213  b.Property<ulong>("ConfigurationRights");
214 
215  b.Property<ulong>("DreamDaemonRights");
216 
217  b.Property<ulong>("DreamMakerRights");
218 
219  b.Property<long>("InstanceId");
220 
221  b.Property<ulong>("InstanceUserRights");
222 
223  b.Property<ulong>("RepositoryRights");
224 
225  b.Property<long?>("UserId")
226  .IsRequired();
227 
228  b.HasKey("Id");
229 
230  b.HasIndex("InstanceId");
231 
232  b.HasIndex("UserId", "InstanceId")
233  .IsUnique();
234 
235  b.ToTable("InstanceUsers");
236  });
237 
238  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
239  {
240  b.Property<long>("Id")
241  .ValueGeneratedOnAdd();
242 
243  b.Property<ulong?>("CancelRight");
244 
245  b.Property<ulong?>("CancelRightsType");
246 
247  b.Property<bool?>("Cancelled")
248  .IsRequired();
249 
250  b.Property<long?>("CancelledById");
251 
252  b.Property<string>("Description")
253  .IsRequired();
254 
255  b.Property<string>("ExceptionDetails");
256 
257  b.Property<long>("InstanceId");
258 
259  b.Property<DateTimeOffset?>("StartedAt")
260  .IsRequired();
261 
262  b.Property<long>("StartedById");
263 
264  b.Property<DateTimeOffset?>("StoppedAt");
265 
266  b.HasKey("Id");
267 
268  b.HasIndex("CancelledById");
269 
270  b.HasIndex("InstanceId");
271 
272  b.HasIndex("StartedById");
273 
274  b.ToTable("Jobs");
275  });
276 
277  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
278  {
279  b.Property<long>("Id")
280  .ValueGeneratedOnAdd();
281 
282  b.Property<string>("AccessIdentifier")
283  .IsRequired();
284 
285  b.Property<string>("ChatChannelsJson")
286  .IsRequired();
287 
288  b.Property<string>("ChatCommandsJson")
289  .IsRequired();
290 
291  b.Property<long>("CompileJobId");
292 
293  b.Property<bool>("IsPrimary");
294 
295  b.Property<ushort>("Port");
296 
297  b.Property<int>("ProcessId");
298 
299  b.Property<int>("RebootState");
300 
301  b.Property<string>("ServerCommandsJson")
302  .IsRequired();
303 
304  b.HasKey("Id");
305 
306  b.HasIndex("CompileJobId");
307 
308  b.ToTable("ReattachInformations");
309  });
310 
311  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
312  {
313  b.Property<long>("Id")
314  .ValueGeneratedOnAdd();
315 
316  b.Property<string>("AccessToken");
317 
318  b.Property<string>("AccessUser");
319 
320  b.Property<bool?>("AutoUpdatesKeepTestMerges")
321  .IsRequired();
322 
323  b.Property<bool?>("AutoUpdatesSynchronize")
324  .IsRequired();
325 
326  b.Property<string>("CommitterEmail")
327  .IsRequired();
328 
329  b.Property<string>("CommitterName")
330  .IsRequired();
331 
332  b.Property<long>("InstanceId");
333 
334  b.Property<bool?>("PostTestMergeComment")
335  .IsRequired();
336 
337  b.Property<bool?>("PushTestMergeCommits")
338  .IsRequired();
339 
340  b.Property<bool?>("ShowTestMergeCommitters")
341  .IsRequired();
342 
343  b.HasKey("Id");
344 
345  b.HasIndex("InstanceId")
346  .IsUnique();
347 
348  b.ToTable("RepositorySettings");
349  });
350 
351  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
352  {
353  b.Property<long>("Id")
354  .ValueGeneratedOnAdd();
355 
356  b.Property<long>("RevisionInformationId");
357 
358  b.Property<long>("TestMergeId");
359 
360  b.HasKey("Id");
361 
362  b.HasIndex("RevisionInformationId");
363 
364  b.HasIndex("TestMergeId");
365 
366  b.ToTable("RevInfoTestMerges");
367  });
368 
369  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
370  {
371  b.Property<long>("Id")
372  .ValueGeneratedOnAdd();
373 
374  b.Property<string>("CommitSha")
375  .IsRequired()
376  .HasMaxLength(40);
377 
378  b.Property<long>("InstanceId");
379 
380  b.Property<string>("OriginCommitSha")
381  .IsRequired()
382  .HasMaxLength(40);
383 
384  b.HasKey("Id");
385 
386  b.HasIndex("InstanceId", "CommitSha")
387  .IsUnique();
388 
389  b.ToTable("RevisionInformations");
390  });
391 
392  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
393  {
394  b.Property<long>("Id")
395  .ValueGeneratedOnAdd();
396 
397  b.Property<string>("Author")
398  .IsRequired();
399 
400  b.Property<string>("BodyAtMerge")
401  .IsRequired();
402 
403  b.Property<string>("Comment");
404 
405  b.Property<DateTimeOffset>("MergedAt");
406 
407  b.Property<long>("MergedById");
408 
409  b.Property<int?>("Number")
410  .IsRequired();
411 
412  b.Property<long?>("PrimaryRevisionInformationId")
413  .IsRequired();
414 
415  b.Property<string>("PullRequestRevision")
416  .IsRequired();
417 
418  b.Property<string>("TitleAtMerge")
419  .IsRequired();
420 
421  b.Property<string>("Url")
422  .IsRequired();
423 
424  b.HasKey("Id");
425 
426  b.HasIndex("MergedById");
427 
428  b.HasIndex("PrimaryRevisionInformationId")
429  .IsUnique();
430 
431  b.ToTable("TestMerges");
432  });
433 
434  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
435  {
436  b.Property<long>("Id")
437  .ValueGeneratedOnAdd();
438 
439  b.Property<ulong>("AdministrationRights");
440 
441  b.Property<string>("CanonicalName")
442  .IsRequired();
443 
444  b.Property<DateTimeOffset?>("CreatedAt")
445  .IsRequired();
446 
447  b.Property<long?>("CreatedById");
448 
449  b.Property<bool?>("Enabled")
450  .IsRequired();
451 
452  b.Property<ulong>("InstanceManagerRights");
453 
454  b.Property<DateTimeOffset?>("LastPasswordUpdate");
455 
456  b.Property<string>("Name")
457  .IsRequired();
458 
459  b.Property<string>("PasswordHash");
460 
461  b.Property<string>("SystemIdentifier");
462 
463  b.HasKey("Id");
464 
465  b.HasIndex("CanonicalName")
466  .IsUnique();
467 
468  b.HasIndex("CreatedById");
469 
470  b.ToTable("Users");
471  });
472 
473  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
474  {
475  b.Property<long>("Id")
476  .ValueGeneratedOnAdd();
477 
478  b.Property<long?>("AlphaId");
479 
480  b.Property<bool>("AlphaIsActive");
481 
482  b.Property<long?>("BravoId");
483 
484  b.Property<long>("InstanceId");
485 
486  b.HasKey("Id");
487 
488  b.HasIndex("AlphaId");
489 
490  b.HasIndex("BravoId");
491 
492  b.HasIndex("InstanceId")
493  .IsUnique();
494 
495  b.ToTable("WatchdogReattachInformations");
496  });
497 
498  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
499  {
500  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
501  .WithMany("ChatSettings")
502  .HasForeignKey("InstanceId")
503  .OnDelete(DeleteBehavior.Cascade);
504  });
505 
506  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
507  {
508  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
509  .WithMany("Channels")
510  .HasForeignKey("ChatSettingsId")
511  .OnDelete(DeleteBehavior.Cascade);
512  });
513 
514  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
515  {
516  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
517  .WithOne()
518  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
519  .OnDelete(DeleteBehavior.Restrict);
520 
521  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
522  .WithMany("CompileJobs")
523  .HasForeignKey("RevisionInformationId")
524  .OnDelete(DeleteBehavior.Cascade);
525  });
526 
527  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
528  {
529  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
530  .WithOne("DreamDaemonSettings")
531  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
532  .OnDelete(DeleteBehavior.Cascade);
533  });
534 
535  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
536  {
537  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
538  .WithOne("DreamMakerSettings")
539  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
540  .OnDelete(DeleteBehavior.Cascade);
541  });
542 
543  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
544  {
545  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
546  .WithMany("InstanceUsers")
547  .HasForeignKey("InstanceId")
548  .OnDelete(DeleteBehavior.Cascade);
549 
550  b.HasOne("Tgstation.Server.Host.Models.User")
551  .WithMany("InstanceUsers")
552  .HasForeignKey("UserId")
553  .OnDelete(DeleteBehavior.Cascade);
554  });
555 
556  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
557  {
558  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
559  .WithMany()
560  .HasForeignKey("CancelledById");
561 
562  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
563  .WithMany("Jobs")
564  .HasForeignKey("InstanceId")
565  .OnDelete(DeleteBehavior.Cascade);
566 
567  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
568  .WithMany()
569  .HasForeignKey("StartedById")
570  .OnDelete(DeleteBehavior.Cascade);
571  });
572 
573  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
574  {
575  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
576  .WithMany()
577  .HasForeignKey("CompileJobId")
578  .OnDelete(DeleteBehavior.Cascade);
579  });
580 
581  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
582  {
583  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
584  .WithOne("RepositorySettings")
585  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
586  .OnDelete(DeleteBehavior.Cascade);
587  });
588 
589  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
590  {
591  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
592  .WithMany("ActiveTestMerges")
593  .HasForeignKey("RevisionInformationId")
594  .OnDelete(DeleteBehavior.Cascade);
595 
596  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
597  .WithMany("RevisonInformations")
598  .HasForeignKey("TestMergeId")
599  .OnDelete(DeleteBehavior.Cascade);
600  });
601 
602  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
603  {
604  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
605  .WithMany("RevisionInformations")
606  .HasForeignKey("InstanceId")
607  .OnDelete(DeleteBehavior.Cascade);
608  });
609 
610  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
611  {
612  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
613  .WithMany("TestMerges")
614  .HasForeignKey("MergedById")
615  .OnDelete(DeleteBehavior.Restrict);
616 
617  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
618  .WithOne("PrimaryTestMerge")
619  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
620  .OnDelete(DeleteBehavior.Restrict);
621  });
622 
623  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
624  {
625  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
626  .WithMany("CreatedUsers")
627  .HasForeignKey("CreatedById");
628  });
629 
630  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
631  {
632  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
633  .WithMany()
634  .HasForeignKey("AlphaId");
635 
636  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
637  .WithMany()
638  .HasForeignKey("BravoId");
639 
640  b.HasOne("Tgstation.Server.Host.Models.Instance")
641  .WithOne("WatchdogReattachInformation")
642  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
643  .OnDelete(DeleteBehavior.Cascade);
644  });
645 #pragma warning restore 612, 618
646  }
647  }
648 }
+ + + + +
+ + + + diff --git a/_my_sql_design_time_db_context_factory_8cs.html b/_my_sql_design_time_db_context_factory_8cs.html new file mode 100644 index 0000000000..36e34d5b12 --- /dev/null +++ b/_my_sql_design_time_db_context_factory_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
MySqlDesignTimeDbContextFactory.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 new file mode 100644 index 0000000000..a22c9e63f2 --- /dev/null +++ b/_my_sql_design_time_db_context_factory_8cs_source.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/MySqlDesignTimeDbContextFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
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;
6 
8 {
10  sealed class MySqlDesignTimeDbContextFactory : IDesignTimeDbContextFactory<MySqlDatabaseContext>
11  {
13  public MySqlDatabaseContext CreateDbContext(string[] args)
14  {
15  using (var loggerFactory = new LoggerFactory())
16  {
17  return new MySqlDatabaseContext(new DbContextOptions<MySqlDatabaseContext>(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher<User>())), loggerFactory.CreateLogger<MySqlDatabaseContext>());
18  }
19  }
20  }
21 }
+
static IOptions< DatabaseConfiguration > GetDbContextOptions()
Get the IOptions<TOptions> for the DatabaseConfiguration
+ +
Contains helpers for creating design time DatabaseContext<TParentContext>s
+ + + + + + +
DatabaseContext<TParentContext> for MySQL
+ + +
+ + + + diff --git a/_native_methods_8cs.html b/_native_methods_8cs.html new file mode 100644 index 0000000000..f7a4847996 --- /dev/null +++ b/_native_methods_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/NativeMethods.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
NativeMethods.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.NativeMethods
 Native methods used by the code More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
+
+ + + + diff --git a/_native_methods_8cs_source.html b/_native_methods_8cs_source.html new file mode 100644 index 0000000000..4b5fa6c0bd --- /dev/null +++ b/_native_methods_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/NativeMethods.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
NativeMethods.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Runtime.InteropServices;
3 using System.Text;
4 
5 namespace Tgstation.Server.Host
6 {
10  #pragma warning disable SA1600
11  #pragma warning disable SA1602
12  #pragma warning disable SA1611
13  #pragma warning disable SA1615
14  static class NativeMethods
15  {
19  [Flags]
20  public enum CreateSymbolicLinkFlags : int
21  {
22  None = 0,
23  Directory = 1,
24  AllowUnprivilegedCreate = 2
25  }
26 
30  [DllImport("user32.dll")]
31  public static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);
32 
36  [DllImport("user32.dll", CharSet = CharSet.Unicode)]
37  public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
38 
42  [DllImport("user32.dll")]
43  public static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
44 
48  public delegate bool EnumWindowProc(IntPtr hwnd, IntPtr lParam);
49 
53  [DllImport("user32.dll")]
54  public static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr lParam);
55 
59  [DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
60  public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
61 
65  [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
66  public static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);
67 
71  [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
72  public static extern bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, CreateSymbolicLinkFlags dwFlags);
73  }
74 }
static int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount)
See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowtextw
+
CreateSymbolicLinkFlags
See https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-createsymboliclinka#param...
+
static IntPtr FindWindow(string lpClassName, string lpWindowName)
See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-findwindoww
+
static bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken)
See https://msdn.microsoft.com/en-us/library/windows/desktop/aa378184(v=vs.85).aspx
+
static bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, CreateSymbolicLinkFlags dwFlags)
See https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-createsymboliclinkw
+
static int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam)
See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-sendmessage
+
delegate bool EnumWindowProc(IntPtr hwnd, IntPtr lParam)
See https://msdn.microsoft.com/en-us/library/ms633493(v=VS.85).aspx
+
Native methods used by the code
+
static int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId)
See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowthreadprocessid
+
static bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr lParam)
See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-enumchildwindows
+ +
+ + + + diff --git a/_platform_identifier_8cs.html b/_platform_identifier_8cs.html new file mode 100644 index 0000000000..11e3137a67 --- /dev/null +++ b/_platform_identifier_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/PlatformIdentifier.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
PlatformIdentifier.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Core.PlatformIdentifier
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_platform_identifier_8cs_source.html b/_platform_identifier_8cs_source.html new file mode 100644 index 0000000000..64451f01aa --- /dev/null +++ b/_platform_identifier_8cs_source.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/PlatformIdentifier.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
PlatformIdentifier.cs
+
+
+Go to the documentation of this file.
1 using System.Runtime.InteropServices;
2 
4 {
7  {
9  public bool IsWindows { get; }
10 
12  public string ScriptFileExtension { get; }
13 
18  {
19  IsWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
20  ScriptFileExtension = IsWindows ? "bat" : "sh";
21  }
22  }
23 }
PlatformIdentifier()
Construct a PlatformIdentifier
+ + + + +
For identifying the current platform
+
+ + + + diff --git a/_posix_byond_installer_8cs.html b/_posix_byond_installer_8cs.html new file mode 100644 index 0000000000..2d1b98f1c8 --- /dev/null +++ b/_posix_byond_installer_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Byond/PosixByondInstaller.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
PosixByondInstaller.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Byond.PosixByondInstaller
 IByondInstaller for Posix systems More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Byond
 
+
+ + + + diff --git a/_posix_byond_installer_8cs_source.html b/_posix_byond_installer_8cs_source.html new file mode 100644 index 0000000000..b8c0b1aa9e --- /dev/null +++ b/_posix_byond_installer_8cs_source.html @@ -0,0 +1,112 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Byond/PosixByondInstaller.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
PosixByondInstaller.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using System;
3 using System.Globalization;
4 using System.Text;
5 using System.Threading;
6 using System.Threading.Tasks;
7 using Tgstation.Server.Host.IO;
8 
10 {
15  {
19  const string ByondRevisionsURLTemplate = "https://secure.byond.com/download/build/{0}/{0}.{1}_byond_linux.zip";
20 
24  const string ByondCachePath = "~/.byond/cache";
25 
26  const string DreamDaemonExecutableName = "DreamDaemon";
27  const string DreamMakerExecutableName = "DreamMaker";
28  const string ShellScriptExtension = ".sh";
29 
32 
35 
40 
45 
49  readonly ILogger<PosixByondInstaller> logger;
50 
58  {
59  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
60  this.postWriteHandler = postWriteHandler ?? throw new ArgumentNullException(nameof(postWriteHandler));
61  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
62  }
63 
65  public async Task CleanCache(CancellationToken cancellationToken)
66  {
67  try
68  {
69  await ioManager.DeleteDirectory(ByondCachePath, cancellationToken).ConfigureAwait(false);
70  }
71  catch (OperationCanceledException)
72  {
73  throw;
74  }
75  catch (Exception e)
76  {
77  logger.LogWarning("Error deleting BYOND cache! Exception: {0}", e);
78  }
79  }
80 
82  public async Task<byte[]> DownloadVersion(Version version, CancellationToken cancellationToken)
83  {
84  if (version == null)
85  throw new ArgumentNullException(nameof(version));
86 
87  var url = String.Format(CultureInfo.InvariantCulture, ByondRevisionsURLTemplate, version.Major, version.Minor);
88 
89  return await ioManager.DownloadFile(new Uri(url), cancellationToken).ConfigureAwait(false);
90  }
91 
93  public Task InstallByond(string path, Version version, CancellationToken cancellationToken)
94  {
95  if (path == null)
96  throw new ArgumentNullException(nameof(path));
97  if (version == null)
98  throw new ArgumentNullException(nameof(version));
99 
100  // write the scripts for running the ting
101  // need to add $ORIGIN to LD_LIBRARY_PATH
102  const string StandardScript = "#!/bin/sh\nexport LD_LIBRARY_PATH=\"\\$ORIGIN:$LD_LIBRARY_PATH\"\nBASEDIR=$(dirname \"$0\")\nexec \"$BASEDIR/{0}\" \"$@\"\n";
103 
104  var dreamDaemonScript = String.Format(CultureInfo.InvariantCulture, StandardScript, DreamDaemonExecutableName);
105  var dreamMakerScript = String.Format(CultureInfo.InvariantCulture, StandardScript, DreamMakerExecutableName);
106 
107  async Task WriteAndMakeExecutable(string fullPath, string script)
108  {
109  await ioManager.WriteAllBytes(fullPath, Encoding.ASCII.GetBytes(script), cancellationToken).ConfigureAwait(false);
110  postWriteHandler.HandleWrite(fullPath);
111  }
112 
113  var basePath = ioManager.ConcatPath(path, ByondManager.BinPath);
114 
115  var task = Task.WhenAll(WriteAndMakeExecutable(ioManager.ConcatPath(basePath, DreamDaemonName), dreamDaemonScript), WriteAndMakeExecutable(ioManager.ConcatPath(basePath, DreamMakerName), dreamMakerScript));
116 
119 
120  return task;
121  }
122  }
123 }
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
PosixByondInstaller(IIOManager ioManager, IPostWriteHandler postWriteHandler, ILogger< PosixByondInstaller > logger)
Construct a WindowsByondInstaller
+ +
Handles changing file modes/permissions after writing
+
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+
Task< byte[]> DownloadFile(Uri url, CancellationToken cancellationToken)
Downloads a file from url
+ +
const string ByondRevisionsURLTemplate
The URL format string for getting BYOND linux version {0}.{1} zipfile
+ +
void HandleWrite(string filePath)
For handling system specific necessities after a write
+
async Task< byte[]> DownloadVersion(Version version, CancellationToken cancellationToken)
Download a given BYOND version
+
async Task CleanCache(CancellationToken cancellationToken)
Attempts to cleans the BYOND cache folder for the system
+
For downloading and installing BYOND extractions for a given system
+ + + + +
readonly ILogger< PosixByondInstaller > logger
The ILogger for the PosixByondInstaller
+ +
readonly IIOManager ioManager
The IIOManager for the PosixByondInstaller
+
Task InstallByond(string path, Version version, CancellationToken cancellationToken)
Does actions necessary to get an extracted BYOND installation working
+
readonly IPostWriteHandler postWriteHandler
The IPostWriteHandler for the PosixByondInstaller
+ + +
Interface for using filesystems
Definition: IIOManager.cs:11
+
const string BinPath
The path to the BYOND bin folder
Definition: ByondManager.cs:21
+ +
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+ + +
+ + + + diff --git a/_posix_network_prompt_reaper_8cs.html b/_posix_network_prompt_reaper_8cs.html new file mode 100644 index 0000000000..da65ab3026 --- /dev/null +++ b/_posix_network_prompt_reaper_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/PosixNetworkPromptReaper.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
PosixNetworkPromptReaper.cs File Reference
+
+ + + + + diff --git a/_posix_network_prompt_reaper_8cs_source.html b/_posix_network_prompt_reaper_8cs_source.html new file mode 100644 index 0000000000..1a7217d9c1 --- /dev/null +++ b/_posix_network_prompt_reaper_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/PosixNetworkPromptReaper.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
PosixNetworkPromptReaper.cs
+
+
+Go to the documentation of this file.
2 
4 {
7  {
9  public void RegisterProcess(IProcess process)
10  {
11  // POSIX BYOND doesn't prompt you when you change the port
12  }
13  }
14 }
+
void RegisterProcess(IProcess process)
Register a given process for network prompt reaping
+ + +
Abstraction over a System.Diagnostics.Process
Definition: IProcess.cs:9
+ +
On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort()....
+ + +
+ + + + diff --git a/_posix_post_write_handler_8cs.html b/_posix_post_write_handler_8cs.html new file mode 100644 index 0000000000..2a571e2551 --- /dev/null +++ b/_posix_post_write_handler_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/PosixPostWriteHandler.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
PosixPostWriteHandler.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.IO.PosixPostWriteHandler
 IPostWriteHandler for POSIX systems More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.IO
 
+
+ + + + diff --git a/_posix_post_write_handler_8cs_source.html b/_posix_post_write_handler_8cs_source.html new file mode 100644 index 0000000000..c0df419f98 --- /dev/null +++ b/_posix_post_write_handler_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/PosixPostWriteHandler.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
PosixPostWriteHandler.cs
+
+
+Go to the documentation of this file.
1 using Mono.Unix;
2 using Mono.Unix.Native;
3 using System;
4 
6 {
11  {
13  public void HandleWrite(string filePath)
14  {
15  if (filePath == null)
16  throw new ArgumentNullException(nameof(filePath));
17 
18  // set executable bit every time, don't want people calling me when their uploaded "sl" binary doesn't work
19  if (Syscall.stat(filePath, out var stat) != 0)
20  throw new UnixIOException(Stdlib.GetLastError());
21 
22  if (stat.st_mode.HasFlag(FilePermissions.S_IXUSR))
23  return;
24 
25  if (Syscall.chmod(filePath, stat.st_mode | FilePermissions.S_IXUSR) != 0)
26  throw new UnixIOException(Stdlib.GetLastError());
27  }
28  }
29 }
void HandleWrite(string filePath)
For handling system specific necessities after a write
+
IPostWriteHandler for POSIX systems
+
Handles changing file modes/permissions after writing
+ +
+ + + + diff --git a/_posix_symlink_factory_8cs.html b/_posix_symlink_factory_8cs.html new file mode 100644 index 0000000000..0073df7748 --- /dev/null +++ b/_posix_symlink_factory_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/PosixSymlinkFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
PosixSymlinkFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.IO.PosixSymlinkFactory
 ISymlinkFactory for posix systems More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.IO
 
+
+ + + + diff --git a/_posix_symlink_factory_8cs_source.html b/_posix_symlink_factory_8cs_source.html new file mode 100644 index 0000000000..db6680d613 --- /dev/null +++ b/_posix_symlink_factory_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/PosixSymlinkFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
PosixSymlinkFactory.cs
+
+
+Go to the documentation of this file.
1 using Mono.Unix;
2 using System;
3 using System.IO;
4 using System.Threading;
5 using System.Threading.Tasks;
6 
8 {
13  {
15  public Task CreateSymbolicLink(string targetPath, string linkPath, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
16  {
17  if (targetPath == null)
18  throw new ArgumentNullException(nameof(targetPath));
19  if (linkPath == null)
20  throw new ArgumentNullException(nameof(linkPath));
21 
22  UnixFileSystemInfo fsInfo;
23  var isFile = File.Exists(targetPath);
24  cancellationToken.ThrowIfCancellationRequested();
25  if (isFile)
26  fsInfo = new UnixFileInfo(targetPath);
27  else
28  fsInfo = new UnixDirectoryInfo(targetPath);
29  cancellationToken.ThrowIfCancellationRequested();
30  fsInfo.CreateSymbolicLink(linkPath);
31  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
32  }
33 }
+ + + +
+ + + + diff --git a/_posix_system_identity_factory_8cs.html b/_posix_system_identity_factory_8cs.html new file mode 100644 index 0000000000..ef719b2519 --- /dev/null +++ b/_posix_system_identity_factory_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/PosixSystemIdentityFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
PosixSystemIdentityFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Security.PosixSystemIdentityFactory
 ISystemIdentityFactory for posix systems More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Security
 
+
+ + + + diff --git a/_posix_system_identity_factory_8cs_source.html b/_posix_system_identity_factory_8cs_source.html new file mode 100644 index 0000000000..5afba328cf --- /dev/null +++ b/_posix_system_identity_factory_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/PosixSystemIdentityFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
PosixSystemIdentityFactory.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
5 
7 {
13  {
15  public Task<ISystemIdentity> CreateSystemIdentity(User user, CancellationToken cancellationToken) => throw new NotImplementedException();
16 
18  public Task<ISystemIdentity> CreateSystemIdentity(string username, string password, CancellationToken cancellationToken) => throw new NotImplementedException();
19  }
20 }
Task< ISystemIdentity > CreateSystemIdentity(User user, CancellationToken cancellationToken)
Create a ISystemIdentity for a given user
+ + + + + + + + +
+ + + + diff --git a/_process_8cs.html b/_process_8cs.html new file mode 100644 index 0000000000..3e0e93a08f --- /dev/null +++ b/_process_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/Process.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Process.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Core.Process
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_process_8cs_source.html b/_process_8cs_source.html new file mode 100644 index 0000000000..830132d676 --- /dev/null +++ b/_process_8cs_source.html @@ -0,0 +1,100 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/Process.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Process.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using System;
3 using System.Text;
4 using System.Threading.Tasks;
5 
7 {
9  sealed class Process : IProcess
10  {
12  public int Id { get; }
13 
15  public Task Startup { get; }
16 
18  public Task<int> Lifetime { get; }
19 
20  readonly System.Diagnostics.Process handle;
21 
22  readonly StringBuilder outputStringBuilder;
23  readonly StringBuilder errorStringBuilder;
24  readonly StringBuilder combinedStringBuilder;
25 
29  readonly ILogger<Process> logger;
30 
41  public Process(System.Diagnostics.Process handle, Task<int> lifetime, StringBuilder outputStringBuilder, StringBuilder errorStringBuilder, StringBuilder combinedStringBuilder, ILogger<Process> logger, bool preExisting)
42  {
43  this.handle = handle ?? throw new ArgumentNullException(nameof(handle));
44  Lifetime = lifetime ?? throw new ArgumentNullException(nameof(lifetime));
45 
46  this.outputStringBuilder = outputStringBuilder;
47  this.errorStringBuilder = errorStringBuilder;
48  this.combinedStringBuilder = combinedStringBuilder;
49 
50  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
51 
52  Id = handle.Id;
53 
54  if (preExisting)
55  {
56  Startup = Task.CompletedTask;
57  return;
58  }
59 
60  Startup = Task.Factory.StartNew(() =>
61  {
62  try
63  {
64  handle.WaitForInputIdle();
65  }
66  catch (InvalidOperationException) { }
67  }, default, TaskCreationOptions.LongRunning, TaskScheduler.Current);
68 
69  logger.LogTrace("Created process ID: {0}", Id);
70  }
71 
73  public void Dispose() => handle.Dispose();
74 
76  public string GetCombinedOutput()
77  {
78  if (combinedStringBuilder == null)
79  throw new InvalidOperationException("Output/Error reading was not enabled!");
80  return combinedStringBuilder.ToString().TrimStart(Environment.NewLine.ToCharArray());
81  }
82 
84  public string GetErrorOutput()
85  {
86  if (errorStringBuilder == null)
87  throw new InvalidOperationException("Error reading was not enabled!");
88  return errorStringBuilder.ToString().TrimStart(Environment.NewLine.ToCharArray());
89  }
90 
92  public string GetStandardOutput()
93  {
94  if (outputStringBuilder == null)
95  throw new InvalidOperationException("Output reading was not enabled!");
96  return errorStringBuilder.ToString().TrimStart(Environment.NewLine.ToCharArray());
97  }
98 
100  public void Terminate()
101  {
102  if (handle.HasExited)
103  return;
104  try
105  {
106  logger.LogTrace("Terminating process...");
107  handle.Kill();
108  handle.WaitForExit();
109  }
110  catch (Exception e)
111  {
112  logger.LogDebug("Process termination exception: {0}", e);
113  }
114  }
115 
117  public void SetHighPriority()
118  {
119  try
120  {
121  handle.PriorityClass = System.Diagnostics.ProcessPriorityClass.AboveNormal;
122  logger.LogTrace("Set to above normal priority", handle.Id);
123  }
124  catch (Exception e)
125  {
126  logger.LogWarning("Unable to raise process priority! Exception: {0}", e);
127  }
128  }
129  }
130 }
readonly StringBuilder errorStringBuilder
Definition: Process.cs:23
+ +
string GetErrorOutput()
Get the stderr output of the IProcess
Definition: Process.cs:84
+ + +
Process(System.Diagnostics.Process handle, Task< int > lifetime, StringBuilder outputStringBuilder, StringBuilder errorStringBuilder, StringBuilder combinedStringBuilder, ILogger< Process > logger, bool preExisting)
Construct a Process
Definition: Process.cs:41
+ +
readonly StringBuilder combinedStringBuilder
Definition: Process.cs:24
+ +
string GetStandardOutput()
Get the stdout output of the IProcess
Definition: Process.cs:92
+
string GetCombinedOutput()
Get the stderr and stdout output of the IProcess
Definition: Process.cs:76
+
Abstraction over a System.Diagnostics.Process
Definition: IProcess.cs:9
+ +
void SetHighPriority()
Set's the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass....
Definition: Process.cs:117
+
readonly ILogger< Process > logger
The ILogger for the Process
Definition: Process.cs:29
+
readonly System.Diagnostics.Process handle
Definition: Process.cs:20
+
readonly StringBuilder outputStringBuilder
Definition: Process.cs:22
+
void Terminate()
Terminates the process
Definition: Process.cs:100
+
+ + + + diff --git a/_process_executor_8cs.html b/_process_executor_8cs.html new file mode 100644 index 0000000000..d6419a7ded --- /dev/null +++ b/_process_executor_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/ProcessExecutor.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ProcessExecutor.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Core.ProcessExecutor
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_process_executor_8cs_source.html b/_process_executor_8cs_source.html new file mode 100644 index 0000000000..5ca4edba64 --- /dev/null +++ b/_process_executor_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/ProcessExecutor.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ProcessExecutor.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using System;
3 using System.Text;
4 using System.Threading.Tasks;
5 
7 {
10  {
14  readonly ILogger<ProcessExecutor> logger;
15 
19  readonly ILoggerFactory loggerFactory;
20 
26  static Task<int> AttachExitHandler(System.Diagnostics.Process handle)
27  {
28  handle.EnableRaisingEvents = true;
29  var tcs = new TaskCompletionSource<int>();
30  handle.Exited += (a, b) =>
31  {
32  int exitCode;
33  try
34  {
35  exitCode = handle.ExitCode;
36  }
37  catch (InvalidOperationException)
38  {
39  return;
40  }
41 
42  tcs.SetResult(exitCode);
43  };
44  return tcs.Task;
45  }
46 
52  public ProcessExecutor(ILogger<ProcessExecutor> logger, ILoggerFactory loggerFactory)
53  {
54  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
55  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
56  }
57 
59  public IProcess GetProcess(int id)
60  {
61  logger.LogDebug("Attaching to process {0}...", id);
62  System.Diagnostics.Process handle;
63  try
64  {
65  handle = System.Diagnostics.Process.GetProcessById(id);
66  }
67  catch(Exception e)
68  {
69  logger.LogDebug("Unable to get process {0}! Exception: {1}", id, e);
70  return null;
71  }
72 
73  try
74  {
75  return new Process(handle, AttachExitHandler(handle), null, null, null, loggerFactory.CreateLogger<Process>(), true);
76  }
77  catch
78  {
79  handle.Dispose();
80  throw;
81  }
82  }
83 
85  public IProcess LaunchProcess(string fileName, string workingDirectory, string arguments, bool readOutput, bool readError, bool noShellExecute)
86  {
87  logger.LogDebug("Launching process in {0}: {1} {2}", workingDirectory, fileName, arguments);
88  var handle = new System.Diagnostics.Process();
89  try
90  {
91  handle.StartInfo.FileName = fileName;
92  handle.StartInfo.Arguments = arguments;
93  handle.StartInfo.WorkingDirectory = workingDirectory;
94 
95  handle.StartInfo.UseShellExecute = !(noShellExecute || readOutput || readError);
96 
97  StringBuilder outputStringBuilder = null, errorStringBuilder = null, combinedStringBuilder = null;
98  if (readOutput || readError)
99  {
100  combinedStringBuilder = new StringBuilder();
101  if (readOutput)
102  {
103  outputStringBuilder = new StringBuilder();
104  handle.StartInfo.RedirectStandardOutput = true;
105  handle.OutputDataReceived += (sender, e) =>
106  {
107  combinedStringBuilder.Append(Environment.NewLine);
108  combinedStringBuilder.Append(e.Data);
109  outputStringBuilder.Append(Environment.NewLine);
110  outputStringBuilder.Append(e.Data);
111  };
112  }
113 
114  if (readError)
115  {
116  errorStringBuilder = new StringBuilder();
117  handle.StartInfo.RedirectStandardError = true;
118  handle.ErrorDataReceived += (sender, e) =>
119  {
120  combinedStringBuilder.Append(Environment.NewLine);
121  combinedStringBuilder.Append(e.Data);
122  errorStringBuilder.Append(Environment.NewLine);
123  errorStringBuilder.Append(e.Data);
124  };
125  }
126  }
127 
128  var lifetimeTask = AttachExitHandler(handle);
129 
130  handle.Start();
131  try
132  {
133  if (readOutput)
134  handle.BeginOutputReadLine();
135  }
136  catch (InvalidOperationException) { }
137  try
138  {
139  if (readError)
140  handle.BeginErrorReadLine();
141  }
142  catch (InvalidOperationException) { }
143 
144  return new Process(handle, lifetimeTask, outputStringBuilder, errorStringBuilder, combinedStringBuilder, loggerFactory.CreateLogger<Process>(), false);
145  }
146  catch
147  {
148  handle.Dispose();
149  throw;
150  }
151  }
152  }
153 }
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the ProcessExecutor
+ +
IProcess LaunchProcess(string fileName, string workingDirectory, string arguments, bool readOutput, bool readError, bool noShellExecute)
Launch a IProcess
+ +
IProcess GetProcess(int id)
Get a IProcess by id
+ +
static Task< int > AttachExitHandler(System.Diagnostics.Process handle)
Create a Task<TResult> resulting in the exit code of a given handle
+ +
Abstraction over a System.Diagnostics.Process
Definition: IProcess.cs:9
+
ProcessExecutor(ILogger< ProcessExecutor > logger, ILoggerFactory loggerFactory)
Construct a ProcessExecutor
+
readonly ILogger< ProcessExecutor > logger
The ILogger for the ProcessExecutor
+
+ + + + diff --git a/_provider_8cs.html b/_provider_8cs.html new file mode 100644 index 0000000000..3e1bcdcbef --- /dev/null +++ b/_provider_8cs.html @@ -0,0 +1,108 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Providers/Provider.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Provider.cs File Reference
+
+ + + + + diff --git a/_provider_8cs_source.html b/_provider_8cs_source.html new file mode 100644 index 0000000000..2432bf4322 --- /dev/null +++ b/_provider_8cs_source.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Providers/Provider.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Provider.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 using System.Threading;
3 using System.Threading.Tasks;
5 
7 {
9  abstract class Provider : IProvider
10  {
14  readonly Queue<Message> messageQueue;
15 
19  TaskCompletionSource<object> nextMessage;
20 
24  protected Provider()
25  {
26  messageQueue = new Queue<Message>();
27  nextMessage = new TaskCompletionSource<object>();
28  }
29 
31  public abstract bool Connected { get; }
32 
34  public abstract string BotMention { get; }
35 
40  protected void EnqueueMessage(Message message)
41  {
42  lock (messageQueue)
43  {
44  messageQueue.Enqueue(message);
45  nextMessage.TrySetResult(null);
46  }
47  }
48 
50  public abstract void Dispose();
51 
53  public abstract Task<bool> Connect(CancellationToken cancellationToken);
54 
56  public abstract Task Disconnect(CancellationToken cancellationToken);
57 
59  public abstract Task<IReadOnlyList<Channel>> MapChannels(IEnumerable<ChatChannel> channels, CancellationToken cancellationToken);
60 
62  public async Task<Message> NextMessage(CancellationToken cancellationToken)
63  {
64  var cancelTcs = new TaskCompletionSource<object>();
65  using (cancellationToken.Register(() => cancelTcs.SetCanceled()))
66  await Task.WhenAny(nextMessage.Task, cancelTcs.Task).ConfigureAwait(false);
67  cancellationToken.ThrowIfCancellationRequested();
68  lock (messageQueue)
69  {
70  var result = messageQueue.Dequeue();
71  if (messageQueue.Count == 0)
72  nextMessage = new TaskCompletionSource<object>();
73  return result;
74  }
75  }
76 
78  public abstract Task SendMessage(ulong channelId, string message, CancellationToken cancellationToken);
79  }
80 }
+ +
Represents a message recieved by a IProvider
Definition: Message.cs:6
+ + + +
abstract Task SendMessage(ulong channelId, string message, CancellationToken cancellationToken)
Send a message to the IProvider
+
async Task< Message > NextMessage(CancellationToken cancellationToken)
Get a Task<TResult> resulting in the next Message the IProvider recieves or null on a disconnect
Definition: Provider.cs:62
+
TaskCompletionSource< object > nextMessage
TaskCompletionSource<TResult> that completes while messageQueue isn't empty
Definition: Provider.cs:19
+
abstract Task< bool > Connect(CancellationToken cancellationToken)
Attempt to connect the IProvider
+ + + +
readonly Queue< Message > messageQueue
Queue<T> of received Messages
Definition: Provider.cs:14
+
abstract Task< IReadOnlyList< Channel > > MapChannels(IEnumerable< ChatChannel > channels, CancellationToken cancellationToken)
+ +
abstract Task Disconnect(CancellationToken cancellationToken)
Gracefully disconnects the provider. Implies a call to IDisposable.Dispose
+
void EnqueueMessage(Message message)
Queues a message for NextMessage(CancellationToken)
Definition: Provider.cs:40
+ + +
+ + + + diff --git a/_provider_factory_8cs.html b/_provider_factory_8cs.html new file mode 100644 index 0000000000..82d9bc0c8c --- /dev/null +++ b/_provider_factory_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/ProviderFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ProviderFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Components.Chat.ProviderFactory
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
+
+ + + + diff --git a/_provider_factory_8cs_source.html b/_provider_factory_8cs_source.html new file mode 100644 index 0000000000..36528fab53 --- /dev/null +++ b/_provider_factory_8cs_source.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/ProviderFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ProviderFactory.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using System;
3 using System.Globalization;
7 
9 {
12  {
17 
22 
26  readonly ILoggerFactory loggerFactory;
27 
35  {
36  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
37  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
38  this.application = application ?? throw new ArgumentNullException(nameof(application));
39  }
40 
42  public IProvider CreateProvider(Api.Models.Internal.ChatBot settings)
43  {
44  if (settings == null)
45  throw new ArgumentNullException(nameof(settings));
46  var builder = settings.CreateConnectionStringBuilder();
47  if (builder == null || !builder.Valid)
48  throw new InvalidOperationException("Invalid ChatConnectionStringBuilder!");
49  switch (settings.Provider)
50  {
51  case ChatProvider.Irc:
52  var ircBuilder = (IrcConnectionStringBuilder)builder;
53  return new IrcProvider(application, asyncDelayer, loggerFactory.CreateLogger<IrcProvider>(), ircBuilder.Address, ircBuilder.Port.Value, ircBuilder.Nickname, ircBuilder.Password, ircBuilder.PasswordType, ircBuilder.UseSsl.Value);
54  case ChatProvider.Discord:
55  var discordBuilder = (DiscordConnectionStringBuilder)builder;
56  return new DiscordProvider(loggerFactory.CreateLogger<DiscordProvider>(), discordBuilder.BotToken);
57  default:
58  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid ChatProvider: {0}", settings.Provider));
59  }
60  }
61  }
62 }
+ +
readonly IApplication application
The IApplication for the ProviderFactory
+ + +
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+
ChatConnectionStringBuilder for ChatProvider.Discord
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the ProviderFactory
+ + + + + + +
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the ProviderFactory
+ +
ProviderFactory(IApplication application, IAsyncDelayer asyncDelayer, ILoggerFactory loggerFactory)
Construct a ProviderFactory
+ + +
ChatConnectionStringBuilder for ChatProvider.Irc
+
ChatProvider
Represents a chat service provider
Definition: ChatProvider.cs:6
+ + +
IProvider CreateProvider(Api.Models.Internal.ChatBot settings)
+
+ + + + diff --git a/_pull_requests_command_8cs.html b/_pull_requests_command_8cs.html new file mode 100644 index 0000000000..d1e349f55e --- /dev/null +++ b/_pull_requests_command_8cs.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands/PullRequestsCommand.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
PullRequestsCommand.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand
 Command for reading the active Api.Models.TestMerges More...
 
+ + + + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
namespace  Tgstation.Server.Host.Components.Chat.Commands
 
+
+ + + + diff --git a/_pull_requests_command_8cs_source.html b/_pull_requests_command_8cs_source.html new file mode 100644 index 0000000000..412248f3fc --- /dev/null +++ b/_pull_requests_command_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands/PullRequestsCommand.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
PullRequestsCommand.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore;
2 using System;
3 using System.Collections.Generic;
4 using System.Globalization;
5 using System.Linq;
6 using System.Threading;
7 using System.Threading.Tasks;
11 
13 {
18  {
20  public string Name => "prs";
21 
23  public string HelpText => "Display live test merge pull request numbers. Add --repo to view repository test merges";
24 
26  public bool AdminOnly => false;
27 
31  readonly IWatchdog watchdog;
32 
37 
42 
46  readonly Models.Instance instance;
47 
56  {
57  this.watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
58  this.repositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
59  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
60  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
61  }
62 
64  // TODO: Decomplexify
65  #pragma warning disable CA1506
66  public async Task<string> Invoke(string arguments, User user, CancellationToken cancellationToken)
67  {
68  IEnumerable<Models.TestMerge> results = null;
69  if (arguments.Split(' ').Any(x => x.ToUpperInvariant() == "--REPO"))
70  {
71  string head;
72  using (var repo = await repositoryManager.LoadRepository(cancellationToken).ConfigureAwait(false))
73  {
74  if (repo == null)
75  return "Repository unavailable!";
76  head = repo.Head;
77  }
78 
79  await databaseContextFactory.UseContext(async db => results = await db.RevisionInformations.Where(x => x.Instance.Id == instance.Id && x.CommitSha == head)
80  .SelectMany(x => x.ActiveTestMerges)
81  .Select(x => x.TestMerge)
82  .Select(x => new Models.TestMerge
83  {
84  Number = x.Number,
85  PullRequestRevision = x.PullRequestRevision
86  }).ToListAsync(cancellationToken).ConfigureAwait(false)).ConfigureAwait(false);
87  }
88  else
89  {
90  if (!watchdog.Running)
91  return "Server offline!";
92  results = watchdog.ActiveCompileJob?.RevisionInformation.ActiveTestMerges.Select(x => x.TestMerge).ToList() ?? new List<Models.TestMerge>();
93  }
94 
95  return !results.Any() ? "None!" : String.Join(", ", results.Select(x => String.Format(CultureInfo.InvariantCulture, "#{0} at {1}", x.Number, x.PullRequestRevision.Substring(0, 7))));
96  }
97  #pragma warning restore CA1506
98  }
99 }
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the PullRequestsCommand
+ + +
readonly IRepositoryManager repositoryManager
The IRepositoryManager for the PullRequestsCommand
+
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
+
Models.CompileJob ActiveCompileJob
The CompileJob currently running on the server
Definition: IWatchdog.cs:27
+ + +
readonly Models.Instance instance
The Models.Instance for the PullRequestsCommand
+
Command for reading the active Api.Models.TestMerges
+ +
Task< IRepository > LoadRepository(CancellationToken cancellationToken)
Attempt to load the IRepository from the default location
+
readonly IWatchdog watchdog
The IWatchdog for the PullRequestsCommand
+
Represents a tgs_chat_user datum
Definition: User.cs:10
+ + + + +
bool Running
If the watchdog is running
Definition: IWatchdog.cs:17
+
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+
PullRequestsCommand(IWatchdog watchdog, IRepositoryManager repositoryManager, IDatabaseContextFactory databaseContextFactory, Models.Instance instance)
Construct a PullRequestsCommand
+ +
Represents a command that can be invoked by talking to chat bots
Definition: ICommand.cs:9
+
async Task< string > Invoke(string arguments, User user, CancellationToken cancellationToken)
Invoke the ICommand
+ +
Runs and monitors the twin server controllers
Definition: IWatchdog.cs:12
+
+ + + + diff --git a/_r_e_a_d_m_e_8md.html b/_r_e_a_d_m_e_8md.html new file mode 100644 index 0000000000..c122e60121 --- /dev/null +++ b/_r_e_a_d_m_e_8md.html @@ -0,0 +1,78 @@ + + + + + + + +tgstation-server: README.md File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
README.md File Reference
+
+
+
+ + + + diff --git a/_rate_limit_exception_8cs.html b/_rate_limit_exception_8cs.html new file mode 100644 index 0000000000..2aaa69f3b1 --- /dev/null +++ b/_rate_limit_exception_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/RateLimitException.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RateLimitException.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Client.RateLimitException
 Occurs when a GitHub rate limit occurs More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_rate_limit_exception_8cs_source.html b/_rate_limit_exception_8cs_source.html new file mode 100644 index 0000000000..b33adf71aa --- /dev/null +++ b/_rate_limit_exception_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/RateLimitException.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RateLimitException.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Net;
4 
6 {
10  public sealed class RateLimitException : ClientException
11  {
12  DateTimeOffset RetryAfter { get; }
13 
17  public RateLimitException() { }
18 
23  public RateLimitException(string secondsString) : base(new ErrorMessage
24  {
25  Message = "GitHub rate limit reached!",
26  SeverApiVersion = null
27  }, (HttpStatusCode)429)
28  {
29  if (Int32.TryParse(secondsString, out var seconds) && seconds >= 0)
30  RetryAfter = DateTimeOffset.Now.AddSeconds(seconds);
31  else
32  RetryAfter = DateTimeOffset.Now;
33  }
34 
40  public RateLimitException(string message, Exception innerException) : base(message, innerException) { }
41  }
42 }
+ +
Occurs when a GitHub rate limit occurs
+
RateLimitException(string secondsString)
Construct an RateLimitException with a secondsString
+ + +
RateLimitException()
Construct an RateLimitException
+ +
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
Exceptions thrown by IServerClients
+
RateLimitException(string message, Exception innerException)
Construct an RateLimitException with a message and innerException
+
+ + + + diff --git a/_reattach_info_handler_8cs.html b/_reattach_info_handler_8cs.html new file mode 100644 index 0000000000..a8614f2d89 --- /dev/null +++ b/_reattach_info_handler_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/ReattachInfoHandler.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ReattachInfoHandler.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Components.ReattachInfoHandler
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
+
+ + + + diff --git a/_reattach_info_handler_8cs_source.html b/_reattach_info_handler_8cs_source.html new file mode 100644 index 0000000000..073013cb49 --- /dev/null +++ b/_reattach_info_handler_8cs_source.html @@ -0,0 +1,115 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/ReattachInfoHandler.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ReattachInfoHandler.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore;
2 using Microsoft.Extensions.Logging;
3 using System;
4 using System.Linq;
5 using System.Threading;
6 using System.Threading.Tasks;
10 using Z.EntityFramework.Plus;
11 
13 {
16  {
21 
26 
30  readonly ILogger<ReattachInfoHandler> logger;
31 
35  readonly Api.Models.Instance metadata;
36 
44  public ReattachInfoHandler(IDatabaseContextFactory databaseContextFactory, IDmbFactory dmbFactory, ILogger<ReattachInfoHandler> logger, Api.Models.Instance metadata)
45  {
46  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
47  this.dmbFactory = dmbFactory ?? throw new ArgumentNullException(nameof(dmbFactory));
48  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
49  this.metadata = metadata ?? throw new ArgumentNullException(nameof(metadata));
50  }
51 
53  public Task Save(WatchdogReattachInformation reattachInformation, CancellationToken cancellationToken) => databaseContextFactory.UseContext(async (db) =>
54  {
55  if (reattachInformation == null)
56  throw new ArgumentNullException(nameof(reattachInformation));
57 
58  logger.LogDebug("Saving reattach information: {0}...", reattachInformation);
59 
60  var deleteTask = db.WatchdogReattachInformations.Where(x => x.InstanceId == metadata.Id).DeleteAsync(cancellationToken);
61 
62  var instance = new Models.Instance { Id = metadata.Id };
63  db.Instances.Attach(instance);
64 
65  Models.ReattachInformation ConvertReattachInfo(ReattachInformation wdInfo)
66  {
67  if (wdInfo == null)
68  return null;
69  db.CompileJobs.Attach(wdInfo.Dmb.CompileJob);
70  return new Models.ReattachInformation
71  {
72  AccessIdentifier = wdInfo.AccessIdentifier,
73  ChatChannelsJson = wdInfo.ChatChannelsJson,
74  ChatCommandsJson = wdInfo.ChatCommandsJson,
75  ServerCommandsJson = wdInfo.ServerCommandsJson,
76  CompileJob = wdInfo.Dmb.CompileJob,
77  IsPrimary = wdInfo.IsPrimary,
78  Port = wdInfo.Port,
79  ProcessId = wdInfo.ProcessId,
80  RebootState = wdInfo.RebootState
81  };
82  }
83 
84  instance.WatchdogReattachInformation = new Models.WatchdogReattachInformation
85  {
86  Alpha = ConvertReattachInfo(reattachInformation.Alpha),
87  Bravo = ConvertReattachInfo(reattachInformation.Bravo),
88  AlphaIsActive = reattachInformation.AlphaIsActive,
89  };
90  await deleteTask.ConfigureAwait(false);
91  await db.Save(cancellationToken).ConfigureAwait(false);
92  });
93 
95  public async Task<WatchdogReattachInformation> Load(CancellationToken cancellationToken)
96  {
97  Models.WatchdogReattachInformation result = null;
98  await databaseContextFactory.UseContext(async (db) =>
99  {
100  var instance = await db.Instances.Where(x => x.Id == metadata.Id)
101  .Include(x => x.WatchdogReattachInformation).ThenInclude(x => x.Alpha).ThenInclude(x => x.CompileJob)
102  .Include(x => x.WatchdogReattachInformation).ThenInclude(x => x.Bravo).ThenInclude(x => x.CompileJob)
103  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
104  result = instance.WatchdogReattachInformation;
105  if (result == default)
106  return;
107  instance.WatchdogReattachInformation = null;
108  db.WatchdogReattachInformations.Remove(result);
109  await db.Save(cancellationToken).ConfigureAwait(false);
110  }).ConfigureAwait(false);
111 
112  if (result == default)
113  {
114  logger.LogDebug("Reattach information not found!");
115  return null;
116  }
117 
118  var bravoDmbTask = dmbFactory.FromCompileJob(result.Bravo.CompileJob, cancellationToken);
119  var info = new WatchdogReattachInformation(result, await dmbFactory.FromCompileJob(result.Alpha.CompileJob, cancellationToken).ConfigureAwait(false), await bravoDmbTask.ConfigureAwait(false));
120  logger.LogDebug("Reattach information loaded: {0}", info);
121  return info;
122  }
123  }
124 }
string ServerCommandsJson
Path to the server commands json file
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the ReattachInfoHandler
+
CompileJob CompileJob
The CompileJob of the .dmb
Definition: IDmbProvider.cs:29
+ + + +
string ChatCommandsJson
Path to the chat commands json file
+
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
+ + +
readonly ILogger< ReattachInfoHandler > logger
The ILogger for the ReattachInfoHandler
+
Task Save(WatchdogReattachInformation reattachInformation, CancellationToken cancellationToken)
Save some reattachInformation
+
async Task< WatchdogReattachInformation > Load(CancellationToken cancellationToken)
Load a saved WatchdogReattachInformation
+
ushort Port
The port DreamDaemon was last listening on
+
IDmbProvider Dmb
The IDmbProvider used by DreamDaemon
+
readonly Api.Models.Instance metadata
The Api.Models.Instance for the ReattachInfoHandler
+
readonly IDmbFactory dmbFactory
The IDmbFactory for the ReattachInfoHandler
+
ReattachInfoHandler(IDatabaseContextFactory databaseContextFactory, IDmbFactory dmbFactory, ILogger< ReattachInfoHandler > logger, Api.Models.Instance metadata)
Construct a ReattachInfoHandler
+ +
bool IsPrimary
If the Components.IDmbProvider.PrimaryDirectory of the associated dmb is being used
+
string ChatChannelsJson
Path to the chat channels json file
+ + +
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+
Task< IDmbProvider > FromCompileJob(CompileJob compileJob, CancellationToken cancellationToken)
Gets a IDmbProvider for a given CompileJob
+ +
RebootState RebootState
The current DreamDaemon reboot state
+
Handles saving and loading WatchdogReattachInformation
+ +
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
+
Parameters necessary for duplicating a ISessionController session
+ +
string AccessIdentifier
Used to identify and authenticate the DreamDaemon instance
+
+ + + + diff --git a/_reattach_information_base_8cs.html b/_reattach_information_base_8cs.html new file mode 100644 index 0000000000..a961d30ddd --- /dev/null +++ b/_reattach_information_base_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/ReattachInformationBase.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ReattachInformationBase.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.ReattachInformationBase
 Base class for ReattachInformation More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + diff --git a/_reattach_information_base_8cs_source.html b/_reattach_information_base_8cs_source.html new file mode 100644 index 0000000000..75e37f5e80 --- /dev/null +++ b/_reattach_information_base_8cs_source.html @@ -0,0 +1,100 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/ReattachInformationBase.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ReattachInformationBase.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.ComponentModel.DataAnnotations;
3 using System.Globalization;
6 
8 {
12  public abstract class ReattachInformationBase : JsonSubFileList
13  {
17  [Required]
18  public string AccessIdentifier { get; set; }
19 
23  public int ProcessId { get; set; }
24 
28  public bool IsPrimary { get; set; }
29 
33  public ushort Port { get; set; }
34 
38  public RebootState RebootState { get; set; }
39 
43  protected ReattachInformationBase() { }
44 
49  protected ReattachInformationBase(ReattachInformationBase copy) : base(copy)
50  {
51  if (copy == null)
52  throw new ArgumentNullException(nameof(copy));
54  IsPrimary = copy.IsPrimary;
55  Port = copy.Port;
56  ProcessId = copy.ProcessId;
57  RebootState = copy.RebootState;
58  }
59 
61  public override string ToString() => String.Format(CultureInfo.InvariantCulture, "Process ID: {3}, Access Identifier {4}, Primary: {0}, RebootState: {1}, Port: {2}", IsPrimary, RebootState, Port, ProcessId, AccessIdentifier);
62  }
63 }
ReattachInformationBase()
Construct a ReattachInformationBase
+ +
ReattachInformationBase(ReattachInformationBase copy)
Construct a ReattachInformationBase from a given copy
+ + +
Information used in for reattaching and interop
+
ushort Port
The port DreamDaemon was last listening on
+ +
bool IsPrimary
If the Components.IDmbProvider.PrimaryDirectory of the associated dmb is being used
+ + + + +
RebootState RebootState
The current DreamDaemon reboot state
+ +
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
+ +
string AccessIdentifier
Used to identify and authenticate the DreamDaemon instance
+
+ + + + diff --git a/_reboot_state_8cs.html b/_reboot_state_8cs.html new file mode 100644 index 0000000000..c2362a264e --- /dev/null +++ b/_reboot_state_8cs.html @@ -0,0 +1,110 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/RebootState.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RebootState.cs File Reference
+
+ + + + + diff --git a/_reboot_state_8cs_source.html b/_reboot_state_8cs_source.html new file mode 100644 index 0000000000..5c11f2c649 --- /dev/null +++ b/_reboot_state_8cs_source.html @@ -0,0 +1,85 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/RebootState.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RebootState.cs
+
+
+Go to the documentation of this file.
2 {
6  public enum RebootState : int
7  {
11  Normal = 0,
12 
16  Shutdown = 1,
17 
21  Restart = 2
22  }
23 }
+ +
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
+
+ + + + diff --git a/_release_notes_8_assembly_info_8cs.html b/_release_notes_8_assembly_info_8cs.html new file mode 100644 index 0000000000..90ae4f85dc --- /dev/null +++ b/_release_notes_8_assembly_info_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: tools/ReleaseNotes/obj/Debug/netcoreapp2.1/ReleaseNotes.AssemblyInfo.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ReleaseNotes.AssemblyInfo.cs File Reference
+
+ + + + + diff --git a/_release_notes_8_assembly_info_8cs_source.html b/_release_notes_8_assembly_info_8cs_source.html new file mode 100644 index 0000000000..4cfe3e21d0 --- /dev/null +++ b/_release_notes_8_assembly_info_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: tools/ReleaseNotes/obj/Debug/netcoreapp2.1/ReleaseNotes.AssemblyInfo.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ReleaseNotes.AssemblyInfo.cs
+
+
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("ReleaseNotes")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("ReleaseNotes")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("ReleaseNotes")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+ + + + diff --git a/_repository_client_8cs.html b/_repository_client_8cs.html new file mode 100644 index 0000000000..2c2fb428d3 --- /dev/null +++ b/_repository_client_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/RepositoryClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RepositoryClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Client.Components.RepositoryClient
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
namespace  Tgstation.Server.Client.Components
 
+
+ + + + diff --git a/_repository_client_8cs_source.html b/_repository_client_8cs_source.html new file mode 100644 index 0000000000..1f3200ae9e --- /dev/null +++ b/_repository_client_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components/RepositoryClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RepositoryClient.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4 using Tgstation.Server.Api;
6 
8 {
11  {
16 
20  readonly Instance instance;
21 
28  {
29  this.apiClient = apiClient;
30  this.instance = instance;
31  }
32 
34  public Task<Repository> Clone(Repository repository, CancellationToken cancellationToken) => apiClient.Create<Repository, Repository>(Routes.Repository, repository, instance.Id, cancellationToken);
35 
37  public Task<Repository> Delete(CancellationToken cancellationToken) => apiClient.Delete<Repository>(Routes.Repository, instance.Id, cancellationToken);
38 
40  public Task<Repository> Read(CancellationToken cancellationToken) => apiClient.Read<Repository>(Routes.Repository, instance.Id, cancellationToken);
41 
43  public Task<Repository> Update(Repository repository, CancellationToken cancellationToken) => apiClient.Update<Repository, Repository>(Routes.Repository, repository ?? throw new ArgumentNullException(nameof(repository)), instance.Id, cancellationToken);
44  }
45 }
Task< Repository > Read(CancellationToken cancellationToken)
Get the Repository represented by the IRepositoryClient
+ + +
Task< Repository > Repository(Routes.Repository, repository, instance.Id, cancellationToken)
+
readonly Instance instance
The Instance for the RepositoryClient
+
Task< Repository > Delete(CancellationToken cancellationToken)
Deletes the Repository
+ +
Routes to a server actions
Definition: Routes.cs:9
+ + +
Represents a git repository
Definition: Repository.cs:8
+
const string Repository
The Models.Repository controller
Definition: Routes.cs:39
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Task< Repository > Clone(Repository repository, CancellationToken cancellationToken)
Clones a repository
+
Metadata about a server instance
Definition: Instance.cs:9
+
Task< Repository > Update(Repository repository, CancellationToken cancellationToken)
Update the Repository
+
readonly IApiClient apiClient
The IApiClient for the RepositoryClient
+
Task Delete(string route, CancellationToken cancellationToken)
Run an HTTP DELETE request
+ +
RepositoryClient(IApiClient apiClient, Instance instance)
Construct a RepositoryClient
+
Web interface for the API
Definition: IApiClient.cs:11
+ +
+ + + + diff --git a/_repository_controller_8cs.html b/_repository_controller_8cs.html new file mode 100644 index 0000000000..b35029be86 --- /dev/null +++ b/_repository_controller_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/RepositoryController.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RepositoryController.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Controllers.RepositoryController
 Controller for managing the Repositorys More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Controllers
 
+
+ + + + diff --git a/_repository_controller_8cs_source.html b/_repository_controller_8cs_source.html new file mode 100644 index 0000000000..6514b47fac --- /dev/null +++ b/_repository_controller_8cs_source.html @@ -0,0 +1,145 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/RepositoryController.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RepositoryController.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Mvc;
2 using Microsoft.EntityFrameworkCore;
3 using Microsoft.Extensions.Logging;
4 using Microsoft.Extensions.Options;
5 using System;
6 using System.Collections.Generic;
7 using System.Globalization;
8 using System.Linq;
9 using System.Linq.Expressions;
10 using System.Net;
11 using System.Reflection;
12 using System.Threading;
13 using System.Threading.Tasks;
14 using Tgstation.Server.Api;
22 
24 {
28  [Route(Routes.Repository)]
29  #pragma warning disable CA1506 // TODO: Decomplexify
30  public sealed class RepositoryController : ModelController<Repository>
31  {
36 
41 
46 
51 
62  public RepositoryController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IGitHubClientFactory gitHubClientFactory, IJobManager jobManager, ILogger<RepositoryController> logger, IOptions<GeneralConfiguration> generalConfigurationOptions) : base(databaseContext, authenticationContextFactory, logger, true)
63  {
64  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
65  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
66  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
67  generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
68  }
69 
70  async Task<bool> LoadRevisionInformation(Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, string lastOriginCommitSha, Action<Models.RevisionInformation> revInfoSink, CancellationToken cancellationToken)
71  {
72  var repoSha = repository.Head;
73 
74  IQueryable<Models.RevisionInformation> ApplyQuery(IQueryable<Models.RevisionInformation> query) => query
75  .Where(x => x.CommitSha == repoSha && x.Instance.Id == instance.Id)
76  .Include(x => x.CompileJobs)
77  .Include(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy);
78 
79  var revisionInfo = await ApplyQuery(databaseContext.RevisionInformations).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
80 
81  if (revisionInfo == default)
82  revisionInfo = databaseContext.RevisionInformations.Local.Where(x => x.CommitSha == repoSha && x.Instance.Id == instance.Id).FirstOrDefault();
83 
84  var needsDbUpdate = revisionInfo == default;
85  if (needsDbUpdate)
86  {
87  // needs insertion
88  revisionInfo = new Models.RevisionInformation
89  {
90  Instance = instance,
91  CommitSha = repoSha,
92  CompileJobs = new List<Models.CompileJob>(),
93  ActiveTestMerges = new List<RevInfoTestMerge>() // non null vals for api returns
94  };
95 
96  lock (databaseContext) // cleaner this way
97  databaseContext.RevisionInformations.Add(revisionInfo);
98  }
99 
100  revisionInfo.OriginCommitSha = revisionInfo.OriginCommitSha ?? lastOriginCommitSha;
101  if (revisionInfo.OriginCommitSha == null)
102  {
103  revisionInfo.OriginCommitSha = repoSha;
104  Logger.LogWarning(Components.Repository.Repository.OriginTrackingErrorTemplate, repoSha);
105  }
106 
107  revInfoSink?.Invoke(revisionInfo);
108  return needsDbUpdate;
109  }
110 
111  async Task<bool> PopulateApi(Repository model, Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, CancellationToken cancellationToken)
112  {
113  if (repository.IsGitHubRepository)
114  {
115  model.GitHubOwner = repository.GitHubOwner;
116  model.GitHubName = repository.GitHubRepoName;
117  }
118 
119  model.Origin = repository.Origin;
120  model.Reference = repository.Reference;
121 
122  // rev info stuff
123  Models.RevisionInformation revisionInfo = null;
124  var needsDbUpdate = await LoadRevisionInformation(repository, databaseContext, instance, null, x => revisionInfo = x, cancellationToken).ConfigureAwait(false);
125  model.RevisionInformation = revisionInfo.ToApi();
126  return needsDbUpdate;
127  }
128 
130  [TgsAuthorize(RepositoryRights.SetOrigin)]
131  public override async Task<IActionResult> Create([FromBody] Repository model, CancellationToken cancellationToken)
132  {
133  if (model == null)
134  throw new ArgumentNullException(nameof(model));
135 
136  if (model.Origin == null)
137  return BadRequest(new ErrorMessage { Message = "Missing repo origin!" });
138 
139  if (model.AccessUser == null ^ model.AccessToken == null)
140  return BadRequest(new ErrorMessage { Message = "Either both accessToken and accessUser must be present or neither!" });
141 
142  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
143 
144  if (currentModel == default)
145  return StatusCode((int)HttpStatusCode.Gone);
146 
147  // normalize github urls
148  const string BadGitHubUrl = "://www.github.com/";
149  var uiOrigin = model.Origin.ToUpperInvariant();
150  var uiBad = BadGitHubUrl.ToUpperInvariant();
151  var uiGitHub = Components.Repository.Repository.GitHubUrl.ToUpperInvariant();
152  if (uiOrigin.Contains(uiBad, StringComparison.Ordinal))
153  model.Origin = uiOrigin.Replace(uiBad, uiGitHub, StringComparison.Ordinal);
154 
155  currentModel.AccessToken = model.AccessToken;
156  currentModel.AccessUser = model.AccessUser; // intentionally only these fields, user not allowed to change anything else atm
157  var cloneBranch = model.Reference;
158  var origin = model.Origin;
159 
161 
162  if (repoManager.CloneInProgress)
163  return Conflict(new ErrorMessage
164  {
165  Message = "A clone operation is in progress!"
166  });
167 
168  if(repoManager.InUse)
169  return Conflict(new ErrorMessage
170  {
171  Message = "The repo is busy!"
172  });
173 
174  using (var repo = await repoManager.LoadRepository(cancellationToken).ConfigureAwait(false))
175  {
176  // clone conflict
177  if (repo != null)
178  return Conflict(new ErrorMessage
179  {
180  Message = "The repository already exists!"
181  });
182 
183  var job = new Models.Job
184  {
185  Description = String.Format(CultureInfo.InvariantCulture, "Clone branch {1} of repository {0}", origin, cloneBranch ?? "master"),
186  StartedBy = AuthenticationContext.User,
187  CancelRightsType = RightsType.Repository,
188  CancelRight = (ulong)RepositoryRights.CancelClone,
190  };
191  var api = currentModel.ToApi();
192  await jobManager.RegisterOperation(job, async (paramJob, databaseContext, progressReporter, ct) =>
193  {
194  using (var repos = await repoManager.CloneRepository(new Uri(origin), cloneBranch, currentModel.AccessUser, currentModel.AccessToken, progressReporter, ct).ConfigureAwait(false))
195  {
196  if (repos == null)
197  throw new JobException("Filesystem conflict while cloning repository!");
198  var instance = new Models.Instance
199  {
200  Id = Instance.Id
201  };
202  databaseContext.Instances.Attach(instance);
203  if (await PopulateApi(api, repos, databaseContext, instance, ct).ConfigureAwait(false))
204  await databaseContext.Save(ct).ConfigureAwait(false);
205  }
206  }, cancellationToken).ConfigureAwait(false);
207 
208  api.Origin = model.Origin;
209  api.Reference = model.Reference;
210  api.ActiveJob = job.ToApi();
211 
212  return StatusCode((int)HttpStatusCode.Created, api);
213  }
214  }
215 
221  [TgsAuthorize(RepositoryRights.Delete)]
222  public async Task<IActionResult> Delete(CancellationToken cancellationToken)
223  {
224  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
225 
226  if (currentModel == default)
227  return StatusCode((int)HttpStatusCode.Gone);
228 
229  currentModel.AccessToken = null;
230  currentModel.AccessUser = null;
231 
232  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
233 
234  Logger.LogInformation("Instance {0} repository delete initiated by user {1}", Instance.Id, AuthenticationContext.User.Id);
235 
236  var job = new Models.Job
237  {
238  Description = "Delete repository",
239  StartedBy = AuthenticationContext.User,
241  };
242  var api = currentModel.ToApi();
243  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressReporter, ct) => instanceManager.GetInstance(Instance).RepositoryManager.DeleteRepository(cancellationToken), cancellationToken).ConfigureAwait(false);
244  api.ActiveJob = job.ToApi();
245  return Accepted(api);
246  }
247 
249  [TgsAuthorize(RepositoryRights.Read)]
250  public override async Task<IActionResult> Read(CancellationToken cancellationToken)
251  {
252  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
253 
254  if (currentModel == default)
255  return StatusCode((int)HttpStatusCode.Gone);
256 
257  var api = currentModel.ToApi();
259 
260  if (repoManager.CloneInProgress)
261  return Conflict(new ErrorMessage
262  {
263  Message = "A clone operation is in progress!"
264  });
265 
266  if (repoManager.InUse)
267  return Conflict(new ErrorMessage
268  {
269  Message = "The repo is busy!"
270  });
271 
272  using (var repo = await repoManager.LoadRepository(cancellationToken).ConfigureAwait(false))
273  {
274  if (repo != null && await PopulateApi(api, repo, DatabaseContext, Instance, cancellationToken).ConfigureAwait(false))
275  {
276  // user may have fucked with the repo without telling us, do what we can
277  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
278  return StatusCode((int)HttpStatusCode.Created, api);
279  }
280 
281  return Json(api);
282  }
283  }
284 
286  [TgsAuthorize(RepositoryRights.ChangeAutoUpdateSettings | RepositoryRights.ChangeCommitter | RepositoryRights.ChangeCredentials | RepositoryRights.ChangeTestMergeCommits | RepositoryRights.MergePullRequest | RepositoryRights.SetReference | RepositoryRights.SetSha | RepositoryRights.UpdateBranch)]
287  #pragma warning disable CA1502 // TODO: Decomplexify
288  #pragma warning disable CA1505
289  public override async Task<IActionResult> Update([FromBody]Repository model, CancellationToken cancellationToken)
290  {
291  if (model == null)
292  throw new ArgumentNullException(nameof(model));
293 
294  if (model.AccessUser == null ^ model.AccessToken == null)
295  return BadRequest(new ErrorMessage { Message = "Either both accessToken and accessUser must be present or neither!" });
296 
297  if (model.CheckoutSha != null && model.Reference != null)
298  return BadRequest(new ErrorMessage { Message = "Only one of sha or reference may be specified!" });
299 
300  if (model.CheckoutSha != null && model.UpdateFromOrigin == true)
301  return BadRequest(new ErrorMessage { Message = "Cannot update a reference when checking out a sha!" });
302 
303  if (model.Origin != null)
304  return BadRequest(new ErrorMessage { Message = "origin cannot be modified without deleting the repository!" });
305 
306  if (model.NewTestMerges?.Any(x => !x.Number.HasValue) == true)
307  return BadRequest(new ErrorMessage { Message = "All new test merges must provide a number!" });
308 
309  if (model.NewTestMerges?.Any(x => model.NewTestMerges.Any(y => x != y && x.Number == y.Number)) == true)
310  return BadRequest(new ErrorMessage { Message = "Cannot test merge the same PR twice in one job!" });
311 
312  if (model.CommitterName?.Length == 0)
313  return BadRequest(new ErrorMessage { Message = "Cannot set empty committer name!" });
314 
315  if (model.CommitterEmail?.Length == 0)
316  return BadRequest(new ErrorMessage { Message = "Cannot set empty committer e=mail!" });
317 
318  var newTestMerges = model.NewTestMerges != null && model.NewTestMerges.Count > 0;
319  var userRights = (RepositoryRights)AuthenticationContext.GetRight(RightsType.Repository);
320  if (newTestMerges && !userRights.HasFlag(RepositoryRights.MergePullRequest))
321  return Forbid();
322 
323  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
324 
325  if (currentModel == default)
326  return StatusCode((int)HttpStatusCode.Gone);
327 
328  bool CheckModified<T>(Expression<Func<Api.Models.Internal.RepositorySettings, T>> expression, RepositoryRights requiredRight)
329  {
330  var memberSelectorExpression = (MemberExpression)expression.Body;
331  var property = (PropertyInfo)memberSelectorExpression.Member;
332 
333  var newVal = property.GetValue(model);
334  if (newVal == null)
335  return false;
336  if (!userRights.HasFlag(requiredRight) && property.GetValue(currentModel) != newVal)
337  return true;
338 
339  property.SetValue(currentModel, newVal);
340  return false;
341  }
342 
343  if (CheckModified(x => x.AccessToken, RepositoryRights.ChangeCredentials)
344  || CheckModified(x => x.AccessUser, RepositoryRights.ChangeCredentials)
345  || CheckModified(x => x.AutoUpdatesKeepTestMerges, RepositoryRights.ChangeAutoUpdateSettings)
346  || CheckModified(x => x.AutoUpdatesSynchronize, RepositoryRights.ChangeAutoUpdateSettings)
347  || CheckModified(x => x.CommitterEmail, RepositoryRights.ChangeCommitter)
348  || CheckModified(x => x.CommitterName, RepositoryRights.ChangeCommitter)
349  || CheckModified(x => x.PushTestMergeCommits, RepositoryRights.ChangeTestMergeCommits)
350  || CheckModified(x => x.ShowTestMergeCommitters, RepositoryRights.ChangeTestMergeCommits)
351  || CheckModified(x => x.PostTestMergeComment, RepositoryRights.ChangeTestMergeCommits)
352  || (model.UpdateFromOrigin == true && !userRights.HasFlag(RepositoryRights.UpdateBranch)))
353  return Forbid();
354 
355  if (currentModel.AccessToken?.Length == 0 && currentModel.AccessUser?.Length == 0)
356  {
357  // setting an empty string clears everything
358  currentModel.AccessUser = null;
359  currentModel.AccessToken = null;
360  }
361 
362  var canRead = userRights.HasFlag(RepositoryRights.Read);
363 
364  var api = canRead ? currentModel.ToApi() : new Repository();
366 
367  if (canRead)
368  {
369  if (repoManager.CloneInProgress)
370  return Conflict(new ErrorMessage
371  {
372  Message = "A clone operation is in progress!"
373  });
374 
375  if (repoManager.InUse)
376  return Conflict(new ErrorMessage
377  {
378  Message = "The repo is busy!"
379  });
380 
381  using (var repo = await repoManager.LoadRepository(cancellationToken).ConfigureAwait(false))
382  {
383  if (repo == null)
384  return Conflict(new ErrorMessage
385  {
386  Message = "Repository could not be loaded!"
387  });
388  await PopulateApi(api, repo, DatabaseContext, Instance, cancellationToken).ConfigureAwait(false);
389  }
390  }
391 
392  // this is just db stuf so stow it away
393  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
394 
395  // format the job description
396  string description = null;
397  if (model.UpdateFromOrigin == true)
398  if (model.Reference != null)
399  description = String.Format(CultureInfo.InvariantCulture, "Fetch and hard reset repository to origin/{0}", model.Reference);
400  else if (model.CheckoutSha != null)
401  description = String.Format(CultureInfo.InvariantCulture, "Fetch and checkout {0} in repository", model.CheckoutSha);
402  else
403  description = "Pull current repository reference";
404  else if (model.Reference != null || model.CheckoutSha != null)
405  description = String.Format(CultureInfo.InvariantCulture, "Checkout repository {0} {1}", model.Reference != null ? "reference" : "SHA", model.Reference ?? model.CheckoutSha);
406 
407  if (newTestMerges)
408  description = String.Format(CultureInfo.InvariantCulture, "{0}est merge pull request(s) {1}{2}",
409  description != null ? String.Format(CultureInfo.InvariantCulture, "{0} and t", description) : "T",
410  String.Join(", ", model.NewTestMerges.Select(x =>
411  String.Format(CultureInfo.InvariantCulture, "#{0}{1}", x.Number,
412  x.PullRequestRevision != null ? String.Format(CultureInfo.InvariantCulture, " at {0}", x.PullRequestRevision.Substring(0, 7)) : String.Empty))),
413  description != null ? String.Empty : " in repository");
414 
415  if (description == null)
416  return Json(api); // no git changes
417 
418  var job = new Models.Job
419  {
420  Description = description,
421  StartedBy = AuthenticationContext.User,
422  Instance = Instance,
423  CancelRightsType = RightsType.Repository,
424  CancelRight = (ulong)RepositoryRights.CancelPendingChanges,
425  };
426 
427  await jobManager.RegisterOperation(job, async (paramJob, databaseContext, progressReporter, ct) =>
428  {
429  using (var repo = await repoManager.LoadRepository(ct).ConfigureAwait(false))
430  {
431  if (repo == null)
432  throw new JobException("Repository could not be loaded!");
433 
434  var modelHasShaOrReference = model.CheckoutSha != null || model.Reference != null;
435 
436  var startReference = repo.Reference;
437  var startSha = repo.Head;
438  string postUpdateSha = null;
439 
440  if (newTestMerges && !repo.IsGitHubRepository)
441  throw new JobException("Cannot test merge on a non GitHub based repository!");
442 
443  var committerName = currentModel.ShowTestMergeCommitters.Value ? AuthenticationContext.User.Name : currentModel.CommitterName;
444 
445  var hardResettingToOriginReference = model.UpdateFromOrigin == true && model.Reference != null;
446 
447  var numSteps = (model.NewTestMerges?.Count ?? 0) + (model.UpdateFromOrigin == true ? 1 : 0) + (!modelHasShaOrReference ? 2 : (hardResettingToOriginReference ? 3 : 1));
448  var doneSteps = 0;
449 
450  Action<int> NextProgressReporter()
451  {
452  var tmpDoneSteps = doneSteps;
453  ++doneSteps;
454  return progress => progressReporter((progress + (100 * tmpDoneSteps)) / numSteps);
455  }
456 
457  progressReporter(0);
458 
459  // get a base line for where we are
460  Models.RevisionInformation lastRevisionInfo = null;
461 
462  var attachedInstance = new Models.Instance
463  {
464  Id = Instance.Id
465  };
466  databaseContext.Instances.Attach(attachedInstance);
467 
468  await LoadRevisionInformation(repo, databaseContext, attachedInstance, null, x => lastRevisionInfo = x, ct).ConfigureAwait(false);
469 
470  // apply new rev info, tracking applied test merges
471  async Task UpdateRevInfo()
472  {
473  var last = lastRevisionInfo;
474  await LoadRevisionInformation(repo, databaseContext, attachedInstance, last.OriginCommitSha, x => lastRevisionInfo = x, ct).ConfigureAwait(false);
475  lastRevisionInfo.ActiveTestMerges.AddRange(last.ActiveTestMerges);
476  }
477 
478  try
479  {
480  // fetch/pull
481  if (model.UpdateFromOrigin == true)
482  {
483  if (!repo.Tracking)
484  throw new JobException("Not on an updatable reference!");
485  await repo.FetchOrigin(currentModel.AccessUser, currentModel.AccessToken, NextProgressReporter(), ct).ConfigureAwait(false);
486  doneSteps = 1;
487  if (!modelHasShaOrReference)
488  {
489  var fastForward = await repo.MergeOrigin(committerName, currentModel.CommitterEmail, NextProgressReporter(), ct).ConfigureAwait(false);
490  if (!fastForward.HasValue)
491  throw new JobException("Merge conflict occurred during origin update!");
492  await UpdateRevInfo().ConfigureAwait(false);
493  if (fastForward.Value)
494  {
495  lastRevisionInfo.OriginCommitSha = repo.Head;
496  await repo.Sychronize(currentModel.AccessUser, currentModel.AccessToken, currentModel.CommitterName, currentModel.CommitterEmail, NextProgressReporter(), true, ct).ConfigureAwait(false);
497  postUpdateSha = repo.Head;
498  }
499  else
500  NextProgressReporter()(100);
501  }
502  }
503 
504  // checkout/hard reset
505  if (modelHasShaOrReference)
506  {
507  if ((model.CheckoutSha != null && repo.Head.ToUpperInvariant().StartsWith(model.CheckoutSha.ToUpperInvariant(), StringComparison.Ordinal))
508  || (model.Reference != null && repo.Reference.ToUpperInvariant() != model.Reference.ToUpperInvariant()))
509  {
510  var committish = model.CheckoutSha ?? model.Reference;
511  var isSha = await repo.IsSha(committish, cancellationToken).ConfigureAwait(false);
512 
513  if ((isSha && model.Reference != null) || (!isSha && model.CheckoutSha != null))
514  throw new JobException("Attempted to checkout a SHA or reference that was actually the opposite!");
515 
516  await repo.CheckoutObject(committish, NextProgressReporter(), ct).ConfigureAwait(false);
517  await LoadRevisionInformation(repo, databaseContext, attachedInstance, null, x => lastRevisionInfo = x, ct).ConfigureAwait(false); // we've either seen origin before or what we're checking out is on origin
518  }
519  else
520  NextProgressReporter()(100);
521 
522  if (hardResettingToOriginReference)
523  {
524  if (!repo.Tracking)
525  throw new JobException("Checked out reference does not track a remote object!");
526  await repo.ResetToOrigin(NextProgressReporter(), ct).ConfigureAwait(false);
527  await repo.Sychronize(currentModel.AccessUser, currentModel.AccessToken, currentModel.CommitterName, currentModel.CommitterEmail, NextProgressReporter(), true, ct).ConfigureAwait(false);
528  await LoadRevisionInformation(repo, databaseContext, attachedInstance, null, x => lastRevisionInfo = x, ct).ConfigureAwait(false);
529 
530  // repo head is on origin so force this
531  // will update the db if necessary
532  lastRevisionInfo.OriginCommitSha = repo.Head;
533  }
534  }
535 
536  // test merging
537  Dictionary<int, Octokit.PullRequest> prMap = null;
538  if (newTestMerges)
539  {
540  // bit of sanitization
541  foreach (var I in model.NewTestMerges.Where(x => String.IsNullOrWhiteSpace(x.PullRequestRevision)))
542  I.PullRequestRevision = null;
543 
544  var gitHubClient = currentModel.AccessToken != null
545  ? gitHubClientFactory.CreateClient(currentModel.AccessToken)
546  : (String.IsNullOrEmpty(generalConfiguration.GitHubAccessToken)
549 
550  var repoOwner = repo.GitHubOwner;
551  var repoName = repo.GitHubRepoName;
552 
553  // optimization: if we've already merged these exact same commits in this fashion before, just find the rev info for it and check it out
554  Models.RevisionInformation revInfoWereLookingFor = null;
555  bool needToApplyRemainingPrs = true;
556  if (lastRevisionInfo.OriginCommitSha == lastRevisionInfo.CommitSha)
557  {
558  // In order for this to work though we need the shas of all the commits
559  if (model.NewTestMerges.Any(x => x.PullRequestRevision == null))
560  prMap = new Dictionary<int, Octokit.PullRequest>();
561 
562  bool cantSearch = false;
563  foreach (var I in model.NewTestMerges)
564  {
565  if (I.PullRequestRevision != null)
566 #pragma warning disable CA1308 // Normalize strings to uppercase
567  I.PullRequestRevision = I.PullRequestRevision?.ToLowerInvariant(); // ala libgit2
568 #pragma warning restore CA1308 // Normalize strings to uppercase
569  else
570  try
571  {
572  // retrieve the latest sha
573  var pr = await gitHubClient.PullRequest.Get(repoOwner, repoName, I.Number.Value).ConfigureAwait(false);
574  prMap.Add(I.Number.Value, pr);
575  I.PullRequestRevision = pr.Head.Sha;
576  }
577  catch
578  {
579  cantSearch = true;
580  break;
581  }
582  }
583 
584  if (!cantSearch)
585  {
586  var dbPull = await databaseContext.RevisionInformations
587  .Where(x => x.Instance.Id == Instance.Id
588  && x.OriginCommitSha == lastRevisionInfo.OriginCommitSha
589  && x.ActiveTestMerges.Count <= model.NewTestMerges.Count
590  && x.ActiveTestMerges.Count > 0)
591  .Include(x => x.ActiveTestMerges)
592  .ThenInclude(x => x.TestMerge)
593  .ToListAsync(cancellationToken).ConfigureAwait(false);
594 
595  // split here cause this bit has to be done locally
596  revInfoWereLookingFor = dbPull
597  .Where(x => x.ActiveTestMerges.Count == model.NewTestMerges.Count
598  && x.ActiveTestMerges.Select(y => y.TestMerge)
599  .All(y => model.NewTestMerges.Any(z =>
600  y.Number == z.Number
601  && y.PullRequestRevision.StartsWith(z.PullRequestRevision, StringComparison.Ordinal)
602  && (y.Comment?.Trim().ToUpperInvariant() == z.Comment?.Trim().ToUpperInvariant() || z.Comment == null))))
603  .FirstOrDefault();
604 
605  if (revInfoWereLookingFor == null && model.NewTestMerges.Count > 1)
606  {
607  // okay try to add at least SOME prs we've seen before
608  var search = model.NewTestMerges.ToList();
609 
610  var appliedTestMergeIds = new List<long>();
611 
612  Models.RevisionInformation lastGoodRevInfo = null;
613  do
614  {
615  foreach (var I in search)
616  {
617  revInfoWereLookingFor = dbPull
618  .Where(x => model.NewTestMerges.Any(z =>
619  x.PrimaryTestMerge.Number == z.Number
620  && x.PrimaryTestMerge.PullRequestRevision.StartsWith(z.PullRequestRevision, StringComparison.Ordinal)
621  && (x.PrimaryTestMerge.Comment?.Trim().ToUpperInvariant() == z.Comment?.Trim().ToUpperInvariant() || z.Comment == null))
622  && x.ActiveTestMerges.Select(y => y.TestMerge).All(y => appliedTestMergeIds.Contains(y.Id)))
623  .FirstOrDefault();
624 
625  if (revInfoWereLookingFor != null)
626  {
627  lastGoodRevInfo = revInfoWereLookingFor;
628  appliedTestMergeIds.Add(revInfoWereLookingFor.PrimaryTestMerge.Id);
629  search.Remove(I);
630  break;
631  }
632  }
633  }
634  while (revInfoWereLookingFor != null && search.Count > 0);
635 
636  revInfoWereLookingFor = lastGoodRevInfo;
637  needToApplyRemainingPrs = search.Count != 0;
638  if (needToApplyRemainingPrs)
639  model.NewTestMerges = search;
640  }
641  else if (revInfoWereLookingFor != null)
642  needToApplyRemainingPrs = false;
643  }
644  }
645 
646  if (revInfoWereLookingFor != null)
647  {
648  // goteem
649  await repo.ResetToSha(revInfoWereLookingFor.CommitSha, NextProgressReporter(), cancellationToken).ConfigureAwait(false);
650  lastRevisionInfo = revInfoWereLookingFor;
651  }
652 
653  if (needToApplyRemainingPrs)
654  {
655  // an invocation of LoadRevisionInformation could have already loaded this user
656  var contextUser = databaseContext.Users.Local.Where(x => x.Id == AuthenticationContext.User.Id).FirstOrDefault();
657  if (contextUser == default)
658  {
659  contextUser = new Models.User
660  {
662  };
663  databaseContext.Users.Attach(contextUser);
664  }
665  else
666  Logger.LogTrace("Skipping attaching the user to the database context as it is already loaded!");
667 
668  foreach (var I in model.NewTestMerges)
669  {
670  Octokit.PullRequest pr = null;
671  string errorMessage = null;
672 
673  if (lastRevisionInfo.ActiveTestMerges.Any(x => x.TestMerge.Number == I.Number.Value))
674  throw new JobException("Cannot test merge the same PR twice in one HEAD!");
675 
676  try
677  {
678  // load from cache if possible
679  if (prMap == null || !prMap.TryGetValue(I.Number.Value, out pr))
680  pr = await gitHubClient.PullRequest.Get(repoOwner, repoName, I.Number.Value).ConfigureAwait(false);
681  }
682  catch (Octokit.RateLimitExceededException)
683  {
684  // you look at your anonymous access and sigh
685  errorMessage = "P.R.E. RATE LIMITED";
686  }
687  catch (Octokit.AuthorizationException)
688  {
689  errorMessage = "P.R.E. BAD CREDENTIALS";
690  }
691  catch (Octokit.NotFoundException)
692  {
693  // you look at your shithub and sigh
694  errorMessage = "P.R.E. NOT FOUND";
695  }
696 
697  // we want to take the earliest truth possible to prevent RCEs, if this fails AddTestMerge will set it
698  if (I.PullRequestRevision == null && pr != null)
699  I.PullRequestRevision = pr.Head.Sha;
700 
701  var mergeResult = await repo.AddTestMerge(I, committerName, currentModel.CommitterEmail, currentModel.AccessUser, currentModel.AccessToken, NextProgressReporter(), ct).ConfigureAwait(false);
702 
703  if (!mergeResult.HasValue)
704  throw new JobException(String.Format(CultureInfo.InvariantCulture, "Merge of PR #{0} at {1} conflicted!", I.Number, I.PullRequestRevision.Substring(0, 7)));
705 
706  ++doneSteps;
707 
708  var revInfoUpdateTask = UpdateRevInfo();
709 
710  var tm = new Models.TestMerge
711  {
712  Author = pr?.User.Login ?? errorMessage,
713  BodyAtMerge = pr?.Body ?? errorMessage ?? String.Empty,
714  MergedAt = DateTimeOffset.Now,
715  TitleAtMerge = pr?.Title ?? errorMessage ?? String.Empty,
716  Comment = I.Comment,
717  Number = I.Number,
718  MergedBy = contextUser,
719  PullRequestRevision = I.PullRequestRevision,
720  Url = pr?.HtmlUrl ?? errorMessage
721  };
722 
723  await revInfoUpdateTask.ConfigureAwait(false);
724 
725  lastRevisionInfo.PrimaryTestMerge = tm;
726  lastRevisionInfo.ActiveTestMerges.Add(new RevInfoTestMerge
727  {
728  TestMerge = tm
729  });
730  }
731  }
732  }
733 
734  var currentHead = repo.Head;
735  if (startSha != currentHead || (postUpdateSha != null && postUpdateSha != currentHead))
736  {
737  await repo.Sychronize(currentModel.AccessUser, currentModel.AccessToken, currentModel.CommitterName, currentModel.CommitterEmail, NextProgressReporter(), false, ct).ConfigureAwait(false);
738  await UpdateRevInfo().ConfigureAwait(false);
739  }
740 
741  await databaseContext.Save(ct).ConfigureAwait(false);
742  }
743  catch
744  {
745  doneSteps = 0;
746  numSteps = 2;
747 
748  // the stuff didn't make it into the db, forget what we've done and abort
749  await repo.CheckoutObject(startReference ?? startSha, NextProgressReporter(), default).ConfigureAwait(false);
750  if (startReference != null && repo.Head != startSha)
751  await repo.ResetToSha(startSha, NextProgressReporter(), default).ConfigureAwait(false);
752  else
753  progressReporter(100);
754  throw;
755  }
756  }
757  }, cancellationToken).ConfigureAwait(false);
758 
759  api.ActiveJob = job.ToApi();
760  return Accepted(api);
761  }
762  #pragma warning restore CA1502
763  #pragma warning restore CA1505
764  }
765 }
string Name
The name of the User
Definition: User.cs:38
+ +
Manages the runtime of Jobs
Definition: IJobManager.cs:12
+ + + + +
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
string GitHubAccessToken
A GitHub personal access token to use for bypassing rate limits on requests. Requires no scopes
+ +
string GitHubOwner
If the repository was cloned from GitHub.com this will be set with the owner of the repository
Definition: Repository.cs:28
+
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+ +
Many to many relationship for Models.RevisionInformation and Models.TestMerge
+
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+
async Task< bool > PopulateApi(Repository model, Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, CancellationToken cancellationToken)
+ +
Task RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
Registers a given Job and begins running it
+ +
User may list and read all Models.CompileJobs
+
readonly IInstanceManager instanceManager
The IInstanceManager for the RepositoryController
+ +
Routes to a server actions
Definition: Routes.cs:9
+
async Task< bool > LoadRevisionInformation(Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, string lastOriginCommitSha, Action< Models.RevisionInformation > revInfoSink, CancellationToken cancellationToken)
+ + +
Represents a git repository
Definition: Repository.cs:8
+
const string Repository
The Models.Repository controller
Definition: Routes.cs:39
+
IRepositoryManager RepositoryManager
The IRepositoryManager for the IInstance
Definition: IInstance.cs:22
+
RevisionInformation RevisionInformation
The current Models.RevisionInformation for the Repository
Definition: Repository.cs:23
+ +
DbSet< RepositorySettings > RepositorySettings
+
RepositoryRights
Rights for a Models.Repository
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
IGitHubClient CreateClient()
Create a client with anonymous authentication. Low rate limit
+
readonly IGitHubClientFactory gitHubClientFactory
The IGitHubClientFactory for the RepositoryController
+
string Reference
The branch or tag HEAD points to
Definition: Repository.cs:48
+
An ApiController representing a TModel
+ + +
override async Task< IActionResult > Update([FromBody]Repository model, CancellationToken cancellationToken)
+
RepositoryController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IGitHubClientFactory gitHubClientFactory, IJobManager jobManager, ILogger< RepositoryController > logger, IOptions< GeneralConfiguration > generalConfigurationOptions)
Construct a RepositoryController
+ +
long Id
The ID of the User
Definition: User.cs:15
+
Metadata about a server instance
Definition: Instance.cs:9
+
DbSet< RevisionInformation > RevisionInformations
The RevisionInformations in the IDatabaseContext
+ + +
virtual Task< IActionResult > List(CancellationToken cancellationToken)
Attempt to list entries of the TModel
+
override async Task< IActionResult > Create([FromBody] Repository model, CancellationToken cancellationToken)
+
string Origin
The origin URL. If null, the Repository does not exist
Definition: Repository.cs:13
+ +
string GitHubName
If the repository was cloned from GitHub.com this will be set with the name of the repository
Definition: Repository.cs:33
+
override async Task< IActionResult > Read(CancellationToken cancellationToken)
Attempt to read a TModel
+
readonly IJobManager jobManager
The IJobManager for the RepositoryController
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ + +
async Task< IActionResult > Delete(CancellationToken cancellationToken)
Delete the Repository
+
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the RepositoryController
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+ +
+ + + + diff --git a/_repository_manager_8cs.html b/_repository_manager_8cs.html new file mode 100644 index 0000000000..2fb2e7d1f7 --- /dev/null +++ b/_repository_manager_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Repository/RepositoryManager.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RepositoryManager.cs File Reference
+
+ + + + + diff --git a/_repository_manager_8cs_source.html b/_repository_manager_8cs_source.html new file mode 100644 index 0000000000..44ad27d2d3 --- /dev/null +++ b/_repository_manager_8cs_source.html @@ -0,0 +1,119 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Repository/RepositoryManager.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RepositoryManager.cs
+
+
+Go to the documentation of this file.
1 using LibGit2Sharp;
2 using Microsoft.Extensions.Logging;
3 using System;
4 using System.Threading;
5 using System.Threading.Tasks;
8 using Tgstation.Server.Host.IO;
9 
11 {
14  {
16  public bool InUse => semaphore.CurrentCount == 0;
17 
19  public bool CloneInProgress { get; private set; }
20 
25 
30 
35 
39  readonly ILogger<Repository> repositoryLogger;
40 
44  readonly ILogger<RepositoryManager> logger;
45 
50 
54  readonly SemaphoreSlim semaphore;
55 
66  {
67  this.repositorySettings = repositorySettings ?? throw new ArgumentNullException(nameof(repositorySettings));
68  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
69  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
70  this.credentialsProvider = credentialsProvider ?? throw new ArgumentNullException(nameof(credentialsProvider));
71  this.repositoryLogger = repositoryLogger ?? throw new ArgumentNullException(nameof(repositoryLogger));
72  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
73  semaphore = new SemaphoreSlim(1);
74  }
75 
77  public void Dispose()
78  {
79  logger.LogTrace("Disposing...");
80  semaphore.Dispose();
81  }
82 
84  public async Task<IRepository> CloneRepository(Uri url, string initialBranch, string username, string password, Action<int> progressReporter, CancellationToken cancellationToken)
85  {
86  if (url == null)
87  throw new ArgumentNullException(nameof(url));
88  if (progressReporter == null)
89  throw new ArgumentNullException(nameof(progressReporter));
90 
91  logger.LogInformation("Begin clone {0} (Branch: {1})", url, initialBranch);
92  lock (this)
93  {
94  if (CloneInProgress)
95  throw new InvalidOperationException("The repository is already being cloned!");
96  CloneInProgress = true;
97  }
98 
99  try
100  {
101  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
102  {
103  logger.LogTrace("Semaphore acquired");
104  if (!await ioManager.DirectoryExists(".", cancellationToken).ConfigureAwait(false))
105  try
106  {
107  await Task.Factory.StartNew(() =>
108  {
109  string path = null;
110  try
111  {
112  path = LibGit2Sharp.Repository.Clone(url.ToString(), ioManager.ResolvePath("."), new CloneOptions
113  {
114  OnProgress = (a) => !cancellationToken.IsCancellationRequested,
115  OnTransferProgress = (a) =>
116  {
117  var percentage = 100 * (((float)a.IndexedObjects + a.ReceivedObjects) / (a.TotalObjects * 2));
118  progressReporter((int)percentage);
119  return !cancellationToken.IsCancellationRequested;
120  },
121  RecurseSubmodules = true,
122  OnUpdateTips = (a, b, c) => !cancellationToken.IsCancellationRequested,
123  RepositoryOperationStarting = (a) => !cancellationToken.IsCancellationRequested,
124  BranchName = initialBranch,
126  });
127  }
128  catch (UserCancelledException) { }
129  cancellationToken.ThrowIfCancellationRequested();
130  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
131  }
132  catch
133  {
134  try
135  {
136  logger.LogTrace("Deleting partially cloned repository...");
137  await ioManager.DeleteDirectory(".", default).ConfigureAwait(false);
138  }
139  catch (Exception e)
140  {
141  logger.LogDebug("Error deleting partially cloned repository! Exception: {0}", e);
142  }
143 
144  throw;
145  }
146  else
147  {
148  logger.LogDebug("Repository exists, clone aborted!");
149  return null;
150  }
151  }
152 
153  logger.LogInformation("Clone complete!");
154  }
155  finally
156  {
157  CloneInProgress = false;
158  }
159 
160  return await LoadRepository(cancellationToken).ConfigureAwait(false);
161  }
162 
164  public async Task<IRepository> LoadRepository(CancellationToken cancellationToken)
165  {
166  logger.LogTrace("Begin LoadRepository...");
167  lock (this)
168  if (CloneInProgress)
169  throw new InvalidOperationException("The repository is being cloned!");
170  await semaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
171  LibGit2Sharp.Repository repo = null;
172  await Task.Factory.StartNew(() =>
173  {
174  try
175  {
176  logger.LogTrace("Creating LibGit2Sharp.Repository...");
177  repo = new LibGit2Sharp.Repository(ioManager.ResolvePath("."));
178  }
179  catch (RepositoryNotFoundException e)
180  {
181  logger.LogDebug("Repository not found!");
182  logger.LogTrace("Exception: {0}", e);
183  }
184  catch
185  {
186  semaphore.Release();
187  throw;
188  }
189  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
190  if (repo == null)
191  {
192  semaphore.Release();
193  return null;
194  }
195 
197  {
198  logger.LogTrace("Releasing semaphore due to Repository disposal...");
199  semaphore.Release();
200  });
201  }
202 
204  public async Task DeleteRepository(CancellationToken cancellationToken)
205  {
206  logger.LogInformation("Deleting repository...");
207  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
208  {
209  logger.LogTrace("Semaphore acquired, deleting Repository directory...");
210  await ioManager.DeleteDirectory(".", cancellationToken).ConfigureAwait(false);
211  }
212  }
213  }
214 }
Represents configurable settings for a Repository
+
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
Consumes EventTypes and takes the appropriate actions
+ +
RepositoryManager(RepositorySettings repositorySettings, IIOManager ioManager, IEventConsumer eventConsumer, ICredentialsProvider credentialsProvider, ILogger< Repository > repositoryLogger, ILogger< RepositoryManager > logger)
Construct a RepositoryManager
+
readonly ILogger< RepositoryManager > logger
The ILogger for the RepositoryManager
+
readonly ILogger< Repository > repositoryLogger
The ILogger created Repositorys
+
readonly SemaphoreSlim semaphore
Used for controlling single access to the IRepository
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+ + + +
CredentialsHandler GenerateHandler(string username, string password)
Generate a CredentialsHandler from a given username and password
+ +
readonly ICredentialsProvider credentialsProvider
The ICredentialsProvider for the RepositoryManager
+ + +
readonly IIOManager ioManager
The IIOManager for the RepositoryManager
+ + + + + +
readonly IEventConsumer eventConsumer
The IEventConsumer for the RepositoryManager
+
async Task< IRepository > CloneRepository(Uri url, string initialBranch, string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)
Clone the repository at url
+
Interface for using filesystems
Definition: IIOManager.cs:11
+
async Task< IRepository > LoadRepository(CancellationToken cancellationToken)
Attempt to load the IRepository from the default location
+ +
async Task DeleteRepository(CancellationToken cancellationToken)
Delete the current repository
+
Task< bool > DirectoryExists(string path, CancellationToken cancellationToken)
Check that the directory at path exists
+ +
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+
readonly RepositorySettings repositorySettings
The RepositorySettings for the RepositoryManager
+ + + + +
+ + + + diff --git a/_repository_rights_8cs.html b/_repository_rights_8cs.html new file mode 100644 index 0000000000..32032ae1de --- /dev/null +++ b/_repository_rights_8cs.html @@ -0,0 +1,124 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/RepositoryRights.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RepositoryRights.cs File Reference
+
+ + + + + diff --git a/_repository_rights_8cs_source.html b/_repository_rights_8cs_source.html new file mode 100644 index 0000000000..52cc7f16b7 --- /dev/null +++ b/_repository_rights_8cs_source.html @@ -0,0 +1,98 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/RepositoryRights.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RepositoryRights.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
8  [Flags]
9  public enum RepositoryRights : ulong
10  {
14  None = 0,
15 
20 
24  SetOrigin = 2,
25 
29  SetSha = 4,
30 
34  MergePullRequest = 8,
35 
39  UpdateBranch = 16,
40 
44  ChangeCommitter = 32,
45 
50 
54  ChangeCredentials = 128,
55 
59  SetReference = 256,
60 
64  Read = 512,
65 
70 
74  Delete = 2048,
75 
79  CancelClone = 4096
80  }
81 }
+
User may change Models.Internal.RepositorySettings.AutoUpdatesKeepTestMerges and Models....
+
User may fetch and merge GitHub pull requests
+
User may change Models.Internal.RepositorySettings.PushTestMergeCommits and Models....
+ + + +
RepositoryRights
Rights for a Models.Repository
+
User may directly set the sha the Models.Repository's HEAD points to
+ +
User may set Models.Repository.Reference to another git reference (not a SHA)
+ +
User may create the Models.Repository if it does not exist
+
User may read and change Models.Internal.RepositorySettings.AccessUser and Models....
+
User can read all chat settings except Models.Internal.ChatBot.ConnectionString
+
User may change Models.Internal.RepositorySettings.CommitterName and Models.Internal....
+
+ + + + diff --git a/_request_timeout_exception_8cs.html b/_request_timeout_exception_8cs.html new file mode 100644 index 0000000000..b108448f04 --- /dev/null +++ b/_request_timeout_exception_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/RequestTimeoutException.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RequestTimeoutException.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Client.RequestTimeoutException
 Occurs when the client provides invalid credentials More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_request_timeout_exception_8cs_source.html b/_request_timeout_exception_8cs_source.html new file mode 100644 index 0000000000..c5717cea88 --- /dev/null +++ b/_request_timeout_exception_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/RequestTimeoutException.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RequestTimeoutException.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Net;
4 
6 {
11  {
16  {
17  Message = "The request timed out!",
18  SeverApiVersion = null
19  }, HttpStatusCode.RequestTimeout)
20  { }
21 
26  public RequestTimeoutException(string message) : base(message) { }
27 
33  public RequestTimeoutException(string message, Exception innerException) : base(message, innerException) { }
34  }
35 }
RequestTimeoutException()
Construct an RequestTimeoutException
+ + + +
RequestTimeoutException(string message, Exception innerException)
Construct an RequestTimeoutException with a message and innerException
+
Occurs when the client provides invalid credentials
+ +
RequestTimeoutException(string message)
Construct an RequestTimeoutException with a message
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
Exceptions thrown by IServerClients
+
+ + + + diff --git a/_resolving_i_o_manager_8cs.html b/_resolving_i_o_manager_8cs.html new file mode 100644 index 0000000000..4cbab0875b --- /dev/null +++ b/_resolving_i_o_manager_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/ResolvingIOManager.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ResolvingIOManager.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.IO.ResolvingIOManager
 An IIOManager that resolve relative paths from another IIOManager to a subdirectory of that More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.IO
 
+
+ + + + diff --git a/_resolving_i_o_manager_8cs_source.html b/_resolving_i_o_manager_8cs_source.html new file mode 100644 index 0000000000..183274d51e --- /dev/null +++ b/_resolving_i_o_manager_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/ResolvingIOManager.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ResolvingIOManager.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.IO;
3 
5 {
10  {
14  readonly string subdirectory;
15 
22  {
23  if (parent == null)
24  throw new ArgumentNullException(nameof(parent));
25  if (subdirectory == null)
26  throw new ArgumentNullException(nameof(subdirectory));
27 
28  this.subdirectory = ConcatPath(parent.ResolvePath("."), subdirectory);
29  }
30 
32  public override string ResolvePath(string path)
33  {
34  if (!Path.IsPathRooted(path))
35  return base.ResolvePath(ConcatPath(subdirectory, path));
36  return path;
37  }
38  }
39 }
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
An IIOManager that resolve relative paths from another IIOManager to a subdirectory of that
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
ResolvingIOManager(IIOManager parent, string subdirectory)
Construct a ResolvingIOManager
+
override string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
IIOManager that resolves paths to Environment.CurrentDirectory
+
Interface for using filesystems
Definition: IIOManager.cs:11
+
readonly string subdirectory
Path to the subdirectory attached to path resolutions
+ +
+ + + + diff --git a/_response_8cs.html b/_response_8cs.html new file mode 100644 index 0000000000..a418304111 --- /dev/null +++ b/_response_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Response.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Response.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Chat.Response
 Represents a chat message requested by DD More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
+
+ + + + diff --git a/_response_8cs_source.html b/_response_8cs_source.html new file mode 100644 index 0000000000..f32d9b74ba --- /dev/null +++ b/_response_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Response.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Response.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 
4 {
8  sealed class Response
9  {
13  public string Message { get; set; }
14 
18  public List<ulong> ChannelIds { get; set; }
19  }
20 }
+ +
List< ulong > ChannelIds
The list of internal channel ids to send Message to
Definition: Response.cs:18
+
Represents a chat message requested by DD
Definition: Response.cs:8
+
+ + + + diff --git a/_restart_registration_8cs.html b/_restart_registration_8cs.html new file mode 100644 index 0000000000..57feab1a10 --- /dev/null +++ b/_restart_registration_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/RestartRegistration.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RestartRegistration.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Core.RestartRegistration
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_restart_registration_8cs_source.html b/_restart_registration_8cs_source.html new file mode 100644 index 0000000000..8c5f2428dc --- /dev/null +++ b/_restart_registration_8cs_source.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/RestartRegistration.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RestartRegistration.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
7  {
11  readonly Action onDispose;
12 
18  {
19  this.onDispose = onDispose ?? throw new ArgumentNullException(nameof(onDispose));
20  }
21 
23  public void Dispose() => onDispose();
24  }
25 }
+ + +
readonly Action onDispose
The Dispose Action
+
Represents the lifetime of a IRestartHandler registration
+
RestartRegistration(Action onDispose)
Construct a RestartRegistration
+
+ + + + diff --git a/_rev_info_test_merge_8cs.html b/_rev_info_test_merge_8cs.html new file mode 100644 index 0000000000..673a36c601 --- /dev/null +++ b/_rev_info_test_merge_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/RevInfoTestMerge.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RevInfoTestMerge.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.RevInfoTestMerge
 Many to many relationship for Models.RevisionInformation and Models.TestMerge More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + diff --git a/_rev_info_test_merge_8cs_source.html b/_rev_info_test_merge_8cs_source.html new file mode 100644 index 0000000000..91f52a2fb2 --- /dev/null +++ b/_rev_info_test_merge_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/RevInfoTestMerge.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RevInfoTestMerge.cs
+
+
+Go to the documentation of this file.
1 using System.ComponentModel.DataAnnotations;
2 
4 {
8  public sealed class RevInfoTestMerge
9  {
13  public long Id { get; set; }
14 
18  [Required]
19  public TestMerge TestMerge { get; set; }
20 
24  [Required]
26  }
27 }
+
Many to many relationship for Models.RevisionInformation and Models.TestMerge
+ + + +
+ + + + diff --git a/_revision_command_8cs.html b/_revision_command_8cs.html new file mode 100644 index 0000000000..e8dc258731 --- /dev/null +++ b/_revision_command_8cs.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands/RevisionCommand.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RevisionCommand.cs File Reference
+
+ + + + + diff --git a/_revision_command_8cs_source.html b/_revision_command_8cs_source.html new file mode 100644 index 0000000000..27e1891bc1 --- /dev/null +++ b/_revision_command_8cs_source.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands/RevisionCommand.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RevisionCommand.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Globalization;
4 using System.Linq;
5 using System.Threading;
6 using System.Threading.Tasks;
9 
11 {
15  sealed class RevisionCommand : ICommand
16  {
18  public string Name => "revision";
19 
21  public string HelpText => "Display live commit sha. Add --repo to view repository revision";
22 
24  public bool AdminOnly => false;
25 
29  readonly IWatchdog watchdog;
30 
35 
39  readonly Models.Instance instance;
40 
48  {
49  this.watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
50  this.repositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
51  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
52  }
53 
55  public async Task<string> Invoke(string arguments, User user, CancellationToken cancellationToken)
56  {
57  string result;
58  if (arguments.Split(' ').Any(x => x.ToUpperInvariant() == "--REPO"))
59  using (var repo = await repositoryManager.LoadRepository(cancellationToken).ConfigureAwait(false))
60  {
61  if (repo == null)
62  return "Repository unavailable!";
63  result = repo.Head;
64  }
65  else
66  {
67  if (!watchdog.Running)
68  return "Server offline!";
69  result = watchdog.ActiveCompileJob?.RevisionInformation.CommitSha;
70  }
71 
72  return String.Format(CultureInfo.InvariantCulture, "^{0}", result);
73  }
74  }
75 }
+ +
readonly IRepositoryManager repositoryManager
The IRepositoryManager for the PullRequestsCommand
+ +
Models.CompileJob ActiveCompileJob
The CompileJob currently running on the server
Definition: IWatchdog.cs:27
+ +
async Task< string > Invoke(string arguments, User user, CancellationToken cancellationToken)
Invoke the ICommand
+
readonly IWatchdog watchdog
The IWatchdog for the PullRequestsCommand
+ +
readonly Models.Instance instance
The Models.Instance for the PullRequestsCommand
+
Task< IRepository > LoadRepository(CancellationToken cancellationToken)
Attempt to load the IRepository from the default location
+
RevisionCommand(IWatchdog watchdog, IRepositoryManager repositoryManager, Models.Instance instance)
Construct a RevisionCommand
+ +
For displaying Api.Models.Internal.RevisionInformation
+
Represents a tgs_chat_user datum
Definition: User.cs:10
+ + + +
bool Running
If the watchdog is running
Definition: IWatchdog.cs:17
+ +
Represents a command that can be invoked by talking to chat bots
Definition: ICommand.cs:9
+ +
Runs and monitors the twin server controllers
Definition: IWatchdog.cs:12
+
+ + + + diff --git a/_rights_helper_8cs.html b/_rights_helper_8cs.html new file mode 100644 index 0000000000..dc2201a64e --- /dev/null +++ b/_rights_helper_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/RightsHelper.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RightsHelper.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Rights.RightsHelper
 Helper for RightsTypes More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Rights
 
+
+ + + + diff --git a/_rights_helper_8cs_source.html b/_rights_helper_8cs_source.html new file mode 100644 index 0000000000..29a4ffbd8f --- /dev/null +++ b/_rights_helper_8cs_source.html @@ -0,0 +1,99 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/RightsHelper.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RightsHelper.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Globalization;
4 
6 {
10  public static class RightsHelper
11  {
15  static readonly IReadOnlyDictionary<RightsType, Type> TypeMap = new Dictionary<RightsType, Type>
16  {
17  { RightsType.Administration, typeof(AdministrationRights) },
18  { RightsType.InstanceManager, typeof(InstanceManagerRights) },
19  { RightsType.Repository, typeof(RepositoryRights) },
20  { RightsType.Byond, typeof(ByondRights) },
21  { RightsType.DreamMaker, typeof(DreamMakerRights) },
22  { RightsType.DreamDaemon, typeof(DreamDaemonRights) },
23  { RightsType.ChatBots, typeof(ChatBotRights) },
24  { RightsType.Configuration, typeof(ConfigurationRights) },
25  { RightsType.InstanceUser, typeof(InstanceUserRights) }
26  };
27 
33  public static Type RightToType(RightsType rightsType) => TypeMap[rightsType];
34 
41  public static string RoleNames<TRight>(TRight right) where TRight : Enum
42  {
43  var flags = new List<string>();
44  IEnumerable<string> GetRoleNames()
45  {
46  foreach (Enum J in Enum.GetValues(right.GetType()))
47  if (Convert.ToInt32(J, CultureInfo.InvariantCulture) != 0 && right.HasFlag(J))
48  yield return String.Concat(typeof(TRight).Name, '.', J.ToString());
49  }
50 
51  var names = GetRoleNames();
52  return String.Join(",", names);
53  }
54 
61  public static string RoleName(RightsType rightsType, Enum right)
62  {
63  var enumType = TypeMap[rightsType];
64  return String.Concat(enumType.Name, '.', Enum.GetName(enumType, right));
65  }
66 
72  public static bool IsInstanceRight(RightsType rightsType) => !(rightsType == RightsType.Administration || rightsType == RightsType.InstanceManager);
73  }
74 }
static bool IsInstanceRight(RightsType rightsType)
Check if a given rightsType is meant for an Models.Instance
+
ConfigurationRights
Rights for Models.ConfigurationFile
+ +
ByondRights
Rights for Models.Byond
Definition: ByondRights.cs:9
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
InstanceUserRights
Rights for an Models.Instance
+
AdministrationRights
Rights for Models.Administration
+
DreamDaemonRights
Rights for Models.DreamDaemon
+
InstanceManagerRights
Rights for managing Models.Instances
+
static string RoleNames< TRight >(TRight right)
Gets the role claim name used for a given right
Definition: RightsHelper.cs:41
+
DreamMakerRights
Rights for Models.DreamMaker
+
RepositoryRights
Rights for a Models.Repository
+ +
static Type RightToType(RightsType rightsType)
Map a given rightsType to its respective Enum Type
+
static readonly IReadOnlyDictionary< RightsType, Type > TypeMap
Map of RightsTypes to their respective flag Enums
Definition: RightsHelper.cs:15
+
ChatBotRights
Rights for Models.ChatBot
Definition: ChatBotRights.cs:9
+
static string RoleName(RightsType rightsType, Enum right)
Gets the role claim name used for a given rightsType and right
Definition: RightsHelper.cs:61
+
+ + + + diff --git a/_rights_type_8cs.html b/_rights_type_8cs.html new file mode 100644 index 0000000000..0a3fe36b67 --- /dev/null +++ b/_rights_type_8cs.html @@ -0,0 +1,118 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/RightsType.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RightsType.cs File Reference
+
+ + + + + diff --git a/_rights_type_8cs_source.html b/_rights_type_8cs_source.html new file mode 100644 index 0000000000..07e707fd3f --- /dev/null +++ b/_rights_type_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights/RightsType.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RightsType.cs
+
+ + + + + diff --git a/_routes_8cs.html b/_routes_8cs.html new file mode 100644 index 0000000000..aa0beba876 --- /dev/null +++ b/_routes_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Routes.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Routes.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Routes
 Routes to a server actions More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
+
+ + + + diff --git a/_routes_8cs_source.html b/_routes_8cs_source.html new file mode 100644 index 0000000000..96993efc9f --- /dev/null +++ b/_routes_8cs_source.html @@ -0,0 +1,100 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Routes.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Routes.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Globalization;
3 
4 namespace Tgstation.Server.Api
5 {
9  public static class Routes
10  {
14  public const string Root = "/";
15 
19  public const string Administration = Root + nameof(Models.Administration);
20 
24  public const string User = Root + nameof(Models.User);
25 
29  public const string InstanceManager = Root + nameof(Models.Instance);
30 
34  public const string Byond = Root + nameof(Models.Byond);
35 
39  public const string Repository = Root + nameof(Models.Repository);
40 
44  public const string DreamDaemon = Root + nameof(Models.DreamDaemon);
45 
49  public const string Configuration = Root + "Config";
50 
54  public const string File = "File";
55 
59  public const string ConfigurationFile = Configuration + "/" + File;
60 
64  public const string InstanceUser = Root + nameof(Models.InstanceUser);
65 
69  public const string Chat = Root + "Chat";
70 
74  public const string DreamMaker = Root + nameof(Models.DreamMaker);
75 
79  public const string Jobs = Root + nameof(Models.Job);
80 
87  public static string SetID(string route, long id) => String.Format(CultureInfo.InvariantCulture, "{0}/{1}", route, id);
88 
94  public static string List(string route) => String.Format(CultureInfo.InvariantCulture, "{0}/List", route);
95  }
96 }
const string Byond
The Models.Byond controller
Definition: Routes.cs:34
+
const string Configuration
The Models.ConfigurationFile controller
Definition: Routes.cs:49
+
const string User
The Models.User controller
Definition: Routes.cs:24
+ +
const string InstanceUser
The Models.InstanceUser controller
Definition: Routes.cs:64
+
const string File
To be paired with Configuration for accessing Models.ConfigurationFiles
Definition: Routes.cs:54
+
const string Administration
The Models.Administration controller
Definition: Routes.cs:19
+
Routes to a server actions
Definition: Routes.cs:9
+
const string Repository
The Models.Repository controller
Definition: Routes.cs:39
+
const string Chat
The Models.ChatBot controller
Definition: Routes.cs:69
+
const string DreamMaker
The Models.DreamMaker controller
Definition: Routes.cs:74
+
const string Root
The root controller
Definition: Routes.cs:14
+
const string Jobs
The Models.Job controller
Definition: Routes.cs:79
+
const string DreamDaemon
The Models.DreamDaemon controller
Definition: Routes.cs:44
+
const string InstanceManager
The Models.Instance controller
Definition: Routes.cs:29
+
static string SetID(string route, long id)
Apply an id postfix to a route
+
static string List(string route)
Get the /List postfix for a route
+
const string ConfigurationFile
Full combination of Configuration and File
Definition: Routes.cs:59
+
+ + + + diff --git a/_semaphore_slim_context_8cs.html b/_semaphore_slim_context_8cs.html new file mode 100644 index 0000000000..54ddde86db --- /dev/null +++ b/_semaphore_slim_context_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/SemaphoreSlimContext.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
SemaphoreSlimContext.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Core.SemaphoreSlimContext
 Async lock context helper More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_semaphore_slim_context_8cs_source.html b/_semaphore_slim_context_8cs_source.html new file mode 100644 index 0000000000..a360b72c42 --- /dev/null +++ b/_semaphore_slim_context_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/SemaphoreSlimContext.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
SemaphoreSlimContext.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4 
6 {
10  public sealed class SemaphoreSlimContext : IDisposable
11  {
18  public static async Task<SemaphoreSlimContext> Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
19  {
20  if (semaphore == null)
21  throw new ArgumentNullException(nameof(semaphore));
22  await semaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
23  cancellationToken.ThrowIfCancellationRequested();
24  return new SemaphoreSlimContext(semaphore);
25  }
26 
30  readonly SemaphoreSlim lockedSemaphore;
31 
35  bool disposed;
36 
42  {
43  this.lockedSemaphore = lockedSemaphore;
44  }
45 
49 #pragma warning disable CA1821 // Remove empty Finalizers //TODO remove this when https://github.com/dotnet/roslyn-analyzers/issues/1241 is fixed
51 #pragma warning restore CA1821 // Remove empty Finalizers
52 
56  public void Dispose()
57  {
58  lock (this)
59  {
60  if (disposed)
61  return;
62  disposed = true;
63  }
64 
65  GC.SuppressFinalize(this);
66  lockedSemaphore.Release();
67  }
68  }
69 }
~SemaphoreSlimContext()
Finalizes an instance of the SemaphoreSlimContext class.
+
readonly SemaphoreSlim lockedSemaphore
The locked SemaphoreSlim
+
SemaphoreSlimContext(SemaphoreSlim lockedSemaphore)
Construct a SemaphoreSlimContext
+ + +
void Dispose()
Release the lock on lockedSemaphore
+ +
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+ + + + diff --git a/_server_8cs.html b/_server_8cs.html new file mode 100644 index 0000000000..b8f0c54059 --- /dev/null +++ b/_server_8cs.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Server.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Server.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Server
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
+
+ + + + diff --git a/_server_8cs_source.html b/_server_8cs_source.html new file mode 100644 index 0000000000..6fc7d514a7 --- /dev/null +++ b/_server_8cs_source.html @@ -0,0 +1,119 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Server.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Server.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Hosting;
2 using Microsoft.Extensions.DependencyInjection;
3 using Microsoft.Extensions.Logging;
4 using Microsoft.Extensions.Options;
5 using System;
6 using System.Collections.Generic;
7 using System.IO;
8 using System.Linq;
9 using System.Threading;
10 using System.Threading.Tasks;
13 using Tgstation.Server.Host.IO;
14 
15 namespace Tgstation.Server.Host
16 {
18 #pragma warning disable CA1001 // Types that own disposable fields should be disposable
19  sealed class Server : IServer, IServerControl
20 #pragma warning restore CA1001 // Types that own disposable fields should be disposable
21  {
23  public bool RestartRequested { get; private set; }
24 
26  public bool WatchdogPresent => updatePath != null;
27 
31  readonly IWebHostBuilder webHostBuilder;
32 
36  readonly List<IRestartHandler> restartHandlers;
37 
41  readonly string updatePath;
42 
46  ILogger<Server> logger;
47 
52 
56  CancellationTokenSource cancellationTokenSource;
57 
62 
66  bool updating;
67 
73  public Server(IWebHostBuilder webHostBuilder, string updatePath)
74  {
75  this.webHostBuilder = webHostBuilder ?? throw new ArgumentNullException(nameof(webHostBuilder));
76  this.updatePath = updatePath;
77 
78  webHostBuilder.ConfigureServices(serviceCollection => serviceCollection.AddSingleton<IServerControl>(this));
79 
80  restartHandlers = new List<IRestartHandler>();
81  }
82 
87  void CheckSanity(bool checkWatchdog)
88  {
89  if (checkWatchdog && !WatchdogPresent && propagatedException == null)
90  throw new InvalidOperationException("Server restarts are not supported");
91 
92  if (cancellationTokenSource == null || logger == null)
93  throw new InvalidOperationException("Tried to control a non-running Server!");
94  }
95 
100  {
101  if (propagatedException != null)
102  throw propagatedException;
103  }
104 
106  public async Task RunAsync(CancellationToken cancellationToken)
107  {
108  using (cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken))
109  using (var fsWatcher = updatePath != null ? new FileSystemWatcher(Path.GetDirectoryName(updatePath)) : null)
110  {
111  if (fsWatcher != null)
112  {
113  fsWatcher.Created += (a, b) =>
114  {
115  if (b.FullPath == updatePath && File.Exists(b.FullPath))
116  cancellationTokenSource.Cancel();
117  };
118  fsWatcher.EnableRaisingEvents = true;
119  }
120 
121  using (var webHost = webHostBuilder.Build())
122  try
123  {
124  logger = webHost.Services.GetRequiredService<ILogger<Server>>();
125  var generalConfigurationOptions = webHost.Services.GetRequiredService<IOptions<GeneralConfiguration>>();
126  generalConfiguration = generalConfigurationOptions.Value;
127  await webHost.RunAsync(cancellationTokenSource.Token).ConfigureAwait(false);
128  }
129  catch (OperationCanceledException)
130  {
132  throw;
133  }
134  }
135 
137  }
138 
140  public bool ApplyUpdate(Version version, Uri updateZipUrl, IIOManager ioManager)
141  {
142  if (version == null)
143  throw new ArgumentNullException(nameof(version));
144  if (updateZipUrl == null)
145  throw new ArgumentNullException(nameof(updateZipUrl));
146  if (ioManager == null)
147  throw new ArgumentNullException(nameof(ioManager));
148 
149  CheckSanity(true);
150 
151  logger.LogTrace("Begin ApplyUpdate...");
152 
153  lock (this)
154  {
155  if (updating || RestartRequested)
156  {
157  logger.LogTrace("Aborted due to concurrency conflict!");
158  return false;
159  }
160 
161  updating = true;
162  }
163 
164  async void RunUpdate()
165  {
166  try
167  {
168  logger.LogInformation("Updating server to version {0} ({1})...", version, updateZipUrl);
169 
170  if (cancellationTokenSource == null)
171  throw new InvalidOperationException("Tried to update a non-running Server!");
172  var cancellationToken = cancellationTokenSource.Token;
173 
174  logger.LogTrace("Downloading zip package...");
175  var updateZipData = await ioManager.DownloadFile(updateZipUrl, cancellationToken).ConfigureAwait(false);
176 
177  try
178  {
179  logger.LogTrace("Exctracting zip package to {0}...", updatePath);
180  await ioManager.ZipToDirectory(updatePath, updateZipData, cancellationToken).ConfigureAwait(false);
181  }
182  catch (Exception e)
183  {
184  updating = false;
185  try
186  {
187  // important to not leave this directory around if possible
188  await ioManager.DeleteDirectory(updatePath, default).ConfigureAwait(false);
189  }
190  catch (Exception e2)
191  {
192  throw new AggregateException(e, e2);
193  }
194 
195  throw;
196  }
197 
198  await Restart(version, null).ConfigureAwait(false);
199  }
200  catch (OperationCanceledException)
201  {
202  logger.LogInformation("Server update cancelled!");
203  }
204  catch (Exception e)
205  {
206  logger.LogError("Error updating server! Exception: {0}", e);
207  }
208  finally
209  {
210  updating = false;
211  }
212  }
213 
214  RunUpdate();
215  return true;
216  }
217 
220  {
221  if (handler == null)
222  throw new ArgumentNullException(nameof(handler));
223 
224  CheckSanity(false);
225 
226  lock (this)
227  if (!RestartRequested)
228  {
229  logger.LogTrace("Registering restart handler {0}...", handler);
230  restartHandlers.Add(handler);
231  return new RestartRegistration(() =>
232  {
233  lock (this)
234  if (!RestartRequested)
235  restartHandlers.Remove(handler);
236  });
237  }
238 
239  return new RestartRegistration(() => { });
240  }
241 
243  public Task Restart() => Restart(null, null);
244 
251  async Task Restart(Version newVersion, Exception exception)
252  {
253  CheckSanity(true);
254 
255  logger.LogTrace("Begin Restart...");
256 
257  lock (this)
258  {
259  if ((updating && newVersion == null) || RestartRequested)
260  {
261  logger.LogTrace("Aborted due to concurrency conflict!");
262  return;
263  }
264 
265  RestartRequested = true;
266  propagatedException = exception;
267  }
268 
269  if (exception == null)
270  using (var cts = new CancellationTokenSource())
271  {
272  logger.LogInformation("Restarting server...");
273  var cancellationToken = cts.Token;
274  var eventsTask = Task.WhenAll(restartHandlers.Select(x => x.HandleRestart(newVersion, cancellationToken)).ToList());
275 
276  var expiryTask = Task.Delay(TimeSpan.FromMilliseconds(generalConfiguration.RestartTimeout));
277  await Task.WhenAny(eventsTask, expiryTask).ConfigureAwait(false);
278  logger.LogTrace("Joining restart handlers...");
279  cts.Cancel();
280  try
281  {
282  await eventsTask.ConfigureAwait(false);
283  }
284  catch (OperationCanceledException) { }
285  catch (Exception e)
286  {
287  logger.LogError("Restart handlers error! Exception: {0}", e);
288  }
289  }
290 
291  logger.LogTrace("Stopping host...");
292  cancellationTokenSource.Cancel();
293  }
294 
296  public Task Die(Exception exception) => Restart(null, exception);
297  }
298 }
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
ILogger< Server > logger
The ILogger for the Server
Definition: Server.cs:46
+ +
async Task RunAsync(CancellationToken cancellationToken)
Runs the IServer
Definition: Server.cs:106
+
bool ApplyUpdate(Version version, Uri updateZipUrl, IIOManager ioManager)
Run a new Host assembly and stop the current one. This will likely trigger all active CancellationTok...
Definition: Server.cs:140
+
readonly List< IRestartHandler > restartHandlers
The IRestartHandlers to run when the Server restarts
Definition: Server.cs:36
+
async Task Restart(Version newVersion, Exception exception)
Implements Restart()
Definition: Server.cs:251
+
Task< byte[]> DownloadFile(Uri url, CancellationToken cancellationToken)
Downloads a file from url
+
IRestartRegistration RegisterForRestart(IRestartHandler handler)
Register a given handler to run before stopping the server for a restart
Definition: Server.cs:219
+
Task ZipToDirectory(string path, byte[] zipFileBytes, CancellationToken cancellationToken)
Extract a set of zipFileBytes to a given path
+ + +
GeneralConfiguration generalConfiguration
The GeneralConfiguration for the Server
Definition: Server.cs:51
+ +
int RestartTimeout
The timeout milliseconds for restarting the server
+ +
void CheckExceptionPropagation()
Re-throw propagatedException if it exists
Definition: Server.cs:99
+
readonly string updatePath
The absolute path to install updates to
Definition: Server.cs:41
+
Represents the host
Definition: IServer.cs:9
+ +
Task Die(Exception exception)
Kill the server with a fatal exception
+
Server(IWebHostBuilder webHostBuilder, string updatePath)
Construct a Server
Definition: Server.cs:73
+
CancellationTokenSource cancellationTokenSource
The cancellationTokenSource for the Server
Definition: Server.cs:56
+
Task Restart()
Restarts the Host
+ +
bool updating
If a server update has been or is being applied
Definition: Server.cs:66
+
Exception propagatedException
The Exception to propagate when the server terminates
Definition: Server.cs:61
+ + +
Interface for using filesystems
Definition: IIOManager.cs:11
+
Represents the lifetime of a IRestartHandler registration
+ +
readonly IWebHostBuilder webHostBuilder
The IWebHostBuilder for the Server
Definition: Server.cs:31
+ +
Represents a service that may take an updated Host assembly and run it, stopping the current assembly...
+
void CheckSanity(bool checkWatchdog)
Throws an InvalidOperationException if the IServerControl cannot be used
Definition: Server.cs:87
+ +
+ + + + diff --git a/_server_client_8cs.html b/_server_client_8cs.html new file mode 100644 index 0000000000..85fcf07761 --- /dev/null +++ b/_server_client_8cs.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/ServerClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ServerClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Client.ServerClient
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_server_client_8cs_source.html b/_server_client_8cs_source.html new file mode 100644 index 0000000000..4beb7e31d1 --- /dev/null +++ b/_server_client_8cs_source.html @@ -0,0 +1,120 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/ServerClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ServerClient.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4 using Tgstation.Server.Api;
6 
8 {
10  sealed class ServerClient : IServerClient
11  {
13  public Uri Url => apiClient.Url;
14 
16  public Token Token
17  {
18  get => token;
19  set
20  {
21  token = value ?? throw new InvalidOperationException("Cannot set a null Token!");
23  }
24  }
25 
27  public TimeSpan Timeout
28  {
29  get => apiClient.Timeout;
30  set => apiClient.Timeout = value;
31  }
32 
35 
38 
40  public IUsersClient Users { get; }
41 
46 
51 
58  {
59  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
60  this.token = token ?? throw new ArgumentNullException(nameof(token));
61 
63  throw new ArgumentOutOfRangeException(nameof(token), token, "Provided token does not match apiClient headers!");
64 
68  }
69 
71  public void Dispose() => apiClient.Dispose();
72 
74  public Task<ServerInformation> Version(CancellationToken cancellationToken) => apiClient.Read<ServerInformation>(Routes.Root, cancellationToken);
75 
77  public void AddRequestLogger(IRequestLogger requestLogger) => apiClient.AddRequestLogger(requestLogger);
78  }
79 }
+ +
ServerClient(IApiClient apiClient, Token token)
Construct a ServerClient
Definition: ServerClient.cs:57
+ +
ApiHeaders Headers
The ApiHeaders the IApiClient uses
Definition: IApiClient.cs:16
+ +
Token token
Backing field for Token
Definition: ServerClient.cs:50
+ + +
TimeSpan Timeout
The request timeout
Definition: IApiClient.cs:26
+ +
Task< ServerInformation > Version(CancellationToken cancellationToken)
The ServerInformation of the IServerClient
+
ProductHeaderValue UserAgent
The client's user agent as a ProductHeaderValue if valid
Definition: ApiHeaders.cs:66
+ +
readonly IApiClient apiClient
The IApiClient for the ServerClient
Definition: ServerClient.cs:45
+
Represents basic server information
+
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
Represents administrative server information
+
Routes to a server actions
Definition: Routes.cs:9
+ +
Main client for communicating with a server
+ + +
const string Root
The root controller
Definition: Routes.cs:14
+
Represents a JWT returned by the API
Definition: Token.cs:8
+ +
For logging HTTP requests and responses
+ +
Uri Url
The Uri pointing the tgstation-server
Definition: IApiClient.cs:21
+
void AddRequestLogger(IRequestLogger requestLogger)
Adds a requestLogger to the request pipeline
+ +
Web interface for the API
Definition: IApiClient.cs:11
+
string Token
The client's JWT
Definition: ApiHeaders.cs:81
+ +
string Bearer
The value of the JWT
Definition: Token.cs:13
+
IInstanceManagerClient Instances
Definition: ServerClient.cs:34
+
void AddRequestLogger(IRequestLogger requestLogger)
Adds a requestLogger to the request pipeline
+ +
+ + + + diff --git a/_server_client_factory_8cs.html b/_server_client_factory_8cs.html new file mode 100644 index 0000000000..3681e670bc --- /dev/null +++ b/_server_client_factory_8cs.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/ServerClientFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ServerClientFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Client.ServerClientFactory
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_server_client_factory_8cs_source.html b/_server_client_factory_8cs_source.html new file mode 100644 index 0000000000..c8cb6e938f --- /dev/null +++ b/_server_client_factory_8cs_source.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/ServerClientFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ServerClientFactory.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Net.Http.Headers;
3 using System.Threading;
4 using System.Threading.Tasks;
5 using Tgstation.Server.Api;
7 
9 {
12  {
17 
21  readonly ProductHeaderValue productHeaderValue;
22 
27  public ServerClientFactory(ProductHeaderValue productHeaderValue)
28  {
29  this.productHeaderValue = productHeaderValue ?? throw new ArgumentNullException(nameof(productHeaderValue));
30  }
31 
33  public async Task<IServerClient> CreateServerClient(Uri host, string username, string password, TimeSpan timeout, CancellationToken cancellationToken)
34  {
35  if (host == null)
36  throw new ArgumentNullException(nameof(host));
37  if (username == null)
38  throw new ArgumentNullException(nameof(username));
39  if (password == null)
40  throw new ArgumentNullException(nameof(password));
41 
42  Token token;
43  using (var api = ApiClientFactory.CreateApiClient(host, new ApiHeaders(productHeaderValue, username, password)))
44  {
45  if (timeout != default)
46  api.Timeout = timeout;
47  token = await api.Update<Token>(Routes.Root, cancellationToken).ConfigureAwait(false);
48  }
49 
50  return CreateServerClient(host, token, timeout);
51  }
52 
54  public IServerClient CreateServerClient(Uri host, Token token, TimeSpan timeout)
55  {
56  if (host == null)
57  throw new ArgumentNullException(nameof(host));
58  if (token == null)
59  throw new ArgumentNullException(nameof(token));
60  var result = new ServerClient(ApiClientFactory.CreateApiClient(host, new ApiHeaders(productHeaderValue, token.Bearer)), token);
61  if (timeout != default)
62  result.Timeout = timeout;
63  return result;
64  }
65  }
66 }
+ + + +
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
Routes to a server actions
Definition: Routes.cs:9
+ +
Main client for communicating with a server
+
IApiClient CreateApiClient(Uri url, ApiHeaders apiHeaders)
Create an IApiClient
+
const string Root
The root controller
Definition: Routes.cs:14
+
Represents a JWT returned by the API
Definition: Token.cs:8
+
Factory for creating IServerClients
+ + +
readonly ProductHeaderValue productHeaderValue
The ProductHeaderValue for the ServerClientFactory
+
static readonly IApiClientFactory ApiClientFactory
The IApiClientFactory for the ServerClientFactory
+ +
async Task< IServerClient > CreateServerClient(Uri host, string username, string password, TimeSpan timeout, CancellationToken cancellationToken)
Create a IServerClient
+
IServerClient CreateServerClient(Uri host, Token token, TimeSpan timeout)
Create a IServerClient
+ +
string Bearer
The value of the JWT
Definition: Token.cs:13
+
ServerClientFactory(ProductHeaderValue productHeaderValue)
Construct a ServerClientFactory
+ +
+ + + + diff --git a/_server_error_exception_8cs.html b/_server_error_exception_8cs.html new file mode 100644 index 0000000000..465291faae --- /dev/null +++ b/_server_error_exception_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/ServerErrorException.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ServerErrorException.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Client.ServerErrorException
 Occurs when an error occurs in the server More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_server_error_exception_8cs_source.html b/_server_error_exception_8cs_source.html new file mode 100644 index 0000000000..5392c4cd22 --- /dev/null +++ b/_server_error_exception_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/ServerErrorException.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ServerErrorException.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Net;
4 
6 {
10  public sealed class ServerErrorException : ClientException
11  {
15  public string Html { get; }
16 
20  public ServerErrorException() { }
21 
26  public ServerErrorException(string html) : base(new ErrorMessage
27  {
28  Message = "An internal server error occurred!",
29  SeverApiVersion = null
30  }, HttpStatusCode.InternalServerError)
31  {
32  Html = html;
33  }
34 
40  public ServerErrorException(string message, Exception innerException) : base(message, innerException) { }
41  }
42 }
+
ServerErrorException(string message, Exception innerException)
Construct an ServerErrorException with a message and innerException
+ +
Occurs when an error occurs in the server
+ + + +
ServerErrorException(string html)
Construct an ServerErrorException with html
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
ServerErrorException()
Construct an ServerErrorException
+ +
Exceptions thrown by IServerClients
+
+ + + + diff --git a/_server_factory_8cs.html b/_server_factory_8cs.html new file mode 100644 index 0000000000..dfe2bf72f4 --- /dev/null +++ b/_server_factory_8cs.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/ServerFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ServerFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.ServerFactory
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
+
+ + + + diff --git a/_server_factory_8cs_source.html b/_server_factory_8cs_source.html new file mode 100644 index 0000000000..fd59d292f1 --- /dev/null +++ b/_server_factory_8cs_source.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/ServerFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ServerFactory.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore;
2 using Microsoft.AspNetCore.Hosting;
3 using Microsoft.Extensions.Configuration;
4 using System;
5 using System.IO;
6 using System.Reflection;
8 
9 namespace Tgstation.Server.Host
10 {
12  public sealed class ServerFactory : IServerFactory
13  {
15  public IServer CreateServer(string[] args, string updatePath)
16  {
17  var webHost = WebHost.CreateDefaultBuilder(args ?? throw new ArgumentNullException(nameof(args)))
18  .ConfigureAppConfiguration((context, configurationBuilder) => configurationBuilder.SetBasePath(Directory.GetCurrentDirectory()))
19  .UseStartup<Application>()
20  .SuppressStatusMessages(true)
21  .UseShutdownTimeout(TimeSpan.FromMinutes(1));
22 
23  if(updatePath != null)
24  webHost.UseContentRoot(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
25 
26  return new Server(webHost, updatePath);
27  }
28  }
29 }
+ + + +
Represents the host
Definition: IServer.cs:9
+
IServer CreateServer(string[] args, string updatePath)
Create a IServer
+ + + + +
+ + + + diff --git a/_server_information_8cs.html b/_server_information_8cs.html new file mode 100644 index 0000000000..942cc82639 --- /dev/null +++ b/_server_information_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/ServerInformation.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ServerInformation.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.ServerInformation
 Represents basic server information More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + diff --git a/_server_information_8cs_source.html b/_server_information_8cs_source.html new file mode 100644 index 0000000000..5cf3371b92 --- /dev/null +++ b/_server_information_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/ServerInformation.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ServerInformation.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
8  public sealed class ServerInformation
9  {
13  public Version Version { get; set; }
14 
18  public Version ApiVersion { get; set; }
19  }
20 }
+ +
Represents basic server information
+
Version ApiVersion
The Api version of the host
+
+ + + + diff --git a/_server_service_8cs.html b/_server_service_8cs.html new file mode 100644 index 0000000000..1bcc9e1f33 --- /dev/null +++ b/_server_service_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Service/ServerService.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ServerService.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Service.ServerService
 Represents a IWatchdog as a ServiceBase More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Service
 
+
+ + + + diff --git a/_server_service_8cs_source.html b/_server_service_8cs_source.html new file mode 100644 index 0000000000..a65d3fe388 --- /dev/null +++ b/_server_service_8cs_source.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Service/ServerService.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ServerService.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using Microsoft.Extensions.Logging.EventLog;
3 using System;
4 using System.Diagnostics;
5 using System.Globalization;
6 using System.ServiceProcess;
7 using System.Threading;
8 using System.Threading.Tasks;
10 
12 {
16  sealed class ServerService : ServiceBase
17  {
21  public const string Name = "tgstation-server-4";
22 
26  readonly IWatchdog watchdog;
27 
32 
36  CancellationTokenSource cancellationTokenSource;
37 
44  public ServerService(IWatchdogFactory watchdogFactory, ILoggerFactory loggerFactory, LogLevel minumumLogLevel)
45  {
46  if (watchdogFactory == null)
47  throw new ArgumentNullException(nameof(watchdogFactory));
48  if (loggerFactory == null)
49  throw new ArgumentNullException(nameof(loggerFactory));
50 
51 #pragma warning disable CS0618 // Type or member is obsolete
52  loggerFactory.AddEventLog(new EventLogSettings
53  {
54  LogName = EventLog.Log,
55  MachineName = EventLog.MachineName,
56  SourceName = EventLog.Source,
57  Filter = (message, logLevel) => logLevel >= minumumLogLevel
58  });
59 #pragma warning restore CS0618 // Type or member is obsolete
60 
61  ServiceName = Name;
62  watchdog = watchdogFactory.CreateWatchdog(loggerFactory);
63  }
64 
71  async Task RunWatchdog(string[] args, CancellationToken cancellationToken)
72  {
73  await watchdog.RunAsync(false, args, cancellationTokenSource.Token).ConfigureAwait(false);
74 
75  void StopServiceAsync()
76  {
77  try
78  {
79  Task.Run(Stop, cancellationToken);
80  }
81  catch (OperationCanceledException) { }
82  catch (Exception e)
83  {
84  EventLog.WriteEntry(String.Format(CultureInfo.InvariantCulture, "Error stopping service! Exception: {0}", e));
85  }
86  }
87 
88  StopServiceAsync();
89  }
90 
92  protected override void Dispose(bool disposing)
93  {
94  cancellationTokenSource?.Dispose();
95  base.Dispose(disposing);
96  }
97 
99  protected override void OnStart(string[] args)
100  {
101  cancellationTokenSource?.Dispose();
102  cancellationTokenSource = new CancellationTokenSource();
104  }
105 
107  protected override void OnStop()
108  {
109  cancellationTokenSource.Cancel();
110  watchdogTask.GetAwaiter().GetResult();
111  }
112  }
113 }
async Task RunWatchdog(string[] args, CancellationToken cancellationToken)
Executes the watchdog, stopping the service if it exits
+
IWatchdog CreateWatchdog(ILoggerFactory loggerFactory)
Create a IWatchdog
+
override void OnStart(string[] args)
+
Task watchdogTask
The Task recieved from IWatchdog.RunAsync(bool, string[], CancellationToken) of watchdog
+
override void Dispose(bool disposing)
+
ServerService(IWatchdogFactory watchdogFactory, ILoggerFactory loggerFactory, LogLevel minumumLogLevel)
Construct a ServerService
+ + +
Task RunAsync(bool runConfigure, string[] args, CancellationToken cancellationToken)
Run the IWatchdog
+ + +
readonly IWatchdog watchdog
The IWatchdog for the ServerService
+
const string Name
The canonical windows service name
+ +
Represents a IWatchdog as a ServiceBase
+ + + + +
CancellationTokenSource cancellationTokenSource
The cancellationTokenSource for the ServerService
+
+ + + + diff --git a/_server_side_modifications_8cs.html b/_server_side_modifications_8cs.html new file mode 100644 index 0000000000..1d3d3fa212 --- /dev/null +++ b/_server_side_modifications_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/StaticFiles/ServerSideModifications.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ServerSideModifications.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.StaticFiles.ServerSideModifications
 Represents code modifications via configuration More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.StaticFiles
 
+
+ + + + diff --git a/_server_side_modifications_8cs_source.html b/_server_side_modifications_8cs_source.html new file mode 100644 index 0000000000..3f002360c8 --- /dev/null +++ b/_server_side_modifications_8cs_source.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/StaticFiles/ServerSideModifications.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ServerSideModifications.cs
+
+
+Go to the documentation of this file.
2 {
6  public sealed class ServerSideModifications
7  {
11  public bool TotalDmeOverwrite { get; }
12 
16  public string HeadIncludeLine { get; }
17 
21  public string TailIncludeLine { get; }
22 
29  public ServerSideModifications(string headIncludeLine, string tailIncludeLine, bool totalDmeOverwrite)
30  {
31  HeadIncludeLine = headIncludeLine;
32  TailIncludeLine = tailIncludeLine;
33  TotalDmeOverwrite = totalDmeOverwrite;
34  }
35  }
36 }
bool TotalDmeOverwrite
If the target dme was completely overwitten
+
ServerSideModifications(string headIncludeLine, string tailIncludeLine, bool totalDmeOverwrite)
Construct ServerSideModifications
+
string TailIncludeLine
The #include line which should be added to the end of the .dme if any
+ + +
string HeadIncludeLine
The #include line which should be added to the beginning of the .dme if any
+
+ + + + diff --git a/_service_collection_extensions_8cs.html b/_service_collection_extensions_8cs.html new file mode 100644 index 0000000000..f14b107b2f --- /dev/null +++ b/_service_collection_extensions_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/ServiceCollectionExtensions.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ServiceCollectionExtensions.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Core.ServiceCollectionExtensions
 Extensions for IServiceCollection More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_service_collection_extensions_8cs_source.html b/_service_collection_extensions_8cs_source.html new file mode 100644 index 0000000000..3da56da43d --- /dev/null +++ b/_service_collection_extensions_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/ServiceCollectionExtensions.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ServiceCollectionExtensions.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Configuration;
2 using Microsoft.Extensions.DependencyInjection;
3 using System;
4 using System.Globalization;
6 
8 {
13  {
21  public static IServiceCollection UseStandardConfig<TConfig>(this IServiceCollection serviceCollection, IConfiguration configuration) where TConfig : class
22  {
23  if (serviceCollection == null)
24  throw new ArgumentNullException(nameof(serviceCollection));
25  if (configuration == null)
26  throw new ArgumentNullException(nameof(configuration));
27 
28  const string SectionFieldName = nameof(GeneralConfiguration.Section);
29 
30  var configType = typeof(TConfig);
31  var sectionField = configType.GetField(SectionFieldName);
32  if (sectionField == null)
33  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "{0} has no {1} field!", configType, SectionFieldName));
34 
35  var stringType = typeof(string);
36  if (sectionField.FieldType != stringType)
37  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "{0} has invalid {1} field type, must be {2}!", configType, SectionFieldName, stringType));
38 
39  var sectionName = (string)sectionField.GetValue(null);
40 
41  return serviceCollection.Configure<TConfig>(configuration.GetSection(sectionName));
42  }
43  }
44 }
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the GeneralConfiguration res...
+ + + + +
static IServiceCollection UseStandardConfig< TConfig >(this IServiceCollection serviceCollection, IConfiguration configuration)
Add a standard TConfig binding
+ + + +
+ + + + diff --git a/_service_unavailable_exception_8cs.html b/_service_unavailable_exception_8cs.html new file mode 100644 index 0000000000..b0410f4f03 --- /dev/null +++ b/_service_unavailable_exception_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/ServiceUnavailableException.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ServiceUnavailableException.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Client.ServiceUnavailableException
 Occurs when the client makes a request while the server is starting or stopping More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_service_unavailable_exception_8cs_source.html b/_service_unavailable_exception_8cs_source.html new file mode 100644 index 0000000000..b9b44ed508 --- /dev/null +++ b/_service_unavailable_exception_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/ServiceUnavailableException.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ServiceUnavailableException.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Net;
4 
6 {
11  {
16  {
17  Message = "The server is currently starting or stopping and is unable to process the request!",
18  SeverApiVersion = null
19  }, HttpStatusCode.ServiceUnavailable)
20  { }
21 
26  public ServiceUnavailableException(string message) : base(message) { }
27 
33  public ServiceUnavailableException(string message, Exception innerException) : base(message, innerException) { }
34  }
35 }
+ + +
Occurs when the client makes a request while the server is starting or stopping
+
ServiceUnavailableException(string message)
Construct an ServiceUnavailableException with a message
+
ServiceUnavailableException(string message, Exception innerException)
Construct an ServiceUnavailableException with a message and innerException
+ +
ServiceUnavailableException()
Construct an ServiceUnavailableException
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
Exceptions thrown by IServerClients
+
+ + + + diff --git a/_session_controller_8cs.html b/_session_controller_8cs.html new file mode 100644 index 0000000000..197b59ea19 --- /dev/null +++ b/_session_controller_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/SessionController.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
SessionController.cs File Reference
+
+ + + + + diff --git a/_session_controller_8cs_source.html b/_session_controller_8cs_source.html new file mode 100644 index 0000000000..04e47be469 --- /dev/null +++ b/_session_controller_8cs_source.html @@ -0,0 +1,177 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/SessionController.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
SessionController.cs
+
+
+Go to the documentation of this file.
1 using Byond.TopicSender;
2 using Microsoft.Extensions.Logging;
3 using Newtonsoft.Json;
4 using Newtonsoft.Json.Serialization;
5 using System;
6 using System.Collections.Generic;
7 using System.Globalization;
8 using System.Net;
9 using System.Threading;
10 using System.Threading.Tasks;
16 
18 {
21  {
23  public bool IsPrimary
24  {
25  get
26  {
27  CheckDisposed();
29  }
30  }
31 
34  {
35  get
36  {
37  if (!Lifetime.IsCompleted)
38  throw new InvalidOperationException("ApiValidated cannot be checked while Lifetime is incomplete!");
39  return apiValidationStatus;
40  }
41  }
42 
44  public IDmbProvider Dmb
45  {
46  get
47  {
48  CheckDisposed();
49  return reattachInformation.Dmb;
50  }
51  }
52 
54  public ushort? Port
55  {
56  get
57  {
58  CheckDisposed();
60  return null;
62  }
63  }
64 
67  {
68  get
69  {
70  CheckDisposed();
72  }
73  }
74 
76  public bool ClosePortOnReboot { get; set; }
77 
79  public bool TerminationWasRequested { get; private set; }
80 
82  public Task<LaunchResult> LaunchResult { get; }
83 
85  public Task<int> Lifetime => process.Lifetime;
86 
88  public Task OnReboot => rebootTcs.Task;
89 
94 
98  readonly IByondTopicSender byondTopicSender;
99 
104 
108  readonly IProcess process;
109 
114 
119 
123  readonly IChat chat;
124 
128  readonly ILogger<SessionController> logger;
129 
134 
138  TaskCompletionSource<bool> portAssignmentTcs;
139 
143  ushort? nextPort;
144 
148  TaskCompletionSource<object> rebootTcs;
149 
154 
158  bool disposed;
159 
164 
168  bool released;
169 
184  {
185  this.chatJsonTrackingContext = chatJsonTrackingContext; // null valid
186  this.reattachInformation = reattachInformation ?? throw new ArgumentNullException(nameof(reattachInformation));
187  this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
188  this.process = process ?? throw new ArgumentNullException(nameof(process));
189  this.byondLock = byondLock ?? throw new ArgumentNullException(nameof(byondLock));
190  this.interopContext = interopContext ?? throw new ArgumentNullException(nameof(interopContext));
191  this.chat = chat ?? throw new ArgumentNullException(nameof(chat));
192  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
193 
194  this.launchSecurityLevel = launchSecurityLevel;
195 
197 
198  portClosedForReboot = false;
199  disposed = false;
200  apiValidationStatus = ApiValidationStatus.NeverValidated;
201  released = false;
202 
203  rebootTcs = new TaskCompletionSource<object>();
204 
205  process.Lifetime.ContinueWith(x => chatJsonTrackingContext.Active = false, TaskScheduler.Current);
206 
207  async Task<LaunchResult> GetLaunchResult()
208  {
209  var startTime = DateTimeOffset.Now;
210  Task toAwait = process.Startup;
211 
212  if (startupTimeout.HasValue)
213  toAwait = Task.WhenAny(process.Startup, Task.Delay(startTime.AddSeconds(startupTimeout.Value) - startTime));
214 
215  await toAwait.ConfigureAwait(false);
216 
217  var result = new LaunchResult
218  {
219  ExitCode = process.Lifetime.IsCompleted ? (int?)await process.Lifetime.ConfigureAwait(false) : null,
220  StartupTime = process.Startup.IsCompleted ? (TimeSpan?)(DateTimeOffset.Now - startTime) : null
221  };
222  return result;
223  }
224 
225  LaunchResult = GetLaunchResult();
226 
227  logger.LogDebug("Created session controller. Primary: {0}, CommsKey: {1}, Port: {2}", IsPrimary, reattachInformation.AccessIdentifier, Port);
228  }
229 
234 #pragma warning disable CA1821 // Remove empty Finalizers TODO: remove this when https://github.com/dotnet/roslyn-analyzers/issues/1241 is fixed
235  ~SessionController() => Dispose(false);
236 #pragma warning restore CA1821 // Remove empty Finalizers
237 
239  public void Dispose()
240  {
241  Dispose(true);
242  GC.SuppressFinalize(this);
243  }
244 
249  void Dispose(bool disposing)
250  {
251  lock (this)
252  {
253  if (disposed)
254  return;
255  if (disposing)
256  {
257  if (!released)
258  {
259  process.Terminate();
260  byondLock.Dispose();
261  }
262 
263  process.Dispose();
264  interopContext.Dispose();
265  Dmb?.Dispose(); // will be null when released
266  chatJsonTrackingContext.Dispose();
267  disposed = true;
268  }
269  else
270  {
271  if (logger != null)
272  logger.LogError("Being disposed via finalizer!");
273  if (!released)
274  if (process != null)
275  process.Terminate();
276  else if (logger != null)
277  logger.LogCritical("Unable to terminate active DreamDaemon session due to finalizer ordering!");
278  }
279  }
280  }
281 
283  #pragma warning disable CA1502 // TODO: Decomplexify
284  public async Task HandleInterop(CommCommand command, CancellationToken cancellationToken)
285  {
286  if (command == null)
287  throw new ArgumentNullException(nameof(command));
288 
289  var query = command.Parameters;
290 
291  object content;
292  Action postRespond = null;
293  ushort? overrideResponsePort = null;
294  if (query.TryGetValue(Constants.DMParameterCommand, out var method))
295  {
296  content = new object();
297  switch (method)
298  {
300  try
301  {
302  var message = JsonConvert.DeserializeObject<Response>(command.RawJson, new JsonSerializerSettings
303  {
304  ContractResolver = new CamelCasePropertyNamesContractResolver()
305  });
306  if (message.ChannelIds == null)
307  throw new InvalidOperationException("Missing ChannelIds field!");
308  if (message.Message == null)
309  throw new InvalidOperationException("Missing Message field!");
310  await chat.SendMessage(message.Message, message.ChannelIds, cancellationToken).ConfigureAwait(false);
311  }
312  catch (Exception e)
313  {
314  logger.LogDebug("Exception while decoding chat message! Exception: {0}", e);
315  goto default;
316  }
317 
318  break;
320  // currently unused, maybe in the future
321  break;
324  process.Terminate();
325  return;
327  lock (this)
328  {
329  if (!query.TryGetValue(Constants.DMParameterData, out var stringPortObject) || !UInt16.TryParse(stringPortObject as string, out var currentPort))
330  {
332  logger.LogWarning("DreamDaemon sent new port command without providing it's own!");
333  content = new ErrorMessage { Message = "Missing stringified port as data parameter!" };
334  break;
335  }
336 
337  if (!nextPort.HasValue)
338  reattachInformation.Port = currentPort; // not ready yet, so what we'll do is accept the random port DD opened on for now and change it later when we decide to
339  else
340  {
341  // nextPort is ready, tell DD to switch to that
342  // if it fails it'll kill itself
343  content = new Dictionary<string, ushort> { { Constants.DMParameterData, nextPort.Value } };
345  overrideResponsePort = currentPort;
346  nextPort = null;
347 
348  // we'll also get here from SetPort so complete that task
349  var tmpTcs = portAssignmentTcs;
350  portAssignmentTcs = null;
351  if (tmpTcs != null)
352  postRespond = () => tmpTcs.SetResult(true);
353  }
354 
355  portClosedForReboot = false;
356  }
357 
358  break;
360  if (!launchSecurityLevel.HasValue)
361  {
362  logger.LogWarning("DreamDaemon requested API validation but no intial security level was passed to the session controller!");
363  apiValidationStatus = ApiValidationStatus.UnaskedValidationRequest;
364  content = new ErrorMessage { Message = "Invalid API validation request!" };
365  break;
366  }
367 
368  if (!query.TryGetValue(Constants.DMParameterData, out var stringMinimumSecurityLevelObject) || !Enum.TryParse<DreamDaemonSecurity>(stringMinimumSecurityLevelObject as string, out var minimumSecurityLevel))
369  apiValidationStatus = ApiValidationStatus.BadValidationRequest;
370  else
371  switch (minimumSecurityLevel)
372  {
373  case DreamDaemonSecurity.Safe:
375  break;
376  case DreamDaemonSecurity.Ultrasafe:
377  apiValidationStatus = ApiValidationStatus.RequiresUltrasafe;
378  break;
379  case DreamDaemonSecurity.Trusted:
380  apiValidationStatus = ApiValidationStatus.RequiresTrusted;
381  break;
382  default:
383  throw new InvalidOperationException("Enum.TryParse failed to validate the DreamDaemonSecurity range!");
384  }
385 
386  break;
388  if (ClosePortOnReboot)
389  {
391  content = new Dictionary<string, int> { { Constants.DMParameterData, 0 } };
392  portClosedForReboot = true;
393  }
394 
395  var oldTcs = rebootTcs;
396  rebootTcs = new TaskCompletionSource<object>();
397  postRespond = () => oldTcs.SetResult(null);
398  break;
399  default:
400  content = new ErrorMessage { Message = "Requested command not supported!" };
401  break;
402  }
403  }
404  else
405  content = new ErrorMessage { Message = "Missing command parameter!" };
406 
407  var json = JsonConvert.SerializeObject(content);
408  var response = await SendCommand(String.Format(CultureInfo.InvariantCulture, "{0}&{1}={2}", byondTopicSender.SanitizeString(Constants.DMTopicInteropResponse), byondTopicSender.SanitizeString(Constants.DMParameterData), byondTopicSender.SanitizeString(json)), overrideResponsePort, cancellationToken).ConfigureAwait(false);
409 
410  if (response != Constants.DMResponseSuccess)
411  logger.LogWarning("Received error response while responding to interop: {0}", response);
412 
413  postRespond?.Invoke();
414  }
415  #pragma warning restore CA1502
416 
421  {
422  if (disposed)
423  throw new ObjectDisposedException(nameof(SessionController));
424  }
425 
428 
431  {
432  CheckDisposed();
433 
434  // we still don't want to dispose the dmb yet, even though we're keeping it alive
435  var tmpProvider = reattachInformation.Dmb;
436  reattachInformation.Dmb = null;
437  released = true;
438  Dispose();
440  tmpProvider.KeepAlive();
441  reattachInformation.Dmb = tmpProvider;
442  return reattachInformation;
443  }
444 
446  public Task<string> SendCommand(string command, CancellationToken cancellationToken) => SendCommand(command, null, cancellationToken);
447 
448  async Task<string> SendCommand(string command, ushort? overridePort, CancellationToken cancellationToken)
449  {
450  try
451  {
452  var commandString = String.Format(CultureInfo.InvariantCulture,
453  "?{0}={1}&{2}={3}",
457  command); // intentionally don't sanitize command, that's up to the caller
458 
459  var targetPort = overridePort ?? reattachInformation.Port;
460  logger.LogTrace("Export to :{0}. Query: {1}", targetPort, commandString);
461 
462  return await byondTopicSender.SendTopic(
463  new IPEndPoint(IPAddress.Loopback, targetPort),
464  commandString,
465  cancellationToken).ConfigureAwait(false);
466  }
467  catch (OperationCanceledException)
468  {
469  throw;
470  }
471  catch (Exception e)
472  {
473  logger.LogInformation("Send command exception:{0}{1}", Environment.NewLine, e.Message);
474  return null;
475  }
476  }
477 
479  public Task<bool> SetPort(ushort port, CancellationToken cancellationToken)
480  {
481  CheckDisposed();
482 
483  if (port == 0)
484  throw new ArgumentOutOfRangeException(nameof(port), port, "port must not be zero!");
485 
486  async Task<bool> ImmediateTopicPortChange()
487  {
488  var commandResult = await SendCommand(String.Format(CultureInfo.InvariantCulture, "{0}&{1}={2}", byondTopicSender.SanitizeString(Constants.DMTopicChangePort), byondTopicSender.SanitizeString(Constants.DMParameterData), byondTopicSender.SanitizeString(port.ToString(CultureInfo.InvariantCulture))), cancellationToken).ConfigureAwait(false);
489 
490  if (commandResult != Constants.DMResponseSuccess)
491  {
492  logger.LogWarning("Failed port change! DD says: {0}", commandResult);
493  return false;
494  }
495 
496  reattachInformation.Port = port;
497  return true;
498  }
499 
500  lock (this)
502  {
503  if (portAssignmentTcs != null)
504  throw new InvalidOperationException("A port change operation is already in progress!");
505  nextPort = port;
506  portAssignmentTcs = new TaskCompletionSource<bool>();
507  return portAssignmentTcs.Task;
508  }
509  else
510  return ImmediateTopicPortChange();
511  }
512 
514  public async Task<bool> SetRebootState(RebootState newRebootState, CancellationToken cancellationToken)
515  {
516  if (RebootState == newRebootState)
517  return true;
518  reattachInformation.RebootState = newRebootState;
519  return await SendCommand(String.Format(CultureInfo.InvariantCulture, "{0}&{1}={2}", byondTopicSender.SanitizeString(Constants.DMTopicChangeReboot), byondTopicSender.SanitizeString(Constants.DMParameterData), (int)newRebootState), cancellationToken).ConfigureAwait(false) == Constants.DMResponseSuccess;
520  }
521 
523  public void ResetRebootState()
524  {
525  CheckDisposed();
527  }
528 
530  public void SetHighPriority() => process.SetHighPriority();
531  }
532 }
bool disposed
If the SessionController has been disposed
+
const string DMCommandWorldReboot
World reboot command
Definition: Constants.cs:71
+ +
readonly ICommContext interopContext
The ICommContext for the SessionController
+
Task< int > Lifetime
The Task<TResult> resulting in the exit code of the process
Definition: IProcessBase.cs:14
+
IReadOnlyDictionary< string, object > Parameters
The dictionary of the CommCommand
Definition: CommCommand.cs:13
+ +
Represents the result of trying to start a DD process
Definition: LaunchResult.cs:9
+
readonly ReattachInformation reattachInformation
The up to date ReattachInformation
+
Task< bool > SetPort(ushort port, CancellationToken cancellationToken)
Causes the world to start listening on a newPort
+ + +
ushort? nextPort
The port to assign DreamDaemon when it queries for it
+ +
readonly IProcess process
The IProcess for the SessionController
+
ReattachInformation Release()
Releases the IProcess without terminating it. Also calls System.IDisposable.Dispose
+
Represents a registration of an interop session
Definition: ICommContext.cs:8
+
readonly IJsonTrackingContext chatJsonTrackingContext
The IJsonTrackingContext for the SessionController
+
async Task< bool > SetRebootState(RebootState newRebootState, CancellationToken cancellationToken)
Attempts to change the current RebootState to newRebootState
+
bool Active
If the IJsonTrackingContext should be used for GetCustomCommands(CancellationToken)
+ + +
readonly IByondExecutableLock byondLock
The IByondExecutableLock for the SessionController
+ +
void Dispose(bool disposing)
Implements the IDisposable pattern
+
~SessionController()
Finalizes an instance of the SessionController class.
+
readonly IChat chat
The IChat for the SessionController
+
Task Startup
The Task representing the time until the IProcess becomes "idle"
Definition: IProcess.cs:19
+
For managing connected chat services
Definition: IChat.cs:13
+ +
void RegisterHandler(ICommHandler handler)
Register a handler with the ICommContext
+
Handles communication with a DreamDaemon IProcess
+
void SetHighPriority()
Set's the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass....
+
string RawJson
The raw JSON of the CommCommand
Definition: CommCommand.cs:18
+ + + +
TaskCompletionSource< bool > portAssignmentTcs
The TaskCompletionSource<TResult> SetPort(ushort, CancellationToken) waits on when DreamDaemon curren...
+
const string DMCommandEndProcess
Terminate process command
Definition: Constants.cs:76
+
void CheckDisposed()
Throws an ObjectDisposedException if Dispose(bool) has been called
+
const string DMCommandApiValidate
API validation command
Definition: Constants.cs:61
+ +
ushort Port
The port DreamDaemon was last listening on
+ +
void Terminate()
Terminates the process
+
const string DMTopicInteropResponse
Response to an interop export from DM
Definition: Constants.cs:51
+ +
IDmbProvider Dmb
The IDmbProvider used by DreamDaemon
+
readonly ILogger< SessionController > logger
The ILogger for the SessionController
+
TaskCompletionSource< object > rebootTcs
The TaskCompletionSource<TResult> that completes when DD tells us about a reboot
+
const string DMCommandServerPrimed
Server primed command
Definition: Constants.cs:66
+
Abstraction over a System.Diagnostics.Process
Definition: IProcess.cs:9
+
Represents a tracking of dynamic chat json files
+ + +
bool IsPrimary
If the Components.IDmbProvider.PrimaryDirectory of the associated dmb is being used
+
async Task< string > SendCommand(string command, ushort? overridePort, CancellationToken cancellationToken)
+
Task SendMessage(string message, IEnumerable< ulong > channelIds, CancellationToken cancellationToken)
Send a chat message to a given set of channelIds
+
Constants used for communication with the DMAPI
Definition: Constants.cs:6
+
readonly? DreamDaemonSecurity launchSecurityLevel
The DreamDaemonSecurity level the process was launched with
+ +
const string DMResponseSuccess
Generic OK response
Definition: Constants.cs:26
+
void SetHighPriority()
Set's the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass....
+
Represents usage of the two primary BYOND server executables
+
const string DMParameterCommand
Topic command parameter
Definition: Constants.cs:86
+
ApiValidationStatus apiValidationStatus
The ApiValidationStatus for the SessionController
+
const string DMCommandNewPort
Set port command
Definition: Constants.cs:56
+ +
Task< string > SendCommand(string command, CancellationToken cancellationToken)
Sends a command to DreamDaemon through /world/Topic()
+
void EnableCustomChatCommands()
Enables the reading of custom chat commands from the ISessionController
+
void ResetRebootState()
Changes RebootState to Components.Watchdog.RebootState.Normal without telling the DMAPI
+
Represents a BYOND installation
Definition: Byond.cs:8
+
void DoNotDeleteThisSession()
Call if, during a detach, this version should not be deleted
+ +
const string DMInteropAccessIdentifier
The JsonFile.AccessIdentifier
Definition: Constants.cs:21
+
DreamDaemonSecurity
DreamDaemon's security level
+
Provides absolute paths to the latest compiled .dmbs
Definition: IDmbProvider.cs:9
+
bool portClosedForReboot
If we know DreamDaemon currently has it's port closed
+
const string DMTopicChangeReboot
Change reboot mode
Definition: Constants.cs:36
+
SessionController(ReattachInformation reattachInformation, IProcess process, IByondExecutableLock byondLock, IByondTopicSender byondTopicSender, IJsonTrackingContext chatJsonTrackingContext, ICommContext interopContext, IChat chat, ILogger< SessionController > logger, DreamDaemonSecurity? launchSecurityLevel, uint? startupTimeout)
Construct a SessionController
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the SessionController
+
const string DMCommandChat
Chat send command
Definition: Constants.cs:81
+
async Task HandleInterop(CommCommand command, CancellationToken cancellationToken)
Handle a command
+ +
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
RebootState RebootState
The current DreamDaemon reboot state
+ +
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
+
Parameters necessary for duplicating a ISessionController session
+ +
ApiValidationStatus
Status of DMAPI validation
+
string AccessIdentifier
Used to identify and authenticate the DreamDaemon instance
+
bool released
If process should be kept alive instead
+
Represents a chat message requested by DD
Definition: Response.cs:8
+
+ + + + diff --git a/_session_controller_factory_8cs.html b/_session_controller_factory_8cs.html new file mode 100644 index 0000000000..4c456f115e --- /dev/null +++ b/_session_controller_factory_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/SessionControllerFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
SessionControllerFactory.cs File Reference
+
+ + + + + diff --git a/_session_controller_factory_8cs_source.html b/_session_controller_factory_8cs_source.html new file mode 100644 index 0000000000..c38cd08489 --- /dev/null +++ b/_session_controller_factory_8cs_source.html @@ -0,0 +1,169 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/SessionControllerFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
SessionControllerFactory.cs
+
+
+Go to the documentation of this file.
1 using Byond.TopicSender;
2 using Microsoft.Extensions.Logging;
3 using Newtonsoft.Json;
4 using Newtonsoft.Json.Serialization;
5 using System;
6 using System.Globalization;
7 using System.Linq;
8 using System.Text;
9 using System.Threading;
10 using System.Threading.Tasks;
17 using Tgstation.Server.Host.IO;
19 
21 {
24  {
29 
33  readonly IByondManager byond;
34 
38  readonly IByondTopicSender byondTopicSender;
39 
44 
49 
54 
58  readonly IChat chat;
59 
64 
69 
73  readonly ILoggerFactory loggerFactory;
74 
78  readonly Api.Models.Instance instance;
79 
85  static string SecurityWord(DreamDaemonSecurity securityLevel)
86  {
87  switch (securityLevel)
88  {
89  case DreamDaemonSecurity.Safe:
90  return "safe";
91  case DreamDaemonSecurity.Trusted:
92  return "trusted";
93  case DreamDaemonSecurity.Ultrasafe:
94  return "ultrasafe";
95  default:
96  throw new ArgumentOutOfRangeException(nameof(securityLevel), securityLevel, String.Format(CultureInfo.InvariantCulture, "Bad DreamDaemon security level: {0}", securityLevel));
97  }
98  }
99 
115  {
116  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
117  this.byond = byond ?? throw new ArgumentNullException(nameof(byond));
118  this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
119  this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
120  this.application = application ?? throw new ArgumentNullException(nameof(application));
121  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
122  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
123  this.chat = chat ?? throw new ArgumentNullException(nameof(chat));
124  this.networkPromptReaper = networkPromptReaper ?? throw new ArgumentNullException(nameof(networkPromptReaper));
125  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
126  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
127  }
128 
130  #pragma warning disable CA1506 // TODO: Decomplexify
131  public async Task<ISessionController> LaunchNew(DreamDaemonLaunchParameters launchParameters, IDmbProvider dmbProvider, IByondExecutableLock currentByondLock, bool primaryPort, bool primaryDirectory, bool apiValidate, CancellationToken cancellationToken)
132  {
133  var portToUse = primaryPort ? launchParameters.PrimaryPort : launchParameters.SecondaryPort;
134  if (!portToUse.HasValue)
135  throw new InvalidOperationException("Given port is null!");
136  var accessIdentifier = cryptographySuite.GetSecureString();
137 
138  const string JsonPostfix = "tgs.json";
139 
140  var basePath = primaryDirectory ? dmbProvider.PrimaryDirectory : dmbProvider.SecondaryDirectory;
141 
142  // delete all previous tgs json files
143  var files = await ioManager.GetFilesWithExtension(basePath, JsonPostfix, cancellationToken).ConfigureAwait(false);
144  await Task.WhenAll(files.Select(x => ioManager.DeleteFile(x, cancellationToken))).ConfigureAwait(false);
145 
146  // i changed this back from guids, hopefully i don't regret that
147  string JsonFile(string name) => String.Format(CultureInfo.InvariantCulture, "{0}.{1}", name, JsonPostfix);
148 
149  var securityLevelToUse = launchParameters.SecurityLevel.Value;
150  switch (dmbProvider.CompileJob.MinimumSecurityLevel)
151  {
152  case DreamDaemonSecurity.Ultrasafe:
153  break;
154  case DreamDaemonSecurity.Safe:
155  if (securityLevelToUse == DreamDaemonSecurity.Ultrasafe)
156  securityLevelToUse = DreamDaemonSecurity.Safe;
157  break;
158  case DreamDaemonSecurity.Trusted:
159  securityLevelToUse = DreamDaemonSecurity.Trusted;
160  break;
161  default:
162  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid DreamDaemonSecurity value: {0}", dmbProvider.CompileJob.MinimumSecurityLevel));
163  }
164 
165  // setup interop files
166  var interopInfo = new JsonFile
167  {
168  AccessIdentifier = accessIdentifier,
169  ApiValidateOnly = apiValidate,
170  ChatChannelsJson = JsonFile("chat_channels"),
171  ChatCommandsJson = JsonFile("chat_commands"),
172  ServerCommandsJson = JsonFile("server_commands"),
173  InstanceName = instance.Name,
174  SecurityLevel = securityLevelToUse,
175  Revision = new Api.Models.Internal.RevisionInformation
176  {
177  CommitSha = dmbProvider.CompileJob.RevisionInformation.CommitSha,
178  OriginCommitSha = dmbProvider.CompileJob.RevisionInformation.OriginCommitSha
179  }
180  };
181 
182  interopInfo.TestMerges.AddRange(dmbProvider.CompileJob.RevisionInformation.ActiveTestMerges.Select(x => x.TestMerge).Select(x => new Interop.TestMerge(x, interopInfo.Revision)));
183 
184  var interopJsonFile = JsonFile("interop");
185 
186  var interopJson = JsonConvert.SerializeObject(interopInfo, new JsonSerializerSettings
187  {
188  ContractResolver = new CamelCasePropertyNamesContractResolver(),
189  ReferenceLoopHandling = ReferenceLoopHandling.Ignore
190  });
191 
192  var chatJsonTrackingTask = chat.TrackJsons(basePath, interopInfo.ChatChannelsJson, interopInfo.ChatCommandsJson, cancellationToken);
193 
194  await ioManager.WriteAllBytes(ioManager.ConcatPath(basePath, interopJsonFile), Encoding.UTF8.GetBytes(interopJson), cancellationToken).ConfigureAwait(false);
195  var chatJsonTrackingContext = await chatJsonTrackingTask.ConfigureAwait(false);
196  try
197  {
198  // get the byond lock
199  var byondLock = currentByondLock ?? await byond.UseExecutables(Version.Parse(dmbProvider.CompileJob.ByondVersion), cancellationToken).ConfigureAwait(false);
200  try
201  {
202  // create interop context
203  var context = new CommContext(ioManager, loggerFactory.CreateLogger<CommContext>(), basePath, interopInfo.ServerCommandsJson);
204  try
205  {
206  // set command line options
207  // more sanitization here cause it uses the same scheme
208  var parameters = String.Format(CultureInfo.InvariantCulture, "{2}={0}&{3}={1}", byondTopicSender.SanitizeString(application.Version.ToString()), byondTopicSender.SanitizeString(interopJsonFile), byondTopicSender.SanitizeString(Constants.DMParamHostVersion), byondTopicSender.SanitizeString(Constants.DMParamInfoJson));
209 
210  var visibility = apiValidate ? "invisible" : "public";
211 
212  // important to run on all ports to allow port changing
213  var arguments = String.Format(CultureInfo.InvariantCulture, "{0} -port {1} -ports 1-65535 {2}-close -{3} -{5} -public -params \"{4}\"",
214  dmbProvider.DmbName,
215  primaryPort ? launchParameters.PrimaryPort : launchParameters.SecondaryPort,
216  launchParameters.AllowWebClient.Value ? "-webclient " : String.Empty,
217  SecurityWord(securityLevelToUse),
218  parameters,
219  visibility);
220 
221  // See https://github.com/tgstation/tgstation-server/issues/719
222  var noShellExecute = !platformIdentifier.IsWindows;
223 
224  // launch dd
225  var process = processExecutor.LaunchProcess(byondLock.DreamDaemonPath, basePath, arguments, noShellExecute: noShellExecute);
226  try
227  {
229 
230  // return the session controller for it
231  var result = new SessionController(new ReattachInformation
232  {
233  AccessIdentifier = accessIdentifier,
234  Dmb = dmbProvider,
235  IsPrimary = primaryDirectory,
236  Port = portToUse.Value,
237  ProcessId = process.Id,
238  ChatChannelsJson = interopInfo.ChatChannelsJson,
239  ChatCommandsJson = interopInfo.ChatCommandsJson,
240  ServerCommandsJson = interopInfo.ServerCommandsJson,
241  }, process, byondLock, byondTopicSender, chatJsonTrackingContext, context, chat, loggerFactory.CreateLogger<SessionController>(), launchParameters.SecurityLevel, launchParameters.StartupTimeout);
242 
243  // writeback launch parameter's fixed security level
244  launchParameters.SecurityLevel = securityLevelToUse;
245 
246  return result;
247  }
248  catch
249  {
250  process.Dispose();
251  throw;
252  }
253  }
254  catch
255  {
256  context.Dispose();
257  throw;
258  }
259  }
260  catch
261  {
262  if (currentByondLock == null)
263  byondLock.Dispose();
264  throw;
265  }
266  }
267  catch
268  {
269  chatJsonTrackingContext.Dispose();
270  throw;
271  }
272  }
273  #pragma warning restore CA1506
274 
276  public async Task<ISessionController> Reattach(ReattachInformation reattachInformation, CancellationToken cancellationToken)
277  {
278  if (reattachInformation == null)
279  throw new ArgumentNullException(nameof(reattachInformation));
280 
281  SessionController result = null;
282  var basePath = reattachInformation.IsPrimary ? reattachInformation.Dmb.PrimaryDirectory : reattachInformation.Dmb.SecondaryDirectory;
283  var chatJsonTrackingContext = await chat.TrackJsons(basePath, reattachInformation.ChatChannelsJson, reattachInformation.ChatCommandsJson, cancellationToken).ConfigureAwait(false);
284  try
285  {
286  var byondLock = await byond.UseExecutables(Version.Parse(reattachInformation.Dmb.CompileJob.ByondVersion), cancellationToken).ConfigureAwait(false);
287  try
288  {
289  var context = new CommContext(ioManager, loggerFactory.CreateLogger<CommContext>(), basePath, reattachInformation.ServerCommandsJson);
290  try
291  {
292  var process = processExecutor.GetProcess(reattachInformation.ProcessId);
293 
294  if (process != null)
295  try
296  {
298  result = new SessionController(reattachInformation, process, byondLock, byondTopicSender, chatJsonTrackingContext, context, chat, loggerFactory.CreateLogger<SessionController>(), null, null);
299 
300  process = null;
301  context = null;
302  byondLock = null;
303  chatJsonTrackingContext = null;
304  }
305  finally
306  {
307  process?.Dispose();
308  }
309  }
310  finally
311  {
312  context?.Dispose();
313  }
314  }
315  finally
316  {
317  byondLock?.Dispose();
318  }
319  }
320  finally
321  {
322  chatJsonTrackingContext?.Dispose();
323  }
324 
325  return result;
326  }
327 
329  public ISessionController CreateDeadSession(IDmbProvider dmbProvider) => new DeadSessionController(dmbProvider);
330  }
331 }
string ServerCommandsJson
Path to the server commands json file
+
DreamDaemonSecurity? MinimumSecurityLevel
The minimum DreamDaemonSecurity required to run the CompileJob's output
Definition: CompileJob.cs:38
+
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the SessionControllerFactory
+ +
readonly IIOManager ioManager
The IIOManager for the SessionControllerFactory
+
Task< List< string > > GetFilesWithExtension(string path, string extension, CancellationToken cancellationToken)
Gets a list of files in path with the given extension
+
ushort? PrimaryPort
The first port DreamDaemon uses. This should be the publically advertised port
+
const string DMParamInfoJson
Path to the JsonFile
Definition: Constants.cs:16
+
CompileJob CompileJob
The CompileJob of the .dmb
Definition: IDmbProvider.cs:29
+
string DmbName
The file name of the .dmb
Definition: IDmbProvider.cs:14
+ +
readonly IProcessExecutor processExecutor
The IProcessExecutor for the SessionControllerFactory
+
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+ +
readonly Api.Models.Instance instance
The Api.Models.Instance for the SessionControllerFactory
+
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the SessionControllerFactory
+
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+
string SecondaryDirectory
The secondary game directory with a trailing directory separator
Definition: IDmbProvider.cs:24
+
RevisionInformation RevisionInformation
Git revision the compiler ran on. Not modifiable
Definition: CompileJob.cs:16
+
string ChatCommandsJson
Path to the chat commands json file
+ + +
readonly INetworkPromptReaper networkPromptReaper
The INetworkPromptReaper for the SessionControllerFactory
+ + +
string PrimaryDirectory
The primary game directory with a trailing directory separator
Definition: IDmbProvider.cs:19
+
Representation of the initial json passed to DreamDaemon
Definition: JsonFile.cs:10
+
List< TestMerge > ActiveTestMerges
The TestMerges active in the RevisionInformation
+
For managing connected chat services
Definition: IChat.cs:13
+
ISessionController CreateDeadSession(IDmbProvider dmbProvider)
Creates a ISessionController that appears to have started and died with exit code -1
+ +
Contains various cryptographic functions
+ + +
Handles communication with a DreamDaemon IProcess
+
readonly IApplication application
The IApplication for the SessionControllerFactory
+ +
async Task< ISessionController > LaunchNew(DreamDaemonLaunchParameters launchParameters, IDmbProvider dmbProvider, IByondExecutableLock currentByondLock, bool primaryPort, bool primaryDirectory, bool apiValidate, CancellationToken cancellationToken)
Create a ISessionController from a freshly launch DreamDaemon instance
+
Task< IJsonTrackingContext > TrackJsons(string basePath, string channelsJsonName, string commandsJsonName, CancellationToken cancellationToken)
Start tracking json files for commands and channels
+
Version ByondVersion
The Byond.Version the CompileJob was made with
Definition: CompileJob.cs:21
+ +
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the SessionControllerFactory
+
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the SessionControllerFactory
+
IProcess LaunchProcess(string fileName, string workingDirectory, string arguments=null, bool readOutput=false, bool readError=false, bool noShellExecute=false)
Launch a IProcess
+
async Task< ISessionController > Reattach(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Create a ISessionController from an existing DreamDaemon instance
+
bool IsWindows
If the current platform is a Windows platform
+
IDmbProvider Dmb
The IDmbProvider used by DreamDaemon
+ + + +
bool IsPrimary
If the Components.IDmbProvider.PrimaryDirectory of the associated dmb is being used
+
IProcess GetProcess(int id)
Get a IProcess by id
+
const string DMParamHostVersion
Identifies a TGS execution. The server version
Definition: Constants.cs:11
+ +
string ChatChannelsJson
Path to the chat channels json file
+
Constants used for communication with the DMAPI
Definition: Constants.cs:6
+
readonly IChat chat
The IChat for the SessionControllerFactory
+ + +
SessionControllerFactory(IProcessExecutor processExecutor, IByondManager byond, IByondTopicSender byondTopicSender, ICryptographySuite cryptographySuite, IApplication application, IIOManager ioManager, IChat chat, INetworkPromptReaper networkPromptReaper, IPlatformIdentifier platformIdentifier, ILoggerFactory loggerFactory, Api.Models.Instance instance)
Construct a SessionControllerFactory
+
Represents usage of the two primary BYOND server executables
+ +
Represents a BYOND installation
Definition: Byond.cs:8
+
string GetSecureString()
Generates a 40-length secure ascii string
+ +
DreamDaemonSecurity
DreamDaemon's security level
+
void RegisterProcess(IProcess process)
Register a given process for network prompt reaping
+
Task< IByondExecutableLock > UseExecutables(Version requiredVersion, CancellationToken cancellationToken)
Lock the current installation's location and return a IByondExecutableLock
+
Provides absolute paths to the latest compiled .dmbs
Definition: IDmbProvider.cs:9
+ +
Interface for using filesystems
Definition: IIOManager.cs:11
+
readonly IByondManager byond
The IByondManager for the SessionControllerFactory
+
bool? AllowWebClient
If the BYOND web client can be used to connect to the game server
+
On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort()....
+
For identifying the current platform
+
static string SecurityWord(DreamDaemonSecurity securityLevel)
Change a given securityLevel into the appropriate DreamDaemon command line word
+ +
Task DeleteFile(string path, CancellationToken cancellationToken)
Deletes a file at path
+ +
Version Version
The version of the Application
Definition: IApplication.cs:23
+
string OriginCommitSha
The sha of the most recent remote commit
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
Parameters necessary for duplicating a ISessionController session
+ + +
DreamDaemonSecurity? SecurityLevel
The DreamDaemonSecurity level of DreamDaemon
+ +
+ + + + diff --git a/_setup_wizard_8cs.html b/_setup_wizard_8cs.html new file mode 100644 index 0000000000..13a01128ba --- /dev/null +++ b/_setup_wizard_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/SetupWizard.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
SetupWizard.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Core.SetupWizard
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_setup_wizard_8cs_source.html b/_setup_wizard_8cs_source.html new file mode 100644 index 0000000000..c37e854ab0 --- /dev/null +++ b/_setup_wizard_8cs_source.html @@ -0,0 +1,142 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/SetupWizard.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
SetupWizard.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Hosting;
2 using Microsoft.Extensions.Logging;
3 using Microsoft.Extensions.Options;
4 using MySql.Data.MySqlClient;
5 using Newtonsoft.Json;
6 using System;
7 using System.Collections.Generic;
8 using System.Data.Common;
9 using System.Data.SqlClient;
10 using System.Globalization;
11 using System.Linq;
12 using System.Text;
13 using System.Threading;
14 using System.Threading.Tasks;
16 using Tgstation.Server.Host.IO;
17 
19 {
21  sealed class SetupWizard : ISetupWizard
22  {
27 
31  readonly IConsole console;
32 
36  readonly IHostingEnvironment hostingEnvironment;
37 
42 
47 
52 
57 
61  readonly ILogger<SetupWizard> logger;
62 
67 
80  public SetupWizard(IIOManager ioManager, IConsole console, IHostingEnvironment hostingEnvironment, IApplication application, IDBConnectionFactory dbConnectionFactory, IPlatformIdentifier platformIdentifier, IAsyncDelayer asyncDelayer, ILogger<SetupWizard> logger, IOptions<GeneralConfiguration> generalConfigurationOptions)
81  {
82  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
83  this.console = console ?? throw new ArgumentNullException(nameof(console));
84  this.hostingEnvironment = hostingEnvironment ?? throw new ArgumentNullException(nameof(hostingEnvironment));
85  this.application = application ?? throw new ArgumentNullException(nameof(application));
86  this.dbConnectionFactory = dbConnectionFactory ?? throw new ArgumentNullException(nameof(dbConnectionFactory));
87  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
88  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
89  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
90  generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
91  }
92 
99  async Task<bool> PromptYesNo(string question, CancellationToken cancellationToken)
100  {
101  do
102  {
103  await console.WriteAsync(question, false, cancellationToken).ConfigureAwait(false);
104  var responseString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
105  var upperResponse = responseString.ToUpperInvariant();
106  if (upperResponse == "Y" || upperResponse == "YES")
107  return true;
108  else if (upperResponse == "N" || upperResponse == "NO")
109  return false;
110  await console.WriteAsync("Invalid response!", true, cancellationToken).ConfigureAwait(false);
111  }
112  while (true);
113  }
114 
120  async Task<ushort?> PromptForHostingPort(CancellationToken cancellationToken)
121  {
122  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
123  await console.WriteAsync("What port would you like to connect to TGS on?", true, cancellationToken).ConfigureAwait(false);
124  await console.WriteAsync("Note: If this is a docker container with the default port already mapped, use the default.", true, cancellationToken).ConfigureAwait(false);
125 
126  do
127  {
128  await console.WriteAsync("API Port (leave blank for default): ", false, cancellationToken).ConfigureAwait(false);
129  var portString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
130  if (String.IsNullOrWhiteSpace(portString))
131  return null;
132  if (UInt16.TryParse(portString, out var port) && port != 0)
133  return port;
134  await console.WriteAsync("Invalid port! Please enter a value between 1 and 65535", true, cancellationToken).ConfigureAwait(false);
135  }
136  while (true);
137  }
138 
144  async Task<DatabaseConfiguration> ConfigureDatabase(CancellationToken cancellationToken)
145  {
146  do
147  {
148  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
149  await console.WriteAsync("What SQL database type will you be using?", true, cancellationToken).ConfigureAwait(false);
150 
151  var databaseConfiguration = new DatabaseConfiguration();
152  do
153  {
154  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Please enter one of {0}, {1}, or {2}: ", DatabaseType.MariaDB, DatabaseType.SqlServer, DatabaseType.MySql), false, cancellationToken).ConfigureAwait(false);
155  var databaseTypeString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
156  if (Enum.TryParse<DatabaseType>(databaseTypeString, out var databaseType))
157  {
158  databaseConfiguration.DatabaseType = databaseType;
159  break;
160  }
161 
162  await console.WriteAsync("Invalid database type!", true, cancellationToken).ConfigureAwait(false);
163  }
164  while (true);
165 
166  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
167  await console.WriteAsync("Enter the server's address and port (blank for local): ", false, cancellationToken).ConfigureAwait(false);
168  var serverAddress = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
169  if (String.IsNullOrWhiteSpace(serverAddress))
170  serverAddress = null;
171 
172  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
173  await console.WriteAsync("Enter the database name (Can be from previous installation. Otherwise, should not exist): ", false, cancellationToken).ConfigureAwait(false);
174  string databaseName;
175  do
176  {
177  databaseName = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
178  if (!String.IsNullOrWhiteSpace(databaseName))
179  break;
180  await console.WriteAsync("Invalid database name!", true, cancellationToken).ConfigureAwait(false);
181  }
182  while (true);
183 
184  var dbExists = await PromptYesNo("Does this database already exist? (y/n): ", cancellationToken).ConfigureAwait(false);
185 
186  bool useWinAuth;
187  if (databaseConfiguration.DatabaseType == DatabaseType.SqlServer && platformIdentifier.IsWindows)
188  useWinAuth = await PromptYesNo("Use Windows Authentication? (y/n): ", cancellationToken).ConfigureAwait(false);
189  else
190  useWinAuth = false;
191 
192  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
193 
194  string username = null;
195  string password = null;
196  if (!useWinAuth)
197  {
198  await console.WriteAsync("Enter username: ", false, cancellationToken).ConfigureAwait(false);
199  username = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
200  await console.WriteAsync("Enter password: ", false, cancellationToken).ConfigureAwait(false);
201  password = await console.ReadLineAsync(true, cancellationToken).ConfigureAwait(false);
202  }
203  else
204  {
205  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);
206  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);
207  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);
208  }
209 
210  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
211 
212  DbConnection testConnection;
213  void CreateTestConnection(string connectionString)
214  {
215  testConnection = dbConnectionFactory.CreateConnection(connectionString, databaseConfiguration.DatabaseType);
216  }
217 
218  if (databaseConfiguration.DatabaseType == DatabaseType.SqlServer)
219  {
220  var csb = new SqlConnectionStringBuilder
221  {
222  ApplicationName = application.VersionPrefix,
223  DataSource = serverAddress ?? "(local)"
224  };
225  if (useWinAuth)
226  csb.IntegratedSecurity = true;
227  else
228  {
229  csb.UserID = username;
230  csb.Password = password;
231  }
232 
233  CreateTestConnection(csb.ConnectionString);
234  csb.InitialCatalog = databaseName;
235  databaseConfiguration.ConnectionString = csb.ConnectionString;
236  }
237  else
238  {
239  var csb = new MySqlConnectionStringBuilder
240  {
241  Server = serverAddress ?? "127.0.0.1",
242  UserID = username,
243  Password = password
244  };
245 
246  CreateTestConnection(csb.ConnectionString);
247  csb.Database = databaseName;
248  databaseConfiguration.ConnectionString = csb.ConnectionString;
249  }
250 
251  try
252  {
253  using (testConnection)
254  {
255  await console.WriteAsync("Testing connection...", true, cancellationToken).ConfigureAwait(false);
256  await testConnection.OpenAsync(cancellationToken).ConfigureAwait(false);
257  await console.WriteAsync("Connection successful!", true, cancellationToken).ConfigureAwait(false);
258 
259  if (databaseConfiguration.DatabaseType != DatabaseType.SqlServer)
260  {
261  await console.WriteAsync("Checking MySQL/MariaDB version...", true, cancellationToken).ConfigureAwait(false);
262  using (var command = testConnection.CreateCommand())
263  {
264  command.CommandText = "SELECT VERSION()";
265  var fullVersion = (string)await command.ExecuteScalarAsync(cancellationToken).ConfigureAwait(false);
266  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Found {0}", fullVersion), true, cancellationToken).ConfigureAwait(false);
267  var splits = fullVersion.Split('-');
268  databaseConfiguration.MySqlServerVersion = splits[0];
269  }
270  }
271 
272  if (!dbExists)
273  {
274  await console.WriteAsync("Testing create DB permission...", true, cancellationToken).ConfigureAwait(false);
275  using (var command = testConnection.CreateCommand())
276  {
277  // I really don't care about user sanitization here, they want to fuck their own DB? so be it
278 #pragma warning disable CA2100 // Review SQL queries for security vulnerabilities
279  command.CommandText = $"CREATE DATABASE {databaseName}";
280 #pragma warning restore CA2100 // Review SQL queries for security vulnerabilities
281  await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false);
282  }
283 
284  await console.WriteAsync("Success!", true, cancellationToken).ConfigureAwait(false);
285  await console.WriteAsync("Dropping test database...", true, cancellationToken).ConfigureAwait(false);
286  using (var command = testConnection.CreateCommand())
287  {
288 #pragma warning disable CA2100 // Review SQL queries for security vulnerabilities
289  command.CommandText = $"DROP DATABASE {databaseName}";
290 #pragma warning restore CA2100 // Review SQL queries for security vulnerabilities
291  try
292  {
293  await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false);
294  }
295  catch (OperationCanceledException)
296  {
297  throw;
298  }
299  catch (Exception e)
300  {
301  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
302  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
303  await console.WriteAsync("This should be okay, but you may want to manually drop the database before continuing!", true, cancellationToken).ConfigureAwait(false);
304  await console.WriteAsync("Press any key to continue...", true, cancellationToken).ConfigureAwait(false);
305  await console.PressAnyKeyAsync(cancellationToken).ConfigureAwait(false);
306  }
307  }
308  }
309  }
310 
311  return databaseConfiguration;
312  }
313  catch (OperationCanceledException)
314  {
315  throw;
316  }
317  catch (Exception e)
318  {
319  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
320  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
321  await console.WriteAsync("Retrying database configuration...", true, cancellationToken).ConfigureAwait(false);
322  }
323  }
324  while (true);
325  }
326 
332  async Task<GeneralConfiguration> ConfigureGeneral(CancellationToken cancellationToken)
333  {
334  var newGeneralConfiguration = new GeneralConfiguration
335  {
337  };
338 
339  do
340  {
341  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
342  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Minimum database user password length (leave blank for default of {0}): ", newGeneralConfiguration.MinimumPasswordLength), false, cancellationToken).ConfigureAwait(false);
343  var passwordLengthString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
344  if (String.IsNullOrWhiteSpace(passwordLengthString))
345  break;
346  if (UInt32.TryParse(passwordLengthString, out var passwordLength) && passwordLength >= 0)
347  {
348  newGeneralConfiguration.MinimumPasswordLength = passwordLength;
349  break;
350  }
351 
352  await console.WriteAsync("Please enter a positive integer!", true, cancellationToken).ConfigureAwait(false);
353  }
354  while (true);
355 
356  do
357  {
358  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
359  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);
360  var topicTimeoutString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
361  if (String.IsNullOrWhiteSpace(topicTimeoutString))
362  break;
363  if (Int32.TryParse(topicTimeoutString, out var topicTimeout) && topicTimeout >= 0)
364  {
365  newGeneralConfiguration.ByondTopicTimeout = topicTimeout;
366  break;
367  }
368 
369  await console.WriteAsync("Please enter a positive integer!", true, cancellationToken).ConfigureAwait(false);
370  }
371  while (true);
372 
373  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
374  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);
375  await console.WriteAsync("GitHub personal access token: ", false, cancellationToken).ConfigureAwait(false);
376  newGeneralConfiguration.GitHubAccessToken = await console.ReadLineAsync(true, cancellationToken).ConfigureAwait(false);
377  if (String.IsNullOrWhiteSpace(newGeneralConfiguration.GitHubAccessToken))
378  newGeneralConfiguration.GitHubAccessToken = null;
379  return newGeneralConfiguration;
380  }
381 
387  async Task<FileLoggingConfiguration> ConfigureLogging(CancellationToken cancellationToken)
388  {
389  var fileLoggingConfiguration = new FileLoggingConfiguration();
390  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
391  fileLoggingConfiguration.Disable = !await PromptYesNo("Enable file logging? (y/n): ", cancellationToken).ConfigureAwait(false);
392 
393  if (!fileLoggingConfiguration.Disable)
394  {
395  do
396  {
397  await console.WriteAsync("Log file directory path (leave blank for default): ", false, cancellationToken).ConfigureAwait(false);
398  fileLoggingConfiguration.Directory = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
399  if (String.IsNullOrWhiteSpace(fileLoggingConfiguration.Directory))
400  {
401  fileLoggingConfiguration.Directory = null;
402  break;
403  }
404 
405  // test a write of it
406  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
407  await console.WriteAsync("Testing directory access...", true, cancellationToken).ConfigureAwait(false);
408  try
409  {
410  await ioManager.CreateDirectory(fileLoggingConfiguration.Directory, cancellationToken).ConfigureAwait(false);
411  var testFile = ioManager.ConcatPath(fileLoggingConfiguration.Directory, String.Format(CultureInfo.InvariantCulture, "WizardAccesTest.{0}.deleteme", Guid.NewGuid()));
412  await ioManager.WriteAllBytes(testFile, Array.Empty<byte>(), cancellationToken).ConfigureAwait(false);
413  try
414  {
415  await ioManager.DeleteFile(testFile, cancellationToken).ConfigureAwait(false);
416  }
417  catch (OperationCanceledException)
418  {
419  throw;
420  }
421  catch (Exception e)
422  {
423  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Error deleting test log file: {0}", testFile), true, cancellationToken).ConfigureAwait(false);
424  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
425  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
426  }
427 
428  break;
429  }
430  catch (OperationCanceledException)
431  {
432  throw;
433  }
434  catch (Exception e)
435  {
436  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
437  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
438  await console.WriteAsync("Please verify the path is valid and you have access to it!", true, cancellationToken).ConfigureAwait(false);
439  }
440  }
441  while (true);
442 
443  async Task<LogLevel?> PromptLogLevel(string question)
444  {
445  do
446  {
447  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
448  await console.WriteAsync(question, true, cancellationToken).ConfigureAwait(false);
449  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);
450  var responseString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
451  if (String.IsNullOrWhiteSpace(responseString))
452  return null;
453  if (Enum.TryParse<LogLevel>(responseString, out var logLevel) && logLevel != LogLevel.None)
454  return logLevel;
455  await console.WriteAsync("Invalid log level!", true, cancellationToken).ConfigureAwait(false);
456  }
457  while (true);
458  }
459 
460  fileLoggingConfiguration.LogLevel = await PromptLogLevel(String.Format(CultureInfo.InvariantCulture, "Enter the level limit for normal logs (default {0}).", fileLoggingConfiguration.LogLevel)).ConfigureAwait(false) ?? fileLoggingConfiguration.LogLevel;
461  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;
462  }
463 
464  return fileLoggingConfiguration;
465  }
466 
472  async Task<ControlPanelConfiguration> ConfigureControlPanel(CancellationToken cancellationToken)
473  {
474  var config = new ControlPanelConfiguration
475  {
476  Enable = await PromptYesNo("Enable the web control panel? (y/n): ", cancellationToken).ConfigureAwait(false),
477  AllowAnyOrigin = await PromptYesNo("Allow web control panels hosted elsewhere to access the server? (Access-Control-Allow-Origin: *) (y/n): ", cancellationToken).ConfigureAwait(false)
478  };
479 
480  if (!config.AllowAnyOrigin)
481  {
482  await console.WriteAsync("Enter a comma seperated list of CORS allowed origins (optional): ", false, cancellationToken).ConfigureAwait(false);
483  var commaSeperatedOrigins = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
484  if (!String.IsNullOrWhiteSpace(commaSeperatedOrigins))
485  {
486  var splits = commaSeperatedOrigins.Split(',');
487  config.AllowedOrigins = new List<string>(splits.Select(x => x.Trim()));
488  }
489  }
490 
491  return config;
492  }
493 
505  async Task SaveConfiguration(string userConfigFileName, ushort? hostingPort, DatabaseConfiguration databaseConfiguration, GeneralConfiguration newGeneralConfiguration, FileLoggingConfiguration fileLoggingConfiguration, ControlPanelConfiguration controlPanelConfiguration, CancellationToken cancellationToken)
506  {
507  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Configuration complete! Saving to {0}", userConfigFileName), true, cancellationToken).ConfigureAwait(false);
508 
509  var map = new Dictionary<string, object>()
510  {
511  { DatabaseConfiguration.Section, databaseConfiguration },
512  { GeneralConfiguration.Section, newGeneralConfiguration },
513  { FileLoggingConfiguration.Section, fileLoggingConfiguration },
514  { ControlPanelConfiguration.Section, controlPanelConfiguration }
515  };
516 
517  if (hostingPort.HasValue)
518  map.Add("Kestrel", new
519  {
520  EndPoints = new
521  {
522  Http = new
523  {
524  Url = String.Format(CultureInfo.InvariantCulture, "http://0.0.0.0:{0}", hostingPort)
525  }
526  }
527  });
528 
529  var json = JsonConvert.SerializeObject(map, Formatting.Indented);
530  var configBytes = Encoding.UTF8.GetBytes(json);
531 
532  try
533  {
534  await ioManager.WriteAllBytes(userConfigFileName, configBytes, cancellationToken).ConfigureAwait(false);
535  }
536  catch (OperationCanceledException)
537  {
538  throw;
539  }
540  catch (Exception e)
541  {
542  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
543  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
544  await console.WriteAsync("For your convienence, here's the json we tried to write out:", true, cancellationToken).ConfigureAwait(false);
545  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
546  await console.WriteAsync(json, true, cancellationToken).ConfigureAwait(false);
547  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
548  await console.WriteAsync("Press any key to exit...", true, cancellationToken).ConfigureAwait(false);
549  await console.PressAnyKeyAsync(cancellationToken).ConfigureAwait(false);
550  throw new OperationCanceledException();
551  }
552 
553  await console.WriteAsync("Waiting for configuration changes to reload...", true, cancellationToken).ConfigureAwait(false);
554 
555  // we need to wait for the configuration's file system watcher to read and reload the changes
556  await asyncDelayer.Delay(TimeSpan.FromSeconds(5), cancellationToken).ConfigureAwait(false);
557  }
558 
565  async Task RunWizard(string userConfigFileName, CancellationToken cancellationToken)
566  {
567  // welcome message
568  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
569  await console.WriteAsync("Welcome to tgstation-server 4!", true, cancellationToken).ConfigureAwait(false);
570  await console.WriteAsync("This wizard will help you configure your server.", true, cancellationToken).ConfigureAwait(false);
571 
572  var hostingPort = await PromptForHostingPort(cancellationToken).ConfigureAwait(false);
573 
574  var databaseConfiguration = await ConfigureDatabase(cancellationToken).ConfigureAwait(false);
575 
576  var newGeneralConfiguration = await ConfigureGeneral(cancellationToken).ConfigureAwait(false);
577 
578  var fileLoggingConfiguration = await ConfigureLogging(cancellationToken).ConfigureAwait(false);
579 
580  var controlPanelConfiguration = await ConfigureControlPanel(cancellationToken).ConfigureAwait(false);
581 
582  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
583 
584  await SaveConfiguration(userConfigFileName, hostingPort, databaseConfiguration, newGeneralConfiguration, fileLoggingConfiguration, controlPanelConfiguration, cancellationToken).ConfigureAwait(false);
585  }
586 
588  public async Task<bool> CheckRunWizard(CancellationToken cancellationToken)
589  {
590  var setupWizardMode = generalConfiguration.SetupWizardMode;
591  logger.LogTrace("Checking if setup wizard should run. SetupWizardMode: {0}", setupWizardMode);
592 
593  if (setupWizardMode == SetupWizardMode.Never)
594  {
595  logger.LogTrace("Skipping due to configuration...");
596  return false;
597  }
598 
599  var forceRun = setupWizardMode == SetupWizardMode.Force || setupWizardMode == SetupWizardMode.Only;
600  if (!console.Available)
601  {
602  if (forceRun)
603  throw new InvalidOperationException("Asked to run setup wizard with no console avaliable!");
604  logger.LogTrace("Skipping due to console not being available...");
605  return false;
606  }
607 
608  var userConfigFileName = String.Format(CultureInfo.InvariantCulture, "appsettings.{0}.json", hostingEnvironment.EnvironmentName);
609  var exists = await ioManager.FileExists(userConfigFileName, cancellationToken).ConfigureAwait(false);
610 
611  bool shouldRunBasedOnAutodetect;
612  if (exists)
613  {
614  var bytes = await ioManager.ReadAllBytes(userConfigFileName, cancellationToken).ConfigureAwait(false);
615  var contents = Encoding.UTF8.GetString(bytes);
616  var existingConfigIsEmpty = String.IsNullOrWhiteSpace(contents) || contents.Trim() == "{}";
617  logger.LogTrace("Configuration json detected. Empty: {0}", existingConfigIsEmpty);
618  shouldRunBasedOnAutodetect = existingConfigIsEmpty;
619  }
620  else
621  {
622  shouldRunBasedOnAutodetect = true;
623  logger.LogTrace("No configuration json detected");
624  }
625 
626  if (!shouldRunBasedOnAutodetect)
627  {
628  if (forceRun)
629  {
630  logger.LogTrace("Asking user to bypass due to force run request...");
631  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);
632 
633  forceRun = await PromptYesNo("Continue running setup wizard? (y/n): ", cancellationToken).ConfigureAwait(false);
634  }
635 
636  if (!forceRun)
637  return false;
638  }
639 
640  // flush the logs to prevent console conflicts
641  await asyncDelayer.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
642 
643  await RunWizard(userConfigFileName, cancellationToken).ConfigureAwait(false);
644  return true;
645  }
646  }
647 }
readonly IConsole console
The IConsole for the SetupWizard
Definition: SetupWizard.cs:31
+
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+
async Task< ControlPanelConfiguration > ConfigureControlPanel(CancellationToken cancellationToken)
Prompts the user to create a ControlPanelConfiguration
Definition: SetupWizard.cs:472
+
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+
SetupWizardMode
Determines if the Core.ISetupWizard will run
+
Abstraction for System.Console
Definition: IConsole.cs:9
+ +
bool Available
If the IConsole is visible to the user
Definition: IConsole.cs:14
+
string VersionPrefix
Prefix to VersionString
Definition: IApplication.cs:13
+
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the GeneralConfiguration res...
+
DbConnection CreateConnection(string connectionString, DatabaseType databaseType)
Create a DbConnection
+
readonly IApplication application
The IApplication for the SetupWizard
Definition: SetupWizard.cs:41
+
Task CreateDirectory(string path, CancellationToken cancellationToken)
Create a directory at path
+ +
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the DatabaseConfiguration re...
+
readonly IIOManager ioManager
The IIOManager for the SetupWizard
Definition: SetupWizard.cs:26
+
readonly IDBConnectionFactory dbConnectionFactory
The IDBConnectionFactory for the SetupWizard
Definition: SetupWizard.cs:46
+ +
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the SetupWizard
Definition: SetupWizard.cs:66
+
SetupWizard(IIOManager ioManager, IConsole console, IHostingEnvironment hostingEnvironment, IApplication application, IDBConnectionFactory dbConnectionFactory, IPlatformIdentifier platformIdentifier, IAsyncDelayer asyncDelayer, ILogger< SetupWizard > logger, IOptions< GeneralConfiguration > generalConfigurationOptions)
Construct a SetupWizard
Definition: SetupWizard.cs:80
+
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists
+
async Task< bool > PromptYesNo(string question, CancellationToken cancellationToken)
A prompt for a yes or no value
Definition: SetupWizard.cs:99
+
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the ControlPanelConfiguratio...
+
Task< string > ReadLineAsync(bool usePasswordChar, CancellationToken cancellationToken)
Read a line from the IConsole
+ +
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+ +
async Task< DatabaseConfiguration > ConfigureDatabase(CancellationToken cancellationToken)
Prompts the user to create a DatabaseConfiguration
Definition: SetupWizard.cs:144
+ + +
bool IsWindows
If the current platform is a Windows platform
+
Task WriteAsync(string text, bool newLine, CancellationToken cancellationToken)
Write some text to the IConsole
+
async Task< GeneralConfiguration > ConfigureGeneral(CancellationToken cancellationToken)
Prompts the user to create a GeneralConfiguration
Definition: SetupWizard.cs:332
+ +
async Task SaveConfiguration(string userConfigFileName, ushort? hostingPort, DatabaseConfiguration databaseConfiguration, GeneralConfiguration newGeneralConfiguration, FileLoggingConfiguration fileLoggingConfiguration, ControlPanelConfiguration controlPanelConfiguration, CancellationToken cancellationToken)
Saves a given Configuration set to userConfigFileName
Definition: SetupWizard.cs:505
+
readonly IHostingEnvironment hostingEnvironment
The IHostingEnvironment for the SetupWizard
Definition: SetupWizard.cs:36
+
async Task< ushort?> PromptForHostingPort(CancellationToken cancellationToken)
Prompts the user to enter the port to host TGS on
Definition: SetupWizard.cs:120
+
Configuration options for the Models.DatabaseContext<TParentContext>
+
async Task< FileLoggingConfiguration > ConfigureLogging(CancellationToken cancellationToken)
Prompts the user to create a FileLoggingConfiguration
Definition: SetupWizard.cs:387
+ +
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the SetupWizard
Definition: SetupWizard.cs:56
+
async Task< bool > CheckRunWizard(CancellationToken cancellationToken)
Run the setup wizard if necessary
Definition: SetupWizard.cs:588
+
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the SetupWizard
Definition: SetupWizard.cs:51
+
DatabaseType
Type of database to user
Definition: DatabaseType.cs:6
+ +
The command line Configuration setup wizard
Definition: ISetupWizard.cs:9
+ +
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the FileLoggingConfiguration...
+ +
Interface for using filesystems
Definition: IIOManager.cs:11
+
For identifying the current platform
+
readonly ILogger< SetupWizard > logger
The ILogger for the SetupWizard
Definition: SetupWizard.cs:61
+
Task PressAnyKeyAsync(CancellationToken cancellationToken)
Wait for a key press on the IConsole
+
Task< byte[]> ReadAllBytes(string path, CancellationToken cancellationToken)
Returns all the contents of a file at path as a byte array
+
async Task RunWizard(string userConfigFileName, CancellationToken cancellationToken)
Runs the SetupWizard
Definition: SetupWizard.cs:565
+
Task DeleteFile(string path, CancellationToken cancellationToken)
Deletes a file at path
+ +
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+ + +
+ + + + diff --git a/_setup_wizard_mode_8cs.html b/_setup_wizard_mode_8cs.html new file mode 100644 index 0000000000..fb217519cc --- /dev/null +++ b/_setup_wizard_mode_8cs.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Configuration/SetupWizardMode.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
SetupWizardMode.cs File Reference
+
+ + + + + diff --git a/_setup_wizard_mode_8cs_source.html b/_setup_wizard_mode_8cs_source.html new file mode 100644 index 0000000000..d390acd1cd --- /dev/null +++ b/_setup_wizard_mode_8cs_source.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Configuration/SetupWizardMode.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
SetupWizardMode.cs
+
+
+Go to the documentation of this file.
2 {
6  public enum SetupWizardMode
7  {
11  Autodetect,
12 
16  Force,
17 
21  Only,
22 
26  Never
27  }
28 }
+
SetupWizardMode
Determines if the Core.ISetupWizard will run
+ + +
Run the wizard if the appsettings.{Environment}.json is not present or empty
+ +
+ + + + diff --git a/_sql_server_database_context_8cs.html b/_sql_server_database_context_8cs.html new file mode 100644 index 0000000000..ff0f73429f --- /dev/null +++ b/_sql_server_database_context_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/SqlServerDatabaseContext.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
SqlServerDatabaseContext.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.SqlServerDatabaseContext
 DatabaseContext<TParentContext> for Sqlserver More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + diff --git a/_sql_server_database_context_8cs_source.html b/_sql_server_database_context_8cs_source.html new file mode 100644 index 0000000000..d56b769288 --- /dev/null +++ b/_sql_server_database_context_8cs_source.html @@ -0,0 +1,96 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/SqlServerDatabaseContext.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
SqlServerDatabaseContext.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore;
2 using Microsoft.Extensions.Logging;
3 using Microsoft.Extensions.Options;
5 
7 {
11  sealed class SqlServerDatabaseContext : DatabaseContext<SqlServerDatabaseContext>
12  {
20  public SqlServerDatabaseContext(DbContextOptions<SqlServerDatabaseContext> dbContextOptions, IOptions<DatabaseConfiguration> databaseConfiguration, IDatabaseSeeder databaseSeeder, ILogger<SqlServerDatabaseContext> logger) : base(dbContextOptions, databaseConfiguration, databaseSeeder, logger)
21  { }
22 
24  protected override void OnConfiguring(DbContextOptionsBuilder options)
25  {
26  base.OnConfiguring(options);
27  options.UseSqlServer(DatabaseConfiguration.ConnectionString);
28  }
29 
31  protected override bool UseMySQLMigrations() => false;
32  }
33 }
string ConnectionString
The connection string for the database
+
override void OnConfiguring(DbContextOptionsBuilder options)
+ +
For initially seeding a database
+
DatabaseContext<TParentContext> for Sqlserver
+ +
SqlServerDatabaseContext(DbContextOptions< SqlServerDatabaseContext > dbContextOptions, IOptions< DatabaseConfiguration > databaseConfiguration, IDatabaseSeeder databaseSeeder, ILogger< SqlServerDatabaseContext > logger)
Construct a SqlServerDatabaseContext
+ +
Configuration options for the Models.DatabaseContext<TParentContext>
+ +
readonly IDatabaseSeeder databaseSeeder
The IDatabaseSeeder for the DatabaseContext<TParentContext>
+ +
override bool UseMySQLMigrations()
If the MY_ class of migrations should be used instead of the MS_ class
+ +
+ + + + diff --git a/_sql_server_database_context_model_snapshot_8cs.html b/_sql_server_database_context_model_snapshot_8cs.html new file mode 100644 index 0000000000..a9f8ef829f --- /dev/null +++ b/_sql_server_database_context_model_snapshot_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/SqlServerDatabaseContextModelSnapshot.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
SqlServerDatabaseContextModelSnapshot.cs File Reference
+
+ + + + + diff --git a/_sql_server_database_context_model_snapshot_8cs_source.html b/_sql_server_database_context_model_snapshot_8cs_source.html new file mode 100644 index 0000000000..c53465c5b9 --- /dev/null +++ b/_sql_server_database_context_model_snapshot_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/SqlServerDatabaseContextModelSnapshot.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
SqlServerDatabaseContextModelSnapshot.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated />
2 using System;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.EntityFrameworkCore.Infrastructure;
5 using Microsoft.EntityFrameworkCore.Metadata;
6 using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
7 
9 {
10  [DbContext(typeof(SqlServerDatabaseContext))]
12  {
13  protected override void BuildModel(ModelBuilder modelBuilder)
14  {
15 #pragma warning disable 612, 618
16  modelBuilder
17  .HasAnnotation("ProductVersion", "2.1.4-rtm-31024")
18  .HasAnnotation("Relational:MaxIdentifierLength", 128)
19  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
20 
21  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
22  {
23  b.Property<long>("Id")
24  .ValueGeneratedOnAdd()
25  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
26 
27  b.Property<string>("ConnectionString")
28  .IsRequired();
29 
30  b.Property<bool?>("Enabled");
31 
32  b.Property<long>("InstanceId");
33 
34  b.Property<string>("Name")
35  .IsRequired();
36 
37  b.Property<int?>("Provider");
38 
39  b.HasKey("Id");
40 
41  b.HasIndex("InstanceId");
42 
43  b.HasIndex("Name")
44  .IsUnique();
45 
46  b.ToTable("ChatBots");
47  });
48 
49  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
50  {
51  b.Property<long>("Id")
52  .ValueGeneratedOnAdd()
53  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
54 
55  b.Property<long>("ChatSettingsId");
56 
57  b.Property<decimal?>("DiscordChannelId")
58  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
59 
60  b.Property<string>("IrcChannel");
61 
62  b.Property<bool?>("IsAdminChannel")
63  .IsRequired();
64 
65  b.Property<bool?>("IsUpdatesChannel")
66  .IsRequired();
67 
68  b.Property<bool?>("IsWatchdogChannel")
69  .IsRequired();
70 
71  b.Property<string>("Tag");
72 
73  b.HasKey("Id");
74 
75  b.HasIndex("ChatSettingsId", "DiscordChannelId")
76  .IsUnique()
77  .HasFilter("[DiscordChannelId] IS NOT NULL");
78 
79  b.HasIndex("ChatSettingsId", "IrcChannel")
80  .IsUnique()
81  .HasFilter("[IrcChannel] IS NOT NULL");
82 
83  b.ToTable("ChatChannels");
84  });
85 
86  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
87  {
88  b.Property<long>("Id")
89  .ValueGeneratedOnAdd()
90  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
91 
92  b.Property<string>("ByondVersion")
93  .IsRequired();
94 
95  b.Property<Guid?>("DirectoryName")
96  .IsRequired();
97 
98  b.Property<string>("DmeName")
99  .IsRequired();
100 
101  b.Property<long>("JobId");
102 
103  b.Property<int>("MinimumSecurityLevel");
104 
105  b.Property<string>("Output")
106  .IsRequired();
107 
108  b.Property<long>("RevisionInformationId");
109 
110  b.HasKey("Id");
111 
112  b.HasIndex("DirectoryName");
113 
114  b.HasIndex("JobId")
115  .IsUnique();
116 
117  b.HasIndex("RevisionInformationId");
118 
119  b.ToTable("CompileJobs");
120  });
121 
122  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
123  {
124  b.Property<long>("Id")
125  .ValueGeneratedOnAdd()
126  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
127 
128  b.Property<string>("AccessToken");
129 
130  b.Property<bool?>("AllowWebClient")
131  .IsRequired();
132 
133  b.Property<bool?>("AutoStart")
134  .IsRequired();
135 
136  b.Property<long>("InstanceId");
137 
138  b.Property<int>("PrimaryPort");
139 
140  b.Property<int?>("ProcessId");
141 
142  b.Property<int>("SecondaryPort");
143 
144  b.Property<int>("SecurityLevel");
145 
146  b.Property<bool?>("SoftRestart")
147  .IsRequired();
148 
149  b.Property<bool?>("SoftShutdown")
150  .IsRequired();
151 
152  b.Property<long>("StartupTimeout");
153 
154  b.HasKey("Id");
155 
156  b.HasIndex("InstanceId")
157  .IsUnique();
158 
159  b.ToTable("DreamDaemonSettings");
160  });
161 
162  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
163  {
164  b.Property<long>("Id")
165  .ValueGeneratedOnAdd()
166  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
167 
168  b.Property<int>("ApiValidationPort");
169 
170  b.Property<int>("ApiValidationSecurityLevel");
171 
172  b.Property<long>("InstanceId");
173 
174  b.Property<string>("ProjectName");
175 
176  b.HasKey("Id");
177 
178  b.HasIndex("InstanceId")
179  .IsUnique();
180 
181  b.ToTable("DreamMakerSettings");
182  });
183 
184  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
185  {
186  b.Property<long>("Id")
187  .ValueGeneratedOnAdd()
188  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
189 
190  b.Property<long>("AutoUpdateInterval");
191 
192  b.Property<int>("ConfigurationType");
193 
194  b.Property<string>("Name")
195  .IsRequired();
196 
197  b.Property<bool?>("Online")
198  .IsRequired();
199 
200  b.Property<string>("Path")
201  .IsRequired();
202 
203  b.HasKey("Id");
204 
205  b.HasIndex("Path")
206  .IsUnique();
207 
208  b.ToTable("Instances");
209  });
210 
211  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
212  {
213  b.Property<long>("Id")
214  .ValueGeneratedOnAdd()
215  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
216 
217  b.Property<decimal>("ByondRights")
218  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
219 
220  b.Property<decimal>("ChatBotRights")
221  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
222 
223  b.Property<decimal>("ConfigurationRights")
224  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
225 
226  b.Property<decimal>("DreamDaemonRights")
227  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
228 
229  b.Property<decimal>("DreamMakerRights")
230  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
231 
232  b.Property<long>("InstanceId");
233 
234  b.Property<decimal>("InstanceUserRights")
235  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
236 
237  b.Property<decimal>("RepositoryRights")
238  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
239 
240  b.Property<long?>("UserId")
241  .IsRequired();
242 
243  b.HasKey("Id");
244 
245  b.HasIndex("InstanceId");
246 
247  b.HasIndex("UserId", "InstanceId")
248  .IsUnique();
249 
250  b.ToTable("InstanceUsers");
251  });
252 
253  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
254  {
255  b.Property<long>("Id")
256  .ValueGeneratedOnAdd()
257  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
258 
259  b.Property<decimal?>("CancelRight")
260  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
261 
262  b.Property<decimal?>("CancelRightsType")
263  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
264 
265  b.Property<bool?>("Cancelled")
266  .IsRequired();
267 
268  b.Property<long?>("CancelledById");
269 
270  b.Property<string>("Description")
271  .IsRequired();
272 
273  b.Property<string>("ExceptionDetails");
274 
275  b.Property<long>("InstanceId");
276 
277  b.Property<DateTimeOffset?>("StartedAt")
278  .IsRequired();
279 
280  b.Property<long>("StartedById");
281 
282  b.Property<DateTimeOffset?>("StoppedAt");
283 
284  b.HasKey("Id");
285 
286  b.HasIndex("CancelledById");
287 
288  b.HasIndex("InstanceId");
289 
290  b.HasIndex("StartedById");
291 
292  b.ToTable("Jobs");
293  });
294 
295  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
296  {
297  b.Property<long>("Id")
298  .ValueGeneratedOnAdd()
299  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
300 
301  b.Property<string>("AccessIdentifier")
302  .IsRequired();
303 
304  b.Property<string>("ChatChannelsJson")
305  .IsRequired();
306 
307  b.Property<string>("ChatCommandsJson")
308  .IsRequired();
309 
310  b.Property<long>("CompileJobId");
311 
312  b.Property<bool>("IsPrimary");
313 
314  b.Property<int>("Port");
315 
316  b.Property<int>("ProcessId");
317 
318  b.Property<int>("RebootState");
319 
320  b.Property<string>("ServerCommandsJson")
321  .IsRequired();
322 
323  b.HasKey("Id");
324 
325  b.HasIndex("CompileJobId");
326 
327  b.ToTable("ReattachInformations");
328  });
329 
330  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
331  {
332  b.Property<long>("Id")
333  .ValueGeneratedOnAdd()
334  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
335 
336  b.Property<string>("AccessToken");
337 
338  b.Property<string>("AccessUser");
339 
340  b.Property<bool?>("AutoUpdatesKeepTestMerges")
341  .IsRequired();
342 
343  b.Property<bool?>("AutoUpdatesSynchronize")
344  .IsRequired();
345 
346  b.Property<string>("CommitterEmail")
347  .IsRequired();
348 
349  b.Property<string>("CommitterName")
350  .IsRequired();
351 
352  b.Property<long>("InstanceId");
353 
354  b.Property<bool?>("PostTestMergeComment")
355  .IsRequired();
356 
357  b.Property<bool?>("PushTestMergeCommits")
358  .IsRequired();
359 
360  b.Property<bool?>("ShowTestMergeCommitters")
361  .IsRequired();
362 
363  b.HasKey("Id");
364 
365  b.HasIndex("InstanceId")
366  .IsUnique();
367 
368  b.ToTable("RepositorySettings");
369  });
370 
371  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
372  {
373  b.Property<long>("Id")
374  .ValueGeneratedOnAdd()
375  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
376 
377  b.Property<long>("RevisionInformationId");
378 
379  b.Property<long>("TestMergeId");
380 
381  b.HasKey("Id");
382 
383  b.HasIndex("RevisionInformationId");
384 
385  b.HasIndex("TestMergeId");
386 
387  b.ToTable("RevInfoTestMerges");
388  });
389 
390  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
391  {
392  b.Property<long>("Id")
393  .ValueGeneratedOnAdd()
394  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
395 
396  b.Property<string>("CommitSha")
397  .IsRequired()
398  .HasMaxLength(40);
399 
400  b.Property<long>("InstanceId");
401 
402  b.Property<string>("OriginCommitSha")
403  .IsRequired()
404  .HasMaxLength(40);
405 
406  b.HasKey("Id");
407 
408  b.HasIndex("InstanceId", "CommitSha")
409  .IsUnique();
410 
411  b.ToTable("RevisionInformations");
412  });
413 
414  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
415  {
416  b.Property<long>("Id")
417  .ValueGeneratedOnAdd()
418  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
419 
420  b.Property<string>("Author")
421  .IsRequired();
422 
423  b.Property<string>("BodyAtMerge")
424  .IsRequired();
425 
426  b.Property<string>("Comment");
427 
428  b.Property<DateTimeOffset>("MergedAt");
429 
430  b.Property<long>("MergedById");
431 
432  b.Property<int?>("Number")
433  .IsRequired();
434 
435  b.Property<long?>("PrimaryRevisionInformationId")
436  .IsRequired();
437 
438  b.Property<string>("PullRequestRevision")
439  .IsRequired();
440 
441  b.Property<string>("TitleAtMerge")
442  .IsRequired();
443 
444  b.Property<string>("Url")
445  .IsRequired();
446 
447  b.HasKey("Id");
448 
449  b.HasIndex("MergedById");
450 
451  b.HasIndex("PrimaryRevisionInformationId")
452  .IsUnique();
453 
454  b.ToTable("TestMerges");
455  });
456 
457  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
458  {
459  b.Property<long>("Id")
460  .ValueGeneratedOnAdd()
461  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
462 
463  b.Property<decimal>("AdministrationRights")
464  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
465 
466  b.Property<string>("CanonicalName")
467  .IsRequired();
468 
469  b.Property<DateTimeOffset?>("CreatedAt")
470  .IsRequired();
471 
472  b.Property<long?>("CreatedById");
473 
474  b.Property<bool?>("Enabled")
475  .IsRequired();
476 
477  b.Property<decimal>("InstanceManagerRights")
478  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
479 
480  b.Property<DateTimeOffset?>("LastPasswordUpdate");
481 
482  b.Property<string>("Name")
483  .IsRequired();
484 
485  b.Property<string>("PasswordHash");
486 
487  b.Property<string>("SystemIdentifier");
488 
489  b.HasKey("Id");
490 
491  b.HasIndex("CanonicalName")
492  .IsUnique();
493 
494  b.HasIndex("CreatedById");
495 
496  b.ToTable("Users");
497  });
498 
499  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
500  {
501  b.Property<long>("Id")
502  .ValueGeneratedOnAdd()
503  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
504 
505  b.Property<long?>("AlphaId");
506 
507  b.Property<bool>("AlphaIsActive");
508 
509  b.Property<long?>("BravoId");
510 
511  b.Property<long>("InstanceId");
512 
513  b.HasKey("Id");
514 
515  b.HasIndex("AlphaId");
516 
517  b.HasIndex("BravoId");
518 
519  b.HasIndex("InstanceId")
520  .IsUnique();
521 
522  b.ToTable("WatchdogReattachInformations");
523  });
524 
525  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
526  {
527  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
528  .WithMany("ChatSettings")
529  .HasForeignKey("InstanceId")
530  .OnDelete(DeleteBehavior.Cascade);
531  });
532 
533  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
534  {
535  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
536  .WithMany("Channels")
537  .HasForeignKey("ChatSettingsId")
538  .OnDelete(DeleteBehavior.Cascade);
539  });
540 
541  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
542  {
543  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
544  .WithOne()
545  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
546  .OnDelete(DeleteBehavior.Restrict);
547 
548  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
549  .WithMany("CompileJobs")
550  .HasForeignKey("RevisionInformationId")
551  .OnDelete(DeleteBehavior.Cascade);
552  });
553 
554  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
555  {
556  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
557  .WithOne("DreamDaemonSettings")
558  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
559  .OnDelete(DeleteBehavior.Cascade);
560  });
561 
562  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
563  {
564  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
565  .WithOne("DreamMakerSettings")
566  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
567  .OnDelete(DeleteBehavior.Cascade);
568  });
569 
570  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
571  {
572  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
573  .WithMany("InstanceUsers")
574  .HasForeignKey("InstanceId")
575  .OnDelete(DeleteBehavior.Cascade);
576 
577  b.HasOne("Tgstation.Server.Host.Models.User")
578  .WithMany("InstanceUsers")
579  .HasForeignKey("UserId")
580  .OnDelete(DeleteBehavior.Cascade);
581  });
582 
583  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
584  {
585  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
586  .WithMany()
587  .HasForeignKey("CancelledById");
588 
589  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
590  .WithMany("Jobs")
591  .HasForeignKey("InstanceId")
592  .OnDelete(DeleteBehavior.Cascade);
593 
594  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
595  .WithMany()
596  .HasForeignKey("StartedById")
597  .OnDelete(DeleteBehavior.Cascade);
598  });
599 
600  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
601  {
602  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
603  .WithMany()
604  .HasForeignKey("CompileJobId")
605  .OnDelete(DeleteBehavior.Cascade);
606  });
607 
608  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
609  {
610  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
611  .WithOne("RepositorySettings")
612  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
613  .OnDelete(DeleteBehavior.Cascade);
614  });
615 
616  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
617  {
618  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
619  .WithMany("ActiveTestMerges")
620  .HasForeignKey("RevisionInformationId")
621  .OnDelete(DeleteBehavior.Cascade);
622 
623  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
624  .WithMany("RevisonInformations")
625  .HasForeignKey("TestMergeId")
626  .OnDelete(DeleteBehavior.Cascade);
627  });
628 
629  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
630  {
631  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
632  .WithMany("RevisionInformations")
633  .HasForeignKey("InstanceId")
634  .OnDelete(DeleteBehavior.Cascade);
635  });
636 
637  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
638  {
639  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
640  .WithMany("TestMerges")
641  .HasForeignKey("MergedById")
642  .OnDelete(DeleteBehavior.Restrict);
643 
644  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
645  .WithOne("PrimaryTestMerge")
646  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
647  .OnDelete(DeleteBehavior.Restrict);
648  });
649 
650  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
651  {
652  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
653  .WithMany("CreatedUsers")
654  .HasForeignKey("CreatedById");
655  });
656 
657  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
658  {
659  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
660  .WithMany()
661  .HasForeignKey("AlphaId");
662 
663  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
664  .WithMany()
665  .HasForeignKey("BravoId");
666 
667  b.HasOne("Tgstation.Server.Host.Models.Instance")
668  .WithOne("WatchdogReattachInformation")
669  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
670  .OnDelete(DeleteBehavior.Cascade);
671  });
672 #pragma warning restore 612, 618
673  }
674  }
675 }
+ + + + +
+ + + + diff --git a/_sql_server_design_time_db_context_factory_8cs.html b/_sql_server_design_time_db_context_factory_8cs.html new file mode 100644 index 0000000000..4648d45ecb --- /dev/null +++ b/_sql_server_design_time_db_context_factory_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
SqlServerDesignTimeDbContextFactory.cs File Reference
+
+ + + + + diff --git a/_sql_server_design_time_db_context_factory_8cs_source.html b/_sql_server_design_time_db_context_factory_8cs_source.html new file mode 100644 index 0000000000..9e1d6858b0 --- /dev/null +++ b/_sql_server_design_time_db_context_factory_8cs_source.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/SqlServerDesignTimeDbContextFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
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;
6 
8 {
10  sealed class SqlServerDesignTimeDbContextFactory : IDesignTimeDbContextFactory<SqlServerDatabaseContext>
11  {
14  {
15  using (var loggerFactory = new LoggerFactory())
16  {
17  return new SqlServerDatabaseContext(new DbContextOptions<SqlServerDatabaseContext>(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher<User>())), loggerFactory.CreateLogger<SqlServerDatabaseContext>());
18  }
19  }
20  }
21 }
static IOptions< DatabaseConfiguration > GetDbContextOptions()
Get the IOptions<TOptions> for the DatabaseConfiguration
+ +
Contains helpers for creating design time DatabaseContext<TParentContext>s
+ +
DatabaseContext<TParentContext> for Sqlserver
+ + + + + + + + +
+ + + + diff --git a/_synchronous_i_o_manager_8cs.html b/_synchronous_i_o_manager_8cs.html new file mode 100644 index 0000000000..815d89687a --- /dev/null +++ b/_synchronous_i_o_manager_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/SynchronousIOManager.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
SynchronousIOManager.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.IO.SynchronousIOManager
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.IO
 
+
+ + + + diff --git a/_synchronous_i_o_manager_8cs_source.html b/_synchronous_i_o_manager_8cs_source.html new file mode 100644 index 0000000000..89f86b4b5f --- /dev/null +++ b/_synchronous_i_o_manager_8cs_source.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/SynchronousIOManager.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
SynchronousIOManager.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Globalization;
4 using System.IO;
5 using System.Linq;
6 using System.Security.Cryptography;
7 using System.Threading;
8 
10 {
13  {
15  public bool CreateDirectory(string path, CancellationToken cancellationToken)
16  {
17  if (IsDirectory(path))
18  return true;
19  cancellationToken.ThrowIfCancellationRequested();
20  Directory.CreateDirectory(path);
21  return false;
22  }
23 
25  public bool DeleteDirectory(string path)
26  {
27  if (File.Exists(path))
28  return false;
29 
30  if (!Directory.Exists(path))
31  return true;
32 
33  if (Directory.EnumerateFileSystemEntries(path).Any())
34  return false;
35 
36  Directory.Delete(path);
37  return true;
38  }
39 
41  public IEnumerable<string> GetDirectories(string path, CancellationToken cancellationToken)
42  {
43  foreach (var I in Directory.EnumerateDirectories(path))
44  {
45  yield return Path.GetFileName(I);
46  cancellationToken.ThrowIfCancellationRequested();
47  }
48  }
49 
51  public IEnumerable<string> GetFiles(string path, CancellationToken cancellationToken)
52  {
53  foreach (var I in Directory.EnumerateFiles(path))
54  {
55  yield return Path.GetFileName(I);
56  cancellationToken.ThrowIfCancellationRequested();
57  }
58  }
59 
61  public bool IsDirectory(string path)
62  {
63  if (path == null)
64  throw new ArgumentNullException(nameof(path));
65  return Directory.Exists(path);
66  }
67 
69  public byte[] ReadFile(string path)
70  {
71  if (path == null)
72  throw new ArgumentNullException(nameof(path));
73  return File.ReadAllBytes(path);
74  }
75 
77  public bool WriteFileChecked(string path, byte[] data, ref string sha1InOut, CancellationToken cancellationToken)
78  {
79  if (path == null)
80  throw new ArgumentNullException(nameof(path));
81  cancellationToken.ThrowIfCancellationRequested();
82  var directory = Path.GetDirectoryName(path);
83  Directory.CreateDirectory(directory);
84  cancellationToken.ThrowIfCancellationRequested();
85  using (var file = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
86  {
87  cancellationToken.ThrowIfCancellationRequested();
88 
89  // as nice as it would be to not have to arrayify the memory stream, we have to
90  // because, oddly enough sha1(memorystream) != sha1(memorystream.ToArray())
91  // vOv
92  byte[] originalBytes;
93  using (var readMs = new MemoryStream())
94  {
95  file.CopyTo(readMs);
96  originalBytes = readMs.ToArray();
97  }
98 
99  // no sha1? no write
100  if (originalBytes.Length != 0 && sha1InOut == null)
101  return false;
102 
103  // suppressed due to only using for consistency checks
104 #pragma warning disable CA5350 // Do not use insecure cryptographic algorithm SHA1.
105  using (var sha1 = new SHA1Managed())
106 #pragma warning restore CA5350 // Do not use insecure cryptographic algorithm SHA1.
107  {
108  string GetSha1(byte[] dataToHash) => dataToHash != null && dataToHash.Length != 0 ? String.Join(String.Empty, sha1.ComputeHash(dataToHash).Select(b => b.ToString("x2", CultureInfo.InvariantCulture))) : null;
109  var originalSha1 = GetSha1(originalBytes);
110  if (originalSha1 != sha1InOut)
111  {
112  sha1InOut = originalSha1;
113  return false;
114  }
115 
116  sha1InOut = GetSha1(data);
117  }
118 
119  cancellationToken.ThrowIfCancellationRequested();
120 
121  if (data != null)
122  {
123  file.Seek(0, SeekOrigin.Begin);
124 
125  cancellationToken.ThrowIfCancellationRequested();
126  file.SetLength(data.Length);
127  file.Write(data, 0, data.Length);
128  }
129  }
130 
131  if (data == null)
132  File.Delete(path);
133  return true;
134  }
135  }
136 }
IEnumerable< string > GetDirectories(string path, CancellationToken cancellationToken)
Enumerate directories in a given path
+
bool CreateDirectory(string path, CancellationToken cancellationToken)
Create an empty directory at path
+
byte [] ReadFile(string path)
Read the bytes of a file at a given path
+
For accessing the disk in a synchronous manner
+
bool WriteFileChecked(string path, byte[] data, ref string sha1InOut, CancellationToken cancellationToken)
Write data to a file at a given path
+ +
bool IsDirectory(string path)
Checks if a given path is a directory
+
bool DeleteDirectory(string path)
Deletes a directory at path if it's empty
+
IEnumerable< string > GetFiles(string path, CancellationToken cancellationToken)
Enumerate files in a given path
+ +
+ + + + diff --git a/_task_extensions_8cs.html b/_task_extensions_8cs.html new file mode 100644 index 0000000000..5eca39fb8f --- /dev/null +++ b/_task_extensions_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/TaskExtensions.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TaskExtensions.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Core.TaskExtensions
 Extensions for the Task class. More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
+
+ + + + diff --git a/_task_extensions_8cs_source.html b/_task_extensions_8cs_source.html new file mode 100644 index 0000000000..00970a5b57 --- /dev/null +++ b/_task_extensions_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core/TaskExtensions.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TaskExtensions.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4 
6 {
10  static class TaskExtensions
11  {
18  public static Task WithToken(this Task task, CancellationToken cancellationToken)
19  {
20  if (task == null)
21  throw new ArgumentNullException(nameof(task));
22 
23  async Task<object> Wrap()
24  {
25  await task.ConfigureAwait(false);
26  return null;
27  }
28 
29  return Wrap().WithToken(cancellationToken);
30  }
31 
39  public static async Task<T> WithToken<T>(this Task<T> task, CancellationToken cancellationToken)
40  {
41  if (task == null)
42  throw new ArgumentNullException(nameof(task));
43 
44  var cancelTcs = new TaskCompletionSource<object>();
45  using (cancellationToken.Register(() => cancelTcs.SetCanceled()))
46  await Task.WhenAny(task, cancelTcs.Task).ConfigureAwait(false);
47  cancellationToken.ThrowIfCancellationRequested();
48 
49  return await task.ConfigureAwait(false);
50  }
51  }
52 }
static async Task< T > WithToken< T >(this Task< T > task, CancellationToken cancellationToken)
Create a Task<TResult> that can be awaited while respecting a given cancellationToken .
+
static Task WithToken(this Task task, CancellationToken cancellationToken)
Create a Task that can be awaited while respecting a given cancellationToken .
+ +
Extensions for the Task class.
+
+ + + + diff --git a/_temporary_dmb_provider_8cs.html b/_temporary_dmb_provider_8cs.html new file mode 100644 index 0000000000..38dacf5a8c --- /dev/null +++ b/_temporary_dmb_provider_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Compiler/TemporaryDmbProvider.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TemporaryDmbProvider.cs File Reference
+
+ + + + + diff --git a/_temporary_dmb_provider_8cs_source.html b/_temporary_dmb_provider_8cs_source.html new file mode 100644 index 0000000000..3e73a503b5 --- /dev/null +++ b/_temporary_dmb_provider_8cs_source.html @@ -0,0 +1,96 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Compiler/TemporaryDmbProvider.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TemporaryDmbProvider.cs
+
+
+Go to the documentation of this file.
1 using System;
3 
5 {
10  {
12  public string DmbName { get; }
13 
15  public string PrimaryDirectory { get; }
16 
18  public string SecondaryDirectory => throw new NotSupportedException();
19 
21  public CompileJob CompileJob { get; }
22 
29  public TemporaryDmbProvider(string directory, string dmb, CompileJob compileJob)
30  {
31  DmbName = dmb ?? throw new ArgumentNullException(nameof(dmb));
32  PrimaryDirectory = directory ?? throw new ArgumentNullException(nameof(directory));
33  CompileJob = compileJob ?? throw new ArgumentNullException(nameof(compileJob));
34  }
35 
37  public void Dispose() { }
38 
40  public void KeepAlive() => throw new NotSupportedException();
41  }
42 }
TemporaryDmbProvider(string directory, string dmb, CompileJob compileJob)
Construct a TemporaryDmbProvider
+ + + + + + + +
Provides absolute paths to the latest compiled .dmbs
Definition: IDmbProvider.cs:9
+ + + +
void KeepAlive()
Disposing the IDmbProvider won't cause a cleanup of the working directory
+ +
+ + + + diff --git a/_test_api_client_8cs.html b/_test_api_client_8cs.html new file mode 100644 index 0000000000..5c0bc06fc1 --- /dev/null +++ b/_test_api_client_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/TestApiClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestApiClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Client.Tests.TestApiClient
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
namespace  Tgstation.Server.Client.Tests
 
+
+ + + + diff --git a/_test_api_client_8cs_source.html b/_test_api_client_8cs_source.html new file mode 100644 index 0000000000..ea65668486 --- /dev/null +++ b/_test_api_client_8cs_source.html @@ -0,0 +1,96 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/TestApiClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestApiClient.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using Moq;
3 using Newtonsoft.Json;
4 using Newtonsoft.Json.Converters;
5 using Newtonsoft.Json.Serialization;
6 using System;
7 using System.Net;
8 using System.Net.Http;
9 using System.Net.Http.Headers;
10 using System.Threading;
11 using System.Threading.Tasks;
12 using Tgstation.Server.Api;
14 
16 {
17  [TestClass]
18  public sealed class TestApiClient
19  {
20  [TestMethod]
22  {
23  var sample = new Byond
24  {
25  Version = new Version(511, 1385)
26  };
27 
28  var sampleJson = JsonConvert.SerializeObject(sample, new JsonSerializerSettings
29  {
30  ContractResolver = new CamelCasePropertyNamesContractResolver(),
31  Converters = new[] { new VersionConverter() }
32  });
33 
34  var response = new HttpResponseMessage(HttpStatusCode.OK)
35  {
36  Content = new StringContent(sampleJson)
37  };
38 
39  var httpClient = new Mock<IHttpClient>();
40  httpClient.Setup(x => x.SendAsync(It.IsNotNull<HttpRequestMessage>(), It.IsAny<CancellationToken>())).Returns(Task.FromResult(response));
41 
42  var client = new ApiClient(httpClient.Object, new Uri("http://fake.com"), new ApiHeaders(new ProductHeaderValue("fake"), "fake"));
43 
44  var result = await client.Read<Byond>(Routes.Byond, default).ConfigureAwait(false);
45  Assert.AreEqual(sample.Version, result.Version);
46  }
47 
48  [TestMethod]
49  public async Task TestUnrecognizedResponse()
50  {
51  var sample = new Byond
52  {
53  Version = new Version(511, 1385)
54  };
55 
56  var fakeJson = "asdfasd <>F#(*)U*#JLI";
57 
58  var response = new HttpResponseMessage(HttpStatusCode.OK)
59  {
60  Content = new StringContent(fakeJson)
61  };
62 
63  var httpClient = new Mock<IHttpClient>();
64  httpClient.Setup(x => x.SendAsync(It.IsNotNull<HttpRequestMessage>(), It.IsAny<CancellationToken>())).Returns(Task.FromResult(response));
65 
66  var client = new ApiClient(httpClient.Object, new Uri("http://fake.com"), new ApiHeaders(new ProductHeaderValue("fake"), "fake"));
67 
68  await Assert.ThrowsExceptionAsync<UnrecognizedResponseException>(() => client.Read<Byond>(Routes.Byond, default)).ConfigureAwait(false);
69  }
70  }
71 }
const string Byond
The Models.Byond controller
Definition: Routes.cs:34
+ +
Occurs when a response is received that did not deserialize to one of the expected Api....
+ + + +
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
Routes to a server actions
Definition: Routes.cs:9
+ +
Represents a BYOND installation
Definition: Byond.cs:8
+ + + + +
+ + + + diff --git a/_test_api_headers_8cs.html b/_test_api_headers_8cs.html new file mode 100644 index 0000000000..960cc88f00 --- /dev/null +++ b/_test_api_headers_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/TestApiHeaders.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestApiHeaders.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Tests.TestApiHeaders
 Tests for ApiHeaders More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Tests
 
+
+ + + + diff --git a/_test_api_headers_8cs_source.html b/_test_api_headers_8cs_source.html new file mode 100644 index 0000000000..a310363232 --- /dev/null +++ b/_test_api_headers_8cs_source.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/TestApiHeaders.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestApiHeaders.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Http;
2 using Microsoft.AspNetCore.Http.Headers;
3 using Microsoft.VisualStudio.TestTools.UnitTesting;
4 using System;
5 using System.Net.Http.Headers;
6 
8 {
12  [TestClass]
13  public sealed class TestApiHeaders
14  {
15  readonly ProductHeaderValue productHeaderValue = new ProductHeaderValue("Tgstation.Server.Api.Tests", "1.0.0");
16 
17  [TestMethod]
18  public void TestConstruction()
19  {
20  Assert.ThrowsException<ArgumentNullException>(() => new ApiHeaders(null, null));
21  Assert.ThrowsException<ArgumentNullException>(() => new ApiHeaders(productHeaderValue, null));
22  var headers = new ApiHeaders(productHeaderValue, String.Empty);
23  }
24 
25  [TestMethod]
26  public void TestUserAgentsAreValid()
27  {
28  const string BrowserHeader = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36.";
29  const string ConformantHeader = "TGSClient/3.2.1.4";
30 
31  ApiHeaders TestHeader(string userAgent)
32  {
33  var headers = new HeaderDictionary
34  {
35  { "Accept", ApiHeaders.ApplicationJson },
36  { "Api", "Tgstation.Server.Api/4.0.0.0" },
37  { "Authorization", "Bearer asdfasdf" },
38  { "User-Agent", userAgent }
39  };
40 
41  return new ApiHeaders(new RequestHeaders(headers));
42  };
43 
44  var header = TestHeader(BrowserHeader);
45  Assert.AreEqual(BrowserHeader, header.RawUserAgent);
46  Assert.IsNull(header.UserAgent);
47 
48  header = TestHeader(ConformantHeader);
49  Assert.AreEqual(ConformantHeader, header.RawUserAgent);
50  Assert.IsNotNull(header.UserAgent);
51 
52  Assert.ThrowsException<InvalidOperationException>(() => TestHeader(String.Empty));
53  }
54  }
55 }
const string ApplicationJson
TODO: Remove this when https://github.com/dotnet/corefx/pull/26701 makes it into the sdk
Definition: ApiHeaders.cs:21
+
readonly ProductHeaderValue productHeaderValue
+ + +
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+ + +
+ + + + diff --git a/_test_application_8cs.html b/_test_application_8cs.html new file mode 100644 index 0000000000..3dd814495a --- /dev/null +++ b/_test_application_8cs.html @@ -0,0 +1,111 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestApplication.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestApplication.cs File Reference
+
+ + + + + diff --git a/_test_application_8cs_source.html b/_test_application_8cs_source.html new file mode 100644 index 0000000000..a7f83e811f --- /dev/null +++ b/_test_application_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestApplication.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestApplication.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Builder;
2 using Microsoft.AspNetCore.Hosting;
3 using Microsoft.Extensions.Configuration;
4 using Microsoft.Extensions.DependencyInjection;
5 using Microsoft.Extensions.Options;
6 using Microsoft.VisualStudio.TestTools.UnitTesting;
7 using Moq;
8 using System;
9 using System.Collections.Generic;
10 using System.Threading;
11 using System.Threading.Tasks;
14 
16 {
20  [TestClass]
21  public sealed class TestApplication
22  {
23  [TestMethod]
24  public void TestMethodThrows()
25  {
26  Assert.ThrowsException<ArgumentNullException>(() => new Application(null, null));
27  var mockConfiguration = new Mock<IConfiguration>();
28  Assert.ThrowsException<ArgumentNullException>(() => new Application(mockConfiguration.Object, null));
29 
30  var mockHostingEnvironment = new Mock<IHostingEnvironment>();
31 
32  var app = new Application(mockConfiguration.Object, mockHostingEnvironment.Object);
33 
34  Assert.ThrowsException<ArgumentNullException>(() => app.ConfigureServices(null));
35  Assert.ThrowsException<ArgumentNullException>(() => app.Configure(null, null, null, null, null));
36 
37  var mockAppBuilder = new Mock<IApplicationBuilder>();
38  Assert.ThrowsException<ArgumentNullException>(() => app.Configure(mockAppBuilder.Object, null, null, null, null));
39 
40  var mockServerControl = new Mock<IServerControl>();
41  Assert.ThrowsException<ArgumentNullException>(() => app.Configure(mockAppBuilder.Object, mockServerControl.Object, null, null, null));
42 
43  var mockTokenFactory = new Mock<ITokenFactory>();
44  Assert.ThrowsException<ArgumentNullException>(() => app.Configure(mockAppBuilder.Object, mockServerControl.Object, mockTokenFactory.Object, null, null));
45 
46  var mockControlPanelOptions = new Mock<IOptions<ControlPanelConfiguration>>();
47  mockControlPanelOptions.SetupGet(x => x.Value).Returns(new ControlPanelConfiguration()).Verifiable();
48  Assert.ThrowsException<ArgumentNullException>(() => app.Configure(mockAppBuilder.Object, mockServerControl.Object, mockTokenFactory.Object, mockControlPanelOptions.Object, null));
49  mockControlPanelOptions.VerifyAll();
50  }
51 
53  {
54  public Task<bool> CheckRunWizard(CancellationToken cancellationToken) => Task.FromResult(true);
55  }
56 
58  {
59  public CancellationToken ApplicationStarted => default;
60 
61  public CancellationToken ApplicationStopping => default;
62 
63  public CancellationToken ApplicationStopped => default;
64 
65  public void StopApplication() { }
66  }
67 
68  [TestMethod]
70  {
71  var mockConfiguration = new Mock<IConfiguration>();
72  Assert.ThrowsException<ArgumentNullException>(() => new Application(mockConfiguration.Object, null));
73 
74  var mockHostingEnvironment = new Mock<IHostingEnvironment>();
75 
76  var app = new Application(mockConfiguration.Object, mockHostingEnvironment.Object);
77 
78  var mockOptions = new Mock<IOptions<GeneralConfiguration>>();
79  mockOptions.SetupGet(x => x.Value).Returns(new GeneralConfiguration
80  {
82  }).Verifiable();
83 
84  var fakeServiceDescriptor = new List<ServiceDescriptor>()
85  {
86  new ServiceDescriptor(typeof(IApplicationLifetime), typeof(MockApplicationLifetime), ServiceLifetime.Singleton),
87  new ServiceDescriptor(typeof(ISetupWizard), typeof(MockSetupWizard), ServiceLifetime.Singleton),
88  new ServiceDescriptor(typeof(IOptions<GeneralConfiguration>), mockOptions.Object)
89  };
90 
91  var mockServiceCollection = new Mock<IServiceCollection>();
92 
93  var mockConfigSection = new Mock<IConfigurationSection>();
94 
95  mockConfiguration.Setup(x => x.GetSection(It.IsNotNull<string>())).Returns(mockConfigSection.Object).Verifiable();
96  mockServiceCollection.Setup(x => x.GetEnumerator()).Returns(() => fakeServiceDescriptor.GetEnumerator()).Verifiable();
97 
98  Assert.ThrowsException<OperationCanceledException>(() => app.ConfigureServices(mockServiceCollection.Object));
99 
100  mockOptions.VerifyAll();
101  mockConfiguration.VerifyAll();
102  mockServiceCollection.VerifyAll();
103  }
104  }
105 }
Task< bool > CheckRunWizard(CancellationToken cancellationToken)
Run the setup wizard if necessary
+ + +
SetupWizardMode
Determines if the Core.ISetupWizard will run
+ + + + + + + + + + + + +
The command line Configuration setup wizard
Definition: ISetupWizard.cs:9
+ + + + + +
+ + + + diff --git a/_test_async_delayer_8cs.html b/_test_async_delayer_8cs.html new file mode 100644 index 0000000000..67640d113d --- /dev/null +++ b/_test_async_delayer_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestAsyncDelayer.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestAsyncDelayer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Core.Tests.TestAsyncDelayer
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
namespace  Tgstation.Server.Host.Core.Tests
 
+
+ + + + diff --git a/_test_async_delayer_8cs_source.html b/_test_async_delayer_8cs_source.html new file mode 100644 index 0000000000..8bc3775ef6 --- /dev/null +++ b/_test_async_delayer_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestAsyncDelayer.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestAsyncDelayer.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using System;
3 using System.Threading;
4 using System.Threading.Tasks;
5 
7 {
8  [TestClass]
9  public sealed class TestAsyncDelayer
10  {
11  [TestMethod]
12  public async Task TestDelay()
13  {
14  var delayer = new AsyncDelayer();
15  var startDelay = delayer.Delay(TimeSpan.FromSeconds(1), default);
16  var checkDelay = Task.Delay(TimeSpan.FromSeconds(1) - TimeSpan.FromMilliseconds(10), default);
17  await startDelay.ConfigureAwait(false);
18  Assert.IsTrue(checkDelay.IsCompleted);
19  }
20 
21  [TestMethod]
22  public async Task TestCancel()
23  {
24  var delayer = new AsyncDelayer();
25  using (var cts = new CancellationTokenSource())
26  {
27  cts.Cancel();
28  await Assert.ThrowsExceptionAsync<TaskCanceledException>(() => delayer.Delay(TimeSpan.FromSeconds(1), cts.Token)).ConfigureAwait(false);
29  }
30  }
31  }
32 }
+ + + + +
+ + + + diff --git a/_test_authentication_context_8cs.html b/_test_authentication_context_8cs.html new file mode 100644 index 0000000000..8d508bd6e0 --- /dev/null +++ b/_test_authentication_context_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Security/TestAuthenticationContext.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestAuthenticationContext.cs File Reference
+
+ + + + + diff --git a/_test_authentication_context_8cs_source.html b/_test_authentication_context_8cs_source.html new file mode 100644 index 0000000000..2c000d277f --- /dev/null +++ b/_test_authentication_context_8cs_source.html @@ -0,0 +1,98 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Security/TestAuthenticationContext.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestAuthenticationContext.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using Moq;
3 using System;
6 
8 {
12  [TestClass]
13  public sealed class TestAuthenticationContext
14  {
15  [TestMethod]
16  public void TestConstruction()
17  {
18  Assert.ThrowsException<ArgumentNullException>(() => new AuthenticationContext(null, null, null));
19  var mockSystemIdentity = new Mock<ISystemIdentity>();
20 
21  var user = new User();
22 
23  var authContext = new AuthenticationContext(null, user, null);
24  Assert.ThrowsException<ArgumentNullException>(() => new AuthenticationContext(mockSystemIdentity.Object, null, null));
25 
26  var instanceUser = new InstanceUser();
27 
28  Assert.ThrowsException<ArgumentNullException>(() => new AuthenticationContext(null, null, instanceUser));
29  Assert.ThrowsException<ArgumentNullException>(() => new AuthenticationContext(mockSystemIdentity.Object, null, instanceUser));
30  authContext = new AuthenticationContext(mockSystemIdentity.Object, user, null);
31  authContext = new AuthenticationContext(null, user, instanceUser);
32  authContext = new AuthenticationContext(mockSystemIdentity.Object, user, instanceUser);
33  user.SystemIdentifier = "root";
34  Assert.ThrowsException<ArgumentNullException>(() => new AuthenticationContext(null, user, null));
35  }
36 
37 
38  [TestMethod]
39  public void TestGetRightsGeneric()
40  {
41  var user = new User();
42  var instanceUser = new InstanceUser();
43  var authContext = new AuthenticationContext(null, user, instanceUser);
44 
45  user.AdministrationRights = AdministrationRights.WriteUsers;
46  instanceUser.ByondRights = ByondRights.ChangeVersion | ByondRights.ReadActive;
47  Assert.AreEqual((ulong)user.AdministrationRights, authContext.GetRight(RightsType.Administration));
48  Assert.AreEqual((ulong)instanceUser.ByondRights, authContext.GetRight(RightsType.Byond));
49  }
50  }
51 }
+ +
ByondRights
Rights for Models.Byond
Definition: ByondRights.cs:9
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+ + +
AdministrationRights
Rights for Models.Administration
+ + + + + + + + + +
+ + + + diff --git a/_test_console_8cs.html b/_test_console_8cs.html new file mode 100644 index 0000000000..d76ccbd28f --- /dev/null +++ b/_test_console_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/IO/TestConsole.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestConsole.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.IO.Tests.TestConsole
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.IO
 
namespace  Tgstation.Server.Host.IO.Tests
 
+
+ + + + diff --git a/_test_console_8cs_source.html b/_test_console_8cs_source.html new file mode 100644 index 0000000000..12b28c80d4 --- /dev/null +++ b/_test_console_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/IO/TestConsole.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestConsole.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using System;
3 using System.IO;
4 using System.Threading;
5 using System.Threading.Tasks;
6 
8 {
9  [TestClass]
10  public sealed class TestConsole
11  {
12  [TestMethod]
13  public async Task TestWriteLine()
14  {
15  var console = new Console();
16  await Assert.ThrowsExceptionAsync<InvalidOperationException>(() => console.WriteAsync(null, false, default)).ConfigureAwait(false);
17  try
18  {
19  await console.WriteAsync(null, true, default).ConfigureAwait(false);
20  await console.WriteAsync(String.Empty, false, default).ConfigureAwait(true);
21  }
22  catch(InvalidOperationException)
23  {
24  Assert.IsFalse(console.Available);
25  }
26  }
27 
28  [TestMethod]
29  public void TestUserInteractive()
30  {
31  var console = new Console();
32  Assert.AreEqual(Environment.UserInteractive, console.Available);
33  }
34  }
35 }
+ + + + +
+ + + + diff --git a/_test_d_b_connection_factory_8cs.html b/_test_d_b_connection_factory_8cs.html new file mode 100644 index 0000000000..b484e92a48 --- /dev/null +++ b/_test_d_b_connection_factory_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestDBConnectionFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestDBConnectionFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Core.Tests.TestDBConnectionFactory
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
namespace  Tgstation.Server.Host.Core.Tests
 
+
+ + + + diff --git a/_test_d_b_connection_factory_8cs_source.html b/_test_d_b_connection_factory_8cs_source.html new file mode 100644 index 0000000000..1014711c4b --- /dev/null +++ b/_test_d_b_connection_factory_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestDBConnectionFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestDBConnectionFactory.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using MySql.Data.MySqlClient;
3 using System;
4 using System.Data.SqlClient;
6 
8 {
9  [TestClass]
10  public sealed class TestDBConnectionFactory
11  {
12  [TestMethod]
13  public void TestBadParameters()
14  {
15  var factory = new DBConnectionFactory();
16  Assert.ThrowsException<ArgumentNullException>(() => factory.CreateConnection(null, default));
17  Assert.ThrowsException<ArgumentOutOfRangeException>(() => factory.CreateConnection(String.Empty, (DatabaseType)42));
18  }
19 
20  [TestMethod]
21  public void TestWorks()
22  {
23  var factory = new DBConnectionFactory();
24  Assert.IsInstanceOfType(factory.CreateConnection(String.Empty, DatabaseType.MariaDB), typeof(MySqlConnection));
25  Assert.IsInstanceOfType(factory.CreateConnection(String.Empty, DatabaseType.MySql), typeof(MySqlConnection));
26  Assert.IsInstanceOfType(factory.CreateConnection(String.Empty, DatabaseType.SqlServer), typeof(SqlConnection));
27  }
28  }
29 }
+ + + + +
DatabaseType
Type of database to user
Definition: DatabaseType.cs:6
+ + + + + +
+ + + + diff --git a/_test_database_context_factory_8cs.html b/_test_database_context_factory_8cs.html new file mode 100644 index 0000000000..c1d6cb4ca2 --- /dev/null +++ b/_test_database_context_factory_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestDatabaseContextFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestDatabaseContextFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Core.Tests.TestDatabaseContextFactory
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
namespace  Tgstation.Server.Host.Core.Tests
 
+
+ + + + diff --git a/_test_database_context_factory_8cs_source.html b/_test_database_context_factory_8cs_source.html new file mode 100644 index 0000000000..343acc388a --- /dev/null +++ b/_test_database_context_factory_8cs_source.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestDatabaseContextFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestDatabaseContextFactory.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.DependencyInjection;
2 using Microsoft.VisualStudio.TestTools.UnitTesting;
3 using Moq;
4 using System;
5 using System.Threading.Tasks;
7 
9 {
10  [TestClass]
11  public sealed class TestDatabaseContextFactory
12  {
13  [TestMethod]
14  public void TestConstructionThrows()
15  {
16  Assert.ThrowsException<ArgumentNullException>(() => new DatabaseContextFactory(null));
17  var mockProvider = new Mock<IServiceProvider>();
18  mockProvider.Setup(x => x.GetService(typeof(IDatabaseContext))).Verifiable();
19  var mockScope = new Mock<IServiceScope>();
20  mockScope.SetupGet(x => x.ServiceProvider).Returns(mockProvider.Object).Verifiable();
21  var mockScopeFactory = new Mock<IServiceScopeFactory>();
22  mockScopeFactory.Setup(x => x.CreateScope()).Returns(mockScope.Object).Verifiable();
23  Assert.ThrowsException<InvalidOperationException>(() => new DatabaseContextFactory(mockScopeFactory.Object));
24  mockScopeFactory.VerifyAll();
25  mockScope.VerifyAll();
26  mockProvider.VerifyAll();
27  }
28 
29  [TestMethod]
30  public async Task TestWorks()
31  {
32  var mockDatabase = new Mock<IDatabaseContext>();
33  var mockProvider = new Mock<IServiceProvider>();
34  var mockDbo = mockDatabase.Object;
35  mockProvider.Setup(x => x.GetService(typeof(IDatabaseContext))).Returns(mockDbo).Verifiable();
36  var mockScope = new Mock<IServiceScope>();
37  mockScope.SetupGet(x => x.ServiceProvider).Returns(mockProvider.Object).Verifiable();
38  var mockScopeFactory = new Mock<IServiceScopeFactory>();
39  mockScopeFactory.Setup(x => x.CreateScope()).Returns(mockScope.Object).Verifiable();
40 
41  var factory = new DatabaseContextFactory(mockScopeFactory.Object);
42 
43  await Assert.ThrowsExceptionAsync<ArgumentNullException>(() => factory.UseContext(null)).ConfigureAwait(false);
44 
45  await factory.UseContext(context =>
46  {
47  Assert.AreSame(mockDbo, context);
48  return Task.CompletedTask;
49  });
50 
51  mockScopeFactory.VerifyAll();
52  mockScope.VerifyAll();
53  mockProvider.VerifyAll();
54  }
55  }
56 }
+ + + + + + + + + +
+ + + + diff --git a/_test_discord_provider_8cs.html b/_test_discord_provider_8cs.html new file mode 100644 index 0000000000..e76a500a6c --- /dev/null +++ b/_test_discord_provider_8cs.html @@ -0,0 +1,110 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Components/Chat/Providers/TestDiscordProvider.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestDiscordProvider.cs File Reference
+
+ + + + + diff --git a/_test_discord_provider_8cs_source.html b/_test_discord_provider_8cs_source.html new file mode 100644 index 0000000000..7d273873ae --- /dev/null +++ b/_test_discord_provider_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Components/Chat/Providers/TestDiscordProvider.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestDiscordProvider.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using Microsoft.VisualStudio.TestTools.UnitTesting;
3 using Moq;
4 using System;
5 using System.Threading;
6 using System.Threading.Tasks;
7 
9 {
10  [TestClass]
11  public sealed class TestDiscordProvider
12  {
13  string testToken1;
14 
15  [TestInitialize]
16  public void Initialize()
17  {
18  testToken1 = Environment.GetEnvironmentVariable("TGS4_TEST_DISCORD_TOKEN_1");
19  }
20 
21  [TestMethod]
23  {
24  Assert.ThrowsException<ArgumentNullException>(() => new DiscordProvider(null, null));
25  var mockLogger = new Mock<ILogger<DiscordProvider>>();
26  Assert.ThrowsException<ArgumentNullException>(() => new DiscordProvider(mockLogger.Object, null));
27  var mockToken = "asdf";
28  new DiscordProvider(mockLogger.Object, mockToken).Dispose();
29  }
30 
31  [TestMethod]
32  public async Task TestConnectWithFakeTokenFails()
33  {
34  var mockLogger = new Mock<ILogger<DiscordProvider>>();
35  using (var provider = new DiscordProvider(mockLogger.Object, "asdf"))
36  {
37  Assert.IsFalse(await provider.Connect(default).ConfigureAwait(false));
38  Assert.IsFalse(provider.Connected);
39  }
40  }
41 
42  [Ignore("Broken due to dependency issues after first call to .Connect()")]
43  [TestMethod]
44  public async Task TestConnectAndDisconnect()
45  {
46  if (testToken1 == null)
47  Assert.Inconclusive("Required environment variable TGS4_TEST_DISCORD_TOKEN_1 isn't set!");
48 
49 
50  var mockLogger = new Mock<ILogger<DiscordProvider>>();
51  using (var provider = new DiscordProvider(mockLogger.Object, testToken1))
52  {
53  Assert.IsFalse(provider.Connected);
54  await provider.Disconnect(default).ConfigureAwait(false);
55  Assert.IsFalse(provider.Connected);
56  Assert.IsTrue(await provider.Connect(default).ConfigureAwait(false));
57  Assert.IsTrue(provider.Connected);
58  Assert.IsTrue(await provider.Connect(default).ConfigureAwait(false));
59  Assert.IsTrue(provider.Connected);
60 
61  await provider.Disconnect(default).ConfigureAwait(false);
62  Assert.IsFalse(provider.Connected);
63  await provider.Disconnect(default).ConfigureAwait(false);
64  Assert.IsFalse(provider.Connected);
65 
66  //now try it with cancellationTokens
67  using (var cts = new CancellationTokenSource())
68  {
69  cts.Cancel();
70  var cancellationToken = cts.Token;
71  await Assert.ThrowsExceptionAsync<OperationCanceledException>(() => provider.Connect(cancellationToken)).ConfigureAwait(false);
72  Assert.IsFalse(provider.Connected);
73  Assert.IsTrue(await provider.Connect(default).ConfigureAwait(false));
74  Assert.IsTrue(provider.Connected);
75  await Assert.ThrowsExceptionAsync<OperationCanceledException>(() => provider.Disconnect(cancellationToken)).ConfigureAwait(false);
76  Assert.IsTrue(provider.Connected);
77  await provider.Disconnect(default).ConfigureAwait(false);
78  Assert.IsFalse(provider.Connected);
79  }
80 
81  }
82  }
83  }
84 }
+ + + + + + + + +
+ + + + diff --git a/_test_dream_daemon_client_8cs.html b/_test_dream_daemon_client_8cs.html new file mode 100644 index 0000000000..ca660d0b9f --- /dev/null +++ b/_test_dream_daemon_client_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/Components/TestDreamDaemonClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestDreamDaemonClient.cs File Reference
+
+ + + + + diff --git a/_test_dream_daemon_client_8cs_source.html b/_test_dream_daemon_client_8cs_source.html new file mode 100644 index 0000000000..4a64e8c48e --- /dev/null +++ b/_test_dream_daemon_client_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/Components/TestDreamDaemonClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestDreamDaemonClient.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using Moq;
3 using System;
4 using System.Collections.Generic;
5 using System.Text;
6 using System.Threading;
7 using System.Threading.Tasks;
8 using Tgstation.Server.Api;
10 
12 {
13  [TestClass]
14  public sealed class TestDreamDaemonClient
15  {
16  [TestMethod]
17  public async Task TestStart()
18  {
19  var example = new Job
20  {
21  Id = 347,
22  StartedAt = DateTimeOffset.Now
23  };
24 
25  var inst = new Instance
26  {
27  Id = 4958
28  };
29 
30  var mockApiClient = new Mock<IApiClient>();
31  mockApiClient.Setup(x => x.Create<Job>(Routes.DreamDaemon, inst.Id, It.IsAny<CancellationToken>())).Returns(Task.FromResult(example));
32 
33  var client = new DreamDaemonClient(mockApiClient.Object, inst);
34 
35  var result = await client.Start(default).ConfigureAwait(false);
36  Assert.AreSame(example, result);
37  }
38  }
39 }
+ +
Routes to a server actions
Definition: Routes.cs:9
+ +
const string DreamDaemon
The Models.DreamDaemon controller
Definition: Routes.cs:44
+ + +
Metadata about a server instance
Definition: Instance.cs:9
+ + + +
Represents a long running job on the server. Model is read-only, updates attempt to cancel the job
Definition: Job.cs:6
+
+ + + + diff --git a/_test_experimental_watchdog_8cs.html b/_test_experimental_watchdog_8cs.html new file mode 100644 index 0000000000..1d714f4e46 --- /dev/null +++ b/_test_experimental_watchdog_8cs.html @@ -0,0 +1,108 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Components/Watchdog/TestExperimentalWatchdog.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestExperimentalWatchdog.cs File Reference
+
+ + + + + diff --git a/_test_experimental_watchdog_8cs_source.html b/_test_experimental_watchdog_8cs_source.html new file mode 100644 index 0000000000..83fe422a0b --- /dev/null +++ b/_test_experimental_watchdog_8cs_source.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Components/Watchdog/TestExperimentalWatchdog.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestExperimentalWatchdog.cs
+
+
+Go to the documentation of this file.
1 using Byond.TopicSender;
2 using Microsoft.Extensions.Logging;
3 using Microsoft.VisualStudio.TestTools.UnitTesting;
4 using Moq;
5 using System;
6 using System.Collections.Generic;
7 using System.Threading;
8 using System.Threading.Tasks;
13 
15 {
16  [TestClass]
17  public sealed class TestExperimentalWatchdog
18  {
19  [TestMethod]
20  public void TestConstruction()
21  {
22  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(null, null, null, null, null, null, null, null, null, null, null, null, null, default));
23 
24  var mockChat = new Mock<IChat>();
25  mockChat.Setup(x => x.RegisterCommandHandler(It.IsNotNull<ICustomCommandHandler>())).Verifiable();
26  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, null, null, null, null, null, null, null, null, null, null, null, null, default));
27 
28  var mockSessionControllerFactory = new Mock<ISessionControllerFactory>();
29  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, null, null, null, null, null, null, null, null, null, null, null, default));
30 
31  var mockDmbFactory = new Mock<IDmbFactory>();
32  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, null, null, null, null, null, null, null, null, null, null, default));
33 
34  var mockReattachInfoHandler = new Mock<IReattachInfoHandler>();
35  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, null, null, null, null, null, null, null, null, null, default));
36 
37  var mockDatabaseContextFactory = new Mock<IDatabaseContextFactory>();
38  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, null, null, null, null, null, null, null, null, default));
39 
40  var mockByondTopicSender = new Mock<IByondTopicSender>();
41  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, mockByondTopicSender.Object, null, null, null, null, null, null, null, default));
42 
43  var mockEventConsumer = new Mock<IEventConsumer>();
44  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, mockByondTopicSender.Object, mockEventConsumer.Object, null, null, null, null, null, null, default));
45 
46  var mockJobManager = new Mock<IJobManager>();
47  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, mockByondTopicSender.Object, mockEventConsumer.Object, mockJobManager.Object, null, null, null, null, null, default));
48 
49  var mockRestartRegistration = new Mock<IRestartRegistration>();
50  mockRestartRegistration.Setup(x => x.Dispose()).Verifiable();
51  var mockServerControl = new Mock<IServerControl>();
52  mockServerControl.Setup(x => x.RegisterForRestart(It.IsNotNull<IRestartHandler>())).Returns(mockRestartRegistration.Object).Verifiable();
53  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, mockByondTopicSender.Object, mockEventConsumer.Object, mockJobManager.Object, mockServerControl.Object, null, null, null, null, default));
54 
55  var mockAsyncDelayer = new Mock<IAsyncDelayer>();
56  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, mockByondTopicSender.Object, mockEventConsumer.Object, mockJobManager.Object, mockServerControl.Object, mockAsyncDelayer.Object, null, null, null, default));
57 
58  var mockLogger = new Mock<ILogger<ExperimentalWatchdog>>();
59  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, mockByondTopicSender.Object, mockEventConsumer.Object, mockJobManager.Object, mockServerControl.Object, mockAsyncDelayer.Object, mockLogger.Object, null, null, default));
60 
61  var mockLaunchParameters = new DreamDaemonLaunchParameters();
62  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, mockByondTopicSender.Object, mockEventConsumer.Object, mockJobManager.Object, mockServerControl.Object, mockAsyncDelayer.Object, mockLogger.Object, mockLaunchParameters, null, default));
63 
64  var mockInstance = new Models.Instance();
65  new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, mockByondTopicSender.Object, mockEventConsumer.Object, mockJobManager.Object, mockServerControl.Object, mockAsyncDelayer.Object, mockLogger.Object, mockLaunchParameters, mockInstance, default).Dispose();
66 
67  mockRestartRegistration.VerifyAll();
68  mockServerControl.VerifyAll();
69  mockChat.VerifyAll();
70  }
71 
72  [TestMethod]
73  public async Task TestSuccessfulLaunchAndShutdown()
74  {
75  var mockChat = new Mock<IChat>();
76  mockChat.Setup(x => x.RegisterCommandHandler(It.IsNotNull<ICustomCommandHandler>())).Verifiable();
77  var mockSessionControllerFactory = new Mock<ISessionControllerFactory>();
78  var mockDmbFactory = new Mock<IDmbFactory>();
79  var mockLogger = new Mock<ILogger<ExperimentalWatchdog>>();
80  var mockReattachInfoHandler = new Mock<IReattachInfoHandler>();
81  var mockDatabaseContextFactory = new Mock<IDatabaseContextFactory>();
82  var mockByondTopicSender = new Mock<IByondTopicSender>();
83  var mockEventConsumer = new Mock<IEventConsumer>();
84  var mockJobManager = new Mock<IJobManager>();
85  var mockRestartRegistration = new Mock<IRestartRegistration>();
86  mockRestartRegistration.Setup(x => x.Dispose()).Verifiable();
87  var mockServerControl = new Mock<IServerControl>();
88  mockServerControl.Setup(x => x.RegisterForRestart(It.IsNotNull<IRestartHandler>())).Returns(mockRestartRegistration.Object).Verifiable();
89  var mockLaunchParameters = new DreamDaemonLaunchParameters();
90  var mockInstance = new Models.Instance();
91  var mockAsyncDelayer = new Mock<IAsyncDelayer>();
92 
93  using (var wd = new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, mockByondTopicSender.Object, mockEventConsumer.Object, mockJobManager.Object, mockServerControl.Object, mockAsyncDelayer.Object, mockLogger.Object, mockLaunchParameters, mockInstance, default))
94  using (var cts = new CancellationTokenSource())
95  {
96  var mockCompileJob = new Models.CompileJob();
97  var mockDmbProvider = new Mock<IDmbProvider>();
98  mockDmbProvider.SetupGet(x => x.CompileJob).Returns(mockCompileJob).Verifiable();
99  var mDmbP = mockDmbProvider.Object;
100 
101  var infiniteTask = new TaskCompletionSource<int>().Task;
102 
103  mockDmbFactory.SetupGet(x => x.OnNewerDmb).Returns(infiniteTask);
104  mockDmbFactory.Setup(x => x.LockNextDmb(2)).Returns(mDmbP).Verifiable();
105 
106  var sessionsToVerify = new List<Mock<ISessionController>>();
107 
108  var cancellationToken = cts.Token;
109  mockSessionControllerFactory.Setup(x => x.LaunchNew(mockLaunchParameters, mDmbP, null, It.IsAny<bool>(), It.IsAny<bool>(), false, cancellationToken)).Returns(() =>
110  {
111  var mockSession = new Mock<ISessionController>();
112  mockSession.SetupGet(x => x.Lifetime).Returns(infiniteTask).Verifiable();
113  mockSession.SetupGet(x => x.OnReboot).Returns(infiniteTask).Verifiable();
114  mockSession.SetupGet(x => x.Dmb).Returns(mDmbP).Verifiable();
115  mockSession.SetupGet(x => x.LaunchResult).Returns(Task.FromResult(new LaunchResult
116  {
117  StartupTime = TimeSpan.FromSeconds(1)
118  })).Verifiable();
119  sessionsToVerify.Add(mockSession);
120  return Task.FromResult(mockSession.Object);
121  }).Verifiable();
122  mockAsyncDelayer.Setup(x => x.Delay(It.IsAny<TimeSpan>(), cancellationToken)).Returns(Task.CompletedTask).Verifiable();
123 
124  cts.CancelAfter(TimeSpan.FromSeconds(15));
125 
126  try
127  {
128  await wd.Launch(cancellationToken).ConfigureAwait(false);
129  await wd.Terminate(false, cancellationToken).ConfigureAwait(false);
130  }
131  finally
132  {
133  cts.Cancel();
134  }
135  Assert.AreEqual(2, sessionsToVerify.Count);
136  foreach (var I in sessionsToVerify)
137  I.VerifyAll();
138  mockDmbProvider.VerifyAll();
139  }
140 
141  mockSessionControllerFactory.VerifyAll();
142  mockDmbFactory.VerifyAll();
143  mockRestartRegistration.VerifyAll();
144  mockServerControl.VerifyAll();
145  mockChat.VerifyAll();
146  mockAsyncDelayer.VerifyAll();
147  }
148  }
149 }
+ +
Represents the result of trying to start a DD process
Definition: LaunchResult.cs:9
+ + + + + + +
A IWatchdog that tries to manage 2 servers at once for maximum uptime.
+ + + + + +
Handles Commands.ICommands that map to those defined in a IJsonTrackingContext
+ + + + + +
+ + + + diff --git a/_test_git_hub_client_factory_8cs.html b/_test_git_hub_client_factory_8cs.html new file mode 100644 index 0000000000..973cb9edc5 --- /dev/null +++ b/_test_git_hub_client_factory_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestGitHubClientFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestGitHubClientFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Core.Tests.TestGitHubClientFactory
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
namespace  Tgstation.Server.Host.Core.Tests
 
+
+ + + + diff --git a/_test_git_hub_client_factory_8cs_source.html b/_test_git_hub_client_factory_8cs_source.html new file mode 100644 index 0000000000..dd7aa6484f --- /dev/null +++ b/_test_git_hub_client_factory_8cs_source.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestGitHubClientFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestGitHubClientFactory.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using Moq;
3 using Octokit;
4 using System;
5 using System.Threading.Tasks;
6 
8 {
9  [TestClass]
10  public sealed class TestGitHubClientFactory
11  {
12  [TestMethod]
13  public void TestContruction() => Assert.ThrowsException<ArgumentNullException>(() => new GitHubClientFactory(null));
14 
15  [TestMethod]
16  public async Task TestCreateBasicClient()
17  {
18  var mockApp = new Mock<IApplication>();
19  mockApp.SetupGet(x => x.Version).Returns(new Version()).Verifiable();
20  mockApp.SetupGet(x => x.VersionPrefix).Returns("TGSTests").Verifiable();
21 
22  var factory = new GitHubClientFactory(mockApp.Object);
23 
24  var client = factory.CreateClient();
25  Assert.IsNotNull(client);
26  var credentials = await client.Connection.CredentialStore.GetCredentials().ConfigureAwait(false);
27 
28  Assert.AreEqual(AuthenticationType.Anonymous, credentials.AuthenticationType);
29 
30 
31  mockApp.VerifyAll();
32  }
33 
34  [TestMethod]
35  public async Task TestCreateTokenClient()
36  {
37  var mockApp = new Mock<IApplication>();
38  mockApp.SetupGet(x => x.Version).Returns(new Version()).Verifiable();
39  mockApp.SetupGet(x => x.VersionPrefix).Returns("TGSTests").Verifiable();
40 
41  var factory = new GitHubClientFactory(mockApp.Object);
42 
43  Assert.ThrowsException<ArgumentNullException>(() => factory.CreateClient(null));
44 
45  var client = factory.CreateClient("asdf");
46  Assert.IsNotNull(client);
47 
48  var credentials = await client.Connection.CredentialStore.GetCredentials().ConfigureAwait(false);
49 
50  Assert.AreEqual(AuthenticationType.Oauth, credentials.AuthenticationType);
51 
52  mockApp.VerifyAll();
53  }
54  }
55 }
+ + + + + +
+ + + + diff --git a/_test_irc_connection_string_builder_8cs.html b/_test_irc_connection_string_builder_8cs.html new file mode 100644 index 0000000000..2ed9e27c44 --- /dev/null +++ b/_test_irc_connection_string_builder_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/Models/TestIrcConnectionStringBuilder.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestIrcConnectionStringBuilder.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Api.Models.Tests.TestIrcConnectionStringBuilder
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
namespace  Tgstation.Server.Api.Models.Tests
 
+
+ + + + diff --git a/_test_irc_connection_string_builder_8cs_source.html b/_test_irc_connection_string_builder_8cs_source.html new file mode 100644 index 0000000000..e70a9fecfe --- /dev/null +++ b/_test_irc_connection_string_builder_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/Models/TestIrcConnectionStringBuilder.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestIrcConnectionStringBuilder.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 
4 {
5  [TestClass]
6  public sealed class TestIrcConnectionStringBuilder
7  {
8  [TestMethod]
9  public void TestBasicParseAndBuild()
10  {
11  const string exampleString = "server;1234;nick;1;2;asdf";
12  var builder = new IrcConnectionStringBuilder(exampleString);
13 
14  Assert.IsTrue(builder.Valid);
15  Assert.AreEqual("server", builder.Address);
16  Assert.AreEqual((ushort)1234, builder.Port);
17  Assert.AreEqual("nick", builder.Nickname);
18  Assert.IsTrue(builder.UseSsl.Value);
19  Assert.AreEqual(IrcPasswordType.NickServ, builder.PasswordType);
20  Assert.AreEqual("asdf", builder.Password);
21 
22  Assert.AreEqual(exampleString, builder.ToString());
23  }
24  }
25 }
+
IrcPasswordType
Represents the type of a password for a ChatProvider.Irc
+ + +
ChatConnectionStringBuilder for ChatProvider.Irc
+
+ + + + diff --git a/_test_job_exception_8cs.html b/_test_job_exception_8cs.html new file mode 100644 index 0000000000..cd1ad2c548 --- /dev/null +++ b/_test_job_exception_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestJobException.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestJobException.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Core.Tests.TestJobException
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
namespace  Tgstation.Server.Host.Core.Tests
 
+
+ + + + diff --git a/_test_job_exception_8cs_source.html b/_test_job_exception_8cs_source.html new file mode 100644 index 0000000000..370b08d048 --- /dev/null +++ b/_test_job_exception_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestJobException.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestJobException.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using System;
3 
5 {
6  [TestClass]
7  public sealed class TestJobException
8  {
9  [TestMethod]
10  public void TestConstruction()
11  {
12  new JobException();
13  new JobException("Message");
14  new JobException("Message", new Exception());
15  }
16  }
17 }
+ + +
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+
+ + + + diff --git a/_test_job_handler_8cs.html b/_test_job_handler_8cs.html new file mode 100644 index 0000000000..a603cb7869 --- /dev/null +++ b/_test_job_handler_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestJobHandler.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestJobHandler.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Core.Tests.TestJobHandler
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
namespace  Tgstation.Server.Host.Core.Tests
 
+
+ + + + diff --git a/_test_job_handler_8cs_source.html b/_test_job_handler_8cs_source.html new file mode 100644 index 0000000000..04d19a402e --- /dev/null +++ b/_test_job_handler_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestJobHandler.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestJobHandler.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using System;
3 using System.Threading;
4 using System.Threading.Tasks;
5 
7 {
8  [TestClass]
9  public sealed class TestJobHandler
10  {
12  bool cancelled;
13 
14  async Task TestJob(CancellationToken cancellationToken)
15  {
16  await currentWaitTask.ConfigureAwait(false);
17  cancelled = cancellationToken.IsCancellationRequested;
18  }
19 
20  [TestMethod]
22  {
23  cancelled = false;
24  Assert.ThrowsException<ArgumentNullException>(() => new JobHandler(null));
25 
26  currentWaitTask = Task.CompletedTask;
27  new JobHandler(TestJob).Dispose();
28  Assert.IsFalse(cancelled);
29  }
30 
31  [TestMethod]
32  public async Task TestWait()
33  {
34  cancelled = false;
35  //test with a cancelled cts
36  using (var cts = new CancellationTokenSource())
37  {
38  var tcs = new TaskCompletionSource<object>();
39  currentWaitTask = tcs.Task;
40  cts.Cancel();
41  using(var handler = new JobHandler(TestJob))
42  {
43  await Assert.ThrowsExceptionAsync<OperationCanceledException>(() => handler.Wait(cts.Token)).ConfigureAwait(false);
44  tcs.SetResult(null);
45  await handler.Wait(default).ConfigureAwait(false);
46  }
47  }
48  Assert.IsFalse(cancelled);
49  }
50 
51  [TestMethod]
52  public void TestProgress()
53  {
54  currentWaitTask = Task.CompletedTask;
55  cancelled = false;
56  using (var handler = new JobHandler(TestJob))
57  {
58  Assert.IsFalse(handler.Progress.HasValue);
59  handler.Progress = 42;
60  Assert.AreEqual(42, handler.Progress);
61  }
62  Assert.IsFalse(cancelled);
63  }
64 
65  [TestMethod]
66  public async Task TestCancellation()
67  {
68  var tcs = new TaskCompletionSource<object>();
69  currentWaitTask = tcs.Task;
70  cancelled = false;
71  using(var handler = new JobHandler(TestJob))
72  {
73  handler.Cancel();
74  tcs.SetResult(null);
75  await handler.Wait(default).ConfigureAwait(false);
76  }
77  Assert.IsTrue(cancelled);
78  }
79  }
80 }
+ + + + + +
async Task TestJob(CancellationToken cancellationToken)
+ + + +
Class for pairing Tasks with CancellationTokenSources
Definition: JobHandler.cs:10
+
+ + + + diff --git a/_test_merge_base_8cs.html b/_test_merge_base_8cs.html new file mode 100644 index 0000000000..1341264a08 --- /dev/null +++ b/_test_merge_base_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/TestMergeBase.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestMergeBase.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.Internal.TestMergeBase
 Layer of test merge data required internally More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
namespace  Tgstation.Server.Api.Models.Internal
 
+
+ + + + diff --git a/_test_merge_base_8cs_source.html b/_test_merge_base_8cs_source.html new file mode 100644 index 0000000000..1bcb5b8c81 --- /dev/null +++ b/_test_merge_base_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/TestMergeBase.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestMergeBase.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.ComponentModel.DataAnnotations;
3 
5 {
9  public abstract class TestMergeBase : TestMergeParameters
10  {
14  [Required]
15  public string TitleAtMerge { get; set; }
16 
20  [Required]
21  public string BodyAtMerge { get; set; }
22 
26  [Required]
27 #pragma warning disable CA1056 // Uri properties should not be strings
28  public string Url { get; set; }
29 #pragma warning restore CA1056 // Uri properties should not be strings
30 
34  [Required]
35  public string Author { get; set; }
36 
40  protected TestMergeBase() { }
41 
46  protected TestMergeBase(TestMergeBase copy)
47  {
48  if (copy == null)
49  throw new ArgumentNullException(nameof(copy));
50  Author = copy.Author;
51  BodyAtMerge = copy.BodyAtMerge;
52  Comment = copy.Comment;
53  Number = copy.Number;
56  Url = copy.Url;
57  }
58  }
59 }
string TitleAtMerge
The title of the pull request
+
string Author
The author of the pull request
+
Layer of test merge data required internally
Definition: TestMergeBase.cs:9
+
int? Number
The number of the pull request
+
string BodyAtMerge
The body of the pull request
+ + + +
string Url
The URL of the pull request
+
TestMergeBase(TestMergeBase copy)
Construct a TestMergeBase from a copy
+
string PullRequestRevision
The sha of the pull request revision to merge. If not specified, the latest commit shall be used (sem...
+
string Comment
Optional comment about the test
+
+ + + + diff --git a/_test_merge_parameters_8cs.html b/_test_merge_parameters_8cs.html new file mode 100644 index 0000000000..3794c0ca7c --- /dev/null +++ b/_test_merge_parameters_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/TestMergeParameters.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestMergeParameters.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.TestMergeParameters
 Parameters for creating a TestMerge More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + diff --git a/_test_merge_parameters_8cs_source.html b/_test_merge_parameters_8cs_source.html new file mode 100644 index 0000000000..d13da118a5 --- /dev/null +++ b/_test_merge_parameters_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/TestMergeParameters.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestMergeParameters.cs
+
+
+Go to the documentation of this file.
1 using System.ComponentModel.DataAnnotations;
2 
4 {
8  public class TestMergeParameters
9  {
13  [Required]
14  public int? Number { get; set; }
15 
19  [Required]
20  public string PullRequestRevision { get; set; }
21 
25  public string Comment { get; set; }
26  }
27 }
+
int? Number
The number of the pull request
+ +
string PullRequestRevision
The sha of the pull request revision to merge. If not specified, the latest commit shall be used (sem...
+
string Comment
Optional comment about the test
+
+ + + + diff --git a/_test_platform_identifier_8cs.html b/_test_platform_identifier_8cs.html new file mode 100644 index 0000000000..d610326d68 --- /dev/null +++ b/_test_platform_identifier_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestPlatformIdentifier.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestPlatformIdentifier.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Core.Tests.TestPlatformIdentifier
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
namespace  Tgstation.Server.Host.Core.Tests
 
+
+ + + + diff --git a/_test_platform_identifier_8cs_source.html b/_test_platform_identifier_8cs_source.html new file mode 100644 index 0000000000..67f8fcdd68 --- /dev/null +++ b/_test_platform_identifier_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestPlatformIdentifier.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestPlatformIdentifier.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using System.Runtime.InteropServices;
3 
5 {
6  [TestClass]
7  public sealed class TestPlatformIdentifier
8  {
9  [TestMethod]
10  public void TestCorrectPlatform()
11  {
12  var identifier = new PlatformIdentifier();
13 
14  var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
15  const string WindowsScriptExtension = "bat";
16  const string PosixScriptExtension = "sh";
17 
18 
19  Assert.AreEqual(isWindows, identifier.IsWindows);
20 
21  Assert.AreEqual(isWindows ? WindowsScriptExtension : PosixScriptExtension, identifier.ScriptFileExtension);
22  }
23  }
24 }
+ + + +
+ + + + diff --git a/_test_posix_byond_installer_8cs.html b/_test_posix_byond_installer_8cs.html new file mode 100644 index 0000000000..fd80b77c1c --- /dev/null +++ b/_test_posix_byond_installer_8cs.html @@ -0,0 +1,108 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Components/Byond/TestPosixByondInstaller.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestPosixByondInstaller.cs File Reference
+
+ + + + + diff --git a/_test_posix_byond_installer_8cs_source.html b/_test_posix_byond_installer_8cs_source.html new file mode 100644 index 0000000000..6c6f860bb4 --- /dev/null +++ b/_test_posix_byond_installer_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Components/Byond/TestPosixByondInstaller.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestPosixByondInstaller.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using Microsoft.VisualStudio.TestTools.UnitTesting;
3 using Moq;
4 using System;
5 using System.Threading.Tasks;
6 using Tgstation.Server.Host.IO;
7 
9 {
10  [TestClass]
11  public sealed class TestPosixByondInstaller
12  {
13  [TestMethod]
14  public void TestConstruction()
15  {
16  Assert.ThrowsException<ArgumentNullException>(() => new PosixByondInstaller(null, null, null));
17  var mockIOManager = new Mock<IIOManager>();
18  Assert.ThrowsException<ArgumentNullException>(() => new PosixByondInstaller(mockIOManager.Object, null, null));
19  var mockPostWriteHandler = new Mock<IPostWriteHandler>();
20  Assert.ThrowsException<ArgumentNullException>(() => new PosixByondInstaller(mockIOManager.Object, mockPostWriteHandler.Object, null));
21 
22  var mockLogger = new Mock<ILogger<PosixByondInstaller>>();
23  new PosixByondInstaller(mockIOManager.Object, mockPostWriteHandler.Object, mockLogger.Object);
24  }
25 
26  [TestMethod]
27  public async Task TestCacheClean()
28  {
29  var mockIOManager = new Mock<IIOManager>();
30  var mockPostWriteHandler = new Mock<IPostWriteHandler>();
31  var mockLogger = new Mock<ILogger<PosixByondInstaller>>();
32  var installer = new PosixByondInstaller(mockIOManager.Object, mockPostWriteHandler.Object, mockLogger.Object);
33 
34  const string ByondCachePath = "~/.byond/cache";
35 
36  mockIOManager.Setup(x => x.DeleteDirectory(ByondCachePath, default)).Returns(Task.CompletedTask).Verifiable();
37 
38  await installer.CleanCache(default);
39 
40  mockIOManager.Verify();
41 
42 
43  mockIOManager.Setup(x => x.DeleteDirectory(ByondCachePath, default)).Throws(new OperationCanceledException()).Verifiable();
44 
45  await Assert.ThrowsExceptionAsync<OperationCanceledException>(() => installer.CleanCache(default)).ConfigureAwait(false);
46 
47  mockIOManager.Verify();
48 
49  mockIOManager.Setup(x => x.DeleteDirectory(ByondCachePath, default)).Throws(new Exception()).Verifiable();
50 
51  await installer.CleanCache(default).ConfigureAwait(false);
52 
53  mockIOManager.Verify();
54  }
55 
56 
57  [TestMethod]
58  public async Task TestDownload()
59  {
60  var mockIOManager = new Mock<IIOManager>();
61  var mockPostWriteHandler = new Mock<IPostWriteHandler>();
62  var mockLogger = new Mock<ILogger<PosixByondInstaller>>();
63  var installer = new PosixByondInstaller(mockIOManager.Object, mockPostWriteHandler.Object, mockLogger.Object);
64 
65  await Assert.ThrowsExceptionAsync<ArgumentNullException>(() => installer.DownloadVersion(null, default)).ConfigureAwait(false);
66 
67  var ourArray = Array.Empty<byte>();
68  mockIOManager.Setup(x => x.DownloadFile(It.Is<Uri>(uri => uri == new Uri("https://secure.byond.com/download/build/511/511.1385_byond_linux.zip")), default)).Returns(Task.FromResult(ourArray)).Verifiable();
69 
70  var result = await installer.DownloadVersion(new Version(511, 1385), default).ConfigureAwait(false);
71 
72  Assert.AreSame(ourArray, result);
73  mockIOManager.Verify();
74  }
75 
76  [TestMethod]
77  public async Task TestInstallByond()
78  {
79  var mockIOManager = new Mock<IIOManager>();
80  var mockPostWriteHandler = new Mock<IPostWriteHandler>();
81  var mockLogger = new Mock<ILogger<PosixByondInstaller>>();
82  var installer = new PosixByondInstaller(mockIOManager.Object, mockPostWriteHandler.Object, mockLogger.Object);
83 
84  const string FakePath = "fake";
85  await Assert.ThrowsExceptionAsync<ArgumentNullException>(() => installer.InstallByond(null, null, default)).ConfigureAwait(false);
86  await Assert.ThrowsExceptionAsync<ArgumentNullException>(() => installer.InstallByond(FakePath, null, default)).ConfigureAwait(false);
87 
88  await installer.InstallByond(FakePath, new Version(511, 1385), default).ConfigureAwait(false);
89 
90  mockIOManager.Verify(x => x.ConcatPath(It.IsAny<string>(), It.IsNotNull<string>()), Times.Exactly(5));
91  mockIOManager.Verify(x => x.WriteAllBytes(It.IsAny<string>(), It.IsNotNull<byte[]>(), default), Times.Exactly(2));
92  mockPostWriteHandler.Verify(x => x.HandleWrite(It.IsAny<string>()), Times.Exactly(4));
93  }
94  }
95 }
+ + + + + + + + + + +
+ + + + diff --git a/_test_post_write_handler_8cs.html b/_test_post_write_handler_8cs.html new file mode 100644 index 0000000000..6c09b6d65f --- /dev/null +++ b/_test_post_write_handler_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/IO/TestPostWriteHandler.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestPostWriteHandler.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.IO.Tests.TestPostWriteHandler
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.IO
 
namespace  Tgstation.Server.Host.IO.Tests
 
+
+ + + + diff --git a/_test_post_write_handler_8cs_source.html b/_test_post_write_handler_8cs_source.html new file mode 100644 index 0000000000..cc5374cf90 --- /dev/null +++ b/_test_post_write_handler_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/IO/TestPostWriteHandler.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestPostWriteHandler.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using Mono.Unix;
3 using System;
4 using System.Diagnostics;
5 using System.IO;
6 using System.Runtime.InteropServices;
7 using System.Text;
8 
10 {
11  [TestClass]
12  public sealed class TestPostWriteHandler
13  {
14  [TestMethod]
15  public void TestThrowsWithNullArg()
16  {
17  IPostWriteHandler postWriteHandler;
18  var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
19  if (isWindows)
20  postWriteHandler = new WindowsPostWriteHandler();
21  else
22  postWriteHandler = new PosixPostWriteHandler();
23 
24  Assert.ThrowsException<ArgumentNullException>(() => postWriteHandler.HandleWrite(null));
25  }
26 
27  [TestMethod]
28  public void TestPostWrite()
29  {
30  IPostWriteHandler postWriteHandler;
31  var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
32  if (isWindows)
33  postWriteHandler = new WindowsPostWriteHandler();
34  else
35  postWriteHandler = new PosixPostWriteHandler();
36 
37  //test on a valid file first
38  var tmpFile = Path.GetTempFileName();
39  try
40  {
41  postWriteHandler.HandleWrite(tmpFile);
42 
43  if (isWindows)
44  return; //you do nothing
45 
46  //ensure it is now executable
47  File.WriteAllBytes(tmpFile, Encoding.UTF8.GetBytes("#!/bin/sh\n"));
48 
49  using (var process = Process.Start(tmpFile))
50  {
51  process.WaitForExit();
52  Assert.AreEqual(0, process.ExitCode);
53  }
54 
55  //run it again for the code coverage on that part where no changes are made if it's already executable
56  postWriteHandler.HandleWrite(tmpFile);
57  }
58  finally
59  {
60  File.Delete(tmpFile);
61  }
62  }
63 
64  [TestMethod]
65  public void TestThrowsOnUnix()
66  {
67  if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
68  return;
69  var postWriteHandler = new PosixPostWriteHandler();
70  var tmpFile = Path.GetTempFileName();
71  File.Delete(tmpFile);
72  Assert.ThrowsException<UnixIOException>(() => postWriteHandler.HandleWrite(tmpFile));
73  }
74  }
75 }
+
IPostWriteHandler for POSIX systems
+
Handles changing file modes/permissions after writing
+
void TestThrowsWithNullArg()
+
void HandleWrite(string filePath)
For handling system specific necessities after a write
+
void TestThrowsOnUnix()
+ +
void TestPostWrite()
+
IPostWriteHandler for Windows systems
+
+ + + + diff --git a/_test_program_8cs.html b/_test_program_8cs.html new file mode 100644 index 0000000000..1a427d6c53 --- /dev/null +++ b/_test_program_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/TestProgram.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestProgram.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Console.Tests.TestProgram
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Console
 
namespace  Tgstation.Server.Host.Console.Tests
 
+
+ + + + diff --git a/_test_program_8cs_source.html b/_test_program_8cs_source.html new file mode 100644 index 0000000000..889c04be6d --- /dev/null +++ b/_test_program_8cs_source.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/TestProgram.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestProgram.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using Microsoft.VisualStudio.TestTools.UnitTesting;
3 using Moq;
4 using System;
5 using System.Threading;
6 using System.Threading.Tasks;
8 
10 {
11  [TestClass]
12  public class TestProgram
13  {
14  [TestMethod]
15  public async Task TestProgramRuns()
16  {
17  var mockServer = new Mock<IWatchdog>();
18  var args = Array.Empty<string>();
19  mockServer.Setup(x => x.RunAsync(false, args, It.IsAny<CancellationToken>())).Returns(Task.CompletedTask).Verifiable();
20  var mockServerFactory = new Mock<IWatchdogFactory>();
21  mockServerFactory.Setup(x => x.CreateWatchdog(It.IsAny<ILoggerFactory>())).Returns(mockServer.Object).Verifiable();
22  Program.WatchdogFactory = mockServerFactory.Object;
23  await Program.Main(args).ConfigureAwait(false);
24  mockServer.VerifyAll();
25  mockServerFactory.VerifyAll();
26  }
27  }
28 }
Contains the entrypoint for the application
Definition: Program.cs:13
+
static internal async Task Main(string[] args)
Entrypoint for the application
Definition: Program.cs:25
+
static internal IWatchdogFactory WatchdogFactory
The IWatchdogFactory for the Program
Definition: Program.cs:18
+ + + + + + + +
+ + + + diff --git a/_test_rights_8cs.html b/_test_rights_8cs.html new file mode 100644 index 0000000000..23c899522b --- /dev/null +++ b/_test_rights_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/Rights/TestRights.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestRights.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Rights.Tests.TestRights
 Tests for Rights More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Rights
 
namespace  Tgstation.Server.Api.Rights.Tests
 
+
+ + + + diff --git a/_test_rights_8cs_source.html b/_test_rights_8cs_source.html new file mode 100644 index 0000000000..402b4da154 --- /dev/null +++ b/_test_rights_8cs_source.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/Rights/TestRights.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestRights.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using System;
3 using System.Linq;
4 
6 {
10  [TestClass]
11  public sealed class TestRights
12  {
13  [TestMethod]
14  public void TestAllPowerOfTwo()
15  {
16  var ulongType = typeof(ulong);
17  foreach (var I in Enum.GetValues(typeof(RightsType)).Cast<RightsType>())
18  {
19  var expectedLog = -1;
20  var rightType = RightsHelper.RightToType(I);
21  foreach (var J in Enum.GetValues(rightType))
22  {
23  Assert.AreEqual(ulongType, Enum.GetUnderlyingType(rightType));
24  var asUlong = (ulong)J;
25  var isOne = asUlong == 1;
26  if(!isOne)
27  Assert.AreEqual(0U, asUlong % 2, String.Format("Enum {0} of {1} is not a power of 2!", Enum.GetName(rightType, asUlong), rightType));
28 
29  if (expectedLog > -1)
30  {
31  var log = Math.Log(asUlong, 2);
32  if (log != expectedLog)
33  Assert.Fail(String.Format("Expected Log2({1}) == {0} to come next for {2}, got {3} instead!", expectedLog, Enum.GetName(rightType, asUlong), rightType, log));
34  }
35  ++expectedLog;
36  }
37  }
38  }
39  }
40 }
+ + +
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+ +
static Type RightToType(RightsType rightsType)
Map a given rightsType to its respective Enum Type
+
+ + + + diff --git a/_test_server_client_factory_8cs.html b/_test_server_client_factory_8cs.html new file mode 100644 index 0000000000..2d46d8c749 --- /dev/null +++ b/_test_server_client_factory_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/TestServerClientFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestServerClientFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Client.Tests.TestServerClientFactory
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
namespace  Tgstation.Server.Client.Tests
 
+
+ + + + diff --git a/_test_server_client_factory_8cs_source.html b/_test_server_client_factory_8cs_source.html new file mode 100644 index 0000000000..931af40713 --- /dev/null +++ b/_test_server_client_factory_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/TestServerClientFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestServerClientFactory.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using System;
3 using System.Net.Http.Headers;
4 
6 {
7  [TestClass]
8  public sealed class TestServerClientFactory
9  {
10  [TestMethod]
11  public void TestConstruction()
12  {
13  Assert.ThrowsException<ArgumentNullException>(() => new ServerClientFactory(null));
14  new ServerClientFactory(new ProductHeaderValue("Tgstation.Server.Client.Tests", GetType().Assembly.GetName().Version.ToString()));
15  }
16  }
17 }
+ + + +
+ + + + diff --git a/_test_server_factory_8cs.html b/_test_server_factory_8cs.html new file mode 100644 index 0000000000..1e0d44be45 --- /dev/null +++ b/_test_server_factory_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/TestServerFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestServerFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Tests.TestServerFactory
 Tests for ServerFactory More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Tests
 
+
+ + + + diff --git a/_test_server_factory_8cs_source.html b/_test_server_factory_8cs_source.html new file mode 100644 index 0000000000..e0d06a6bc7 --- /dev/null +++ b/_test_server_factory_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/TestServerFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestServerFactory.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using System;
3 
5 {
9  [TestClass]
10  public sealed class TestServerFactory
11  {
12  [TestMethod]
14  {
15  var factory = new ServerFactory();
16 
17  Assert.ThrowsException<ArgumentNullException>(() => factory.CreateServer(null, null));
18  factory.CreateServer(Array.Empty<string>(), null);
19  }
20 
21  [TestMethod]
23  {
24  var factory = new ServerFactory();
25  const string Path = "/test";
26 
27  Assert.ThrowsException<ArgumentNullException>(() => factory.CreateServer(null, null));
28  Assert.ThrowsException<ArgumentNullException>(() => factory.CreateServer(null, Path));
29  factory.CreateServer(Array.Empty<string>(), Path);
30  }
31  }
32 }
+ + + + +
+ + + + diff --git a/_test_server_service_8cs.html b/_test_server_service_8cs.html new file mode 100644 index 0000000000..60b3e16517 --- /dev/null +++ b/_test_server_service_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Service.Tests/TestServerService.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestServerService.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Service.Tests.TestServerService
 Tests for ServerService More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Service
 
namespace  Tgstation.Server.Host.Service.Tests
 
+
+ + + + diff --git a/_test_server_service_8cs_source.html b/_test_server_service_8cs_source.html new file mode 100644 index 0000000000..cf24384545 --- /dev/null +++ b/_test_server_service_8cs_source.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Service.Tests/TestServerService.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestServerService.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using Microsoft.VisualStudio.TestTools.UnitTesting;
3 using Moq;
4 using System;
5 using System.Reflection;
6 using System.Threading;
7 using System.Threading.Tasks;
9 
11 {
15  [TestClass]
16  public sealed class TestServerService
17  {
18  [TestMethod]
20  {
21  Assert.ThrowsException<ArgumentNullException>(() => new ServerService(null, null, default));
22  var mockWatchdogFactory = new Mock<IWatchdogFactory>();
23  Assert.ThrowsException<ArgumentNullException>(() => new ServerService(mockWatchdogFactory.Object, null, default));
24  var mockLoggerFactory = new LoggerFactory();
25  new ServerService(mockWatchdogFactory.Object, mockLoggerFactory, default).Dispose();
26  }
27 
28  [TestMethod]
29  public void TestRun()
30  {
31  var type = typeof(ServerService);
32  var onStart = type.GetMethod("OnStart", BindingFlags.Instance | BindingFlags.NonPublic);
33  var onStop = type.GetMethod("OnStop", BindingFlags.Instance | BindingFlags.NonPublic);
34 
35  var mockWatchdog = new Mock<IWatchdog>();
36  var args = Array.Empty<string>();
37  CancellationToken cancellationToken;
38  mockWatchdog.Setup(x => x.RunAsync(false, args, It.IsAny<CancellationToken>())).Callback((bool x, string[] _, CancellationToken token) => cancellationToken = token).Returns(Task.CompletedTask).Verifiable();
39  var mockWatchdogFactory = new Mock<IWatchdogFactory>();
40  var mockLoggerFactory = new LoggerFactory();
41  mockWatchdogFactory.Setup(x => x.CreateWatchdog(mockLoggerFactory)).Returns(mockWatchdog.Object).Verifiable();
42 
43  using (var service = new ServerService(mockWatchdogFactory.Object, mockLoggerFactory, default))
44  {
45  onStart.Invoke(service, new object[] { args });
46 
47  Assert.IsFalse(cancellationToken.IsCancellationRequested);
48 
49  onStop.Invoke(service, Array.Empty<object>());
50  Assert.IsTrue(cancellationToken.IsCancellationRequested);
51  mockWatchdog.VerifyAll();
52  }
53 
54  mockWatchdogFactory.VerifyAll();
55  }
56  }
57 }
+ +
override void Dispose(bool disposing)
+ + +
Represents a IWatchdog as a ServiceBase
+ + + + +
+ + + + diff --git a/_test_service_collection_extensions_8cs.html b/_test_service_collection_extensions_8cs.html new file mode 100644 index 0000000000..616b8e61cc --- /dev/null +++ b/_test_service_collection_extensions_8cs.html @@ -0,0 +1,114 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestServiceCollectionExtensions.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestServiceCollectionExtensions.cs File Reference
+
+ + + + + diff --git a/_test_service_collection_extensions_8cs_source.html b/_test_service_collection_extensions_8cs_source.html new file mode 100644 index 0000000000..70a6b6d917 --- /dev/null +++ b/_test_service_collection_extensions_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestServiceCollectionExtensions.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestServiceCollectionExtensions.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Configuration;
2 using Microsoft.Extensions.DependencyInjection;
3 using Microsoft.VisualStudio.TestTools.UnitTesting;
4 using Moq;
5 using System;
6 
8 {
9  [TestClass]
10  public sealed class TestServiceCollectionExtensions
11  {
12  class GoodConfig
13  {
14  public const string Section = "asdf";
15  }
16 
17  class BadConfig1
18  {
19  const string Section = "asdf";
20  }
21 
22  class BadConfig2
23  {
24  public const bool Section = false;
25  }
26 
27  class BadConfig3
28  {
29  //nah
30  }
31 
32  [TestMethod]
33  public void TestUseStandardConfig()
34  {
35  var serviceCollection = new ServiceCollection();
36  var mockConfig = new Mock<IConfigurationSection>();
37  mockConfig.Setup(x => x.GetSection(It.IsNotNull<string>())).Returns(mockConfig.Object).Verifiable();
38  Assert.ThrowsException<ArgumentNullException>(() => ServiceCollectionExtensions.UseStandardConfig<GoodConfig>(null, null));
39  Assert.ThrowsException<ArgumentNullException>(() => serviceCollection.UseStandardConfig<GoodConfig>(null));
40  serviceCollection.UseStandardConfig<GoodConfig>(mockConfig.Object);
41  Assert.ThrowsException<InvalidOperationException>(() => serviceCollection.UseStandardConfig<BadConfig1>(mockConfig.Object));
42  Assert.ThrowsException<InvalidOperationException>(() => serviceCollection.UseStandardConfig<BadConfig2>(mockConfig.Object));
43  Assert.ThrowsException<InvalidOperationException>(() => serviceCollection.UseStandardConfig<BadConfig3>(mockConfig.Object));
44  mockConfig.Verify();
45  }
46  }
47 }
+ + + + + + + + + + +
+ + + + diff --git a/_test_setup_wizard_8cs.html b/_test_setup_wizard_8cs.html new file mode 100644 index 0000000000..54c7a08621 --- /dev/null +++ b/_test_setup_wizard_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestSetupWizard.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestSetupWizard.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Core.Tests.TestSetupWizard
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Core
 
namespace  Tgstation.Server.Host.Core.Tests
 
+
+ + + + diff --git a/_test_setup_wizard_8cs_source.html b/_test_setup_wizard_8cs_source.html new file mode 100644 index 0000000000..c87c1a147c --- /dev/null +++ b/_test_setup_wizard_8cs_source.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core/TestSetupWizard.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestSetupWizard.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Hosting;
2 using Microsoft.Extensions.Logging;
3 using Microsoft.Extensions.Options;
4 using Microsoft.VisualStudio.TestTools.UnitTesting;
5 using Moq;
6 using Moq.Protected;
7 using System;
8 using System.Collections.Generic;
9 using System.Data.Common;
10 using System.Runtime.InteropServices;
11 using System.Text;
12 using System.Threading;
13 using System.Threading.Tasks;
15 using Tgstation.Server.Host.IO;
16 
18 {
19  [TestClass]
20  public sealed class TestSetupWizard
21  {
22  [TestMethod]
23  public void TestConstructionThrows()
24  {
25  Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(null, null, null, null, null, null, null, null, null));
26  var mockIOManager = new Mock<IIOManager>();
27  Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, null, null, null, null, null, null, null, null));
28  var mockConsole = new Mock<IConsole>();
29  Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, null, null, null, null, null, null, null));
30  var mockHostingEnvironment = new Mock<IHostingEnvironment>();
31  Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, null, null, null, null, null, null));
32  var mockApplication = new Mock<IApplication>();
33  Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockApplication.Object, null, null, null, null, null));
34  var mockDBConnectionFactory = new Mock<IDBConnectionFactory>();
35  Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockApplication.Object, mockDBConnectionFactory.Object, null, null, null, null));
36  var mockPlatformIdentifier = new Mock<IPlatformIdentifier>();
37  Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockApplication.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, null, null, null));
38  var mockAsyncDelayer = new Mock<IAsyncDelayer>();
39  Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockApplication.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, null, null));
40  var mockLogger = new Mock<ILogger<SetupWizard>>();
41  Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockApplication.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLogger.Object, null));
42  }
43 
44  [TestMethod]
45  public async Task TestWithUserStupiditiy()
46  {
47  var mockIOManager = new Mock<IIOManager>();
48  var mockConsole = new Mock<IConsole>();
49  var mockHostingEnvironment = new Mock<IHostingEnvironment>();
50  var mockApplication = new Mock<IApplication>();
51  var mockDBConnectionFactory = new Mock<IDBConnectionFactory>();
52  var mockLogger = new Mock<ILogger<SetupWizard>>();
53  var mockGeneralConfigurationOptions = new Mock<IOptions<GeneralConfiguration>>();
54  var mockPlatformIdentifier = new Mock<IPlatformIdentifier>();
55  var mockAsyncDelayer = new Mock<IAsyncDelayer>();
56 
57  var testGeneralConfig = new GeneralConfiguration
58  {
60  };
61  mockGeneralConfigurationOptions.SetupGet(x => x.Value).Returns(testGeneralConfig).Verifiable();
62 
63  var wizard = new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockApplication.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLogger.Object, mockGeneralConfigurationOptions.Object);
64 
65  mockPlatformIdentifier.SetupGet(x => x.IsWindows).Returns(true).Verifiable();
66  mockAsyncDelayer.Setup(x => x.Delay(It.IsAny<TimeSpan>(), It.IsAny<CancellationToken>())).Returns(Task.CompletedTask).Verifiable();
67 
68  Assert.IsFalse(await wizard.CheckRunWizard(default).ConfigureAwait(false));
69 
70  testGeneralConfig.SetupWizardMode = SetupWizardMode.Force;
71  await Assert.ThrowsExceptionAsync<InvalidOperationException>(() => wizard.CheckRunWizard(default)).ConfigureAwait(false);
72 
73  testGeneralConfig.SetupWizardMode = SetupWizardMode.Only;
74  await Assert.ThrowsExceptionAsync<InvalidOperationException>(() => wizard.CheckRunWizard(default)).ConfigureAwait(false);
75 
76  mockConsole.SetupGet(x => x.Available).Returns(true).Verifiable();
77  mockIOManager.Setup(x => x.FileExists(It.IsNotNull<string>(), It.IsAny<CancellationToken>())).Returns(Task.FromResult(true)).Verifiable();
78  mockIOManager.Setup(x => x.ReadAllBytes(It.IsNotNull<string>(), It.IsAny<CancellationToken>())).Returns(Task.FromResult(Encoding.UTF8.GetBytes("cucked"))).Verifiable();
79  mockIOManager.Setup(x => x.WriteAllBytes(It.IsNotNull<string>(), It.IsNotNull<byte[]>(), It.IsAny<CancellationToken>())).Returns(Task.CompletedTask).Verifiable();
80 
81  var mockSuccessCommand = new Mock<DbCommand>();
82  mockSuccessCommand.Setup(x => x.ExecuteNonQueryAsync(It.IsAny<CancellationToken>())).Returns(Task.FromResult(0)).Verifiable();
83  mockSuccessCommand.Setup(x => x.ExecuteScalarAsync(It.IsAny<CancellationToken>())).Returns(Task.FromResult<object>("1.2.3")).Verifiable();
84  var mockFailCommand = new Mock<DbCommand>();
85  mockFailCommand.Setup(x => x.ExecuteNonQueryAsync(It.IsAny<CancellationToken>())).Throws(new Exception()).Verifiable();
86 
87  void SetDbCommandCreator(Mock<DbConnection> mock, Func<DbCommand> creator) => mock.Protected().Setup<DbCommand>("CreateDbCommand").Returns(creator).Verifiable();
88 
89  var mockGoodDbConnection = new Mock<DbConnection>();
90  mockGoodDbConnection.Setup(x => x.OpenAsync(It.IsAny<CancellationToken>())).Returns(Task.CompletedTask).Verifiable();
91  SetDbCommandCreator(mockGoodDbConnection, () => mockSuccessCommand.Object);
92 
93  var mockBadDbConnection = new Mock<DbConnection>();
94  mockBadDbConnection.Setup(x => x.OpenAsync(It.IsAny<CancellationToken>())).Throws(new Exception()).Verifiable();
95  var invokeTimes = 0;
96  var mockUglyDbConnection = new Mock<DbConnection>();
97  SetDbCommandCreator(mockUglyDbConnection, () =>
98  {
99  if (invokeTimes < 2)
100  {
101  ++invokeTimes;
102  return mockSuccessCommand.Object;
103  }
104  else
105  return mockFailCommand.Object;
106  });
107 
108  mockDBConnectionFactory.Setup(x => x.CreateConnection(It.IsAny<string>(), DatabaseType.SqlServer)).Returns(mockBadDbConnection.Object).Verifiable();
109  mockDBConnectionFactory.Setup(x => x.CreateConnection(It.IsAny<string>(), DatabaseType.MariaDB)).Returns(mockGoodDbConnection.Object).Verifiable();
110  mockDBConnectionFactory.Setup(x => x.CreateConnection(It.IsAny<string>(), DatabaseType.MySql)).Returns(mockUglyDbConnection.Object).Verifiable();
111 
112  var finalInputSequence = new List<string>()
113  {
114  //first run, just say no to the force prompt after testing it
115  "fake",
116  "n",
117  //second run say yes to the force prompt
118  "y",
119  //first normal run
120  "bad port number",
121  "0",
122  "666",
123  "FakeDBType",
124  nameof(DatabaseType.SqlServer),
125  "this isn't validated",
126  "nor is this",
127  "no",
128  //test winauth
129  "yes",
130  //sql server will always fail so reconfigure with maria
131  nameof(DatabaseType.MariaDB),
132  "bleh",
133  "blah",
134  "NO",
135  "user",
136  "pass",
137  //general config
138  "four",
139  "-12",
140  "16",
141  "eight",
142  "-27",
143  "5000",
144  "fake token",
145  //logging config
146  "no",
147  //cp config
148  "y",
149  "y",
150  //saved, now for second run
151  //this time use defaults amap
152  String.Empty,
153  //test MySQL errors
154  nameof(DatabaseType.MySql),
155  String.Empty,
156  String.Empty,
157  "DbName",
158  "n",
159  "user",
160  "pass",
161  //general config
162  "y",
163  String.Empty,
164  String.Empty,
165  String.Empty,
166  //logging config
167  "y",
168  "not actually verified because lol mocks /../!@#$%^&*()/..///.",
169  "Warning",
170  String.Empty,
171  //cp config
172  "y",
173  "n",
174  String.Empty,
175  //third run, we already hit all the code coverage so just get through it
176  String.Empty,
177  nameof(DatabaseType.MariaDB),
178  String.Empty,
179  "dbname",
180  "y",
181  "user",
182  "pass",
183  //general
184  "y",
185  String.Empty,
186  String.Empty,
187  String.Empty,
188  "y",
189  "will faile",
190  String.Empty,
191  String.Empty,
192  "fake",
193  "None",
194  "Critical",
195  //cp config
196  "y",
197  "n",
198  "http://fake.com, https://example.org",
199  };
200 
201  var inputPos = 0;
202 
203  mockApplication.SetupGet(x => x.VersionPrefix).Returns("sumfuk").Verifiable();
204 
205 
206  // This list is here for ease of debugging.
207  var consolePlayback = new List<string>();
208 
209  mockConsole.Setup(x => x.PressAnyKeyAsync(It.IsAny<CancellationToken>())).Returns(Task.CompletedTask).Verifiable();
210  mockConsole.Setup(x => x.ReadLineAsync(It.IsAny<bool>(), It.IsAny<CancellationToken>())).Returns(() =>
211  {
212  if (inputPos == finalInputSequence.Count)
213  Assert.Fail("Exhausted input sequence!");
214  var res = finalInputSequence[inputPos++];
215  consolePlayback.Add($"Input: {res}");
216  return Task.FromResult(res);
217  }).Verifiable();
218 
219  mockConsole
220  .Setup(x => x.WriteAsync(It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<CancellationToken>()))
221  .Callback<string, bool, CancellationToken>((message, error, token) => consolePlayback.Add($"Output: {message}"))
222  .Returns(Task.CompletedTask)
223  .Verifiable();
224 
225  Assert.IsFalse(await wizard.CheckRunWizard(default).ConfigureAwait(false));
226  //first real run
227  Assert.IsTrue(await wizard.CheckRunWizard(default).ConfigureAwait(false));
228 
229  //second run
230  mockIOManager.Setup(x => x.ReadAllBytes(It.IsNotNull<string>(), It.IsAny<CancellationToken>())).Returns(Task.FromResult(Encoding.UTF8.GetBytes(String.Empty))).Verifiable();
231  Assert.IsTrue(await wizard.CheckRunWizard(default).ConfigureAwait(false));
232 
233  //third run
234  testGeneralConfig.SetupWizardMode = SetupWizardMode.Autodetect;
235  mockIOManager.Setup(x => x.WriteAllBytes(It.IsNotNull<string>(), It.IsNotNull<byte[]>(), It.IsAny<CancellationToken>())).Throws(new Exception()).Verifiable();
236  var firstRun = true;
237  mockIOManager.Setup(x => x.CreateDirectory(It.IsNotNull<string>(), It.IsAny<CancellationToken>())).Returns(() =>
238  {
239  if (firstRun)
240  {
241  firstRun = false;
242  throw new Exception();
243  }
244  return Task.CompletedTask;
245  }).Verifiable();
246 
247  await Assert.ThrowsExceptionAsync<OperationCanceledException>(() => wizard.CheckRunWizard(default)).ConfigureAwait(false);
248 
249  Assert.AreEqual(finalInputSequence.Count, inputPos);
250  mockFailCommand.VerifyAll();
251  mockSuccessCommand.VerifyAll();
252  mockIOManager.VerifyAll();
253  mockGeneralConfigurationOptions.VerifyAll();
254  mockConsole.VerifyAll();
255  mockGoodDbConnection.VerifyAll();
256  mockBadDbConnection.VerifyAll();
257  mockUglyDbConnection.VerifyAll();
258  mockDBConnectionFactory.VerifyAll();
259  mockApplication.VerifyAll();
260  mockPlatformIdentifier.VerifyAll();
261  mockAsyncDelayer.VerifyAll();
262  }
263  }
264 }
SetupWizardMode
Determines if the Core.ISetupWizard will run
+ + + +
DatabaseType
Type of database to user
Definition: DatabaseType.cs:6
+ + + + + + + + +
+ + + + diff --git a/_test_symlink_factory_8cs.html b/_test_symlink_factory_8cs.html new file mode 100644 index 0000000000..3304fed15d --- /dev/null +++ b/_test_symlink_factory_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/IO/TestSymlinkFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestSymlinkFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.IO.Tests.TestSymlinkFactory
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.IO
 
namespace  Tgstation.Server.Host.IO.Tests
 
+
+ + + + diff --git a/_test_symlink_factory_8cs_source.html b/_test_symlink_factory_8cs_source.html new file mode 100644 index 0000000000..37448db7d3 --- /dev/null +++ b/_test_symlink_factory_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/IO/TestSymlinkFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestSymlinkFactory.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using System;
3 using System.IO;
4 using System.Runtime.InteropServices;
5 using System.Security.Principal;
6 using System.Threading.Tasks;
7 
9 {
10  [TestClass]
11  public sealed class TestSymlinkFactory
12  {
14 
15  [TestInitialize]
16  public void SelectFactory()
17  {
18  if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
20  else
22  }
23 
24  public static bool HasPermissionToMakeSymlinks()
25  {
26  if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
27  return true;
28  var identity = WindowsIdentity.GetCurrent();
29  var principal = new WindowsPrincipal(identity);
30  return principal.IsInRole(WindowsBuiltInRole.Administrator);
31  }
32 
33  [TestMethod]
34  public async Task TestFileWorks()
35  {
37  Assert.Inconclusive("Current user does not have permission to create symlinks!");
38  const string Text = "Hello world";
39  string f2 = null;
40  var f1 = Path.GetTempFileName();
41  try
42  {
43  f2 = f1 + ".linked";
44  File.WriteAllText(f1, Text);
45 
46  await Assert.ThrowsExceptionAsync<ArgumentNullException>(() => symlinkFactory.CreateSymbolicLink(null, null, default)).ConfigureAwait(false);
47  await Assert.ThrowsExceptionAsync<ArgumentNullException>(() => symlinkFactory.CreateSymbolicLink(f1, null, default)).ConfigureAwait(false);
48 
49  await symlinkFactory.CreateSymbolicLink(f1, f2, default).ConfigureAwait(false);
50  Assert.IsTrue(File.Exists(f2));
51 
52  var f2Contents = File.ReadAllText(f2);
53  Assert.AreEqual(Text, f2Contents);
54  }
55  finally
56  {
57  File.Delete(f2);
58  File.Delete(f1);
59  }
60  }
61 
62  [TestMethod]
63  public async Task TestDirectoryWorks()
64  {
66  Assert.Inconclusive("Current user does not have permission to create symlinks!");
67  const string FileName = "TestFile.txt";
68  const string Text = "Hello world";
69  string f2 = null;
70  var f1 = Path.GetTempFileName();
71  File.Delete(f1);
72  Directory.CreateDirectory(f1);
73  try
74  {
75  f2 = f1 + ".linked";
76  var p1 = Path.Combine(f1, FileName);
77  File.WriteAllText(p1, Text);
78 
79  await Assert.ThrowsExceptionAsync<ArgumentNullException>(() => symlinkFactory.CreateSymbolicLink(null, null, default)).ConfigureAwait(false);
80  await Assert.ThrowsExceptionAsync<ArgumentNullException>(() => symlinkFactory.CreateSymbolicLink(f1, null, default)).ConfigureAwait(false);
81 
82  await symlinkFactory.CreateSymbolicLink(f1, f2, default).ConfigureAwait(false);
83 
84  var p2 = Path.Combine(f2, FileName);
85  Assert.IsTrue(File.Exists(p2));
86 
87  var f2Contents = File.ReadAllText(p2);
88  Assert.AreEqual(Text, f2Contents);
89 
90  File.Delete(p2);
91  Assert.IsFalse(File.Exists(p1));
92  }
93  finally
94  {
95  Directory.Delete(f2, true);
96  Directory.Delete(f1, true);
97  }
98  }
99 
100  [TestMethod]
101  public async Task TestFailsProperly()
102  {
103  const string BadPath = "/../../?>!@#$%^&*()O(UF+}P{{??>/////";
104 
105  try
106  {
107  await symlinkFactory.CreateSymbolicLink(BadPath, BadPath, default).ConfigureAwait(false);
108  Assert.Fail("No exception thrown!");
109  }
110  catch { }
111  }
112  }
113 }
+ + + + + + + + + + + +
+ + + + diff --git a/_test_watchdog_8cs.html b/_test_watchdog_8cs.html new file mode 100644 index 0000000000..c77a742758 --- /dev/null +++ b/_test_watchdog_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/TestWatchdog.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestWatchdog.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Watchdog.Tests.TestWatchdog
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Watchdog
 
namespace  Tgstation.Server.Host.Watchdog.Tests
 
+
+ + + + diff --git a/_test_watchdog_8cs_source.html b/_test_watchdog_8cs_source.html new file mode 100644 index 0000000000..d9b58e4eea --- /dev/null +++ b/_test_watchdog_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/TestWatchdog.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestWatchdog.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using Microsoft.VisualStudio.TestTools.UnitTesting;
3 using Moq;
4 using System;
5 using System.Threading;
6 using System.Threading.Tasks;
7 
9 {
10  [TestClass]
11  public sealed class TestWatchdog
12  {
13  [TestMethod]
14  public void TestConstruction()
15  {
16  Assert.ThrowsException<ArgumentNullException>(() => new Watchdog(null));
17  var mockLogger = new LoggerFactory().CreateLogger<Watchdog>();
18  var wd = new Watchdog(mockLogger);
19  }
20  }
21 }
+ + + +
+ + + + diff --git a/_test_watchdog_factory_8cs.html b/_test_watchdog_factory_8cs.html new file mode 100644 index 0000000000..f99352f2bf --- /dev/null +++ b/_test_watchdog_factory_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/TestWatchdogFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestWatchdogFactory.cs File Reference
+
+ + + + + diff --git a/_test_watchdog_factory_8cs_source.html b/_test_watchdog_factory_8cs_source.html new file mode 100644 index 0000000000..d606e8e773 --- /dev/null +++ b/_test_watchdog_factory_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/TestWatchdogFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestWatchdogFactory.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using Microsoft.VisualStudio.TestTools.UnitTesting;
3 
5 {
9  [TestClass]
10  public sealed class TestWatchdogFactory
11  {
12  [TestMethod]
13  public void TestCreateWatchdog()
14  {
15  var factory = new WatchdogFactory();
16  Assert.IsNotNull(factory.CreateWatchdog(new LoggerFactory()));
17  }
18  }
19 }
+ + + +
+ + + + diff --git a/_testing_server_8cs.html b/_testing_server_8cs.html new file mode 100644 index 0000000000..b47ecce38c --- /dev/null +++ b/_testing_server_8cs.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/TestingServer.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestingServer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Tests.TestingServer
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Tests
 
+
+ + + + diff --git a/_testing_server_8cs_source.html b/_testing_server_8cs_source.html new file mode 100644 index 0000000000..62ae7a4d04 --- /dev/null +++ b/_testing_server_8cs_source.html @@ -0,0 +1,101 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/TestingServer.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestingServer.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.VisualStudio.TestTools.UnitTesting;
2 using System;
3 using System.Collections.Generic;
4 using System.Globalization;
5 using System.IO;
6 using System.Threading;
7 using System.Threading.Tasks;
8 using Tgstation.Server.Host;
10 
11 namespace Tgstation.Server.Tests
12 {
13  sealed class TestingServer : IServer
14  {
15  public Uri Url { get; }
16 
17  public string Directory { get; }
19 
20  readonly IServer realServer;
21 
22  public TestingServer(string updatePath)
23  {
24  Directory = Path.GetTempFileName();
25  File.Delete(Directory);
26  System.IO.Directory.CreateDirectory(Directory);
27  Url = new Uri("http://localhost:5001");
28 
29  //so we need a db
30  //we have to rely on env vars
31  var databaseType = Environment.GetEnvironmentVariable("TGS4_TEST_DATABASE_TYPE");
32  var connectionString = Environment.GetEnvironmentVariable("TGS4_TEST_CONNECTION_STRING");
33  var gitHubAccessToken = Environment.GetEnvironmentVariable("TGS4_TEST_GITHUB_TOKEN");
34 
35  if (String.IsNullOrEmpty(databaseType))
36  Assert.Inconclusive("No database type configured in env var TGS4_TEST_DATABASE_TYPE!");
37 
38  if (String.IsNullOrEmpty(connectionString))
39  Assert.Inconclusive("No connection string configured in env var TGS4_TEST_CONNECTION_STRING!");
40 
41  if (String.IsNullOrEmpty(gitHubAccessToken))
42  Console.WriteLine("WARNING: No GitHub access token configured, test may fail due to rate limits!");
43 
44  var args = new List<string>()
45  {
46  String.Format(CultureInfo.InvariantCulture, "Kestrel:EndPoints:Http:Url={0}", Url),
47  String.Format(CultureInfo.InvariantCulture, "Database:DatabaseType={0}", databaseType),
48  String.Format(CultureInfo.InvariantCulture, "Database:ConnectionString={0}", connectionString),
49  String.Format(CultureInfo.InvariantCulture, "Database:DropDatabase={0}", true),
50  String.Format(CultureInfo.InvariantCulture, "General:SetupWizardMode={0}", SetupWizardMode.Never)
51  };
52 
53  if (!String.IsNullOrEmpty(gitHubAccessToken))
54  args.Add(String.Format(CultureInfo.InvariantCulture, "General:GitHubAccessToken={0}", gitHubAccessToken));
55 
56  realServer = new ServerFactory().CreateServer(args.ToArray(), updatePath);
57  }
58 
59  public void Dispose()
60  {
61  System.IO.Directory.Delete(Directory, true);
62  }
63 
64  public Task RunAsync(CancellationToken cancellationToken) => realServer.RunAsync(cancellationToken);
65  }
66 }
bool RestartRequested
If the IServer should restart
Definition: IServer.cs:14
+ +
SetupWizardMode
Determines if the Core.ISetupWizard will run
+ + + + + + +
Represents the host
Definition: IServer.cs:9
+ +
Task RunAsync(CancellationToken cancellationToken)
Runs the IServer
+
IServer CreateServer(string[] args, string updatePath)
Create a IServer
+
Task RunAsync(CancellationToken cancellationToken)
Runs the IServer
+ + + + + +
+ + + + diff --git a/_tgs_authorize_attribute_8cs.html b/_tgs_authorize_attribute_8cs.html new file mode 100644 index 0000000000..4a7d58412d --- /dev/null +++ b/_tgs_authorize_attribute_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/TgsAuthorizeAttribute.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TgsAuthorizeAttribute.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute
 Helper for using the AuthorizeAttribute with the Api.Rights system More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Controllers
 
+
+ + + + diff --git a/_tgs_authorize_attribute_8cs_source.html b/_tgs_authorize_attribute_8cs_source.html new file mode 100644 index 0000000000..e77408f812 --- /dev/null +++ b/_tgs_authorize_attribute_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/TgsAuthorizeAttribute.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TgsAuthorizeAttribute.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using Microsoft.AspNetCore.Authorization;
4 
6 {
10  #pragma warning disable CA1019
11  [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
13  {
17  public TgsAuthorizeAttribute() { }
18 
24  {
25  Roles = RightsHelper.RoleNames(requiredRights);
26  }
27 
33  {
34  Roles = RightsHelper.RoleNames(requiredRights);
35  }
36 
41  public TgsAuthorizeAttribute(RepositoryRights requiredRights)
42  {
43  Roles = RightsHelper.RoleNames(requiredRights);
44  }
45 
50  public TgsAuthorizeAttribute(ByondRights requiredRights)
51  {
52  Roles = RightsHelper.RoleNames(requiredRights);
53  }
54 
59  public TgsAuthorizeAttribute(DreamMakerRights requiredRights)
60  {
61  Roles = RightsHelper.RoleNames(requiredRights);
62  }
63 
69  {
70  Roles = RightsHelper.RoleNames(requiredRights);
71  }
72 
77  public TgsAuthorizeAttribute(ChatBotRights requiredRights)
78  {
79  Roles = RightsHelper.RoleNames(requiredRights);
80  }
81 
87  {
88  Roles = RightsHelper.RoleNames(requiredRights);
89  }
90 
96  {
97  Roles = RightsHelper.RoleNames(requiredRights);
98  }
99  }
100 }
ConfigurationRights
Rights for Models.ConfigurationFile
+ + +
ByondRights
Rights for Models.Byond
Definition: ByondRights.cs:9
+ +
InstanceUserRights
Rights for an Models.Instance
+
TgsAuthorizeAttribute(ByondRights requiredRights)
Construct a TgsAuthorizeAttribute for ByondRights
+
Helper for using the AuthorizeAttribute with the Api.Rights system
+
TgsAuthorizeAttribute(InstanceManagerRights requiredRights)
Construct a TgsAuthorizeAttribute for InstanceManagerRights
+
AdministrationRights
Rights for Models.Administration
+ +
DreamDaemonRights
Rights for Models.DreamDaemon
+
InstanceManagerRights
Rights for managing Models.Instances
+
TgsAuthorizeAttribute(AdministrationRights requiredRights)
Construct a TgsAuthorizeAttribute for AdministrationRights
+
DreamMakerRights
Rights for Models.DreamMaker
+
TgsAuthorizeAttribute(ConfigurationRights requiredRights)
Construct a TgsAuthorizeAttribute for ConfigurationRights
+
TgsAuthorizeAttribute(DreamMakerRights requiredRights)
Construct a TgsAuthorizeAttribute for DreamMakerRights
+
RepositoryRights
Rights for a Models.Repository
+
TgsAuthorizeAttribute(InstanceUserRights requiredRights)
Construct a TgsAuthorizeAttribute for InstanceUserRights
+ + +
TgsAuthorizeAttribute(RepositoryRights requiredRights)
Construct a TgsAuthorizeAttribute for RepositoryRights
+
ChatBotRights
Rights for Models.ChatBot
Definition: ChatBotRights.cs:9
+
TgsAuthorizeAttribute(ChatBotRights requiredRights)
Construct a TgsAuthorizeAttribute for ChatBotRights
+ +
TgsAuthorizeAttribute(DreamDaemonRights requiredRights)
Construct a TgsAuthorizeAttribute for DreamDaemonRights
+ +
+ + + + 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 new file mode 100644 index 0000000000..7f3e61e772 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_chat_bot_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/ChatBot.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ChatBot.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Api.Models.ChatBot
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..d2ed5e11d0 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_chat_bot_8cs_source.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/ChatBot.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ChatBot.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 
6 {
8  public sealed class ChatBot : Internal.ChatBot
9  {
13  public List<ChatChannel> Channels { get; set; }
14 
20  {
21  switch (Provider)
22  {
23  case ChatProvider.Discord:
24  return Channels?.Select(x => x.DiscordChannelId.HasValue && x.IrcChannel == null).All(x => x) ?? true;
25  case ChatProvider.Irc:
26  return Channels?.Select(x => !x.DiscordChannelId.HasValue && x.IrcChannel != null).All(x => x) ?? true;
27  default:
28  throw new InvalidOperationException("Invalid provider type!");
29  }
30  }
31  }
32 }
List< ChatChannel > Channels
Channels the Discord bot should listen/announce in
Definition: ChatBot.cs:13
+ + +
bool ValidateProviderChannelTypes()
Validates Channels are correct for the Internal.ChatBot.Provider
Definition: ChatBot.cs:19
+
ChatProvider
Represents a chat service provider
Definition: ChatProvider.cs:6
+
ChatProvider? Provider
The ChatProvider used for the connection
Definition: ChatBot.cs:30
+
+ + + + 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 new file mode 100644 index 0000000000..5c3118e873 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_chat_channel_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/ChatChannel.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ChatChannel.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.ChatChannel
 Indicates a chat channel More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..c9bb8fdbb0 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_chat_channel_8cs_source.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/ChatChannel.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ChatChannel.cs
+
+
+Go to the documentation of this file.
1 using System.ComponentModel.DataAnnotations;
2 
4 {
8  public class ChatChannel
9  {
13  public string IrcChannel { get; set; }
14 
18  public ulong? DiscordChannelId { get; set; }
19 
23  [Required]
24  public bool? IsAdminChannel { get; set; }
25 
29  [Required]
30  public bool? IsWatchdogChannel { get; set; }
31 
35  [Required]
36  public bool? IsUpdatesChannel { get; set; }
37 
41  public string Tag { get; set; }
42  }
43 }
+ +
string IrcChannel
The IRC channel name
Definition: ChatChannel.cs:13
+
string Tag
A custom tag users can define to group channels together
Definition: ChatChannel.cs:41
+
bool? IsAdminChannel
If the ChatChannel is an admin channel
Definition: ChatChannel.cs:24
+
ulong? DiscordChannelId
The Discord channel ID
Definition: ChatChannel.cs:18
+
bool? IsUpdatesChannel
If the ChatChannel is an updates channel
Definition: ChatChannel.cs:36
+
bool? IsWatchdogChannel
If the ChatChannel is a watchdog channel
Definition: ChatChannel.cs:30
+
+ + + + 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 new file mode 100644 index 0000000000..d7c3c77eb2 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_compile_job_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/CompileJob.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
CompileJob.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Api.Models.CompileJob
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..490e501b5b --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_compile_job_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/CompileJob.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
CompileJob.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
6  public sealed class CompileJob : Internal.CompileJob
7  {
11  public Job Job { get; set; }
12 
17 
21  public Version ByondVersion { get; set; }
22  }
23 }
+ +
Version ByondVersion
The Byond.Version the CompileJob was made with
Definition: CompileJob.cs:21
+ +
Represents a long running job on the server. Model is read-only, updates attempt to cancel the job
Definition: Job.cs:6
+
+ + + + 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 new file mode 100644 index 0000000000..9af435521a --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_dream_maker_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/DreamMaker.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamMaker.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.DreamMaker
 Represents the state of the DreamMaker compiler. Create action starts a new compile. Delete action cancels the current compile More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..e967d71702 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_dream_maker_8cs_source.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/DreamMaker.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DreamMaker.cs
+
+
+Go to the documentation of this file.
1 using System.ComponentModel.DataAnnotations;
2 
4 {
8  public class DreamMaker
9  {
13  public string ProjectName { get; set; }
14 
18  [Required]
19  public ushort? ApiValidationPort { get; set; }
20 
24  [Required]
26  }
27 }
Represents the state of the DreamMaker compiler. Create action starts a new compile....
Definition: DreamMaker.cs:8
+
ushort? ApiValidationPort
The port used during compilation to validate the DMAPI
Definition: DreamMaker.cs:19
+ +
string ProjectName
The .dme file DreamMaker tries to compile with without the extension
Definition: DreamMaker.cs:13
+
DreamDaemonSecurity? ApiValidationSecurityLevel
The DreamDaemonSecurity level used to validate the DMAPI
Definition: DreamMaker.cs:25
+
DreamDaemonSecurity
DreamDaemon's security level
+
+ + + + 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 new file mode 100644 index 0000000000..9ac5867956 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_instance_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Instance.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Instance.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.Instance
 Metadata about a server instance More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..986448e87d --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_instance_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Instance.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Instance.cs
+
+
+Go to the documentation of this file.
1 using System.ComponentModel.DataAnnotations;
2 using System.ComponentModel.DataAnnotations.Schema;
3 
5 {
9  public class Instance
10  {
14  public long Id { get; set; }
15 
19  [Required]
20  public string Name { get; set; }
21 
25  [Required]
26  public string Path { get; set; }
27 
31  [Required]
32  public bool? Online { get; set; }
33 
37  [Required]
38  public ConfigurationType? ConfigurationType { get; set; }
39 
43  [Required]
44  public uint? AutoUpdateInterval { get; set; }
45 
50  [NotMapped]
51  public Job MoveJob { get; set; }
52 
57  public Instance CloneMetadata() => new Instance
58  {
59  Id = Id,
60  Name = Name,
61  Path = Path,
62  Online = Online,
65  };
66  }
67 }
ConfigurationType
The type of configuration allowed on an Instance
+ +
string Path
The path to where the Instance is located. Can only be changed while the Instance is offline....
Definition: Instance.cs:26
+
string Name
The name of the Instance
Definition: Instance.cs:20
+
Instance CloneMetadata()
Create a clone of the essential Instance metadata
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
ConfigurationType? ConfigurationType
If ConfigurationFile can be used on the Instance
Definition: Instance.cs:38
+
Metadata about a server instance
Definition: Instance.cs:9
+
uint? AutoUpdateInterval
The time interval in minutes the repository is automatically pulled and compiles. 0 disables
Definition: Instance.cs:44
+
Job MoveJob
The Job representing a change of Path
Definition: Instance.cs:51
+
bool? Online
If the Instance is online
Definition: Instance.cs:32
+
Represents a long running job on the server. Model is read-only, updates attempt to cancel the job
Definition: Job.cs:6
+
+ + + + 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 new file mode 100644 index 0000000000..67a554a2e8 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_instance_user_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/InstanceUser.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InstanceUser.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.InstanceUser
 Represents a Users permissions in an Instance More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..7d5cc24f7b --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_instance_user_8cs_source.html @@ -0,0 +1,96 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/InstanceUser.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
InstanceUser.cs
+
+
+Go to the documentation of this file.
1 using System.ComponentModel.DataAnnotations;
3 
5 {
9  public class InstanceUser
10  {
14  [Required]
15  public long? UserId { get; set; }
16 
20  [Required]
21  public InstanceUserRights? InstanceUserRights { get; set; }
22 
26  [Required]
27  public ByondRights? ByondRights { get; set; }
28 
32  [Required]
33  public DreamDaemonRights? DreamDaemonRights { get; set; }
34 
38  [Required]
39  public DreamMakerRights? DreamMakerRights { get; set; }
40 
44  [Required]
45  public RepositoryRights? RepositoryRights { get; set; }
46 
50  [Required]
51  public ChatBotRights? ChatBotRights { get; set; }
52 
56  [Required]
58  }
59 }
ConfigurationRights
Rights for Models.ConfigurationFile
+
long? UserId
The Internal.User.Id of the User the InstanceUser belongs to
Definition: InstanceUser.cs:15
+
ByondRights
Rights for Models.Byond
Definition: ByondRights.cs:9
+ +
InstanceUserRights
Rights for an Models.Instance
+ +
DreamDaemonRights
Rights for Models.DreamDaemon
+
Represents a Users permissions in an Instance
Definition: InstanceUser.cs:9
+
DreamMakerRights
Rights for Models.DreamMaker
+
RepositoryRights
Rights for a Models.Repository
+ + +
ChatBotRights
Rights for Models.ChatBot
Definition: ChatBotRights.cs:9
+ +
+ + + + 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 new file mode 100644 index 0000000000..b5d2412fe9 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_chat_bot_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/ChatBot.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ChatBot.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.Internal.ChatBot
 Manage the server chat bots More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
namespace  Tgstation.Server.Api.Models.Internal
 
+
+ + + + 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 new file mode 100644 index 0000000000..e85795bd26 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_chat_bot_8cs_source.html @@ -0,0 +1,96 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/ChatBot.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ChatBot.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.ComponentModel.DataAnnotations;
3 
5 {
9  public class ChatBot
10  {
14  public long Id { get; set; }
15 
19  [Required]
20  public string Name { get; set; }
21 
25  public bool? Enabled { get; set; }
26 
30  public ChatProvider? Provider { get; set; }
31 
35  [Required]
36  public string ConnectionString { get; set; }
37 
43  {
44  if (ConnectionString == null)
45  return null;
46  switch (Provider)
47  {
48  case ChatProvider.Discord:
50  case ChatProvider.Irc:
52  default:
53  throw new InvalidOperationException("Invalid Provider!");
54  }
55  }
56 
62  {
63  ConnectionString = stringBuilder?.ToString();
64  }
65  }
66 }
abstract override string ToString()
Gets the ChatBot.ConnectionString associated with the ChatConnectionStringBuilder
+
ChatConnectionStringBuilder for ChatProvider.Discord
+
Manage the server chat bots
Definition: ChatBot.cs:9
+ +
string ConnectionString
The information used to connect to the Provider
Definition: ChatBot.cs:36
+
bool? Enabled
If the connection is enabled
Definition: ChatBot.cs:25
+ + +
ChatConnectionStringBuilder CreateConnectionStringBuilder()
Get the ChatConnectionStringBuilder which maps to the ConnectionString.
Definition: ChatBot.cs:42
+
ChatConnectionStringBuilder for ChatProvider.Irc
+
ChatProvider
Represents a chat service provider
Definition: ChatProvider.cs:6
+
void SetConnectionStringBuilder(ChatConnectionStringBuilder stringBuilder)
Set the ChatConnectionStringBuilder for the ChatBot. Also updates the ConnectionString.
Definition: ChatBot.cs:61
+
ChatProvider? Provider
The ChatProvider used for the connection
Definition: ChatBot.cs:30
+
string Name
The name of the connection
Definition: ChatBot.cs:20
+
+ + + + 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 new file mode 100644 index 0000000000..5e606763f2 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_compile_job_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/CompileJob.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
CompileJob.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.Internal.CompileJob
 Represents a run of DreamMaker More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
namespace  Tgstation.Server.Api.Models.Internal
 
+
+ + + + 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 new file mode 100644 index 0000000000..b671f0e79e --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_compile_job_8cs_source.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/CompileJob.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
CompileJob.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.ComponentModel.DataAnnotations;
3 
5 {
9  public class CompileJob
10  {
14  public long Id { get; set; }
15 
19  [Required]
20  public string DmeName { get; set; }
21 
25  [Required]
26  public string Output { get; set; }
27 
31  [Required]
32  public Guid? DirectoryName { get; set; }
33 
37  [Required]
39  }
40 }
DreamDaemonSecurity? MinimumSecurityLevel
The minimum DreamDaemonSecurity required to run the CompileJob's output
Definition: CompileJob.cs:38
+ +
string DmeName
The .dme file used for compilation
Definition: CompileJob.cs:20
+
Represents a run of DreamMaker
Definition: CompileJob.cs:9
+
Guid? DirectoryName
The Game folder the results were compiled into
Definition: CompileJob.cs:32
+ + +
DreamDaemonSecurity
DreamDaemon's security level
+
+ + + + 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 new file mode 100644 index 0000000000..4a97d5aaab --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_dream_daemon_settings_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/DreamDaemonSettings.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamDaemonSettings.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.Internal.DreamDaemonSettings
 Configurable settings for DreamDaemon More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
namespace  Tgstation.Server.Api.Models.Internal
 
+
+ + + + 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 new file mode 100644 index 0000000000..cf2fb887ff --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_dream_daemon_settings_8cs_source.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/DreamDaemonSettings.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DreamDaemonSettings.cs
+
+
+Go to the documentation of this file.
1 using System.ComponentModel.DataAnnotations;
2 
4 {
9  {
13  [Required]
14  public bool? AutoStart { get; set; }
15 
19  [Required]
20  public bool? SoftRestart { get; set; }
21 
25  [Required]
26  public bool? SoftShutdown { get; set; }
27  }
28 }
+
bool? AutoStart
If DreamDaemon starts when it's Instance starts
+ + +
bool? SoftRestart
If the server is undergoing a soft reset. This may be automatically set by changes to other fields
+
bool? SoftShutdown
If the server is undergoing a soft shutdown
+
+ + + + 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 new file mode 100644 index 0000000000..1a474223b4 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_job_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/Job.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Job.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.Internal.Job
 Represents a long running job More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
namespace  Tgstation.Server.Api.Models.Internal
 
+
+ + + + 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 new file mode 100644 index 0000000000..ba795cf310 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_job_8cs_source.html @@ -0,0 +1,97 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/Job.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Job.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.ComponentModel.DataAnnotations;
4 
6 {
10  public class Job
11  {
15  public long Id { get; set; }
16 
20  [Required]
21  public string Description { get; set; }
22 
26  public string ExceptionDetails { get; set; }
27 
31  [Required]
32  public DateTimeOffset? StartedAt { get; set; }
33 
37  public DateTimeOffset? StoppedAt { get; set; }
38 
42  [Required]
43  public bool? Cancelled { get; set; }
44 
48  public RightsType? CancelRightsType { get; set; }
49 
53  public ulong? CancelRight { get; set; }
54  }
55 }
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+ +
string Description
English description of the Job
Definition: Job.cs:21
+
string ExceptionDetails
Details of any exceptions caught during the Job
Definition: Job.cs:26
+
ulong? CancelRight
The Rights required to cancel the Job
Definition: Job.cs:53
+
DateTimeOffset? StoppedAt
When the Job stopped
Definition: Job.cs:37
+
bool? Cancelled
If the Job was cancelled
Definition: Job.cs:43
+
DateTimeOffset? StartedAt
When the Job was started
Definition: Job.cs:32
+
Represents a long running job
Definition: Job.cs:10
+ + + + +
RightsType? CancelRightsType
The RightsType of CancelRight if it can be cancelled
Definition: Job.cs:48
+ +
+ + + + 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 new file mode 100644 index 0000000000..1e32a14119 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/RepositorySettings.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RepositorySettings.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.Internal.RepositorySettings
 Represents configurable settings for a Repository More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
namespace  Tgstation.Server.Api.Models.Internal
 
+
+ + + + 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 new file mode 100644 index 0000000000..6fc42337fc --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/RepositorySettings.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RepositorySettings.cs
+
+
+Go to the documentation of this file.
1 using System.ComponentModel.DataAnnotations;
2 
4 {
8  public class RepositorySettings
9  {
13  [Required]
14  public string CommitterName { get; set; }
15 
19  [Required]
20  public string CommitterEmail { get; set; }
21 
25  public string AccessUser { get; set; }
26 
30  public string AccessToken { get; set; }
31 
35  [Required]
36  public bool? PushTestMergeCommits { get; set; }
37 
41  [Required]
42  public bool? ShowTestMergeCommitters { get; set; }
43 
47  [Required]
48  public bool? AutoUpdatesKeepTestMerges { get; set; }
49 
53  [Required]
54  public bool? AutoUpdatesSynchronize { get; set; }
55 
59  [Required]
60  public bool? PostTestMergeComment { get; set; }
61  }
62 }
Represents configurable settings for a Repository
+ +
bool? AutoUpdatesSynchronize
If synchronization should occur when auto updating
+
bool? ShowTestMergeCommitters
If test merge commits are signed with the username of the person who merged it. Note this only affect...
+
bool? AutoUpdatesKeepTestMerges
If test merge commits should be kept when auto updating. May cause merge conflicts which will block t...
+
string AccessUser
The username to access the git repository with
+ +
bool? PushTestMergeCommits
If commits created from testmerges are pushed to the remote
+
bool? PostTestMergeComment
If test merging should create a comment
+ +
string AccessToken
The token/password to access the git repository with
+
+ + + + 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 new file mode 100644 index 0000000000..977e82ba0c --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_revision_information_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/RevisionInformation.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RevisionInformation.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.Internal.RevisionInformation
 Represents information about a current git revison More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
namespace  Tgstation.Server.Api.Models.Internal
 
+
+ + + + 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 new file mode 100644 index 0000000000..00533b0aaa --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_revision_information_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/RevisionInformation.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RevisionInformation.cs
+
+
+Go to the documentation of this file.
1 using System.ComponentModel.DataAnnotations;
2 
4 {
8  public class RevisionInformation
9  {
13  [Required]
14  [StringLength(40)]
15  public string CommitSha { get; set; }
16 
20  [Required]
21  [StringLength(40)]
22  public string OriginCommitSha { get; set; }
23  }
24 }
+ +
Represents information about a current git revison
+
string OriginCommitSha
The sha of the most recent remote commit
+
+ + + + 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 new file mode 100644 index 0000000000..5c0bf5befc --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_test_merge_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/TestMerge.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestMerge.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.Internal.TestMerge
 Represents a merge of a GitHub pull request More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
namespace  Tgstation.Server.Api.Models.Internal
 
+
+ + + + 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 new file mode 100644 index 0000000000..abf6015b19 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_test_merge_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/TestMerge.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestMerge.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.ComponentModel.DataAnnotations;
3 
5 {
9  public class TestMerge : TestMergeBase
10  {
14  public long Id { get; set; }
15 
19  [Required]
20  public DateTimeOffset MergedAt { get; set; }
21  }
22 }
Represents a merge of a GitHub pull request
Definition: TestMerge.cs:9
+
Layer of test merge data required internally
Definition: TestMergeBase.cs:9
+ +
DateTimeOffset MergedAt
When the TestMerge was created
Definition: TestMerge.cs:20
+ +
+ + + + 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 new file mode 100644 index 0000000000..6b39fc470e --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_user_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/User.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
User.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.Internal.User
 Represents a server User More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
namespace  Tgstation.Server.Api.Models.Internal
 
+
+ + + + 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 new file mode 100644 index 0000000000..e9da7dd4e0 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_user_8cs_source.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal/User.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
User.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.ComponentModel.DataAnnotations;
4 
6 {
10  public class User
11  {
15  public long Id { get; set; }
16 
20  [Required]
21  public bool? Enabled { get; set; }
22 
26  [Required]
27  public DateTimeOffset? CreatedAt { get; set; }
28 
32  public string SystemIdentifier { get; set; }
33 
37  [Required]
38  public string Name { get; set; }
39 
43  [Required]
45 
49  [Required]
51  }
52 }
string Name
The name of the User
Definition: User.cs:38
+ +
Represents a server User
Definition: User.cs:10
+
AdministrationRights
Rights for Models.Administration
+
InstanceManagerRights
Rights for managing Models.Instances
+ + +
long Id
The ID of the User
Definition: User.cs:15
+
DateTimeOffset? CreatedAt
When the User was created
Definition: User.cs:27
+ +
bool? Enabled
If the User is enabled since users cannot be deleted. System users cannot be disabled
Definition: User.cs:21
+
string SystemIdentifier
The SID/UID of the User on Windows/POSIX respectively
Definition: User.cs:32
+ +
+ + + + 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 new file mode 100644 index 0000000000..33ba04cff4 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_job_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Job.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Job.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.Job
 Represents a long running job on the server. Model is read-only, updates attempt to cancel the job More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..d849c0b51d --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_job_8cs_source.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Job.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Job.cs
+
+
+Go to the documentation of this file.
2 {
6  public sealed class Job : Internal.Job
7  {
11  public User StartedBy { get; set; }
12 
16  public User CancelledBy { get; set; }
17 
21  public int? Progress { get; set; }
22  }
23 }
User CancelledBy
The User that cancelled the job
Definition: Job.cs:16
+ +
int? Progress
Optional progress between 0 and 100 inclusive
Definition: Job.cs:21
+ +
User StartedBy
The User that started the job
Definition: Job.cs:11
+
Represents a long running job on the server. Model is read-only, updates attempt to cancel the job
Definition: Job.cs:6
+
+ + + + 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 new file mode 100644 index 0000000000..92ebe9fd37 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_repository_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Repository.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Repository.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.Repository
 Represents a git repository More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..b688414f0f --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_repository_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Repository.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Repository.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 
4 {
8  public sealed class Repository : Internal.RepositorySettings
9  {
13  public string Origin { get; set; }
14 
18  public string CheckoutSha { get; set; }
19 
24 
28  public string GitHubOwner { get; set; }
29 
33  public string GitHubName { get; set; }
34 
38  public Job ActiveJob { get; set; }
39 
43  public bool? UpdateFromOrigin { get; set; }
44 
48  public string Reference { get; set; }
49 
53  public List<TestMergeParameters> NewTestMerges { get; set; }
54  }
55 }
string GitHubOwner
If the repository was cloned from GitHub.com this will be set with the owner of the repository
Definition: Repository.cs:28
+
string CheckoutSha
The commit HEAD should point to. Not populated in responses, use RevisionInformation instead for retr...
Definition: Repository.cs:18
+ +
List< TestMergeParameters > NewTestMerges
TestMergeParameters for new TestMerges. Note that merges that conflict will not be performed
Definition: Repository.cs:53
+
Job ActiveJob
The Job started by the Repository if any
Definition: Repository.cs:38
+
Represents a git repository
Definition: Repository.cs:8
+
string Reference
The branch or tag HEAD points to
Definition: Repository.cs:48
+
string Origin
The origin URL. If null, the Repository does not exist
Definition: Repository.cs:13
+
string GitHubName
If the repository was cloned from GitHub.com this will be set with the name of the repository
Definition: Repository.cs:33
+
bool? UpdateFromOrigin
Do the equivalent of a git pull. Will attempt to merge unless Reference is also specified in which ca...
Definition: Repository.cs:43
+ +
Represents a long running job on the server. Model is read-only, updates attempt to cancel the job
Definition: Job.cs:6
+
+ + + + 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 new file mode 100644 index 0000000000..f60aa8e1a4 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_revision_information_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/RevisionInformation.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RevisionInformation.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Api.Models.RevisionInformation
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..1fc0cc6d92 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_revision_information_8cs_source.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/RevisionInformation.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RevisionInformation.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 
4 {
6  public sealed class RevisionInformation : Internal.RevisionInformation
7  {
11  public TestMerge PrimaryTestMerge { get; set; }
12 
16  public List<TestMerge> ActiveTestMerges { get; set; }
17 
21  public List<CompileJob> CompileJobs { get; set; }
22  }
23 }
List< CompileJob > CompileJobs
The CompileJobs made from the RevisionInformation
+ +
TestMerge PrimaryTestMerge
The TestMerge that was created with this RevisionInformation
+
List< TestMerge > ActiveTestMerges
The TestMerges active in the RevisionInformation
+ + +
+ + + + 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 new file mode 100644 index 0000000000..6f45325dee --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_test_merge_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/TestMerge.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestMerge.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Api.Models.TestMerge
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..a0dcef345a --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_test_merge_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/TestMerge.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestMerge.cs
+
+
+Go to the documentation of this file.
2 {
4  public sealed class TestMerge : Internal.TestMerge
5  {
9  public User MergedBy { get; set; }
10  }
11 }
+ + +
User MergedBy
The User who created the TestMerge
Definition: TestMerge.cs:9
+
+ + + + 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 new file mode 100644 index 0000000000..d258c53d67 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_user_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/User.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
User.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Api.Models.User
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..d516a2ce37 --- /dev/null +++ b/_tgstation_8_server_8_api_2_models_2_user_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/User.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
User.cs
+
+
+Go to the documentation of this file.
2 {
4  public class User : Internal.User
5  {
9  public const string AdminName = "Admin";
10 
14  public const string DefaultAdminPassword = "ISolemlySwearToDeleteTheDataDirectory";
15 
19  public User CreatedBy { get; set; }
20  }
21 }
const string AdminName
The name of the default admin user
Definition: User.cs:9
+
User CreatedBy
The User who created this User
Definition: User.cs:19
+ +
const string DefaultAdminPassword
The default admin password
Definition: User.cs:14
+ +
+ + + + diff --git a/_tgstation_8_server_8_api_8_assembly_info_8cs.html b/_tgstation_8_server_8_api_8_assembly_info_8cs.html new file mode 100644 index 0000000000..b00c4d90fb --- /dev/null +++ b/_tgstation_8_server_8_api_8_assembly_info_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/obj/Debug/netstandard2.0/Tgstation.Server.Api.AssemblyInfo.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.AssemblyInfo.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_api_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_api_8_assembly_info_8cs_source.html new file mode 100644 index 0000000000..6190314e1c --- /dev/null +++ b/_tgstation_8_server_8_api_8_assembly_info_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/obj/Debug/netstandard2.0/Tgstation.Server.Api.AssemblyInfo.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.AssemblyInfo.cs
+
+
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("/tg/station")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyCopyrightAttribute("2018")]
17 [assembly: System.Reflection.AssemblyDescriptionAttribute("API definitions for tgstation-server")]
18 [assembly: System.Reflection.AssemblyFileVersionAttribute("4.0.2.0")]
19 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("4.0.2")]
20 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Api")]
21 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Api")]
22 [assembly: System.Reflection.AssemblyVersionAttribute("4.0.2.0")]
23 
24 // Generated by the MSBuild WriteCodeFragment class.
25 
+ + + + diff --git a/_tgstation_8_server_8_api_8_tests_8_assembly_info_8cs.html b/_tgstation_8_server_8_api_8_tests_8_assembly_info_8cs.html new file mode 100644 index 0000000000..9117eaef1a --- /dev/null +++ b/_tgstation_8_server_8_api_8_tests_8_assembly_info_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Api.Tests.AssemblyInfo.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Tests.AssemblyInfo.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_api_8_tests_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_api_8_tests_8_assembly_info_8cs_source.html new file mode 100644 index 0000000000..9129d1e6ff --- /dev/null +++ b/_tgstation_8_server_8_api_8_tests_8_assembly_info_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Api.Tests.AssemblyInfo.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Tests.AssemblyInfo.cs
+
+
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Api.Tests")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Api.Tests")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Api.Tests")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+ + + + diff --git a/_tgstation_8_server_8_api_8_tests_8_program_8cs.html b/_tgstation_8_server_8_api_8_tests_8_program_8cs.html new file mode 100644 index 0000000000..8a9302aed4 --- /dev/null +++ b/_tgstation_8_server_8_api_8_tests_8_program_8cs.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Api.Tests.Program.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Tests.Program.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_api_8_tests_8_program_8cs_source.html b/_tgstation_8_server_8_api_8_tests_8_program_8cs_source.html new file mode 100644 index 0000000000..66b479083e --- /dev/null +++ b/_tgstation_8_server_8_api_8_tests_8_program_8cs_source.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Api.Tests.Program.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Tests.Program.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated> This file has been auto generated. </auto-generated>
2 using System;
3 [Microsoft.VisualStudio.TestPlatform.TestSDKAutoGeneratedCode]
4 class AutoGeneratedProgram {static void Main(string[] args){}}
+
static void Main(string[] args)
+
+ + + + diff --git a/_tgstation_8_server_8_client_2_assembly_info_8cs.html b/_tgstation_8_server_8_client_2_assembly_info_8cs.html new file mode 100644 index 0000000000..31ce1b5b9b --- /dev/null +++ b/_tgstation_8_server_8_client_2_assembly_info_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/AssemblyInfo.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
AssemblyInfo.cs File Reference
+
+ + + + + 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 new file mode 100644 index 0000000000..e31cddfdf3 --- /dev/null +++ b/_tgstation_8_server_8_client_2_assembly_info_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/AssemblyInfo.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
AssemblyInfo.cs
+
+
+Go to the documentation of this file.
1 using System.Runtime.CompilerServices;
2 
3 [assembly: InternalsVisibleTo("Tgstation.Server.Client.Tests")]
4 [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
+ + + + diff --git a/_tgstation_8_server_8_client_8_assembly_info_8cs.html b/_tgstation_8_server_8_client_8_assembly_info_8cs.html new file mode 100644 index 0000000000..cab70e71a0 --- /dev/null +++ b/_tgstation_8_server_8_client_8_assembly_info_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/obj/Debug/netstandard2.0/Tgstation.Server.Client.AssemblyInfo.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.AssemblyInfo.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_client_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_client_8_assembly_info_8cs_source.html new file mode 100644 index 0000000000..335e64038e --- /dev/null +++ b/_tgstation_8_server_8_client_8_assembly_info_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/obj/Debug/netstandard2.0/Tgstation.Server.Client.AssemblyInfo.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.AssemblyInfo.cs
+
+
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("/tg/station 13")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyCopyrightAttribute("2018")]
17 [assembly: System.Reflection.AssemblyDescriptionAttribute("Client library for tgstation-server")]
18 [assembly: System.Reflection.AssemblyFileVersionAttribute("4.0.3.0")]
19 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("4.0.3.0")]
20 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Client")]
21 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Client")]
22 [assembly: System.Reflection.AssemblyVersionAttribute("4.0.3.0")]
23 [assembly: System.Resources.NeutralResourcesLanguageAttribute("en-CA")]
24 
25 // Generated by the MSBuild WriteCodeFragment class.
26 
+ + + + diff --git a/_tgstation_8_server_8_client_8_tests_8_assembly_info_8cs.html b/_tgstation_8_server_8_client_8_tests_8_assembly_info_8cs.html new file mode 100644 index 0000000000..afa3ebcfa4 --- /dev/null +++ b/_tgstation_8_server_8_client_8_tests_8_assembly_info_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Client.Tests.AssemblyInfo.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Tests.AssemblyInfo.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_client_8_tests_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_client_8_tests_8_assembly_info_8cs_source.html new file mode 100644 index 0000000000..aaa765b6a0 --- /dev/null +++ b/_tgstation_8_server_8_client_8_tests_8_assembly_info_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Client.Tests.AssemblyInfo.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Tests.AssemblyInfo.cs
+
+
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Client.Tests")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Client.Tests")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Client.Tests")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+ + + + diff --git a/_tgstation_8_server_8_client_8_tests_8_program_8cs.html b/_tgstation_8_server_8_client_8_tests_8_program_8cs.html new file mode 100644 index 0000000000..b60afa3af8 --- /dev/null +++ b/_tgstation_8_server_8_client_8_tests_8_program_8cs.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Client.Tests.Program.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Tests.Program.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_client_8_tests_8_program_8cs_source.html b/_tgstation_8_server_8_client_8_tests_8_program_8cs_source.html new file mode 100644 index 0000000000..b40386a6c6 --- /dev/null +++ b/_tgstation_8_server_8_client_8_tests_8_program_8cs_source.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Client.Tests.Program.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Tests.Program.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated> This file has been auto generated. </auto-generated>
2 using System;
3 [Microsoft.VisualStudio.TestPlatform.TestSDKAutoGeneratedCode]
4 class AutoGeneratedProgram {static void Main(string[] args){}}
+ +
+ + + + diff --git a/_tgstation_8_server_8_host_2_assembly_info_8cs.html b/_tgstation_8_server_8_host_2_assembly_info_8cs.html new file mode 100644 index 0000000000..a787c564b7 --- /dev/null +++ b/_tgstation_8_server_8_host_2_assembly_info_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/AssemblyInfo.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
AssemblyInfo.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_host_2_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_2_assembly_info_8cs_source.html new file mode 100644 index 0000000000..dfbbd653f6 --- /dev/null +++ b/_tgstation_8_server_8_host_2_assembly_info_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/AssemblyInfo.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
AssemblyInfo.cs
+
+
+Go to the documentation of this file.
1 using System.Runtime.CompilerServices;
2 
3 [assembly: InternalsVisibleTo("Tgstation.Server.Host.Tests")]
4 [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
+ + + + diff --git a/_tgstation_8_server_8_host_2_components_2_chat_2_user_8cs.html b/_tgstation_8_server_8_host_2_components_2_chat_2_user_8cs.html new file mode 100644 index 0000000000..07c53d2a64 --- /dev/null +++ b/_tgstation_8_server_8_host_2_components_2_chat_2_user_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/User.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
User.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Chat.User
 Represents a tgs_chat_user datum More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
+
+ + + + diff --git a/_tgstation_8_server_8_host_2_components_2_chat_2_user_8cs_source.html b/_tgstation_8_server_8_host_2_components_2_chat_2_user_8cs_source.html new file mode 100644 index 0000000000..732ec0b9db --- /dev/null +++ b/_tgstation_8_server_8_host_2_components_2_chat_2_user_8cs_source.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/User.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
User.cs
+
+
+Go to the documentation of this file.
1 using Newtonsoft.Json;
2 using System;
3 using System.Globalization;
4 
6 {
10  public sealed class User
11  {
15  public string Id { get; set; }
16 
20  [JsonIgnore]
21  public ulong RealId
22  {
23  get => UInt64.Parse(Id, CultureInfo.InvariantCulture);
24  set => Id = value.ToString(CultureInfo.InvariantCulture);
25  }
26 
30  public string FriendlyName { get; set; }
31 
35  public string Mention { get; set; }
36 
40  public Channel Channel { get; set; }
41  }
42 }
+
string Mention
The text to mention the user
Definition: User.cs:35
+
string FriendlyName
The friendly name of the user
Definition: User.cs:30
+
Represents a Providers.IProvider channel
Definition: Channel.cs:10
+
Represents a tgs_chat_user datum
Definition: User.cs:10
+
ulong RealId
The internal user id
Definition: User.cs:22
+
string Id
Backing field for RealId. Represented as a string to avoid BYOND percision loss
Definition: User.cs:15
+
+ + + + diff --git a/_tgstation_8_server_8_host_2_components_2_compiler_2_dream_maker_8cs.html b/_tgstation_8_server_8_host_2_components_2_compiler_2_dream_maker_8cs.html new file mode 100644 index 0000000000..1d3d41dfa7 --- /dev/null +++ b/_tgstation_8_server_8_host_2_components_2_compiler_2_dream_maker_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Compiler/DreamMaker.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamMaker.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Components.Compiler.DreamMaker
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Compiler
 
+
+ + + + diff --git a/_tgstation_8_server_8_host_2_components_2_compiler_2_dream_maker_8cs_source.html b/_tgstation_8_server_8_host_2_components_2_compiler_2_dream_maker_8cs_source.html new file mode 100644 index 0000000000..dd306b7483 --- /dev/null +++ b/_tgstation_8_server_8_host_2_components_2_compiler_2_dream_maker_8cs_source.html @@ -0,0 +1,160 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Compiler/DreamMaker.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DreamMaker.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using System;
3 using System.Collections.Generic;
4 using System.Globalization;
5 using System.Linq;
6 using System.Text;
7 using System.Threading;
8 using System.Threading.Tasks;
16 using Tgstation.Server.Host.IO;
17 
19 {
21  sealed class DreamMaker : IDreamMaker
22  {
26  public const string ADirectoryName = "A";
27 
31  public const string BDirectoryName = "B";
32 
36  public const string DmbExtension = ".dmb";
37 
41  const string DmeExtension = "dme";
42 
46  readonly IByondManager byond;
47 
52 
56  readonly StaticFiles.IConfiguration configuration;
57 
62 
67 
72 
77 
81  readonly IChat chat;
82 
87 
91  readonly IWatchdog watchdog;
92 
96  readonly ILogger<DreamMaker> logger;
97 
101  bool compiling;
102 
110  static async Task ProgressTask(Action<int> progressReporter, TimeSpan estimatedDuration, CancellationToken cancellationToken)
111  {
112  progressReporter(0);
113  var sleepInterval = estimatedDuration / 100;
114 
115  try
116  {
117  for (var I = 0; I < 99; ++I)
118  {
119  await Task.Delay(sleepInterval, cancellationToken).ConfigureAwait(false);
120  progressReporter(I + 1);
121  }
122  }
123  catch (OperationCanceledException) { }
124  }
125 
141  {
142  this.byond = byond ?? throw new ArgumentNullException(nameof(byond));
143  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
144  this.configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
145  this.sessionControllerFactory = sessionControllerFactory ?? throw new ArgumentNullException(nameof(sessionControllerFactory));
146  this.compileJobConsumer = compileJobConsumer ?? throw new ArgumentNullException(nameof(compileJobConsumer));
147  this.application = application ?? throw new ArgumentNullException(nameof(application));
148  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
149  this.chat = chat ?? throw new ArgumentNullException(nameof(chat));
150  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
151  this.watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
152  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
153  }
154 
165  async Task VerifyApi(uint timeout, DreamDaemonSecurity securityLevel, Models.CompileJob job, IByondExecutableLock byondLock, ushort portToUse, CancellationToken cancellationToken)
166  {
167  logger.LogTrace("Verifying DMAPI...");
168  var launchParameters = new DreamDaemonLaunchParameters
169  {
170  AllowWebClient = false,
171  PrimaryPort = portToUse,
172  SecurityLevel = securityLevel,
173  StartupTimeout = timeout
174  };
175 
176  var dirA = ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName);
177 
178  job.MinimumSecurityLevel = securityLevel; // needed for the TempDmbProvider
179  var timeoutAt = DateTimeOffset.Now.AddSeconds(timeout);
180 
181  using (var provider = new TemporaryDmbProvider(ioManager.ResolvePath(dirA), String.Concat(job.DmeName, DmbExtension), job))
182  using (var controller = await sessionControllerFactory.LaunchNew(launchParameters, provider, byondLock, true, true, true, cancellationToken).ConfigureAwait(false))
183  {
184  var launchResult = await controller.LaunchResult.ConfigureAwait(false);
185 
186  var now = DateTimeOffset.Now;
187  if (now < timeoutAt && launchResult.StartupTime.HasValue)
188  {
189  var timeoutTask = Task.Delay(timeoutAt - now, cancellationToken);
190 
191  await Task.WhenAny(controller.Lifetime, timeoutTask).ConfigureAwait(false);
192  cancellationToken.ThrowIfCancellationRequested();
193  }
194 
195  if (controller.Lifetime.IsCompleted)
196  {
197  var validationStatus = controller.ApiValidationStatus;
198  logger.LogTrace("API validation status: {0}", validationStatus);
199  switch (validationStatus)
200  {
201  case ApiValidationStatus.RequiresUltrasafe:
202  job.MinimumSecurityLevel = DreamDaemonSecurity.Ultrasafe;
203  return;
204  case ApiValidationStatus.RequiresSafe:
205  if (securityLevel == DreamDaemonSecurity.Ultrasafe)
206  throw new JobException("This game must be run with at least the 'Safe' DreamDaemon security level!");
207  job.MinimumSecurityLevel = DreamDaemonSecurity.Safe;
208  return;
209  case ApiValidationStatus.RequiresTrusted:
210  if (securityLevel != DreamDaemonSecurity.Trusted)
211  throw new JobException("This game must be run with at least the 'Trusted' DreamDaemon security level!");
212  job.MinimumSecurityLevel = DreamDaemonSecurity.Trusted;
213  return;
214  case ApiValidationStatus.NeverValidated:
215  break;
216  case ApiValidationStatus.BadValidationRequest:
217  throw new JobException("Recieved an unrecognized API validation request from DreamDaemon!");
218  case ApiValidationStatus.UnaskedValidationRequest:
219  default:
220  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Session controller returned unexpected ApiValidationStatus: {0}", validationStatus));
221  }
222  }
223 
224  throw new JobException("DMAPI validation timed out!");
225  }
226  }
227 
235  async Task<int> RunDreamMaker(string dreamMakerPath, Models.CompileJob job, CancellationToken cancellationToken)
236  {
237  using (var dm = processExecutor.LaunchProcess(dreamMakerPath, ioManager.ResolvePath(ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName)), String.Format(CultureInfo.InvariantCulture, "-clean {0}.{1}", job.DmeName, DmeExtension), true, true))
238  {
239  int exitCode;
240  using (cancellationToken.Register(() => dm.Terminate()))
241  exitCode = await dm.Lifetime.ConfigureAwait(false);
242  cancellationToken.ThrowIfCancellationRequested();
243 
244  logger.LogDebug("DreamMaker exit code: {0}", exitCode);
245  job.Output = dm.GetCombinedOutput();
246  logger.LogTrace("DreamMaker output: {0}{1}", Environment.NewLine, job.Output);
247  return exitCode;
248  }
249  }
250 
257  async Task ModifyDme(Models.CompileJob job, CancellationToken cancellationToken)
258  {
259  var dirA = ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName);
260  var dmeFileName = String.Join('.', job.DmeName, DmeExtension);
261  var dmePath = ioManager.ConcatPath(dirA, dmeFileName);
262  var dmeReadTask = ioManager.ReadAllBytes(dmePath, cancellationToken);
263 
264  var dmeModificationsTask = configuration.CopyDMFilesTo(dmeFileName, ioManager.ResolvePath(dirA), cancellationToken);
265 
266  var dmeBytes = await dmeReadTask.ConfigureAwait(false);
267  var dme = Encoding.UTF8.GetString(dmeBytes);
268 
269  var dmeModifications = await dmeModificationsTask.ConfigureAwait(false);
270 
271  if (dmeModifications == null || dmeModifications.TotalDmeOverwrite)
272  {
273  if (dmeModifications != null)
274  logger.LogDebug(".dme replacement configured!");
275  else
276  logger.LogTrace("No .dme modifications required.");
277  return;
278  }
279 
280  if (dmeModifications.HeadIncludeLine != null)
281  logger.LogDebug("Head .dme include line: {0}", dmeModifications.HeadIncludeLine);
282  if (dmeModifications.TailIncludeLine != null)
283  logger.LogDebug("Tail .dme include line: {0}", dmeModifications.TailIncludeLine);
284 
285  var dmeLines = new List<string>(dme.Split(new[] { Environment.NewLine }, StringSplitOptions.None));
286  for (var I = 0; I < dmeLines.Count; ++I)
287  {
288  var line = dmeLines[I];
289  if (line.Contains("BEGIN_INCLUDE", StringComparison.Ordinal) && dmeModifications.HeadIncludeLine != null)
290  {
291  dmeLines.Insert(I + 1, dmeModifications.HeadIncludeLine);
292  ++I;
293  }
294  else if (line.Contains("END_INCLUDE", StringComparison.Ordinal) && dmeModifications.TailIncludeLine != null)
295  {
296  dmeLines.Insert(I, dmeModifications.TailIncludeLine);
297  break;
298  }
299  }
300 
301  dmeBytes = Encoding.UTF8.GetBytes(String.Join(Environment.NewLine, dmeLines));
302  await ioManager.WriteAllBytes(dmePath, dmeBytes, cancellationToken).ConfigureAwait(false);
303  }
304 
312  async Task CleanupFailedCompile(Models.CompileJob job, bool cancelled, CancellationToken cancellationToken)
313  {
314  logger.LogTrace("Cleaning compile directory...");
315  var chatTask = chat.SendUpdateMessage(cancelled ? "Deploy cancelled!" : "Deploy failed!", cancellationToken);
316  var jobPath = job.DirectoryName.ToString();
317  try
318  {
319  await ioManager.DeleteDirectory(jobPath, CancellationToken.None).ConfigureAwait(false);
320  }
321  catch (Exception e)
322  {
323  logger.LogWarning("Error cleaning up compile directory {0}! Exception: {1}", ioManager.ResolvePath(jobPath), e);
324  }
325 
326  await chatTask.ConfigureAwait(false);
327  }
328 
336  async Task SendDeploymentMessage(Models.RevisionInformation revisionInformation, IByondExecutableLock byondLock, CancellationToken cancellationToken)
337  {
338  var commitInsert = revisionInformation.CommitSha.Substring(0, 7);
339  string remoteCommitInsert;
340  if (revisionInformation.CommitSha == revisionInformation.OriginCommitSha)
341  {
342  commitInsert = String.Format(CultureInfo.InvariantCulture, "^{0}", commitInsert);
343  remoteCommitInsert = String.Empty;
344  }
345  else
346  remoteCommitInsert = String.Format(CultureInfo.InvariantCulture, ". Remote commit: ^{0}", revisionInformation.OriginCommitSha.Substring(0, 7));
347 
348  var testmergeInsert = revisionInformation.ActiveTestMerges.Count == 0 ? String.Empty : String.Format(CultureInfo.InvariantCulture, " (Test Merges: {0})",
349  String.Join(", ", revisionInformation.ActiveTestMerges.Select(x => x.TestMerge).Select(x =>
350  {
351  var result = String.Format(CultureInfo.InvariantCulture, "#{0} at {1}", x.Number, x.PullRequestRevision.Substring(0, 7));
352  if (x.Comment != null)
353  result += String.Format(CultureInfo.InvariantCulture, " ({0})", x.Comment);
354  return result;
355  })));
356 
357  await chat.SendUpdateMessage(String.Format(CultureInfo.InvariantCulture, "Deploying revision: {0}{1}{2} BYOND Version: {3}", commitInsert, testmergeInsert, remoteCommitInsert, byondLock.Version), cancellationToken).ConfigureAwait(false);
358  }
359 
370  async Task RunCompileJob(Models.CompileJob job, Api.Models.DreamMaker dreamMakerSettings, IByondExecutableLock byondLock, IRepository repository, uint apiValidateTimeout, CancellationToken cancellationToken)
371  {
372  var jobPath = job.DirectoryName.ToString();
373  logger.LogTrace("Compile output GUID: {0}", jobPath);
374 
375  try
376  {
377  var dirA = ioManager.ConcatPath(jobPath, ADirectoryName);
378  var dirB = ioManager.ConcatPath(jobPath, BDirectoryName);
379 
380  // copy the repository
381  logger.LogTrace("Copying repository to game directory...");
382  var resolvedADirectory = ioManager.ResolvePath(dirA);
383  var repoOrigin = repository.Origin;
384  using (repository)
385  await repository.CopyTo(resolvedADirectory, cancellationToken).ConfigureAwait(false);
386 
387  // repository closed now
388 
389  // run precompile scripts
390  await eventConsumer.HandleEvent(EventType.CompileStart, new List<string> { resolvedADirectory, repoOrigin }, cancellationToken).ConfigureAwait(false);
391 
392  // determine the dme
393  if (job.DmeName == null)
394  {
395  logger.LogTrace("Searching for available .dmes...");
396  var foundPaths = await ioManager.GetFilesWithExtension(dirA, DmeExtension, cancellationToken).ConfigureAwait(false);
397  var foundPath = foundPaths.FirstOrDefault();
398  if (foundPath == default)
399  throw new JobException("Unable to find any .dme!");
400  var dmeWithExtension = ioManager.GetFileName(foundPath);
401  job.DmeName = dmeWithExtension.Substring(0, dmeWithExtension.Length - DmeExtension.Length - 1);
402  }
403  else
404  {
405  var targetDme = ioManager.ConcatPath(dirA, String.Join('.', job.DmeName, DmeExtension));
406  var targetDmeExists = await ioManager.FileExists(targetDme, cancellationToken).ConfigureAwait(false);
407  if (!targetDmeExists)
408  throw new JobException("Unable to locate specified .dme!");
409  }
410 
411  logger.LogDebug("Selected {0}.dme for compilation!", job.DmeName);
412 
413  await ModifyDme(job, cancellationToken).ConfigureAwait(false);
414 
415  // run compiler
416  var exitCode = await RunDreamMaker(byondLock.DreamMakerPath, job, cancellationToken).ConfigureAwait(false);
417 
418  // verify api
419  try
420  {
421  if (exitCode != 0)
422  throw new JobException(String.Format(CultureInfo.InvariantCulture, "DM exited with a non-zero code: {0}{1}{2}", exitCode, Environment.NewLine, job.Output));
423 
424  await VerifyApi(apiValidateTimeout, dreamMakerSettings.ApiValidationSecurityLevel.Value, job, byondLock, dreamMakerSettings.ApiValidationPort.Value, cancellationToken).ConfigureAwait(false);
425  }
426  catch (JobException)
427  {
428  // DD never validated or compile failed
429  await eventConsumer.HandleEvent(EventType.CompileFailure, new List<string> { resolvedADirectory, exitCode == 0 ? "1" : "0" }, cancellationToken).ConfigureAwait(false);
430  throw;
431  }
432 
433  logger.LogTrace("Running post compile event...");
434  await eventConsumer.HandleEvent(EventType.CompileComplete, new List<string> { resolvedADirectory }, cancellationToken).ConfigureAwait(false);
435 
436  logger.LogTrace("Duplicating compiled game...");
437 
438  // duplicate the dmb et al
439  await ioManager.CopyDirectory(dirA, dirB, null, cancellationToken).ConfigureAwait(false);
440 
441  logger.LogTrace("Applying static game file symlinks...");
442 
443  // symlink in the static data
444  var symATask = configuration.SymlinkStaticFilesTo(resolvedADirectory, cancellationToken);
445  var symBTask = configuration.SymlinkStaticFilesTo(ioManager.ResolvePath(dirB), cancellationToken);
446 
447  await Task.WhenAll(symATask, symBTask).ConfigureAwait(false);
448 
449  await chat.SendUpdateMessage(String.Format(CultureInfo.InvariantCulture, "Deployment complete!{0}", watchdog.Running ? " Changes will be applied on next server reboot." : String.Empty), cancellationToken).ConfigureAwait(false);
450 
451  logger.LogDebug("Compile complete!");
452  }
453  catch (Exception e)
454  {
455  await CleanupFailedCompile(job, e is OperationCanceledException, cancellationToken).ConfigureAwait(false);
456  throw;
457  }
458  }
459 
461  public async Task<Models.CompileJob> Compile(Models.RevisionInformation revisionInformation, Api.Models.DreamMaker dreamMakerSettings, uint apiValidateTimeout, IRepository repository, Action<int> progressReporter, TimeSpan? estimatedDuration, CancellationToken cancellationToken)
462  {
463  if (revisionInformation == null)
464  throw new ArgumentNullException(nameof(revisionInformation));
465 
466  if (dreamMakerSettings == null)
467  throw new ArgumentNullException(nameof(dreamMakerSettings));
468 
469  if (repository == null)
470  throw new ArgumentNullException(nameof(repository));
471 
472  if (progressReporter == null)
473  throw new ArgumentNullException(nameof(progressReporter));
474 
475  if (dreamMakerSettings.ApiValidationSecurityLevel == DreamDaemonSecurity.Ultrasafe)
476  throw new ArgumentOutOfRangeException(nameof(dreamMakerSettings), dreamMakerSettings, "Cannot compile with ultrasafe security!");
477 
478  logger.LogTrace("Begin Compile");
479 
480  lock (this)
481  {
482  if (compiling)
483  throw new JobException("There is already a compile job in progress!");
484  compiling = true;
485  }
486 
487  using (var progressCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken))
488  {
489  var progressTask = estimatedDuration.HasValue ? ProgressTask(progressReporter, estimatedDuration.Value, cancellationToken) : Task.CompletedTask;
490  try
491  {
492  using (var byondLock = await byond.UseExecutables(null, cancellationToken).ConfigureAwait(false))
493  {
494  await SendDeploymentMessage(revisionInformation, byondLock, cancellationToken).ConfigureAwait(false);
495 
496  var job = new Models.CompileJob
497  {
498  DirectoryName = Guid.NewGuid(),
499  DmeName = dreamMakerSettings.ProjectName,
500  RevisionInformation = revisionInformation,
501  ByondVersion = byondLock.Version.ToString()
502  };
503 
504  await RunCompileJob(job, dreamMakerSettings, byondLock, repository, apiValidateTimeout, cancellationToken).ConfigureAwait(false);
505 
506  return job;
507  }
508  }
509  catch (OperationCanceledException)
510  {
511  await eventConsumer.HandleEvent(EventType.CompileCancelled, null, default).ConfigureAwait(false);
512  throw;
513  }
514  finally
515  {
516  compiling = false;
517  progressCts.Cancel();
518  await progressTask.ConfigureAwait(false);
519  }
520  }
521  }
522  }
523 }
+
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+ +
Task< List< string > > GetFilesWithExtension(string path, string extension, CancellationToken cancellationToken)
Gets a list of files in path with the given extension
+ + +
readonly ILogger< DreamMaker > logger
The ILogger for DreamMaker
Definition: DreamMaker.cs:96
+ +
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+
Consumes EventTypes and takes the appropriate actions
+ +
readonly StaticFiles.IConfiguration configuration
The StaticFiles.IConfiguration for DreamMaker
Definition: DreamMaker.cs:56
+
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+
Task CopyDirectory(string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)
Copies a directory from src to dest
+
Task SendUpdateMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured update channels
+ + +
const string BDirectoryName
Name of the secondary directory used for compilation
Definition: DreamMaker.cs:31
+ +
async Task CleanupFailedCompile(Models.CompileJob job, bool cancelled, CancellationToken cancellationToken)
Cleans up a failed compile job
Definition: DreamMaker.cs:312
+
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+ +
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:370
+
Represents an on-disk git repository
Definition: IRepository.cs:11
+
bool compiling
If a compile job is running
Definition: DreamMaker.cs:101
+
For managing connected chat services
Definition: IChat.cs:13
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+ +
readonly IProcessExecutor processExecutor
The IProcessExecutor for DreamMaker
Definition: DreamMaker.cs:86
+
const string ADirectoryName
Name of the primary directory used for compilation
Definition: DreamMaker.cs:26
+
readonly ISessionControllerFactory sessionControllerFactory
The ISessionControllerFactory for DreamMaker
Definition: DreamMaker.cs:61
+
readonly IEventConsumer eventConsumer
The IEventConsumer for DreamMaker
Definition: DreamMaker.cs:76
+ + +
Task< ISessionController > LaunchNew(DreamDaemonLaunchParameters launchParameters, IDmbProvider dmbProvider, IByondExecutableLock currentByondLock, bool primaryPort, bool primaryDirectory, bool apiValidate, CancellationToken cancellationToken)
Create a ISessionController from a freshly launch DreamDaemon instance
+
string GetFileName(string path)
Gets the file name portion of a path
+
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists
+ +
IProcess LaunchProcess(string fileName, string workingDirectory, string arguments=null, bool readOutput=false, bool readError=false, bool noShellExecute=false)
Launch a IProcess
+
async Task VerifyApi(uint timeout, DreamDaemonSecurity securityLevel, Models.CompileJob job, IByondExecutableLock byondLock, ushort portToUse, CancellationToken cancellationToken)
Run a quick DD instance to test the DMAPI is installed on the target code
Definition: DreamMaker.cs:165
+
string Origin
The current origin remote the IRepository is using
Definition: IRepository.cs:46
+
string DreamMakerPath
The path to the dm/DreamMaker executable
+
const string DmbExtension
Extension for .dmbs
Definition: DreamMaker.cs:36
+ + +
async Task ModifyDme(Models.CompileJob job, CancellationToken cancellationToken)
Adds server side includes to the .dme being compiled
Definition: DreamMaker.cs:257
+
readonly IChat chat
The IChat for DreamMaker
Definition: DreamMaker.cs:81
+ +
readonly IWatchdog watchdog
The IWatchdog for DreamMaker
Definition: DreamMaker.cs:91
+
Task CopyTo(string path, CancellationToken cancellationToken)
Copies the current working directory to a given path
+
Represents usage of the two primary BYOND server executables
+ +
readonly ICompileJobConsumer compileJobConsumer
The ICompileJobConsumer for DreamMaker
Definition: DreamMaker.cs:66
+ +
const string DmeExtension
Extension for .dmes
Definition: DreamMaker.cs:41
+
DreamDaemonSecurity
DreamDaemon's security level
+
bool Running
If the watchdog is running
Definition: IWatchdog.cs:17
+
static async Task ProgressTask(Action< int > progressReporter, TimeSpan estimatedDuration, CancellationToken cancellationToken)
Gradually triggers a given progressReporter over a given estimatedDuration
Definition: DreamMaker.cs:110
+
Task< IByondExecutableLock > UseExecutables(Version requiredVersion, CancellationToken cancellationToken)
Lock the current installation's location and return a IByondExecutableLock
+
readonly IIOManager ioManager
The IIOManager for DreamMaker
Definition: DreamMaker.cs:51
+
DreamMaker(IByondManager byond, IIOManager ioManager, StaticFiles.IConfiguration configuration, ISessionControllerFactory sessionControllerFactory, ICompileJobConsumer compileJobConsumer, IApplication application, IEventConsumer eventConsumer, IChat chat, IProcessExecutor processExecutor, IWatchdog watchdog, ILogger< DreamMaker > logger)
Construct DreamMaker
Definition: DreamMaker.cs:140
+
Interface for using filesystems
Definition: IIOManager.cs:11
+
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:461
+
Represents information about a current git revison
+
Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+
Version Version
The System.Version of the locked executables
+
Task< byte[]> ReadAllBytes(string path, CancellationToken cancellationToken)
Returns all the contents of a file at path as a byte array
+
readonly IApplication application
The IApplication for DreamMaker
Definition: DreamMaker.cs:71
+ +
async Task< int > RunDreamMaker(string dreamMakerPath, Models.CompileJob job, CancellationToken cancellationToken)
Compiles a .dme with DreamMaker
Definition: DreamMaker.cs:235
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+ +
readonly IByondManager byond
The IByondManager for DreamMaker
Definition: DreamMaker.cs:46
+
async Task SendDeploymentMessage(Models.RevisionInformation revisionInformation, IByondExecutableLock byondLock, CancellationToken cancellationToken)
Send a message to chat about a deployment
Definition: DreamMaker.cs:336
+
Runs and monitors the twin server controllers
Definition: IWatchdog.cs:12
+
ApiValidationStatus
Status of DMAPI validation
+ +
+ + + + 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 new file mode 100644 index 0000000000..0fb518cecc --- /dev/null +++ b/_tgstation_8_server_8_host_2_components_2_instance_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Instance.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Instance.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Components.Instance
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
+
+ + + + 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 new file mode 100644 index 0000000000..95247da9bb --- /dev/null +++ b/_tgstation_8_server_8_host_2_components_2_instance_8cs_source.html @@ -0,0 +1,185 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Instance.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Instance.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.Threading;
9 using System.Threading.Tasks;
18 
20 {
22  #pragma warning disable CA1506 // TODO: Decomplexify
23  sealed class Instance : IInstance
24  {
27 
29  public IByondManager ByondManager { get; }
30 
32  public IWatchdog Watchdog { get; }
33 
35  public IChat Chat { get; }
36 
38  public StaticFiles.IConfiguration Configuration { get; }
39 
44 
49 
54 
59 
64 
69 
74 
78  readonly ILogger<Instance> logger;
79 
83  readonly Api.Models.Instance metadata;
84 
88  Task timerTask;
89 
93  CancellationTokenSource timerCts;
94 
113  {
114  this.metadata = metadata ?? throw new ArgumentNullException(nameof(metadata));
115  RepositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
116  ByondManager = byondManager ?? throw new ArgumentNullException(nameof(byondManager));
117  this.dreamMaker = dreamMaker ?? throw new ArgumentNullException(nameof(dreamMaker));
118  Watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
119  Chat = chat ?? throw new ArgumentNullException(nameof(chat));
120  Configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
121  this.compileJobConsumer = compileJobConsumer ?? throw new ArgumentNullException(nameof(compileJobConsumer));
122  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
123  this.dmbFactory = dmbFactory ?? throw new ArgumentNullException(nameof(dmbFactory));
124  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
125  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
126  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
127  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
128  }
129 
131  public void Dispose()
132  {
133  timerCts?.Dispose();
134  compileJobConsumer.Dispose();
135  Configuration.Dispose();
136  Chat.Dispose();
137  Watchdog.Dispose();
139  }
140 
142  public async Task CompileProcess(Job job, IDatabaseContext databaseContext, Action<int> progressReporter, CancellationToken cancellationToken)
143  {
144 #pragma warning disable IDE0016 // Use 'throw' expression
145  if (job == null)
146  throw new ArgumentNullException(nameof(job));
147 #pragma warning restore IDE0016 // Use 'throw' expression
148  if (databaseContext == null)
149  throw new ArgumentNullException(nameof(databaseContext));
150  if (progressReporter == null)
151  throw new ArgumentNullException(nameof(progressReporter));
152 
153  var ddSettingsTask = databaseContext.DreamDaemonSettings.Where(x => x.InstanceId == metadata.Id).Select(x => new DreamDaemonSettings
154  {
155  StartupTimeout = x.StartupTimeout,
156  }).FirstOrDefaultAsync(cancellationToken);
157 
158  var compileJobsTask = databaseContext.CompileJobs
159  .Where(x => x.Job.Instance.Id == metadata.Id)
160  .OrderByDescending(x => x.Job.StoppedAt)
161  .Select(x => new Job
162  {
163  StoppedAt = x.Job.StoppedAt,
164  StartedAt = x.Job.StartedAt
165  })
166  .Take(10)
167  .ToListAsync(cancellationToken);
168 
169  var dreamMakerSettings = await databaseContext.DreamMakerSettings.Where(x => x.InstanceId == metadata.Id).FirstAsync(cancellationToken).ConfigureAwait(false);
170  if (dreamMakerSettings == default)
171  throw new JobException("Missing DreamMakerSettings in DB!");
172  var ddSettings = await ddSettingsTask.ConfigureAwait(false);
173  if (ddSettings == default)
174  throw new JobException("Missing DreamDaemonSettings in DB!");
175 
176  Task<RepositorySettings> repositorySettingsTask = null;
177  string repoOwner = null;
178  string repoName = null;
179  CompileJob compileJob;
180  RevisionInformation revInfo;
181  using (var repo = await RepositoryManager.LoadRepository(cancellationToken).ConfigureAwait(false))
182  {
183  if (repo == null)
184  throw new JobException("Missing Repository!");
185 
186  if (repo.IsGitHubRepository)
187  {
188  repoOwner = repo.GitHubOwner;
189  repoName = repo.GitHubRepoName;
190  repositorySettingsTask = databaseContext.RepositorySettings.Where(x => x.InstanceId == metadata.Id).Select(x => new RepositorySettings
191  {
192  AccessToken = x.AccessToken,
193  ShowTestMergeCommitters = x.ShowTestMergeCommitters,
194  PushTestMergeCommits = x.PushTestMergeCommits
195  }).FirstOrDefaultAsync(cancellationToken);
196  }
197 
198  var repoSha = repo.Head;
199  revInfo = await databaseContext.RevisionInformations.Where(x => x.CommitSha == repoSha && x.Instance.Id == metadata.Id).Include(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy).FirstOrDefaultAsync().ConfigureAwait(false);
200 
201  if (revInfo == default)
202  {
203  revInfo = new RevisionInformation
204  {
205  CommitSha = repoSha,
206  OriginCommitSha = repoSha,
207  Instance = new Models.Instance
208  {
209  Id = metadata.Id
210  }
211  };
212  logger.LogWarning(Repository.Repository.OriginTrackingErrorTemplate, repoSha);
213  databaseContext.Instances.Attach(revInfo.Instance);
214  }
215 
216  TimeSpan? averageSpan = null;
217  var previousCompileJobs = await compileJobsTask.ConfigureAwait(false);
218  if(previousCompileJobs.Count != 0)
219  {
220  var totalSpan = TimeSpan.Zero;
221  foreach (var I in previousCompileJobs)
222  totalSpan += I.StoppedAt.Value - I.StartedAt.Value;
223  averageSpan = totalSpan / previousCompileJobs.Count;
224  }
225 
226  compileJob = await dreamMaker.Compile(revInfo, dreamMakerSettings, ddSettings.StartupTimeout.Value, repo, progressReporter, averageSpan, cancellationToken).ConfigureAwait(false);
227  }
228 
229  compileJob.Job = job;
230 
231  databaseContext.CompileJobs.Add(compileJob); // will be saved by job context
232 
233  job.PostComplete = ct => compileJobConsumer.LoadCompileJob(compileJob, ct);
234 
235  if (repositorySettingsTask != null)
236  {
237  var repositorySettings = await repositorySettingsTask.ConfigureAwait(false);
238  if (repositorySettings == default)
239  throw new JobException("Missing repository settings!");
240 
241  if (repositorySettings.AccessToken != null)
242  {
243  // potential for commenting on a test merge change
244  var outgoingCompileJob = LatestCompileJob();
245 
246  if(outgoingCompileJob != null && outgoingCompileJob.RevisionInformation.CommitSha != compileJob.RevisionInformation.CommitSha && repositorySettings.PostTestMergeComment.Value)
247  {
248  var gitHubClient = gitHubClientFactory.CreateClient(repositorySettings.AccessToken);
249 
250  async Task CommentOnPR(int prNumber, string comment)
251  {
252  try
253  {
254  await gitHubClient.Issue.Comment.Create(repoOwner, repoName, prNumber, comment).ConfigureAwait(false);
255  }
256  catch (ApiException e)
257  {
258  logger.LogWarning("Error posting GitHub comment! Exception: {0}", e);
259  }
260  }
261 
262  var tasks = new List<Task>();
263 
264  string FormatTestMerge(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}",
265  Environment.NewLine,
266  repositorySettings.ShowTestMergeCommitters.Value ? String.Format(CultureInfo.InvariantCulture, "{0}{0}##### Merged By{0}{1}", Environment.NewLine, testMerge.MergedBy.Name) : String.Empty,
267  testMerge.PullRequestRevision,
268  testMerge.Comment != null ? String.Format(CultureInfo.InvariantCulture, "{0}{0}##### Comment{0}{1}", Environment.NewLine, testMerge.Comment) : String.Empty,
269  updated ? "Updated" : "Deployed",
270  metadata.Name,
272  compileJob.RevisionInformation.CommitSha);
273 
274  // added prs
275  foreach (var I in compileJob
277  .ActiveTestMerges
278  .Select(x => x.TestMerge)
279  .Where(x => !outgoingCompileJob
281  .ActiveTestMerges
282  .Any(y => y.TestMerge.Number == x.Number)))
283  tasks.Add(CommentOnPR(I.Number.Value, FormatTestMerge(I, false)));
284 
285  // removed prs
286  foreach (var I in outgoingCompileJob
288  .ActiveTestMerges
289  .Select(x => x.TestMerge)
290  .Where(x => !compileJob
293  .Any(y => y.TestMerge.Number == x.Number)))
294  tasks.Add(CommentOnPR(I.Number.Value, "#### Test Merge Removed"));
295 
296  // updated prs
297  foreach(var I in compileJob
299  .ActiveTestMerges
300  .Select(x => x.TestMerge)
301  .Where(x => outgoingCompileJob
302  .RevisionInformation
303  .ActiveTestMerges
304  .Any(y => y.TestMerge.Number == x.Number)))
305  tasks.Add(CommentOnPR(I.Number.Value, FormatTestMerge(I, true)));
306 
307  if (tasks.Any())
308  await Task.WhenAll(tasks).ConfigureAwait(false);
309  }
310  }
311  }
312  }
313 
320  #pragma warning disable CA1502 // TODO: Decomplexify
321  async Task TimerLoop(uint minutes, CancellationToken cancellationToken)
322  {
323  while (true)
324  try
325  {
326  await Task.Delay(TimeSpan.FromMinutes(minutes > Int32.MaxValue ? Int32.MaxValue : (int)minutes), cancellationToken).ConfigureAwait(false);
327  logger.LogDebug("Beginning auto update...");
328  await eventConsumer.HandleEvent(EventType.InstanceAutoUpdateStart, new List<string>(), cancellationToken).ConfigureAwait(false);
329  try
330  {
331  Models.User user = null;
332  await databaseContextFactory.UseContext(async (db) => user = await db.Users.Where(x => x.CanonicalName == Api.Models.User.AdminName.ToUpperInvariant()).FirstAsync(cancellationToken).ConfigureAwait(false)).ConfigureAwait(false);
333  var repositoryUpdateJob = new Job
334  {
335  Instance = new Models.Instance
336  {
337  Id = metadata.Id
338  },
339  Description = "Scheduled repository update",
340  CancelRightsType = RightsType.Repository,
341  CancelRight = (ulong)RepositoryRights.CancelPendingChanges,
342  StartedBy = user
343  };
344 
345  string deploySha = null;
346  await jobManager.RegisterOperation(repositoryUpdateJob, async (paramJob, databaseContext, progressReporter, jobCancellationToken) =>
347  {
348  var repositorySettingsTask = databaseContext.RepositorySettings.Where(x => x.InstanceId == metadata.Id).FirstAsync(jobCancellationToken);
349 
350  // assume 5 steps with synchronize
351  const int ProgressSections = 7;
352  const int ProgressStep = 100 / ProgressSections;
353 
354  const int NumSteps = 3;
355  var doneSteps = 0;
356 
357  Action<int> NextProgressReporter()
358  {
359  var tmpDoneSteps = doneSteps;
360  ++doneSteps;
361  return progress => progressReporter((progress + (100 * tmpDoneSteps)) / NumSteps);
362  }
363 
364  using (var repo = await RepositoryManager.LoadRepository(jobCancellationToken).ConfigureAwait(false))
365  {
366  if (repo == null)
367  {
368  logger.LogTrace("Aborting repo update, no repository!");
369  return;
370  }
371 
372  var startSha = repo.Head;
373  if (!repo.Tracking)
374  {
375  logger.LogTrace("Aborting repo update, active ref not tracking any remote branch!");
376  deploySha = startSha;
377  return;
378  }
379 
380  var repositorySettings = await repositorySettingsTask.ConfigureAwait(false);
381 
382  // the main point of auto update is to pull the remote
383  await repo.FetchOrigin(repositorySettings.AccessUser, repositorySettings.AccessToken, NextProgressReporter(), jobCancellationToken).ConfigureAwait(false);
384 
385  RevisionInformation currentRevInfo = null;
386  bool hasDbChanges = false;
387 
388  Task<RevisionInformation> LoadRevInfo() => databaseContext.RevisionInformations
389  .Where(x => x.CommitSha == startSha && x.Instance.Id == metadata.Id)
390  .Include(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge)
391  .FirstOrDefaultAsync(cancellationToken);
392 
393  async Task UpdateRevInfo(string currentHead, bool onOrigin)
394  {
395  if(currentRevInfo == null)
396  currentRevInfo = await LoadRevInfo().ConfigureAwait(false);
397 
398  if (currentRevInfo == default)
399  {
400  logger.LogWarning(Repository.Repository.OriginTrackingErrorTemplate, currentHead);
401  onOrigin = true;
402  }
403 
404  var attachedInstance = new Models.Instance
405  {
406  Id = metadata.Id
407  };
408  var oldRevInfo = currentRevInfo;
409  currentRevInfo = new RevisionInformation
410  {
411  CommitSha = currentHead,
412  OriginCommitSha = onOrigin ? currentHead : oldRevInfo.OriginCommitSha,
413  Instance = attachedInstance
414  };
415  if (!onOrigin)
416  currentRevInfo.ActiveTestMerges = new List<RevInfoTestMerge>(oldRevInfo.ActiveTestMerges);
417 
418  databaseContext.Instances.Attach(attachedInstance);
419  databaseContext.RevisionInformations.Add(currentRevInfo);
420  hasDbChanges = true;
421  }
422 
423  // take appropriate auto update actions
424  bool shouldSyncTracked;
425  if (repositorySettings.AutoUpdatesKeepTestMerges.Value)
426  {
427  logger.LogTrace("Preserving test merges...");
428 
429  var currentRevInfoTask = LoadRevInfo();
430 
431  var result = await repo.MergeOrigin(repositorySettings.CommitterName, repositorySettings.CommitterEmail, NextProgressReporter(), jobCancellationToken).ConfigureAwait(false);
432 
433  if (!result.HasValue)
434  throw new JobException("Merge conflict while preserving test merges!");
435 
436  currentRevInfo = await currentRevInfoTask.ConfigureAwait(false);
437 
438  var lastRevInfoWasOriginCommit = currentRevInfo == default || currentRevInfo.CommitSha == currentRevInfo.OriginCommitSha;
439  var stillOnOrigin = result.Value && lastRevInfoWasOriginCommit;
440 
441  var currentHead = repo.Head;
442  if (currentHead != startSha)
443  {
444  await UpdateRevInfo(currentHead, stillOnOrigin).ConfigureAwait(false);
445  shouldSyncTracked = stillOnOrigin;
446  }
447  else
448  shouldSyncTracked = false;
449  }
450  else
451  {
452  logger.LogTrace("Not preserving test merges...");
453  await repo.ResetToOrigin(NextProgressReporter(), jobCancellationToken).ConfigureAwait(false);
454 
455  var currentHead = repo.Head;
456 
457  currentRevInfo = await databaseContext.RevisionInformations
458  .Where(x => x.CommitSha == currentHead && x.Instance.Id == metadata.Id)
459  .FirstOrDefaultAsync(jobCancellationToken).ConfigureAwait(false);
460 
461  if (currentHead != startSha && currentRevInfo != default)
462  await UpdateRevInfo(currentHead, true).ConfigureAwait(false);
463 
464  shouldSyncTracked = true;
465  }
466 
467  // synch if necessary
468  if (repositorySettings.AutoUpdatesSynchronize.Value && startSha != repo.Head)
469  {
470  var pushedOrigin = await repo.Sychronize(repositorySettings.AccessUser, repositorySettings.AccessToken, repositorySettings.CommitterName, repositorySettings.CommitterEmail, NextProgressReporter(), shouldSyncTracked, jobCancellationToken).ConfigureAwait(false);
471  var currentHead = repo.Head;
472  if (currentHead != currentRevInfo.CommitSha)
473  await UpdateRevInfo(currentHead, pushedOrigin).ConfigureAwait(false);
474  }
475 
476  if(hasDbChanges)
477  try
478  {
479  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
480  }
481  catch
482  {
483  await repo.ResetToSha(startSha, progressReporter, default).ConfigureAwait(false);
484  throw;
485  }
486 
487  progressReporter(5 * ProgressStep);
488  deploySha = repo.Head;
489  }
490  }, cancellationToken).ConfigureAwait(false);
491 
492  await jobManager.WaitForJobCompletion(repositoryUpdateJob, user, cancellationToken, default).ConfigureAwait(false);
493 
494  if (deploySha == null)
495  {
496  logger.LogTrace("Aborting auto update, repository error!");
497  continue;
498  }
499 
501  {
502  logger.LogTrace("Aborting auto update, same revision as latest CompileJob");
503  continue;
504  }
505 
506  // finally set up the job
507  var compileProcessJob = new Job
508  {
509  StartedBy = user,
510  Instance = repositoryUpdateJob.Instance,
511  Description = "Scheduled code deployment",
512  CancelRightsType = RightsType.DreamMaker,
513  CancelRight = (ulong)DreamMakerRights.CancelCompile
514  };
515 
516  await jobManager.RegisterOperation(compileProcessJob, CompileProcess, cancellationToken).ConfigureAwait(false);
517 
518  await jobManager.WaitForJobCompletion(compileProcessJob, user, cancellationToken, default).ConfigureAwait(false);
519  }
520  catch (OperationCanceledException)
521  {
522  logger.LogDebug("Cancelled auto update job!");
523  throw;
524  }
525  catch (Exception e)
526  {
527  logger.LogWarning("Error in auto update loop! Exception: {0}", e);
528  continue;
529  }
530  }
531  catch (OperationCanceledException)
532  {
533  break;
534  }
535 
536  logger.LogTrace("Leaving auto update loop...");
537  }
538  #pragma warning restore CA1502
539 
541  public void Rename(string newName)
542  {
543  if (String.IsNullOrWhiteSpace(newName))
544  throw new ArgumentNullException(nameof(newName));
545  metadata.Name = newName;
546  }
547 
549  public async Task StartAsync(CancellationToken cancellationToken)
550  {
551  await Task.WhenAll(SetAutoUpdateInterval(metadata.AutoUpdateInterval.Value), Configuration.StartAsync(cancellationToken), ByondManager.StartAsync(cancellationToken), Chat.StartAsync(cancellationToken), compileJobConsumer.StartAsync(cancellationToken)).ConfigureAwait(false);
552 
553  // dependent on so many things, its just safer this way
554  await Watchdog.StartAsync(cancellationToken).ConfigureAwait(false);
555 
556  CompileJob latestCompileJob = null;
557  await databaseContextFactory.UseContext(async db =>
558  {
559  latestCompileJob = await db.CompileJobs.Where(x => x.Job.Instance.Id == metadata.Id).OrderByDescending(x => x.Job.StoppedAt).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
560  }).ConfigureAwait(false);
561  await dmbFactory.CleanUnusedCompileJobs(latestCompileJob, cancellationToken).ConfigureAwait(false);
562  }
563 
565  public Task StopAsync(CancellationToken cancellationToken) => Task.WhenAll(SetAutoUpdateInterval(0), Configuration.StopAsync(cancellationToken), ByondManager.StopAsync(cancellationToken), Watchdog.StopAsync(cancellationToken), Chat.StopAsync(cancellationToken), compileJobConsumer.StopAsync(cancellationToken));
566 
568  public async Task SetAutoUpdateInterval(uint newInterval)
569  {
570  Task toWait;
571  lock (this)
572  {
573  if (timerTask != null)
574  {
575  timerCts.Cancel();
576  toWait = timerTask;
577  }
578  else
579  toWait = Task.CompletedTask;
580  }
581 
582  await toWait.ConfigureAwait(false);
583  if (newInterval == 0)
584  return;
585  lock (this)
586  {
587  // race condition, just quit
588  if (timerTask != null)
589  return;
590  timerCts?.Dispose();
591  timerCts = new CancellationTokenSource();
592  timerTask = TimerLoop(newInterval, timerCts.Token);
593  }
594  }
595 
598  {
600  return null;
601  return dmbFactory.LockNextDmb(0)?.CompileJob;
602  }
603  }
604 }
+
string Name
The name of the User
Definition: User.cs:38
+ +
Manages the runtime of Jobs
Definition: IJobManager.cs:12
+
DbSet< Instance > Instances
The Instances in the IDatabaseContext
+
async Task CompileProcess(Job job, IDatabaseContext databaseContext, Action< int > progressReporter, CancellationToken cancellationToken)
Run the compile job and insert it into the database. Meant to be called by a Core....
Definition: Instance.cs:142
+ + +
async Task SetAutoUpdateInterval(uint newInterval)
Change the Api.Models.Instance.AutoUpdateInterval for the IInstance
Definition: Instance.cs:568
+
Task LoadCompileJob(CompileJob job, CancellationToken cancellationToken)
Load a new job into the ICompileJobConsumer
+ +
CompileJob CompileJob
The CompileJob of the .dmb
Definition: IDmbProvider.cs:29
+ +
CompileJob LatestCompileJob()
The latest staged CompileJob
Definition: Instance.cs:597
+ + + +
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
User MergedBy
See Api.Models.TestMerge.MergedBy
Definition: TestMerge.cs:13
+
Consumes EventTypes and takes the appropriate actions
+ + +
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
+ +
void Rename(string newName)
Rename the IInstance
Definition: Instance.cs:541
+
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+ +
async Task StartAsync(CancellationToken cancellationToken)
+
readonly ICompileJobConsumer compileJobConsumer
The ICompileJobConsumer for the Instance
Definition: Instance.cs:48
+
Task StopAsync(CancellationToken cancellationToken)
+
For managing connected chat services
Definition: IChat.cs:13
+
Repository(LibGit2Sharp.IRepository repository, IIOManager ioMananger, IEventConsumer eventConsumer, ICredentialsProvider credentialsProvider, ILogger< Repository > logger, Action onDispose)
Construct a Repository
Definition: Repository.cs:103
+
Job Job
See Api.Models.CompileJob.Job
Definition: CompileJob.cs:13
+
Task RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
Registers a given Job and begins running it
+ + + + +
readonly IGitHubClientFactory gitHubClientFactory
The IGitHubClientFactory for the Instance
Definition: Instance.cs:73
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the Instance
Definition: Instance.cs:68
+
Task timerTask
The auto update Task
Definition: Instance.cs:88
+ +
Task CleanUnusedCompileJobs(CompileJob exceptThisOne, CancellationToken cancellationToken)
Deletes all compile jobs that are inactive in the Game folder exceptThisOne
+ +
readonly Api.Models.Instance metadata
The Api.Models.Instance for the Instance
Definition: Instance.cs:83
+
DateTimeOffset? StoppedAt
When the Job stopped
Definition: Job.cs:37
+
Instance(Api.Models.Instance metadata, IRepositoryManager repositoryManager, IByondManager byondManager, IDreamMaker dreamMaker, IWatchdog watchdog, IChat chat, StaticFiles.IConfiguration configuration, ICompileJobConsumer compileJobConsumer, IDatabaseContextFactory databaseContextFactory, IDmbFactory dmbFactory, IJobManager jobManager, IEventConsumer eventConsumer, IGitHubClientFactory gitHubClientFactory, ILogger< Instance > logger)
Construct an Instance
Definition: Instance.cs:112
+
IDmbProvider LockNextDmb(int lockCount)
Gets the next IDmbProvider
+
Func< CancellationToken, Task > PostComplete
A Task to run after the job completes. This will not affect the Api.Models.Internal....
Definition: Job.cs:34
+
CancellationTokenSource timerCts
CancellationTokenSource for timerTask
Definition: Instance.cs:93
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the Instance
Definition: Instance.cs:53
+
DbSet< RepositorySettings > RepositorySettings
The Models.RepositorySettings in the IDatabaseContext
+ +
For interacting with the instance services
Definition: IInstance.cs:17
+
DreamMakerRights
Rights for Models.DreamMaker
+
bool DmbAvailable
If LockNextDmb will succeed
Definition: IDmbFactory.cs:22
+
readonly ILogger< Instance > logger
The ILogger for the Instance
Definition: Instance.cs:78
+ +
StaticFiles.IConfiguration Configuration
Definition: Instance.cs:38
+
async Task StopAsync(CancellationToken cancellationToken)
Definition: Chat.cs:546
+
RepositoryRights
Rights for a Models.Repository
+
readonly IDreamMaker dreamMaker
The IDreamMaker for the Instance
Definition: Instance.cs:43
+
async Task TimerLoop(uint minutes, CancellationToken cancellationToken)
Pull the repository and compile for every set of given minutes
Definition: Instance.cs:321
+
IGitHubClient CreateClient()
Create a client with anonymous authentication. Low rate limit
+
DbSet< CompileJob > CompileJobs
The CompileJobs in the IDatabaseContext
+
Task< Models.CompileJob > Compile(Models.RevisionInformation revisionInformation, Api.Models.DreamMaker dreamMakerSettings, uint apiValidateTimeout, IRepository repository, Action< int > progressReporter, TimeSpan? estimatedDuration, CancellationToken cancellationToken)
Starts a compile
+
DbSet< DreamMakerSettings > DreamMakerSettings
The Models.DreamMakerSettings in the IDatabaseContext
+ +
Instance Instance
The Models.Instance the RevisionInformation belongs to
+ +
DbSet< RevisionInformation > RevisionInformations
The RevisionInformations in the IDatabaseContext
+ + + +
async Task StartAsync(CancellationToken cancellationToken)
Definition: Chat.cs:534
+ + +
readonly IDmbFactory dmbFactory
The IDmbFactory for the Instance
Definition: Instance.cs:58
+
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+ + +
readonly IJobManager jobManager
The IJobManager for the Instance
Definition: Instance.cs:63
+
Task WaitForJobCompletion(Job job, User canceller, CancellationToken jobCancellationToken, CancellationToken cancellationToken)
Wait for a given job to complete
+
RevisionInformation RevisionInformation
See Api.Models.CompileJob.RevisionInformation
Definition: CompileJob.cs:24
+
DbSet< DreamDaemonSettings > DreamDaemonSettings
The Models.DreamDaemonSettings in the IDatabaseContext
+
async Task< IRepository > LoadRepository(CancellationToken cancellationToken)
Attempt to load the IRepository from the default location
+
async Task StartAsync(CancellationToken cancellationToken)
Definition: Instance.cs:549
+
Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+
Task StopAsync(CancellationToken cancellationToken)
+
string AccessToken
The token/password to access the git repository with
+ +
string PullRequestRevision
The sha of the pull request revision to merge. If not specified, the latest commit shall be used (sem...
+
List< RevInfoTestMerge > ActiveTestMerges
See Api.Models.RevisionInformation.ActiveTestMerges
+
string Comment
Optional comment about the test
+ +
string OriginCommitSha
The sha of the most recent remote commit
+ +
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+ + + +
Runs and monitors the twin server controllers
Definition: IWatchdog.cs:12
+ +
+ + + + diff --git a/_tgstation_8_server_8_host_2_components_2_interop_2_test_merge_8cs.html b/_tgstation_8_server_8_host_2_components_2_interop_2_test_merge_8cs.html new file mode 100644 index 0000000000..80a3a64858 --- /dev/null +++ b/_tgstation_8_server_8_host_2_components_2_interop_2_test_merge_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/TestMerge.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestMerge.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Interop.TestMerge
 This model mirrors /datum/tgs_revision_information/test_merge More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Interop
 
+
+ + + + diff --git a/_tgstation_8_server_8_host_2_components_2_interop_2_test_merge_8cs_source.html b/_tgstation_8_server_8_host_2_components_2_interop_2_test_merge_8cs_source.html new file mode 100644 index 0000000000..73a7b2812f --- /dev/null +++ b/_tgstation_8_server_8_host_2_components_2_interop_2_test_merge_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop/TestMerge.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestMerge.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Globalization;
4 
6 {
10  sealed class TestMerge : TestMergeBase
11  {
15  public string TimeMerged { get; set; }
16 
20  public RevisionInformation Revision { get; set; }
21 
27  public TestMerge(Models.TestMerge testMerge, RevisionInformation revision) : base(testMerge)
28  {
29  TimeMerged = testMerge.MergedAt.Ticks.ToString(CultureInfo.InvariantCulture);
30  Revision = revision ?? throw new ArgumentNullException(nameof(revision));
31  }
32  }
33 }
string TimeMerged
The unix time of when the test merge was applied
Definition: TestMerge.cs:15
+ +
Layer of test merge data required internally
Definition: TestMergeBase.cs:9
+ + +
This model mirrors /datum/tgs_revision_information/test_merge
Definition: TestMerge.cs:10
+
RevisionInformation Revision
The RevisionInformation of the TestMerge
Definition: TestMerge.cs:20
+ +
TestMerge(Models.TestMerge testMerge, RevisionInformation revision)
Construct a TestMerge
Definition: TestMerge.cs:27
+ +
Represents information about a current git revison
+ +
+ + + + 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 new file mode 100644 index 0000000000..211e6f055c --- /dev/null +++ b/_tgstation_8_server_8_host_2_components_2_repository_2_repository_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Repository/Repository.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Repository.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Components.Repository.Repository
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Repository
 
+
+ + + + 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 new file mode 100644 index 0000000000..979139b694 --- /dev/null +++ b/_tgstation_8_server_8_host_2_components_2_repository_2_repository_8cs_source.html @@ -0,0 +1,136 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Repository/Repository.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Repository.cs
+
+
+Go to the documentation of this file.
1 using LibGit2Sharp;
2 using LibGit2Sharp.Handlers;
3 using Microsoft.Extensions.Logging;
4 using System;
5 using System.Collections.Generic;
6 using System.Globalization;
7 using System.Linq;
8 using System.Threading;
9 using System.Threading.Tasks;
12 using Tgstation.Server.Host.IO;
13 
15 {
17  sealed class Repository : IRepository
18  {
22  public const string GitHubUrl = "://github.com/";
23 
27  public const string OriginTrackingErrorTemplate = "Unable to determine most recent origin commit of {0}. Marking it as an origin commit. This may result in invalid git metadata until the next hard reset to an origin reference.";
28 
32  public const string RemoteTemporaryBranchName = "___TGSTempBranch";
33 
34  const string UnknownReference = "<UNKNOWN>";
35 
37  public bool IsGitHubRepository { get; }
38 
40  public string GitHubOwner { get; }
41 
43  public string GitHubRepoName { get; }
44 
46  public bool Tracking => Reference != null && repository.Head.IsTracking;
47 
49  public string Head => repository.Head.Tip.Sha;
50 
52  public string Reference => repository.Head.FriendlyName;
53 
55  public string Origin => repository.Network.Remotes.First().Url;
56 
60  readonly LibGit2Sharp.IRepository repository;
61 
66 
71 
76 
80  readonly ILogger<Repository> logger;
81 
85  readonly Action onDispose;
86 
92  static CheckoutProgressHandler CheckoutProgressHandler(Action<int> progressReporter) => (a, completedSteps, totalSteps) => progressReporter((int)(((float)completedSteps) / totalSteps * 100));
93 
104  {
105  this.repository = repository ?? throw new ArgumentNullException(nameof(repository));
106  this.ioMananger = ioMananger ?? throw new ArgumentNullException(nameof(ioMananger));
107  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
108  this.credentialsProvider = credentialsProvider ?? throw new ArgumentNullException(nameof(credentialsProvider));
109  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
110  this.onDispose = onDispose ?? throw new ArgumentNullException(nameof(onDispose));
111  IsGitHubRepository = Origin.Contains(GitHubUrl, StringComparison.InvariantCultureIgnoreCase);
112  if (IsGitHubRepository)
113  {
114  GetRepositoryOwnerName(Origin, out var owner, out var name);
115  GitHubOwner = owner;
116  GitHubRepoName = name;
117  }
118  }
119 
121  public void Dispose()
122  {
123  logger.LogTrace("Disposing...");
124  repository.Dispose();
125  onDispose.Invoke();
126  }
127 
128  void GetRepositoryOwnerName(string remote, out string owner, out string name)
129  {
130  // Assume standard gh format: [(git)|(https)]://github.com/owner/repo(.git)[0-1]
131  // Yes use .git twice in case it was weird
132  var toRemove = new string[] { ".git", "/", ".git" };
133  foreach (string item in toRemove)
134  if (remote.EndsWith(item, StringComparison.OrdinalIgnoreCase))
135  remote = remote.Substring(0, remote.LastIndexOf(item, StringComparison.OrdinalIgnoreCase));
136  var splits = remote.Split('/');
137  name = splits[splits.Length - 1];
138  owner = splits[splits.Length - 2].Split('.')[0];
139 
140  logger.LogTrace("GetRepositoryOwnerName({0}) => {1} / {2}", remote, owner, name);
141  }
142 
151  PushOptions GeneratePushOptions(Action<int> progressReporter, string username, string password, CancellationToken cancellationToken) => new PushOptions
152  {
153  OnPackBuilderProgress = (stage, current, total) =>
154  {
155  var baseProgress = stage == PackBuilderStage.Counting ? 0 : 25;
156  progressReporter(baseProgress + ((int)(25 * ((float)current) / total)));
157  return !cancellationToken.IsCancellationRequested;
158  },
159  OnNegotiationCompletedBeforePush = (a) => !cancellationToken.IsCancellationRequested,
160  OnPushTransferProgress = (a, sentBytes, totalBytes) =>
161  {
162  progressReporter(50 + ((int)(50 * ((float)sentBytes) / totalBytes)));
163  return !cancellationToken.IsCancellationRequested;
164  },
165  CredentialsProvider = credentialsProvider.GenerateHandler(username, password)
166  };
167 
174  void RawCheckout(string committish, Action<int> progressReporter, CancellationToken cancellationToken)
175  {
176  logger.LogTrace("Checkout: {0}", committish);
177 
178  progressReporter(0);
179  cancellationToken.ThrowIfCancellationRequested();
180 
181  Commands.Checkout(repository, committish, new CheckoutOptions
182  {
183  CheckoutModifiers = CheckoutModifiers.Force,
184  OnCheckoutProgress = CheckoutProgressHandler(progressReporter)
185  });
186 
187  cancellationToken.ThrowIfCancellationRequested();
188 
189  repository.RemoveUntrackedFiles();
190  }
191 
193  #pragma warning disable CA1506 // TODO: Decomplexify
194  public async Task<bool?> AddTestMerge(TestMergeParameters testMergeParameters, string committerName, string committerEmail, string username, string password, Action<int> progressReporter, CancellationToken cancellationToken)
195  {
196  if (testMergeParameters == null)
197  throw new ArgumentNullException(nameof(testMergeParameters));
198  if (committerName == null)
199  throw new ArgumentNullException(nameof(committerName));
200  if (committerEmail == null)
201  throw new ArgumentNullException(nameof(committerEmail));
202  if (progressReporter == null)
203  throw new ArgumentNullException(nameof(progressReporter));
204 
205  logger.LogDebug("Begin AddTestMerge: #{0} at {1} ({4}) by <{2} ({3})>", testMergeParameters.Number, testMergeParameters.PullRequestRevision?.Substring(0, 7), committerName, committerEmail, testMergeParameters.Comment);
206 
207  if (!IsGitHubRepository)
208  throw new InvalidOperationException("Test merging is only available on GitHub hosted origin repositories!");
209 
210  var commitMessage = String.Format(CultureInfo.InvariantCulture, "Test merge of pull request #{0}{1}{2}", testMergeParameters.Number.Value, testMergeParameters.Comment != null ? Environment.NewLine : String.Empty, testMergeParameters.Comment ?? String.Empty);
211 
212  var prBranchName = String.Format(CultureInfo.InvariantCulture, "pr-{0}", testMergeParameters.Number);
213  var localBranchName = String.Format(CultureInfo.InvariantCulture, "pull/{0}/headrefs/heads/{1}", testMergeParameters.Number, prBranchName);
214 
215  var refSpec = String.Format(CultureInfo.InvariantCulture, "pull/{0}/head:{1}", testMergeParameters.Number, prBranchName);
216  var refSpecList = new List<string> { refSpec };
217  var logMessage = String.Format(CultureInfo.InvariantCulture, "Merge remote pull request #{0}", testMergeParameters.Number);
218 
219  var originalCommit = repository.Head;
220 
221  MergeResult result = null;
222 
223  var sig = new Signature(new Identity(committerName, committerEmail), DateTimeOffset.Now);
224  await Task.Factory.StartNew(() =>
225  {
226  try
227  {
228  try
229  {
230  logger.LogTrace("Fetching refspec {0}...", refSpec);
231 
232  var remote = repository.Network.Remotes.First();
233  progressReporter(0);
234  Commands.Fetch((LibGit2Sharp.Repository)repository, remote.Name, refSpecList, new FetchOptions
235  {
236  Prune = true,
237  OnProgress = (a) => !cancellationToken.IsCancellationRequested,
238  OnTransferProgress = (a) =>
239  {
240  var percentage = 50 * (((float)a.IndexedObjects + a.ReceivedObjects) / (a.TotalObjects * 2));
241  progressReporter((int)percentage);
242  return !cancellationToken.IsCancellationRequested;
243  },
244  OnUpdateTips = (a, b, c) => !cancellationToken.IsCancellationRequested,
246  }, logMessage);
247  }
248  catch (UserCancelledException) { }
249 
250  cancellationToken.ThrowIfCancellationRequested();
251 
252  repository.RemoveUntrackedFiles();
253 
254  cancellationToken.ThrowIfCancellationRequested();
255 
256  testMergeParameters.PullRequestRevision = repository.Lookup(testMergeParameters.PullRequestRevision ?? localBranchName).Sha;
257 
258  cancellationToken.ThrowIfCancellationRequested();
259 
260  logger.LogTrace("Merging {0} into {1}...", testMergeParameters.PullRequestRevision.Substring(0, 7), Reference);
261 
262  result = repository.Merge(testMergeParameters.PullRequestRevision, sig, new MergeOptions
263  {
264  CommitOnSuccess = commitMessage == null,
265  FailOnConflict = true,
266  FastForwardStrategy = FastForwardStrategy.NoFastForward,
267  SkipReuc = true,
268  OnCheckoutProgress = (a, completedSteps, totalSteps) => progressReporter(50 + ((int)(((float)completedSteps) / totalSteps * 50)))
269  });
270  }
271  finally
272  {
273  repository.Branches.Remove(localBranchName);
274  }
275 
276  cancellationToken.ThrowIfCancellationRequested();
277 
278  if (result.Status == MergeStatus.Conflicts)
279  {
280  var revertTo = originalCommit.CanonicalName ?? originalCommit.Tip.Sha;
281  logger.LogDebug("Merge conflict, aborting and reverting to {0}", revertTo);
282  RawCheckout(revertTo, progressReporter, cancellationToken);
283  cancellationToken.ThrowIfCancellationRequested();
284  }
285 
286  repository.RemoveUntrackedFiles();
287  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
288 
289  if (result.Status == MergeStatus.Conflicts)
290  {
291  await eventConsumer.HandleEvent(EventType.RepoMergeConflict, new List<string> { originalCommit.Tip.Sha, testMergeParameters.PullRequestRevision, originalCommit.FriendlyName ?? UnknownReference, prBranchName }, cancellationToken).ConfigureAwait(false);
292  return null;
293  }
294 
295  if (commitMessage != null && result.Status != MergeStatus.UpToDate)
296  {
297  logger.LogTrace("Committing merge: \"{0}\"...", commitMessage);
298  await Task.Factory.StartNew(() => repository.Commit(commitMessage, sig, sig, new CommitOptions
299  {
300  PrettifyMessage = true
301  }), cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
302  }
303 
304  await eventConsumer.HandleEvent(EventType.RepoMergePullRequest, new List<string> { testMergeParameters.Number.ToString(), testMergeParameters.PullRequestRevision, testMergeParameters.Comment }, cancellationToken).ConfigureAwait(false);
305 
306  return result.Status != MergeStatus.NonFastForward;
307  }
308  #pragma warning restore CA1506
309 
311  public async Task CheckoutObject(string committish, Action<int> progressReporter, CancellationToken cancellationToken)
312  {
313  if (committish == null)
314  throw new ArgumentNullException(nameof(committish));
315  if (progressReporter == null)
316  throw new ArgumentNullException(nameof(progressReporter));
317  logger.LogDebug("Checkout object: {0}...", committish);
318  await eventConsumer.HandleEvent(EventType.RepoCheckout, new List<string> { committish }, cancellationToken).ConfigureAwait(false);
319  await Task.Factory.StartNew(() =>
320  {
321  repository.RemoveUntrackedFiles();
322  RawCheckout(committish, progressReporter, cancellationToken);
323  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
324  }
325 
327  public async Task FetchOrigin(string username, string password, Action<int> progressReporter, CancellationToken cancellationToken)
328  {
329  if (progressReporter == null)
330  throw new ArgumentNullException(nameof(progressReporter));
331  logger.LogDebug("Fetch origin...");
332  await eventConsumer.HandleEvent(EventType.RepoFetch, Array.Empty<string>(), cancellationToken).ConfigureAwait(false);
333  await Task.Factory.StartNew(() =>
334  {
335  var remote = repository.Network.Remotes.First();
336  try
337  {
338  Commands.Fetch((LibGit2Sharp.Repository)repository, remote.Name, remote.FetchRefSpecs.Select(x => x.Specification), new FetchOptions
339  {
340  Prune = true,
341  OnProgress = (a) => !cancellationToken.IsCancellationRequested,
342  OnTransferProgress = (a) =>
343  {
344  var percentage = 100 * (((float)a.IndexedObjects + a.ReceivedObjects) / (a.TotalObjects * 2));
345  progressReporter((int)percentage);
346  return !cancellationToken.IsCancellationRequested;
347  },
348  OnUpdateTips = (a, b, c) => !cancellationToken.IsCancellationRequested,
349  CredentialsProvider = credentialsProvider.GenerateHandler(username, password)
350  }, "Fetch origin commits");
351  }
352  catch (UserCancelledException)
353  {
354  cancellationToken.ThrowIfCancellationRequested();
355  }
356  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
357  }
358 
367  Task PushHeadToTemporaryBranch(string username, string password, Action<int> progressReporter, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
368  {
369  logger.LogInformation("Pushing changes to temporary remote branch...");
370  var branch = repository.CreateBranch(RemoteTemporaryBranchName);
371  try
372  {
373  cancellationToken.ThrowIfCancellationRequested();
374  var remote = repository.Network.Remotes.First();
375  try
376  {
377  var forcePushString = String.Format(CultureInfo.InvariantCulture, "+{0}:{0}", branch.CanonicalName);
378  repository.Network.Push(remote, forcePushString, GeneratePushOptions(progress => progressReporter((int)(0.9f * progress)), username, password, cancellationToken));
379  var removalString = String.Format(CultureInfo.InvariantCulture, ":{0}", branch.CanonicalName);
380  repository.Network.Push(remote, removalString, GeneratePushOptions(progress => progressReporter(90 + (int)(0.1f * progress)), username, password, cancellationToken));
381  }
382  catch (UserCancelledException)
383  {
384  cancellationToken.ThrowIfCancellationRequested();
385  }
386  catch(LibGit2SharpException e)
387  {
388  logger.LogWarning("Unable to push to temporary branch! Exception: {0}", e);
389  }
390  }
391  finally
392  {
393  repository.Branches.Remove(branch);
394  }
395  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
396 
398  public async Task ResetToOrigin(Action<int> progressReporter, CancellationToken cancellationToken)
399  {
400  if (progressReporter == null)
401  throw new ArgumentNullException(nameof(progressReporter));
402  if (!Tracking)
403  throw new JobException("Cannot reset to origin while not on a tracked reference!");
404  logger.LogTrace("Reset to origin...");
405  var trackedBranch = repository.Head.TrackedBranch;
406  await eventConsumer.HandleEvent(EventType.RepoResetOrigin, new List<string> { trackedBranch.FriendlyName, trackedBranch.Tip.Sha }, cancellationToken).ConfigureAwait(false);
407  await ResetToSha(trackedBranch.Tip.Sha, progressReporter, cancellationToken).ConfigureAwait(false);
408  }
409 
411  public Task ResetToSha(string sha, Action<int> progressReporter, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
412  {
413  if (sha == null)
414  throw new ArgumentNullException(nameof(sha));
415  if (progressReporter == null)
416  throw new ArgumentNullException(nameof(progressReporter));
417 
418  logger.LogDebug("Reset to sha: {0}", sha.Substring(0, 7));
419 
420  repository.RemoveUntrackedFiles();
421  cancellationToken.ThrowIfCancellationRequested();
422 
423  var gitObject = repository.Lookup(sha, ObjectType.Commit);
424  cancellationToken.ThrowIfCancellationRequested();
425 
426  if (gitObject == null)
427  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Cannot reset to non-existent SHA: {0}", sha));
428 
429  repository.Reset(ResetMode.Hard, gitObject.Peel<Commit>(), new CheckoutOptions
430  {
431  OnCheckoutProgress = CheckoutProgressHandler(progressReporter)
432  });
433  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
434 
436  public async Task CopyTo(string path, CancellationToken cancellationToken)
437  {
438  if (path == null)
439  throw new ArgumentNullException(nameof(path));
440  logger.LogTrace("Copying to {0}...", path);
441  await ioMananger.CopyDirectory(".", path, new List<string> { ".git" }, cancellationToken).ConfigureAwait(false);
442  }
443 
445  public async Task<bool?> MergeOrigin(string committerName, string committerEmail, Action<int> progressReporter, CancellationToken cancellationToken)
446  {
447  if (progressReporter == null)
448  throw new ArgumentNullException(nameof(progressReporter));
449 
450  MergeResult result = null;
451  Branch trackedBranch = null;
452 
453  var oldHead = repository.Head;
454  var oldTip = oldHead.Tip;
455 
456  await Task.Factory.StartNew(() =>
457  {
458  if (!Tracking)
459  throw new JobException("Cannot reset to origin while not on a tracked reference!");
460 
461  repository.RemoveUntrackedFiles();
462 
463  cancellationToken.ThrowIfCancellationRequested();
464 
465  trackedBranch = repository.Head.TrackedBranch;
466  logger.LogDebug("Merge origin/{2}: <{0} ({1})>", committerName, committerEmail, trackedBranch.FriendlyName);
467  result = repository.Merge(trackedBranch, new Signature(new Identity(committerName, committerEmail), DateTimeOffset.Now), new MergeOptions
468  {
469  CommitOnSuccess = true,
470  FailOnConflict = true,
471  FastForwardStrategy = FastForwardStrategy.Default,
472  SkipReuc = true,
473  OnCheckoutProgress = CheckoutProgressHandler(progressReporter)
474  });
475 
476  cancellationToken.ThrowIfCancellationRequested();
477 
478  if (result.Status == MergeStatus.Conflicts)
479  {
480  logger.LogDebug("Merge conflict, aborting and reverting to {0}", oldHead.FriendlyName);
481  repository.Reset(ResetMode.Hard, oldTip, new CheckoutOptions
482  {
483  OnCheckoutProgress = CheckoutProgressHandler(progressReporter)
484  });
485  cancellationToken.ThrowIfCancellationRequested();
486  }
487 
488  repository.RemoveUntrackedFiles();
489  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
490 
491  if (result.Status == MergeStatus.Conflicts)
492  {
493  await eventConsumer.HandleEvent(EventType.RepoMergeConflict, new List<string> { oldTip.Sha, trackedBranch.Tip.Sha, oldHead.FriendlyName ?? UnknownReference, trackedBranch.FriendlyName }, cancellationToken).ConfigureAwait(false);
494  return null;
495  }
496 
497  return result.Status == MergeStatus.FastForward;
498  }
499 
501  public async Task<bool> Sychronize(string username, string password, string committerName, string committerEmail, Action<int> progressReporter, bool synchronizeTrackedBranch, CancellationToken cancellationToken)
502  {
503  if (committerName == null)
504  throw new ArgumentNullException(nameof(committerName));
505  if (committerEmail == null)
506  throw new ArgumentNullException(nameof(committerEmail));
507  if (progressReporter == null)
508  throw new ArgumentNullException(nameof(progressReporter));
509 
510  if (username == null && password == null)
511  {
512  logger.LogTrace("Not synchronizing due to lack of credentials!");
513  return false;
514  }
515 
516  logger.LogTrace("Begin Synchronize...");
517 
518  if (username == null)
519  throw new ArgumentNullException(nameof(username));
520  if (password == null)
521  throw new ArgumentNullException(nameof(password));
522 
523  var startHead = Head;
524 
525  logger.LogTrace("Configuring <{0} ({1})> as author/committer", committerName, committerEmail);
526  await Task.Factory.StartNew(() =>
527  {
528  repository.Config.Set("user.name", committerName);
529  cancellationToken.ThrowIfCancellationRequested();
530  repository.Config.Set("user.email", committerEmail);
531  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
532 
533  cancellationToken.ThrowIfCancellationRequested();
534  try
535  {
536  if (!await eventConsumer.HandleEvent(EventType.RepoPreSynchronize, new List<string> { ioMananger.ResolvePath(".") }, cancellationToken).ConfigureAwait(false))
537  {
538  logger.LogDebug("Aborted synchronize due to event handler response!");
539  return false;
540  }
541  }
542  finally
543  {
544  logger.LogTrace("Resetting and cleaning untracked files...");
545  await Task.Factory.StartNew(() =>
546  {
547  repository.RemoveUntrackedFiles();
548  cancellationToken.ThrowIfCancellationRequested();
549  repository.Reset(ResetMode.Hard, repository.Head.Tip, new CheckoutOptions
550  {
551  OnCheckoutProgress = CheckoutProgressHandler(progress => progressReporter(progress / 10))
552  });
553  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
554  }
555 
556  void FinalReporter(int progress) => progressReporter((int)(((float)progress) / 100 * 90));
557 
558  if (!synchronizeTrackedBranch)
559  {
560  await PushHeadToTemporaryBranch(username, password, FinalReporter, cancellationToken).ConfigureAwait(false);
561  return false;
562  }
563 
564  var sameHead = Head == startHead;
565  if (sameHead || !Tracking)
566  {
567  logger.LogTrace("Aborted synchronize due to {0}!", sameHead ? "lack of changes" : "not being on tracked reference");
568  return false;
569  }
570 
571  logger.LogInformation("Synchronizing with origin...");
572 
573  return await Task.Factory.StartNew(() =>
574  {
575  var remote = repository.Network.Remotes.First();
576  try
577  {
578  repository.Network.Push(repository.Head, GeneratePushOptions(FinalReporter, username, password, cancellationToken));
579  return true;
580  }
581  catch (NonFastForwardException)
582  {
583  logger.LogInformation("Synchronize aborted, non-fast forward!");
584  return false;
585  }
586  catch (UserCancelledException e)
587  {
588  cancellationToken.ThrowIfCancellationRequested();
589  throw new InvalidOperationException("Caught UserCancelledException without cancellationToken triggering", e);
590  }
591  catch (LibGit2SharpException e)
592  {
593  logger.LogWarning("Unable to make synchronization push! Exception: {0}", e);
594  return false;
595  }
596  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
597  }
598 
600  public Task<bool> IsSha(string committish, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
601  {
602  // check if it's a tag
603  var gitObject = repository.Lookup(committish, ObjectType.Tag);
604  if (gitObject != null)
605  return false;
606  cancellationToken.ThrowIfCancellationRequested();
607 
608  // check if it's a branch
609  if (repository.Branches[committish] != null)
610  return false;
611  cancellationToken.ThrowIfCancellationRequested();
612 
613  // err on the side of references, if we can't look it up, assume its a reference
614  if (repository.Lookup<Commit>(committish) != null)
615  return true;
616  return false;
617  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
618  }
619 }
+
Consumes EventTypes and takes the appropriate actions
+ +
CredentialsHandler GenerateHandler(string username, string password)
Generate a CredentialsHandler from a given username and password
+
async Task CheckoutObject(string committish, Action< int > progressReporter, CancellationToken cancellationToken)
Checks out a given committish
Definition: Repository.cs:311
+
readonly IIOManager ioMananger
The IIOManager for the Repository
Definition: Repository.cs:65
+
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+
static CheckoutProgressHandler CheckoutProgressHandler(Action< int > progressReporter)
Converts a given progressReporter to a LibGit2Sharp.Handlers.CheckoutProgressHandler
+
Represents an on-disk git repository
Definition: IRepository.cs:11
+
readonly LibGit2Sharp.IRepository repository
The LibGit2Sharp.IRepository for the Repository
Definition: Repository.cs:60
+
async Task< bool?> MergeOrigin(string committerName, string committerEmail, Action< int > progressReporter, CancellationToken cancellationToken)
Requires the current HEAD to be a tracked reference. Merges the reference to what it tracks on the or...
Definition: Repository.cs:445
+
readonly ICredentialsProvider credentialsProvider
The ICredentialsProvider for the Repository
Definition: Repository.cs:75
+
const string OriginTrackingErrorTemplate
Template error message for when tracking of the most recent origin commit fails
Definition: Repository.cs:27
+
Repository(LibGit2Sharp.IRepository repository, IIOManager ioMananger, IEventConsumer eventConsumer, ICredentialsProvider credentialsProvider, ILogger< Repository > logger, Action onDispose)
Construct a Repository
Definition: Repository.cs:103
+
async Task CopyTo(string path, CancellationToken cancellationToken)
Copies the current working directory to a given path
Definition: Repository.cs:436
+ + + +
readonly IEventConsumer eventConsumer
The IEventConsumer for the Repository
Definition: Repository.cs:70
+ +
int? Number
The number of the pull request
+
readonly Action onDispose
Action to be taken when Dispose is called
Definition: Repository.cs:85
+ + +
CredentialsHandler GenerateHandler(string username, string password)
Generate a CredentialsHandler from a given username and password
+
void GetRepositoryOwnerName(string remote, out string owner, out string name)
Definition: Repository.cs:128
+ + + +
async Task< bool?> AddTestMerge(TestMergeParameters testMergeParameters, string committerName, string committerEmail, string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)
Attempt to merge a GitHub pull request into HEAD
Definition: Repository.cs:194
+
const string RemoteTemporaryBranchName
The branch name used for publishing testmerge commits
Definition: Repository.cs:32
+ + +
async Task ResetToOrigin(Action< int > progressReporter, CancellationToken cancellationToken)
Requires the current HEAD to be a tracked reference. Hard resets the reference to what it tracks on t...
Definition: Repository.cs:398
+ + +
string Head
The SHA of the IRepository HEAD
Definition: IRepository.cs:36
+
void RawCheckout(string committish, Action< int > progressReporter, CancellationToken cancellationToken)
Runs a blocking force checkout to committish
Definition: Repository.cs:174
+ +
async Task< bool > Sychronize(string username, string password, string committerName, string committerEmail, Action< int > progressReporter, bool synchronizeTrackedBranch, CancellationToken cancellationToken)
Runs the synchronize event script and attempts to push any changes made to the IRepository if on a tr...
Definition: Repository.cs:501
+
Interface for using filesystems
Definition: IIOManager.cs:11
+
const string GitHubUrl
Indication of a GitHub repository
Definition: Repository.cs:22
+
Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+ + +
async Task FetchOrigin(string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)
Fetch commits from the origin repository
Definition: Repository.cs:327
+
string PullRequestRevision
The sha of the pull request revision to merge. If not specified, the latest commit shall be used (sem...
+
string Comment
Optional comment about the test
+ +
readonly ILogger< Repository > logger
The ILogger for the Repository
Definition: Repository.cs:80
+
PushOptions GeneratePushOptions(Action< int > progressReporter, string username, string password, CancellationToken cancellationToken)
Generate a standard set of PushOptions
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+ + +
+ + + + 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 new file mode 100644 index 0000000000..6bc3f13885 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_chat_bot_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/ChatBot.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ChatBot.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Models.ChatBot
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..3e43ac5d69 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_chat_bot_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/ChatBot.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ChatBot.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 using System.ComponentModel.DataAnnotations;
3 using System.Linq;
4 
6 {
8  public sealed class ChatBot : Api.Models.Internal.ChatBot
9  {
13  public long InstanceId { get; set; }
14 
18  [Required]
19  public Instance Instance { get; set; }
20 
24  public List<ChatChannel> Channels { get; set; }
25 
30  public Api.Models.ChatBot ToApi() => new Api.Models.ChatBot
31  {
32  Channels = Channels.Select(x => x.ToApi()).ToList(),
34  Enabled = Enabled,
36  Id = Id,
37  Name = Name
38  };
39  }
40 }
+
Api.Models.ChatBot ToApi()
Convert the ChatBot to it's API form
+
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+
string ConnectionString
The information used to connect to the Provider
Definition: ChatBot.cs:36
+
bool? Enabled
If the connection is enabled
Definition: ChatBot.cs:25
+ +
long InstanceId
The Api.Models.Instance.Id
Definition: ChatBot.cs:13
+
ChatProvider? Provider
The ChatProvider used for the connection
Definition: ChatBot.cs:30
+
List< ChatChannel > Channels
See Api.Models.ChatBot.Channels
Definition: ChatBot.cs:24
+ +
string Name
The name of the connection
Definition: ChatBot.cs:20
+
+ + + + 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 new file mode 100644 index 0000000000..5b199bbb8b --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_chat_channel_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/ChatChannel.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ChatChannel.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Models.ChatChannel
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..091cc3d0e5 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_chat_channel_8cs_source.html @@ -0,0 +1,99 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/ChatChannel.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ChatChannel.cs
+
+
+Go to the documentation of this file.
2 
4 {
6  public sealed class ChatChannel : Api.Models.ChatChannel
7  {
11  public long Id { get; set; }
12 
16  public long ChatSettingsId { get; set; }
17 
21  public ChatBot ChatSettings { get; set; }
22 
27  public Api.Models.ChatChannel ToApi() => new Api.Models.ChatChannel
28  {
34  Tag = Tag
35  };
36  }
37 }
+ + + +
string IrcChannel
The IRC channel name
Definition: ChatChannel.cs:13
+
string Tag
A custom tag users can define to group channels together
Definition: ChatChannel.cs:41
+
long ChatSettingsId
The Api.Models.Internal.ChatBot.Id
Definition: ChatChannel.cs:16
+
Api.Models.ChatChannel ToApi()
Convert the ChatChannel to it's API form
+
bool? IsAdminChannel
If the ChatChannel is an admin channel
Definition: ChatChannel.cs:24
+
ulong? DiscordChannelId
The Discord channel ID
Definition: ChatChannel.cs:18
+
bool? IsUpdatesChannel
If the ChatChannel is an updates channel
Definition: ChatChannel.cs:36
+
bool? IsWatchdogChannel
If the ChatChannel is a watchdog channel
Definition: ChatChannel.cs:30
+
ChatBot ChatSettings
The Models.ChatBot
Definition: ChatChannel.cs:21
+ + + + +
+ + + + 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 new file mode 100644 index 0000000000..234f207bb6 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_compile_job_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/CompileJob.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
CompileJob.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Models.CompileJob
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..1b5d90a6f2 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_compile_job_8cs_source.html @@ -0,0 +1,96 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/CompileJob.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
CompileJob.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.ComponentModel.DataAnnotations;
3 
5 {
7  public sealed class CompileJob : Api.Models.Internal.CompileJob
8  {
12  [Required]
13  public Job Job { get; set; }
14 
18  public long JobId { get; set; }
19 
23  [Required]
25 
29  [Required]
30  public string ByondVersion { get; set; }
31 
36  public Api.Models.CompileJob ToApi() => new Api.Models.CompileJob
37  {
39  DmeName = DmeName,
40  Id = Id,
41  Job = Job.ToApi(),
42  Output = Output,
44  ByondVersion = Version.Parse(ByondVersion),
46  };
47  }
48 }
DreamDaemonSecurity? MinimumSecurityLevel
The minimum DreamDaemonSecurity required to run the CompileJob's output
Definition: CompileJob.cs:38
+ +
string DmeName
The .dme file used for compilation
Definition: CompileJob.cs:20
+ +
Guid? DirectoryName
The Game folder the results were compiled into
Definition: CompileJob.cs:32
+ +
long JobId
The Api.Models.Internal.Job.Id of Job
Definition: CompileJob.cs:18
+ + +
Api.Models.RevisionInformation ToApi()
Convert the RevisionInformation to it's API form
+
Api.Models.CompileJob ToApi()
Convert the CompileJob to it's API form
+
Api.Models.Job ToApi()
Convert the Job to it's API form
+
string ByondVersion
The Version the CompileJob was made with in string form
Definition: CompileJob.cs:30
+ +
+ + + + 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 new file mode 100644 index 0000000000..2550c0b01c --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_dream_daemon_settings_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/DreamDaemonSettings.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
DreamDaemonSettings.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Models.DreamDaemonSettings
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..6ca2011943 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_dream_daemon_settings_8cs_source.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/DreamDaemonSettings.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DreamDaemonSettings.cs
+
+
+Go to the documentation of this file.
1 using System.ComponentModel.DataAnnotations;
2 
4 {
6  public sealed class DreamDaemonSettings : Api.Models.Internal.DreamDaemonSettings
7  {
11  public long Id { get; set; }
12 
16  public int? ProcessId { get; set; }
17 
21  public string AccessToken { get; set; }
22 
26  public long InstanceId { get; set; }
27 
31  [Required]
32  public Instance Instance { get; set; }
33  }
34 }
string AccessToken
The access token used for communication with DD
+ + + +
int? ProcessId
The PID of a currently running DD instance
+
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+ +
+ + + + 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 new file mode 100644 index 0000000000..809634949c --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_instance_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Instance.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Instance.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Instance
 Represents an Api.Models.Instance in the database More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..6c1b97fd4d --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_instance_8cs_source.html @@ -0,0 +1,99 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Instance.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Instance.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 
4 {
8  public sealed class Instance : Api.Models.Instance
9  {
14 
19 
24 
29 
33  public List<InstanceUser> InstanceUsers { get; set; }
34 
38  public List<ChatBot> ChatSettings { get; set; }
39 
43  public List<RevisionInformation> RevisionInformations { get; set; }
44 
48  public List<Job> Jobs { get; set; }
49 
54  public Api.Models.Instance ToApi() => new Api.Models.Instance
55  {
58  Id = Id,
59  Name = Name,
60  Path = Path,
61  Online = Online
62  };
63  }
64 }
+
List< InstanceUser > InstanceUsers
The InstanceUsers in the Instance
Definition: Instance.cs:33
+ +
Database representation of Components.Watchdog.WatchdogReattachInformation
+ + +
string Path
The path to where the Instance is located. Can only be changed while the Instance is offline....
Definition: Instance.cs:26
+
string Name
The name of the Instance
Definition: Instance.cs:20
+
List< RevisionInformation > RevisionInformations
The RevisionInformations in the Instance
Definition: Instance.cs:43
+
List< ChatBot > ChatSettings
The ChatBots for the Instance
Definition: Instance.cs:38
+
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
ConfigurationType? ConfigurationType
If ConfigurationFile can be used on the Instance
Definition: Instance.cs:38
+
uint? AutoUpdateInterval
The time interval in minutes the repository is automatically pulled and compiles. 0 disables
Definition: Instance.cs:44
+
bool? Online
If the Instance is online
Definition: Instance.cs:32
+
Api.Models.Instance ToApi()
Convert the Instance to it's API form
+
List< Job > Jobs
The Jobs in the Instance
Definition: Instance.cs:48
+
+ + + + 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 new file mode 100644 index 0000000000..4ab59459d6 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_instance_user_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/InstanceUser.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
InstanceUser.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Models.InstanceUser
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..2e5a2ba8bd --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_instance_user_8cs_source.html @@ -0,0 +1,97 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/InstanceUser.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
InstanceUser.cs
+
+
+Go to the documentation of this file.
1 using System.ComponentModel.DataAnnotations;
2 
4 {
6  public sealed class InstanceUser : Api.Models.InstanceUser
7  {
11  public long Id { get; set; }
12 
16  public long InstanceId { get; set; }
17 
21  [Required]
22  public Instance Instance { get; set; }
23 
27  public bool AnyRights => ByondRights != Api.Rights.ByondRights.None ||
28  ChatBotRights != Api.Rights.ChatBotRights.None ||
29  ConfigurationRights != Api.Rights.ConfigurationRights.None ||
30  DreamDaemonRights != Api.Rights.DreamDaemonRights.None ||
31  DreamMakerRights != Api.Rights.DreamMakerRights.None ||
32  InstanceUserRights != Api.Rights.InstanceUserRights.None;
33 
38  public Api.Models.InstanceUser ToApi() => new Api.Models.InstanceUser
39  {
47  UserId = UserId
48  };
49  }
50 }
long? UserId
The Internal.User.Id of the User the InstanceUser belongs to
Definition: InstanceUser.cs:15
+
ByondRights? ByondRights
The Rights.ByondRights of the InstanceUser
Definition: InstanceUser.cs:27
+
RepositoryRights? RepositoryRights
The Rights.RepositoryRights of the InstanceUser
Definition: InstanceUser.cs:45
+ +
long InstanceId
The Api.Models.Instance.Id of Instance
Definition: InstanceUser.cs:16
+
ConfigurationRights? ConfigurationRights
The Rights.ConfigurationRights of the InstanceUser
Definition: InstanceUser.cs:57
+
DreamMakerRights? DreamMakerRights
The Rights.DreamMakerRights of the InstanceUser
Definition: InstanceUser.cs:39
+ +
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+ +
Api.Models.InstanceUser ToApi()
Convert the InstanceUser to it's API form
+
ChatBotRights? ChatBotRights
The Rights.ChatBotRights of the InstanceUser
Definition: InstanceUser.cs:51
+
DreamDaemonRights? DreamDaemonRights
The Rights.DreamDaemonRights of the InstanceUser
Definition: InstanceUser.cs:33
+
InstanceUserRights? InstanceUserRights
The Rights.InstanceUserRights of the InstanceUser
Definition: InstanceUser.cs:21
+
bool AnyRights
If the InstanceUser has any instance rights
Definition: InstanceUser.cs:27
+
+ + + + 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 new file mode 100644 index 0000000000..d45af29788 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_job_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Job.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Job.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Models.Job
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..9cb8797835 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_job_8cs_source.html @@ -0,0 +1,99 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Job.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Job.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.ComponentModel.DataAnnotations;
3 using System.ComponentModel.DataAnnotations.Schema;
4 using System.Threading;
5 using System.Threading.Tasks;
6 
8 {
10  public sealed class Job : Api.Models.Internal.Job
11  {
15  [Required]
16  public User StartedBy { get; set; }
17 
21  public User CancelledBy { get; set; }
22 
26  [Required]
27  public Instance Instance { get; set; }
28 
33  [NotMapped]
34  public Func<CancellationToken, Task> PostComplete { get; set; }
35 
40  public Api.Models.Job ToApi() => new Api.Models.Job
41  {
42  Id = Id,
46  CancelledBy = CancelledBy?.ToApi(false),
51  StartedBy = StartedBy.ToApi(false)
52  };
53  }
54 }
User StartedBy
See Api.Models.Job.StartedBy
Definition: Job.cs:16
+
Api.Models.User ToApi(bool recursive, bool showDetails)
See ToApi(bool)
+ +
string Description
English description of the Job
Definition: Job.cs:21
+
string ExceptionDetails
Details of any exceptions caught during the Job
Definition: Job.cs:26
+
User CancelledBy
See Api.Models.Job.CancelledBy
Definition: Job.cs:21
+
ulong? CancelRight
The Rights required to cancel the Job
Definition: Job.cs:53
+ +
DateTimeOffset? StoppedAt
When the Job stopped
Definition: Job.cs:37
+
bool? Cancelled
If the Job was cancelled
Definition: Job.cs:43
+
Func< CancellationToken, Task > PostComplete
A Task to run after the job completes. This will not affect the Api.Models.Internal....
Definition: Job.cs:34
+
DateTimeOffset? StartedAt
When the Job was started
Definition: Job.cs:32
+ +
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+ +
Api.Models.Job ToApi()
Convert the Job to it's API form
+
RightsType? CancelRightsType
The RightsType of CancelRight if it can be cancelled
Definition: Job.cs:48
+
+ + + + 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 new file mode 100644 index 0000000000..afe77cebf0 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_repository_settings_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/RepositorySettings.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RepositorySettings.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Models.RepositorySettings
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..b35f3894a7 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_repository_settings_8cs_source.html @@ -0,0 +1,101 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/RepositorySettings.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RepositorySettings.cs
+
+
+Go to the documentation of this file.
1 using System.ComponentModel.DataAnnotations;
3 
5 {
7  public sealed class RepositorySettings : Api.Models.Internal.RepositorySettings
8  {
12  public long Id { get; set; }
13 
17  public long InstanceId { get; set; }
18 
22  [Required]
23  public Instance Instance { get; set; }
24 
29  public Repository ToApi() => new Repository
30  {
31  // AccessToken = AccessToken, // never show this
40 
41  // revision information and the rest retrieved by controller
42  };
43  }
44 }
Repository ToApi()
Convert the Repository to it's API form
+ + + + +
bool? AutoUpdatesSynchronize
If synchronization should occur when auto updating
+
bool? ShowTestMergeCommitters
If test merge commits are signed with the username of the person who merged it. Note this only affect...
+
bool? AutoUpdatesKeepTestMerges
If test merge commits should be kept when auto updating. May cause merge conflicts which will block t...
+ + +
string AccessUser
The username to access the git repository with
+
Represents a git repository
Definition: Repository.cs:8
+
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+
bool? PushTestMergeCommits
If commits created from testmerges are pushed to the remote
+
bool? PostTestMergeComment
If test merging should create a comment
+ + + + +
+ + + + 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 new file mode 100644 index 0000000000..9cad7d48dc --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_revision_information_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/RevisionInformation.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
RevisionInformation.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Models.RevisionInformation
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..eb12dfff55 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_revision_information_8cs_source.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/RevisionInformation.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
RevisionInformation.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 using System.ComponentModel.DataAnnotations;
3 using System.Linq;
4 
6 {
8  public sealed class RevisionInformation : Api.Models.Internal.RevisionInformation
9  {
13  public long Id { get; set; }
14 
18  public long InstanceId { get; set; }
19 
23  [Required]
24  public Instance Instance { get; set; }
25 
29  public TestMerge PrimaryTestMerge { get; set; }
30 
34  public List<RevInfoTestMerge> ActiveTestMerges { get; set; }
35 
39  public List<CompileJob> CompileJobs { get; set; }
40 
45  public Api.Models.RevisionInformation ToApi() => new Api.Models.RevisionInformation
46  {
50  ActiveTestMerges = ActiveTestMerges.Select(x => x.TestMerge.ToApi()).ToList(),
51  CompileJobs = CompileJobs.Select(x => new Api.Models.CompileJob
52  {
53  Id = x.Id // anti recursion measure
54  }).ToList()
55  };
56  }
57 }
+ +
Api.Models.TestMerge ToApi()
Convert the TestMerge to it's API form
+ +
List< CompileJob > CompileJobs
See CompileJobs made from this RevisionInformation
+
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+ + +
Api.Models.RevisionInformation ToApi()
Convert the RevisionInformation to it's API form
+
TestMerge PrimaryTestMerge
See Api.Models.RevisionInformation.PrimaryTestMerge
+
List< RevInfoTestMerge > ActiveTestMerges
See Api.Models.RevisionInformation.ActiveTestMerges
+
string OriginCommitSha
The sha of the most recent remote commit
+ +
+ + + + 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 new file mode 100644 index 0000000000..d291a6f3d3 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_test_merge_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/TestMerge.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TestMerge.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Models.TestMerge
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..0bf347a4f6 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_test_merge_8cs_source.html @@ -0,0 +1,101 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/TestMerge.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestMerge.cs
+
+
+Go to the documentation of this file.
1 using System.Collections.Generic;
2 using System.ComponentModel.DataAnnotations;
3 
5 {
7  public sealed class TestMerge : Api.Models.Internal.TestMerge
8  {
12  [Required]
13  public User MergedBy { get; set; }
14 
18  [Required]
20 
24  public long? PrimaryRevisionInformationId { get; set; }
25 
29  public List<RevInfoTestMerge> RevisonInformations { get; set; }
30 
35  public Api.Models.TestMerge ToApi() => new Api.Models.TestMerge
36  {
37  Author = Author,
41  Comment = Comment,
42  Id = Id,
43  MergedBy = MergedBy.ToApi(false),
44  Number = Number,
46  Url = Url
47  };
48  }
49 }
User MergedBy
See Api.Models.TestMerge.MergedBy
Definition: TestMerge.cs:13
+
RevisionInformation PrimaryRevisionInformation
The initial RevisionInformation the TestMerge was merged with
Definition: TestMerge.cs:19
+
Api.Models.User ToApi(bool recursive, bool showDetails)
See ToApi(bool)
+ +
string TitleAtMerge
The title of the pull request
+
string Author
The author of the pull request
+
Api.Models.TestMerge ToApi()
Convert the TestMerge to it's API form
+ + +
int? Number
The number of the pull request
+
string BodyAtMerge
The body of the pull request
+
List< RevInfoTestMerge > RevisonInformations
All the RevInfoTestMerge for the TestMerge
Definition: TestMerge.cs:29
+
long? PrimaryRevisionInformationId
Foreign key for PrimaryRevisionInformation
Definition: TestMerge.cs:24
+
DateTimeOffset MergedAt
When the TestMerge was created
Definition: TestMerge.cs:20
+
string Url
The URL of the pull request
+
string PullRequestRevision
The sha of the pull request revision to merge. If not specified, the latest commit shall be used (sem...
+
string Comment
Optional comment about the test
+ + +
+ + + + 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 new file mode 100644 index 0000000000..da029ed5a4 --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_user_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/User.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
User.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Models.User
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + 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 new file mode 100644 index 0000000000..d7a4e7904b --- /dev/null +++ b/_tgstation_8_server_8_host_2_models_2_user_8cs_source.html @@ -0,0 +1,99 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/User.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
User.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel.DataAnnotations;
4 
6 {
8  public sealed class User : Api.Models.Internal.User
9  {
13  public string PasswordHash { get; set; }
14 
18  public User CreatedBy { get; set; }
19 
23  [Required]
24  public string CanonicalName { get; set; }
25 
29  public DateTimeOffset? LastPasswordUpdate { get; set; }
30 
34  public List<User> CreatedUsers { get; set; }
35 
39  public List<InstanceUser> InstanceUsers { get; set; }
40 
44  public List<TestMerge> TestMerges { get; set; }
45 
52  Api.Models.User ToApi(bool recursive, bool showDetails) => new Api.Models.User
53  {
54  AdministrationRights = showDetails ? AdministrationRights : null,
56  CreatedBy = recursive ? CreatedBy?.ToApi(false, false) : null,
57  Enabled = Enabled,
58  Id = Id,
59  InstanceManagerRights = showDetails ? InstanceManagerRights : null,
60  Name = Name,
61  SystemIdentifier = showDetails ? SystemIdentifier : null
62  };
63 
69  public Api.Models.User ToApi(bool showDetails) => ToApi(true, showDetails);
70  }
71 }
string Name
The name of the User
Definition: User.cs:38
+
List< InstanceUser > InstanceUsers
The InstanceUsers for the User
Definition: User.cs:39
+
string PasswordHash
The hash of the user's password
Definition: User.cs:13
+
string CanonicalName
The uppercase invariant of Api.Models.Internal.User.Name
Definition: User.cs:24
+
List< TestMerge > TestMerges
The TestMerges made by the User
Definition: User.cs:44
+
Api.Models.User ToApi(bool recursive, bool showDetails)
See ToApi(bool)
+ +
AdministrationRights? AdministrationRights
The Rights.AdministrationRights for the User
Definition: User.cs:44
+ +
User CreatedBy
See Api.Models.User
Definition: User.cs:18
+
InstanceManagerRights? InstanceManagerRights
The Rights.InstanceManagerRights for the User
Definition: User.cs:50
+
DateTimeOffset? LastPasswordUpdate
When PasswordHash was last changed
Definition: User.cs:29
+
long Id
The ID of the User
Definition: User.cs:15
+
DateTimeOffset? CreatedAt
When the User was created
Definition: User.cs:27
+
List< User > CreatedUsers
Users created by this User
Definition: User.cs:34
+
bool? Enabled
If the User is enabled since users cannot be deleted. System users cannot be disabled
Definition: User.cs:21
+
string SystemIdentifier
The SID/UID of the User on Windows/POSIX respectively
Definition: User.cs:32
+
+ + + + diff --git a/_tgstation_8_server_8_host_8_assembly_info_8cs.html b/_tgstation_8_server_8_host_8_assembly_info_8cs.html new file mode 100644 index 0000000000..15bb531ff7 --- /dev/null +++ b/_tgstation_8_server_8_host_8_assembly_info_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.AssemblyInfo.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.AssemblyInfo.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_host_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_8_assembly_info_8cs_source.html new file mode 100644 index 0000000000..76746b7072 --- /dev/null +++ b/_tgstation_8_server_8_host_8_assembly_info_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.AssemblyInfo.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.AssemblyInfo.cs
+
+
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Host")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("4.0.1.4")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("4.0.1.4")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("4.0.1.4")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+ + + + 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 new file mode 100644 index 0000000000..36a1b7c638 --- /dev/null +++ b/_tgstation_8_server_8_host_8_console_2_assembly_info_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Console/AssemblyInfo.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
AssemblyInfo.cs File Reference
+
+ + + + + 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 new file mode 100644 index 0000000000..039b183d33 --- /dev/null +++ b/_tgstation_8_server_8_host_8_console_2_assembly_info_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Console/AssemblyInfo.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
AssemblyInfo.cs
+
+
+Go to the documentation of this file.
1 using System.Runtime.CompilerServices;
2 
3 [assembly: InternalsVisibleTo("Tgstation.Server.Host.Console.Tests")]
+ + + + diff --git a/_tgstation_8_server_8_host_8_console_8_assembly_info_8cs.html b/_tgstation_8_server_8_host_8_console_8_assembly_info_8cs.html new file mode 100644 index 0000000000..aaf02964c2 --- /dev/null +++ b/_tgstation_8_server_8_host_8_console_8_assembly_info_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Console/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Console.AssemblyInfo.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Console.AssemblyInfo.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_host_8_console_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_8_console_8_assembly_info_8cs_source.html new file mode 100644 index 0000000000..0fc27c552a --- /dev/null +++ b/_tgstation_8_server_8_host_8_console_8_assembly_info_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Console/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Console.AssemblyInfo.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Console.AssemblyInfo.cs
+
+
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Host.Console")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("4.0.1.4")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("4.0.1.4")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host.Console")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host.Console")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("4.0.1.4")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+ + + + diff --git a/_tgstation_8_server_8_host_8_console_8_tests_8_assembly_info_8cs.html b/_tgstation_8_server_8_host_8_console_8_tests_8_assembly_info_8cs.html new file mode 100644 index 0000000000..073372c14a --- /dev/null +++ b/_tgstation_8_server_8_host_8_console_8_tests_8_assembly_info_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Console.Tests.AssemblyInfo.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Console.Tests.AssemblyInfo.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_host_8_console_8_tests_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_8_console_8_tests_8_assembly_info_8cs_source.html new file mode 100644 index 0000000000..e196eee792 --- /dev/null +++ b/_tgstation_8_server_8_host_8_console_8_tests_8_assembly_info_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Console.Tests.AssemblyInfo.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Console.Tests.AssemblyInfo.cs
+
+
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Host.Console.Tests")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host.Console.Tests")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host.Console.Tests")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+ + + + diff --git a/_tgstation_8_server_8_host_8_console_8_tests_8_program_8cs.html b/_tgstation_8_server_8_host_8_console_8_tests_8_program_8cs.html new file mode 100644 index 0000000000..a8586ad154 --- /dev/null +++ b/_tgstation_8_server_8_host_8_console_8_tests_8_program_8cs.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Console.Tests.Program.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Console.Tests.Program.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_host_8_console_8_tests_8_program_8cs_source.html b/_tgstation_8_server_8_host_8_console_8_tests_8_program_8cs_source.html new file mode 100644 index 0000000000..6dea9ce810 --- /dev/null +++ b/_tgstation_8_server_8_host_8_console_8_tests_8_program_8cs_source.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Console.Tests.Program.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Console.Tests.Program.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated> This file has been auto generated. </auto-generated>
2 using System;
3 [Microsoft.VisualStudio.TestPlatform.TestSDKAutoGeneratedCode]
4 class AutoGeneratedProgram {static void Main(string[] args){}}
+ +
+ + + + diff --git a/_tgstation_8_server_8_host_8_razor_assembly_info_8cs.html b/_tgstation_8_server_8_host_8_razor_assembly_info_8cs.html new file mode 100644 index 0000000000..e5342176c6 --- /dev/null +++ b/_tgstation_8_server_8_host_8_razor_assembly_info_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.RazorAssemblyInfo.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.RazorAssemblyInfo.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_host_8_razor_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_8_razor_assembly_info_8cs_source.html new file mode 100644 index 0000000000..ec9d358495 --- /dev/null +++ b/_tgstation_8_server_8_host_8_razor_assembly_info_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.RazorAssemblyInfo.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.RazorAssemblyInfo.cs
+
+
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: Microsoft.AspNetCore.Mvc.ApplicationParts.RelatedAssemblyAttribute("Tgstation.Server.Host.Views")]
15 [assembly: Microsoft.AspNetCore.Razor.Hosting.RazorLanguageVersionAttribute("2.1")]
16 [assembly: Microsoft.AspNetCore.Razor.Hosting.RazorConfigurationNameAttribute("MVC-2.1")]
17 [assembly: Microsoft.AspNetCore.Razor.Hosting.RazorExtensionAssemblyNameAttribute("MVC-2.1", "Microsoft.AspNetCore.Mvc.Razor.Extensions")]
18 
19 // Generated by the MSBuild WriteCodeFragment class.
20 
+ + + + 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 new file mode 100644 index 0000000000..4b2781684f --- /dev/null +++ b/_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Service/Properties/AssemblyInfo.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
AssemblyInfo.cs File Reference
+
+ + + + + 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 new file mode 100644 index 0000000000..6a896fd81e --- /dev/null +++ b/_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Service/Properties/AssemblyInfo.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
AssemblyInfo.cs
+
+
+Go to the documentation of this file.
1 using System.Runtime.CompilerServices;
2 
3 [assembly:InternalsVisibleTo("Tgstation.Server.Host.Service.Tests")]
+ + + + diff --git a/_tgstation_8_server_8_host_8_service_8_assembly_info_8cs.html b/_tgstation_8_server_8_host_8_service_8_assembly_info_8cs.html new file mode 100644 index 0000000000..e3c0701522 --- /dev/null +++ b/_tgstation_8_server_8_host_8_service_8_assembly_info_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Service/obj/Debug/net471/win/Tgstation.Server.Host.Service.AssemblyInfo.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Service.AssemblyInfo.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_host_8_service_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_8_service_8_assembly_info_8cs_source.html new file mode 100644 index 0000000000..4b8dbb39a3 --- /dev/null +++ b/_tgstation_8_server_8_host_8_service_8_assembly_info_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Service/obj/Debug/net471/win/Tgstation.Server.Host.Service.AssemblyInfo.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Service.AssemblyInfo.cs
+
+
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Host.Service")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("4.0.1.4")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("4.0.1.4")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host.Service")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host.Service")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("4.0.1.4")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+ + + + diff --git a/_tgstation_8_server_8_host_8_service_8_tests_8_assembly_info_8cs.html b/_tgstation_8_server_8_host_8_service_8_tests_8_assembly_info_8cs.html new file mode 100644 index 0000000000..2f1a8a9f62 --- /dev/null +++ b/_tgstation_8_server_8_host_8_service_8_tests_8_assembly_info_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Service.Tests/obj/Debug/net471/Tgstation.Server.Host.Service.Tests.AssemblyInfo.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Service.Tests.AssemblyInfo.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_host_8_service_8_tests_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_8_service_8_tests_8_assembly_info_8cs_source.html new file mode 100644 index 0000000000..68c6bad30a --- /dev/null +++ b/_tgstation_8_server_8_host_8_service_8_tests_8_assembly_info_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Service.Tests/obj/Debug/net471/Tgstation.Server.Host.Service.Tests.AssemblyInfo.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Service.Tests.AssemblyInfo.cs
+
+
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Host.Service.Tests")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host.Service.Tests")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host.Service.Tests")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+ + + + diff --git a/_tgstation_8_server_8_host_8_tests_8_assembly_info_8cs.html b/_tgstation_8_server_8_host_8_tests_8_assembly_info_8cs.html new file mode 100644 index 0000000000..f17b747e5d --- /dev/null +++ b/_tgstation_8_server_8_host_8_tests_8_assembly_info_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Tests.AssemblyInfo.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Tests.AssemblyInfo.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_host_8_tests_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_8_tests_8_assembly_info_8cs_source.html new file mode 100644 index 0000000000..022ee71c2f --- /dev/null +++ b/_tgstation_8_server_8_host_8_tests_8_assembly_info_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Tests.AssemblyInfo.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Tests.AssemblyInfo.cs
+
+
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Host.Tests")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host.Tests")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host.Tests")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+ + + + diff --git a/_tgstation_8_server_8_host_8_tests_8_program_8cs.html b/_tgstation_8_server_8_host_8_tests_8_program_8cs.html new file mode 100644 index 0000000000..f30a7e6528 --- /dev/null +++ b/_tgstation_8_server_8_host_8_tests_8_program_8cs.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Tests.Program.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Tests.Program.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_host_8_tests_8_program_8cs_source.html b/_tgstation_8_server_8_host_8_tests_8_program_8cs_source.html new file mode 100644 index 0000000000..5b598582f8 --- /dev/null +++ b/_tgstation_8_server_8_host_8_tests_8_program_8cs_source.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Tests.Program.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Tests.Program.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated> This file has been auto generated. </auto-generated>
2 using System;
3 [Microsoft.VisualStudio.TestPlatform.TestSDKAutoGeneratedCode]
4 class AutoGeneratedProgram {static void Main(string[] args){}}
+ +
+ + + + 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 new file mode 100644 index 0000000000..b641925e2e --- /dev/null +++ b/_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/AssemblyInfo.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
AssemblyInfo.cs File Reference
+
+ + + + + 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 new file mode 100644 index 0000000000..f9c2e325f3 --- /dev/null +++ b/_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/AssemblyInfo.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
AssemblyInfo.cs
+
+
+Go to the documentation of this file.
1 using System.Runtime.CompilerServices;
2 
3 [assembly: InternalsVisibleTo("Tgstation.Server.Host.Watchdog.Tests")]
4 [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
+ + + + diff --git a/_tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs.html b/_tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs.html new file mode 100644 index 0000000000..d6e42efe3d --- /dev/null +++ b/_tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/obj/Debug/netstandard2.0/Tgstation.Server.Host.Watchdog.AssemblyInfo.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Watchdog.AssemblyInfo.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs_source.html new file mode 100644 index 0000000000..6cd9d41c10 --- /dev/null +++ b/_tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/obj/Debug/netstandard2.0/Tgstation.Server.Host.Watchdog.AssemblyInfo.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Watchdog.AssemblyInfo.cs
+
+
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Host.Watchdog")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("4.0.1.4")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("4.0.1.4")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host.Watchdog")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host.Watchdog")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("4.0.1.4")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+ + + + diff --git a/_tgstation_8_server_8_host_8_watchdog_8_tests_8_assembly_info_8cs.html b/_tgstation_8_server_8_host_8_watchdog_8_tests_8_assembly_info_8cs.html new file mode 100644 index 0000000000..ddcebea7fb --- /dev/null +++ b/_tgstation_8_server_8_host_8_watchdog_8_tests_8_assembly_info_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Watchdog.Tests.AssemblyInfo.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Watchdog.Tests.AssemblyInfo.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_host_8_watchdog_8_tests_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_8_watchdog_8_tests_8_assembly_info_8cs_source.html new file mode 100644 index 0000000000..8178e6150c --- /dev/null +++ b/_tgstation_8_server_8_host_8_watchdog_8_tests_8_assembly_info_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Watchdog.Tests.AssemblyInfo.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Watchdog.Tests.AssemblyInfo.cs
+
+
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Host.Watchdog.Tests")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host.Watchdog.Tests")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host.Watchdog.Tests")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+ + + + diff --git a/_tgstation_8_server_8_host_8_watchdog_8_tests_8_program_8cs.html b/_tgstation_8_server_8_host_8_watchdog_8_tests_8_program_8cs.html new file mode 100644 index 0000000000..a462091695 --- /dev/null +++ b/_tgstation_8_server_8_host_8_watchdog_8_tests_8_program_8cs.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Watchdog.Tests.Program.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Watchdog.Tests.Program.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_host_8_watchdog_8_tests_8_program_8cs_source.html b/_tgstation_8_server_8_host_8_watchdog_8_tests_8_program_8cs_source.html new file mode 100644 index 0000000000..a66020f3f9 --- /dev/null +++ b/_tgstation_8_server_8_host_8_watchdog_8_tests_8_program_8cs_source.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Watchdog.Tests.Program.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Watchdog.Tests.Program.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated> This file has been auto generated. </auto-generated>
2 using System;
3 [Microsoft.VisualStudio.TestPlatform.TestSDKAutoGeneratedCode]
4 class AutoGeneratedProgram {static void Main(string[] args){}}
+ +
+ + + + diff --git a/_tgstation_8_server_8_tests_8_assembly_info_8cs.html b/_tgstation_8_server_8_tests_8_assembly_info_8cs.html new file mode 100644 index 0000000000..ddf0de9471 --- /dev/null +++ b/_tgstation_8_server_8_tests_8_assembly_info_8cs.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Tests.AssemblyInfo.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Tests.AssemblyInfo.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_tests_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_tests_8_assembly_info_8cs_source.html new file mode 100644 index 0000000000..615cae8ed2 --- /dev/null +++ b/_tgstation_8_server_8_tests_8_assembly_info_8cs_source.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Tests.AssemblyInfo.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Tests.AssemblyInfo.cs
+
+
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Tests")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Tests")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Tests")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+ + + + diff --git a/_tgstation_8_server_8_tests_8_program_8cs.html b/_tgstation_8_server_8_tests_8_program_8cs.html new file mode 100644 index 0000000000..daac586c85 --- /dev/null +++ b/_tgstation_8_server_8_tests_8_program_8cs.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Tests.Program.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Tests.Program.cs File Reference
+
+ + + + + diff --git a/_tgstation_8_server_8_tests_8_program_8cs_source.html b/_tgstation_8_server_8_tests_8_program_8cs_source.html new file mode 100644 index 0000000000..5026383d4c --- /dev/null +++ b/_tgstation_8_server_8_tests_8_program_8cs_source.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Tests.Program.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Tests.Program.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated> This file has been auto generated. </auto-generated>
2 using System;
3 [Microsoft.VisualStudio.TestPlatform.TestSDKAutoGeneratedCode]
4 class AutoGeneratedProgram {static void Main(string[] args){}}
+
static void Main(string[] args)
+
+ + + + diff --git a/_token_8cs.html b/_token_8cs.html new file mode 100644 index 0000000000..5f906578dd --- /dev/null +++ b/_token_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Token.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Token.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.Token
 Represents a JWT returned by the API More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + diff --git a/_token_8cs_source.html b/_token_8cs_source.html new file mode 100644 index 0000000000..0514137544 --- /dev/null +++ b/_token_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Token.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Token.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
8  public sealed class Token
9  {
13  public string Bearer { get; set; }
14 
18  public DateTimeOffset? ExpiresAt { get; set; }
19  }
20 }
+
DateTimeOffset? ExpiresAt
When the Token expires
Definition: Token.cs:18
+
Represents a JWT returned by the API
Definition: Token.cs:8
+
string Bearer
The value of the JWT
Definition: Token.cs:13
+
+ + + + diff --git a/_token_factory_8cs.html b/_token_factory_8cs.html new file mode 100644 index 0000000000..0d386b2b79 --- /dev/null +++ b/_token_factory_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/TokenFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
TokenFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Security.TokenFactory
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Security
 
+
+ + + + diff --git a/_token_factory_8cs_source.html b/_token_factory_8cs_source.html new file mode 100644 index 0000000000..b9153e71c6 --- /dev/null +++ b/_token_factory_8cs_source.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/TokenFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TokenFactory.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.IdentityModel.Tokens;
2 using System;
3 using System.Globalization;
4 using System.IdentityModel.Tokens.Jwt;
5 using System.Reflection;
6 using System.Security.Claims;
7 using System.Threading;
8 using System.Threading.Tasks;
11 
13 {
15  sealed class TokenFactory : ITokenFactory
16  {
20  const uint TokenExpiryMinutes = 15;
21 
25  const uint TokenClockSkewMinutes = 1;
26 
30  const uint TokenSigningKeyByteAmount = 256;
31 
33  public TokenValidationParameters ValidationParameters { get; }
34 
39 
46  {
47  ValidationParameters = new TokenValidationParameters
48  {
49  ValidateIssuerSigningKey = true,
50  IssuerSigningKey = new SymmetricSecurityKey(cryptographySuite.GetSecureBytes(TokenSigningKeyByteAmount)),
51 
52  ValidateIssuer = true,
53  ValidIssuer = Assembly.GetExecutingAssembly().GetName().Name,
54 
55  ValidateLifetime = true,
56  ValidateAudience = true,
57  ValidAudience = typeof(Token).Assembly.GetName().Name,
58 
59  ClockSkew = TimeSpan.FromMinutes(TokenClockSkewMinutes),
60 
61  RequireSignedTokens = true,
62 
63  RequireExpirationTime = true
64  };
65 
66  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
67  }
68 
70  public async Task<Token> CreateToken(Models.User user, CancellationToken cancellationToken)
71  {
72  if (user == null)
73  throw new ArgumentNullException(nameof(user));
74 
75  var now = DateTimeOffset.Now;
76  var nowUnix = now.ToUnixTimeSeconds();
77 
78  // this prevents validation conflicts down the line
79  // tldr we can (theoretically) send a token the same second we receive it
80  // since unix time rounds down, it looks like it came from before the user changed their password
81  // this happens occasionally in unit tests
82  // just delay a second so we can force a round up
83  var lpuUnix = user.LastPasswordUpdate?.ToUnixTimeSeconds();
84  if (nowUnix == lpuUnix)
85  await asyncDelayer.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
86 
87  var expiry = now.AddMinutes(TokenExpiryMinutes);
88  var claims = new Claim[]
89  {
90  new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString(CultureInfo.InvariantCulture)),
91  new Claim(JwtRegisteredClaimNames.Exp, expiry.ToUnixTimeSeconds().ToString(CultureInfo.InvariantCulture)),
92  new Claim(JwtRegisteredClaimNames.Nbf, nowUnix.ToString(CultureInfo.InvariantCulture)),
93  new Claim(JwtRegisteredClaimNames.Iss, ValidationParameters.ValidIssuer),
94  new Claim(JwtRegisteredClaimNames.Aud, ValidationParameters.ValidAudience)
95  };
96 
97  var token = new JwtSecurityToken(new JwtHeader(new SigningCredentials(ValidationParameters.IssuerSigningKey, SecurityAlgorithms.HmacSha256)), new JwtPayload(claims));
98  return new Token { Bearer = new JwtSecurityTokenHandler().WriteToken(token), ExpiresAt = expiry };
99  }
100  }
101 }
+
byte [] GetSecureBytes(uint amount)
Generates a secure set of bytes
+
const uint TokenClockSkewMinutes
Amount of minutes to skew the clock for Token validation
Definition: TokenFactory.cs:25
+ +
Contains various cryptographic functions
+ + +
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the TokenFactory
Definition: TokenFactory.cs:38
+
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+
Represents a JWT returned by the API
Definition: Token.cs:8
+
const uint TokenSigningKeyByteAmount
Amount of bytes to use in the TokenValidationParameters.IssuerSigningKey
Definition: TokenFactory.cs:30
+ +
TokenFactory(IAsyncDelayer asyncDelayer, ICryptographySuite cryptographySuite)
Construct a TokenFactory
Definition: TokenFactory.cs:45
+
TokenValidationParameters ValidationParameters
Definition: TokenFactory.cs:33
+ + +
async Task< Token > CreateToken(Models.User user, CancellationToken cancellationToken)
Create a Token for a given user
Definition: TokenFactory.cs:70
+
const uint TokenExpiryMinutes
Amount of minutes until generated Tokens expire
Definition: TokenFactory.cs:20
+ + + +
+ + + + diff --git a/_unauthorized_exception_8cs.html b/_unauthorized_exception_8cs.html new file mode 100644 index 0000000000..4d84b42fc2 --- /dev/null +++ b/_unauthorized_exception_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/UnauthorizedException.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
UnauthorizedException.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Client.UnauthorizedException
 Occurs when the client provides invalid credentials More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_unauthorized_exception_8cs_source.html b/_unauthorized_exception_8cs_source.html new file mode 100644 index 0000000000..50b1c71a9f --- /dev/null +++ b/_unauthorized_exception_8cs_source.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/UnauthorizedException.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
UnauthorizedException.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Net;
4 
6 {
10  public sealed class UnauthorizedException : ClientException
11  {
15  public UnauthorizedException() : base(new ErrorMessage
16  {
17  Message = "Invalid credentials!",
18  SeverApiVersion = null
19  }, HttpStatusCode.Unauthorized)
20  { }
21 
26  public UnauthorizedException(string message) : base(message) { }
27 
33  public UnauthorizedException(string message, Exception innerException) : base(message, innerException) { }
34  }
35 }
+ +
UnauthorizedException(string message)
Construct an UnauthorizedException with a message
+
UnauthorizedException(string message, Exception innerException)
Construct an UnauthorizedException with a message and innerException
+ +
UnauthorizedException()
Construct an UnauthorizedException
+
Occurs when the client provides invalid credentials
+ +
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
Exceptions thrown by IServerClients
+
+ + + + diff --git a/_unrecognized_response_exception_8cs.html b/_unrecognized_response_exception_8cs.html new file mode 100644 index 0000000000..dd064bd41a --- /dev/null +++ b/_unrecognized_response_exception_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/UnrecognizedResponseException.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
UnrecognizedResponseException.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Client.UnrecognizedResponseException
 Occurs when a response is received that did not deserialize to one of the expected Api.Models More...
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_unrecognized_response_exception_8cs_source.html b/_unrecognized_response_exception_8cs_source.html new file mode 100644 index 0000000000..3c2358637e --- /dev/null +++ b/_unrecognized_response_exception_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/UnrecognizedResponseException.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
UnrecognizedResponseException.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Globalization;
3 using System.Net;
5 
7 {
12  {
18  public UnrecognizedResponseException(string data, HttpStatusCode statusCode) : base(new ErrorMessage
19  {
20  Message = String.Format(CultureInfo.InvariantCulture, "Unrecognized response body: {0}", data),
21  SeverApiVersion = null
22  }, statusCode)
23  { }
24 
29 
34  public UnrecognizedResponseException(string message) : base(message) { }
35 
41  public UnrecognizedResponseException(string message, Exception innerException) : base(message, innerException) { }
42  }
43 }
Occurs when a response is received that did not deserialize to one of the expected Api....
+ + +
UnrecognizedResponseException(string message)
Construct an UnrecognizedResponseException with a message
+ +
UnrecognizedResponseException()
Construct a UnrecognizedResponseException
+
UnrecognizedResponseException(string data, HttpStatusCode statusCode)
Construct an UnrecognizedResponseException with the data of a response body and the statusCode
+
UnrecognizedResponseException(string message, Exception innerException)
Construct an UnrecognizedResponseException with a message and innerException
+ +
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
Exceptions thrown by IServerClients
+
+ + + + diff --git a/_updates_configuration_8cs.html b/_updates_configuration_8cs.html new file mode 100644 index 0000000000..31569d631c --- /dev/null +++ b/_updates_configuration_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Configuration/UpdatesConfiguration.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
UpdatesConfiguration.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Configuration.UpdatesConfiguration
 Configuration for the automatic update system More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Configuration
 
+
+ + + + diff --git a/_updates_configuration_8cs_source.html b/_updates_configuration_8cs_source.html new file mode 100644 index 0000000000..efc922740f --- /dev/null +++ b/_updates_configuration_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Configuration/UpdatesConfiguration.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
UpdatesConfiguration.cs
+
+
+Go to the documentation of this file.
2 {
6  public sealed class UpdatesConfiguration
7  {
11  public const string Section = "Updates";
12 
16  const long DefaultGitHubRepositoryId = 92952846;
17 
21  const string DefaultGitTagPrefix = "tgstation-server-v";
22 
26  const string DefaultUpdatePackageAssetName = "ServerUpdatePackage.zip";
27 
31  public long GitHubRepositoryId { get; set; } = DefaultGitHubRepositoryId;
32 
36  public string GitTagPrefix { get; set; } = DefaultGitTagPrefix;
37 
42  }
43 }
string GitTagPrefix
Prefix before the System.Version of TGS published in git tags
+
long GitHubRepositoryId
The Octokit.Repository.Id of the tgstation-server fork to recieve updates from
+
string UpdatePackageAssetName
Asset package containing the new Host assembly in zip form
+
const long DefaultGitHubRepositoryId
The tgstation/tgstation-server Octokit.Repository.Id
+
const string DefaultGitTagPrefix
The default value of GitTagPrefix
+
Configuration for the automatic update system
+
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the UpdatesConfiguration res...
+ +
const string DefaultUpdatePackageAssetName
The default value of UpdatePackageAssetName
+
+ + + + diff --git a/_user_controller_8cs.html b/_user_controller_8cs.html new file mode 100644 index 0000000000..1e75ea6460 --- /dev/null +++ b/_user_controller_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/UserController.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
UserController.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Controllers.UserController
 For managing Users More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Controllers
 
+
+ + + + diff --git a/_user_controller_8cs_source.html b/_user_controller_8cs_source.html new file mode 100644 index 0000000000..54d957e0d3 --- /dev/null +++ b/_user_controller_8cs_source.html @@ -0,0 +1,128 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers/UserController.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
UserController.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Mvc;
2 using Microsoft.EntityFrameworkCore;
3 using Microsoft.Extensions.Logging;
4 using Microsoft.Extensions.Options;
5 using System;
6 using System.Collections.Generic;
7 using System.Globalization;
8 using System.Linq;
9 using System.Net;
10 using System.Threading;
11 using System.Threading.Tasks;
12 using Tgstation.Server.Api;
18 
20 {
24  [Route(Routes.User)]
25  public sealed class UserController : ModelController<UserUpdate>
26  {
31 
36 
40  readonly ILogger<UserController> logger;
41 
46 
56  public UserController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ISystemIdentityFactory systemIdentityFactory, ICryptographySuite cryptographySuite, ILogger<UserController> logger, IOptions<GeneralConfiguration> generalConfigurationOptions) : base(databaseContext, authenticationContextFactory, logger, false)
57  {
58  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
59  this.systemIdentityFactory = systemIdentityFactory ?? throw new ArgumentNullException(nameof(systemIdentityFactory));
60  this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
61  generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
62  }
63 
65  [TgsAuthorize(AdministrationRights.WriteUsers)]
66  public override async Task<IActionResult> Create([FromBody] UserUpdate model, CancellationToken cancellationToken)
67  {
68  if (model == null)
69  throw new ArgumentNullException(nameof(model));
70 
71  if (!(model.Password == null ^ model.SystemIdentifier == null))
72  return BadRequest(new ErrorMessage { Message = "User must have exactly one of either a password or system identifier!" });
73 
74  model.Name = model.Name?.Trim();
75  if (model.Name?.Length == 0)
76  model.Name = null;
77 
78  if (!(model.Name == null ^ model.SystemIdentifier == null))
79  return BadRequest(new ErrorMessage { Message = "User must have a name if and only if user has no system identifier!" });
80 
81  var dbUser = new Models.User
82  {
83  AdministrationRights = model.AdministrationRights ?? AdministrationRights.None,
84  CreatedAt = DateTimeOffset.Now,
85  CreatedBy = AuthenticationContext.User,
86  Enabled = model.Enabled ?? false,
87  InstanceManagerRights = model.InstanceManagerRights ?? InstanceManagerRights.None,
88  Name = model.Name,
89  SystemIdentifier = model.SystemIdentifier,
90  InstanceUsers = new List<Models.InstanceUser>()
91  };
92 
93  if (model.SystemIdentifier != null)
94  try
95  {
96  using (var sysIdentity = await systemIdentityFactory.CreateSystemIdentity(dbUser, cancellationToken).ConfigureAwait(false))
97  {
98  if (sysIdentity == null)
99  return StatusCode((int)HttpStatusCode.Gone);
100  dbUser.Name = sysIdentity.Username;
101  dbUser.SystemIdentifier = sysIdentity.Uid;
102  }
103  }
104  catch (NotImplementedException)
105  {
106  return StatusCode((int)HttpStatusCode.NotImplemented);
107  }
108  else
109  {
110  if (model.Password.Length < generalConfiguration.MinimumPasswordLength)
111  return BadRequest(new ErrorMessage { Message = String.Format(CultureInfo.InvariantCulture, "Password must be at least {0} characters long!", generalConfiguration.MinimumPasswordLength) });
112  cryptographySuite.SetUserPassword(dbUser, model.Password, true);
113  }
114 
115  dbUser.CanonicalName = dbUser.Name.ToUpperInvariant();
116 
117  DatabaseContext.Users.Add(dbUser);
118 
119  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
120 
121  return StatusCode((int)HttpStatusCode.Created, dbUser.ToApi(true));
122  }
123 
125  [TgsAuthorize(AdministrationRights.WriteUsers | AdministrationRights.EditOwnPassword)]
126  public override async Task<IActionResult> Update([FromBody] UserUpdate model, CancellationToken cancellationToken)
127  {
128  if (model == null)
129  throw new ArgumentNullException(nameof(model));
130 
131  var passwordEditOnly = !AuthenticationContext.User.AdministrationRights.Value.HasFlag(AdministrationRights.WriteUsers);
132 
133  var originalUser = passwordEditOnly ? AuthenticationContext.User : await DatabaseContext.Users.Where(x => x.Id == model.Id)
134  .Include(x => x.CreatedBy)
135  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
136  if (originalUser == default)
137  return NotFound();
138 
139  if (passwordEditOnly && (model.Id != originalUser.Id || model.InstanceManagerRights.HasValue || model.AdministrationRights.HasValue || model.Enabled.HasValue || model.SystemIdentifier != null || model.Name != null))
140  return Forbid();
141 
142  if (model.Password != null)
143  {
144  if (originalUser.PasswordHash == null)
145  return BadRequest(new ErrorMessage { Message = "Cannot convert a system user to a password user!" });
146  cryptographySuite.SetUserPassword(originalUser, model.Password, false);
147  }
148  else if (model.SystemIdentifier != null && model.SystemIdentifier != originalUser.SystemIdentifier)
149  return BadRequest(new ErrorMessage { Message = "Cannot change a user's system identifier!" });
150 
151  if (model.Name != null && model.Name.ToUpperInvariant() != originalUser.CanonicalName)
152  return BadRequest(new ErrorMessage { Message = "Can only change capitalization of a user's name!" });
153 
154  originalUser.InstanceManagerRights = model.InstanceManagerRights ?? originalUser.InstanceManagerRights;
155  originalUser.AdministrationRights = model.AdministrationRights ?? originalUser.AdministrationRights;
156  originalUser.Enabled = model.Enabled ?? originalUser.Enabled;
157  originalUser.Name = model.Name ?? originalUser.Name;
158 
159  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
160 
161  return Json(model.Id == originalUser.Id || (AuthenticationContext.GetRight(RightsType.Administration) & (ulong)AdministrationRights.ReadUsers) != 0 ? originalUser.ToApi(true) : new Api.Models.User
162  {
163  Id = originalUser.Id
164  });
165  }
166 
168  [TgsAuthorize]
169  public override Task<IActionResult> Read(CancellationToken cancellationToken) => Task.FromResult<IActionResult>(Json(AuthenticationContext.User.ToApi(true)));
170 
172  [TgsAuthorize(AdministrationRights.ReadUsers)]
173  public override async Task<IActionResult> List(CancellationToken cancellationToken)
174  {
175  var users = await DatabaseContext.Users
176  .Include(x => x.CreatedBy)
177  .ToListAsync(cancellationToken).ConfigureAwait(false);
178  return Json(users.Select(x => x.ToApi(true)));
179  }
180 
182  [TgsAuthorize]
183  public override async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
184  {
185  if (id == AuthenticationContext.User.Id)
186  return await Read(cancellationToken).ConfigureAwait(false);
187 
188  if (!((AdministrationRights)AuthenticationContext.GetRight(RightsType.Administration)).HasFlag(AdministrationRights.ReadUsers))
189  return Forbid();
190 
191  var user = await DatabaseContext.Users
192  .Where(x => x.Id == id)
193  .Include(x => x.CreatedBy)
194  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
195  if (user == default)
196  return NotFound();
197  return Json(user.ToApi(true));
198  }
199  }
200 }
+ + + +
const string User
The Models.User controller
Definition: Routes.cs:24
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+ +
Task< ISystemIdentity > CreateSystemIdentity(User user, CancellationToken cancellationToken)
Create a ISystemIdentity for a given user
+ + + +
UserController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ISystemIdentityFactory systemIdentityFactory, ICryptographySuite cryptographySuite, ILogger< UserController > logger, IOptions< GeneralConfiguration > generalConfigurationOptions)
Construct a UserController
+
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the UserController
+
override async Task< IActionResult > Create([FromBody] UserUpdate model, CancellationToken cancellationToken)
+
override Task< IActionResult > Read(CancellationToken cancellationToken)
Attempt to read a TModel
+
AdministrationRights? AdministrationRights
The Rights.AdministrationRights for the User
Definition: User.cs:44
+
readonly ISystemIdentityFactory systemIdentityFactory
The ISystemIdentityFactory for the UserController
+
AdministrationRights
Rights for Models.Administration
+
readonly ILogger< UserController > logger
The ILogger for the UserController
+
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+
Contains various cryptographic functions
+ +
Routes to a server actions
Definition: Routes.cs:9
+
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the UserController
+
override async Task< IActionResult > GetId(long id, CancellationToken cancellationToken)
Attempt to get a specific a TModel
+
InstanceManagerRights
Rights for managing Models.Instances
+ + + +
override async Task< IActionResult > Update([FromBody] UserUpdate model, CancellationToken cancellationToken)
+
An ApiController representing a TModel
+ + +
long Id
The ID of the User
Definition: User.cs:15
+ +
override async Task< IActionResult > List(CancellationToken cancellationToken)
Attempt to list entries of the TModel
+
void SetUserPassword(User user, string newPassword, bool newUser)
Sets a User.PasswordHash for a given user
+ +
For editing a given User. Will never be returned by the API
Definition: UserUpdate.cs:6
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ + +
bool? Enabled
If the User is enabled since users cannot be deleted. System users cannot be disabled
Definition: User.cs:21
+
uint MinimumPasswordLength
Minimum length of database user passwords
+ +
+ + + + diff --git a/_user_update_8cs.html b/_user_update_8cs.html new file mode 100644 index 0000000000..32f862a093 --- /dev/null +++ b/_user_update_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/UserUpdate.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
UserUpdate.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Api.Models.UserUpdate
 For editing a given User. Will never be returned by the API More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Api
 
namespace  Tgstation.Server.Api.Models
 
+
+ + + + diff --git a/_user_update_8cs_source.html b/_user_update_8cs_source.html new file mode 100644 index 0000000000..efc649a225 --- /dev/null +++ b/_user_update_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/UserUpdate.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
UserUpdate.cs
+
+
+Go to the documentation of this file.
2 {
6  public sealed class UserUpdate : User
7  {
11  public string Password { get; set; }
12  }
13 }
+
string Password
Cleartext password of the User
Definition: UserUpdate.cs:11
+ +
For editing a given User. Will never be returned by the API
Definition: UserUpdate.cs:6
+
+ + + + diff --git a/_users_client_8cs.html b/_users_client_8cs.html new file mode 100644 index 0000000000..62240732d5 --- /dev/null +++ b/_users_client_8cs.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/UsersClient.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
UsersClient.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Client.UsersClient
 
+ + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Client
 
+
+ + + + diff --git a/_users_client_8cs_source.html b/_users_client_8cs_source.html new file mode 100644 index 0000000000..7f41d7da34 --- /dev/null +++ b/_users_client_8cs_source.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/UsersClient.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
UsersClient.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Threading;
4 using System.Threading.Tasks;
5 using Tgstation.Server.Api;
7 
9 {
11  sealed class UsersClient : IUsersClient
12  {
17 
23  {
24  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
25  }
26 
28  public Task<User> Create(UserUpdate user, CancellationToken cancellationToken) => apiClient.Create<UserUpdate, User>(Routes.User, user ?? throw new ArgumentNullException(nameof(user)), cancellationToken);
29 
31  public Task<User> GetId(User user, CancellationToken cancellationToken) => apiClient.Read<User>(Routes.SetID(Routes.User, user?.Id ?? throw new ArgumentNullException(nameof(user))), cancellationToken);
32 
34  public Task<IReadOnlyList<User>> List(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<User>>(Routes.List(Routes.User), cancellationToken);
35 
37  public Task<User> Read(CancellationToken cancellationToken) => apiClient.Read<User>(Routes.User, cancellationToken);
38 
40  public Task<User> Update(UserUpdate user, CancellationToken cancellationToken) => apiClient.Update<UserUpdate, User>(Routes.User, user ?? throw new ArgumentNullException(nameof(user)), cancellationToken);
41  }
42 }
readonly IApiClient apiClient
The apiClient for the UsersClient
Definition: UsersClient.cs:16
+
const string User
The Models.User controller
Definition: Routes.cs:24
+
Task< IReadOnlyList< User > > List(CancellationToken cancellationToken)
List all Users
+ + + +
Task< User > Read(CancellationToken cancellationToken)
Read the current user's information and general rights
+
Task< User > Create(UserUpdate user, CancellationToken cancellationToken)
Create a new user
+ +
Routes to a server actions
Definition: Routes.cs:9
+
Task< User > Update(UserUpdate user, CancellationToken cancellationToken)
Update a user
+ + +
static string SetID(string route, long id)
Apply an id postfix to a route
+
static string List(string route)
Get the /List postfix for a route
+ +
For editing a given User. Will never be returned by the API
Definition: UserUpdate.cs:6
+
Web interface for the API
Definition: IApiClient.cs:11
+
UsersClient(IApiClient apiClient)
Construct an UsersClient
Definition: UsersClient.cs:22
+
Task< User > GetId(User user, CancellationToken cancellationToken)
Get a specific user
+ +
+ + + + diff --git a/_version_command_8cs.html b/_version_command_8cs.html new file mode 100644 index 0000000000..c0cdcc0385 --- /dev/null +++ b/_version_command_8cs.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands/VersionCommand.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
VersionCommand.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Chat.Commands.VersionCommand
 ICommand to return the IApplication.VersionString More...
 
+ + + + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
namespace  Tgstation.Server.Host.Components.Chat.Commands
 
+
+ + + + diff --git a/_version_command_8cs_source.html b/_version_command_8cs_source.html new file mode 100644 index 0000000000..6c68a81a8f --- /dev/null +++ b/_version_command_8cs_source.html @@ -0,0 +1,98 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands/VersionCommand.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
VersionCommand.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
5 
7 {
11  sealed class VersionCommand : ICommand
12  {
14  public string Name => "version";
15 
17  public string HelpText => "Displays the tgstation server version";
18 
20  public bool AdminOnly => false;
21 
26 
32  {
33  this.application = application ?? throw new ArgumentNullException(nameof(application));
34  }
35 
37  public Task<string> Invoke(string arguments, User user, CancellationToken cancellationToken) => Task.FromResult(application.VersionString);
38  }
39 }
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
+ +
ICommand to return the IApplication.VersionString
+
readonly IApplication application
The IApplication for the VersionCommand
+ + + +
VersionCommand(IApplication application)
Construct a VersionCommand
+
Task< string > Invoke(string arguments, User user, CancellationToken cancellationToken)
Invoke the ICommand
+
Represents a tgs_chat_user datum
Definition: User.cs:10
+
string VersionString
A more verbose version of Version
Definition: IApplication.cs:18
+ + +
Represents a command that can be invoked by talking to chat bots
Definition: ICommand.cs:9
+ + +
+ + + + diff --git a/_watchdog_2_i_watchdog_8cs.html b/_watchdog_2_i_watchdog_8cs.html new file mode 100644 index 0000000000..a13f8d24e5 --- /dev/null +++ b/_watchdog_2_i_watchdog_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/IWatchdog.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IWatchdog.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Watchdog.IWatchdog
 The watchdog for a Host More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Watchdog
 
+
+ + + + diff --git a/_watchdog_2_i_watchdog_8cs_source.html b/_watchdog_2_i_watchdog_8cs_source.html new file mode 100644 index 0000000000..188dbbea55 --- /dev/null +++ b/_watchdog_2_i_watchdog_8cs_source.html @@ -0,0 +1,85 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/IWatchdog.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IWatchdog.cs
+
+
+Go to the documentation of this file.
1 using System.Threading;
2 using System.Threading.Tasks;
3 
5 {
9  public interface IWatchdog
10  {
18  Task RunAsync(bool runConfigure, string[] args, CancellationToken cancellationToken);
19  }
20 }
+
Task RunAsync(bool runConfigure, string[] args, CancellationToken cancellationToken)
Run the IWatchdog
+ +
+ + + + diff --git a/_watchdog_2_i_watchdog_factory_8cs.html b/_watchdog_2_i_watchdog_factory_8cs.html new file mode 100644 index 0000000000..9343504d1c --- /dev/null +++ b/_watchdog_2_i_watchdog_factory_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/IWatchdogFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
IWatchdogFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

interface  Tgstation.Server.Host.Watchdog.IWatchdogFactory
 Factory for creating IWatchdogs More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Watchdog
 
+
+ + + + diff --git a/_watchdog_2_i_watchdog_factory_8cs_source.html b/_watchdog_2_i_watchdog_factory_8cs_source.html new file mode 100644 index 0000000000..aa189edfea --- /dev/null +++ b/_watchdog_2_i_watchdog_factory_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/IWatchdogFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IWatchdogFactory.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 
4 {
8  public interface IWatchdogFactory
9  {
15  IWatchdog CreateWatchdog(ILoggerFactory loggerFactory);
16  }
17 }
IWatchdog CreateWatchdog(ILoggerFactory loggerFactory)
Create a IWatchdog
+ + + +
+ + + + diff --git a/_watchdog_2_watchdog_factory_8cs.html b/_watchdog_2_watchdog_factory_8cs.html new file mode 100644 index 0000000000..9103362a26 --- /dev/null +++ b/_watchdog_2_watchdog_factory_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/WatchdogFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
WatchdogFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Watchdog.WatchdogFactory
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Watchdog
 
+
+ + + + diff --git a/_watchdog_2_watchdog_factory_8cs_source.html b/_watchdog_2_watchdog_factory_8cs_source.html new file mode 100644 index 0000000000..8d6612c7cf --- /dev/null +++ b/_watchdog_2_watchdog_factory_8cs_source.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/WatchdogFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
WatchdogFactory.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using System;
3 
5 {
7  public sealed class WatchdogFactory : IWatchdogFactory
8  {
10  public IWatchdog CreateWatchdog(ILoggerFactory loggerFactory) => new Watchdog(loggerFactory?.CreateLogger<Watchdog>() ?? throw new ArgumentNullException(nameof(loggerFactory)));
11  }
12 }
+
IWatchdog CreateWatchdog(ILoggerFactory loggerFactory)
Create a IWatchdog
+ + + + +
+ + + + diff --git a/_watchdog_8cs.html b/_watchdog_8cs.html new file mode 100644 index 0000000000..9900694bf9 --- /dev/null +++ b/_watchdog_8cs.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/Watchdog.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Watchdog.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Classes

class  Tgstation.Server.Host.Watchdog.Watchdog
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Watchdog
 
+
+ + + + diff --git a/_watchdog_8cs_source.html b/_watchdog_8cs_source.html new file mode 100644 index 0000000000..922f11304f --- /dev/null +++ b/_watchdog_8cs_source.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/Watchdog.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Watchdog.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using System;
3 using System.Collections.Generic;
4 using System.Diagnostics;
5 using System.Globalization;
6 using System.IO;
7 using System.Linq;
8 using System.Reflection;
9 using System.Runtime.InteropServices;
10 using System.Threading;
11 using System.Threading.Tasks;
12 
14 {
16  sealed class Watchdog : IWatchdog
17  {
21  readonly ILogger<Watchdog> logger;
22 
27  public Watchdog(ILogger<Watchdog> logger)
28  {
29  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
30  }
31 
32  string GetDotnetPath(bool isWindows)
33  {
34  var enviromentPath = Environment.GetEnvironmentVariable("PATH");
35  var paths = enviromentPath.Split(';');
36 
37  var exeName = "dotnet";
38  IEnumerable<string> enumerator;
39  if (isWindows)
40  {
41  exeName += ".exe";
42  enumerator = paths;
43  }
44  else
45  enumerator = paths.Select(x => x.Split(':')).SelectMany(x => x);
46 
47  enumerator = enumerator.Select(x => Path.Combine(x, exeName));
48 
49  return enumerator
50  .Where(x =>
51  {
52  logger.LogTrace("Checking for dotnet at {0}", x);
53  return File.Exists(x);
54  })
55  .FirstOrDefault();
56  }
57 
59  #pragma warning disable CA1502 // TODO: Decomplexify
60  public async Task RunAsync(bool runConfigure, string[] args, CancellationToken cancellationToken)
61  {
62  logger.LogInformation("Host watchdog starting...");
63  logger.LogDebug("PID: {0}", Process.GetCurrentProcess().Id);
64  string updateDirectory = null;
65  try
66  {
67  var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
68  var dotnetPath = GetDotnetPath(isWindows);
69  if (dotnetPath == default)
70  {
71  logger.LogCritical("Unable to locate dotnet executable in PATH! Please ensure the .NET Core runtime is installed and is in your PATH!");
72  return;
73  }
74 
75  logger.LogInformation("Detected dotnet executable at {0}", dotnetPath);
76 
77  var rootLocation = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
78 
79  var assemblyStoragePath = Path.Combine(rootLocation, "lib"); // always always next to watchdog
80 #if DEBUG
81  Directory.CreateDirectory(assemblyStoragePath);
82 #endif
83  var defaultAssemblyPath = Path.GetFullPath(Path.Combine(assemblyStoragePath, "Default"));
84 #if DEBUG
85  // just copy the shit where it belongs
86  Directory.Delete(assemblyStoragePath, true);
87  Directory.CreateDirectory(defaultAssemblyPath);
88 
89  var sourcePath = "../../../Tgstation.Server.Host/bin/Debug/netcoreapp2.1";
90  foreach (string dirPath in Directory.GetDirectories(sourcePath, "*", SearchOption.AllDirectories))
91  Directory.CreateDirectory(dirPath.Replace(sourcePath, defaultAssemblyPath));
92 
93  foreach (string newPath in Directory.GetFiles(sourcePath, "*.*", SearchOption.AllDirectories))
94  File.Copy(newPath, newPath.Replace(sourcePath, defaultAssemblyPath), true);
95 
96  const string AppSettingsJson = "appsettings.json";
97  var rootJson = Path.Combine(rootLocation, AppSettingsJson);
98  File.Delete(rootJson);
99  File.Move(Path.Combine(defaultAssemblyPath, AppSettingsJson), rootJson);
100 #endif
101 
102  var assemblyName = String.Join(".", nameof(Tgstation), nameof(Server), nameof(Host), "dll");
103  var assemblyPath = Path.Combine(defaultAssemblyPath, assemblyName);
104 
105  if (assemblyPath.Contains("\""))
106  {
107  logger.LogCritical("Running from paths with \"'s in the name is not supported!");
108  return;
109  }
110 
111  if (!File.Exists(assemblyPath))
112  {
113  logger.LogCritical("Unable to locate host assembly!");
114  return;
115  }
116 
117  while (!cancellationToken.IsCancellationRequested)
118  using (logger.BeginScope("Host invocation"))
119  {
120  updateDirectory = Path.GetFullPath(Path.Combine(assemblyStoragePath, Guid.NewGuid().ToString()));
121  logger.LogInformation("Update path set to {0}", updateDirectory);
122  using (var process = new Process())
123  {
124  process.StartInfo.FileName = dotnetPath;
125  process.StartInfo.WorkingDirectory = rootLocation; // for appsettings
126 
127  var arguments = new List<string>
128  {
129  '"' + assemblyPath + '"',
130  '"' + updateDirectory + '"'
131  };
132 
133  if (Environment.GetCommandLineArgs().Any(x => x.Equals("--attach-host-debugger", StringComparison.OrdinalIgnoreCase)))
134  arguments.Add("--attach-debugger");
135 
136  if (runConfigure)
137  {
138  logger.LogInformation("Running configuration check and wizard if necessary...");
139  arguments.Add("General:SetupWizardMode=Only");
140  }
141 
142  arguments.AddRange(args);
143 
144  process.StartInfo.Arguments = String.Join(" ", arguments);
145 
146  process.StartInfo.UseShellExecute = false; // runs in the same console
147 
148  var tcs = new TaskCompletionSource<object>();
149  process.Exited += (a, b) =>
150  {
151  tcs.TrySetResult(null);
152  };
153  process.EnableRaisingEvents = true;
154 
155  logger.LogInformation("Launching host...");
156 
157  var killedHostProcess = false;
158  try
159  {
160  process.Start();
161 
162  using (var processCts = new CancellationTokenSource())
163  using (processCts.Token.Register(() => tcs.TrySetResult(null)))
164  using (cancellationToken.Register(() =>
165  {
166  if (!Directory.Exists(updateDirectory))
167  {
168  logger.LogInformation("Cancellation requested! Writing shutdown lock file...");
169  File.WriteAllBytes(updateDirectory, Array.Empty<byte>());
170  }
171  else
172  logger.LogWarning("Cancellation requested while update directory exists!");
173 
174  logger.LogInformation("Will force close host process if it doesn't exit in 10 seconds...");
175 
176  try
177  {
178  processCts.CancelAfter(TimeSpan.FromSeconds(10));
179  }
180  catch (ObjectDisposedException) { } // race conditions
181  }))
182  await tcs.Task.ConfigureAwait(false);
183  }
184  catch (InvalidOperationException) { }
185  finally
186  {
187  try
188  {
189  if (!process.HasExited)
190  {
191  killedHostProcess = true;
192  process.Kill();
193  process.WaitForExit();
194  }
195  }
196  catch (InvalidOperationException) { }
197  logger.LogInformation("Host exited!");
198  }
199 
200  if (runConfigure)
201  {
202  logger.LogInformation("Exiting due to configuration check...");
203  return;
204  }
205 
206  switch (process.ExitCode)
207  {
208  case 0:
209  return;
210  case 1:
211  if (!cancellationToken.IsCancellationRequested)
212  logger.LogInformation("Watchdog will restart host..."); // just a restart
213  else
214  logger.LogWarning("Host requested restart but watchdog shutdown is in progress!");
215  break;
216  case 2:
217  // update path is now an exception document
218  logger.LogCritical("Host crashed, propagating exception dump...");
219  var data = File.ReadAllText(updateDirectory);
220  try
221  {
222  File.Delete(updateDirectory);
223  }
224  catch (Exception e)
225  {
226  logger.LogWarning("Unable to delete exception dump file at {0}! Exception: {1}", updateDirectory, e);
227  }
228 
229 #pragma warning disable CA2201 // Do not raise reserved exception types
230  throw new Exception(String.Format(CultureInfo.InvariantCulture, "Host propagated exception: {0}", data));
231 #pragma warning restore CA2201 // Do not raise reserved exception types
232  default:
233  if (killedHostProcess)
234  {
235  logger.LogWarning("Watchdog forced to kill host process!");
236  cancellationToken.ThrowIfCancellationRequested();
237  }
238 
239 #pragma warning disable CA2201 // Do not raise reserved exception types
240  throw new Exception(String.Format(CultureInfo.InvariantCulture, "Host crashed with exit code {0}!", process.ExitCode));
241 #pragma warning restore CA2201 // Do not raise reserved exception types
242  }
243  }
244 
245  // HEY YOU
246  // BE WARNED THAT IF YOU DEBUGGED THE HOST PROCESS THAT JUST LAUNCHED THE DEBUGGER WILL HOLD A LOCK ON THE DIRECTORY
247  // THIS MEANS THE FIRST DIRECTORY.MOVE WILL THROW
248  if (Directory.Exists(updateDirectory))
249  {
250  logger.LogInformation("Applying server update...");
251  if (isWindows)
252  {
253  // windows dick sucking resource unlocking
254  GC.Collect(Int32.MaxValue, GCCollectionMode.Default, true);
255  await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken).ConfigureAwait(false);
256  }
257 
258  var tempPath = Path.Combine(assemblyStoragePath, Guid.NewGuid().ToString());
259  try
260  {
261  Directory.Move(defaultAssemblyPath, tempPath);
262  try
263  {
264  Directory.Move(updateDirectory, defaultAssemblyPath);
265  logger.LogInformation("Server update complete, deleting old server...");
266  try
267  {
268  Directory.Delete(tempPath, true);
269  }
270  catch (Exception e)
271  {
272  logger.LogWarning("Error deleting old server at {0}! Exception: {1}", tempPath, e);
273  }
274  }
275  catch (Exception e)
276  {
277  logger.LogError("Error moving updated server directory, attempting revert! Exception: {0}", e);
278  Directory.Delete(defaultAssemblyPath, true);
279  Directory.Move(tempPath, defaultAssemblyPath);
280  logger.LogInformation("Revert successful!");
281  }
282  }
283  catch (Exception e)
284  {
285  logger.LogWarning("Failed to move out active host assembly! Exception: {0}", e);
286  }
287  }
288  }
289  }
290  catch (OperationCanceledException)
291  {
292  logger.LogDebug("Exiting due to cancellation...");
293  if (!Directory.Exists(updateDirectory))
294  File.Delete(updateDirectory);
295  else
296  Directory.Delete(updateDirectory, true);
297  }
298  catch (Exception e)
299  {
300  logger.LogCritical("Watchdog error! Exception: {0}", e);
301  }
302  finally
303  {
304  logger.LogInformation("Host watchdog exiting...");
305  }
306  }
307  #pragma warning restore CA1502
308  }
309 }
+
async Task RunAsync(bool runConfigure, string[] args, CancellationToken cancellationToken)
Run the IWatchdog
Definition: Watchdog.cs:60
+ +
readonly ILogger< Watchdog > logger
The ILogger for the Watchdog
Definition: Watchdog.cs:21
+ +
string GetDotnetPath(bool isWindows)
Definition: Watchdog.cs:32
+ + +
Watchdog(ILogger< Watchdog > logger)
Construct a Watchdog
Definition: Watchdog.cs:27
+
+ + + + diff --git a/_watchdog_base_8cs.html b/_watchdog_base_8cs.html new file mode 100644 index 0000000000..d3d4da3b7e --- /dev/null +++ b/_watchdog_base_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/WatchdogBase.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
WatchdogBase.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Watchdog.WatchdogBase
 Base class for IWatchdogs. More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Watchdog
 
+
+ + + + diff --git a/_watchdog_base_8cs_source.html b/_watchdog_base_8cs_source.html new file mode 100644 index 0000000000..ece359c094 --- /dev/null +++ b/_watchdog_base_8cs_source.html @@ -0,0 +1,187 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/WatchdogBase.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
WatchdogBase.cs
+
+
+Go to the documentation of this file.
1 using Byond.TopicSender;
2 using Microsoft.EntityFrameworkCore;
3 using Microsoft.Extensions.Logging;
4 using Newtonsoft.Json;
5 using Newtonsoft.Json.Serialization;
6 using System;
7 using System.Collections.Generic;
8 using System.Diagnostics;
9 using System.Globalization;
10 using System.Linq;
11 using System.Text;
12 using System.Threading;
13 using System.Threading.Tasks;
20 
22 {
26  #pragma warning disable CA1506 // TODO: Decomplexify
28  {
30  public bool Running { get; protected set; }
31 
33  public abstract bool AlphaIsActive { get; }
34 
36  public abstract Models.CompileJob ActiveCompileJob { get; }
37 
39  public DreamDaemonLaunchParameters ActiveLaunchParameters { get; protected set; }
40 
42  public DreamDaemonLaunchParameters LastLaunchParameters { get; protected set; }
43 
45  public abstract RebootState? RebootState { get; }
46 
50  protected TaskCompletionSource<object> ActiveParametersUpdated { get; set; }
51 
55  protected SemaphoreSlim Semaphore { get; }
56 
60  protected ILogger Logger { get; }
61 
65  protected IChat Chat { get; }
66 
71 
75  protected IDmbFactory DmbFactory { get; }
76 
80  protected IAsyncDelayer AsyncDelayer { get; }
81 
85  readonly Api.Models.Instance instance;
86 
91 
96 
100  readonly IByondTopicSender byondTopicSender;
101 
106 
111 
116 
120  readonly bool autoStart;
121 
125  CancellationTokenSource monitorCts;
126 
131 
136 
154  protected WatchdogBase(
155  IChat chat,
156  ISessionControllerFactory sessionControllerFactory,
157  IDmbFactory dmbFactory,
160  IByondTopicSender byondTopicSender,
163  IServerControl serverControl,
164  IAsyncDelayer asyncDelayer,
165  ILogger logger,
166  DreamDaemonLaunchParameters initialLaunchParameters,
167  Api.Models.Instance instance,
168  bool autoStart)
169  {
170  Chat = chat ?? throw new ArgumentNullException(nameof(chat));
171  SessionControllerFactory = sessionControllerFactory ?? throw new ArgumentNullException(nameof(sessionControllerFactory));
172  DmbFactory = dmbFactory ?? throw new ArgumentNullException(nameof(dmbFactory));
173  AsyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
174  this.reattachInfoHandler = reattachInfoHandler ?? throw new ArgumentNullException(nameof(reattachInfoHandler));
175  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
176  this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
177  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
178  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
179  Logger = logger ?? throw new ArgumentNullException(nameof(logger));
180  ActiveLaunchParameters = initialLaunchParameters ?? throw new ArgumentNullException(nameof(initialLaunchParameters));
181  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
182  this.autoStart = autoStart;
183 
184  if (serverControl == null)
185  throw new ArgumentNullException(nameof(serverControl));
186 
187  chat.RegisterCommandHandler(this);
188 
189  ActiveLaunchParameters = initialLaunchParameters;
190  releaseServers = false;
191  ActiveParametersUpdated = new TaskCompletionSource<object>();
192 
193  restartRegistration = serverControl.RegisterForRestart(this);
194  try
195  {
196  Semaphore = new SemaphoreSlim(1);
197  }
198  catch
199  {
200  restartRegistration.Dispose();
201  throw;
202  }
203  }
204 
206  public void Dispose()
207  {
208  Semaphore.Dispose();
209  restartRegistration.Dispose();
211 
212  Debug.Assert(monitorCts == null, "Expected monitorCts to be null!");
213  monitorCts?.Dispose();
214  }
215 
223  async Task TerminateNoLock(bool graceful, bool announce, CancellationToken cancellationToken)
224  {
225  if (!Running)
226  return;
227  if (!graceful)
228  {
229  var chatTask = announce ? Chat.SendWatchdogMessage("Terminating...", cancellationToken) : Task.CompletedTask;
230  await StopMonitor().ConfigureAwait(false);
232  LastLaunchParameters = null;
233  await chatTask.ConfigureAwait(false);
234  return;
235  }
236 
237  // merely set the reboot state
238  var toKill = GetActiveController();
239  if (toKill != null)
240  await toKill.SetRebootState(Watchdog.RebootState.Shutdown, cancellationToken).ConfigureAwait(false);
241  }
242 
251  protected async Task LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
252  {
253  Logger.LogTrace("Begin LaunchNoLock");
254 
255  if (Running)
256  throw new JobException("Watchdog already running!");
257 
258  // this is necessary, the monitor could be in it's sleep loop trying to restart, if so cancel THAT monitor and start our own with blackjack and hookers
259  Task chatTask;
260  if (startMonitor && await StopMonitor().ConfigureAwait(false))
261  chatTask = Chat.SendWatchdogMessage("Automatic retry sequence cancelled by manual launch. Restarting...", cancellationToken);
262  else if (announce)
263  chatTask = Chat.SendWatchdogMessage(reattachInfo == null ? "Starting..." : "Reattaching...", cancellationToken); // simple announce
264  else
265  chatTask = Task.CompletedTask; // no announce
266 
267  // since neither server is running, this is safe to do
269 
270  // for when we call ourself and want to not catch thrown exceptions
271  var ignoreNestedException = false;
272  try
273  {
274  await InitControllers(() => ignoreNestedException = true, chatTask, reattachInfo, cancellationToken).ConfigureAwait(false);
275  await chatTask.ConfigureAwait(false);
276 
277  Logger.LogInformation("Launched servers successfully");
278  Running = true;
279 
280  if (startMonitor)
281  {
282  StartMonitor();
283  }
284  }
285  catch (Exception e)
286  {
287  // don't try to send chat tasks or warning logs if were suppressing exceptions or cancelled
288  if (!ignoreNestedException && !cancellationToken.IsCancellationRequested)
289  {
290  var originalChatTask = chatTask;
291  async Task ChainChatTaskWithErrorMessage()
292  {
293  await originalChatTask.ConfigureAwait(false);
294  await Chat.SendWatchdogMessage("Startup failed!", cancellationToken).ConfigureAwait(false);
295  }
296 
297  chatTask = ChainChatTaskWithErrorMessage();
298  Logger.LogWarning("Failed to start watchdog: {0}", e.ToString());
299  }
300 
301  throw;
302  }
303  finally
304  {
305  // finish the chat task that's in flight
306  try
307  {
308  await chatTask.ConfigureAwait(false);
309  }
310  catch (OperationCanceledException) { }
311  }
312  }
313 
317  protected void StartMonitor()
318  {
319  monitorCts = new CancellationTokenSource();
321  }
322 
327  protected async Task<bool> StopMonitor()
328  {
329  Logger.LogTrace("StopMonitor");
330  if (monitorTask == null)
331  return false;
332  monitorCts.Cancel();
333  await monitorTask.ConfigureAwait(false);
334  monitorCts.Dispose();
335  monitorTask = null;
336  monitorCts = null;
337  return true;
338  }
339 
346  protected async Task NotifyOfFailedReattach(bool inactiveReattachSuccess, CancellationToken cancellationToken)
347  {
348  // we lost the server, just restart entirely
350  const string FailReattachMessage = "Unable to properly reattach to server! Restarting...";
351  Logger.LogWarning(FailReattachMessage);
352  Logger.LogDebug(inactiveReattachSuccess ? "Also could not reattach to inactive server!" : "Inactive server was reattached successfully!");
353  Task chatTask = Chat.SendWatchdogMessage(FailReattachMessage, cancellationToken);
354  await LaunchImplNoLock(true, false, null, cancellationToken).ConfigureAwait(false);
355  await chatTask.ConfigureAwait(false);
356  }
357 
365  protected async Task CheckLaunchResult(ISessionController controller, string serverName, CancellationToken cancellationToken)
366  {
367  var launchResult = await controller.LaunchResult.WithToken(cancellationToken).ConfigureAwait(false);
368 
369  // Dead sessions won't trigger this
370  if (launchResult.ExitCode.HasValue) // you killed us ray...
371  throw new JobException(String.Format(CultureInfo.InvariantCulture, "{0} failed to start: {1}", serverName, launchResult));
372  if (!launchResult.StartupTime.HasValue)
373  throw new JobException(String.Format(CultureInfo.InvariantCulture, "{0} timed out on startup: {1}s", serverName, ActiveLaunchParameters.StartupTimeout.Value));
374  }
375 
379  protected abstract void DisposeAndNullControllers();
380 
385  protected abstract ISessionController GetActiveController();
386 
392 
398  protected abstract Task MonitorLifetimes(CancellationToken cancellationToken);
399 
408  protected abstract Task InitControllers(Action callBeforeRecurse, Task chatTask, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken);
409 
411  public async Task ChangeSettings(DreamDaemonLaunchParameters launchParameters, CancellationToken cancellationToken)
412  {
413  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
414  {
415  if (launchParameters.Match(ActiveLaunchParameters))
416  return;
417  ActiveLaunchParameters = launchParameters;
418  if (Running)
419  ActiveParametersUpdated.TrySetResult(null); // queue an update
420  }
421  }
422 
424  public async Task<bool> HandleEvent(EventType eventType, IEnumerable<string> parameters, CancellationToken cancellationToken)
425  {
426  string results;
427  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
428  {
429  if (!Running)
430  return true;
431 
432  var builder = new StringBuilder(Constants.DMTopicEvent);
433  builder.Append('&');
434  var notification = new EventNotification
435  {
436  Type = eventType,
437  Parameters = parameters
438  };
439  var json = JsonConvert.SerializeObject(notification);
440  builder.Append(byondTopicSender.SanitizeString(Constants.DMParameterData));
441  builder.Append('=');
442  builder.Append(byondTopicSender.SanitizeString(json));
443 
444  var activeServer = GetActiveController();
445  results = await activeServer.SendCommand(builder.ToString(), cancellationToken).ConfigureAwait(false);
446  }
447 
448  if (results == Constants.DMResponseSuccess)
449  return true;
450 
451  List<Response> responses;
452  try
453  {
454  responses = JsonConvert.DeserializeObject<List<Response>>(results);
455  }
456  catch
457  {
458  Logger.LogInformation("Recieved invalid response from DD when parsing event {0}:{1}{2}", eventType, Environment.NewLine, results);
459  return true;
460  }
461 
462  await Task.WhenAll(responses.Select(x => Chat.SendMessage(x.Message, x.ChannelIds, cancellationToken))).ConfigureAwait(false);
463 
464  return true;
465  }
466 
468  public async Task<string> HandleChatCommand(string commandName, string arguments, Chat.User sender, CancellationToken cancellationToken)
469  {
470  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
471  {
472  if (!Running)
473  return "ERROR: Server offline!";
474 
475  var commandObject = new ChatCommand
476  {
477  Command = commandName,
478  Params = arguments,
479  User = sender
480  };
481 
482  var json = JsonConvert.SerializeObject(commandObject, new JsonSerializerSettings
483  {
484  ContractResolver = new CamelCasePropertyNamesContractResolver()
485  });
486 
487  var command = String.Format(CultureInfo.InvariantCulture, "{0}&{1}={2}", byondTopicSender.SanitizeString(Constants.DMTopicChatCommand), byondTopicSender.SanitizeString(Constants.DMParameterData), byondTopicSender.SanitizeString(json));
488 
489  var activeServer = GetActiveController();
490  return await activeServer.SendCommand(command, cancellationToken).ConfigureAwait(false) ?? "ERROR: Bad topic exchange!";
491  }
492  }
493 
495  public async Task Launch(CancellationToken cancellationToken)
496  {
497  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
498  await LaunchImplNoLock(true, true, null, cancellationToken).ConfigureAwait(false);
499  }
500 
502  public async Task ResetRebootState(CancellationToken cancellationToken)
503  {
504  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
505  {
506  if (!Running)
507  return;
508  var toClear = GetActiveController();
509  if (toClear != null)
510  toClear.ResetRebootState();
511  }
512  }
513 
515  public async Task Restart(bool graceful, CancellationToken cancellationToken)
516  {
517  Logger.LogTrace("Begin Restart. Graceful: {0}", graceful);
518  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
519  {
520  if (!graceful || !Running)
521  {
522  Task chatTask;
523  if (Running)
524  {
525  chatTask = Chat.SendWatchdogMessage("Manual restart triggered...", cancellationToken);
526  await TerminateNoLock(false, false, cancellationToken).ConfigureAwait(false);
527  }
528  else
529  chatTask = Task.CompletedTask;
530  await LaunchImplNoLock(true, !Running, null, cancellationToken).ConfigureAwait(false);
531  await chatTask.ConfigureAwait(false);
532  }
533 
534  var toReboot = GetActiveController();
535  if (toReboot != null)
536  {
537  if (!await toReboot.SetRebootState(Watchdog.RebootState.Restart, cancellationToken).ConfigureAwait(false))
538  Logger.LogWarning("Unable to send reboot state change event!");
539  }
540  }
541  }
542 
544  public async Task StartAsync(CancellationToken cancellationToken)
545  {
546  var reattachInfo = await reattachInfoHandler.Load(cancellationToken).ConfigureAwait(false);
547  if (!autoStart && reattachInfo == null)
548  return;
549 
550  long? adminUserId = null;
551 
552  await databaseContextFactory.UseContext(async db => adminUserId = await db.Users
553  .Where(x => x.CanonicalName == Api.Models.User.AdminName.ToUpperInvariant())
554  .Select(x => x.Id)
555  .FirstAsync(cancellationToken).ConfigureAwait(false)).ConfigureAwait(false);
556  var job = new Models.Job
557  {
558  StartedBy = new Models.User
559  {
560  Id = adminUserId.Value
561  },
562  Instance = new Models.Instance
563  {
564  Id = instance.Id
565  },
566  Description = "Instance startup watchdog launch",
567  CancelRight = (ulong)DreamDaemonRights.Shutdown,
568  CancelRightsType = RightsType.DreamDaemon
569  };
570  await jobManager.RegisterOperation(job, async (j, databaseContext, progressFunction, ct) =>
571  {
572  using (await SemaphoreSlimContext.Lock(Semaphore, ct).ConfigureAwait(false))
573  await LaunchImplNoLock(true, true, reattachInfo, ct).ConfigureAwait(false);
574  }, cancellationToken).ConfigureAwait(false);
575  }
576 
578  public async Task StopAsync(CancellationToken cancellationToken)
579  {
580  try
581  {
582  if (releaseServers && Running)
583  {
584  await StopMonitor().ConfigureAwait(false);
585 
586  var reattachInformation = CreateReattachInformation();
587  await reattachInfoHandler.Save(reattachInformation, cancellationToken).ConfigureAwait(false);
588  }
589 
590  await Terminate(false, cancellationToken).ConfigureAwait(false);
591  }
592  catch
593  {
594  releaseServers = false;
595  throw;
596  }
597  }
598 
600  public async Task Terminate(bool graceful, CancellationToken cancellationToken)
601  {
602  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
603  await TerminateNoLock(graceful, !releaseServers, cancellationToken).ConfigureAwait(false);
604  }
605 
607  public async Task HandleRestart(Version updateVersion, CancellationToken cancellationToken)
608  {
609  releaseServers = true;
610  if (Running)
611  await Chat.SendWatchdogMessage("Detaching...", cancellationToken).ConfigureAwait(false);
612  }
613  }
614 }
+
Manages the runtime of Jobs
Definition: IJobManager.cs:12
+
readonly bool autoStart
If the WatchdogBase should LaunchImplNoLock(bool, bool, WatchdogReattachInformation,...
+ +
Represents a chat command to be handled by DD
Definition: ChatCommand.cs:8
+ + +
async Task Launch(CancellationToken cancellationToken)
Start the IWatchdog
+
void RegisterCommandHandler(ICustomCommandHandler customCommandHandler)
Registers a customCommandHandler to use
+ + +
async Task LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
Launches the watchdog.
+ + +
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
Consumes EventTypes and takes the appropriate actions
+
Task< LaunchResult > LaunchResult
A Task that completes when DreamDaemon starts pumping the windows message queue after loading a ....
+ +
SemaphoreSlim Semaphore
The SemaphoreSlim for the WatchdogBase.
Definition: WatchdogBase.cs:55
+ + +
Represents a server User
Definition: User.cs:10
+
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
+
const string DMTopicEvent
Notify of an EventType
Definition: Constants.cs:46
+ +
Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured watchdog channels
Definition: Chat.cs:514
+
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+
async Task TerminateNoLock(bool graceful, bool announce, CancellationToken cancellationToken)
Implementation of Terminate(bool, CancellationToken). Does not lock Semaphore
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the ExperimentalWatchdog
+ + + +
async Task Restart(bool graceful, CancellationToken cancellationToken)
Restarts the watchdog
+
Task Save(WatchdogReattachInformation reattachInformation, CancellationToken cancellationToken)
Save some reattachInformation
+
readonly IJobManager jobManager
The IJobManager for the ExperimentalWatchdog
+
For managing connected chat services
Definition: IChat.cs:13
+ +
readonly IReattachInfoHandler reattachInfoHandler
The IReattachInfoHandler for the WatchdogBase
Definition: WatchdogBase.cs:90
+ +
Task RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
Registers a given Job and begins running it
+ +
Handles communication with a DreamDaemon IProcess
+ + +
void StartMonitor()
Call MonitorLifetimes(CancellationToken) and setup monitorCts and monitorTask.
+ +
Task monitorTask
The Task running the monitor loop
+
async Task StopAsync(CancellationToken cancellationToken)
+
DreamDaemonRights
Rights for Models.DreamDaemon
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the ExperimentalWatchdog
Definition: WatchdogBase.cs:95
+
TaskCompletionSource< object > ActiveParametersUpdated
TaskCompletionSource<TResult> that completes when ActiveLaunchParameters are changed and we are Runni...
Definition: WatchdogBase.cs:50
+
async Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+
abstract void DisposeAndNullControllers()
Call IDisposable.Dispose and null the fields for all ISessionControllers and set Running to false.
+
async Task ResetRebootState(CancellationToken cancellationToken)
Cancels pending graceful actions
+
CancellationTokenSource monitorCts
The CancellationTokenSource for the monitor loop
+
Instance(Api.Models.Instance metadata, IRepositoryManager repositoryManager, IByondManager byondManager, IDreamMaker dreamMaker, IWatchdog watchdog, IChat chat, StaticFiles.IConfiguration configuration, ICompileJobConsumer compileJobConsumer, IDatabaseContextFactory databaseContextFactory, IDmbFactory dmbFactory, IJobManager jobManager, IEventConsumer eventConsumer, IGitHubClientFactory gitHubClientFactory, ILogger< Instance > logger)
Construct an Instance
Definition: Instance.cs:112
+ + +
async Task< string > HandleChatCommand(string commandName, string arguments, Chat.User sender, CancellationToken cancellationToken)
+
abstract Task MonitorLifetimes(CancellationToken cancellationToken)
The loop that watches the watchdog
+ +
abstract ISessionController GetActiveController()
Get the active ISessionController.
+ + + +
async Task StartAsync(CancellationToken cancellationToken)
+
Constants used for communication with the DMAPI
Definition: Constants.cs:6
+ + +
async Task ChangeSettings(DreamDaemonLaunchParameters launchParameters, CancellationToken cancellationToken)
Changes the ActiveLaunchParameters. If currently Running triggers a graceful restart
+ +
const string DMResponseSuccess
Generic OK response
Definition: Constants.cs:26
+
bool releaseServers
If the servers should be released instead of shutdown
+
WatchdogBase(IChat chat, ISessionControllerFactory sessionControllerFactory, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IEventConsumer eventConsumer, IJobManager jobManager, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILogger logger, DreamDaemonLaunchParameters initialLaunchParameters, Api.Models.Instance instance, bool autoStart)
Initializes a new instance of the WatchdogBase class.
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the ExperimentalWatchdog
+ +
async Task Terminate(bool graceful, CancellationToken cancellationToken)
Stops the watchdog
+
Task< WatchdogReattachInformation > Load(CancellationToken cancellationToken)
Load a saved WatchdogReattachInformation
+
Handles Commands.ICommands that map to those defined in a IJsonTrackingContext
+
async Task NotifyOfFailedReattach(bool inactiveReattachSuccess, CancellationToken cancellationToken)
Send a chat message and log about a failed reattach operation and attempts another call to LaunchImpl...
+
async Task HandleRestart(Version updateVersion, CancellationToken cancellationToken)
Handle a restart of the server
+
async Task CheckLaunchResult(ISessionController controller, string serverName, CancellationToken cancellationToken)
Check the LaunchResult of a given controller for errors and throw a JobException if any are detected...
+ +
ILogger Logger
The ILogger for the WatchdogBase.
Definition: WatchdogBase.cs:60
+
abstract Task InitControllers(Action callBeforeRecurse, Task chatTask, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
Starts all ISessionControllers.
+
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+
readonly Api.Models.Instance instance
The Api.Models.Instance for the WatchdogBase.
Definition: WatchdogBase.cs:85
+
Task SendMessage(string message, IEnumerable< ulong > channelIds, CancellationToken cancellationToken)
Send a chat message to a given set of channelIds
Definition: Chat.cs:492
+
async Task< bool > StopMonitor()
Stops MonitorLifetimes(CancellationToken). Doesn't kill the servers
+
bool Match(DreamDaemonLaunchParameters otherParameters)
Check if we match a given set of otherParameters
+
Represents the lifetime of a IRestartHandler registration
+ +
IRestartRegistration RegisterForRestart(IRestartHandler handler)
Register a given handler to run before stopping the server for a restart
+
readonly IRestartRegistration restartRegistration
The IRestartRegistration for the ExperimentalWatchdog
+
Handles saving and loading WatchdogReattachInformation
+ +
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+ + + +
Runs and monitors the twin server controllers
Definition: IWatchdog.cs:12
+
Represents a service that may take an updated Host assembly and run it, stopping the current assembly...
+
abstract WatchdogReattachInformation CreateReattachInformation()
Create the WatchdogReattachInformation for the ISessionControllers.
+
+ + + + diff --git a/_watchdog_reattach_information_base_8cs.html b/_watchdog_reattach_information_base_8cs.html new file mode 100644 index 0000000000..d12352fd3b --- /dev/null +++ b/_watchdog_reattach_information_base_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/WatchdogReattachInformationBase.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
WatchdogReattachInformationBase.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.WatchdogReattachInformationBase
 Base class for WatchdogReattachInformation More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Models
 
+
+ + + + diff --git a/_watchdog_reattach_information_base_8cs_source.html b/_watchdog_reattach_information_base_8cs_source.html new file mode 100644 index 0000000000..6d5d0fc217 --- /dev/null +++ b/_watchdog_reattach_information_base_8cs_source.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/WatchdogReattachInformationBase.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
WatchdogReattachInformationBase.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
8  public abstract class WatchdogReattachInformationBase
9  {
13  public bool AlphaIsActive { get; set; }
14 
19 
25  {
26  AlphaIsActive = copy?.AlphaIsActive ?? throw new ArgumentNullException(nameof(copy));
27  }
28  }
29 }
WatchdogReattachInformationBase()
Construct a WatchdogReattachInformationBase
+ +
WatchdogReattachInformationBase(WatchdogReattachInformationBase copy)
Construct a WatchdogReattachInformation from a given copy
+ + +
+ + + + diff --git a/_windows_byond_installer_8cs.html b/_windows_byond_installer_8cs.html new file mode 100644 index 0000000000..3547473228 --- /dev/null +++ b/_windows_byond_installer_8cs.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Byond/WindowsByondInstaller.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
WindowsByondInstaller.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Components.Byond.WindowsByondInstaller
 IByondInstaller for windows systems More...
 
+ + + + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Byond
 
+
+ + + + diff --git a/_windows_byond_installer_8cs_source.html b/_windows_byond_installer_8cs_source.html new file mode 100644 index 0000000000..8979a5955f --- /dev/null +++ b/_windows_byond_installer_8cs_source.html @@ -0,0 +1,122 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Byond/WindowsByondInstaller.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
WindowsByondInstaller.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using System;
3 using System.Globalization;
4 using System.Text;
5 using System.Threading;
6 using System.Threading.Tasks;
8 using Tgstation.Server.Host.IO;
9 
11 {
16  {
20  const string ByondRevisionsURLTemplate = "https://secure.byond.com/download/build/{0}/{0}.{1}_byond.zip";
21 
25  const string ByondConfigDir = "byond/cfg";
26 
30  const string ByondDDConfig = "daemon.txt";
31 
35  const string ByondNoPromptTrustedMode = "trusted-check 0";
36 
40  const string ByondDXDir = "byond/directx";
41 
43  public string DreamDaemonName => "dreamdaemon.exe";
44 
46  public string DreamMakerName => "dm.exe";
47 
52 
57 
61  readonly ILogger<WindowsByondInstaller> logger;
62 
66  readonly SemaphoreSlim semaphore;
67 
72 
80  {
81  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
82  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
83  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
84 
85  semaphore = new SemaphoreSlim(1);
86  installedDirectX = false;
87  }
88 
90  public void Dispose() => semaphore.Dispose();
91 
93  public async Task CleanCache(CancellationToken cancellationToken)
94  {
95  try
96  {
97  await ioManager.DeleteDirectory(ioManager.ConcatPath(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "byond/cache"), cancellationToken).ConfigureAwait(false);
98  }
99  catch(OperationCanceledException)
100  {
101  throw;
102  }
103  catch (Exception e)
104  {
105  logger.LogWarning("Error deleting BYOND cache! Exception: {0}", e);
106  }
107  }
108 
110  public Task<byte[]> DownloadVersion(Version version, CancellationToken cancellationToken)
111  {
112  var url = String.Format(CultureInfo.InvariantCulture, ByondRevisionsURLTemplate, version.Major, version.Minor);
113 
114  return ioManager.DownloadFile(new Uri(url), cancellationToken);
115  }
116 
118  public async Task InstallByond(string path, Version version, CancellationToken cancellationToken)
119  {
120  async Task SetNoPromptTrusted()
121  {
122  var configPath = ioManager.ConcatPath(path, ByondConfigDir);
123  await ioManager.CreateDirectory(configPath, cancellationToken).ConfigureAwait(false);
124  await ioManager.WriteAllBytes(ioManager.ConcatPath(configPath, ByondDDConfig), Encoding.UTF8.GetBytes(ByondNoPromptTrustedMode), cancellationToken).ConfigureAwait(false);
125  }
126 
127  var setNoPromptTrustedModeTask = SetNoPromptTrusted();
128 
129  // after this version lummox made DD depend of directx lol
130  // but then he became amazing and not only fixed it but also gave us 30s compiles \[T]/
131  // then he readded it again so -_-
132  if (!installedDirectX)
133  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
134  if (!installedDirectX)
135  {
136  // ^check again because race conditions
137  // always install it, it's pretty fast and will do better redundancy checking than us
138  var rbdx = ioManager.ConcatPath(path, ByondDXDir);
139 
140  // noShellExecute because we aren't doing runas shennanigans
141  IProcess directXInstaller;
142  try
143  {
144  directXInstaller = processExecutor.LaunchProcess(ioManager.ConcatPath(rbdx, "DXSETUP.exe"), rbdx, "/silent", noShellExecute: true);
145  }
146  catch (Exception e)
147  {
148  throw new JobException("Unable to start DirectX installer process! Is the server running with admin privileges?", e);
149  }
150 
151  using (directXInstaller)
152  {
153  int exitCode;
154  using (cancellationToken.Register(() => directXInstaller.Terminate()))
155  exitCode = await directXInstaller.Lifetime.ConfigureAwait(false);
156  cancellationToken.ThrowIfCancellationRequested();
157 
158  if (exitCode != 0)
159  throw new JobException(String.Format(CultureInfo.InvariantCulture, "Failed to install included DirectX! Exit code: {0}", exitCode));
160  installedDirectX = true;
161  }
162  }
163 
164  await setNoPromptTrustedModeTask.ConfigureAwait(false);
165  }
166  }
167 }
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the WindowsByondInstaller
+
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
Task< byte[]> DownloadVersion(Version version, CancellationToken cancellationToken)
Download a given BYOND version
+
Task< int > Lifetime
The Task<TResult> resulting in the exit code of the process
Definition: IProcessBase.cs:14
+
readonly IProcessExecutor processExecutor
The IProcessExecutor for the WindowsByondInstaller
+
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+
readonly ILogger< WindowsByondInstaller > logger
The ILogger for the WindowsByondInstaller
+
Task< byte[]> DownloadFile(Uri url, CancellationToken cancellationToken)
Downloads a file from url
+ + +
const string ByondRevisionsURLTemplate
The URL format string for getting BYOND windows version {0}.{1} zipfile
+
Task CreateDirectory(string path, CancellationToken cancellationToken)
Create a directory at path
+ +
For downloading and installing BYOND extractions for a given system
+ + +
async Task CleanCache(CancellationToken cancellationToken)
Attempts to cleans the BYOND cache folder for the system
+
const string ByondNoPromptTrustedMode
Setting to add to ByondDDConfig to suppress an invisible user prompt for running a trusted mode ....
+
IProcess LaunchProcess(string fileName, string workingDirectory, string arguments=null, bool readOutput=false, bool readError=false, bool noShellExecute=false)
Launch a IProcess
+ +
const string ByondDDConfig
BYOND's DreamDaemon config file
+
void Terminate()
Terminates the process
+
Abstraction over a System.Diagnostics.Process
Definition: IProcess.cs:9
+
const string ByondConfigDir
Directory to byond installation configuration
+
WindowsByondInstaller(IIOManager ioManager, IProcessExecutor processExecutor, ILogger< WindowsByondInstaller > logger)
Construct a WindowsByondInstaller
+
async Task InstallByond(string path, Version version, CancellationToken cancellationToken)
Does actions necessary to get an extracted BYOND installation working
+ +
const string ByondDXDir
The directory that contains the BYOND directx redistributable
+ +
Interface for using filesystems
Definition: IIOManager.cs:11
+ + +
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+
readonly IIOManager ioManager
The IIOManager for the WindowsByondInstaller
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+ + + + +
+ + + + diff --git a/_windows_network_prompt_reaper_8cs.html b/_windows_network_prompt_reaper_8cs.html new file mode 100644 index 0000000000..93fadcef2b --- /dev/null +++ b/_windows_network_prompt_reaper_8cs.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/WindowsNetworkPromptReaper.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
WindowsNetworkPromptReaper.cs File Reference
+
+ + + + + diff --git a/_windows_network_prompt_reaper_8cs_source.html b/_windows_network_prompt_reaper_8cs_source.html new file mode 100644 index 0000000000..a381361482 --- /dev/null +++ b/_windows_network_prompt_reaper_8cs_source.html @@ -0,0 +1,118 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog/WindowsNetworkPromptReaper.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
WindowsNetworkPromptReaper.cs
+
+
+Go to the documentation of this file.
1 using BetterWin32Errors;
2 using Microsoft.Extensions.Hosting;
3 using Microsoft.Extensions.Logging;
4 using System;
5 using System.Collections.Generic;
6 using System.Linq;
7 using System.Runtime.InteropServices;
8 using System.Text;
9 using System.Threading;
10 using System.Threading.Tasks;
12 
14 {
17  {
21  const int SendMessageCount = 5;
22 
26  const int RecheckDelayMs = 250;
27 
32 
36  readonly ILogger<WindowsNetworkPromptReaper> logger;
37 
41  readonly CancellationTokenSource cancellationTokenSource;
42 
46  readonly List<IProcess> registeredProcesses;
47 
51  Task runTask;
52 
53  static bool EnumWindow(IntPtr hWnd, IntPtr lParam)
54  {
55  var gcChildhandlesList = GCHandle.FromIntPtr(lParam);
56 
57  if (gcChildhandlesList.Target == null)
58  return false;
59 
60  var childHandles = (List<IntPtr>)gcChildhandlesList.Target;
61  childHandles.Add(hWnd);
62 
63  return true;
64  }
65 
66  static List<IntPtr> GetAllChildHandles(IntPtr main)
67  {
68  var childHandles = new List<IntPtr>();
69  var gcChildhandlesList = GCHandle.Alloc(childHandles);
70  try
71  {
72  var pointerChildHandlesList = GCHandle.ToIntPtr(gcChildhandlesList);
74  NativeMethods.EnumChildWindows(main, childProc, pointerChildHandlesList);
75  }
76  finally
77  {
78  gcChildhandlesList.Free();
79  }
80 
81  return childHandles;
82  }
83 
89  public WindowsNetworkPromptReaper(IAsyncDelayer asyncDelayer, ILogger<WindowsNetworkPromptReaper> logger)
90  {
91  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
92  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
93 
94  registeredProcesses = new List<IProcess>();
95  cancellationTokenSource = new CancellationTokenSource();
96  }
97 
99  public void Dispose() => cancellationTokenSource.Dispose();
100 
101  async Task Run(CancellationToken cancellationToken)
102  {
103  logger.LogDebug("Starting network prompt reaper...");
104  try
105  {
106  while (!cancellationToken.IsCancellationRequested)
107  {
108  await asyncDelayer.Delay(TimeSpan.FromMilliseconds(RecheckDelayMs), cancellationToken).ConfigureAwait(false);
109 
110  IntPtr window;
111  int processId;
112  lock (registeredProcesses)
113  {
114  if (registeredProcesses.Count == 0)
115  continue;
116 
117  window = NativeMethods.FindWindow(null, "Network Accessibility");
118  if (window == IntPtr.Zero)
119  continue;
120 
121  // found a bitch
122  var threadId = NativeMethods.GetWindowThreadProcessId(window, out processId);
123  if (!registeredProcesses.Any(x => x.Id == processId))
124  continue; // not our bitch
125  }
126 
127  logger.LogTrace("Identified \"Network Accessibility\" window in owned process {0}", processId);
128 
129  var found = false;
130  foreach (var I in GetAllChildHandles(window))
131  {
132  const int MaxLength = 10;
133  var stringBuilder = new StringBuilder(MaxLength + 1);
134 
135  if (NativeMethods.GetWindowText(I, stringBuilder, MaxLength) == 0)
136  {
137  logger.LogWarning("Error calling GetWindowText! Exception: {0}", new Win32Exception());
138  continue;
139  }
140 
141  var windowText = stringBuilder.ToString();
142  if (windowText == "Yes")
143  {
144  // smash_button_meme.jpg
145  logger.LogTrace("Sending \"Yes\" button clicks...");
146  for (var J = 0; J < SendMessageCount; ++J)
147  {
148  const int BM_CLICK = 0x00F5;
149  var result = NativeMethods.SendMessage(I, BM_CLICK, IntPtr.Zero, IntPtr.Zero);
150  }
151 
152  found = true;
153  break;
154  }
155  }
156 
157  if (!found)
158  logger.LogDebug("Unable to find \"Yes\" button for \"Network Accessibility\" window in owned process {0}!", processId);
159  }
160  }
161  catch (OperationCanceledException)
162  {
163  logger.LogTrace("Cancelled!");
164  }
165  finally
166  {
167  logger.LogDebug("Exiting network prompt reaper...");
168  }
169  }
170 
172  public Task StartAsync(CancellationToken cancellationToken)
173  {
175  return Task.CompletedTask;
176  }
177 
179  public async Task StopAsync(CancellationToken cancellationToken)
180  {
181  logger.LogTrace("Stopping network prompt reaper...");
182  cancellationTokenSource.Cancel();
183  await runTask.ConfigureAwait(false);
184  registeredProcesses.Clear();
185  }
186 
188  public void RegisterProcess(IProcess process)
189  {
190  if (process == null)
191  throw new ArgumentNullException(nameof(process));
192 
193  lock (registeredProcesses)
194  {
195  if (registeredProcesses.Contains(process))
196  throw new InvalidOperationException("This process has already been registered for network prompt reaping!");
197  logger.LogTrace("Registering process {0}...", process.Id);
198  registeredProcesses.Add(process);
199  }
200 
201  process.Lifetime.ContinueWith(x =>
202  {
203  logger.LogTrace("Unregistering process {0}...", process.Id);
204  lock (registeredProcesses)
205  registeredProcesses.Remove(process);
206  }, TaskScheduler.Current);
207  }
208  }
209 }
+
Task< int > Lifetime
The Task<TResult> resulting in the exit code of the process
Definition: IProcessBase.cs:14
+ +
static int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount)
See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowtextw
+
const int SendMessageCount
Number of times to send the button click message. Should be at least 2 or it may fail to focus the wi...
+ + + + +
readonly List< IProcess > registeredProcesses
The list of IProcesss registered
+ +
static IntPtr FindWindow(string lpClassName, string lpWindowName)
See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-findwindoww
+
static int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam)
See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-sendmessage
+
readonly CancellationTokenSource cancellationTokenSource
The CancellationTokenSource for the WindowsNetworkPromptReaper
+
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+
delegate bool EnumWindowProc(IntPtr hwnd, IntPtr lParam)
See https://msdn.microsoft.com/en-us/library/ms633493(v=VS.85).aspx
+
Task runTask
The Task representing the lifetime of the WindowsNetworkPromptReaper
+
const int RecheckDelayMs
Check for prompts each time this amount of milliseconds pass
+
Abstraction over a System.Diagnostics.Process
Definition: IProcess.cs:9
+
Native methods used by the code
+
readonly ILogger< WindowsNetworkPromptReaper > logger
The ILogger for the WindowsNetworkPromptReaper
+ +
static int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId)
See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowthreadprocessid
+
void RegisterProcess(IProcess process)
Register a given process for network prompt reaping
+ + +
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the WindowsNetworkPromptReaper
+ +
static bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr lParam)
See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-enumchildwindows
+ +
On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort()....
+
WindowsNetworkPromptReaper(IAsyncDelayer asyncDelayer, ILogger< WindowsNetworkPromptReaper > logger)
Construct a WindowsNetworkPromptReaper
+ + + + +
+ + + + diff --git a/_windows_post_write_handler_8cs.html b/_windows_post_write_handler_8cs.html new file mode 100644 index 0000000000..0070b761f1 --- /dev/null +++ b/_windows_post_write_handler_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/WindowsPostWriteHandler.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
WindowsPostWriteHandler.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.IO.WindowsPostWriteHandler
 IPostWriteHandler for Windows systems More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.IO
 
+
+ + + + diff --git a/_windows_post_write_handler_8cs_source.html b/_windows_post_write_handler_8cs_source.html new file mode 100644 index 0000000000..2749ddab80 --- /dev/null +++ b/_windows_post_write_handler_8cs_source.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/WindowsPostWriteHandler.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
WindowsPostWriteHandler.cs
+
+
+Go to the documentation of this file.
1 using System;
2 
4 {
9  {
11  public void HandleWrite(string filePath)
12  {
13  if (filePath == null)
14  throw new ArgumentNullException(nameof(filePath));
15  }
16  }
17 }
Handles changing file modes/permissions after writing
+
IPostWriteHandler for Windows systems
+
void HandleWrite(string filePath)
For handling system specific necessities after a write
+ +
+ + + + diff --git a/_windows_symlink_factory_8cs.html b/_windows_symlink_factory_8cs.html new file mode 100644 index 0000000000..0c64d8ee31 --- /dev/null +++ b/_windows_symlink_factory_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/WindowsSymlinkFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
WindowsSymlinkFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.IO.WindowsSymlinkFactory
 ISymlinkFactory for windows systems More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.IO
 
+
+ + + + diff --git a/_windows_symlink_factory_8cs_source.html b/_windows_symlink_factory_8cs_source.html new file mode 100644 index 0000000000..6215159211 --- /dev/null +++ b/_windows_symlink_factory_8cs_source.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO/WindowsSymlinkFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
WindowsSymlinkFactory.cs
+
+
+Go to the documentation of this file.
1 using BetterWin32Errors;
2 using System;
3 using System.IO;
4 using System.Threading;
5 using System.Threading.Tasks;
6 
8 {
13  {
15  public Task CreateSymbolicLink(string targetPath, string linkPath, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
16  {
17  if (targetPath == null)
18  throw new ArgumentNullException(nameof(targetPath));
19  if (linkPath == null)
20  throw new ArgumentNullException(nameof(linkPath));
21 
22  // check if its not a file
23  var flags = File.Exists(targetPath) ? NativeMethods.CreateSymbolicLinkFlags.None : NativeMethods.CreateSymbolicLinkFlags.Directory;
24 
25  /*
26  * no don't fucking use this
27  * sure it works in SOME cases
28  * i.e. win10 1803+ and IN DEVELOPER MODE
29  * other times it throws ERROR_INVALID_PARAMETER
30  * but the fucking worst is there is some configuration of windows that accept the argument and allow the function to succeed
31  * BUT IT DOESN'T CREATE THE FUCKING LINK
32  * I AM NOT DEBUGGING THAT SHIT AGAIN AHHH
33 
34  flags |= NativeMethods.CreateSymbolicLinkFlags.AllowUnprivilegedCreate;
35  */
36 
37  cancellationToken.ThrowIfCancellationRequested();
38  if (!NativeMethods.CreateSymbolicLink(linkPath, targetPath, flags))
39  throw new Win32Exception();
40  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
41  }
42 }
+
CreateSymbolicLinkFlags
See https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-createsymboliclinka#param...
+ +
static bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, CreateSymbolicLinkFlags dwFlags)
See https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-createsymboliclinkw
+ +
Native methods used by the code
+ +
+ + + + diff --git a/_windows_system_identity_8cs.html b/_windows_system_identity_8cs.html new file mode 100644 index 0000000000..cccd247780 --- /dev/null +++ b/_windows_system_identity_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/WindowsSystemIdentity.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
WindowsSystemIdentity.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Security.WindowsSystemIdentity
 ISystemIdentity for windows systems More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Security
 
+
+ + + + diff --git a/_windows_system_identity_8cs_source.html b/_windows_system_identity_8cs_source.html new file mode 100644 index 0000000000..b262302280 --- /dev/null +++ b/_windows_system_identity_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/WindowsSystemIdentity.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
WindowsSystemIdentity.cs
+
+
+Go to the documentation of this file.
1 using System;
2 using System.DirectoryServices.AccountManagement;
3 using System.Security.Principal;
4 using System.Threading;
5 using System.Threading.Tasks;
6 
8 {
13  {
15  public string Uid => (userPrincipal?.Sid ?? identity.User).ToString();
16 
18  public string Username => userPrincipal?.Name ?? identity.Name;
19 
23  readonly WindowsIdentity identity;
24 
28  readonly UserPrincipal userPrincipal;
29 
34  public WindowsSystemIdentity(WindowsIdentity identity)
35  {
36  this.identity = identity ?? throw new ArgumentNullException(nameof(identity));
37  }
38 
43  public WindowsSystemIdentity(UserPrincipal userPrincipal)
44  {
45  this.userPrincipal = userPrincipal ?? throw new ArgumentNullException(nameof(userPrincipal));
46  }
47 
49  public void Dispose()
50  {
51  if (identity != null)
52  identity.Dispose();
53  else
54  {
55  var context = userPrincipal.Context;
56  userPrincipal.Dispose();
57  context.Dispose();
58  }
59  }
60 
63  {
64  if (identity != null)
65  {
66  // var newIdentity = (WindowsIdentity)identity.Clone(); //doesn't work because of https://github.com/dotnet/corefx/issues/31841
67  var newIdentity = new WindowsIdentity(identity.Token); // the handle is cloned internally
68 
69  return new WindowsSystemIdentity(newIdentity);
70  }
71 
72  // can't clone a UP, shouldn't be trying to anyway, cloning is for impersonation
73  throw new InvalidOperationException("Cannot clone a UserPrincipal based WindowsSystemIdentity!");
74  }
75 
77  public Task RunImpersonated(Action action, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
78  {
79  if (action == null)
80  throw new ArgumentNullException(nameof(action));
81  if (identity == null)
82  throw new InvalidOperationException("Impersonate using a UserPrincipal based WindowsSystemIdentity!");
83  WindowsIdentity.RunImpersonated(identity.AccessToken, action);
84  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
85  }
86 }
+ +
Represents a user on the current System.Runtime.InteropServices.OSPlatform
+
WindowsSystemIdentity(WindowsIdentity identity)
Construct a WindowsSystemIdentity using a WindowsIdentity
+ +
WindowsSystemIdentity(UserPrincipal userPrincipal)
Construct a WindowsSystemIdentity using a UserPrincipal
+ +
ISystemIdentity Clone()
Clone the ISystemIdentity creating another copy that must have IDisposable.Dispose called on it
+
readonly WindowsIdentity identity
The WindowsIdentity for the WindowsSystemIdentity
+ +
readonly UserPrincipal userPrincipal
The UserPrincipal for the WindowsSystemIdentity
+
Task RunImpersonated(Action action, CancellationToken cancellationToken)
Runs a given action in the context of the ISystemIdentity
+
+ + + + diff --git a/_windows_system_identity_factory_8cs.html b/_windows_system_identity_factory_8cs.html new file mode 100644 index 0000000000..0eab32d0b8 --- /dev/null +++ b/_windows_system_identity_factory_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/WindowsSystemIdentityFactory.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
WindowsSystemIdentityFactory.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Security.WindowsSystemIdentityFactory
 ISystemIdentityFactory for windows systems. Uses long running tasks due to potential networked domains More...
 
+ + + + + + + + + +

+Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Security
 
+
+ + + + diff --git a/_windows_system_identity_factory_8cs_source.html b/_windows_system_identity_factory_8cs_source.html new file mode 100644 index 0000000000..6f69e4205b --- /dev/null +++ b/_windows_system_identity_factory_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security/WindowsSystemIdentityFactory.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
WindowsSystemIdentityFactory.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using Microsoft.Win32.SafeHandles;
3 using System;
4 using System.DirectoryServices.AccountManagement;
5 using System.Security.Principal;
6 using System.Threading;
7 using System.Threading.Tasks;
9 
11 {
16  {
20  readonly ILogger<WindowsSystemIdentityFactory> logger;
21 
28  static void GetUserAndDomainName(string input, out string username, out string domainName)
29  {
30  var splits = input.Split('\\');
31  username = splits.Length > 1 ? splits[1] : splits[0];
32  domainName = splits.Length > 1 ? splits[0] : null;
33  }
34 
39  public WindowsSystemIdentityFactory(ILogger<WindowsSystemIdentityFactory> logger)
40  {
41  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
42  }
43 
45  public Task<ISystemIdentity> CreateSystemIdentity(User user, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
46  {
47  if (user == null)
48  throw new ArgumentNullException(nameof(user));
49 
50  if (user.SystemIdentifier == null)
51  throw new InvalidOperationException("User's SystemIdentifier must not be null!");
52 
53  PrincipalContext pc = null;
54  UserPrincipal principal = null;
55 
56  bool TryGetPrincipalFromContextType(ContextType contextType)
57  {
58  try
59  {
60  pc = new PrincipalContext(contextType);
61  cancellationToken.ThrowIfCancellationRequested();
62  principal = UserPrincipal.FindByIdentity(pc, user.SystemIdentifier);
63  }
64  catch (OperationCanceledException)
65  {
66  throw;
67  }
68  catch (Exception e)
69  {
70  logger.LogWarning("Error loading user for context type {0}! Exception: {1}", contextType, e);
71  }
72  finally
73  {
74  if (principal == null)
75  {
76  pc?.Dispose();
77  cancellationToken.ThrowIfCancellationRequested();
78  }
79  }
80 
81  return principal != null;
82  }
83 
84  if (!TryGetPrincipalFromContextType(ContextType.Machine) && !TryGetPrincipalFromContextType(ContextType.Domain))
85  return null;
86  return (ISystemIdentity)new WindowsSystemIdentity(principal);
87  },
88  cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
89 
91  public Task<ISystemIdentity> CreateSystemIdentity(string username, string password, CancellationToken cancellationToken) => Task.Factory.StartNew(() =>
92  {
93  if (username == null)
94  throw new ArgumentNullException(nameof(username));
95  if (password == null)
96  throw new ArgumentNullException(nameof(password));
97 
98  var originalUsername = username;
99  GetUserAndDomainName(originalUsername, out username, out var domainName);
100 
101  var res = NativeMethods.LogonUser(username, domainName, password, 3 /*LOGON32_LOGON_NETWORK*/, 0 /*LOGON32_PROVIDER_DEFAULT*/, out var token);
102  if (!res)
103  {
104  logger.LogTrace("Failed to log in username {0}!", originalUsername);
105  return null;
106  }
107 
108  logger.LogTrace("Successfully logged in username {0}!", originalUsername);
109 
110  using (var handle = new SafeAccessTokenHandle(token)) // checked internally, windows identity always duplicates the handle when constructed with a userToken
111  return (ISystemIdentity)new WindowsSystemIdentity(new WindowsIdentity(handle.DangerousGetHandle())); // https://github.com/dotnet/corefx/blob/6ed61acebe3214fcf79b4274f2bb9b55c0604a4d/src/System.Security.Principal.Windows/src/System/Security/Principal/WindowsIdentity.cs#L271
112  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current);
113  }
114 }
Task< ISystemIdentity > CreateSystemIdentity(User user, CancellationToken cancellationToken)
Create a ISystemIdentity for a given user
+ +
readonly ILogger< WindowsSystemIdentityFactory > logger
The ILogger for the WindowsSystemIdentityFactory
+
WindowsSystemIdentityFactory(ILogger< WindowsSystemIdentityFactory > logger)
Construct a WindowsSystemIdentityFactory
+
ISystemIdentityFactory for windows systems. Uses long running tasks due to potential networked domain...
+ + + + +
static void GetUserAndDomainName(string input, out string username, out string domainName)
Extract the username and domain name from a string in the format "username\\domainname"
+ + +
+ + + + diff --git a/annotated.html b/annotated.html new file mode 100644 index 0000000000..89f1306bf0 --- /dev/null +++ b/annotated.html @@ -0,0 +1,491 @@ + + + + + + + +tgstation-server: Class List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 12345678]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 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
 NClient
 NComponents
 NTests
 CAdministrationClient
 CApiClient
 CApiClientFactory
 CApiConflictExceptionOccurs when the server returns an unknown response
 CApiMismatchExceptionOccurs when the API version of the client is not compatible with the server's
 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
 NHost
 NComponents
 NConfiguration
 NConsole
 NControllers
 NCore
 NIO
 NModels
 NSecurity
 NService
 NTests
 NWatchdog
 CIServerRepresents the host
 CIServerFactoryFor creating IServers
 CNativeMethodsNative methods used by the code
 CProgramEntrypoint for the Process
 CServer
 CServerFactory
 NTests
 NInstance
 CAdministrationTest
 CInstanceManagerTest
 CIntegrationTest
 CTestingServer
 CAuthorizeAttribute
 CAutoGeneratedProgram
 CController
 CDbContext
 CIApplicationLifetime
 CIDesignTimeDbContextFactory
 CIDisposable
 CIHostedService
 CJsonConverter
 CMigration
 CModelSnapshot
 CServiceBase
+
+
+ + + + diff --git a/api.html b/api.html new file mode 100644 index 0000000000..b98aa400fc --- /dev/null +++ b/api.html @@ -0,0 +1,346 @@ + + + + + + + +tgstation-server: API + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
API
+
+
+ +

+Introduction

+

The TGS4 API is designed to be a fully realized RESTful service. Once hosted, follow the specified protocol for developing new clients or one off requests that provide full control over the server

+

Routes and their usages are defined as follows

+

[I (If Instance is required)] <Http Method> "<`Route`>" [Request Model] => <Response Model>

+

+Official Libraries

+

The TGS4 API's canonical definitions are provided as a .NET Standard library in the form of a nuget package located here: https://www.nuget.org/packages/Tgstation.Server.Api

+

An all inclusive TAP interface for using the API is also provided in this package: https://www.nuget.org/packages/Tgstation.Server.Client

+

Last off, if anything in this API doesn't seem to hold true when tested against the server, please open an issue on the repository.

+

+Interpreting C# Models

+

This document will reference the canonical C# models in the Tgstation.Server.Api.Models namespace. Note that these models are built to mirror the JSON requests and responses with a couple caveats.

+
    +
  • The first letter of every field name will/must be lowercase in JSON models
  • +
  • Fields marked 'Required' should be ignored, this is a semantic for the backing SQL database
  • +
  • Id fields must be specified when making POST requests
  • +
  • All other fields are optional and may be absent from responses or requests unless otherwise specified
  • +
+

+Headers

+

TGS4 expects this set of headers. Failure to provide them may result in 400 error responses

+
    +
  • User-Agent: The user agent product header value of the calling program
  • +
  • Accept: application/json
  • +
  • Api: Another product header value representing the version of the API to use. Currently this must be: Tgstation.Server.Api/4.0.0.0
  • +
+

For POST, PATCH, and PUT requests you must also include the content type. Currently only json is supported

+
    +
  • Content-Type: application/json
  • +
+

For requests made to any Instance based API's a header with the Instance's ID must be provided

+
    +
  • Instance: The ID of the instance being accessed
  • +
+

An Authentication header is also required. See Authentication

+

+Response Codes

+

TGS will only every return the response codes listed here

+
    +
  • 200: General OK status. Unless the HTTP DELETE verb was used to make the request (In which case the response body will be empty), the response body will contain a json model or array depending on the API called.
  • +
  • 201: Created: Returned when the request created an entity, 202 trumps this
  • +
  • 202: Accepted. Used when a response triggers a long running operation such as a Tgstation.Server.Api.Models.Job or server restart
  • +
  • 400: Bad request made. The response body will contain an Tgstation.Server.Api.Models.ErrorMessage model detailing the error
  • +
  • 401: User unauthorized. Invalid or expired credentials were provided. Check rights APIs for updates. See Authentication for details
  • +
  • 403: Usage forbidden. User tried to make a request they were not allowed to perform.
  • +
  • 404: Not found. A resource was requested that had never existed. In the case of retrieving a resource by ID, it could potentially exist in the future
  • +
  • 406: Not acceptable. Consequence of failing to provide an Accept header
  • +
  • 408: Request timeout. The client took to long to continue a request
  • +
  • 409: Conflict. Documented in the requests that use them
  • +
  • 410: Gone. Attempted to access/modify a resource that ideally should have been ready, but isn't or no longer is
  • +
  • 422: Unprocessable Entity: Used specifically when an operation that requires a server restart is unable to be performed due to the Tgstation.Server.Host.Watchdog not being present in the deployment. Should not happen with a proper server configuration. Response body contains an Tgstation.Server.Api.Models.ErrorMessage
  • +
  • 424: Failed Dependency: When a request that depends on the GitHub API fails for a reason other than rate limiting. Check server logs, usually this indicates a bad access token.
  • +
  • 426: Upgrade required: Used when the client's API version is not compatible with the server's. Response body contains an Tgstation.Server.Api.Models.ErrorMessage
  • +
  • 429: Rate limited. Used with operations that rely on GitHub.com. If a rate limit is hit for an operation this will be returned. Response will contain a Retry-After header
  • +
  • 500: Server error. Please report the request and response body to the code repository
  • +
  • 501: Not implemented. Functionality not available in the current server version
  • +
  • 503: Service unavailable. The server is either starting up or shutting down and isn't ready to respond to requests. You can try again soon and a response/lack thereof will indicate which of the two events it was
  • +
+

+Authentication

+

Every request made to TGS requires authentication. It is provided in the form of the Authorization header.

+

The first request made to TGS must be to login the user

+

POST "/" => Tgstation.Server.Api.Models.Token

+

Headers:

+
    +
  • Username: <your username>
  • +
  • Authorization:Password <your password>
  • +
+

If the provided credentials are valid and your user account is enabled you will recieve a Tgstation.Server.Api.Models.Token object

{
"bearer": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwiZXhwIjoiMTUzMzIzNjk0MSIsIm5iZiI6IjE1MzMyMzYwNDEiLCJpc3MiOiJUZ3N0YXRpb24uU2VydmVyLkhvc3QiLCJhdWQiOiJUZ3N0YXRpb24uU2VydmVyLkFwaSJ9.QWFSWNi9mgol582zaK4MQ5XDK2gZF-Nx3z9_ToHjKW4"
}

If your account is disabled, you will recieve a 403 response.

+

You may recognize the bearer value as a Json Web Token. This is a secure representation of your identity to the server. It expires after a set period of time or until your password changes. It must be present for requests made to all other APIs. To do so add the following header to your other requests

+
    +
  • Authorization:Bearer <your bearer token>
  • +
+

Continue to use this token until you begin to recieve 401 responses from the API. Then repeat the process to get a new one if your credentials are still valid

+

+Permissions

+

Almost all actions available require some level of user permissions. Which are divided into two categories:

+
    +
  • General permissions apply to a user across the entire service
  • +
  • Instance permissions apply only when interacting with a specific instance
  • +
+

Permissions are represented a a 32 bit integer in the form of bitflags. The two endpoints for retrieving these permission are:

+

GET "/Users" => Tgstation.Server.Api.Models.User I GET "/InstanceUser" => Tgstation.Server.Api.Models.InstanceUser

+

See individual documentation of each permission enum for their usage

+

+User Management

+

TGS start with one user: "Admin". The password is "ISolemlySwearToDeleteTheDataDirectory"

+

There are two types of users that can be created: Database users and system users. Database users are your plain login/password style users. System users are based on either Windows or POSIX accounts depending on the host system. They cannot be created by TGS and have to be activated by adding them to the Database similarly to a normal user using the "SystemIdentifier" field which should generally be set to their username or DOMAIN\Username in an active directory environment. These act the same as regular users with the only exception being Static Files. See that section for details.

+

New users can be created with the following method.

+

PUT "/User" Tgstation.Server.Api.Models.UserUpdate => Tgstation.Server.Api.Models.User

+

To create a regular user, populate the name and password fields. To create a system user populate the SystemIdentifier field. Users rights and enabled status can also be specified in this call. To change them later use this API.

+

POST "/User" Tgstation.Server.Api.Models.UserUpdate => Tgstation.Server.Api.Models.User

+

Passowords for database users may be changed as well using this call. The capitalization of the display name of a user may also be changed

+

+Instance User Management

+

Instance users must be created for a given instance before being manipulated. The creator of an instance starts with full permissions on it

+

I PUT "/InstanceUser" Tgstation.Server.Api.Models.InstanceUser => Tgstation.Server.Api.Models.InstanceUser

+

They can be updated with a similar POST

+

I POST "/InstanceUser" Tgstation.Server.Api.Models.InstanceUser => Tgstation.Server.Api.Models.InstanceUser

+

Unlike regular users, they can also be deleted, which prevents the user from discovering the instance

+

I DELETE "/InstanceUser/{UserId}" => OK

+

Users with the permission to modify Tgstation.Server.Api.Models.Instance objects can also gain user editing rights for any Instance. See api_instance

+

+Version

+

The versions of the TGS host can be retireved with this request

+

GET "/" => Tgstation.Server.Api.Models.ServerInformation

+

The Version model fields are based on the C# one and looks like this:

+
{
"version": "<major>.<minor>.<patch>.<revision>"
}

Other fields may be present in the Version model but should be ignored. See a description of these version numbers here.

+

+Server-wide Administrative Actions

+

You can retrieve server update information with this

+

GET "/Administration" => Tgstation.Server.Api.Models.Administration

+

If you want to perform a live update of the server use

+

POST "/Administration" Tgstation.Server.Api.Models.Administration => OK

+

With the Tgstation.Server.Api.Models.Administration.NewVersion field set

+

Any DreamDaemon servers running will persist while the server installs the new version from the official tgstation-server GitHub (If it exists)

+

If the server is otherwise acting funky and you wish to restart it, use this request:

+

DELETE "/Administration" => OK

+

+Instances

+

Instances are DreamDaemon server configurations, they live in their own directory on the disk somewhere you specify. TGS starts with no default instance, to create one use this request:

+

PUT "/Instance" Tgstation.Server.Api.Models.Instance => Tgstation.Server.Api.Models.Instance

+

This normally returns 201 BUT, in the case of attaching an existing instance, 200 will instead be returned

+

The user that creates an instance will be given full Tgstation.Server.Api.Models.InstanceUser permission. The path must not exist at the time of creation. Support for attaching instances from backups is yet to come.

+

A specific Instance may be retrieved with:

+

GET "/Instances/{InstanceID}" => Tgstation.Server.Api.Models.Instance

+

Instances start offline, regardless of what was specified during the create request. An offline instance will return 403 for all requests made to it.

+

To online or change other instance variables use the following request. Note that using this request (even with an empty object) will automatically give you the Tgstation.Server.Api.Rights.InstanceUserRights.WriteUsers right for that instance if you don't have it

+

POST "/Instance" Tgstation.Server.Api.Models.Instance => Tgstation.Server.Api.Models.Instance

+

Note that onlining an offline instance will never automatically start DreamDaemon. That must be done as a seperate step.

+

Instances can be detached which will delete all meta knowledge of the instance (Compile metadata, job metadata, repository commit metadata, Test merge metadata, etc...) but leave the files intact. That can be done with this request:

+

DELETE "/Instance/{InstanceId}" => OK

+

+Jobs

+

Some requests return Tgstation.Server.Api.Models.Job objects. These are long running tasks the server will perform asyncronously and can be polled for status.

+

Note that the job representing instance move operations must be queried and cancelled differently than others. See the documentation of Tgstation.Server.Api.Models.Instance.MoveJob for details

+

To list all jobs in an Instance use the following request

+

I GET "/Job/List" => Array of Tgstation.Server.Api.Models.Job

+

Note that the response for this request will only have the Tgstation.Server.Api.Models.Job.Id field populated

+

To get full details of active jobs use the following request:

+

I GET "/Job" => Array of Tgstation.Server.Api.Models.Job

+

To get full details of a specific job use the following request:

+

I GET "/Job/{JobId}" => Tgstation.Server.Api.Models.Job

+

To cancel a running job (If the job can be cancelled and you have sufficient rights) use the following request:

+

I DELETE "/Job/{JobId}" => OK

+

+Chat Bots

+

Each chat bot is represented by a Tgstation.Server.Api.Models.ChatBot object

+

Chat bots can be created/updated/deleted with the following requests respectively

+

I PUT "/Chat" Tgstation.Server.Api.Models.ChatBot => Tgstation.Server.Api.Models.ChatBot I POST "/Chat" Tgstation.Server.Api.Models.ChatBot => Tgstation.Server.Api.Models.ChatBot I DELETE "/Chat/{ChatBotId}" => OK

+

The Tgstation.Server.Api.Models.Internal.ChatBot.ConnectionString must differ based on what kind of chat bot you wish to create. Each Tgstation.Server.Api.Models.ChatProvider has a Tgstation.Server.Api.Models.Internal.ChatConnectionStringBuilder that dictates how to form it

+

For IRC chat bots see Tgstation.Server.Api.Models.IrcConnectionStringBuilder For Discord chat bots see Tgstation.Server.Api.Models.DiscordConnectionStringBuilder

+

A specific bot's settings may be retrieved with:

+

I GET "/Chat/{ChatBotId}" => Tgstation.Server.Api.Models.ChatBot

+

Also note that if the Tgstation.Server.Api.Models.ChatBot.Channels is present in a POST request, the list will fully replace any active channels

+

+Byond Version Management

+

To get the Byond version used for new compilations use the following request:

+

I GET "/Byond" => Tgstation.Server.Api.Models.Byond

+

To set the active Byond version:

+

I POST "/Byond" Tgstation.Server.Api.Models.Byond => Tgstation.Server.Api.Models.Byond

+

To list all installed Byond versions use the following request:

+

I GET "/Byond/List" => Array of Tgstation.Server.Api.Models.Byond

+

+Repository Management

+

To read the current repository state use the following request:

+

I GET "/Repository" => Tgstation.Server.Api.Models.Repository

+

To clone the repository if it doesn't yet exist use the following request:

+

I PUT "/Repository" => Tgstation.Server.Api.Models.Repository

+

The clone job will be represented by the Tgstation.Server.Api.Models.Repository.ActiveJob field. Specify the Tgstation.Server.Api.Models.Repository.Origin URL. Optionally specify the initial Tgstation.Server.Api.Models.Repository.Reference as a git tag or branch. Be sure to specify the authentication fields if necessary to access your repository. Will return 409 if the repository already exists or is already being cloned

+

To delete an existing repository make the following request:

+

I DELETE "/Repository" => OK

+

Modifications to the repository are done with the following request:

+

I POST "/Repository" => Tgstation.Server.Api.Models.Repository => Tgstation.Server.Api.Models.Repository

+

Each update that requires git changes creates a job specified in the Tgstation.Server.Api.Models.Repository.ActiveJob field jobs will be queued in succession. See below for POST examples.

+

+Repository Commands for Git Aliases

+

All these actions are done with the POST method

+

git pull (Only if Tgstation.Server.Api.Models.Repository.Reference is set):

{
"updateFromOrigin": true
}

git checkout <commit sha> (Unsets Tgstation.Server.Api.Models.Repository.Reference):

{
"checkoutSha": "<commit sha>"
}

git checkout -f <branch or tag> && git clean -fxd (Sets Tgstation.Server.Api.Models.Repository.Reference):

{
"reference": "<branch or tag>"
}

git fetch && git checkout -f branch && git clean -fxd && git reset –hard origin/branch (Sets Tgstation.Server.Api.Models.Repository.Reference);

{
"updateFromOrigin": true,
"reference": "branch"
}

+Test Merging

+

Any of the above POST methods can be combined with the Tgstation.Server.Api.Models.Repository.NewTestMerges field to add test merges on top of the checked out commit.

+
{
"newTestMerges": [
{
"number": 12345,
"comment": "I'm merging this for x reason"
},
{
"number": 12346,
"pullRequestRevision": "abcdef1"
}
]
}

If the server detects a set of Tgstation.Server.Api.Models.TestMergeParameters being applied that it has seen before, it'll instead attempt to checkout the commit that was created then.

+

+Unsetting Authentication

+

The repository uses the Tgstation.Server.Api.Models.Repository.AccessUser and Tgstation.Server.Api.Models.Repository.AccessToken credentials to access the remote repository if these fields are set. To unset them you must set both of them to an empty string like so

+
{
"accessUser": "",
"accessToken": ""
}

This will remove both fields from the database

+

+Compiler Handling

+

The DM compiler can run one job at a time for an Instance. Instead of using standard Tgstation.Server.Api.Models.Job.Progress it uses the Tgstation.Server.Api.Models.DreamMaker.Status field to denote it's current stage. It can be retrieved like this:

+

I GET "/DreamMaker" => Tgstation.Server.Api.Models.DreamMaker

+

This will also return the last successful Tgstation.Server.Api.Models.CompileJob as well as the Tgstation.Server.Api.Models.Internal.DreamMakerSettings.ProjectName

+

The ProjectName field can be changed with this method:

+

I POST "/DreamMaker" Tgstation.Server.Api.Models.DreamMaker => Tgstation.Server.Api.Models.DreamMaker

+

To start a compile job use the following request:

+

I PUT "/DreamMaker" Empty => Tgstation.Server.Api.Models.Job

+

The job object returned represents the compile job

+

"Empty" refers to an empty json object like so:

+
{}

The compiler endpoint is also used to read compile jobs

+

To list successful compile jobs ids use:

+

I GET "/DreamMaker/List" => Array of Tgstation.Server.Api.Models.CompileJob

+

To get a specific compile job use:

+

I GET "/DreamMaker/{CompileJobId}" => Tgstation.Server.Api.Models.CompileJob

+

+Static Files

+

Static files can be both read and written.

+

To get the contents of a static file directory use the following method

+

I GET "/Config/List/<path to directory>" => Array of Tgstation.Server.Api.Models.ConfigurationFile

+

Where the path is formatted as: directory/inner_directory/more_directories

+

If the path is empty, the root directory will be retrieved. The Tgstation.Server.Api.Models.ConfigurationFile.Content and Tgstation.Server.Api.Models.ConfigurationFile.LastReadHash fields will not be populated for this response

+

If you do not have access to list the requested directory, a 403 response will be returned. If the path actually represents a file or the directory no longer exists a 410 response will be returned.

+

To create an empty config directory use the following request

+

I PUT "/Config" Tgstation.Server.Api.Models.ConfigurationFile => Tgstation.Server.Api.Models.ConfigurationFile

+

To get the content of a static file use the following method

+

I GET "/Config/File/<path to file>" => Tgstation.Server.Api.Models.ConfigurationFile

+

410 will be returned if the path doesn't exist. Tgstation.Server.Api.Models.ConfigurationFile.Content will only be populated if the path is a file the user has access to, otherwise the other fields will be populated appropriately.

+

To create, write, and delete files use the following request

+

I POST "/Config" Tgstation.Server.Api.Models.ConfigurationFile => Tgstation.Server.Api.Models.ConfigurationFile

+

When creating a file, only Tgstation.Server.Api.Models.ConfigurationFile.Path and Tgstation.Server.Api.Models.ConfigurationFile.Content should be specified

+

If the file already exists, the Tgstation.Server.Api.Models.ConfigurationFile.LastReadHash field must also be present with the last version recieved from the server for that file. If this does not match at the time of the request, 409 will be returned, indicating the file has changed since it was last viewed by the client.

+

To delete a file set Tgstation.Server.Api.Models.ConfigurationFile.Content to null in the request.

+

To delete an empty directory use the following request

+

I DELETE "/Config" Tgstation.Server.Api.Models.ConfigurationFile => OK

+

Where the request Tgstation.Server.Api.Models.ConfigurationFile.Path is set to the directory to delete

+

+Watchdog

+

To read watchdog status use the following request:

+

I GET "/DreamDaemon" => Tgstation.Server.Api.Models.DreamDaemon

+

To update watchdog settings use the following request:

+

I POST "/DreamDaemon" => Tgstation.Server.Api.Models.DreamDaemon

+

Note that soft restart/shutdown operations cannot be cancelled via this method, they can be changed from one to another however.

+

To start the watchdog use the following request:

+

I PUT "/DreamDaemon" Empty => Tgstation.Server.Api.Models.Job

+

To restart the watchdog use the following request:

+

I PATCH "/DreamDaemon" Empty => Tgstation.Server.Api.Models.Job

+

The returned jobs represents the startup process for the watchdog

+

To stop the watchdog use the following request:

+

I DELETE "/DreamDaemon" => OK

+
+
+ + + + diff --git a/architecture.html b/architecture.html new file mode 100644 index 0000000000..66ec57fd98 --- /dev/null +++ b/architecture.html @@ -0,0 +1,291 @@ + + + + + + + +tgstation-server: Server Architecture + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Server Architecture
+
+
+ +
+ArchitectureOverview.png +
+Architecture Overview
+

+Introduction

+

This is meant to be a brief overview of the TGS4 architecture to give new coders direction on where to code and the curious some insight to their questions. Given that this document is seperate from the authorative code it may fall out of date. For clairity, please contact project maintainers.

+

+Host Watchdog

+

The host watchdog process monitors the actual server application. It exists mainly to facilitate the live update system built into it and also serves as a restart mechanism if requested. This component is generally not present in active development scenarios due to debugging overhead.

+

This consists of two parts a runner and the watchdog library. The library is the Tgstation.Server.Host.Watchdog project and the runners are the Tgstation.Server.Host.Console .NET Core project and the Tgstation.Server.Host.Service .NET Framework Windows service project

+

+Main Server

+

This is a second process spawned by the Host Watchdog which facilitates the vast majority of the code. This is the Tgstation.Server.Host project which is fundamentally an ASP.NET Core MVC web application.

+

+Server Initialization

+

The server's entrypoint is in the Tgstation.Server.Host.Program class. This class mainly determines if the Host watchdog is present and creates and runs the Tgstation.Server.Host.Server class. That class then builds an ASP.NET Core web host using the Tgstation.Server.Host.Core.Application class.

+

The Tgstation.Server.Host.Core.Application class has two methods called by the framework. First the Tgstation.Server.Host.Core.Application.ConfigureServices method sets up dependency injection of interfaces for Controllers, the Tgstation.Server.Host.Models.DatabaseContext, and the component factories of the server. The framework handles constructing these things once the application starts. Configuration is loaded from the appropriate appSettings.json into the Tgstation.Server.Host.Configuration classes for injection as well. Then Tgstation.Server.Host.Core.Application.Configure method is run which sets up the web request pipeline which currently has the following stack of handlers:

+ +

+Instance Manager Initialization

+

Once the web host starts, the Tgstation.Server.Host.Components.InstanceManager.StartAsync function is called (due to being registered as a IHostedService in Tgstation.Server.Host.Core.Application) this is the only StartAsync implementation that should be called by the framework, others should be called from this to maintain a cohesive initialization order.

+

The first thing this function does is call Tgstation.Server.Host.Models.DatabaseContext.Initialize which ensures the database is migrated, seeded, and ready to go. Then the Tgstation.Server.Host.Core.JobManager is started, which cleans up any jobs that are considered "still running" in the database. Finally all instances configured to be online are created in parallel (See Instances for onlining process) and the Tgstation.Server.Host.Core.Application is signalled to stop blocking requests with 503 responses before they are processed.

+

+Database and Context

+

The database is exposed as a series of DbSet<T> objects through Tgstation.Server.Host.Models.IDatabaseContext . Queries are performed via async LINQ expressions. Inserts, updates, and deletes are done via modifiying the DbSet<T>s and then calling Tgstation.Server.Host.Models.IDatabaseContext.Save . Do some reading on Entity Framework Core for a deeper understanding.

+

+Controllers

+

The webserver operates in an MVC style. All requests are routed through the Tgstation.Server.Host.Controllers . If a route doesn't exist as an action in a controller, a 404 response will be returned. Controllers interact with components via injecting the Tgstation.Server.Host.Components.IInstanceManager interface, access the database with the Tgstation.Server.Host.Controllers.ApiController.DatabaseContext property, and start jobs by injecting the Tgstation.Server.Host.Core.IJobManager interface.

+

+Security

+

The authentication process begins in Tgstation.Server.Host.Controllers.HomeController.CreateToken . This is where users log in. They must supply their username and password via correct Tgstation.Server.Api.ApiHeaders . The server first attempts to use these credentials to login to the system. If that succeeds it checks if the system user's UID is registered in the database. Failing either of the previous two, it tries to match the username and password to an entry in the database. If either of these methods succeeds the user is considered authenticated and a token is generated and sent back to the user. If the user is a system user, the context of their login is kept for the amount of time until their token expires + 1 minute.

+

The password hashing used for database users is the standard provided by ASP.Net Core. It utilizes PBKDF2 with HMAC-SHA256, 128-bit salt, 256-bit subkey, with 10000 iterations. Read about it here: https://andrewlock.net/exploring-the-asp-net-core-identity-passwordhasher/

+

When this token is supplied in the Authorization header of a subsequent request, it is first cryptographically validated that it was sent by the current server. The token contain's the user's ID, and, using it, the user's info is retrieved from the database and put into an Tgstation.Server.Host.Security.IAuthenticationContext

+

Nearly all exposed controller actions are decorated with a Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute . This attribute does 2 things. 1. It ensures the Tgstation.Server.Host.Security.IAuthenticationContext is valid for the request before running the action. 2. If it contains a permission flag specification, it will 403 the request if the user doesn't have one of the listed permissions.

+

+Jobs

+

Long running operations create Tgstation.Server.Host.Models.Job objects which represent information about long running tasks. These objects can be queried to find out who started them, if they've been completed, canceled, who cancelled them, their error message if any, and get their progress percentage in some cases. The job will be created and supplied by the request that started it, but active/all jobs may also be queried.

+

+Instances

+

Instances exist in two forms: Their database metadata and their actual class. The class only exists if the instance is set to be Tgstation.Server.Api.Models.Instance.Online . This is where all the actual server management code lives. A single instance is made up of individual components that work with each other through their intefaces

+

+Instance Factory

+

This is responsible for creating the components and weaving them into the final Tgstation.Server.Host.Components.Instance. This happens automatically at server startup if an instance is configured to be online

+

+Repository Manager

+

The Tgstation.Server.Host.Components.Repository.IRepositoryManager is the gatekeeper for cloning and accessing a Tgstation.Server.Host.Components.Repository.IRepository . Only one instance of a repository can be in use at a time (due to the single-threaded nature of libgit2), so the repository manager contains a semaphore wait queue which hands out the repository to only one client at a time. All repository operations (aside from cloning and deleting) are performed by the actual repository object. This includes fetching, hard resets, checkouts, synchronizing, etc. Most state put into the Tgstation.Server.Api.Models.Repository object is read directly from libgit2, exceptions being credentials and boolean settings.

+

+Byond

+

The BYOND installation setup is largely decoupled from the database. When a byond version is downloaded and installed by the Tgstation.Server.Host.Components.Byond.IByondManager it is extracted to a directory titled with it's version in the BYOND folder acompanied by a text document stating which version it is. Platform specific installation steps are handled by specific implementations of Tgstation.Server.Host.Components.Byond.IByondInstaller . When it comes time to use an executable, the manager provides a Tgstation.Server.Host.Components.Byond.IByondExecutableLock which contains absolute paths to the DreamMaker and DreamDaemon executables

+

+Compiler and Deployment

+

The compilation process is a distinct series of steps:

+
    +
  1. Retrieve necessary information from the database in Tgstation.Server.Host.Components.IInstance.CompileProcess
  2. +
  3. Choose a uniquely named folder in the Game directory for deployment
  4. +
  5. Acquire a Tgstation.Server.Host.Components.Byond.IByondExecutableLock
  6. +
  7. Build the initial Tgstation.Server.Host.Models.CompileJob object from available data (Byond version, Revision, directory, etc)
  8. +
  9. Announce the deployment through the chat bot system
  10. +
  11. Create and copy the repository to the <target folder>/A directory
  12. +
  13. Run the PreCompile hook
  14. +
  15. Auto detect or check if the configured .dme is present
  16. +
  17. Copy and apply static code modifications to the environment
  18. +
  19. Run DreamMaker on the .dme
  20. +
  21. Start a DreamDaemon instance to validate the DMAPI
  22. +
  23. Run the PostCompile hook
  24. +
  25. Copy <target folder>/A to <target folder>/B
  26. +
  27. Symlink all GameStaticFiles to both the A and B directories
  28. +
  29. Commit the Tgstation.Server.Host.Models.CompileJob to the database
  30. +
+

If any of the above steps fail, the target directory is deleted and the deployment is considered a bust. If all went well, after the Tgstation.Server.Host.Models.Job completes the new CompileJob is loaded into the instance's Tgstation.Server.Host.Components.Compiler.IDmbFactory .

+

The DmbFactory is where the Watchdog gets the Tgstation.Server.Host.Components.Compiler.IDmbProvider instances to run. Each CompileJob loaded into it is given a lock count. The latest CompileJob holds 1 lock and every DreamDaemon instance running that CompileJob holds another. Loading a new CompileJob releases the initial lock, and when all other locks are released the CompileJob's directory is deleted. Any directories in the Game folder not in use are also deleted when the Instance starts.

+

+Chat Bot System

+

The chat system is relatively simple. The Tgstation.Server.Host.Components.Chat.IChat manager creates Tgstation.Server.Host.Components.Chat.Providers.IProvider objects which do the IRC/Discord/etc messaging.

+

The relationship between providers and the manager is a bit messy at the time of this writing (returned (im)mutable classes that map ids, to ids, to ids...) but it works.

+

The few built in chat commands query the necessary components to get their results. Custom chat commands are routed to the watchdog's active server and then the response is relayed back. The message information passed to DM code is documented in the tgs_chat_user datum in the DMAPI: https://github.com/tgstation/tgstation-server/blob/master/src/DMAPI/tgs.dm#L117

+

+Static File Management

+

This is largely just a remote file explorer. Tgstation.Server.Host.Controllers send requests to Tgstation.Server.Host.Components.StaticFiles.IConfiguration with an optional Tgstation.Server.Host.Security.ISystemIdentity . If the identity is present Tgstation.Server.Host.Security.ISystemIdentity.RunImpersonated is used to do the reading/writing, otherwise it is done as normal.

+

The Tgstation.Server.Host.Components.StaticFiles.IConfiguration object is also responsible for things like generating .dme modifications, symlinking static files during deployment, and running hook scripts.

+

+Watchdog

+

This is the core of tgstation-server, the component that starts, monitors, and updates DreamDaemon.

+

At it's core, the watchdog operates using a hot/cold server setup. At any given moment there are two DreamDaemon instances running, only one of which players can see. If anything bad happens to that server, it is killed and the inactive server has its port changed to catch all the connections. If any changes need to be made to the configuration (port, security, compile job), the inactive server is killed and immediately relaunched with the new configuration. Whenever the active server reboots, the two servers change ports so as to minimize load times.

+

General chat messages and verbose logs can be used to track watchdog state.

+

That's a high level view of things, now let's get to the nitty gritty.

+

+Launch

+

First the most recent Tgstation.Server.Host.Components.Compiler.IDmbProvider is retrieved from the Tgstation.Server.Host.Components.Compiler.IDmbFactory twice, adding 2 locks.

+

This is used to launch a Tgstation.Server.Host.Components.Watchdog.ISessionController via the watchdog's Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory in the A directory of dmb providers Tgstation.Server.Host.Models.CompileJob . This will be designated the Alpha server.

+

Whenever DreamDaemon is launched by any part of the watchdog, we try to elevate its process priority to the equivalent of Windows' Above Normal

+

10 seconds are allowed to pass, then the Bravo server is launched via the same method except in the B directory. We then wait for both servers to finish their initial startup lag and then designate Alpha as the Active server and pass it to the monitor. The active server will be told to close it's port on reboot

+

If the watchdog ever enters a failure state it can't recover from, it kills both servers and reruns this process to restart.

+

+The Monitor

+

The monitor is responsible for handling every Tgstation.Server.Host.Components.Watchdog.MonitorActivationReason . It sleeps until one of these things happen. If multiple things happen at once, they are processed in their order of declaration.

+

The monitor maintains a Tgstation.Server.Host.Components.Watchdog.MonitorState which helps it make descisions on how to handle activation reasons. The Tgstation.Server.Host.Components.Watchdog.MonitorState.NextAction determines how multiple simultaneous events are handled in succession.

+

+Active Server Crashed/Exited

+

If there was a graceful shutdown scheduled, exit the watchdog

+

Otherwise, if the inactive server has critfailed or is still booting, restart the watchdog

+

Otherwise, try to set the inactive server's port to the active server port and swap their designations. Failing that, restart the watchdog.

+

Otherwise, attempt to reboot the once active now inactive server with the latest settings, failing that, mark it as critfailed.

+

Stop processing further activation reasons

+

+Inactive Server Crashed/Exited

+

Attempt to reboot the inactive server with the latest settings, failing that, mark it as critfailed.

+

+Active Server Rebooted

+

Generally, at this point, the active server's port has been closed (unless it isn't for some reason) by the DMAPI

+

If there was a graceful shutdown scheduled, exit the watchdog

+

Otherwise, if the inactive server has critfailed or is still booting, restart the watchdog

+

Otherwise, if the active server needs a new DMB, a graceful restart, or settings update, kill the active server

+

If the port isn't closed, exit this activation reason. We wanted to keep it open for a reason.

+

Try to set the inactive server's port to the active server port and swap their designations. Failing that, restart the watchdog.

+

Set the current active server to close it's port on reboot.

+

If we didnt kill the now inactive server and got here set it to NOT close it's port on reboot and try and set it's port to be the internal game port (The DMAPI and SessionController have a method for communicating a new port to open on even if it's closed)

+

Failing the above case, or if we killed the now inactive server attempt to reboot it with the latest settings and stop processing other activation reasons, failing that, mark it as critfailed

+

Otherwise, skip processing the Tgstation.Server.Host.Components.Watchdog.onitorActivationReason.InactiveServerRebooted

+

+Inactive Server Rebooted

+

Mark the inactive server as rebooting, tell it to NOT close it's port on reboot.

+

+Inactive Server Rebooted

+

Mark the inactive server as ready, tell it to close it's port on reboot.

+

+New Dmb Available or Launch Settings Changed

+

Attempt to reboot the inactive server with the latest settings, failing that, mark it as critfailed

+

+Reattaching

+

When TGS reboots for an update or via admin command it keeps the child DreamDaemon processes alive and saves state information to regain control of them when it comes back online. The saved state is entered as the Tgstation.Server.Host.Models.WatchdogReattachInformation for the instance in the database.

+

When the instance comes online again it will automatically attempt to reattach if said information is present. The information is deleted as soon as it is loaded.

+

If both servers reattached, the montor starts

+

If the active server failed to reattach, the watchdog is restarted.

+

If only the inactive server failed to reattach, it is mocked with a Tgstation.Server.Host.Components.Watchdog.DeadSessionController. Which will immediately trigger Tgstation.Server.Host.Components.Watchdog.MonitorActivationReason.InactiveServerCrashed . Then the monitor starts

+

+Communication

+

TGS => DM communication is achieved by sending packets which invoke /world/Topic() and DM can respond to those in kind. Tgstation.Server.Host.Components.EventType and other command messages are communicated to the active server via this method.

+

DM => TGS communication was initially meant to use world.Export() to access a controller and route the request to the specific instance. Due an issue with inherited handles (https://github.com/tgstation/tgstation-server/issues/71) that was causing problems but went undiagnosed for a long time, this idea was scrapped. It will soon return to replace the current implementation, however (https://github.com/tgstation/tgstation-server/issues/668).

+

DM => TGS communication currently works like so:

+
    +
  1. DM writes json to a specific file given in the initial launch json then enters a timeout sleep loop
  2. +
  3. The Host watches for and reads the json
  4. +
  5. The command is processed via the Tgstation.Server.Host.Components.Interop.ICommHandler for the DreamDaemon instance
  6. +
  7. The response is sent as a topic
  8. +
  9. DM writes the topic response into a variable
  10. +
  11. The sleep loop breaks when it reads this variable and returns the result
  12. +
+

Communication is necessary for the watchdog to flow things smoothly from a game client perspective. But realistically, due to how it works, the only absolutely required message is server reboots so it is known when to apply updates.

+

+Host Update Process

+

There are actually two processes involved in a proper TGS setup. The actual Tgstation.Server.Host .NET core application and the component that runs the Tgstation.Server.Host.Watchdog (at this time, either Tgstation.Server.Host.Service or Tgstation.Server.Host.Console). The directory structure of the setup is like so:

+

/app_directory

    +
  • /lib +
  • +
  • Host.Watchdog executable files
  • +
+

The Host.Watchdog launches the Host with a designated path in the /lib folder. When the Host process wants to update, it extracts the new Host package to this directory and exits with code 1. The watchdog then attempts to rename the current /lib/Default directory to something unique, rename the update directory to /lib/Default and the launch the new Host process.

+

The Host.Watchdog serves an additional purpose of automatically restarting the the Host in the case of a fatal crash (which should never happen, but the additional layer of safety is nice).

+
+
+ + + + diff --git a/bc_s.png b/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/bdwn.png b/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + + + + + + +tgstation-server: AuthorizeAttribute Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
AuthorizeAttribute Class Reference
+
+
+
+Inheritance diagram for AuthorizeAttribute:
+
+
+ + +Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute + +
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_authorize_attribute.png b/class_authorize_attribute.png new file mode 100644 index 0000000000000000000000000000000000000000..ab6cb8c9d2fc715cf27c3de38aaef06453c66864 GIT binary patch literal 1017 zcmeAS@N?(olHy`uVBq!ia0y~yU~~nt12~w0rHI4#4m5o=KEk+*LifSfzX;6_5ZrX zP6yVeZk+R}XoL59?{0VFhW^6lqaWAo+hp;*YO6S--Kn!;%d>M$OvKr`x2ElgX0$st zS4^J!{`C8oyy|6V$=ua>m$~zl?#;ck{QFnb!&n*Z>eCpRzKy6U2L;Z3HN5(tpBg9&T1Mu&)RNy z%z(#|=T81~%YPG(9=1A=*?%ilaf#2q4L6*!y=B}DX1fQ?dfEN#nbpigQ8DYX*FLxT zSNi{{gy*HEpU?eu%JNQ~Ic5LBlid&?1#e&hAN1RCT;2O+TA-&XV2o`5(Lgj3P4} VJ1*FWoC4-k22WQ%mvv4FO#t19=v)8* literal 0 HcmV?d00001 diff --git a/class_auto_generated_program-members.html b/class_auto_generated_program-members.html new file mode 100644 index 0000000000..f54017b6ee --- /dev/null +++ b/class_auto_generated_program-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
AutoGeneratedProgram Member List
+
+
+ +

This is the complete list of members for AutoGeneratedProgram, including all inherited members.

+ + + + + + + +
Main(string[] args)AutoGeneratedProgramprivatestatic
Main(string[] args)AutoGeneratedProgramprivatestatic
Main(string[] args)AutoGeneratedProgramprivatestatic
Main(string[] args)AutoGeneratedProgramprivatestatic
Main(string[] args)AutoGeneratedProgramprivatestatic
Main(string[] args)AutoGeneratedProgramprivatestatic
+ + + + diff --git a/class_auto_generated_program.html b/class_auto_generated_program.html new file mode 100644 index 0000000000..87c594f628 --- /dev/null +++ b/class_auto_generated_program.html @@ -0,0 +1,301 @@ + + + + + + + +tgstation-server: AutoGeneratedProgram Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
AutoGeneratedProgram Class Reference
+
+
+ + + + + + + + + + + + + + +

+Static Private Member Functions

static void Main (string[] args)
 
static void Main (string[] args)
 
static void Main (string[] args)
 
static void Main (string[] args)
 
static void Main (string[] args)
 
static void Main (string[] args)
 
+

Detailed Description

+
+

Definition at line 4 of file Tgstation.Server.Api.Tests.Program.cs.

+

Member Function Documentation

+ +

◆ Main() [1/6]

+ +
+
+ + + + + +
+ + + + + + + + +
static void AutoGeneratedProgram.Main (string [] args)
+
+staticprivate
+
+ +

Definition at line 4 of file Tgstation.Server.Api.Tests.Program.cs.

+ +

References Main().

+ +

Referenced by Main().

+ +
+
+ +

◆ Main() [2/6]

+ +
+
+ + + + + +
+ + + + + + + + +
static void AutoGeneratedProgram.Main (string [] args)
+
+staticprivate
+
+ +

Definition at line 4 of file Tgstation.Server.Tests.Program.cs.

+ +

References Main().

+ +

Referenced by Main().

+ +
+
+ +

◆ Main() [3/6]

+ +
+
+ + + + + +
+ + + + + + + + +
static void AutoGeneratedProgram.Main (string [] args)
+
+staticprivate
+
+ +

Definition at line 4 of file Tgstation.Server.Host.Watchdog.Tests.Program.cs.

+ +

References Main().

+ +

Referenced by Main().

+ +
+
+ +

◆ Main() [4/6]

+ +
+
+ + + + + +
+ + + + + + + + +
static void AutoGeneratedProgram.Main (string [] args)
+
+staticprivate
+
+ +

Definition at line 4 of file Tgstation.Server.Host.Tests.Program.cs.

+ +

References Main().

+ +

Referenced by Main().

+ +
+
+ +

◆ Main() [5/6]

+ +
+
+ + + + + +
+ + + + + + + + +
static void AutoGeneratedProgram.Main (string [] args)
+
+staticprivate
+
+ +

Definition at line 4 of file Tgstation.Server.Host.Console.Tests.Program.cs.

+ +

References Main().

+ +

Referenced by Main().

+ +
+
+ +

◆ Main() [6/6]

+ +
+
+ + + + + +
+ + + + + + + + +
static void AutoGeneratedProgram.Main (string [] args)
+
+staticprivate
+
+ +

Definition at line 4 of file Tgstation.Server.Client.Tests.Program.cs.

+ +

References Main().

+ +

Referenced by Main().

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/class_controller.html b/class_controller.html new file mode 100644 index 0000000000..5b8b581f90 --- /dev/null +++ b/class_controller.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: Controller Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Controller Class Reference
+
+
+
+Inheritance diagram for Controller:
+
+
+ + +Tgstation.Server.Host.Controllers.ApiController +Tgstation.Server.Host.Controllers.HomeController +Tgstation.Server.Host.Controllers.ModelController< TModel > + +
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_controller.png b/class_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..b1106dae4076861e0de83dd80c5ca20b0e9c78b6 GIT binary patch literal 2123 zcmcIldr(tX9!_=9iUy_y5k+LWO$7mY2;~t-5RppcS%hUHCc#SOAqc%FC=jy94%iI@ zdQ*8fDQJTtFQGglk02}wgh$ZSigE!hgvdg|hNqB_>dS>o9-x3^{>9?S4f#?HO|81KGqIs1a-I{YEhCx2S;w!<%=+ zhU3gigmHt7AHVh=vxa&9E5<3&$D;5--Wy~C%)uXbj$A}K@lk-S1lUcv_F}G^Di*8v@?=FgqBdk ziAnu@k`q%(MqAi1juFnnac6;MA#%)17Et#ALTJPRHO_IFk!hCB`#6yKz*@*v2cMd`eklrL=`F%sZY)Sgc<8=(5Eo9VOafULB9&HW%) z)xQo+*{l@gItLDy0j2t>z6;Y zrQ9VR5OjI0x;2ycvxbMN7y);~U6c`EiQ}Nc<$H)ZWj0)o8`oqove;A96m>C*e_^Dp zpBf4&;2J@LCD+p3Y#?;G$(uRzLVJW|h|s*2!C?wF%raxQldN$ab>GO| zd}Z7!qE<)4s#2}VXprc8+}@jka`C-)&3tyznzuNwMER`mE@Zp;_=4+|j8pRG(af1J z?Yf%pm9L~_5WAjeoDQdbvWn(P58$x_cRd z31p@at(+xtnfEXQi`s&OKVZhSyWVjlv{XU85tb=%90<<;%mBP%DR%TX*{P$8Orv!T z#|*Ug%xi6Z1q}KHFlgHJgbd&{Z-CwI#r}Vu#!Z4I90$$i$8Nr3jPcn|b3XcG2jP`3 z@c!bJ*baZOW9Ol~^iocY1qXAC(0D9qTNMt7!9h<+09^4Npd!nA70k#MQt}k7mN8uC z3$tBWE%=Qqn#&dQ3PiS$ykVBJc~YMM6LetGX2gsG>yK{^g{} zghG!wbEb=C)Vg=em#az9(!(9r>AO>_H9uU{V8r6^rKAMH?6?8Mo~+C#I1X6w(EntuwvP>C+VXa z3$Yb>8xX-t2CUH1@eFdVW%ab4F&OPQ| z_nY4nOH#*|gv6>URu-?TQOPFV5qTXRR?nWzj{`PoifdrP%FFDnX5Jbs(97t!ymUCkiN6T+T` zW-o_cQXAP^>Pj`5s;l%E`rt*Y@Sa(^*UTcQ+9st1NTi~oA$ zh7mnCp{8tK&C+;Pdr-quGg`z*>be1CZ z2}=$sl8m{NQCa5^q4xr + + + + + + +tgstation-server: DbContext Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
DbContext Class Reference
+
+
+
+Inheritance diagram for DbContext:
+
+
+ + +Tgstation.Server.Host.Models.DatabaseContext< TParentContext > + +
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_db_context.png b/class_db_context.png new file mode 100644 index 0000000000000000000000000000000000000000..72dcd863e0fb75c3d22109771a4f10269cad994b GIT binary patch literal 1045 zcmeAS@N?(olHy`uVBq!ia0y~yU~B=h12~w0q~7jNIY3Gxz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-op8-g`W$6?lc2)((4kc9vmdQd4O`e<#2bZukB&<_f zc;~+^=WHPc_xPfT{kwhUy-#ri9E-C>3rt@?mNRUAuM8seW;TQB_2_~BrTms9kE+fv_y z-V|;LTh7vOf03-w_m=Ci7rC|-FTZ>K?B#o651My&u{79wdoggRp}8%H$-zLAQDMgH zmLM-rFHKdRhVIX-6Bv$66kg7q>gI$n2>9SJW(uX!XXGaY zWUsycZ1uG$ecsSXLY`epsvbcGnvRoz!8u99$7{lpgjp?{{!C7p_xJhR_3PG!^2}Aq zJa%bK{+@q%NB7-2`rR=1prf(pyP3;_RgJL-gZUv;M3dRUTyD9SN?e=bc_8v6WLjQPBS`-gwp2UO#dFmBA%>t@JW(> zOJUX71lOSUzc2IVR(5o@6wXs;pIw~%XeY;J%~!0m_$BpZs@2cff36m^;$;`gaWh{0 zE+zWgZMj5i_m~THe|JrhJGxmR?9La9TUx#Mx4pdmGHv_2l&+Z9FZZVS$4WmA<+N+s z`@>&#j+}emr$2I=Pv44{Zf;2w^;bP3{{LcOiPXcCxxX5Z%{92sTDK$LrDC7(y!)KR zobN8HAHVo>u0gDWdU@0PkAM7L1i$?~>uGU;x`&qX-#L3E9)9uLaee08JMaFk-QrQS zrakrd`CgNltmyfFjU>~v*1vOlw|dFk3(-Yy*I&zc`6lRf(AHbq9%otfs2#ufP4}>c zea{1x67l&es*}EyRdN2ks_5CNvUg&l`j)fWAlCewg(^V$uX<3E3hQJc70nq_6g+{M m%9HDv+QMs5lcTbEAIl5;^GzzW3eN`SVFpiEKbLh*2~7Y?X3RDK literal 0 HcmV?d00001 diff --git a/class_i_application_lifetime.html b/class_i_application_lifetime.html new file mode 100644 index 0000000000..26bd0b6747 --- /dev/null +++ b/class_i_application_lifetime.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: IApplicationLifetime Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
IApplicationLifetime Class Reference
+
+
+
+Inheritance diagram for IApplicationLifetime:
+
+
+ + +Tgstation.Server.Host.Core.Tests.TestApplication.MockApplicationLifetime + +
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_i_application_lifetime.png b/class_i_application_lifetime.png new file mode 100644 index 0000000000000000000000000000000000000000..af76b2c1fb8053b318fa42c29f3fbd4193cf563a GIT binary patch literal 1118 zcmeAS@N?(olHy`uVBq!ia0y~yU|a`e2XHV0$+9Dfr9es|z$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-op+0`VRya?A<;9g-KI>1fdc<@6?dKB{Kb@4^{Qa)| z_welOvebgNr`vvB-NR6`Zq9>Mx6HTKNE!Y%w7<3f+zAQ0j#+XI=ck&-sAuf@ozeC| z?&&^c?l~*9%vYG_!QrR8*ZJSC(`aM( zA5vTPbXJ5{^18g867OW!u9dj?Dg3uwTiev;s27aaEBbeOFgNU90Q1G1hfF`_i|$~! zqfx-PBM|04^BB#gB3_!R>`Xfr?PG9akQ3R#u;;~V?FvQ+V5Gk z_<*WsUP!^xzy6adZ=Jtg?;QWqf@ji_nPrD^_~?EyPn(hV z@u!_k!QDezE98%F-S_R<@!d!BCNFN;H@n2wcHO1GJ>LUo2b#rumHfT1oGta2O!40@ zjXKja3T`r*vfrDvFfBaK6cpt?1y6N1^iR5#%(Lt0jFxQ|XC+7S^6MQxWMm9kZsNyDr$mI8B9jll|`3PgA-W zuNzd!#g^Cl9-hx`I$_$R$~M(=g}#2Typ7is^d5gFGrcij+Yg>_JI<{RS6FW?^DN^% zn$V_QZE#U^e)20lo+y#@**oJFX?hpOuRmV;jKDths|#9cvC5p|Ag`S zE{Q(#yxw)u_jUfZU9Pz?H&U^V^LnAG{rrbBV!NyUKe}sr{3@%xX4~rB*{@!RzguVa zl0Sc1UFUJ#e`_W0>9qYUJAF0f{E^?5t61}bHWckD_i0=9&rZ|%7OQQ!NyQA_+N6YY z9(;S(EZ|PrdL(gc?xd=vdySpL|7FehOn + + + + + + +tgstation-server: IDesignTimeDbContextFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
IDesignTimeDbContextFactory Class Reference
+
+
+
+Inheritance diagram for IDesignTimeDbContextFactory:
+
+
+ + +Tgstation.Server.Host.Models.Migrations.MySqlDesignTimeDbContextFactory +Tgstation.Server.Host.Models.Migrations.SqlServerDesignTimeDbContextFactory + +
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_i_design_time_db_context_factory.png b/class_i_design_time_db_context_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..3191e8cb11a01033a002b942d5af0b293f82ad8c GIT binary patch literal 1777 zcmchWYfzF|7{^~D%~aOh%x)I58*ZzcmSsAkrQ1r0imP}-yJ)(WBxDygZzVQaDwRdB zUdTI9nwThfBatjCC8fZkz&Bl6Gey))FeP(ecBlQ?%zoH2bI$XB&UrqZ=l{$v+s}6o z+-Qvv003}|rw0xIU|dN18N#4*J+hMyg;jn&f#`*W1xUUdQzzuMUxC!$TPPIjXZInX z)G!|B8vsB>y7jy(a4P^9kTD)V2PWyMid59wHp|c}6;*c^HuNLQ&z2s4Ta4O+O6{Uw zOmhIoh#!q7u}m5jV|~LNSVhjqN09OO0J89Fu`giYaPWwFi618}IXC69lEyK>YirQ^ z&Mtbs?eYp@7+KgS9S9SR5524<=$Qz^4;D9wD{0PMgy@mURp!n-%2=TuYv8A?sOxD0kFxC=0<`t zmfhs-R?uKnyB6F|Y8cSoj*{EdVT~hz&r4^vtCVqP3flThUY)zi>R$c=5dRTdYFX)O z@|Neg(c(}VZ!@S64t~3&38Cxbq4`IPPz4t-7?{{vEL5&Ao-}Qq=y}BjGFJNy(8fZ^ zzvztnn)P4a|D75D+hS)5z#;$>VJipnf~?o%mV048^g|P&>dVEiVmS{m5CVPc7#2ck z(%;oa>nc|P|D<|46aQ0sQS|10QvRbi@3WSY^$gDi=^Ijp^s~4KF`uXAM) z3I#9`q|GgUz-*(9Sy~fCyPG=wh?-g4G0<0BkLuPOO9?`MBNg%RL@)zgMtbr4gv8$_Y-12{GR4EmCCs$C z5s!Os$

ksJuUNvNC8p9aX70w46N{MS#gIP0Q2LW4o-q{flThhqY$aYpGg0cn?fl zF*7tRv#G)}QI8X{L)Hx?%k8xDqY66*j8$b?RYvs88HyEMTt;Yf@7>)_L7OnAD+$Wm zti~ul42?Tt9iAtR-VrOeLd`YYuza`oj#R9PnM+)0d*`%uYAAg;jvsSM9gsQ2!yQ1- z7kl9{nS;*TNbz5MLtyus-;FuJjH3%v*b{{)MZGP@;Z(HsndL#5TIQ7G(W_#gJKJvO ziuZZUgvhR)5Y3d+idF=>UH5#IqNyNkpvXOwbe(=C$}3z>-;DG3nteSgf7a+6?%N~L zP~VNF7L#0BeRy$l&~#8To0>#M6t!uq84Aw)x`i$-2d(n_*sODEJ1L=h-n}2(J#II1 zAR%F-sA8mRz;*JP032ZxO3I8n803WDCAeU{#0owp`e4q7!D9n)SS`Ff(dv`m19vY3 z!!hrABT>*BzC7;*vNG~$*N*2SA&&G$ncSb&VjOB!$7@9WsbN33M&xg;sXQ9ngBHUR zYLt|FUi12OvlL>`Q~N3tCNvtFl%tTs;8CeVALjV zDwuWdwQU%#BDDGUx&@E6>c*T>=P6nC>CQz(_HfyF-44+58?07c?jA_)qu z2+Kb2d03Q>w$q-CT#Z?CIZEn9y~@nsKwzwa=*jGW=!wzM zV*$}qeh{Ju57Coz9-`-9a$#a2tJ6p7&{4KU<$%3bz#`<_PoGrZbIz + + + + + + +tgstation-server: IDisposable Class Reference + + + + + + + + + +

+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
IDisposable Class Reference
+
+
+
+Inheritance diagram for IDisposable:
+
+
+ + +Tgstation.Server.Client.IApiClient +Tgstation.Server.Client.IHttpClient +Tgstation.Server.Client.IServerClient +Tgstation.Server.Host.Components.Byond.IByondExecutableLock +Tgstation.Server.Host.Components.Byond.IByondManager +Tgstation.Server.Host.Components.Byond.WindowsByondInstaller +Tgstation.Server.Host.Components.Chat.IChat +Tgstation.Server.Host.Components.Chat.IJsonTrackingContext +Tgstation.Server.Host.Components.Chat.Providers.IProvider +Tgstation.Server.Host.Components.Compiler.ICompileJobConsumer +Tgstation.Server.Host.Components.IDmbProvider +Tgstation.Server.Host.Components.IInstance +Tgstation.Server.Host.Components.InstanceManager +Tgstation.Server.Host.Components.Interop.ICommContext +Tgstation.Server.Host.Components.Repository.IRepository +Tgstation.Server.Host.Components.Repository.IRepositoryManager +Tgstation.Server.Host.Components.StaticFiles.IConfiguration +Tgstation.Server.Host.Components.Watchdog.IWatchdog +Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper +Tgstation.Server.Host.Core.IProcessBase +Tgstation.Server.Host.Core.IRestartRegistration +Tgstation.Server.Host.Core.JobHandler +Tgstation.Server.Host.Core.JobManager +Tgstation.Server.Host.Core.SemaphoreSlimContext +Tgstation.Server.Host.Security.AuthenticationContextFactory +Tgstation.Server.Host.Security.IAuthenticationContext +Tgstation.Server.Host.Security.IdentityCache +Tgstation.Server.Host.Security.IdentityCacheObject +Tgstation.Server.Host.Security.ISystemIdentity + +
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_i_disposable.png b/class_i_disposable.png new file mode 100644 index 0000000000000000000000000000000000000000..5706a1fa0980269c1c530fca4293991c377e1869 GIT binary patch literal 24790 zcmeHw2~?BU)^_jpT1Oz%Dpdp;iBhXV6%}Mk3tCJq(AEmd6lWZO7?3d`xhjyfh}h5? zH4Ij(Tt$h3m;f160*Eo7B18ld2}6VsLJ|TAgycVO0EZ6t8`gjSf2~{Aa#h}Dc;9o* z-uv0le)jgeul#+@W-gfd&O7gzp*F7n=ACz@kl%Ud-9yu-fGg9fG$-(%55D^H+YLse z5&ZQRf0MV# z0wo*YNqZ!y4dxi_>!<&N@=kbp)Fw$!ZQu;l#Y4R%2DgRgB|0 zyp2J3OL~o-Pty$a)QCnS?)t1T^o;r|#^LQ&Bi#4$wip$696d&j_l;6w;@I$``WVh$ zhh66l|XNo{uTH$@Z-62 z&ufy896fqeA%y*WZu@a6_0;sKQ+-yi|LCI+I*jHai{5|#_(SOboZbtrA2VJ51@8UX zoe#|{XU=?gKl!V#KH2D#di3aL3&2ZfKZag<5b|{q`jSsTJ;53 zaqVYt16Q-qC0`iF9f@(nJv;4K@qFAu2>Y?)+Yq%lXcy{dD2rz-uKmi) zl8~By8X@jGq=ipiy!>QopA;0{0pU3~1LFhc;{tc@eSNk<=KI%ET0loyaxOR@oqJMR0y?wr< zL^OhR2dm>z2tBbIud)YCsluk{i~+RadBclqeRJq+mnI#r>so^apD*IBLjl_ar+7O! z#r39Btkh5QIZbCL=qliZ=iP|;zW{sDpN1L52`Aj^W#`c;>vBEiUr@sa9^X#dg=hD% zuqy(tIfZdj7911>TEX)YUZ_jFVqz)4#=!~rf?Si9yKtVbd6{j-tnO$j&S}gsxh(uf z)PB#VN*nB$f#%{+3w%U;`?NIX{T*RdZZ|f3PeNGpshCtIUbM8RAutiwjGKHB2|B@q zx%?`mG}dMpM|lnAG=pSrmUeAeDI_5qBU(F4&so6Y8aq)3SF1r&KYp*&83GtI>E8*DVYP zt+S$;; zKkp)emDzFj(&bD0&*r_?*Q}TUoGIb-|82kdKRc(t_VFs5ch05#SN5O1RPYbnP=@!H zlrJa_PhLBo(9>>Pv;JusFl|%Nnsm!Mz9o|yxQL975tT82tzt$0CQ6no8i%>6{;s3N zZlQAQ5v3Ccz43^2UKm&#)(jW>rm% zWvJOyf>lx|{pqC=+k;p^&FA`i`%o%2SV8~Sx-_JKu6s1NOIy^j_ke2_RBnp?{lcU(y z7+<${&huQ)$ciawLNbw;b^H`UT$?tlVAtU`7RR{75hBhAdY|A0t4?=q6>5=g65NHwwTy$n`lt9ne)lJY9dvd-C%Gz? zp}s+>=0oeJJ(1{ovl5}RA74!9deUEB7Xng~P~kUTci_=)u!F)q>=s+A8tIs_c$-aO zOF#a5aJco|vS}l?FAfuyp-$EGQV$QWr&KA=1T=#^@Va3yDms~P>IvSkYm-b4L$3Ua z(s;vM$;QqDPWiFL0{~*|4vXN2_aE@ERp*fP|_k^SUsoJKC{98p0xpa@PlyyW-+`6U_s&l^nPzKoO z_7ZrWl}2?BF5HE^(<;A6Usog_5%rN>e2R{8JS3ra*$!e>dG>>m7ELh;E@B^kG%Wwg zMXJy@oyy;D7*cxPfMUjHWZ~kQ!8aM-t@y?R(Y%%8p_oQD+IsD**e4DjWh`Ev7Zahx zI1rvygAd44_ih#qY5w(~!ivBGo^W)41b3V#T3CMphMA|)VGO-ba&43&e$w_scBegL{}Dd;Fu$6)&Tobaxj%n%VWupGuP3V;GmgyL zlpH$}Z(Fb}-0*!)%{D(tviQpRVJFY0qOti zU_%HX1BAcEuVL`V?e&DOp(j_Rg01uRxbA?qbR#(h{xe~$2!gEep%u|Qd zowOj@k?18in5rG*1gBi%Rgavzz4peoI>@`A=P^zSi57Oi zzZmT8QbMBs#h=kO7Oy*|HeAerxr|ENjufT+5+K4y^pPhvTxj%RC4xM_-6QntD_uPRoT5P$#bR@I9`pbd}64wQ@%O_v46 zaPOW4vaJKXo#Fx6ffvVK~p-5Fr;tGS!j<;;5_ zyT1)eU{;9uP1jo=`qS&JiUO|r_7`I4mO6R3O~NX6*tdl%me;m7sk)M^ zaAU&*mNJ+Esd~g{OfS!Q*oKi#TM@5tsb<#=PO(QC4$}a7HbtO(kP{s|A^n;xO?h7a zg;c}#h>P%Lc}di8(fjPy7yVa9xU;Y;8xlU}4EF?bZwsK?zc~ptk+VUhtdJ$$aHG;O zQ$VCtRo5%XSqTbVCc}rtN!0(iu2HrNy5)ij-P9tlXbS5h1V5!dq4Ix%09E=AMnSX> zt7Nr;m6ZEnT6~d3YGSjST`KeGewQiu-JLkQ=XFlk;cG$cc^-N{DOZ3tubD$FAt9C( zY?dYjRy3%d9Ox)-U4@k3H9OB$J#Ne4D~u5#P)@W&Ny2qr0oQ97k4Lt6#`ErM?fEA6Oxi z%$sK;NWkx%k7DnT2rS*n=$BQey6d5PHAa z&0M1&dDw9yg=jh`A!K1(Sup1{Eb3vxqBfE-U$2o{rv-b@#SvsS%KjdNZW;vZ80nKn zCFn_P_Nc~pe9RM^NKD~LeOODAMe!K-itv#Sd5zG0^&xpw@Pls0`LN8|qseN|Li0L! z^ke1>Y{{0C7+*XKCuZsPl4Y|fo%t_L0Dd6~KF&VOjKuY><;hMayjyOo7}Op)65Wu3 z|BRxa1EB_-iG(O!_jY8N66G(h>sZZ~U5Iw_G%HSeEC;tlhn9+HE4g$JF<;>zSd21! z3q`Ozm^5V(if}Z2dcZlbRaR~b2~VD3$OHcXR`3^{1~G+ik5|oak5?_I{C9)%J-NZe zO~oGlhMA(XqZhUz^~X^vIJBP@@jOQ0lMAJXJ&ZTfhT_Tj9{^)wX15B&nOUh?QO%c> z%+Zo)^1vm4K`e4Mty>5R4n9Nx^K}qu9O>9{JI2SI?S*D~m6~G-yKGZ(^&q<_l}234 zXW=JICEC`Rc$;Rin#dN#G>1z&Rt<0IOIWg+Yjg-nflfdJtUe<-X@XE5D!wUY7KJ>H zt8(&Y&5voT2Ok&A9R}cW_}yo9L|_{hhjk%0bucQ|F~irZrnb@ol0Mob{`!CvQwiwy1#x9s+@J)Qb1^gopA;v;h8=%3T4 zF9R!WyY;1kv7f&(FlO*C`LmUmUL>`!&6LSKBm4PWyJ7E8@o*1JY9WTTSM$M-Vt@e` zr5|$Pb^Sez#W5T3Cnwyx63_=lt!Ysn$s=Ph#xQ$LR!zuYJlCI+WwJP{35yGsv}{fY zGDh8Dz&Q;a)7~w&hMv-e=Tq!4Zw^j>y&)h2xe2AhLK_wUQoHRnTUNi_0GAObQaigi zT+jZKWm#1XE|o=w6FFWg)zL1yoU&s1Rr;KA{B`vOO6LV==|FT`x(Zc2ii$-QyBfM4 zK-cm?)LIBdtut_gO#BVBR~=B;`ud=e)K4~Q8Bi)`aD{N?{D?{Nw*g$VgCf{P<4dml z(LsnaggC`HZYClTP=^Q3Ug}wTCvPkdBy`V7zvk)wJ++wscACd^-~sCJ?4|w5UtEvi zegr*vlJ~@;{cg?XWxi+l=r^?Ys6REziNi8zKSc%B#6K=L(iBlo@5fim=b~cjWtivn z3UE*$DwkLen3wZg$f%f(M8ht=VuE|YI+W44*8HzT`1>@tLDz;-t%Od9!dq{|7_dI; zUGB>7838BUdI zuE`kuZ#bce&Yk7?I?IB%l$YVnjYmt$%M$Q{7=)32gzhTDTQlI{LE-~uq9wOBDo^g- zrBkuiunjmZIgUJRr+d+|b1m)2DYIPZ^^wXOHhY|vjkohT?kKN92uf`rXRx{xZPS>+ z7o;n@t%Kmv@jRKmmz~7#5p_%oQpSr3Vzz&R`-rY&`MU-^SOL__+>QcrJEpY+Uw`Eo z|5@k?0}U1w(pZqdtEm_k(DKc&o=RGjW^;l=ZGnkHbPU$SAg;rBmj655MjY8kH z@Z<%%X^%a!s>GSl>TWwc1btTaxQ)HEI|{J~qNuiz)t^&LG`;73P)6cR(Db;+ujmDcv7%ZB?QXFm`lJI3&7C-Ke zi*y+4{&X05Px-_F6FL@S7;;9``aovm18DmNoi{M!7Ek2Px?LRYqeAsRFlwgzLw)bw z===(-22~Uk>C42|>8LUDZZZ~v%^H_L&i{n&WRrE#(&Y~BWfWgynQn~+^X?FZQCnDo63R=O|yt&yyq*P zSCT|Lhl?HU%gnk|GJnU|I*VG>Q@w3=CkL|99+*{9ctK|`P#e{ySrdBF>U48J{`#n!|xsCldJxZT39T@;-quC$qyRqG+03*eo?b3XW zF<Ou&p=D44KBWWj zDXV$u)7_QdjVEbq!7n)FcP9HQIQ^IXO{~BhW!;zdM|@AxKIl{{VRH1w0s$^#l+u|} zz`tdM4kzNzAqscJwaC_E(%rb_>KTk6L@gKMrVNcBQ=4hZ)H-xoE5r;RJr4?sAY1Y$ z^nsd>!5?@$?nGfh=Gt%fM}>u75tfYp4hz|5j_^DYGlxbGCRFopW_K=wI5Oe_Nz&I& zlRQZ{br_0jo9r{ZD3y|}(^8UnmosF$MaiWLUW}Y`Kjv||OUHDUBXnOthK43FgC7X1 zQfN;XRryddyZCCyp%F#9eG^$P*7zz?^Qk(yYMt{B%k6yFNUY)fUblxlYgtzuZ5 z$~+TK!C&kL!P)4>Yc$t>2Man970{NRXrrq8RM?Sg%a|fSUK58P4|7+Rp%fLWd(&W(AJ|VGjyy*%uVM$iIN$9XFE^+1Wdx9e#0apou1;q_tOJY{sy|ylG)fFgbV9Cu5~hn z3!P{+r!k>v%-Z&eVj4?cq$pP}Jq6EmIE^qqo>Wl0o0@2Sw+$x61(xRegicL#;K}<3 z%WRbFw$VEU%;5(J9SJI$;V}~upg`l$lPIzfu9$t;Q`CcXe>k>{8;7IlH$z5j4H79` z&0M#)CsH#en2arHLRnM(PWL02=J!nx{3>0dAR*3#bW?J_2)cB8r;_3NLhYD#y1k5u^3DzlqjJ*5~u9a)Jy}UT_D4AArciWz!=*v zWOrtn${cOL761h{ZVOxV6Skl&gw=ywY@iA(JYKZNj{|C4tFv%VCTd*mZ?ADVGWrGD z;r`qJM{oS0W_JCgmpk?vNl|(+bU}zHX5A~Bc#k=56SoQ!V%&G}xnuG@8Cip+?hz1F zbb*IcH9N85Z9M+_7O1tSoa#d!$hf4et)xWb4_TZQd(}<8Pk-c^V^f;tezJgE1QAq5 z9rYEHh>R8W(n7*|`3cDRQ2KMNSENlCLC?mvnNz7z(a-Rw5W0gelOIq3hqwq`-j*o! z+LGwLB|Q1N8ek~`U@5-Ll;?|h!$YFR)gU663R^Cd)Zg}3)Sumz-E*IkLc;4u+n>7F zIiWb8LeDY{&MB(spwPGrPdGS6SfB#^3+fbC;|sbjH&(}$?EzK&-l|VCzF#{I!UX1t zYRg*zNW`|XvcA;=s!Isn$B^wEG-*3J#{OBRFI;M(1z{2v98nwaNur}sB{Y$@RY2sS z|HYhS{8~%m0!eGdfRjnBV+uNxMED`cn%PE>OXmvT>RT5pZ|?S z=zpOOMZcXP-`aNTYz)OCp7ngJM#Pr1*K8bjTn2(K{$QDB@VY`nZ@akAn-!(@5kGB0#__}uw+h1! zHoNJT;#{b?i18TGSIXyR5u8z~0tiM4(-OnB7S6@JgkDK4%*aIvwl~5R6Kq0DgT-FW zhrG^1v5|D<<|Lm~282pZ@0p+y5=9@4>zsB`I(TZ&uRE_269Y?O7UauE4K8*rRu-s5$rxlf^Z!?@OpQ@fpEaH1-<)+fxB z_|**CRT$1$PGgu;lRhp}@F~Agw)CU29FdqVBg#eJD{{m#=B;=nk zbxZyfkmWC`?M>8f>vl25kP*5mkV|t);I&*V1w=*k!g^w)A7`T0)C4E&%K_;OA5NJN z1sjk(xY6rP3GW)26bOErO2$niY_h63a?9? zBe6680YL;f1LDVChicmxv7thZM}BY`VCG(93~in$BNN@$Q}jn5Z@K}B zN(Zp7(Q+3|Y{3LAcfcpi|HV*?-v-(KyrDAgf<-8UDFED^j7ocz2IHPL@)%D{MaCVB z<2Db~t@Bl5M0e<$#zDJ2NA}B3y4}1 zJ97gFoRn851x|6Vv=w#>q;i;XCpq>Gal~aYDjLER^{HCpg53nKKbB9po z9TL5-Kq#FhENFt)VIEwdXXisL6#A>0Y%0BOPHTFiBE2C)7%TL3ieSx9TBL7H*S;8X z=h6^Krrc-|PrWmELgWmn!D70o8fVE&7CGteOs34KC9`sob3?6psDH0hk` zUeh_H{zm6SsJOh(Q_$cwT;sFcJ5-8S`|eYRd`U6YfPu!Lb4`uX)rhlk$C?OkRA)hP;TX;_vgP(Or?Pz=IN9J22 zx%OTnwq0nk?%P7Yp5nBy=&?%pJUE9zrF+FwJRU<4E_Sj~b){u9;PXi==Z6~Y!z+-M zBe_3o$G&zQ~#JBq&-2*kqv-(JB`S~?@L0|x@h@j z_`xBUqS2#pkS5dZ4){8J08mg4P4&^Y(HW3u-0SPHknjyjJV!zcO1T3g z4$GoI7Lq>$B9aMY2wy`G(jSPSQXoqCM}q=V8$#DUr<;g#h**E|6k^j)ztW52yg{>& z-KGE6Ekyq{JgLuv6}&35oj0+UGa#q-YlHj^h}K?sdreu^QrF>edPKj}4xiUiHtMW1 zw$ju%t@Rg_fPGNG2r5@yXguIgu`c+D_6k#8?LS+S^ogb_!xt{fudUcTN|^~#=_+wr zqJd9rT^oq@j|kYLDcTnNLYhfW2YUQ(?XrxFxa%qe%*Y{3>Ty9E(; zz4p;w{bS;u5{KBKo?#8h#&hYUn(zjH;^^>|~d0F>E8dY^ZPPzfvH7g5jSjV0w+! z!jJ>d+ny20Cb)T*3JAaAe#a6hXOqH${wA8C4FAwhY-y(uSria3vqAz?0p572%a4fs zN03Qkd_u=kjDU~7eG7=4LK)Y`17zD{QQpY0Wr4(WQF48T|qNZ7XFbZ0UIKetW7&jpM0kzkFzUWDFnzxf_IsH+zUefR$qzLwsV z9-o}TIh1n1Mxw9w7)dUx&pMqkVPx*`A}N=JbIw!?KqCkaFlNxb4{UiufPY|&9$l96 z3TrOYgPbRPg~Ls=-hPd2|MDeDD~3ZYXb1pi@qr|68$JH}S3xh~1{CzL4(T*V>9n!^ zrh|BIlJkug3ujCfF>&$>tH!0hEbWPkyUOCE{7MO&@#M? zafOiJsr^}4Gzv8J0W-o@+(R<#y`HkID#ekf?Pe&Qq60t@2HDW83Blla;#RnUV`BoD zf={!)2u2gty=)lr(B#c*fpZ)SI~M#2^TC;5KG>cqc_V^0+WzH?CM3%fWeA0Q%hB;% zO}vWA#RC??1$18Nj?2pI4UO!Km-@7_rFCrCu$_P8=o#CvL{9&de5Iy2 zU$+GUkNgvfqe$biWqrE}yC>upO29uAyV{bNXNKHC!;5nr@gH6zg;2nw!HnpTnySQ+ z29_40NB%|SKINOq2S@PjBTtf7nt-NIr6;fZUMKMdFq1W>A=$vMaA|NAvqYAPFg8oF zO3+vm7_^+Yn19#bp+DuJ&WfG)T<*)&2SRMK8&Cb-q_)0qMuvv@ChV*=!OonABkdMN z=zxxX_HYr$9QR$E`V9C;!eVM}{Aft|*g2}vLWZGP#OK9=v&fvGEWb+s3ABhs?Le6` z04YhlAK+en%=fAf3#t|um8`>j%GlrbWnUesOf))Fa;k)D96q4dInkO~xopj6QvN*W z3bj=3(FJ@1;2JlC$9iOWv$lDtgTwR6OYFn#lsXvZdrss5K8(8A*bAc)iGj|^%Xk9P z19;&sT!(&EXv$LoCT_C3ci0C%SU@O=hv@yVCe@W2G#DcjAMK03j&n-qHh&^E!^SC& z71BrLU46YXsLKLD@O}W_X3KBptdVuq$bp6tG!hL3;6Pg^=+hjRF>bL>IAzo&7Szy= z02v9#(A^jUcP!#W?Q`F1Uh6r0DRCocg3oTP8;Q>c0MS|ode=#IM&J71R|FStt)d;7 zR~R!ct`fC0NG}6A=uGvkHVp-hPAS_tmLS!qcI96d*r-1*C*Vdus}BeX7+~>5hVx(_ zd5d{`F8?Tsa)-0W5!pV4>q45QZ~><+jx6M=L2C>$pC6#RZDtug_H4of_}C*mr?{+V zY7Uynn}WaO!N1#_**@z1N2(9TwB!^+jolhz9%8;Jhm(O?bM(tvvzFn5k2t5ZxI=0g zX>CNQG!UZsC+IBp4JRhH`JceuAFmrI+h~&(?Z(q(CJn}^GAfE_&sOoeLRv6Xy0B1) zNr|9A0BO|6qe$6#-F32rX4W|Z^uUXsO^}>6FP89V5s|*3p(z*xN@W9m;Yk=hw zzsMgX@Y-siwRcH|wDvTZFd={Fc2Y^}aV&<%Z){;KScK06_#GY1zE4M9jlYMp=AWmi zKTu~D!d#$C(87mRee>xtMVc$JcTiikzFU_c;Mn^mg%~+$W*y$FD1}K6{H$)G4=tdg z!amxil;keSC3z%orQm_O@A@pC30AYT8x#8sDlI?yR3-%ikvhQS6m{n##9)YnBc2HL zbP8o}k}vZmy-ybZBKs%TVeI%4>>iB*@(kBdPOg4!KW6y$%KENOf28olxLg!@pWCrJ51L>je zz5-zXDHQTYZ(+F)$xW>=*E^;pB6mJBDl*!G1+H(bQb9cbgv%K{2dTS5^+ zcK|xA`JiKQxtLU_0n)-vIyp={f1i2xjv5SlsL2ea@`RS(1u!Y`s*y@rQA}&FBS_P- z&{+ymF)1-L_toTxp<{dy>+uEmL3VK zF=VXQsoK{o2#6_O5|wB&dSBDO02n_+Jc^r4NXe0@@h5X48j zQ)5K+-M<+cOZKuvh7jSa7Jl z0G|f|a)pmxSm8~<7vv8nnf9rVOseFp<=IXAnhMPpK}Su>5B^f-{=NWX-5>G&1md~I zNZTy!5I(!p+N8b^gEXsO@Hl|-6Qonp0b>95r(g~U8MtI)byAq!2_!2zpvJRT1tfu5 zjkaGfnPue)pe)O+xGGHMr`r4X7E5VT?h;(Y%n1uS2g~9k*DXIW(Y6(S;B-fM|3>v> zF6+nJ;i7K746;nB^<@6d8xD@CANs(P+D|lS|so^ zJ=5S`$qDXh2%Rl7Y^6Gl`Rs2yzGN_acNYi;aF&e(bR(E4J$Cz~VuV1|V#i!A6WWCb4P&#)@t|dqz%Cm56_fDt zjPqea=L)a(y7iQCQi(BJ7ml|GgJ~^aonnOgUxT_l<_^j~&0sXmIZflLtM_Q# z=b**`!nm8*tt)5 zz6$Y!6)28x0x-4DCgl-*YYQMfk)7Giq`H`_mhjO}p3us`yb34@v+l-# zSzSR?S8>K~SZb&K^8P@YG)EN14)^biKVIcp(}5oyx>4}AdHJKUGy(;pe8RLrzznue zn!)J`_TZYDxHf$EI7yur@BT1X$})s)ZCV|Wv_{bQfpC<;z*MIUmH~bhIu1m@rS*g@ zYc8s545xG+I;e{gZFOvUkUMS@gu1m7jlBixR?)B>rR#<{HmP>a^YrQYkoePLg-_`6 z(RF#g@H_^kW6wm=(0H{;I|i$_Z}o~;nH$y80<+q+kkZoeHCf#UPG{42YZKk)*Ez%9 zpbD;ibobDZ?bvqTP%&}isTyl{$VcFFRvq9}T7w2+! zZrU`sXnumGTLQd1{tP(p19V_H4K*8F|HN_#I7|NiWa*u?7F$o;C{r4CQNz#?@e4dq z9MeFvY4GUp!Kf)^q;oX1tsnD}&>JbzN3iy3P!~mzIY}x52|~bl7li|aEB{oJ_MbPL zYrx?TYP0&0Hf+COdz|Fa`*y8~(q|R1Oy_nS_lhq!AEC>Eb`fNcAsGXYK6cMDK79}G z%(KXh#VJ$|tO4r1-!V%pmnrjqLFoPtMHxEiPzo56SgmWcMAe z?R_$yV&gh;>{h!QTmp8^k$7BeSi`Tt6d0;&w&@$2TM34k=G6-Sp^-gfAsZ@WUs$A?L3rpkuUWg8aFFCxi_y&F*W(oD$o>8*EH6z~TGUy>@A9pzezU78)h=49w zFU`a|gCTO)5IWPyyQy%;;?vMHiUU!3K-AhAADa*+o-e%yqu*I>d%an*_6|K>6$Af?f$R_XES;vJqxHe_y2Px#NecbgL4|+Eqnzwc1r!>bS}n!F zN3xnkN`1||ZW^RKa);XnI*6yQLtY>2(VL_oS>B<$ zS3)`nwFt|KeA!VE_C$yk&BU$~spivGL^tRUs8a^N6HUhwK+~254w}PfW7tAwEYrNn zfGJuyUz%@QmlATEVWV1d83*SmzY~cp8BUZ=CzC>U8W`@90Y>vdtn$}uhHJJ(Z?K!K zbd!yC;5%Eb8<<`rZpRQhcgVXH0%7^Xnk_EB31_8OyH(X)mI>8mp~bV6qIgd+fwO%j zy)m;;>ZM-~N=11%kCi0tp2bk(p3`h-&XWF9WOB?zX&cnFqTNs`b>9`!0EsSu3m=+i zcZQg@-U1Rf7}$T+hTd8m(hA=a-lF#&BE-cCd+v7iRO})iYC@@oCrA~{iY8zF5J-p) zjtF4L)paDF(0mRu-Y1m~&_riOPS8NRwo+yr)4Fkz94n%#lNypHV%bTEE`AxyBqJ}} z8{EQ5nej^DZqFgr7K+}~e^}w|;n?*WYkYa<3E6_%c+&_aMn~)XookNCHu9(0QUo_< zVx5Ns|3s;>psmNuR+c9VHyJKvZSXeDsFYrlYQ$r{k=5IxlM72+;G(g3B(KVkQ36Xp1R_a{4QW`u$SM!9U2M zCPI(Cx4Wnzjo*+^!#Q(Lcitu4j{?j9Y#|;bQa8MU)A^+|1SSyzfa-Rbut1TOqQKP2 zs4mF;AUS|`D+^2>L%SB$2*dW6T4w{D+#l>o3LnZg4G8?S8w?0kWX2L6_G!f)-^ng0 zzLXtqlsv0KXKS9eI0&d{J2q2NX-%ZyO@dSxxUDesRX!Egzu43_yU)o=G&{+?E*Bo? z%sg=u{~X@D5Y$L^i7WQG-)HZjbSfZ{m^e=o*L;nt_p{3w4?XqPd>MB%>*?{5*1^CC zj5ljkP9SH{`j-$ReiUd>stu4!K$>BHsDj1-){owMsY|#>_+1N<*H(SxB6O&=dTB*m zGvzII1-x$f>H&8Wb0(M+;W8=^T;W#KKw5>GYenq$2VeBk*u*eAQ18f2oJJ5k->U?L zP7pa+5Z49?VlhFZf;n~BNy~Vez|%nOgqK&|z%21nGz@!1`J`q+x^LgQi#fwT@Xvd^ z)}uZf8`oP*q5rW(ZBKc0eyl6BjtaPUC_P4-=C$aKcsZAGwI3Qs5}>+`!EeI4FulOK z#E^i_%A6FhH6v!2mdDhtZMY2f`VS%9OTEi~p2Ekt`uFL$JT%w6PB1$h-Buy1`$W2V z*fB+WhceNv3dRXL-kY2Nu}o(QLw@80#YiaGE{`yQi9Eqf@2Z@kvmJyIZH(y139Im- zpZSZtFn)AuuH&}cVEV|Lk!WuQ%L}`%ry<))5rw?7|F+;dO66pVDKnHzuk1?6tI&1@TM_gE4n91JHI7D-_{fAK(b637$LQ! zUuca6{YFz=Dwou9uTPE$!@M-2URThk@nC2uE~bTA3tv`%k-g&*5%jeUr3+ip=qNrw z{%YWaVkWlY3>Yw@1VeC5a=F&EvC + + + + + + +tgstation-server: IHostedService Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
IHostedService Class Reference
+
+
+
+Inheritance diagram for IHostedService:
+
+
+ + +Tgstation.Server.Host.Components.Byond.IByondManager +Tgstation.Server.Host.Components.Chat.IChat +Tgstation.Server.Host.Components.Compiler.ICompileJobConsumer +Tgstation.Server.Host.Components.IInstance +Tgstation.Server.Host.Components.IInstanceFactory +Tgstation.Server.Host.Components.InstanceManager +Tgstation.Server.Host.Components.StaticFiles.IConfiguration +Tgstation.Server.Host.Components.Watchdog.IWatchdog +Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper +Tgstation.Server.Host.Core.IJobManager + +
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_i_hosted_service.png b/class_i_hosted_service.png new file mode 100644 index 0000000000000000000000000000000000000000..552b2d0ac42b470804a40f1905e81f2891eecc6f GIT binary patch literal 9021 zcmeHNd010ty2r5{K?OolgRBikur9<6*#fCV)S!aZ3L+$kXca*qN+4`WRhCo~+Mwbn zgi>v}Es~%jAcRCAkU=b<2tk%a5->mrAs~B}`yG%jcV_Ipf84qEd1mrFc?gGdPR{wx z`+I-O%UAoocIhuRU96*{qmSFYB~S#ruuUo!VBDzR0N$OO;1g;K94=;Drk(1%a#41)A}r#?u8!CtF08 zVeZsx!*{1UF7E4NeZ)9KjW5zuAF6sV5Mj8j`xELltzjHysQ!6I2g|=g%YEIx!iI=V z+Sf*=MYxo>;LWVVszy`Eherrpu9_@#vnX*Mkc;{k=LhFT?R41DmXvR(%x>u?sX}tw zAGHNDWm|l-PclPjMS9+5VofNmKRRH>@}60apgu+S!{)FP9_X=c<4#fWoe#}qu9bR? z-y^DQ!fbdQ1)T^sDbv9{DgPxb$hhPq@ia-*Z_PuzN&{cy`R|XlG7O<$M$LQ#S6x~}*u*@Dmd+_K|ZXg?f0_(5xpjD`S=`Aw$l-3)rC~Vk6 z&yX8dpeKvfQ%hE_BvgkuFs$naNaWG6^KQgGr5a;?gr0B&tovlea%J3oeS}TjwNiEN zt?w17laG_>OIe$E8O#TZmBy)-p6X_<5pEN8{zMDF4GJ3&<~NFp;@tM62Lg$)JzjudpkgKNQbGROvNh8=<>`B*w(jPw+?b)n zu}R#>BJiZE;7OCtEa49?l^sK8_#q0rx}#j#a6^%EVT}F~LH||B27_HJyW#=av57Iq z@!M$ia;JckCcG(j-nSWsmF)hXUR5uU8UBE%!s~CsSq}R)e}dyQ5{N&W*>U}0+DBoQhvmhL9pTAbz{1o5pr zWUSX7Y|@!iG~CElfT4HWcCswC%~hgzUtu*U&Z7182S6En>y->nBmo>@_Wu7s*B`-q z$`xT(fB)tE_4NlYY?$#t*x**z8AA&OmXdJ@Kn1$-yMGUk!d~XZj&f37y)rPFESo<)r z#cNr?=m~f9dasC73lVAu(+)-nHd?fRSwwMm)7KpvBC#>e~VX(59g7ZTq%02%P`$ z^%Fmy@VlP>f&X~CJD?n^AO4B#@<;Xm9(q$TU|A>pPWxT&{p87Y^>?t$JMLB*ByW<_ z{e6Su2YKDNhFt-K?zh=|!``TtdLv|=D|E_Hgr&{c^fi0~t7QQ{T(IY8P~C8R-*t=~z>8c!vC*G2eFO&PXb``Vea8*T@M752@~G@1KI6;%!SjiCH~W zaic{auqj=YHI83Jh(?6eg69bddH%uiZ+Y?6kIJehvn!6P%O}k&vFLF269O$yxPVao6h6NG`1WGa=n-Jkz zw)B*}o&Z6(LtHMN=J9=bGX)d2@RGE9u2JIn+vUnlU1d*OtkRK>Zm$C!28%FQ_j)11 zz*uos;Bs!HHQ8q!f5uhwB$=5~F+G)OOR#I2V1AAFVd3vn^jGbs$3tyNicQF|i!kna zKh*ZMrF97;Z5bm81u>|ou-CP1md-?U6ql5kJi04(@&n)HOiU5-5eslh!dhOMb>?vn z%B;%OM<*o36AxEj*S6wEl1MB@%+UK zeLpML>dl8d&dInfrato zZTL$73ToKlRrKTcb2nc{S?z+*#8^%&oxxdXuEMw!6X=k5_q}vadc?zjqv*Ht?Qc=E z@sChcA@HV$@=LYDt+)|BRGI=NO^`_hbj@VTwVmrJ7~Uc~V2ad-XsMss@0dIWT9swY z%}f@C?e%l1{lMEZ+zI(ite6Qe{+)d5$tZO+k1rFDrDLr@U&_9p5l@#kxDElwAT9E5 zq$8s~;qW%0feS%G7Q@87p9gYhj?#QRaJRqE^F@0YIrFh(+dM};ZvV68g=XmE& zWt}7o@f6*`E{c-)6CF|HU5ZYh8G6XFMBzBIT#*6`ly-Gob$LJcEPuy6zUyAMtO^h& zW*v_twP~tkp#2rhwm*EIa^Y(v=1I@J1Sx;k#RhwH$|(m@o3(2a zBy(FXGHRER9r=uvP+#r?^ytKDQ{n% zEOzU&H^@i#b06VG@+PneuibGeg2+~-b4&`Sy$mjvf0N)?jQSD8Gd?OjEtRW^sIMJ9 z!;Qfl^4?P$x4k36%D_D43c^z4NJ!kPA*The;9pdnvG}v2L7%26bu84Leyc!Qv(L+_ zvEN9vO$dFp5%kq8kkt*m%j(j*m|67Z1dAAb1OY$mhN`b}Nz#JCTMNsb-sY8c)9QgR zJ4@!J@hjDOtLqj*eL$2#W~5iYWqXC$kH+Ba?m8GQc_tHd`Co3E$1M4vcHhd-L&|XuKdp@P(0Y&IFZG4;p#B+p4_C#C$?9S z8GVqvD@7PkMS!n#2hR#fwBRLhxHH$SPx(cN!cg5{RGphQF+|b;$8r&*v25x7r$MfN zfU_+#bBq;$S6$3wVg0Z4Y^^Q$W+^oUtg%!347gbIe}LYl3ZcP0Z0Zs)A?vlrch4=k zDvjHV8|kGSrirvl2$NiYqZlZGptfI{lv{a2R8|4m@#FtCLVu9amA*ft)6cIAH}4|T zZb<{sJ-G}9k_tVOgeRBCt`*^4RY<9zL({mg{vF_a=X7_St%c_+`AM6lp#S^GOnv{9RS z(5oT^#*z9RVwgm3G_ zQ!6r3LB0@s=*YEV%W12m$-aKvNNS0dxE{P%!z~CxYGlk1GwTj%&K+g^Pty!;`}7)~clP`eAEL3E2hOBh zaOJ}2?C~M`((wud#nOW2I6+Zlj+YadCA=MQFW}fk2WA9gp8AJQ6Z?Em1}+V*EY@^` z>ytvg1)fCy>^S||gm>*omIKgyOrZHP98tQs&7#tbUX;~js2dAfuoLUV;S-t8szuag znvwI|o>55b1g%WM?)HX}7W< zeAy24qsD)suuSD-t#UvT;3gEC)F@xagISZ17GkcQ9!v`|_pmaUMDri9g{0tL^7IX-WiSC&I{*_z)^tXR3w z+;Uueuxmclki!(}AGtRw_~%mEz0Sp+8eGe(-w8yf;;yiuK5)Ygs}#rVcxm5gTztDr zXLl42CYE;$(#Jww+b4EbQaYKS>U|LeO-Q4iRN#Uzm_zibp4ztMgWaJH9P|y5y@N$6o$z?_HOvF$OV*wSOshl$3p)9uer) z*Bvg=F)SDyThs*$TIGdcaJ-Cda5gix!BcvMs^=y{Y!RsFT391h3KGQ#t9tL)*D1OJ ziu_Vphx(3zcKa$!&v`TJfSHH0*~!6E@1XtODD7Wxu4Rb*N8#ZFDvBIx(iF$H<$sOT zf(hTg$%aA#H zY05WFg`p1mapPTh)yswY#E0h0Emoy=d^%DTK5yWRvFvcg7c>Z3>Gdz$+78iV#tJ5_ zpcSL56wdfo@1awJMiEttjkfbsU|F^uG`$ig*UkjovA^8cwV#!eh15c>?FLLNV<+Ca z&yT1mwaBlmKweZct6jj58K2+N;Oo}~c(5h80b`giS0sk6DX1ZH?G4xn_a|78jzYrG z=2=`eXqp=#lSW6HZ5$;+%y=0D9UU((I4b9Un;qStHh|^_jcU#v0lQ$qv&nx;g-8wB qwk1wJKiYMVm< + + + + + + +tgstation-server: JsonConverter Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
JsonConverter Class Reference
+
+
+
+Inheritance diagram for JsonConverter:
+
+
+ + +Tgstation.Server.Host.Components.Chat.Commands.BoolConverter + +
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_json_converter.png b/class_json_converter.png new file mode 100644 index 0000000000000000000000000000000000000000..5bf62aa0b0215b8afe3435ddcfc50a6300a87921 GIT binary patch literal 1036 zcmeAS@N?(olHy`uVBq!ia0y~yU~B=h12~w0q~7jNIY3Gxz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opy+WUXv zW-})q{>-NqCo>)wu3XEiD0eyIhqsp|tLD-t?3@Y=ACy!WEQEy^=5TT{oNHlWNYB%I zSWxuxC;Nx4?KhJ0wH|K%cj}BY(}C|lX2jh5l=|F$d34^h?iZ_1OV3{NY3~-L1H3!; zxBUIJXKT>pE1}zO2kbt{vO_vw@u17?Yr3m*uRK>e@V8=mNr~s7ZL|7SQtlhNHvBG3 z=F}}Xy|+#&v9991@vnbE*Iw4WJocx%gyjRfMr4Y0z;2%4qBE;@Rd19#x0a*8KCe!V z;m?1N+nkshj1?IV%$&gRz{i83Kn?2jN-q!1r3y=@++nCFmSbRSkO!)neq33HVTX_q zLrtX>2RFk!p!RYnMy%RlKF47?3DW-?Tjmtk<;z(<|8s4Es^$b0eWxZBOJO0ElQSnM zcmjjhvuK%@$5a1FJEK1S%&rKN_tE#f)O9H*XV3KY2v_v=aty)93F@BX4~8$a>Gm7h1CAGg|7 zzjRyAcI)ldYo=^(s}0p(Xt!eT_g$|AN^`e<49uMUz(n!(ms1A0&gJ> z_lwGYXK`-p`BJk24{cMZ)?698%&|1>yHo9zyx&aU+JdLozIi2(`Zw1oeQBus<3I7d zoBz((HE;L)YZk=^PF{ZdcC=K&znmb9+TK|Hd>eRwY|8$LGIIwZ6{`@y%6RM zdbNJB0)P6UY|hoU12gzkW?Z;-K-Tldk=c(6{A2HOTGnyqcC7cFk+bg7MT7s{LeJKP zzkIQ(#Z~86##|2zUw7vZIb}vdVd+W#e{Fps^X^Rd{43Mz1*2a;dz$FNhq^YAPO+jQu$+ hpUXU%vsrpSLw~#PgkM{`RsypwgQu&X%Q~loCIA{J(^&uj literal 0 HcmV?d00001 diff --git a/class_migration.html b/class_migration.html new file mode 100644 index 0000000000..3e4e636a39 --- /dev/null +++ b/class_migration.html @@ -0,0 +1,101 @@ + + + + + + + +tgstation-server: Migration Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Migration Class Reference
+
+
+
+Inheritance diagram for Migration:
+
+
+ + +Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity +Tgstation.Server.Host.Models.Migrations.MSFixRevInfoIndex +Tgstation.Server.Host.Models.Migrations.MSInitialCreate +Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup +Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired +Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments +Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity +Tgstation.Server.Host.Models.Migrations.MYFixRevInfoIndex +Tgstation.Server.Host.Models.Migrations.MYInitialCreate +Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup +Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired +Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments + +
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_migration.png b/class_migration.png new file mode 100644 index 0000000000000000000000000000000000000000..2b2ecf3b03528fb2ca1cc6ba06cf414f09444a0d GIT binary patch literal 11783 zcmeI2c~n!^+Qz-wDz%D5jkC~d)fz-<5m1IutH7-k5y>HCt^*=dA|Nv%*V;NnCDm4} z45Fe8CqP7o03pPoDOJRX2nZnw1WA~Z03jrh>Dvcz=Terxrt1?+PI$zh-U zywCgo-hFEKF6X(km(89wZQ9%~|G8t&v}rTQ)22GtMGixo5a#le{Y(U>he`;E=`}M z$DHmA>S`a}I@qG5UO$ZeF7&VwYPmw%a_={1b!2_!;`^O>1}z=e(3tp)V%(6;))lDE zWxkH=qL0hb{A8`8qrspoG8(m5eQnh{s&$oT$fmtuwBE&JSW66v_CC8OFlez*ynEWea@_w4_Rw6QZ-3$xX=;9 z;N6wPFftbye9&Pcnlb$ygHONBGx*2!Gs3Rb8^8G1v|}g9AAETGljKWF7Ju~lzc%e~ zH2C0~4~>kbzq7;%``xsE95+IN%X=p-FLD1ry*w0!&BzI!-MHCR{LaSud3%asG#1J{ z2d3#mv?r9A`sP80J&K@Y!68N6qb+nOz=8(%g-Y)=A2U%#MG1HkRyfA6FK>TI%Y5BI z+QD;p=EYj=a749XAspfep7mf1)SmNO%b2oN=Z|N44mGGRlNrYXEJlQz$%N=5o1+8P(nP+P-j zD1?zuEK6A7!^vJXvV#r7DVTK^&C@TA*_^}l-xc4CKN~OHc`h@uwXG&}cQ#=iH|K6U z9g`A67~i*Z!NAVq?J~oVQFI?%r6>?=fS_8iP5O>d62Jt%63$iWhLBanUCDPABs^mJQs!ADzKL1sPUbL zsszh4OH>!gClU*x42mGDZ#TQXu}xruzPr)A7>2vfQ7CCvq;|~m%Y}5fufp0sp=!9% zs;pNx5Qi`Jy7m5nU_pZZ5DBeEw=r9OU9GVy7YQz+H+EfCYP)(Ux2pU2R-4dw9pil1 z7k-4Gpw7ES&W;r`1s+2_gaH`t%rF-c-bJ*YRD$N?gX;R_j+#uIGqPq}QB?Q~sEM@= zoO}SryIkHp_|&y=VNP(`qxXE%va(mbV=&11>xl1d@8nmGdqi5!`mY){XD+DN?C?*p zV0J^%PS-#r&HEaP_WqNB{+dvt!$I|B?Yi;uzEBYa5$lQ15(c}H@lpmuORulpwlX?w zG~qi36W!KO@!k>l4NT{caFBK#^2YkFQ2{sj?#GGctc%GsC~2f7S19eE6A$HZItgnB zvO=vd=NSlAfoQ?(xO7!%Gvu`_jpD3Otx%O-F++0KbMSPK+S-2))Z~vCMpmBcQV>KJ!9HdEQ05#a}Mo0X12l0&7~go4w}LqEpTO zR$k4iXCZRTYElzfKyvmO$g3DCr}~{GYcc8u=`OY#Tyl}uN=iCg6R2=XVqVpa?5LQpFo^sgoBtL0;5!A!*PsE zGa6@c1k^NP=_dJKLns(_G6FY`yi4Q!HxIz-{XRG?Cu;gdkr?qxP1Ik(|K3)DlfM1G zbW1m=nx}{1%2aNEz>`>C4a}o*p3l7Gc1}GpmaZ=!+me@^QtwY0Y?PHOC)P zoJVZR9Lo;(UYU2(c*q}9^TH_wi>_b7oM45H3;T!C+>Q7jAsW1Iv0c_JELpPIgt7|c zRl#>GP$tn`%9~pg({udUmHYjPfh|vX_|`mnWU#TS_i03_b7Phj#+hb?4=`}~O?xjN z9$$dyo^?YQ6aw+msQ5D9`hRVtE%!^CgP)sV*uG(GL~*&#Md@?QWQNk2Mkz_-f5*Z^ z)3H&{bVus9QemA1qTm2*#Fs3`Ytacs!zFkqw2kY$bW9st%1$Ala4LWXl&zGQ*n|bT z8hQUEo+r5bkCD6olDcp8vjWaJG9_(zYncE3%N2VLh6m75ApmUg~^u?SnZ3c`*66Lt3tF`ol{8mTctFvf2F({Y(!#4J)BP-JP%^6 zV(mPfv1Pcff@o#uLx7qh2ni!cx^u%5$Ttg~guQaUfbZgsB>d1WBi;DiPdPOtAH!DT zP<}8z4<6_208U5RHf4N>z!DviD=zFHVm@s1uK0AtRC?3`3nek-)tG=^Ajp1VNj>7QeAn=DWBrq0W zH5V=@BZtPwc#N^*^UEjG(W7~@SSRX(n>Q=ak5ILcc5Tg=0KQj`X`F4sO(Nwng1r!7gF>T_w)xUs7cPVzOfol=Rcd(N_+Mp=No> zLGpSl;;Jk;bkO%{%!E2?zGDH$p1#uW9Z7$%!f=I!Z_XSh<1ED z9-W+&l%$yhssXbF+^>EXAE~Ji%!Lj+vt5Vc-5-`i2{?93gH#q>AavjBpY{9#IpAqo z;3FqCz8LFRVUrF&Yq|iO^ubtodHDIrA0wzz`b>wJ$v1?Z{;uD*8IxFh#UGnv2ky4F zs>Y0a(kLr5zSmpLfT#698m$FMC;fwcdZgdxq=*-#uVH+iI$EftjOGs0Che23KNPB< zHRtgu_*DG!o_YM^tROjYKyKNPLU1efe!j^ReK#-;R%sG-4~`jyPEVwBCJ`-kvy{;fe&-aoL(i&nSkCgFEQXaZ7%X7#Ob zPTb6t3oDhxOWp4kc!oYqOE-DnPMzLe#pa@#Yr}If6uI4A@Yo}+2*t91=+L67rbx>f zRn_<-y~Dxo9a|5VJa24SdzDM{pO-wR-GqsG6q2w!nH9?msf@veE@adV|B&0)?CWaO z?zNZL{z$0E&V#$jK$R(w@18=J>{r5mP@DZ=0AHLf{FNMZ#T2C`8m?$d=PwjWm-M?b z2n=*hLbN22PiU=P3FDg@9AtS0IAPgT7L1?Y?{zpWCljs++hi@nU3C=fDtE0BOxC1U z*PS2Me^ytogpxMI4n_vk+i}H-u~1W__ElNBGLuZ>4>P~;3n@p(AVukVTXS-2`A!+E zvT4&Yt@MoHZ#mGnq{flG-!&N zr}Wm7h&?qkWqEPb5E|2lbhDe5qI*nrc8BUvAo8xrQ~mR#a|~(i9og}q{zBMB>Pop> zq$zcEGfMq^YP@19H4fmftP7Ub*=5}hDQmj3T%D$lsXW+oC-rQKBqDWzlVgRk4+^&n zK#}iB>x2%cp4&ztC~F2P%ltVEdkhjBLBUG+0ZEe!Khb%Bf>yO0G2-2j!fnBuQ{%t= z`c*W;vAJ3roEBQCRfIRSJVZE+`lh0zR@>el8>=RyQ;ym6JsXIgM^X-^7qa4Z0Qym_ zXX1Oa^uOy&yopMS47sf-*bBUAWFZ2L-0xk>%V8co;wa1PZO3q}8Cec1zhhRm76 z1SrWm9zjW2GqM(yuIWnFFL`GDM_1&{ZXg@?PX$ z&zz;+;s`Y%sI21#nX=*#?WKgha*oWjpM_6N8gDyrh{5T<6V)u8z)3{KuGTQ-LqF7G zpQcFSc!|x>T1{X&{y~UT)QW=?NW2TkuQ+gLRYO~y)II>Bn@J>HWqP&j(CL*ZYd&U% zU;Z;$iHSryqVpS$?6*g??DA|X6azBA71`L}p)wp&#-+TdVfmu0dm>BGDO1Oo2Z5n# z{2nXBnr9CJI@7DIq(Dh40$a1sver}TPSHC_SA`-=1;_^4`e)^-hQMKw2e)1Ih)Cx! z(2t@#gPDjo#|Vqb)cb%3td!{dWqB3xJGj%U6AThNNf0U)jfa}Zz?^3WKGh*A}5ZdHKvKI7Mn20FcpnD|> zPiUnw$JtG3LrAZ()rT{Zt$Y2?R>Q8U ze(@2iw;%DQa#jFTwgy=pdm_3IKuumMwGkZxKFk_q#itSq)M!s~$v%)G zKqauRMQ$P*)N7AC7wVILp`i4KI`yqlXFy=}r%n{UI`==pE-%pxsCof~IV_}n@oJe0dDQ*-HAI;!>jdw_5mzQTsp}ePae(YW%64F!Uq|)Jh%<1y{Y1c>hH&!^OgYEY1l)(HykM67$9y4@=~p6 z&WUX)^*~)TODh#Dd)mXjU%viRWg#V-m(G9Z@eanGfyazv*O;>zFy6i&=K{FRYgO{{ zBWPohH%(}lD-SPPQ~0edx~T8hqc0>KGY*HcmXMs;P4X?+A+NJk*#AcuD1reMQ%wcC zBQD5^jrej|^VuAA;T_6R5UT>RN3j_kfk{6g#a(Rz+euPf)qgJK-%0WKFZi^oRU;Xn z5nk2Hq%;M(Z87ca#)_AmSl+|ARoy?uiE%H>WoI^0hJQ<7-lW3EqiRmFl*1DM9)}{( zOS%-!)m54Kqig4{N20c>OT=D{73`%sLY3X8n)B%+VPQVv$F2oq+nig2)2@_0I~sOw6K z&1kM(H@rm~)%K{d=ib)|lzm0;xH)22`eJm=gX-*e5TUAH3YF0R_^SZ$;nFsTXZX+E zjcT@olY~1K+exIcubxV~_~T=hUqALdr`GQOM(~unCH5heHsD>wHCwLm+*m)uq)GA# zFe#S;j=XdeZ4{v5c7Td002T8AD)vRfH-d@}{yQq(jXPSkCaaP}5AFq}@cs^6k0Qde zF%}zEi#KdEqjM`x0lt}t+%_pscz*lo9iiswA9Jx6%g8P~%_OE;PGCG~%8LtYOkk9e zIV9!d)L7@1n}++TLjQ*@D~sTSEW{(s^PU-4^+#P7W-r-r$yS`eoe-o*#4E**NDlbS zD*Gh*-}|YN$g$Mi ze|atXQNuufMcCtkp^OEny%!PH8S2-NVEEUFnv);XOwb<@ZB8yFqF;O-r9>kc%9TaAVX^gGb5gPxfL5B-A zNb7Nae^k4SM9t({-<=<&KLV)hcM}50S6%Y@o&44w^*L5G`>7eiiF<#?iSy$?N~W#m zby?0Td_h9p*lX0FPt#htlT!s11`|x6=aZdNQoo;$%twx!w>5lq3o$uGU3-T@hIX!l6$b{$=&&Icas9}COn&C+mCKUxKvjIOg|tSQWNs24DmGhRul2kGlIm`;<0h_WuOHH$$<*y+YZKZXOQj&VQLZC) zlK7hQQHM*04oMS{xPn7VcahxKl6b4S9Q0k6Yx|(4M7#6D?v20CT(kJD9=Pu=dx&1| z$(Wm8BM!AatDY|ERTApfbEE2g>gPg`{t_~+9LRU87Zknd5oowXPh|5KvAz#Low0Na z!hF)@mu_(9HR_Ur>{)OCP1e8E28Fk1&^S1=UrVt+ zoScHCND~lw9KnAwkfQlg60njw35`IlsoZao4~J0xSaN3ZlUsfEqPnD8F+l@%cNgD_ zJ(g53D6#+mbm?U%LM=DR8+3Alpu)I9VYbp96+4TyQv-V!9UQ+V?E5evKaOkrn_Aai zE4`$W+(07o1v2aWu!XCXFed8aC%9eBeV6l7{7=UO_e2{)(-KhPlz7DjKbKfWU^f53 zjrfl2PggoJtcj$jv!Q)@7OkgjDBG*2Cv0i+oa<5_bsr_D8iH3j;2O#}Az=pBE zW5fAbUzT96D9)dqO$41Aaa#FgzG{wb_q&??{#Bxb#QEvQX8VejD4e}B3+V#hbT5wI zPmeFYP;hR@6Ebb%)^fE|dm5-ukG^Q1>LkpBQU1zks<(XMb<+r{QF<{5I_9D$i@|yv zfTzrH?fYV1LOS3&x7h7TKiqNyEz}s(Ch8$&4t;NUNF<}Zq`>~s3pTuCf(=uSXm#Te zuh?+meD01zJ9j3sCdjbl6&c3of{N8W(BGu{_hfj>Yh?IVcx2>{hhLIm=?L@-uRJ`E z?=}2kvptHjg}bI|mNMzk3EK68=K|?Ke^+orN}6V@gkwVIyy8a~W_nJMfqm}gUV(Y* zySGXSOj4;seF92yy2WX+FZC|5@>hkJo}8cau*i-7>m(Ys2WXfwg@&OCG@OHln$~Y| z`NdqQX*No`gGiMo9DYKBZDs_WQblJ7Y{BM+x?-42=eClCUaOK(Vr#b#P@RzlAok6M zATjcQ-;l|^eCh9$7EJ7)Z+#eW(`y5jD-!$dmiuQVSwu&rYR#0!_wXKw2=d7c&`wYj`L&V~7a3ztlBVMECGv%uS^!t3REU+i32G_QLPJV`JIEr6m0wRrVRJ+ zDf3mHetZpVRa(o-+PQKE!1XEoQg8jg4zKr8)|R^E!&8%Uu;-n?aVz( zPP|{$H<9HdZY+R?6#42^)!9O@&1!VE)`=~Cs(VTen&QG>I)6I>xUlHtQh&4_wNy$X>mQ51;L0%=u6%&&4R8ZHeW{RJTor$vSD{cvkPJHgFksO;K!_Mk0ULFgF#`=pY!G>e+TlEFNE&vgUx0Q4yF5CDzv#cm*rXzO4Y z6Fg{UZ$smaSngA1PuA~JY?oWClcVg={R`yskL;AsY`v^=<`Ng^$G7odPn?NFdmjgd zBk7?bb~4%4%`&0~PNCr+5Vl~7x)|vWMbAWDSOa!C0%n{z@j~5{oae1d-Z18Ds^=IV r07@R*GuiN=y)77hu|Z>)#Cza$Msd`4AK0}$?Mug9JBq&e=G*@P32jFI literal 0 HcmV?d00001 diff --git a/class_model_snapshot.html b/class_model_snapshot.html new file mode 100644 index 0000000000..0e18a0fe99 --- /dev/null +++ b/class_model_snapshot.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: ModelSnapshot Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ModelSnapshot Class Reference
+
+
+
+Inheritance diagram for ModelSnapshot:
+
+
+ + +Tgstation.Server.Host.Models.Migrations.MySqlDatabaseContextModelSnapshot +Tgstation.Server.Host.Models.Migrations.SqlServerDatabaseContextModelSnapshot + +
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_model_snapshot.png b/class_model_snapshot.png new file mode 100644 index 0000000000000000000000000000000000000000..b073fdb633c75b2855a2a53af8835965f40cd6ca GIT binary patch literal 1635 zcmcgrX;4#F6n+?_h+;d6nleR)iU>%60v+I3LQ8SKlT-9`z2nXXNg()2J-Wuk-JV zImc}Y%WCBGMCeI%w*R&Mf@i=gGKlzS%!jOJyR1f0BVcrnKAHBJ&r^=cQ>>$x6YY}{ zak%+2AOgvHxQ0H|($Yb6fps;5&q=fJOV|K0urv}L22FSFlzwKwJz&OufEEZK z$iVd`jt*Q&j#wG_Kc(UbA<250AtadtHb4lk8SpLX0BZkFJo0E3BMP-5O=Cm_B^|K$ zC38%+WAWxF6!tJXn*xIF=V?@I%QZN!3CiK(aNC?lboB;^sN5KozTa zJw`y^Y24zp&Gd)jiPyvhqMOjgK_OBuTd6wKN5?+(K1qwpA_eg7R+la2K%EVN=FBWb zOx<#aB+b6s!;@{8uxoJ(_@aXNCQcNIk9xebIiPo|6kiSv1-!G(JzF^N0WFZ>^tN^n zaGZ?eYJ=2Y)5AVVNtAMmczYus+4`1pbqN!ltibm&;whblMImJ>)cyVa zg6s-x!mg+u$q3%vAw3M!z$#S6nmEy*U(_|NY&D%?z1*P+oVYmmqjQ#&I_`Cf=UHhK zBuqCo!Yvh1gE82K&QhX3IINuLEQLaketFf4M*?Nj;MJsxd(z6kCZlB8@tT$=gwA?0X z;Ac4Qt!j_yx1$mLGa}dzL(1;qcY9e}`Tp($`GYpDT6`sq#X}@hDs9yZ4ZjVD^G6d*NdhP1-(wcKo7NWsVIGvT4k&nKrUXGAmK!LT|GHM zSL;K;goO*eg3VmYs8L&f^BA9dX!x9ZC)m_h`Ec+ute}xeWZ%xMt-^(KGZ-?9HtO#o zIGrbm@sH;k(ym8Q2sV#kRLZVjPU zMA@g$95E@NPzlV!96rs0UM=+R>EoZ;)GWSo_jK^S;e{O?d4s%VXM?G8Eb?3uTzlTb9oT%11A?hr@Covr;)zYSX6Q# zyR#TlA=@)F>rjtG?Q4cTG?9Pv$;OR7XkjDUeseTW$;bdDW{bvsjeo4G2(!2yOvT!= z?a`M(kbNh2&p$gr{+C60j@m1lrhSUctatZeWXj*an#SB1h!&+bdPm6HApkb4ldEI# ILGrb~0IvKl`Tzg` literal 0 HcmV?d00001 diff --git a/class_release_notes_1_1_program-members.html b/class_release_notes_1_1_program-members.html new file mode 100644 index 0000000000..eb1781b708 --- /dev/null +++ b/class_release_notes_1_1_program-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ReleaseNotes.Program Member List
+
+
+ +

This is the complete list of members for ReleaseNotes.Program, including all inherited members.

+ + +
Main(string[] args)ReleaseNotes.Programprivatestatic
+ + + + diff --git a/class_release_notes_1_1_program.html b/class_release_notes_1_1_program.html new file mode 100644 index 0000000000..9245324228 --- /dev/null +++ b/class_release_notes_1_1_program.html @@ -0,0 +1,133 @@ + + + + + + + +tgstation-server: ReleaseNotes.Program Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
ReleaseNotes.Program Class Reference
+
+
+ +

Contains the application entrypoint + More...

+ + + + + +

+Static Private Member Functions

static async Task< int > Main (string[] args)
 The entrypoint for the Program More...
 
+

Detailed Description

+

Contains the application entrypoint

+ +

Definition at line 15 of file Program.cs.

+

Member Function Documentation

+ +

◆ Main()

+ +
+
+ + + + + +
+ + + + + + + + +
static async Task<int> ReleaseNotes.Program.Main (string [] args)
+
+staticprivate
+
+ +

The entrypoint for the Program

+ +

Definition at line 20 of file Program.cs.

+
21  {
22  if (args.Length < 1)
23  {
24  Console.WriteLine("Missing version argument!");
25  return 1;
26  }
27 
28  var versionString = args[0];
29  if (!Version.TryParse(versionString, out var version))
30  {
31  Console.WriteLine("Invalid version: " + versionString);
32  return 2;
33  }
34 
35  var doNotCloseMilestone = args.Length >= 2 && args[1].ToUpperInvariant() == "--NO-CLOSE";
36 
37  const string ReleaseNotesEnvVar = "TGS_RELEASE_NOTES_TOKEN";
38  var githubToken = Environment.GetEnvironmentVariable(ReleaseNotesEnvVar);
39  if (String.IsNullOrWhiteSpace(githubToken))
40  {
41  Console.WriteLine("Missing " + ReleaseNotesEnvVar + " environment variable!");
42  return 3;
43  }
44 
45  try
46  {
47  var client = new GitHubClient(new ProductHeaderValue("tgs_release_notes"));
48  client.Credentials = new Credentials(githubToken);
49 
50  const string RepoOwner = "tgstation";
51  const string RepoName = "tgstation-server";
52 
53  var releasesTask = client.Repository.Release.GetAll(RepoOwner, RepoName);
54 
55  Console.WriteLine("Getting pull requests in milestone " + versionString + "...");
56  var milestonePRs = await client.Search.SearchIssues(new SearchIssuesRequest
57  {
58  Milestone = versionString,
59  Type = IssueTypeQualifier.PullRequest,
60  Repos = { { RepoOwner, RepoName } }
61  }).ConfigureAwait(false);
62 
63  if (milestonePRs.IncompleteResults)
64  {
65  Console.WriteLine("Incomplete results for milestone PRs query!");
66  return 5;
67  }
68  Console.WriteLine(milestonePRs.Items.Count + " total pull requests");
69 
70  Task<Milestone> milestoneTask = null;
71  var milestoneTaskLock = new object();
72  var releaseDictionary = new Dictionary<int, List<string>>();
73  var authorizedUsers = new Dictionary<long, Task<bool>>();
74 
75  async Task GetReleaseNotesFromPR(Issue pullRequest)
76  {
77  //need to check it was merged
78  var fullPR = await client.Repository.PullRequest.Get(RepoOwner, RepoName, pullRequest.Number).ConfigureAwait(false);
79 
80  async Task<Milestone> GetMilestone()
81  {
82  if (fullPR.Milestone == null)
83  return null;
84  return await client.Issue.Milestone.Get(RepoOwner, RepoName, fullPR.Milestone.Number);
85  };
86 
87  lock (milestoneTaskLock)
88  if (milestoneTask == null)
89  milestoneTask = GetMilestone();
90 
91  if (!fullPR.Merged)
92  return;
93 
94  async Task BuildNotesFromComment(string comment, User user)
95  {
96  var commentSplits = comment.Split('\n');
97  var notesOpen = false;
98  var notesClosed = false;
99  var notes = new List<string>();
100  foreach (var line in commentSplits)
101  {
102  var trimmedLine = line.Trim();
103  if (!notesOpen)
104  {
105  notesOpen = trimmedLine.StartsWith(":cl:", StringComparison.Ordinal);
106  notesClosed = false;
107  continue;
108  }
109  if (trimmedLine.StartsWith("/:cl:", StringComparison.Ordinal))
110  {
111  notesClosed = true;
112  notesOpen = false;
113  continue;
114  }
115  if (trimmedLine.Length == 0)
116  continue;
117  notes.Add(trimmedLine);
118  }
119  if (!notesClosed || notes.Count == 0)
120  return;
121 
122  Task<bool> authTask;
123  TaskCompletionSource<bool> ourTcs = null;
124  lock (authorizedUsers)
125  {
126  if (!authorizedUsers.TryGetValue(user.Id, out authTask))
127  {
128  ourTcs = new TaskCompletionSource<bool>();
129  authTask = ourTcs.Task;
130  authorizedUsers.Add(user.Id, authTask);
131  }
132  }
133 
134  if (ourTcs != null)
135  try
136  {
137  //check if the user has access
138  var perm = await client.Repository.Collaborator.ReviewPermission(RepoOwner, RepoName, user.Login).ConfigureAwait(false);
139  ourTcs.SetResult(perm.Permission == PermissionLevel.Write || perm.Permission == PermissionLevel.Admin);
140  }
141  catch
142  {
143  ourTcs.SetResult(false);
144  throw;
145  }
146 
147  var authorized = await authTask.ConfigureAwait(false);
148  if (!authorized)
149  return;
150 
151  lock (releaseDictionary)
152  {
153  foreach (var I in notes)
154  Console.WriteLine("#" + fullPR.Number + " - " + I + " (@" + user.Login + ")");
155  if (releaseDictionary.TryGetValue(fullPR.Number, out var currentValues))
156  currentValues.AddRange(notes);
157  else
158  releaseDictionary.Add(fullPR.Number, notes);
159  }
160  }
161 
162  var comments = await client.Issue.Comment.GetAllForIssue(RepoOwner, RepoName, fullPR.Number).ConfigureAwait(false);
163  await Task.WhenAll(BuildNotesFromComment(fullPR.Body, fullPR.User), Task.WhenAll(comments.Select(x => BuildNotesFromComment(x.Body, x.User)))).ConfigureAwait(false);
164  }
165 
166  var tasks = new List<Task>();
167  foreach (var I in milestonePRs.Items)
168  tasks.Add(GetReleaseNotesFromPR(I));
169 
170  var releases = await releasesTask.ConfigureAwait(false);
171 
172  var releasingSuite = version.Major;
173 
174  Version highestReleaseVersion = null;
175  Release highestRelease = null;
176  foreach (var I in releases)
177  {
178  if (!Version.TryParse(I.TagName.Replace("tgstation-server-v", String.Empty), out var currentReleaseVersion))
179  {
180  Console.WriteLine("WARNING: Unable to determine version of release " + I.HtmlUrl);
181  continue;
182  }
183 
184  if (currentReleaseVersion.Major == releasingSuite && (highestReleaseVersion == null || currentReleaseVersion > highestReleaseVersion))
185  {
186  highestReleaseVersion = currentReleaseVersion;
187  highestRelease = I;
188  }
189  }
190 
191  if (highestReleaseVersion == null)
192  {
193  Console.WriteLine("Unable to determine highest release version for suite " + releasingSuite + "!");
194  return 6;
195  }
196 
197  var oldNotes = highestRelease.Body;
198 
199  var splits = new List<string>(oldNotes.Split('\n'));
200  //trim away all the lines that don't start with #
201 
202  string keepThisRelease;
203  if (version.Revision == 0)
204  if (version.Build == 0)
205  keepThisRelease = "# ";
206  else
207  keepThisRelease = "## ";
208  else
209  keepThisRelease = "### ";
210 
211  for (; !splits[0].StartsWith(keepThisRelease, StringComparison.Ordinal); splits.RemoveAt(0))
212  if (splits.Count == 1)
213  {
214  Console.WriteLine("Error formatting release notes: Can't detemine notes start!");
215  return 7;
216  }
217 
218  oldNotes = String.Join('\n', splits);
219 
220  string prefix;
221  switch (releasingSuite)
222  {
223  case 3:
224  prefix = "The /tg/station server suite";
225  break;
226  default:
227  prefix = "See https://tgstation.github.io/tgstation-server for installation instructions";
228  break;
229  }
230 
231  var newNotes = new StringBuilder(prefix);
232  newNotes.Append(Environment.NewLine);
233  newNotes.Append(Environment.NewLine);
234  if (version.Revision == 0)
235  if (version.Build == 0)
236  {
237  newNotes.Append("# [Version ");
238  newNotes.Append(version.Minor);
239  }
240  else
241  {
242  newNotes.Append("## [Changelog for ");
243  newNotes.Append(version.Build);
244  newNotes.Append(".x");
245  }
246  else
247  {
248  newNotes.Append("### [Patch ");
249  newNotes.Append(version.Revision);
250  }
251  newNotes.Append("](");
252  var milestone = await milestoneTask.ConfigureAwait(false);
253  if (milestone == null)
254  {
255  Console.WriteLine("Unable to detemine milestone!");
256  return 9;
257  }
258  newNotes.Append(milestone.HtmlUrl);
259  newNotes.Append("?closed=1)");
260  newNotes.Append(Environment.NewLine);
261 
262  await Task.WhenAll(tasks).ConfigureAwait(false);
263 
264  if (releaseDictionary.Count == 0)
265  {
266  Console.WriteLine("No release notes for this milestone!");
267  return 8;
268  }
269 
270  foreach (var I in releaseDictionary)
271  foreach (var note in I.Value)
272  {
273  newNotes.Append(Environment.NewLine);
274  newNotes.Append("- ");
275  newNotes.Append(note);
276  newNotes.Append(" (#");
277  newNotes.Append(I.Key);
278  newNotes.Append(')');
279  }
280 
281  newNotes.Append(Environment.NewLine);
282  newNotes.Append(Environment.NewLine);
283  newNotes.Append(oldNotes);
284 
285  Console.WriteLine("Writing out new release notes...");
286  var releaseNotes = newNotes.ToString();
287  await File.WriteAllTextAsync("release_notes.md", releaseNotes).ConfigureAwait(false);
288 
289  if (doNotCloseMilestone)
290  Console.WriteLine("Not closing milestone due to parameter!");
291  else
292  {
293  Console.WriteLine("Closing milestone...");
294  await client.Issue.Milestone.Update(RepoOwner, RepoName, milestone.Number, new MilestoneUpdate
295  {
296  State = ItemState.Closed
297  }).ConfigureAwait(false);
298  }
299 
300  return 0;
301  }
302  catch (Exception e)
303  {
304  Console.WriteLine(e);
305  return 4;
306  }
307  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_service_base.html b/class_service_base.html new file mode 100644 index 0000000000..3a8f58df75 --- /dev/null +++ b/class_service_base.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: ServiceBase Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ServiceBase Class Reference
+
+
+
+Inheritance diagram for ServiceBase:
+
+
+ + +Tgstation.Server.Host.Service.ServerService + +
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_service_base.png b/class_service_base.png new file mode 100644 index 0000000000000000000000000000000000000000..b0f59081c483c7276999cb0bef4cdda50f8d5a40 GIT binary patch literal 764 zcmeAS@N?(olHy`uVBq!ia0y~yVB`g|12~w0q{-?F%Yl?cfKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+15>xBi(^Oy@KYOin3U|4g>=dcNb(ag3?hLl}xZkpE_tl#dM zeu?h`Q>@eC9Y2=LpSY9Zf5`QV6?!$Lzjo|g{l~WYbo}CrRlCI*_XUTidM)0>a_imU z*uUNVubB^Qf3-^M*0tKjQvYvVyxME_<90@iNAxZhsnZGbHB04V!=m)pF1kBQ-Q-*G z?PELgj_NHFTvT&@SD<;7b?~7`sq<6n@=mUcFJH#+hu?_zGQ)`!sb!24PMY{ID@@MJ z$?&;s66wwSgK-yQ#4<*K(%q8nnGA1A+7o4ficaW&70qCCP`hlv+u*Y-QHo(E!ebbw zp(%Ws7vHQBxfB>49zh_pJWqvW`gl*i68rk`-#p_m_A-6Xpk=AI z%8F|3wtWt-V?SF~oop|c;c>}t>HlI2zf7JRk~8hI%G@8H`&9VZA!^6A`AfI|nRZd) zPBE|CB`+EnR|C}ipFtoa=WoJI(>~vnVS8U z%^NKqlwZhkO8$GowD0ixRdK4mfq#=%_{{7sww67gxZgRAKcmDgi^bh!-tDDofv0;f zOnuXP^(cGUt^-NFf9Bj5-0W`RXPg@U*XcwyS9@@>ck*t#<7H0kdVk28{$9Fk;$@CN zwV6d>=I7ql+{=4Ruip?`}yzNCBYzv~>!cijED=qs1gTe~DWM4fV~AjA literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_api_1_1_api_headers-members.html b/class_tgstation_1_1_server_1_1_api_1_1_api_headers-members.html new file mode 100644 index 0000000000..2b84cfba8b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_api_headers-members.html @@ -0,0 +1,108 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.ApiHeaders Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Api.ApiHeaders, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + +
ApiHeaders(ProductHeaderValue userAgent, string token)Tgstation.Server.Api.ApiHeaders
ApiHeaders(ProductHeaderValue userAgent, string username, string password)Tgstation.Server.Api.ApiHeaders
ApiHeaders(RequestHeaders requestHeaders)Tgstation.Server.Api.ApiHeaders
ApiHeaders(ProductHeaderValue userAgent, string token, string username, string password)Tgstation.Server.Api.ApiHeadersprivate
ApiVersionTgstation.Server.Api.ApiHeaders
ApiVersionHeaderTgstation.Server.Api.ApiHeadersprivate
ApplicationJsonTgstation.Server.Api.ApiHeaders
AssemblyNameTgstation.Server.Api.ApiHeadersprivatestatic
CheckCompatibility(Version otherVersion)Tgstation.Server.Api.ApiHeadersstatic
Compatible()Tgstation.Server.Api.ApiHeaders
InstanceIdTgstation.Server.Api.ApiHeaders
InstanceIdHeaderTgstation.Server.Api.ApiHeadersprivate
IsTokenAuthenticationTgstation.Server.Api.ApiHeaders
JwtAuthenticationSchemeTgstation.Server.Api.ApiHeadersprivate
PasswordTgstation.Server.Api.ApiHeaders
PasswordAuthenticationSchemeTgstation.Server.Api.ApiHeadersprivate
RawUserAgentTgstation.Server.Api.ApiHeaders
SetRequestHeaders(HttpRequestHeaders headers, long? instanceId=null)Tgstation.Server.Api.ApiHeaders
TokenTgstation.Server.Api.ApiHeaders
UserAgentTgstation.Server.Api.ApiHeaders
UsernameTgstation.Server.Api.ApiHeaders
UsernameHeaderTgstation.Server.Api.ApiHeadersprivate
VersionTgstation.Server.Api.ApiHeadersstatic
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_api_headers.html b/class_tgstation_1_1_server_1_1_api_1_1_api_headers.html new file mode 100644 index 0000000000..3dbdea01e8 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_api_headers.html @@ -0,0 +1,936 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.ApiHeaders Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+ +
+ +

Represents the header that must be present for every server request + More...

+ + + + + + + + + + + + + + + + + +

+Public Member Functions

 ApiHeaders (ProductHeaderValue userAgent, string token)
 Construct ApiHeaders for JWT authentication More...
 
 ApiHeaders (ProductHeaderValue userAgent, string username, string password)
 Construct ApiHeaders for password authentication More...
 
 ApiHeaders (RequestHeaders requestHeaders)
 Construct and validates ApiHeaders from a set of requestHeaders More...
 
bool Compatible ()
 Checks if the ApiVersion is compatible with Version More...
 
void SetRequestHeaders (HttpRequestHeaders headers, long? instanceId=null)
 Set HttpRequestHeaders using the ApiHeaders. This initially clears headers More...
 
+ + + + +

+Static Public Member Functions

static bool CheckCompatibility (Version otherVersion)
 Checks if a given otherVersion is compatible with our own More...
 
+ + + + + + + + + + +

+Public Attributes

const string ApplicationJson = "application/json"
 TODO: Remove this when https://github.com/dotnet/corefx/pull/26701 makes it into the sdk More...
 
ProductHeaderValue UserAgent => ProductInfoHeaderValue.TryParse(RawUserAgent, out var userAgent) ? userAgent.Product : null
 The client's user agent as a ProductHeaderValue if valid More...
 
bool IsTokenAuthentication => Token != null
 If the header uses password or JWT authentication More...
 
+ + + + +

+Static Public Attributes

static Version Version => AssemblyName.Version
 Get the version of the Api the caller is using More...
 
+ + + + + + + + + + + + + + + + + + + +

+Properties

long? InstanceId [get, set]
 The Models.Instance.Id being accessed More...
 
string RawUserAgent [get]
 The client's raw user agent More...
 
Version ApiVersion [get]
 The client's API version More...
 
string Token [get]
 The client's JWT More...
 
string Username [get]
 The client's username More...
 
string Password [get]
 The client's password More...
 
+ + + + +

+Private Member Functions

 ApiHeaders (ProductHeaderValue userAgent, string token, string username, string password)
 Construct ApiHeaders More...
 
+ + + + + + + + + + + + + + + + +

+Private Attributes

const string ApiVersionHeader = "Api"
 The ApiVersion header key More...
 
const string UsernameHeader = "Username"
 The Username header key More...
 
const string InstanceIdHeader = "Instance"
 The InstanceId header key More...
 
const string JwtAuthenticationScheme = "Bearer"
 The JWT authentication header scheme More...
 
const string PasswordAuthenticationScheme = "Password"
 The password authentication header scheme More...
 
+ + + + +

+Static Private Attributes

static readonly AssemblyName AssemblyName = Assembly.GetExecutingAssembly().GetName()
 The current System.Reflection.AssemblyName More...
 
+

Detailed Description

+

Represents the header that must be present for every server request

+ +

Definition at line 16 of file ApiHeaders.cs.

+

Constructor & Destructor Documentation

+ +

◆ ApiHeaders() [1/4]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Api.ApiHeaders.ApiHeaders (ProductHeaderValue userAgent,
string token 
)
+
+ +

Construct ApiHeaders for JWT authentication

+
Parameters
+ + + +
userAgentThe value of UserAgent
tokenThe value of Token
+
+
+ +

Definition at line 110 of file ApiHeaders.cs.

+
110  : this(userAgent, token, null, null)
111  {
112  if (userAgent == null)
113  throw new ArgumentNullException(nameof(userAgent));
114  if (token == null)
115  throw new ArgumentNullException(nameof(token));
116  }
+
+
+ +

◆ ApiHeaders() [2/4]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Api.ApiHeaders.ApiHeaders (ProductHeaderValue userAgent,
string username,
string password 
)
+
+ +

Construct ApiHeaders for password authentication

+
Parameters
+ + + + +
userAgentThe value of UserAgent
usernameThe value of Username
passwordThe value of Password
+
+
+ +

Definition at line 124 of file ApiHeaders.cs.

+
124  : this(userAgent, null, username, password)
125  {
126  if (userAgent == null)
127  throw new ArgumentNullException(nameof(userAgent));
128  if (username == null)
129  throw new ArgumentNullException(nameof(username));
130  if (password == null)
131  throw new ArgumentNullException(nameof(password));
132  }
+
+
+ +

◆ ApiHeaders() [3/4]

+ +
+
+ + + + + + + + +
Tgstation.Server.Api.ApiHeaders.ApiHeaders (RequestHeaders requestHeaders)
+
+ +

Construct and validates ApiHeaders from a set of requestHeaders

+
Parameters
+ + +
requestHeadersThe RequestHeaders containing the ApiHeaders
+
+
+ +

Definition at line 138 of file ApiHeaders.cs.

+
139  {
140  if (requestHeaders == null)
141  throw new ArgumentNullException(nameof(requestHeaders));
142 
143  var jsonAccept = new Microsoft.Net.Http.Headers.MediaTypeHeaderValue(ApplicationJson);
144  if (!requestHeaders.Accept.Any(x => x.MediaType == jsonAccept.MediaType))
145  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Client does not accept {0}!", ApplicationJson));
146 
147  if (!requestHeaders.Headers.TryGetValue(HeaderNames.UserAgent, out var userAgentValues) || userAgentValues.Count == 0)
148  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Missing {0} headers!", HeaderNames.UserAgent));
149 
150  RawUserAgent = userAgentValues.First();
151  if (String.IsNullOrWhiteSpace(RawUserAgent))
152  throw new InvalidOperationException("Malformed client User-Agent!");
153 
154  // make sure the api header matches ours
155  if (!requestHeaders.Headers.TryGetValue(ApiVersionHeader, out var apiUserAgentHeaderValues) || !ProductInfoHeaderValue.TryParse(apiUserAgentHeaderValues.FirstOrDefault(), out var apiUserAgent) || apiUserAgent.Product.Name != AssemblyName.Name)
156  throw new InvalidOperationException("Missing API version!");
157 
158  if (!Version.TryParse(apiUserAgent.Product.Version, out var apiVersion))
159  throw new InvalidOperationException("Malformed API version!");
160 
161  ApiVersion = apiVersion;
162 
163  if (!requestHeaders.Headers.TryGetValue(HeaderNames.Authorization, out StringValues authorization))
164  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Missing {0} header!", HeaderNames.Authorization));
165  var auth = authorization.First();
166  var splits = new List<string>(auth.Split(' '));
167  var scheme = splits.First();
168  if (String.IsNullOrWhiteSpace(scheme))
169  throw new InvalidOperationException("Missing authentication scheme!");
170 
171  splits.RemoveAt(0);
172  var parameter = String.Concat(splits);
173  if (String.IsNullOrEmpty(parameter))
174  throw new InvalidOperationException("Missing authentication parameter!");
175 
176  if (requestHeaders.Headers.TryGetValue(InstanceIdHeader, out var instanceIdValues))
177  {
178  var instanceIdString = instanceIdValues.FirstOrDefault();
179  if (instanceIdString != default && Int64.TryParse(instanceIdString, out var instanceId))
180  InstanceId = instanceId;
181  }
182 
183  switch (scheme)
184  {
186  Token = parameter;
187  break;
189  Password = parameter;
190  var fail = !requestHeaders.Headers.TryGetValue(UsernameHeader, out var values);
191  if (!fail)
192  {
193  Username = values.FirstOrDefault();
194  fail = String.IsNullOrWhiteSpace(Username);
195  }
196 
197  if (fail)
198  throw new InvalidOperationException("Missing Username header!");
199  break;
200  default:
201  throw new InvalidOperationException("Invalid authentication scheme!");
202  }
203  }
static readonly AssemblyName AssemblyName
The current System.Reflection.AssemblyName
Definition: ApiHeaders.cs:51
+
const string ApplicationJson
TODO: Remove this when https://github.com/dotnet/corefx/pull/26701 makes it into the sdk
Definition: ApiHeaders.cs:21
+
Version ApiVersion
The client's API version
Definition: ApiHeaders.cs:76
+
const string PasswordAuthenticationScheme
The password authentication header scheme
Definition: ApiHeaders.cs:46
+
string Username
The client's username
Definition: ApiHeaders.cs:86
+
string Password
The client's password
Definition: ApiHeaders.cs:91
+
string RawUserAgent
The client's raw user agent
Definition: ApiHeaders.cs:71
+
long? InstanceId
The Models.Instance.Id being accessed
Definition: ApiHeaders.cs:61
+
const string JwtAuthenticationScheme
The JWT authentication header scheme
Definition: ApiHeaders.cs:41
+
const string ApiVersionHeader
The ApiVersion header key
Definition: ApiHeaders.cs:26
+
const string InstanceIdHeader
The InstanceId header key
Definition: ApiHeaders.cs:36
+
string Token
The client's JWT
Definition: ApiHeaders.cs:81
+
const string UsernameHeader
The Username header key
Definition: ApiHeaders.cs:31
+
static Version Version
Get the version of the Api the caller is using
Definition: ApiHeaders.cs:56
+
+

References Tgstation.Server.Api.ApiHeaders.ApiVersion, Tgstation.Server.Api.ApiHeaders.ApiVersionHeader, Tgstation.Server.Api.ApiHeaders.ApplicationJson, Tgstation.Server.Api.ApiHeaders.AssemblyName, Tgstation.Server.Api.ApiHeaders.InstanceId, Tgstation.Server.Api.ApiHeaders.InstanceIdHeader, Tgstation.Server.Api.ApiHeaders.JwtAuthenticationScheme, Tgstation.Server.Api.ApiHeaders.Password, Tgstation.Server.Api.ApiHeaders.PasswordAuthenticationScheme, Tgstation.Server.Api.ApiHeaders.RawUserAgent, Tgstation.Server.Api.ApiHeaders.Token, Tgstation.Server.Api.ApiHeaders.Username, Tgstation.Server.Api.ApiHeaders.UsernameHeader, and Tgstation.Server.Api.ApiHeaders.Version.

+ +
+
+ +

◆ ApiHeaders() [4/4]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Api.ApiHeaders.ApiHeaders (ProductHeaderValue userAgent,
string token,
string username,
string password 
)
+
+private
+
+ +

Construct ApiHeaders

+
Parameters
+ + + + + +
userAgentThe value of UserAgent
tokenThe value of Token
usernameThe value of Username
passwordThe value of Password
+
+
+ +

Definition at line 212 of file ApiHeaders.cs.

+
213  {
214  RawUserAgent = userAgent?.ToString();
215  Token = token;
216  Username = username;
217  Password = password;
219  }
Version ApiVersion
The client's API version
Definition: ApiHeaders.cs:76
+
string Username
The client's username
Definition: ApiHeaders.cs:86
+
string Password
The client's password
Definition: ApiHeaders.cs:91
+
string RawUserAgent
The client's raw user agent
Definition: ApiHeaders.cs:71
+
string Token
The client's JWT
Definition: ApiHeaders.cs:81
+
static Version Version
Get the version of the Api the caller is using
Definition: ApiHeaders.cs:56
+
+

References Tgstation.Server.Api.ApiHeaders.ApiVersion, Tgstation.Server.Api.ApiHeaders.Password, Tgstation.Server.Api.ApiHeaders.RawUserAgent, Tgstation.Server.Api.ApiHeaders.Token, Tgstation.Server.Api.ApiHeaders.Username, and Tgstation.Server.Api.ApiHeaders.Version.

+ +
+
+

Member Function Documentation

+ +

◆ CheckCompatibility()

+ +
+
+ + + + + +
+ + + + + + + + +
static bool Tgstation.Server.Api.ApiHeaders.CheckCompatibility (Version otherVersion)
+
+static
+
+ +

Checks if a given otherVersion is compatible with our own

+
Parameters
+ + +
otherVersionThe Version to test
+
+
+
Returns
true if the given version is compatible with the API. false otherwise
+ +
+
+ +

◆ Compatible()

+ +
+
+ + + + + + + +
bool Tgstation.Server.Api.ApiHeaders.Compatible ()
+
+ +

Checks if the ApiVersion is compatible with Version

+
Returns
true if the API is compatible, false otherwise
+ +

Referenced by Tgstation.Server.Host.Controllers.ApiController.OnActionExecutionAsync().

+ +
+
+ +

◆ SetRequestHeaders()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void Tgstation.Server.Api.ApiHeaders.SetRequestHeaders (HttpRequestHeaders headers,
long? instanceId = null 
)
+
+ +

Set HttpRequestHeaders using the ApiHeaders. This initially clears headers

+
Parameters
+ + + +
headersThe HttpRequestHeaders to set
instanceIdThe Models.Instance.Id for the request
+
+
+ +

Definition at line 232 of file ApiHeaders.cs.

+
233  {
234  if (headers == null)
235  throw new ArgumentNullException(nameof(headers));
236  if (instanceId.HasValue && InstanceId.HasValue && instanceId != InstanceId)
237  throw new InvalidOperationException("Specified instance ID in constructor and SetRequestHeaders!");
238 
239  headers.Clear();
240  headers.Accept.Add(new MediaTypeWithQualityHeaderValue(ApplicationJson));
242  headers.Authorization = new AuthenticationHeaderValue(JwtAuthenticationScheme, Token);
243  else
244  {
245  headers.Authorization = new AuthenticationHeaderValue(PasswordAuthenticationScheme, Password);
246  headers.Add(UsernameHeader, Username);
247  }
248 
249  headers.UserAgent.Add(new ProductInfoHeaderValue(UserAgent));
250  headers.Add(ApiVersionHeader, new ProductHeaderValue(AssemblyName.Name, ApiVersion.ToString()).ToString());
251  instanceId = instanceId ?? InstanceId;
252  if (instanceId.HasValue)
253  headers.Add(InstanceIdHeader, instanceId.ToString());
254  }
static readonly AssemblyName AssemblyName
The current System.Reflection.AssemblyName
Definition: ApiHeaders.cs:51
+
const string ApplicationJson
TODO: Remove this when https://github.com/dotnet/corefx/pull/26701 makes it into the sdk
Definition: ApiHeaders.cs:21
+
Version ApiVersion
The client's API version
Definition: ApiHeaders.cs:76
+
const string PasswordAuthenticationScheme
The password authentication header scheme
Definition: ApiHeaders.cs:46
+
string Username
The client's username
Definition: ApiHeaders.cs:86
+
ProductHeaderValue UserAgent
The client's user agent as a ProductHeaderValue if valid
Definition: ApiHeaders.cs:66
+
string Password
The client's password
Definition: ApiHeaders.cs:91
+
bool IsTokenAuthentication
If the header uses password or JWT authentication
Definition: ApiHeaders.cs:96
+
long? InstanceId
The Models.Instance.Id being accessed
Definition: ApiHeaders.cs:61
+
const string JwtAuthenticationScheme
The JWT authentication header scheme
Definition: ApiHeaders.cs:41
+
const string ApiVersionHeader
The ApiVersion header key
Definition: ApiHeaders.cs:26
+
const string InstanceIdHeader
The InstanceId header key
Definition: ApiHeaders.cs:36
+
string Token
The client's JWT
Definition: ApiHeaders.cs:81
+
const string UsernameHeader
The Username header key
Definition: ApiHeaders.cs:31
+
+

References Tgstation.Server.Api.ApiHeaders.ApiVersion, Tgstation.Server.Api.ApiHeaders.ApiVersionHeader, Tgstation.Server.Api.ApiHeaders.ApplicationJson, Tgstation.Server.Api.ApiHeaders.AssemblyName, Tgstation.Server.Api.ApiHeaders.InstanceId, Tgstation.Server.Api.ApiHeaders.InstanceIdHeader, Tgstation.Server.Api.ApiHeaders.IsTokenAuthentication, Tgstation.Server.Api.ApiHeaders.JwtAuthenticationScheme, Tgstation.Server.Api.ApiHeaders.Password, Tgstation.Server.Api.ApiHeaders.PasswordAuthenticationScheme, Tgstation.Server.Api.ApiHeaders.Token, Tgstation.Server.Api.ApiHeaders.UserAgent, Tgstation.Server.Api.ApiHeaders.Username, and Tgstation.Server.Api.ApiHeaders.UsernameHeader.

+ +

Referenced by Tgstation.Server.Client.ApiClient.RunRequest< TResult >().

+ +
+
+

Member Data Documentation

+ +

◆ ApiVersionHeader

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Api.ApiHeaders.ApiVersionHeader = "Api"
+
+private
+
+ +

The ApiVersion header key

+ +

Definition at line 26 of file ApiHeaders.cs.

+ +

Referenced by Tgstation.Server.Api.ApiHeaders.ApiHeaders(), and Tgstation.Server.Api.ApiHeaders.SetRequestHeaders().

+ +
+
+ +

◆ ApplicationJson

+ +
+
+ + + + +
const string Tgstation.Server.Api.ApiHeaders.ApplicationJson = "application/json"
+
+
+ +

◆ AssemblyName

+ +
+
+ + + + + +
+ + + + +
readonly AssemblyName Tgstation.Server.Api.ApiHeaders.AssemblyName = Assembly.GetExecutingAssembly().GetName()
+
+staticprivate
+
+ +

The current System.Reflection.AssemblyName

+ +

Definition at line 51 of file ApiHeaders.cs.

+ +

Referenced by Tgstation.Server.Api.ApiHeaders.ApiHeaders(), and Tgstation.Server.Api.ApiHeaders.SetRequestHeaders().

+ +
+
+ +

◆ InstanceIdHeader

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Api.ApiHeaders.InstanceIdHeader = "Instance"
+
+private
+
+ +

The InstanceId header key

+ +

Definition at line 36 of file ApiHeaders.cs.

+ +

Referenced by Tgstation.Server.Api.ApiHeaders.ApiHeaders(), and Tgstation.Server.Api.ApiHeaders.SetRequestHeaders().

+ +
+
+ +

◆ IsTokenAuthentication

+ +
+
+ + + + +
bool Tgstation.Server.Api.ApiHeaders.IsTokenAuthentication => Token != null
+
+ +

If the header uses password or JWT authentication

+ +

Definition at line 96 of file ApiHeaders.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.HomeController.CreateToken(), and Tgstation.Server.Api.ApiHeaders.SetRequestHeaders().

+ +
+
+ +

◆ JwtAuthenticationScheme

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Api.ApiHeaders.JwtAuthenticationScheme = "Bearer"
+
+private
+
+ +

The JWT authentication header scheme

+ +

Definition at line 41 of file ApiHeaders.cs.

+ +

Referenced by Tgstation.Server.Api.ApiHeaders.ApiHeaders(), and Tgstation.Server.Api.ApiHeaders.SetRequestHeaders().

+ +
+
+ +

◆ PasswordAuthenticationScheme

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Api.ApiHeaders.PasswordAuthenticationScheme = "Password"
+
+private
+
+ +

The password authentication header scheme

+ +

Definition at line 46 of file ApiHeaders.cs.

+ +

Referenced by Tgstation.Server.Api.ApiHeaders.ApiHeaders(), and Tgstation.Server.Api.ApiHeaders.SetRequestHeaders().

+ +
+
+ +

◆ UserAgent

+ +
+
+ + + + +
ProductHeaderValue Tgstation.Server.Api.ApiHeaders.UserAgent => ProductInfoHeaderValue.TryParse(RawUserAgent, out var userAgent) ? userAgent.Product : null
+
+ +

The client's user agent as a ProductHeaderValue if valid

+ +

Definition at line 66 of file ApiHeaders.cs.

+ +

Referenced by Tgstation.Server.Api.ApiHeaders.SetRequestHeaders().

+ +
+
+ +

◆ UsernameHeader

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Api.ApiHeaders.UsernameHeader = "Username"
+
+private
+
+ +

The Username header key

+ +

Definition at line 31 of file ApiHeaders.cs.

+ +

Referenced by Tgstation.Server.Api.ApiHeaders.ApiHeaders(), and Tgstation.Server.Api.ApiHeaders.SetRequestHeaders().

+ +
+
+ +

◆ Version

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Api.ApiHeaders.Version => AssemblyName.Version
+
+static
+
+ +

Get the version of the Api the caller is using

+ +

Definition at line 56 of file ApiHeaders.cs.

+ +

Referenced by Tgstation.Server.Api.ApiHeaders.ApiHeaders(), and Tgstation.Server.Tests.IntegrationTest.TestStandardOperation().

+ +
+
+

Property Documentation

+ +

◆ ApiVersion

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Api.ApiHeaders.ApiVersion
+
+get
+
+
+ +

◆ InstanceId

+ +
+
+ + + + + +
+ + + + +
long? Tgstation.Server.Api.ApiHeaders.InstanceId
+
+getset
+
+
+ +

◆ Password

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.ApiHeaders.Password
+
+get
+
+
+ +

◆ RawUserAgent

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.ApiHeaders.RawUserAgent
+
+get
+
+ +

The client's raw user agent

+ +

Definition at line 71 of file ApiHeaders.cs.

+
71 { get; }
+

Referenced by Tgstation.Server.Api.ApiHeaders.ApiHeaders(), and Tgstation.Server.Host.Controllers.ApiController.OnActionExecutionAsync().

+ +
+
+ +

◆ Token

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.ApiHeaders.Token
+
+get
+
+
+ +

◆ Username

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.ApiHeaders.Username
+
+get
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_administration-members.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_administration-members.html new file mode 100644 index 0000000000..7f1f7701a0 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_administration-members.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.Administration Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_administration.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_administration.html new file mode 100644 index 0000000000..d10cad8e1c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_administration.html @@ -0,0 +1,220 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Administration Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Administration Class Reference
+
+
+ +

Represents administrative server information + More...

+ + + + + + + + + + + + + + +

+Properties

bool WindowsHost [get, set]
 If the server is running on a windows operating system More...
 
Uri TrackedRepositoryUrl [get, set]
 The GitHub repository the server is built to recieve updates from More...
 
Version LatestVersion [get, set]
 The latest available version of the Tgstation.Server.Host assembly from the upstream repository. If Version.Minor is higher than NewVersion's the update cannot be applied due to API changes More...
 
Version NewVersion [get, set]
 Changes the version of Tgstation.Server.Host to the given version from the upstream repository More...
 
+

Detailed Description

+

Represents administrative server information

+ +

Definition at line 8 of file Administration.cs.

+

Property Documentation

+ +

◆ LatestVersion

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Api.Models.Administration.LatestVersion
+
+getset
+
+ +

The latest available version of the Tgstation.Server.Host assembly from the upstream repository. If Version.Minor is higher than NewVersion's the update cannot be applied due to API changes

+ +

Definition at line 23 of file Administration.cs.

+
23 { get; set; }
+

Referenced by Tgstation.Server.Tests.AdministrationTest.TestRead().

+ +
+
+ +

◆ NewVersion

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Api.Models.Administration.NewVersion
+
+getset
+
+ +

Changes the version of Tgstation.Server.Host to the given version from the upstream repository

+ +

Definition at line 28 of file Administration.cs.

+
28 { get; set; }
+
+
+ +

◆ TrackedRepositoryUrl

+ +
+
+ + + + + +
+ + + + +
Uri Tgstation.Server.Api.Models.Administration.TrackedRepositoryUrl
+
+getset
+
+ +

The GitHub repository the server is built to recieve updates from

+ +

Definition at line 18 of file Administration.cs.

+
18 { get; set; }
+
+
+ +

◆ WindowsHost

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Api.Models.Administration.WindowsHost
+
+getset
+
+ +

If the server is running on a windows operating system

+ +

Definition at line 13 of file Administration.cs.

+
13 { get; set; }
+

Referenced by Tgstation.Server.Tests.AdministrationTest.TestRead().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_byond-members.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_byond-members.html new file mode 100644 index 0000000000..88bde46b92 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_byond-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.Byond Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Api.Models.Byond, including all inherited members.

+ + + +
InstallJobTgstation.Server.Api.Models.Byond
VersionTgstation.Server.Api.Models.Byond
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_byond.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_byond.html new file mode 100644 index 0000000000..2d33af2c13 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_byond.html @@ -0,0 +1,158 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Byond Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Byond Class Reference
+
+
+ +

Represents a BYOND installation + More...

+ + + + + + + + +

+Properties

Version Version [get, set]
 The System.Version of the Byond installation used for new compiles. Will be null if the user does not have permission to view it or there is no BYOND version installed. Only considers the Version.Major and Version.Minor numbers More...
 
Job InstallJob [get, set]
 The Job being used to install a new Version More...
 
+

Detailed Description

+

Represents a BYOND installation

+ +

Definition at line 8 of file Byond.cs.

+

Property Documentation

+ +

◆ InstallJob

+ +
+
+ + + + + +
+ + + + +
Job Tgstation.Server.Api.Models.Byond.InstallJob
+
+getset
+
+ +

The Job being used to install a new Version

+ +

Definition at line 18 of file Byond.cs.

+
18 { get; set; }
+
+
+ +

◆ Version

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Api.Models.Byond.Version
+
+getset
+
+ +

The System.Version of the Byond installation used for new compiles. Will be null if the user does not have permission to view it or there is no BYOND version installed. Only considers the Version.Major and Version.Minor numbers

+ +

Definition at line 13 of file Byond.cs.

+
13 { get; set; }
+
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Api/Models/Byond.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_bot-members.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_bot-members.html new file mode 100644 index 0000000000..156e97d4fe --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_bot-members.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.ChatBot Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_bot.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_bot.html new file mode 100644 index 0000000000..69bccb2574 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_bot.html @@ -0,0 +1,197 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.ChatBot Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.ChatBot Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.ChatBot:
+
+
+ + +Tgstation.Server.Api.Models.Internal.ChatBot + +
+ + + + + + + + + + + + +

+Public Member Functions

bool ValidateProviderChannelTypes ()
 Validates Channels are correct for the Internal.ChatBot.Provider More...
 
- Public Member Functions inherited from Tgstation.Server.Api.Models.Internal.ChatBot
ChatConnectionStringBuilder CreateConnectionStringBuilder ()
 Get the ChatConnectionStringBuilder which maps to the ConnectionString. More...
 
void SetConnectionStringBuilder (ChatConnectionStringBuilder stringBuilder)
 Set the ChatConnectionStringBuilder for the ChatBot. Also updates the ConnectionString. More...
 
+ + + + + + + + + + + + + + + + + + + + +

+Properties

List< ChatChannelChannels [get, set]
 Channels the Discord bot should listen/announce in More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.ChatBot
long Id [get, set]
 The settings id More...
 
string Name [get, set]
 The name of the connection More...
 
bool? Enabled [get, set]
 If the connection is enabled More...
 
ChatProviderProvider [get, set]
 The ChatProvider used for the connection More...
 
string ConnectionString [get, set]
 The information used to connect to the Provider More...
 
+

Detailed Description

+
+

Definition at line 8 of file ChatBot.cs.

+

Member Function Documentation

+ +

◆ ValidateProviderChannelTypes()

+ +
+
+ + + + + + + +
bool Tgstation.Server.Api.Models.ChatBot.ValidateProviderChannelTypes ()
+
+ +

Validates Channels are correct for the Internal.ChatBot.Provider

+
Returns
true if the Channels are valid for the Internal.ChatBot.Provider, false otherwise
+ +

Definition at line 19 of file ChatBot.cs.

+
20  {
21  switch (Provider)
22  {
23  case ChatProvider.Discord:
24  return Channels?.Select(x => x.DiscordChannelId.HasValue && x.IrcChannel == null).All(x => x) ?? true;
25  case ChatProvider.Irc:
26  return Channels?.Select(x => !x.DiscordChannelId.HasValue && x.IrcChannel != null).All(x => x) ?? true;
27  default:
28  throw new InvalidOperationException("Invalid provider type!");
29  }
30  }
List< ChatChannel > Channels
Channels the Discord bot should listen/announce in
Definition: ChatBot.cs:13
+
ChatProvider
Represents a chat service provider
Definition: ChatProvider.cs:6
+
ChatProvider? Provider
The ChatProvider used for the connection
Definition: ChatBot.cs:30
+
+

References Tgstation.Server.Api.Models.ChatBot.Channels, and Tgstation.Server.Api.Models.Internal.ChatBot.Provider.

+ +
+
+

Property Documentation

+ +

◆ Channels

+ +
+
+ + + + + +
+ + + + +
List<ChatChannel> Tgstation.Server.Api.Models.ChatBot.Channels
+
+getset
+
+ +

Channels the Discord bot should listen/announce in

+ +

Definition at line 13 of file ChatBot.cs.

+
13 { get; set; }
+

Referenced by Tgstation.Server.Api.Models.ChatBot.ValidateProviderChannelTypes().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_bot.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_bot.png new file mode 100644 index 0000000000000000000000000000000000000000..bf7dda1e3baa9bcbb091a6d0980ab8ba65f3df20 GIT binary patch literal 998 zcmeAS@N?(olHy`uVBq!ia0y~yVB`j}12~w0q~+EH4}g?JfKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+19PdTi(^OygRv| zdn^XiQUqtrUGnW*Y+#9&M9x+|r@GY0X-l`r=}Zc#k~z94!XqeTqlVZdk*kqg-cCq4 zSNQXX_`9#tmsLEiCRP{if00}#D*m%5Vv=?L?A^OF-%fb_@A{Rad;XNZDE*_?GtG8q zHJ8i%!;5y$j$G31t0T88Y>Kq)=gqx&Gx(o>D$c1ANsBzJ*A}n?o2j! z-r??9#h&y0BYJipbDWdKwZ_vcMc=kN!6I>@#rCJN5kDLxyEVlxd+0^Z;Ms0um2Rke z?{asqw)uvswQLVNWcE#*+_LBPl-9FP>tbDgr0XP=Z_?T1HcjjkXSadw+U|h-^!pxG zU-`OU*G=49An`muWkZLq!pC2W;`jV=tI3Nzbw4rj`^3e`>uW8xl!ccqTYh`$u?e}3 zY4V+td+)eE`)A8^L)0ho*!mYIj^3X4ePVU>c9p+A@^NvK{>@eDz9Fvq^6W2DovMeP zm)gHnM|fQNAA%I*UlTU!oDQmzWB9*!AA{FXCWGhK!w+hRG5GO|ur7{ZU=i(1ViX9~ z>0)&NMG-?FP%DFrXgBeK_I<9|Yo}goW(%kaa|IdU2sR>i!wX(9iRU|N{+wQZelmmK zlX-Xaf6a(L>gxB%*Ps3SdfV9RM{E9HnJB-XTY2k-bb*d}uJ1mkiGBZ5*MD^1PrJQq zm-NriEveRQ|D1gG?^+xA*YD5rSaSdV5+~l~I{#s_WPtJ=yJvTLBgKzaO+LCyz@+$+ z1T1okm7dLfEPeCiu87E#{<<=8HwM3w`9~wNEjkwFTAC?L-1|jm&fO`llhW68zc^ol341eBgi5+E9SQR0{ k-LQha`&yK?ZGSxj%RzI)#M*CSz)Z>D>FVdQ&MBb@0NG#EcK`qY literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel-members.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel-members.html new file mode 100644 index 0000000000..d2e017b503 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel-members.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.ChatChannel Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html new file mode 100644 index 0000000000..68c6737387 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html @@ -0,0 +1,289 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.ChatChannel Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.ChatChannel Class Reference
+
+
+ +

Indicates a chat channel + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.ChatChannel:
+
+
+ + +Tgstation.Server.Host.Models.ChatChannel + +
+ + + + + + + + + + + + + + + + + + + + +

+Properties

string IrcChannel [get, set]
 The IRC channel name More...
 
ulong? DiscordChannelId [get, set]
 The Discord channel ID More...
 
bool? IsAdminChannel [get, set]
 If the ChatChannel is an admin channel More...
 
bool? IsWatchdogChannel [get, set]
 If the ChatChannel is a watchdog channel More...
 
bool? IsUpdatesChannel [get, set]
 If the ChatChannel is an updates channel More...
 
string Tag [get, set]
 A custom tag users can define to group channels together More...
 
+

Detailed Description

+

Indicates a chat channel

+ +

Definition at line 8 of file ChatChannel.cs.

+

Property Documentation

+ +

◆ DiscordChannelId

+ +
+
+ + + + + +
+ + + + +
ulong? Tgstation.Server.Api.Models.ChatChannel.DiscordChannelId
+
+getset
+
+ +

The Discord channel ID

+ +

Definition at line 18 of file ChatChannel.cs.

+
18 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.MapChannels().

+ +
+
+ +

◆ IrcChannel

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.ChatChannel.IrcChannel
+
+getset
+
+ +

The IRC channel name

+ +

Definition at line 13 of file ChatChannel.cs.

+
13 { get; set; }
+
+
+ +

◆ IsAdminChannel

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.ChatChannel.IsAdminChannel
+
+getset
+
+ +

If the ChatChannel is an admin channel

+ +

Definition at line 24 of file ChatChannel.cs.

+
24 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.MapChannels().

+ +
+
+ +

◆ IsUpdatesChannel

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.ChatChannel.IsUpdatesChannel
+
+getset
+
+ +

If the ChatChannel is an updates channel

+ +

Definition at line 36 of file ChatChannel.cs.

+
36 { get; set; }
+
+
+ +

◆ IsWatchdogChannel

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.ChatChannel.IsWatchdogChannel
+
+getset
+
+ +

If the ChatChannel is a watchdog channel

+ +

Definition at line 30 of file ChatChannel.cs.

+
30 { get; set; }
+
+
+ +

◆ Tag

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.ChatChannel.Tag
+
+getset
+
+ +

A custom tag users can define to group channels together

+ +

Definition at line 41 of file ChatChannel.cs.

+
41 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.MapChannels().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.png new file mode 100644 index 0000000000000000000000000000000000000000..da19ad99ea6ed629591124f225c37ee8f6407924 GIT binary patch literal 963 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K50yvm~o~qF-*5N7E3&tn zLCwhcwYT)@$Wtn>ZXwSl-$H{a)?Bb6|sXzXQ90%dF-;53T=g{Dzt&^BXeqZv$@T3G``_N4^GtuskG7gp?mKb680;6sm+^mC$HcJj zAmg76|I8Y~+8FjPvFBq@=oM>VO<-g=v0A+$$jeiwq5l=*gvgtWHgYF9Q`kS;sn272 z$+$*s2PnvAZe?IdxyHmWA(ETHAx)QnzybBGxwpT0+HT9eZKq)-IB`!D1JEi57nSu= z4Ml&11;2i|{yhHNHJ-ytf)hQCo7nH%w>>f2>|^tagKsVgH|pw2JD@Lx!s zVME?q#`dMFthzf`F0Eg7`iLSE!{oCs-`hO1*m&gsS;iH)TbHCWXvKtvr@x(5_e6U^ zd&c2F0bX4TrsO_h?>C>A4m=esxEnp6DCZb^Zh97C?IKLZ&Rnu8t)EB`hv3mogY57{nNWAza0DV_UBG8vTle WreRYZo-7CEI0jEwKbLh*2~7a&8>~41 literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job-members.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job-members.html new file mode 100644 index 0000000000..817af30340 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job-members.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.CompileJob Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job.html new file mode 100644 index 0000000000..405c61f60b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job.html @@ -0,0 +1,215 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.CompileJob Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.CompileJob Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.CompileJob:
+
+
+ + +Tgstation.Server.Api.Models.Internal.CompileJob + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

Job Job [get, set]
 The Job relating to this job More...
 
RevisionInformation RevisionInformation [get, set]
 Git revision the compiler ran on. Not modifiable More...
 
Version ByondVersion [get, set]
 The Byond.Version the CompileJob was made with More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.CompileJob
long Id [get, set]
 The ID of the job More...
 
string DmeName [get, set]
 The .dme file used for compilation More...
 
string Output [get, set]
 Textual output of DM More...
 
Guid? DirectoryName [get, set]
 The Game folder the results were compiled into More...
 
DreamDaemonSecurityMinimumSecurityLevel [get, set]
 The minimum DreamDaemonSecurity required to run the CompileJob's output More...
 
+

Detailed Description

+
+

Definition at line 6 of file CompileJob.cs.

+

Property Documentation

+ +

◆ ByondVersion

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Api.Models.CompileJob.ByondVersion
+
+getset
+
+
+ +

◆ Job

+ +
+
+ + + + + +
+ + + + +
Job Tgstation.Server.Api.Models.CompileJob.Job
+
+getset
+
+ +

The Job relating to this job

+ +

Definition at line 11 of file CompileJob.cs.

+
11 { get; set; }
+
+
+ +

◆ RevisionInformation

+ +
+
+ + + + + +
+ + + + +
RevisionInformation Tgstation.Server.Api.Models.CompileJob.RevisionInformation
+
+getset
+
+ +

Git revision the compiler ran on. Not modifiable

+ +

Definition at line 16 of file CompileJob.cs.

+
16 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job.png new file mode 100644 index 0000000000000000000000000000000000000000..ea6fff3d174cd37fb704a1d51ba26d15beae358d GIT binary patch literal 1119 zcmeAS@N?(olHy`uVBq!ia0y~yU{nOM12~w0Wa25~pFm0?z$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-op(ojqu746aKTdDb@y?2z_S8jZ(v(R{R!*9r;_BrzNko&=GiZs5 ziswYFg_~+sW-i}rS6BM~s(qX5q!K0b;`)`z_qsmUSn8a#JwCs%#5pMV^RhO#=?Sap8am08=S#{Hem@@n?!G>?tyTdbyaRfb%VGd`%AQMB>g?k{iVDEI1B zygpbt&n4Y#bN99U`x{G|?N49WGS|P*X~oY1?&EiO7b~rtT>G_Umx)?S+uo1r?(Qe7 zxj0;J+s)Xokn-ss*RMGj&fU54{i4dYCx09CyI20K{dFUC?S(nE@^86YZWaC$TDal# zuCVRC>8F#*BF{!WYzf$&6XhJ68&`5OGbot*dCR)<3oRAd%inBr%MiQyw^-wqk^hSR zb5nXl&KPSy2zL6WXPwtub?D~nqf@u;3}3U34Mw(^@5(I)KInluyT=QbMc zJiTk>=G|xJX;1p1S$kuTO6-fJ992$#HFZ4muT2+TbyUq${?c~gNlQY6CM}tb5*>0a z(^4aYfRR?r_$T-mqX*+04NgXuUq3xv7@m7MF*M3G2niloIZ41_%@bw;O-@D^px{Ix zcZmuMHMuYED~EV#t_X_2PproqU;Ni)kaEWzc)g0!xnd|%GKR+Yw;H|}izW|=$tQCkcLQhHH)D0R~A@rKMdJ1l%IFbLmO+486%NsjBS zp>Rx-nz(e<{CP8rOCqPQ`uf0TH?O7A&4P1DX1Ui{c@19KEfkwrZ2T-wLUaKrncQhK zR5f{XHege1#OB^N9I<7$vRi!aMbCCUx6LePZLvw`TQ&O!rxrbWc|m4gy05HI*72Y0 zoUO6f?z(JynG< + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.ConfigurationFile Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html new file mode 100644 index 0000000000..df3a4843de --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html @@ -0,0 +1,251 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.ConfigurationFile Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.ConfigurationFile Class Reference
+
+
+ +

Represents a game configuration file. Create and delete actions uncerimonuously overwrite/delete files + More...

+ + + + + + + + + + + + + + + + + +

+Properties

string Path [get, set]
 The path to the ConfigurationFile file More...
 
bool? AccessDenied [get, set]
 If access to the ConfigurationFile file was denied for the operation More...
 
bool? IsDirectory [get, set]
 If Path represents a directory More...
 
string LastReadHash [get, set]
 The MD5 hash of the file when last read by the user. If this doesn't match during update actions, the write will be denied with System.Net.HttpStatusCode.Conflict More...
 
byte [] Content [get, set]
 The content of the ConfigurationFile. Will be null if AccessDenied is true or during listing and write operations More...
 
+

Detailed Description

+

Represents a game configuration file. Create and delete actions uncerimonuously overwrite/delete files

+ +

Definition at line 6 of file ConfigurationFile.cs.

+

Property Documentation

+ +

◆ AccessDenied

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.ConfigurationFile.AccessDenied
+
+getset
+
+ +

If access to the ConfigurationFile file was denied for the operation

+ +

Definition at line 16 of file ConfigurationFile.cs.

+
16 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.StaticFiles.Configuration.Read(), and Tgstation.Server.Host.Components.StaticFiles.Configuration.Write().

+ +
+
+ +

◆ Content

+ +
+
+ + + + + +
+ + + + +
byte [] Tgstation.Server.Api.Models.ConfigurationFile.Content
+
+getset
+
+ +

The content of the ConfigurationFile. Will be null if AccessDenied is true or during listing and write operations

+ +

Definition at line 32 of file ConfigurationFile.cs.

+
32 { get; set; }
+
+
+ +

◆ IsDirectory

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.ConfigurationFile.IsDirectory
+
+getset
+
+ +

If Path represents a directory

+ +

Definition at line 21 of file ConfigurationFile.cs.

+
21 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.StaticFiles.Configuration.Read(), and Tgstation.Server.Host.Components.StaticFiles.Configuration.Write().

+ +
+
+ +

◆ LastReadHash

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.ConfigurationFile.LastReadHash
+
+getset
+
+ +

The MD5 hash of the file when last read by the user. If this doesn't match during update actions, the write will be denied with System.Net.HttpStatusCode.Conflict

+ +

Definition at line 26 of file ConfigurationFile.cs.

+
26 { get; set; }
+
+
+ +

◆ Path

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.ConfigurationFile.Path
+
+getset
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder-members.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder-members.html new file mode 100644 index 0000000000..6bf11708e0 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder-members.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.DiscordConnectionStringBuilder Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder.html new file mode 100644 index 0000000000..fa8f6124a0 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder.html @@ -0,0 +1,266 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.DiscordConnectionStringBuilder Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.DiscordConnectionStringBuilder Class Reference
+
+
+ +

ChatConnectionStringBuilder for ChatProvider.Discord + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.DiscordConnectionStringBuilder:
+
+
+ + +Tgstation.Server.Api.Models.Internal.ChatConnectionStringBuilder + +
+ + + + + + + + + + + +

+Public Member Functions

 DiscordConnectionStringBuilder ()
 Construct a DiscordConnectionStringBuilder More...
 
 DiscordConnectionStringBuilder (string connectionString)
 Construct a DiscordConnectionStringBuilder from a connectionString More...
 
override string ToString ()
 Gets the ChatBot.ConnectionString associated with the ChatConnectionStringBuilder More...
 
+ + + +

+Public Attributes

override bool Valid => !String.IsNullOrEmpty(BotToken)
 
+ + + + + + + + +

+Properties

string BotToken [get, set]
 The Discord bot token More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.ChatConnectionStringBuilder
abstract bool Valid [get]
 If the ChatConnectionStringBuilder evaluates to a valid ChatBot.ConnectionString More...
 
+

Detailed Description

+

ChatConnectionStringBuilder for ChatProvider.Discord

+ +

Definition at line 9 of file DiscordConnectionStringBuilder.cs.

+

Constructor & Destructor Documentation

+ +

◆ DiscordConnectionStringBuilder() [1/2]

+ +
+
+ + + + + + + +
Tgstation.Server.Api.Models.DiscordConnectionStringBuilder.DiscordConnectionStringBuilder ()
+
+ +

Construct a DiscordConnectionStringBuilder

+ +

Definition at line 23 of file DiscordConnectionStringBuilder.cs.

+
23 { }
+
+
+ +

◆ DiscordConnectionStringBuilder() [2/2]

+ +
+
+ + + + + + + + +
Tgstation.Server.Api.Models.DiscordConnectionStringBuilder.DiscordConnectionStringBuilder (string connectionString)
+
+ +

Construct a DiscordConnectionStringBuilder from a connectionString

+
Parameters
+ + +
connectionStringThe connection string
+
+
+ +

Definition at line 29 of file DiscordConnectionStringBuilder.cs.

+
30  {
31  BotToken = connectionString ?? throw new ArgumentNullException(nameof(connectionString));
32  }
+
+

References Tgstation.Server.Api.Models.DiscordConnectionStringBuilder.BotToken.

+ +
+
+

Member Function Documentation

+ +

◆ ToString()

+ +
+
+ + + + + +
+ + + + + + + +
override string Tgstation.Server.Api.Models.DiscordConnectionStringBuilder.ToString ()
+
+virtual
+
+
+

Member Data Documentation

+ +

◆ Valid

+ +
+
+ + + + +
override bool Tgstation.Server.Api.Models.DiscordConnectionStringBuilder.Valid => !String.IsNullOrEmpty(BotToken)
+
+ +

+ +

Definition at line 12 of file DiscordConnectionStringBuilder.cs.

+ +
+
+

Property Documentation

+ +

◆ BotToken

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.DiscordConnectionStringBuilder.BotToken
+
+getset
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder.png new file mode 100644 index 0000000000000000000000000000000000000000..040d41abe0c87a1cd5d469b3b0f0ad2ee934a39d GIT binary patch literal 1386 zcmeAS@N?(olHy`uVBq!ia0y~yU~B@i12~w0r1H`xZ6GBP;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|!1B}6#WAFU@$KB#d5^7l*xXGvy#Ief zT{>FKGqCTnS^JA7?)urklYJMx&Ma2bwOQ_Y z&Dpg!ts%d1QchwRho1Dr?CrbsU-rtLId)Vn+Js@Vjt%R(lC@G7KgI05@lTs&-JyJ? zg4UmxbUFkjsybt>EY@kBX&|Lnwco7~EDE9Ikw78k^>D1KSH>iMI`-!{%DPki-!cjekVv%g{c zH*YoKD9INW{5i!gC(cDBJYVgF;EzCUrB8={Ef=g=Sa(^|!mqRAMEjTg`Ay$ni<>G5 zPMp+n;{PHi1*J)=&}+Q&9`7yXkukoEsXSx#cr@lO^GvOU{BUV8aSgvBvt&*ha&cLHAgJaI@g zyY<1k-J8q4CvlrUeR_@i?SFwLcinj(|Ci?dyFLHi&bh4CzH@hf{&B(1XkPzQ+ql*R z>o=Seng2NY@0S?kId5N!y2_UF$F1kSZ2h?UmX*&d2GhlVpLb~a{IhGaWtMup$WZTV zgn2xxEM6*6!Kw;lKRZ^?7_u(pnYuJKifvX!ajD zTqD}TX7Mt*`+(^=hJ$-{Iq73-Y|qX4yB3ao@#(I^ zgK55If5L%D;lZ5s+JDrVx-I`JZ&q+icyTtpFeEqYeevs^vsl;j{o81#aj`q^I~$WZ zch1RuH#?5Gybpfy^T3(P#dg2?<&!gQHc4OquAF+NC82$m)%{;D-~5kwpER3od!6{Q z@_pQG`#6uuB + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.DreamDaemon Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html new file mode 100644 index 0000000000..6f393e9203 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html @@ -0,0 +1,317 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.DreamDaemon Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.DreamDaemon Class Reference
+
+
+ +

Represents an instance of BYOND's DreamDaemon game server. Create action starts the server. Delete action shuts down the server + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.DreamDaemon:
+
+
+ + +Tgstation.Server.Api.Models.Internal.DreamDaemonSettings +Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

CompileJob ActiveCompileJob [get, set]
 The live revision More...
 
CompileJob StagedCompileJob [get, set]
 The next revision to go live More...
 
bool? Running [get, set]
 The current status of DreamDaemon More...
 
DreamDaemonSecurityCurrentSecurity [get, set]
 The current DreamDaemonSecurity of DreamDaemon. May be downgraded due to requirements of ActiveCompileJob More...
 
ushort? CurrentPort [get, set]
 The port the running DreamDaemon instance is set to More...
 
bool? CurrentAllowWebclient [get, set]
 The webclient status the running DreamDaemon instance is set to More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.DreamDaemonSettings
bool? AutoStart [get, set]
 If DreamDaemon starts when it's Instance starts More...
 
bool? SoftRestart [get, set]
 If the server is undergoing a soft reset. This may be automatically set by changes to other fields More...
 
bool? SoftShutdown [get, set]
 If the server is undergoing a soft shutdown More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters
bool? AllowWebClient [get, set]
 If the BYOND web client can be used to connect to the game server More...
 
DreamDaemonSecuritySecurityLevel [get, set]
 The DreamDaemonSecurity level of DreamDaemon More...
 
ushort? PrimaryPort [get, set]
 The first port DreamDaemon uses. This should be the publically advertised port More...
 
ushort? SecondaryPort [get, set]
 The second port DreamDaemon uses More...
 
uint? StartupTimeout [get, set]
 The DreamDaemon startup timeout in seconds More...
 
+ + + + + +

+Additional Inherited Members

- Public Member Functions inherited from Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters
bool Match (DreamDaemonLaunchParameters otherParameters)
 Check if we match a given set of otherParameters More...
 
+

Detailed Description

+

Represents an instance of BYOND's DreamDaemon game server. Create action starts the server. Delete action shuts down the server

+ +

Definition at line 8 of file DreamDaemon.cs.

+

Property Documentation

+ +

◆ ActiveCompileJob

+ +
+
+ + + + + +
+ + + + +
CompileJob Tgstation.Server.Api.Models.DreamDaemon.ActiveCompileJob
+
+getset
+
+ +

The live revision

+ +

Definition at line 13 of file DreamDaemon.cs.

+
13 { get; set; }
+
+
+ +

◆ CurrentAllowWebclient

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.DreamDaemon.CurrentAllowWebclient
+
+getset
+
+ +

The webclient status the running DreamDaemon instance is set to

+ +

Definition at line 38 of file DreamDaemon.cs.

+
38 { get; set; }
+
+
+ +

◆ CurrentPort

+ +
+
+ + + + + +
+ + + + +
ushort? Tgstation.Server.Api.Models.DreamDaemon.CurrentPort
+
+getset
+
+ +

The port the running DreamDaemon instance is set to

+ +

Definition at line 33 of file DreamDaemon.cs.

+
33 { get; set; }
+
+
+ +

◆ CurrentSecurity

+ +
+
+ + + + + +
+ + + + +
DreamDaemonSecurity? Tgstation.Server.Api.Models.DreamDaemon.CurrentSecurity
+
+getset
+
+ +

The current DreamDaemonSecurity of DreamDaemon. May be downgraded due to requirements of ActiveCompileJob

+ +

Definition at line 28 of file DreamDaemon.cs.

+
28 { get; set; }
+
+
+ +

◆ Running

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.DreamDaemon.Running
+
+getset
+
+ +

The current status of DreamDaemon

+ +

Definition at line 23 of file DreamDaemon.cs.

+
23 { get; set; }
+
+
+ +

◆ StagedCompileJob

+ +
+
+ + + + + +
+ + + + +
CompileJob Tgstation.Server.Api.Models.DreamDaemon.StagedCompileJob
+
+getset
+
+ +

The next revision to go live

+ +

Definition at line 18 of file DreamDaemon.cs.

+
18 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.png new file mode 100644 index 0000000000000000000000000000000000000000..46fff49bd3e9582f7d078a06fed0a191cba40c8b GIT binary patch literal 2043 zcmb`|c{rQd9tZF@Mb++cpN_4m>1{A-yY^TbrCg%KjK*k3F&&JpB0+=NQd&l-lD5{g z+9EEZG#VkbyOuVVTADOzMAQ;%X%R&=_ig8&JNM3?bDrm%_xC=}_dVzQ@j2(s`X1$? zAgdt@0DuD0)yWG0ASAHdphJuf4OgQ!0z6 z1->4N^+KHmz|fcW>IEA7PWlGY$pIY?S-rPPT>ehpNolnvLF~eZeLh9Rt?+JchgX?9 zho~sKE)YI4%{|VBm5}wyieS|+BnOR!=~c_-!nD1+@+&G%z=?Oz`Xoy+(zH&Tlq46p z+=(H=pabWP>{*D88yiVn!{@Zii~3!Dri^(}j8Hebq_mN4JgJ~p?ku@|k;!&DBJl+Ma$(>H^HPrsh3Sp%Q>b%d`tbU&d<$Dj z^so-WuEsB}ZqNixSJvMDvj^89G|W5dJJQcLC0}gD^Uh3Rt~KUx$Yg%bRc0MBu#C#2 z&^V@QF~N55k@ST@YuV9*@MjJ8r61_(4c?sLU#(Q>PYcfZ@bhXpPhQZR_bfY^t8iaO zZ{YJL*72Y;R+Rs&%J|ZNtwy(c@$24wo(`v}A2Gk!RczHiX1%?b*SUh%kx|7m5!+MzCCTA8 z)TUGsPjjLSx@T~6soxiF(&M5Up6aU; z|2X>7kc;T{`VQ;07hC|96I}G*_IoR!Pjx{8-qUuZ^ZfmqO3IMxyM(87FAK`?<=i6ishtzhSn^;Vj-u1w$7w^pf!MRT?gt8~8Du%2K+z-8Q_Q zs9s>Pm*G0*$4E#(?rPt_z6~@+2K)#b(C1E)wuooOPJ$LWy|Dl|0RZ#vg1FXz5ww)_x7A<(obay*>;_}WVI^+k<{mr$hJo9DK~6i41Q-2p z;fzC7L#agfWqYlu?xJE{WZ|qqp;km$KyLzKwP2RZ*t{z+Qira_p_tO++8q4;{7N!O z`1Vz*MYARKf=EMU6AJf9+Y6N*-3`d!k$~SaIN4!$d&>s)rk}UByHd?_^i`Y~zhsH? zQyex;w&m|n+4R_&&H6uI{}bLJ9aELuOFy)%AjgUk*EXW{EXF4$N=>jW7GW!A@x?St z--CgVbEJg{%J-~Yj&XqyRhC&c^i+{%f20$pqfMb5IhKXUoN>h8wWydBgb~wLJe72V zus}$hL6W)*wzd2iDL>1PHxfyVoF?v^%%K<+GVId>9gB?DO-OUCMQK#;N@#4*Q%ZBV+$cX}$h8v!vLEBKp?){1MVld4pn_ z4NW%FhuFuM8B*_&$?v7I8kNiP9gZb#%(v=CNWe`Bj*)J^HzDb8L|U!ZOta=Yw4DR? zw?seIWLyq{;`;mWJI6I@OV1Bp7t~(!>`~z&NGUkBV^iPD;}&tR)P_>5=)N8&`D-y5 z$wq!6*rF4ATGEXen~m}JCw?X)IQ-1t1+$DZHo`=RHtS{W!ivPr(x~A~&R+Ug#0=j* z`u$>Ki(uw4jxHgGx#^F91Pk&}*&ZU+(o!k3@$& zDx&W0PZ5S?p@25w(*I>_1y6UB{_*8@*4*QH9)RaHUPz%NryLeqJISo03UdI=sE1WZ z$AZI+N4>8?GjPTU@{4w9F};&6CXgg=dUrz5;?7(#g$>~$=K1Up&$({~qR*B6+L*N* zjWZr+mj((bX02wYF;D#1+?B*zRvNi$agcSxNf{w6IFvlPFr?PZD=`=8?G0*_)=_!~ zHI#;91`=a8ow$&XTlkraszAWl5SDjv53wC)6|bQjlzIjJPC>Jq1I_Ll!qr+e7%INR zMs~;%>KE(@fnEqUE$&T;oO`{uuQzp$8Q08gAZF<%Z`m0|{OX|fNIwGeaO!|C@_dZ+ zI20qNYj>tReB&F`tVyf2BA#G|-R#JW`8=O9{jopZhjnEbKQhps*OnObcIh-+cSh_9 zXO_3zp|yNx2gOvLV0~(dP{#>*_#Fx8@6^I6b@!KRCh0B7eWCtgzM-|mXWPmGTZRnk zfg~2RbyQ%ygo0b$t4fntucsAA5)#o^zzq;T`QJNh2~tI4xz*7MP-1{ef232dEr + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.DreamMaker Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker.html new file mode 100644 index 0000000000..318a7e67f4 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker.html @@ -0,0 +1,196 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.DreamMaker Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.DreamMaker Class Reference
+
+
+ +

Represents the state of the DreamMaker compiler. Create action starts a new compile. Delete action cancels the current compile + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.DreamMaker:
+
+
+ + +Tgstation.Server.Host.Models.DreamMakerSettings + +
+ + + + + + + + + + + +

+Properties

string ProjectName [get, set]
 The .dme file DreamMaker tries to compile with without the extension More...
 
ushort? ApiValidationPort [get, set]
 The port used during compilation to validate the DMAPI More...
 
DreamDaemonSecurityApiValidationSecurityLevel [get, set]
 The DreamDaemonSecurity level used to validate the DMAPI More...
 
+

Detailed Description

+

Represents the state of the DreamMaker compiler. Create action starts a new compile. Delete action cancels the current compile

+ +

Definition at line 8 of file DreamMaker.cs.

+

Property Documentation

+ +

◆ ApiValidationPort

+ +
+
+ + + + + +
+ + + + +
ushort? Tgstation.Server.Api.Models.DreamMaker.ApiValidationPort
+
+getset
+
+ +

The port used during compilation to validate the DMAPI

+ +

Definition at line 19 of file DreamMaker.cs.

+
19 { get; set; }
+
+
+ +

◆ ApiValidationSecurityLevel

+ +
+
+ + + + + +
+ + + + +
DreamDaemonSecurity? Tgstation.Server.Api.Models.DreamMaker.ApiValidationSecurityLevel
+
+getset
+
+ +

The DreamDaemonSecurity level used to validate the DMAPI

+ +

Definition at line 25 of file DreamMaker.cs.

+
25 { get; set; }
+
+
+ +

◆ ProjectName

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.DreamMaker.ProjectName
+
+getset
+
+ +

The .dme file DreamMaker tries to compile with without the extension

+ +

Definition at line 13 of file DreamMaker.cs.

+
13 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker.png new file mode 100644 index 0000000000000000000000000000000000000000..efbc7cd037f50494ce5cc6229bd5b7f12ea06b9b GIT binary patch literal 1182 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!12~w0z$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opQBPW z#u1X`tB>Y4fBo|D*T`cGZ8pzU{o2`O~Hw@$aXm2EER&NLPDb zo4>vEjlA)~qsfU}90~za*Q{AG(k@6G&MDYAYfDZ=@v^k@7u)QDpC7FJwn5BY|H$r{ zS06pB)=gqqzy5&K!Cry%qHX?C0w?UMBHr=vB1_q^C(P@q! zULG!vsJ2*~S+%9?)Vy=XYnrdbXx=Tp({^kD|HX(m-g~2K9T+C=<9WS_clqu!WlMFZ zy(sz=rk8lO=Fq9458@Ht(#!gO@2^ffxrIno=QYXzkhXR)>`%r=cfHDlD>8O z!w#X}7c=!Wt}lJIY~!?;yk(o7<;{72{)d^#-Fs{K?k}5`*6kj6Fh^0SiL6!ZJRVD`#Cw~SVhghS=W9Y`ZP(! z^;gbp^Y`a#Z|PhAzxRCY<*P{_y3D_Lemb;i<(ks#OBWl?UtG$Y9e?)VDT`R$c~7RV z=m?JRf4yE_Up@Z~H03-r*jK*@l5!Hiw&vA(@etvBc?{@cSUesIH z^WZw?nvGUXvrpc9lsk#(rhB>8F+HXT?wboX&FNR0Sr}pBx?$fV<-Sicef|lO%C-lM zBdQe^$5zcL(^|3S;h~xz3xe1ltl;gHmtV2*#`LP~yEg2ZY;b@j8R>9(| l>d>uix!Sq6x7~eZztqb1%tfxd{lLP6!PC{xWt~$(695F|ED`_! literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message-members.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message-members.html new file mode 100644 index 0000000000..a8c01390d4 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.ErrorMessage Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html new file mode 100644 index 0000000000..515501e110 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html @@ -0,0 +1,162 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.ErrorMessage Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.ErrorMessage Class Reference
+
+
+ +

Represents an error message returned by the server + More...

+ + + + + + + + +

+Properties

string Message [get, set]
 A human readable description of the error More...
 
Version SeverApiVersion = ApiHeaders.Version [get, set]
 The version of the API the server is using More...
 
+

Detailed Description

+

Represents an error message returned by the server

+ +

Definition at line 8 of file ErrorMessage.cs.

+

Property Documentation

+ +

◆ Message

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.ErrorMessage.Message
+
+getset
+
+
+ +

◆ SeverApiVersion

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Api.Models.ErrorMessage.SeverApiVersion = ApiHeaders.Version
+
+getset
+
+ +

The version of the API the server is using

+ +

Definition at line 18 of file ErrorMessage.cs.

+
18 { get; set; } = ApiHeaders.Version;
+

Referenced by Tgstation.Server.Client.ClientException.ClientException???().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance-members.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance-members.html new file mode 100644 index 0000000000..15a5c5de1c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance-members.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.Instance Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html new file mode 100644 index 0000000000..bcc91f8ba5 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html @@ -0,0 +1,347 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Instance Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Instance Class Reference
+
+
+ +

Metadata about a server instance + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.Instance:
+
+
+ + +Tgstation.Server.Host.Models.Instance + +
+ + + + + +

+Public Member Functions

Instance CloneMetadata ()
 Create a clone of the essential Instance metadata More...
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Properties

long Id [get, set]
 The id of the Instance. Not modifiable More...
 
string Name [get, set]
 The name of the Instance More...
 
string Path [get, set]
 The path to where the Instance is located. Can only be changed while the Instance is offline. Must not exist when the instance is created More...
 
bool? Online [get, set]
 If the Instance is online More...
 
ConfigurationTypeConfigurationType [get, set]
 If ConfigurationFile can be used on the Instance More...
 
uint? AutoUpdateInterval [get, set]
 The time interval in minutes the repository is automatically pulled and compiles. 0 disables More...
 
Job MoveJob [get, set]
 The Job representing a change of Path More...
 
+

Detailed Description

+

Metadata about a server instance

+ +

Definition at line 9 of file Instance.cs.

+

Member Function Documentation

+ +

◆ CloneMetadata()

+ +
+
+ + + + + + + +
Instance Tgstation.Server.Api.Models.Instance.CloneMetadata ()
+
+ +

Create a clone of the essential Instance metadata

+
Returns
A clone of the essential Instance metadata
+ +
+
+

Property Documentation

+ +

◆ AutoUpdateInterval

+ +
+
+ + + + + +
+ + + + +
uint? Tgstation.Server.Api.Models.Instance.AutoUpdateInterval
+
+getset
+
+ +

The time interval in minutes the repository is automatically pulled and compiles. 0 disables

+ +

Definition at line 44 of file Instance.cs.

+
44 { get; set; }
+
+
+ +

◆ ConfigurationType

+ +
+
+ + + + + +
+ + + + +
ConfigurationType? Tgstation.Server.Api.Models.Instance.ConfigurationType
+
+getset
+
+ +

If ConfigurationFile can be used on the Instance

+ +

Definition at line 38 of file Instance.cs.

+
38 { get; set; }
+

Referenced by Tgstation.Server.Host.Controllers.ConfigurationController.ForbidDueToModeConflicts().

+ +
+
+ +

◆ Id

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Api.Models.Instance.Id
+
+getset
+
+ +

The id of the Instance. Not modifiable

+ +

Definition at line 14 of file Instance.cs.

+
14 { get; set; }
+

Referenced by Tgstation.Server.Host.Controllers.InstanceUserController.Create(), Tgstation.Server.Host.Controllers.ChatController.Create(), Tgstation.Server.Host.Controllers.RepositoryController.Create(), Tgstation.Server.Client.InstanceManagerClient.CreateClient(), Tgstation.Server.Host.Controllers.InstanceUserController.Delete(), Tgstation.Server.Host.Controllers.RepositoryController.Delete(), Tgstation.Server.Host.Controllers.DreamMakerController.GetId(), Tgstation.Server.Host.Controllers.InstanceUserController.GetId(), Tgstation.Server.Host.Controllers.JobController.List(), Tgstation.Server.Host.Controllers.DreamMakerController.List(), Tgstation.Server.Host.Controllers.InstanceUserController.List(), Tgstation.Server.Host.Controllers.ChatController.List(), Tgstation.Server.Host.Controllers.JobController.Read(), Tgstation.Server.Host.Controllers.DreamMakerController.Read(), Tgstation.Server.Client.Components.ConfigurationClient.Read(), Tgstation.Server.Host.Controllers.RepositoryController.Read(), Tgstation.Server.Host.Controllers.DreamDaemonController.ReadImpl(), Tgstation.Server.Host.Controllers.ByondController.Update(), Tgstation.Server.Host.Controllers.InstanceUserController.Update(), Tgstation.Server.Host.Controllers.DreamMakerController.Update(), Tgstation.Server.Host.Controllers.DreamDaemonController.Update(), Tgstation.Server.Host.Controllers.ChatController.Update(), and Tgstation.Server.Host.Controllers.RepositoryController.Update().

+ +
+
+ +

◆ MoveJob

+ +
+
+ + + + + +
+ + + + +
Job Tgstation.Server.Api.Models.Instance.MoveJob
+
+getset
+
+ +

The Job representing a change of Path

+

Due to how Jobs are children of Instances but moving one requires the Instance to be offline, interactions with this Job are performed in a non-standard fashion. The Job is read by querying the Instance again (either via list or ID lookup) and cancelled by making any sort of update to the Instance. Once the Instance comes back Online it can be queried like a normal job

+ +

Definition at line 51 of file Instance.cs.

+
51 { get; set; }
+
+
+ +

◆ Name

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Instance.Name
+
+getset
+
+ +

The name of the Instance

+ +

Definition at line 20 of file Instance.cs.

+
20 { get; set; }
+
+
+ +

◆ Online

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.Instance.Online
+
+getset
+
+ +

If the Instance is online

+ +

Definition at line 32 of file Instance.cs.

+
32 { get; set; }
+
+
+ +

◆ Path

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Instance.Path
+
+getset
+
+ +

The path to where the Instance is located. Can only be changed while the Instance is offline. Must not exist when the instance is created

+ +

Definition at line 26 of file Instance.cs.

+
26 { get; set; }
+

Referenced by Tgstation.Server.Tests.Instance.ConfigurationTest.FileExists().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.png new file mode 100644 index 0000000000000000000000000000000000000000..98ee17cfa8ac858e409baf4c5c90086188b70ee5 GIT binary patch literal 910 zcmeAS@N?(olHy`uVBq!ia0vp^&wx09gBeI#ssDTkq$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IZ0Wj$RSLn;{G&P^uFuW?)1-FbLkUtR)yVSY7Sz$J`FlSGuEmzK9=hL9{;gxjyj`H zicWvKS=!ziCxqD#8Xt%(Ge2Lfc5u(p&2thz%B+4O_WJ3J>wJUZ_^a|j8T_1cVS5BlfP-41~LFB5IV^f0rZY>jk zJ8@~JsB7Qm&6YcFgwHsdY?@-9e_frjz+lUoU zi8vj@|5Z;sq0H_0b>-cQ=BlokJL_CUV`b!)b^foUu1Sk*y_E4#eMa7_!#%}CZ-3uE zm)4UhWFh|c#98_63w-p?Et8%X`m6NfE5F;jZ(chV^VwK+@vT+gOxnI=2F<;ud!cl> zX~c4tz1^A1|313T@gTZtV>QEShRfT<8|1I$AJ}r6_rv2~qB9syZZTlol#$4ka`CZq zte56Z)(?4i89u!>Hpt)J|KJbL8SAI&1$7+HUTtBhgsVKna$->{=LA=7VTEp3h)2y} zh(uHHLFj7K>)EBNw_f|+rKL0}mOI!*rCV%ShliNynN9yYJ9Zs={C9fw^|(1|ogFT> z&hGj6@lM;@Y+-w;zWJ^$bFSpgTdSV9=Vobnu-kx|**|yGxDNp)p{_huM@-M$| z9A9R4rcBs4#qf6bv%86X*R7TS<7mqq{@Ib`7nfC>$!+rpoGu~>jHI6{Lyn0|jy1R0 z`6heg-K(!xe$;fIJ@d4}F&Vz8w@-fA$E*~z=F4Kszl9wPpSP%O3p|o}>*){fWnTN1 znjN;8RwxpFI+CAtx24k;tDYZMF3ngpcj-z)_xd@Babjy;63J|T zwLcUZzWkkTe9UBF^P;_WvjbfzTsshR+xX}ra6Fx{1jdso?{}+L zTh85E`ZAVf?ljWd&&W0NpK>I)!Sz`G6W~;bajQfsLTWhoURX$zbpA#RCd*0 Y#_l%;e1FyEf^r;#r>mdKI;Vst0FT79asU7T literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user-members.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user-members.html new file mode 100644 index 0000000000..1d1c2c96be --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user-members.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.InstanceUser Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html new file mode 100644 index 0000000000..c883edcc2b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html @@ -0,0 +1,343 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.InstanceUser Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.InstanceUser Class Reference
+
+
+ +

Represents a Users permissions in an Instance + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.InstanceUser:
+
+
+ + +Tgstation.Server.Host.Models.InstanceUser + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

long? UserId [get, set]
 The Internal.User.Id of the User the InstanceUser belongs to More...
 
InstanceUserRightsInstanceUserRights [get, set]
 The Rights.InstanceUserRights of the InstanceUser More...
 
ByondRightsByondRights [get, set]
 The Rights.ByondRights of the InstanceUser More...
 
DreamDaemonRightsDreamDaemonRights [get, set]
 The Rights.DreamDaemonRights of the InstanceUser More...
 
DreamMakerRightsDreamMakerRights [get, set]
 The Rights.DreamMakerRights of the InstanceUser More...
 
RepositoryRightsRepositoryRights [get, set]
 The Rights.RepositoryRights of the InstanceUser More...
 
ChatBotRightsChatBotRights [get, set]
 The Rights.ChatBotRights of the InstanceUser More...
 
ConfigurationRightsConfigurationRights [get, set]
 The Rights.ConfigurationRights of the InstanceUser More...
 
+

Detailed Description

+

Represents a Users permissions in an Instance

+ +

Definition at line 9 of file InstanceUser.cs.

+

Property Documentation

+ +

◆ ByondRights

+ +
+
+ + + + + +
+ + + + +
ByondRights? Tgstation.Server.Api.Models.InstanceUser.ByondRights
+
+getset
+
+ +

The Rights.ByondRights of the InstanceUser

+ +

Definition at line 27 of file InstanceUser.cs.

+
27 { get; set; }
+
+
+ +

◆ ChatBotRights

+ +
+
+ + + + + +
+ + + + +
ChatBotRights? Tgstation.Server.Api.Models.InstanceUser.ChatBotRights
+
+getset
+
+ +

The Rights.ChatBotRights of the InstanceUser

+ +

Definition at line 51 of file InstanceUser.cs.

+
51 { get; set; }
+
+
+ +

◆ ConfigurationRights

+ +
+
+ + + + + +
+ + + + +
ConfigurationRights? Tgstation.Server.Api.Models.InstanceUser.ConfigurationRights
+
+getset
+
+ +

The Rights.ConfigurationRights of the InstanceUser

+ +

Definition at line 57 of file InstanceUser.cs.

+
57 { get; set; }
+
+
+ +

◆ DreamDaemonRights

+ +
+
+ + + + + +
+ + + + +
DreamDaemonRights? Tgstation.Server.Api.Models.InstanceUser.DreamDaemonRights
+
+getset
+
+ +

The Rights.DreamDaemonRights of the InstanceUser

+ +

Definition at line 33 of file InstanceUser.cs.

+
33 { get; set; }
+
+
+ +

◆ DreamMakerRights

+ +
+
+ + + + + +
+ + + + +
DreamMakerRights? Tgstation.Server.Api.Models.InstanceUser.DreamMakerRights
+
+getset
+
+ +

The Rights.DreamMakerRights of the InstanceUser

+ +

Definition at line 39 of file InstanceUser.cs.

+
39 { get; set; }
+

Referenced by Tgstation.Server.Host.Controllers.DreamMakerController.Update().

+ +
+
+ +

◆ InstanceUserRights

+ +
+
+ + + + + +
+ + + + +
InstanceUserRights? Tgstation.Server.Api.Models.InstanceUser.InstanceUserRights
+
+getset
+
+ +

The Rights.InstanceUserRights of the InstanceUser

+ +

Definition at line 21 of file InstanceUser.cs.

+
21 { get; set; }
+
+
+ +

◆ RepositoryRights

+ +
+
+ + + + + +
+ + + + +
RepositoryRights? Tgstation.Server.Api.Models.InstanceUser.RepositoryRights
+
+getset
+
+ +

The Rights.RepositoryRights of the InstanceUser

+ +

Definition at line 45 of file InstanceUser.cs.

+
45 { get; set; }
+
+
+ +

◆ UserId

+ +
+
+ + + + + +
+ + + + +
long? Tgstation.Server.Api.Models.InstanceUser.UserId
+
+getset
+
+ +

The Internal.User.Id of the User the InstanceUser belongs to

+ +

Definition at line 15 of file InstanceUser.cs.

+
15 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.png new file mode 100644 index 0000000000000000000000000000000000000000..11293fa7860ba1d282997405436b7d640c83f0c8 GIT binary patch literal 966 zcmV;%13CPOP)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d000A3Nkl&YQc@n@vX5{hE+iVoG@*+U+4Crg`z8YgQ;5>3+<8PMuGT{z>4&xgE z9B1Rh(Ef49?b*8Dr(K;vJ>qkSX)?X$E8C&4+Z`O)dj@?;LcJ1*-v7r@!xu9A$2(J+|z)3$^0H&sd z08Z#_DT)nRP!51w|4RVswVrvl25@`;lXQKe1)v)2M-9Ut!_Qk_Wl#s5jcTwrbP3>c z3%DAtcZB|^QJIfE)&hW=<^aT=?9rl%p!fK1H6R9HterD%8u8mYNcxK!;F?$a=As6? zd|7Jvc(kXZ!)AhQYpKxP#HfXpfY0GU+)05Yop0AyAH0LZKY0FYS)03fpp06=CH z0DyOD+qUhUx^3IGy-{o;B6(E+3P1r65y`6#pgsRYL|yao{>%0Cj?*L&kx0*Be(>?! zn{BsQKWdJjMMPhF_i~KNfb*DzftQ1e$h@ur9K9a^;O^n^<6&k0xa0P0-S5-rhzGZ zRyVx@aG*Eo)+ZVO&gEQUWOelB3YyshE1Md?Y*d4ttrdXFE#RuR-Vyq9Mg`tXw^PWN6 zZoyf>UDO(|)~NyT>bWW+@_Xa~_yQ*)@~d^qfFnahL{cc)0wN-5 oQ~(M<0T2<%t2=;g+qT5|1DB>XRtXL@!2kdN07*qoM6N<$g80a@-~a#s literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot-members.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot-members.html new file mode 100644 index 0000000000..410b264810 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot-members.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.Internal.ChatBot Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html new file mode 100644 index 0000000000..58c3f88cad --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html @@ -0,0 +1,332 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Internal.ChatBot Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Internal.ChatBot Class Reference
+
+
+ +

Manage the server chat bots + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.Internal.ChatBot:
+
+
+ + +Tgstation.Server.Api.Models.ChatBot +Tgstation.Server.Host.Models.ChatBot + +
+ + + + + + + + +

+Public Member Functions

ChatConnectionStringBuilder CreateConnectionStringBuilder ()
 Get the ChatConnectionStringBuilder which maps to the ConnectionString. More...
 
void SetConnectionStringBuilder (ChatConnectionStringBuilder stringBuilder)
 Set the ChatConnectionStringBuilder for the ChatBot. Also updates the ConnectionString. More...
 
+ + + + + + + + + + + + + + + + +

+Properties

long Id [get, set]
 The settings id More...
 
string Name [get, set]
 The name of the connection More...
 
bool? Enabled [get, set]
 If the connection is enabled More...
 
ChatProviderProvider [get, set]
 The ChatProvider used for the connection More...
 
string ConnectionString [get, set]
 The information used to connect to the Provider More...
 
+

Detailed Description

+

Manage the server chat bots

+ +

Definition at line 9 of file ChatBot.cs.

+

Member Function Documentation

+ +

◆ CreateConnectionStringBuilder()

+ +
+
+ + + + + + + +
ChatConnectionStringBuilder Tgstation.Server.Api.Models.Internal.ChatBot.CreateConnectionStringBuilder ()
+
+ +

Get the ChatConnectionStringBuilder which maps to the ConnectionString.

+
Returns
A ChatConnectionStringBuilder for the ChatBot.
+ +

Definition at line 42 of file ChatBot.cs.

+
43  {
44  if (ConnectionString == null)
45  return null;
46  switch (Provider)
47  {
48  case ChatProvider.Discord:
49  return new DiscordConnectionStringBuilder(ConnectionString);
50  case ChatProvider.Irc:
51  return new IrcConnectionStringBuilder(ConnectionString);
52  default:
53  throw new InvalidOperationException("Invalid Provider!");
54  }
55  }
string ConnectionString
The information used to connect to the Provider
Definition: ChatBot.cs:36
+
ChatProvider
Represents a chat service provider
Definition: ChatProvider.cs:6
+
ChatProvider? Provider
The ChatProvider used for the connection
Definition: ChatBot.cs:30
+
+

References Tgstation.Server.Api.Models.Internal.ChatBot.ConnectionString, and Tgstation.Server.Api.Models.Internal.ChatBot.Provider.

+ +
+
+ +

◆ SetConnectionStringBuilder()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Api.Models.Internal.ChatBot.SetConnectionStringBuilder (ChatConnectionStringBuilder stringBuilder)
+
+ +

Set the ChatConnectionStringBuilder for the ChatBot. Also updates the ConnectionString.

+
Parameters
+ + +
stringBuilderThe optional ChatConnectionStringBuilder.
+
+
+ +

Definition at line 61 of file ChatBot.cs.

+
62  {
63  ConnectionString = stringBuilder?.ToString();
64  }
string ConnectionString
The information used to connect to the Provider
Definition: ChatBot.cs:36
+
+

References Tgstation.Server.Api.Models.Internal.ChatBot.ConnectionString, and Tgstation.Server.Api.Models.Internal.ChatConnectionStringBuilder.ToString().

+ +
+
+

Property Documentation

+ +

◆ ConnectionString

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.ChatBot.ConnectionString
+
+getset
+
+ +

The information used to connect to the Provider

+ +

Definition at line 36 of file ChatBot.cs.

+
36 { get; set; }
+

Referenced by Tgstation.Server.Api.Models.Internal.ChatBot.CreateConnectionStringBuilder(), and Tgstation.Server.Api.Models.Internal.ChatBot.SetConnectionStringBuilder().

+ +
+
+ +

◆ Enabled

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.Internal.ChatBot.Enabled
+
+getset
+
+ +

If the connection is enabled

+ +

Definition at line 25 of file ChatBot.cs.

+
25 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ChangeSettings().

+ +
+
+ +

◆ Id

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Api.Models.Internal.ChatBot.Id
+
+getset
+
+ +

The settings id

+ +

Definition at line 14 of file ChatBot.cs.

+
14 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ChangeSettings().

+ +
+
+ +

◆ Name

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.ChatBot.Name
+
+getset
+
+ +

The name of the connection

+ +

Definition at line 20 of file ChatBot.cs.

+
20 { get; set; }
+
+
+ +

◆ Provider

+ +
+
+ + + + + +
+ + + + +
ChatProvider? Tgstation.Server.Api.Models.Internal.ChatBot.Provider
+
+getset
+
+ +

The ChatProvider used for the connection

+ +

Definition at line 30 of file ChatBot.cs.

+
30 { get; set; }
+

Referenced by Tgstation.Server.Api.Models.Internal.ChatBot.CreateConnectionStringBuilder(), and Tgstation.Server.Api.Models.ChatBot.ValidateProviderChannelTypes().

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Api/Models/Internal/ChatBot.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.png new file mode 100644 index 0000000000000000000000000000000000000000..66905070f1448a81804089aabafb05c7c7e915fc GIT binary patch literal 1391 zcmah}eKga182`=7(&pEln~bLXxYN}&a>YW76}3^0ml=zp<)x&QODEDb4ObSnm0FVI zSg$r`l|qqdP2)5#6*Vb@A%=UAi2Kvu_niBj^L@Ub&+~kqf4<+(dCvOz?gmloQ2+pd zRElQ+0BAul_S4gbGj^2p0=|s>_RzeRmzQCv{xXwX(8z<)kJHf5pnJB*45oTX0lt9% zELw>-3Yt9t=qyn^$+VM*@vCF`_gyeL++F?O&F1l8@>wVIj*KXG$1*y1pr!hz+Y);6 z7yTwX;XK05V``s~HKI*+FJv{__M*%iNRkrhTBY1*>CXVuh><;rXgrlhT51_Qyb6(I zl`1g{4R!XBPOD-{PtKWjsf%jv*3qv6LeIVIGjsDol@hf*%B{;Yh`5lhf6uFHJ^pGd z5^?aB{&e%}H1)+ljFt%EmW-ZG6Xobo#&~P?jYeo}(#HB3q{>N@ekyT(6n#)tq-t|Y zJ~lKp_VChyJaJJs1b`xPOkJej7Hv7s#c&?H?V9cIF7Na#K~iGvsPA}5XXkg_qr?tO9g$az_#>4GkefQi-9t*FnOt-G+lGFS*|wY4b{ zrGD;LR^fC?uV1hXM*-MK4zRf4H^$rd=wk*%y@rp^{`2Dq+(JNYuiq3ow5kDEG+oO^ z*a412JvO3QxM{mi1AvEL6$uUW{j@?JtdLU9I3f}Vh{pihJQfEqW*g$*R{0N|3<-~K zUKyuI$$-8`E~xcG%D#4>=*G)EowO&wi(w`oEeoPOs{2^ z8-d80aK0$?!+dD%lS*j((^04B1;$_c45j0u_v>DTDpiab?*CqKCaj|QFsDb{!r-`C z6p5>=w=6RDVXsW=*Ptb&(Z%fbY9ws z`?&Kd^U`_bq7n1{aED|iOS$nf6M8>rXF15#2FKduB6u$G2!sBD-;8srN-lL)F zm+jA`<2J + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.Internal.ChatConnectionStringBuilder Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_connection_string_builder.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_connection_string_builder.html new file mode 100644 index 0000000000..f93926e5aa --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_connection_string_builder.html @@ -0,0 +1,179 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Internal.ChatConnectionStringBuilder Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Internal.ChatConnectionStringBuilder Class Referenceabstract
+
+
+ +

Helper for building ChatBot.ConnectionStrings + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.Internal.ChatConnectionStringBuilder:
+
+
+ + +Tgstation.Server.Api.Models.DiscordConnectionStringBuilder +Tgstation.Server.Api.Models.IrcConnectionStringBuilder + +
+ + + + + +

+Public Member Functions

abstract override string ToString ()
 Gets the ChatBot.ConnectionString associated with the ChatConnectionStringBuilder More...
 
+ + + + +

+Properties

abstract bool Valid [get]
 If the ChatConnectionStringBuilder evaluates to a valid ChatBot.ConnectionString More...
 
+

Detailed Description

+

Helper for building ChatBot.ConnectionStrings

+ +

Definition at line 6 of file ChatConnectionStringBuilder.cs.

+

Member Function Documentation

+ +

◆ ToString()

+ +
+
+ + + + + +
+ + + + + + + +
abstract override string Tgstation.Server.Api.Models.Internal.ChatConnectionStringBuilder.ToString ()
+
+pure virtual
+
+
+

Property Documentation

+ +

◆ Valid

+ +
+
+ + + + + +
+ + + + +
abstract bool Tgstation.Server.Api.Models.Internal.ChatConnectionStringBuilder.Valid
+
+get
+
+ +

If the ChatConnectionStringBuilder evaluates to a valid ChatBot.ConnectionString

+ +

Definition at line 11 of file ChatConnectionStringBuilder.cs.

+
11 { get; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_connection_string_builder.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_connection_string_builder.png new file mode 100644 index 0000000000000000000000000000000000000000..9e68f5cf7d755cea3779fd017e6996f85a128eed GIT binary patch literal 1858 zcmbVNc~H~W7QP{}lqHtdB}4;l4Ynw}M5>iNPeCL^5d%UB7$Q6=t0+jI2uRDLKZz_( zP*r7d7d7s$a+=SuuoF*>k@hup=-D0s= zJ7dfYrg~Q?9$o+zZLR)i-qrx<^pISRc_$!LMg9!Ao#8feXY5a#=Ho+&h#gZW_Xb+$ zF7hV%IMxRkt2bJ2kf(YN7laj-(f~RY!NUM7AAl125nvaD0Itp9;A*QD$o#q=OyAH3 zXzfZwx3K{r=+|I+-yj|jT~Ar(R*hVFPyEiz(?GNicB>ZWOuC}+il9MeV7pa-JA+!v)fmt5x_)MBbH@%4Ac0!wkww-uQ^yb1 zv^Lb=nmiDnEqdalTPvy4F}Ub%G8x(T*E`HjBdq zX&spSB@(I#*~750khQG|CRwp5^YQlqL;V*FJ2k$VMbfb7ms!%~hWG^3u9 zH1|UxZ&oLBWaRj{M^IsP=+1x|?-#N#p+eg}vdDbhVQ&Xqk?csQl76&mfH>H;p^0v? zLu9N-V?J(bm*1~)RfJr&Ea4>u*HF(ld#&kQN$>tPZ@QvU(x9YDo1XX7Uy}%96J{)x z>kYTzzV1DF#Oa4$i1^K$y0vhjKCCouv=QqrmrZTDZovIK`=F0%XDf!5>!+?eUf;SF z)hIQa3R2JhzXz8dR=EGu)4hEL07(ZjxfUH5ipSw@62S8qz8Or4C2vW)(IPSxv8)_I z0UdFG5#qnPx8lEGh>xdYg#T%uiZOvFvD<(Q2s#5=-yO^Ybi*IC|LJRq5TmIEsnt}i z)I+>o;5>gD2&P+she7XvHnAVL`s6*3`Bfd5W|{*uG6K=P^Y0wc{9^F?+mw_e`4sn+ zPU=mHy9ttsGa=17*QRZ`G}Q;B^L#8W%rH`yG|PlpFx}pb;tMkja`YJMVUWF>6kV$# zbefSa%n=`L`2K1zkDIZO=COP`LV3$ozF-H9Awr_Sh`^;O+HbIAD+nn zWS>RWg$mv)T zY!+{Y=rWe=)~oWW`5fYWzpzWNBZ?gzt(t01vM^6B5Pf6D5^YWEiM%i5{ZU<_VF%*$ zt`b^W&U~R{bh5Fk&e8;#$?6Owdv~@xiiRfce9kf(pGEEur0iW%5qxv^tDJKejZNKb z4Q7VRYOQw-jt9%K8^$730mJvQ@l{yWtrAot(T3*W=NLcw9p6>+Q?)@r3cTvWJNl}=;HE+OvZUFqE+EXaWQ+s z?}~n}Xd#bC>=|fkfkM^&=~nVCRJ?yo+}zMTd4%~F`}1GFPvVwh2W%E*eH)$SR@d&n z+`Y3Lg}2D8pCeRTI=SaLM0{k7H$>JxdSM z?yR_AOoxuKU}g4;;Vr+86Qtqdo-l544)L(K@`EtT`s#n5^vjD7#r@Fz+tLjBpI{Sw Y9`L=-B^!Mv{NVx82@jX* + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.Internal.CompileJob Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_compile_job.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_compile_job.html new file mode 100644 index 0000000000..1b7aa9be45 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_compile_job.html @@ -0,0 +1,261 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Internal.CompileJob Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Internal.CompileJob Class Reference
+
+
+ +

Represents a run of DreamMaker + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.Internal.CompileJob:
+
+
+ + +Tgstation.Server.Api.Models.CompileJob +Tgstation.Server.Host.Models.CompileJob + +
+ + + + + + + + + + + + + + + + + +

+Properties

long Id [get, set]
 The ID of the job More...
 
string DmeName [get, set]
 The .dme file used for compilation More...
 
string Output [get, set]
 Textual output of DM More...
 
Guid? DirectoryName [get, set]
 The Game folder the results were compiled into More...
 
DreamDaemonSecurityMinimumSecurityLevel [get, set]
 The minimum DreamDaemonSecurity required to run the CompileJob's output More...
 
+

Detailed Description

+

Represents a run of DreamMaker

+ +

Definition at line 9 of file CompileJob.cs.

+

Property Documentation

+ +

◆ DirectoryName

+ +
+
+ + + + + +
+ + + + +
Guid? Tgstation.Server.Api.Models.Internal.CompileJob.DirectoryName
+
+getset
+
+ +

The Game folder the results were compiled into

+ +

Definition at line 32 of file CompileJob.cs.

+
32 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Compiler.DmbFactory.CleanJob(), and Tgstation.Server.Host.Components.Compiler.DmbFactory.CleanUnusedCompileJobs().

+ +
+
+ +

◆ DmeName

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.CompileJob.DmeName
+
+getset
+
+ +

The .dme file used for compilation

+ +

Definition at line 20 of file CompileJob.cs.

+
20 { get; set; }
+
+
+ +

◆ Id

+ + + +

◆ MinimumSecurityLevel

+ +
+
+ + + + + +
+ + + + +
DreamDaemonSecurity? Tgstation.Server.Api.Models.Internal.CompileJob.MinimumSecurityLevel
+
+getset
+
+ +

The minimum DreamDaemonSecurity required to run the CompileJob's output

+ +

Definition at line 38 of file CompileJob.cs.

+
38 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew().

+ +
+
+ +

◆ Output

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.CompileJob.Output
+
+getset
+
+ +

Textual output of DM

+ +

Definition at line 26 of file CompileJob.cs.

+
26 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_compile_job.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_compile_job.png new file mode 100644 index 0000000000000000000000000000000000000000..9a48794ff6fb7f4791bdd2222f766c346341bc2d GIT binary patch literal 1553 zcmb7EdoK^0563#W z0g_D{G|0u70Dx=(bj%hPiI~lsz4CaUs!VPncV7I|@2t0y9g1Fb*T_u2-naYG)_DAi z5oaX>>!5d^wiz%6@|hk$m&Z6O>B z0sPobIN#3?M67Gk8TVRNR~H4NE6npYrDgMdqz}GGk98BIzP1K2$J^V$&6vMXBv8(L($`%Zb-WUu29&%Bs9Z}&){D83G0>xw+K@nn!Y$|X`K==x|GS0S{g`R$-} zm$Lo)&W|_eD_+i>!60*@1)lh+>!Kev9u+|pG!*wo250(|$>2I(4Zwq`W<7Pap_Q;D zNKZOMoXJb~ip*6Q*F6QwrocNyBk*TvGm+fhekH%bFN0FbxgMmCQ?(`!S(p-ouPadPrv4|iV7(7=1HLOQjO+2{j zRAox`7u|41Dum&#u&(EGXB*}5o@P)y~S?`P!a&xFJpZB zzSI;x4v4S80f#G9IjUKT1qm8bsCF!3sm2aC>R~|9J|piV?8=4sCof1p}x?~fv9(MO_>bc@&ukPbaVu!zIaTemgofO zK{I#|8c@Y#>MqwXbo~=mhz|Vxk`NNBFL*F`;xM$W2xT#b?&I#Wf4>mj;;-GAQIf0! z3aj}CE4A0X0%9J*Ye4=jc79s3e*N*@iYm<*+Ly4lTwXZaDF%#5@GK@q^?qI!nF?7| z!)epgYhh=5a>A{ps`32vH?H{7FU#>(&$eIut-#A;)+F;<$2PD-|Gk=?A%yH@Ok?sI z`c9>i?Y)bJ3K*}|v$2h|IxqYYW^+xtd0!L>-{aX>LGF}{2EloV0ed#Q*D|JJIR zxbVt!-R2;rPZ|Ng=KAM4W%#n!e{!SZ)Pfy#QX+&jzcSGr#ho88E4u7_V+1yvUP2?Q z*~MGD3x_Pgxcf#*mc0k*6IEBM$Yu?-i?*TBnj{0SnlD% zRhh(@ta(D{lhDLnryT=m^KDjxfs?(0xp!k1O4rD%$Ll+JFJ>O>-ldTeOq-t#$7s5W z4ta#;8EF~m$5oKSV+AnlL--?+xWV%lF)Hq5zz3YHcLLt9o6OG-e79JgSa&$NRlI{# z_NS&~Qe+GkW$oL)YL=mzvtpru5H8Fva7!;X|HZpt$PYXn01X(9s{OT>keV~i3a6G_ zZ?syl1!FE{QN!sr_)_nFh&ngH>Z!w7Ld{8RSH|4%hGDoz7ZN)=u`Hm~SON%PRdOL} xyrdQWsZ*Rm(cRi^i%HDyu*GE1mEI + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.html new file mode 100644 index 0000000000..a66f117102 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.html @@ -0,0 +1,303 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters Class Reference
+
+
+ +

Launch settings for DreamDaemon + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters:
+
+
+ + +Tgstation.Server.Api.Models.Internal.DreamDaemonSettings +Tgstation.Server.Api.Models.DreamDaemon +Tgstation.Server.Host.Models.DreamDaemonSettings + +
+ + + + + +

+Public Member Functions

bool Match (DreamDaemonLaunchParameters otherParameters)
 Check if we match a given set of otherParameters More...
 
+ + + + + + + + + + + + + + + + +

+Properties

bool? AllowWebClient [get, set]
 If the BYOND web client can be used to connect to the game server More...
 
DreamDaemonSecuritySecurityLevel [get, set]
 The DreamDaemonSecurity level of DreamDaemon More...
 
ushort? PrimaryPort [get, set]
 The first port DreamDaemon uses. This should be the publically advertised port More...
 
ushort? SecondaryPort [get, set]
 The second port DreamDaemon uses More...
 
uint? StartupTimeout [get, set]
 The DreamDaemon startup timeout in seconds More...
 
+

Detailed Description

+

Launch settings for DreamDaemon

+ +

Definition at line 9 of file DreamDaemonLaunchParameters.cs.

+

Member Function Documentation

+ +

◆ Match()

+ +
+
+ + + + + + + + +
bool Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.Match (DreamDaemonLaunchParameters otherParameters)
+
+ +

Check if we match a given set of otherParameters

+
Parameters
+ + +
otherParametersThe DreamDaemonLaunchParameters to compare against
+
+
+
Returns
true if they match, false otherwise
+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ChangeSettings().

+ +
+
+

Property Documentation

+ +

◆ AllowWebClient

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.AllowWebClient
+
+getset
+
+ +

If the BYOND web client can be used to connect to the game server

+ +

Definition at line 15 of file DreamDaemonLaunchParameters.cs.

+
15 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew(), and Tgstation.Server.Host.Controllers.DreamDaemonController.ReadImpl().

+ +
+
+ +

◆ PrimaryPort

+ +
+
+ + + + + +
+ + + + +
ushort? Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.PrimaryPort
+
+getset
+
+
+ +

◆ SecondaryPort

+ +
+
+ + + + + +
+ + + + +
ushort? Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.SecondaryPort
+
+getset
+
+
+ +

◆ SecurityLevel

+ +
+
+ + + + + +
+ + + + +
DreamDaemonSecurity? Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.SecurityLevel
+
+getset
+
+
+ +

◆ StartupTimeout

+ +
+
+ + + + + +
+ + + + +
uint? Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.StartupTimeout
+
+getset
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.png new file mode 100644 index 0000000000000000000000000000000000000000..367644565a8dc02c642dced34912b242b435ca4f GIT binary patch literal 2801 zcmchZdsGwW62PHK#TB&GU{S<5JKPv3N(g@kw*xDyYb%kFaNsdp8K7%v$Hd^bM~8= z-|l8%eGi)gn*jp@15?zILpTG26(FR4XS@QEI*ZEH(8(NoEWmqtc^OhCUe6@tKD!BN z?~mr@W}~b@ICN=D!ujG2pdkI~`7OZ7zyQcV9Xc40WT=!XE|oW~_Zj(?{%~;FS~Z_> z%fPRlJe}>-fZr|HxbL#Vq{Cv=F|mu8*aaguG%~@wSbgmtxI&Jj#H$9ST7wpdx@ig+sAWF>oNcTnlx9ikR%0t@MV;*%ieTui-lbV;W1W~rsVb+EF zSgTgo4QUK4-Eq#d;2ICa987<-C0r3UI<-BD{ji3gR<{bU@6j4@0(+F6625HL@9oMT zLFLcz{k4;+I%%IBby#qrN;GotX=Qgn)}swA2cT>FNVKYJH&vbuDvd z45Q8jH+&i0I;51%!eNd!`>A)fJR{is-p@TM-4V#u)cUko ztlE%F`csZC+c{>6$Lx+76#OI%l}4*L@Pr2I=)RtWRL9xwy96QSX~idt#s*Ho6SqF zZ!keoKW=6HbEOxKapi9}lUR72Sje2t_z0M{B7bFQ1iNqzXAIa3?}o$2K7nDIQRr

io<8X6Us!!n^rQ}pMMQJfEAzcOUmQp++v^2GysH&gF+$Jnlf@)W+$<5Ho| zLVTa)|8qk#JnYW6MmD0CrG|ic;a=2r#HJjaaVrakrfsvOhLX_?#3tH@4CB^Rri4KI z<79eTnxrvmz`E@y$yJ3c__>K5JL+&FkJQyYvnwz4L3i!UP~F%eHA0C8TIL&5)+n7v z6xqB2ejzCK?@0BD?VeACrJTFOI`LDru5=L^-@_Mt|K_s!FD{YmC(_&r52X)D-X-AN zAGwuhblk@itD+X`nb98vGoC-B?a=*joSTYzYgX||c9$)+ChOL*jyzk1IAFpgf<}q? zS-4!+Y1PHuB+VA(kR2OZXFHCEsl+}hXWLoWd>*6K0DG8~5ByIic5Vm}@%Go6YD zf^oxz>x2T5eNw(JYG17PoSXF1!HqKlibTk)jRm4KOQ#zBVvr>>>l@pv6H-cu@haEb zv2xFA!5=I72CL_~&rC-BIJs{Gp>frhyAp^wjizzm{4td`8h7b@^1oY9Aa_9x{er9# z^-Fi@pHd2n-%Y`m>2Zv_hCpbi#dsTN1T`!2K}XLDEX@Q3)g2F5x83}pLG97?!lO%_ z1i`rYsVBr1;O_MvsDj+wOL{aB?~yv`X=?W^^?%LTu-}{M>1ls5v`kE4 zj$6&Pn3r5%Z-O>j<-@wW@+z+7%F72fEoA{0LP>ULN1Ok-TO+vZ(xqNhz4-!?U0DCZ z@#L+R@iZ99X>&D*!Xers@oU)y}dRUA~hi4T|>y%>|T^n1y@rKPejRfUPD zx9fvDw7C^kstSu_XCXpk=5So!JWGIwH0MT2ek=dSJvJq1YR=~!hAT>=`6b2#$$NS* z(1*2%(?1eEopSC8J|0br8!L)sxUG`+0lKl9(UIv5NY#mnc=;Z}9_{4=Yqr9<-HP%0 zhFp%cE9WRD=yuJ0{KU}W=OIULr2Vwxhp18Z@vSp`w5IM6tVXup zPO)vW?;`&e+tn=(MU%-(fZ*}szgVto=XORU^hFAvbM>(E$+>EYP~D_s7z3vCCNYQrLE14zPuOS8ui)W zRV%iFf*uIhZpYV$^Pzd%*mRQNW+YF1Jjct1(Go5FB6X}+Izwuq>+bzJ4^4q2Q5i;j z!YgpwuYM(ZZXbDOFyyRqi^_5qAKmprapUS763uX18J22a<(0jj#*R9`youPU*#Ib6 zlqcO47%oF-+dDNqeQrsZ6yrro8a=SL>W=9CQyk5*lgn`cz!Km|_2?-`zSoCR_?z*p5%ShBa9Zo7Lfhb2#w{EqNWkga4YG6 zCa`#H-AXG|nz`)Jt~egGz`_kR + + + + + + +tgstation-server: Member List + + + + + + + + + +

+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.Internal.DreamDaemonSettings Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_settings.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_settings.html new file mode 100644 index 0000000000..3b2fd61d6a --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_settings.html @@ -0,0 +1,223 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Internal.DreamDaemonSettings Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Internal.DreamDaemonSettings Class Reference
+
+
+ +

Configurable settings for DreamDaemon + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.Internal.DreamDaemonSettings:
+
+
+ + +Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters +Tgstation.Server.Api.Models.DreamDaemon +Tgstation.Server.Host.Models.DreamDaemonSettings + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

bool? AutoStart [get, set]
 If DreamDaemon starts when it's Instance starts More...
 
bool? SoftRestart [get, set]
 If the server is undergoing a soft reset. This may be automatically set by changes to other fields More...
 
bool? SoftShutdown [get, set]
 If the server is undergoing a soft shutdown More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters
bool? AllowWebClient [get, set]
 If the BYOND web client can be used to connect to the game server More...
 
DreamDaemonSecuritySecurityLevel [get, set]
 The DreamDaemonSecurity level of DreamDaemon More...
 
ushort? PrimaryPort [get, set]
 The first port DreamDaemon uses. This should be the publically advertised port More...
 
ushort? SecondaryPort [get, set]
 The second port DreamDaemon uses More...
 
uint? StartupTimeout [get, set]
 The DreamDaemon startup timeout in seconds More...
 
+ + + + + +

+Additional Inherited Members

- Public Member Functions inherited from Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters
bool Match (DreamDaemonLaunchParameters otherParameters)
 Check if we match a given set of otherParameters More...
 
+

Detailed Description

+

Configurable settings for DreamDaemon

+ +

Definition at line 8 of file DreamDaemonSettings.cs.

+

Property Documentation

+ +

◆ AutoStart

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.Internal.DreamDaemonSettings.AutoStart
+
+getset
+
+
+ +

◆ SoftRestart

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.Internal.DreamDaemonSettings.SoftRestart
+
+getset
+
+ +

If the server is undergoing a soft reset. This may be automatically set by changes to other fields

+ +

Definition at line 20 of file DreamDaemonSettings.cs.

+
20 { get; set; }
+
+
+ +

◆ SoftShutdown

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.Internal.DreamDaemonSettings.SoftShutdown
+
+getset
+
+ +

If the server is undergoing a soft shutdown

+ +

Definition at line 26 of file DreamDaemonSettings.cs.

+
26 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_settings.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..6401659e28199fd902cb654f2b10c134be9f1501 GIT binary patch literal 2792 zcmchZdsNcd7RPn8t1*>LiDOo}ENsB?QEFDE7M6RKBtl1|N`hdpKN!)Fe&7)D%NN5y7|jhj;GGKizfLy6dj{TkChu`R%=b=Z}59 zpR@P%K!2~bATyATj?P+y_YtIyjvgFXUo+GL#>LH5tAWWh&^P4h^71mUl#EZ~bD#bM ztXAG9PoAv0-fsbX8sd=t!8$;Y_IdkT$Q~UXP!i(E;gDoqnNWJ3*0RC#!_~qE{mWL0 znQQv{cF&G)Iz^y=n`48MM|NUo1V4|a*p8%>z0?Dl7VSr5K{jP04PVfWeJGYNa#WfR z6|#x)Im2iLA2)lf^B|YUOQ=d>eqHQ|P+q7VnSNPQt*G2Q`+g82Oq9;uZg&kGV||xv zwB$#xTz`|dXwv7YoWJQ>=w5uWE3zZDtfo`u1afs?dFlsmT z41tZ&q;p2*j})+M=Id)%qANnSAQn}C2DQzoK$z|C+-^TQ=tq8iVMlM_j^c#`Y5!DO z>6;Ei;VYNNu|Hrt2$lTP;otZbhD0`EI0}PkA&P^38^Kc^7U!z(8fQ-SLc6VcD2C|$ zX4mgRcJ`IG!mAF7gQAPEGT)vUfl)&hKk^o1iY?1;;DxT7NWL*ym5eWZTyX-;~knZ~b4<=jy}XzD-nUV|nV zv0Rb&FzWO(Vd-|9`S8m13ubC?pDUCJ681HW$`((=Y-A~>VdNh3gH0t2XYn)iy($(m z`b@Z3Tv_jRJ5g(H@ByIjZsRmakm>|454#{kPi(mR7xZZuxxxJ@jWHY%ZvDa@X zK}4dqFP*|2q6!=H;S;eE@PUti+n>YC9g8?;S4zP}WYs1#xzKDr<<2t-L(d3}3zV|P zP+BTEel(iWavcdplu>~^qlEA-mE72lOc~zfV`*A`3ywfS+QoFh z1tU|w_tx5g*ekz$&T#t=Q9}oECv;aC2R`}A#}azy0xc~q-y`slt^tgE=fW2`%9z0Y z`m2o3-9#FKpaTZ^hXB{r71z38&|%$GTYwY)0<_N;rVaXeCCI*VJ+Rw%E4w|*hyVY6 zaDUo$!^|ghq_VxI3`u)~?}-Q|Js^I81+N>W31>G@JJ> zadt{?yu0P}uyr<;#&^hbX~@LOmWKnhhj$W`KB64s!YX+N^2H%!>QcmpC6Q+OoLgvf z$XM0^a&3p=_;aPAr^2FoQd;t8u{-{xsEC0PyYse+h*+OFpJv6plSbMq>ery~%?9Ei zfXppONr|a%$I1VUCOrb{hyu_|IMZE|ltN&)Ip@Re-Mqk`HpI5q)ojT=vN5c|ok$K# zVbl1YBDF~$wEIsekIYxwR%fgwHkR$B0lJyJ4)?1_TS~vrpB{HT-aP#$kmmmu$SNli zR_gZMOeSzEj(UOO5>Gmp#>W+nhuaop%rFFW<8b1H*KvvZsTze zGdhH+0XFgJ!qZK@rfluiwSNoU*+6Z$FS(nFk_ut^R9{1_CA~Cntl_fM?BGV|#P( z7SqzK4QqT>8F5%54 zQQ~9H%CiLsB{(3|hr*lykwq3ak2T^y2EjW8>|L71uhP408cK&RVbFqP0v;%&($h7B znV^=kO>%w-Ww^3MVv?F@&kmE=UHv|E{^L>$n##*|N#8FM&+ht_6yd`w=gLI_f~&Lt zTiej43V&+sRB5s>Ty@E*En*v~_Iw>DUv-NhPB{KoNZnv1sMW^Qg@{|86L@si4W(`` zkFDL22XP-N1(lAL_;%#MxLqL(Jj6a%NUrsU!5Yb z+^SMmf<$iOv^(DJ5g|vgZXU)M9h`msdLCQJ-<(;`HYu?5T-~l|lm~lLE-kDkGrB~W zu^K-nl^I+u99rZqaFc618i>QL`>M^?s$9USB>O9%_On~D{h_JNiLp$1uP@tm106{@!<65GQiyj05!c{s%{&PN|ZTRwmy6UNI z0S{{{E$%ZWH!z@iZQFR278G4J$^x25^PFW}>W2lxkvy~vXiIevNBxh~!lN?(0mL + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.Internal.Job Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html new file mode 100644 index 0000000000..2c9df2e90c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html @@ -0,0 +1,350 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Internal.Job Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Internal.Job Class Reference
+
+
+ +

Represents a long running job + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.Internal.Job:
+
+
+ + +Tgstation.Server.Api.Models.Job +Tgstation.Server.Host.Models.Job + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

long Id [get, set]
 The Job ID More...
 
string Description [get, set]
 English description of the Job More...
 
string ExceptionDetails [get, set]
 Details of any exceptions caught during the Job More...
 
DateTimeOffset? StartedAt [get, set]
 When the Job was started More...
 
DateTimeOffset? StoppedAt [get, set]
 When the Job stopped More...
 
bool? Cancelled [get, set]
 If the Job was cancelled More...
 
RightsTypeCancelRightsType [get, set]
 The RightsType of CancelRight if it can be cancelled More...
 
ulong? CancelRight [get, set]
 The Rights required to cancel the Job More...
 
+

Detailed Description

+

Represents a long running job

+ +

Definition at line 10 of file Job.cs.

+

Property Documentation

+ +

◆ Cancelled

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.Internal.Job.Cancelled
+
+getset
+
+ +

If the Job was cancelled

+ +

Definition at line 43 of file Job.cs.

+
43 { get; set; }
+

Referenced by Tgstation.Server.Host.Core.JobManager.RunJob(), and Tgstation.Server.Host.Core.JobManager.StartAsync().

+ +
+
+ +

◆ CancelRight

+ +
+
+ + + + + +
+ + + + +
ulong? Tgstation.Server.Api.Models.Internal.Job.CancelRight
+
+getset
+
+ +

The Rights required to cancel the Job

+ +

Definition at line 53 of file Job.cs.

+
53 { get; set; }
+
+
+ +

◆ CancelRightsType

+ +
+
+ + + + + +
+ + + + +
RightsType? Tgstation.Server.Api.Models.Internal.Job.CancelRightsType
+
+getset
+
+ +

The RightsType of CancelRight if it can be cancelled

+ +

Definition at line 48 of file Job.cs.

+
48 { get; set; }
+
+
+ +

◆ Description

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.Job.Description
+
+getset
+
+ +

English description of the Job

+ +

Definition at line 21 of file Job.cs.

+
21 { get; set; }
+
+
+ +

◆ ExceptionDetails

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.Job.ExceptionDetails
+
+getset
+
+ +

Details of any exceptions caught during the Job

+ +

Definition at line 26 of file Job.cs.

+
26 { get; set; }
+

Referenced by Tgstation.Server.Host.Core.JobManager.RunJob().

+ +
+
+ +

◆ Id

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Api.Models.Internal.Job.Id
+
+getset
+
+
+ +

◆ StartedAt

+ +
+
+ + + + + +
+ + + + +
DateTimeOffset? Tgstation.Server.Api.Models.Internal.Job.StartedAt
+
+getset
+
+ +

When the Job was started

+ +

Definition at line 32 of file Job.cs.

+
32 { get; set; }
+
+
+ +

◆ StoppedAt

+ +
+
+ + + + + +
+ + + + +
DateTimeOffset? Tgstation.Server.Api.Models.Internal.Job.StoppedAt
+
+getset
+
+ +

When the Job stopped

+ +

Definition at line 37 of file Job.cs.

+
37 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess(), and Tgstation.Server.Host.Core.JobManager.RunJob().

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Api/Models/Internal/Job.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.png new file mode 100644 index 0000000000000000000000000000000000000000..13cabdc196cd80b2a60153c296d92b10ef4943a1 GIT binary patch literal 1221 zcmeAS@N?(olHy`uVBq!ia0y~yVEhDR2XHV0$*XVJHv=h&0G|-o|Ns93nJ?aaE$u%v z0muU50|ySUcHWT(ayd$Z{DK*Pia_A%sSqOu29^*{7srqa#zW{cL5SpP7nr;T3uNqYo~;T71{= z>M_qJ40}Tq>#x=QGE|(w|KZ=(E$8mD21xEP@x41uZ{117`1btecNFfs{WyB2ZpPVT z?c3JwXPoEGD-a;}GsaWm%wdO0A9nXM2Q;1e_TY!*saHqc-1A(K~Ju#ug2Et zSWtQVH@$4>KL>OD_Ltd9Rc~Z6pWkmbk$KLF-anUatbP?m2^ZDs}TlYv^vw1qT zTBcpCsKLvA$LZTA?&euaRXfJTpXb%yzvJ}!p1(qs_nziH2~O?WsQ=AU_VC>`v;B7c zeSB_7?yb{%WnN9zuAjd;?#!7)#%Zi?c#fvTcS`B^>8BpVFMOn2d)Q)s~DCrEYg_B>~iVx#50Uc znjqHX3M2N8#XyBVoH7bigfOBE$)rxOf&=MaD{SN%Sp|GI_D8}jfk>f8H-=t>f-gtk z950mFzxcRC-{Wu*o8N(xl1?g3UlQTrpDLfUdHVI| z>R;!3CNGIDvb{ci?b-8>!ltFn>)x+&@}=0Pe=GIxzB+f8`@^p(^6C|~Kkw8{|9Ron z&S`5`-BX|V-T$vt<#wh!uK!}Hei^zNynpmJJ9F-S@0#C>UiZ!4r5hVF*?Avde#)NS z58a_pGma^G^6qWl6aDJx?vx#W-$XRbKJh$a$w3>b5V^|-S#y%KoojZ4&cA#8+Jn1M zYp3qL7*^yuU|{W_f?nI#7MW*DQL?b8TI{&^uMzRkI)LJE(O3^4cKN&{g5DJNG!h z`l|WeJbF9Rp3Xm)?#ArNlfSiRwe|XkdDkVw53g#z!C(3RihW2!edYA+pUZxl+*vEr zZMAsu$AI{e9f_Z!pf^z3`p zzhk~8EuB!dwN%N|>SFW>`w6>FUda7x$6C?5N2@`lH1PS$`ldh98$E;K@4Ec^RX1hH z{!9P6{xGlfzVy80`;_(P6g}sDxjzpW13-Z + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.Internal.RepositorySettings Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html new file mode 100644 index 0000000000..07e1171718 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html @@ -0,0 +1,373 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Internal.RepositorySettings Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Internal.RepositorySettings Class Reference
+
+
+ +

Represents configurable settings for a Repository + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.Internal.RepositorySettings:
+
+
+ + +Tgstation.Server.Api.Models.Repository +Tgstation.Server.Host.Models.RepositorySettings + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

string CommitterName [get, set]
 The name of the committer More...
 
string CommitterEmail [get, set]
 The e-mail of the committer More...
 
string AccessUser [get, set]
 The username to access the git repository with More...
 
string AccessToken [get, set]
 The token/password to access the git repository with More...
 
bool? PushTestMergeCommits [get, set]
 If commits created from testmerges are pushed to the remote More...
 
bool? ShowTestMergeCommitters [get, set]
 If test merge commits are signed with the username of the person who merged it. Note this only affects future commits More...
 
bool? AutoUpdatesKeepTestMerges [get, set]
 If test merge commits should be kept when auto updating. May cause merge conflicts which will block the update More...
 
bool? AutoUpdatesSynchronize [get, set]
 If synchronization should occur when auto updating More...
 
bool? PostTestMergeComment [get, set]
 If test merging should create a comment More...
 
+

Detailed Description

+

Represents configurable settings for a Repository

+ +

Definition at line 8 of file RepositorySettings.cs.

+

Property Documentation

+ +

◆ AccessToken

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.RepositorySettings.AccessToken
+
+getset
+
+ +

The token/password to access the git repository with

+ +

Definition at line 30 of file RepositorySettings.cs.

+
30 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess().

+ +
+
+ +

◆ AccessUser

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.RepositorySettings.AccessUser
+
+getset
+
+ +

The username to access the git repository with

+ +

Definition at line 25 of file RepositorySettings.cs.

+
25 { get; set; }
+
+
+ +

◆ AutoUpdatesKeepTestMerges

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.Internal.RepositorySettings.AutoUpdatesKeepTestMerges
+
+getset
+
+ +

If test merge commits should be kept when auto updating. May cause merge conflicts which will block the update

+ +

Definition at line 48 of file RepositorySettings.cs.

+
48 { get; set; }
+
+
+ +

◆ AutoUpdatesSynchronize

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.Internal.RepositorySettings.AutoUpdatesSynchronize
+
+getset
+
+ +

If synchronization should occur when auto updating

+ +

Definition at line 54 of file RepositorySettings.cs.

+
54 { get; set; }
+
+
+ +

◆ CommitterEmail

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.RepositorySettings.CommitterEmail
+
+getset
+
+ +

The e-mail of the committer

+ +

Definition at line 20 of file RepositorySettings.cs.

+
20 { get; set; }
+
+
+ +

◆ CommitterName

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.RepositorySettings.CommitterName
+
+getset
+
+ +

The name of the committer

+ +

Definition at line 14 of file RepositorySettings.cs.

+
14 { get; set; }
+
+
+ +

◆ PostTestMergeComment

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.Internal.RepositorySettings.PostTestMergeComment
+
+getset
+
+ +

If test merging should create a comment

+ +

Definition at line 60 of file RepositorySettings.cs.

+
60 { get; set; }
+
+
+ +

◆ PushTestMergeCommits

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.Internal.RepositorySettings.PushTestMergeCommits
+
+getset
+
+ +

If commits created from testmerges are pushed to the remote

+ +

Definition at line 36 of file RepositorySettings.cs.

+
36 { get; set; }
+
+
+ +

◆ ShowTestMergeCommitters

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.Internal.RepositorySettings.ShowTestMergeCommitters
+
+getset
+
+ +

If test merge commits are signed with the username of the person who merged it. Note this only affects future commits

+ +

Definition at line 42 of file RepositorySettings.cs.

+
42 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..9ac0c84c7878ed0985a3a0bfa4819e0c28dfca2e GIT binary patch literal 1725 zcmb7_Ygp2E6vzL7W~p7QOq7-j!3k1Id0FX(W-kAlBx&iQ}?`&JuU z83O>Y8uZyq1OO;cuLD-X^yGBuO!N;tVEh6)9Dk)db@A>cz53{Kx!mylptU|+ z$s!&&1n7%CSij=%4ggrOAKdGC_zXmIMH6?=Zk<8#xB0`%*$$GgN$Y$g&YhJ?!QKm5 zDU>v`MT=(yPhU(?9&r*X2eR(wK>rFihopsr5Vn{Dc!|q_J0$PqG7>SFT8Weg;4mHz zN6bR)YRVb!VSBnll1iRDoc;o`IUtKHt4w%_^?pHUOt~iVTfQ>*Ty~TDU^MZlvfTi# zu$`a|G$*{CB>ZG2aE{ycUg1g0ipMsbv(UcCWYD1GJ#?jYy1RABH}Ov`2Ra597nClF z+_9>$Tk$@~q%qv!fRDz6eP!3BVlF zD)9FN%DPvNcwIU(&iIk@G)nYBgs@xWHH-}6yN4WYW78!ssk6R|pJ}<4=AF#q^}pr8 z$X)}y=7QM~Hnw|*RZTFViml-F*Q&WkpSE`J&nD%18E-qC{z{1Zx45O7XXM&?wY_qU zaQn;0roU8QmS7!zdt%*T`0f#pK4=iQ_<*-6+@4vBhg6k1sSiz)$JN1a-Gw4|*Ql`t zzaKJNt272Z4MPT z+k7f5ax~GYTR${k3g4hCV9~o+Qj~e#1MQjMQE7(|SAzbOW z(a-qz%s>M;2W>dshJ~88{b!Fr3_6$SO99}?%Vuim+>8*18`3jK@r8DvGcCuBi< z0f321fhE$u8+yiIlLHN@w^z%&{ORc9?I<7M@{{7-919*m^;dsZVw_jTR zxwOy8-*pV{-^XI&#-058Jb0*1AEHq&FDC*efFTa$EQs-F#^){-C>@RF`_SXWesHp* zJ+D0F5ijSDi(Cu{o4?OvywBYj{C?rh;iXM#@F9ki-BnmuP3C8i=@_tM^KmQ~^Mit? znsQkyG)kh}iPO4k{mTe<@N;2nTu2wcEDrgeOO_nN{D{&BVuzj7I_c6$WsD%`!P2;H zdZ)T)%hk0#BH2*3hNewOIKEZ#s$gzn*NH7emU%n5!nK?dnb(r4Eq13PQd)GCN~QY4egjp}Ds1LpK_iys8}mTlG7P5Pu{6LoW1Zx7A3EzXrx)pC zCN$qwL5jRtF72Q9d3daeuAE{GtdJPa7qIDf8=Ol}0`F@4o7s3T-Ifti3CcMmq|3{0 zsHLLTtz~w~>YipM#gAxAGi!DHO_J#T zVr&>66{wkNZz9*jJZ0CYU)76ykOioI{UXu{(W`h_#fs{on502hBO`}#9 zqqq?_*pZT9iUQr)6rzU@5%Is44zG6d&n>E8Om2lUFIRN#?{m_DA3;; N0Q5evw`xyl>ObkNI5PkM literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_revision_information-members.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_revision_information-members.html new file mode 100644 index 0000000000..99c9fd0d35 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_revision_information-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.Internal.RevisionInformation Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_revision_information.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_revision_information.html new file mode 100644 index 0000000000..669a6ae6d9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_revision_information.html @@ -0,0 +1,172 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Internal.RevisionInformation Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Internal.RevisionInformation Class Reference
+
+
+ +

Represents information about a current git revison + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.Internal.RevisionInformation:
+
+
+ + +Tgstation.Server.Api.Models.RevisionInformation +Tgstation.Server.Host.Models.RevisionInformation + +
+ + + + + + + + +

+Properties

string CommitSha [get, set]
 The revision sha More...
 
string OriginCommitSha [get, set]
 The sha of the most recent remote commit More...
 
+

Detailed Description

+

Represents information about a current git revison

+ +

Definition at line 8 of file RevisionInformation.cs.

+

Property Documentation

+ +

◆ CommitSha

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.RevisionInformation.CommitSha
+
+getset
+
+
+ +

◆ OriginCommitSha

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.RevisionInformation.OriginCommitSha
+
+getset
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_revision_information.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_revision_information.png new file mode 100644 index 0000000000000000000000000000000000000000..17b783c90d095dd7de8102292e98c19c3a221c95 GIT binary patch literal 1642 zcmb_ddo+}39R9|AUH2d%cBeMc*=$JM|IC z{XQF}3yKDfC~~ckdugVqHM29${J#UJuv#o-xrYrye z3Xq)*9stA;VeTp;E{y9Ej5Z;tyE?k#1OkCDeZR!Jkp3`3m~BlKizS&drXyU+Q1H&j z03k^7egS0BO05qmIR z8b#@^EZZjJl)wB`Z0(OrLv*O*aPGwjK%I726RK_+`*{p$Ewt`^Jw{FN&GHH>$PFEz z-E;gHIREzZOv@>OA)6jf$rmz#~R`O;K<+j!{KOEj)QF-76|Mkc~V4m4uOEbAvGsl)z$dGThAB2(`U~q}8Vewg> zn{TH*(FFD%6g#=Ec$MkNJr08=(!Cf-#k8*OV}o@~`OMj;A$6N1dK$ z#}S^XlsXNRGy!Z$iE;E_ zX?s2KfOxp-zg%ZM5PLU;MM+H&P?6zuA)y8^H*=t&90yIaNjaqwfIQ3hofts~8np-@ zHFfXwo+ecmkf-V(O91+MhTKkxFh!)J-*rt)oi=y|Ldmm8TjYi{MqRG zXX6U?9J)1})=ya(j^a-QOco->!!3u{ZJX~kOMUvg)pGM!a2ro4R}X}9naH{Y6;|xy zHX@UZB{!%#h8foqvdj-Q3L`IW#*MFkEn_=1hmsk0%VBOrjDF7?nirrq2lj*;QAV&I z<0D3JZBOP@_|zo$#q>|mRU)&!`njc5ynmfE*rsIYG+hFTo)avSo3w1qnEK?Z^&+mQtv`Z=26+XvLN5uDqD0tmj?+dWXELe(w3^%Q08b*)bF|E|M*)bF)Xv;n{*qMCH!Q${> zeoZ@eBnh5~s?}a2hqPFpaA+klOb=RCxw`}fdvR{+tcJw<3Dt(wi-Us8swlTp4ews# zObE~Kw}tshj@FbRgAc@~?TiNK1e|OV9Sv#rxj_j-r636_4aOz>X2(fiCySWi{Pu7z zCQkbcY?|D0QRuNd9FNk;jDhyS4ZYnnK5#0g?csm8OS?%1B{%W*8|Ftjc>BF2nQLUe Zcve?x%*@pVUE#+7KsaZcs$U3+e*=}r0u%rM literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge-members.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge-members.html new file mode 100644 index 0000000000..4c5d5de6a6 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge-members.html @@ -0,0 +1,96 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.Internal.TestMerge Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge.html new file mode 100644 index 0000000000..068e0e25e1 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge.html @@ -0,0 +1,203 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Internal.TestMerge Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Internal.TestMerge Class Reference
+
+
+ +

Represents a merge of a GitHub pull request + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.Internal.TestMerge:
+
+
+ + +Tgstation.Server.Api.Models.Internal.TestMergeBase +Tgstation.Server.Api.Models.TestMergeParameters +Tgstation.Server.Api.Models.TestMerge +Tgstation.Server.Host.Models.TestMerge + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

long Id [get, set]
 The ID of the TestMerge More...
 
DateTimeOffset MergedAt [get, set]
 When the TestMerge was created More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.TestMergeBase
string TitleAtMerge [get, set]
 The title of the pull request More...
 
string BodyAtMerge [get, set]
 The body of the pull request More...
 
string Url [get, set]
 The URL of the pull request More...
 
string Author [get, set]
 The author of the pull request More...
 
- Properties inherited from Tgstation.Server.Api.Models.TestMergeParameters
int? Number [get, set]
 The number of the pull request More...
 
string PullRequestRevision [get, set]
 The sha of the pull request revision to merge. If not specified, the latest commit shall be used (semi-unsafe) More...
 
string Comment [get, set]
 Optional comment about the test More...
 
+ + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from Tgstation.Server.Api.Models.Internal.TestMergeBase
 TestMergeBase ()
 Construct a TestMergeBase More...
 
 TestMergeBase (TestMergeBase copy)
 Construct a TestMergeBase from a copy More...
 
+

Detailed Description

+

Represents a merge of a GitHub pull request

+ +

Definition at line 9 of file TestMerge.cs.

+

Property Documentation

+ +

◆ Id

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Api.Models.Internal.TestMerge.Id
+
+getset
+
+ +

The ID of the TestMerge

+ +

Definition at line 14 of file TestMerge.cs.

+
14 { get; set; }
+
+
+ +

◆ MergedAt

+ +
+
+ + + + + +
+ + + + +
DateTimeOffset Tgstation.Server.Api.Models.Internal.TestMerge.MergedAt
+
+getset
+
+ +

When the TestMerge was created

+ +

Definition at line 20 of file TestMerge.cs.

+
20 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge.png new file mode 100644 index 0000000000000000000000000000000000000000..7eb2847c4dd77dee44546bd481b49e1a9f023709 GIT binary patch literal 3214 zcmc&%2~bm67L7OpgP^P;141(;V30i_iJXlrS}kOqN-Euk7gKqL|r z#9%|SYC{rP10*a8i0ok4Ly{(}8X$x%1cc0wT~pOlHPtmURa5<{{{8pYfA80O_nvd_ z`N{5ZXC;NdDS$vACFr+K9w3km7Vw+p_X0NW!jd&`JM8Z2bxtCY0Pg(4dN|?DBf$H7 zH8(f!OP=9SCxKMYziTNT00(i#6Eqw(mRpJHTiw1kyzA zQ79`y*Nte`sCOCoTTT;kU`O)3&rS?OJjaUK^|YwzvqGn)?`{o#zxMsFs34oW6A25) z#utL@`=_>dC%SAQx}S_ATIu)eP<1zuJ#oFH^XW6`oM%H%>jopd@seQlj6E7bEGExA z)%+l;Jjv6akCLO4OoRbBvBFHpzTi7w-U*t7bR1Z0_hUpP#|mpyW9S`rLJMuN>opR$ zc`M9@hcZS3;jq=D4t%(b{prC7JJ8dYPKnkEf}qG8(yo0Bb+Gqjb-t~KFYR4mex%-_ zD;e80hx1C7lcb_sw`&F?I$ptC$XL`!;IMx(E$U8nhg(hKd{RKK2bn}JWu-#dtyCN>{>5k-eMj%J+B zW^m+w^iTFsCg;_6z`+)hMrIPhVo{C(ht%r6?K<7ME5pM56%tAh$w1XaLfzdxX0^+f9ZIcB%?f1*N&njmx=_P%OnYK}gHA(&Yl zgmkFYr;82}8gZGyGkWxlu*Hp;%AT zGB)48EM(f)f88g#OpL9{u7}1FAdLqqDtU-^xUnVmo;854%m$M>9nB-;f|KFDJ#POrK8%!!Xfnwz5cw{=Gwx{(jZE7EY)p*4j%h? zXY|3ySh+E0wv&}gQ=$6LYYS&{>QvB`i+vNrb7LESf#{}I82c44$-mfXQt2hdwGjx> z=^>Z#s0z!S*v*vsO)>(J~wrCKJw`uzr!0r{`fy0!mP`iGRYvnK9_6f}5^G##DN!CMT@b=3= zdkq1x3KdJVX03bLTH}-DTGn`oc<$p&>Po1a@?G%+8AbSw9u^btdn)O8DLt|a!f#y3 zd;T-DcIW((=OVclQDZk6+YpIOmMiGyRcjoFa@t5G7l_{Cona~JHK`_P&=uL;7ua^V zAAt7KRGL=?I8qM(_0*BmkwD_^z)(bW=t|D->g7cqq~qehqYOZg>(7cmD7!b~A00Hz zi>ovg=Ea>9ZyK)V#iF33Hzf^v6 z(J0W|DM2~S<6^wN(Y+rYr~FOvqW--Cufc#M1$~{OeA%-L3Cp3|XPKFVT*1cPrdau( z`X4gz*tPY_Fk{K+LkhbwCZcdhW6}o*4i73%V>@tHy(MVsbcN+g@LQKhczuqPI`Uj; zUE!vPBK1ZrM}ovInyX!85kI`HY9Syam zMC0lW`y*~UZ1BP(7E)*z8+)+Y!mWfx6?AX5wy=hkm}p8D%h_wlm+ZnNbV;0&bo238M54_X(&jK|$_vkGEbYnpc$v846_}fX`5DE}=pLiE zm@pm)TIsU*moVDk=<3o zugl`Cq+s`wpET6?`f&akdFPieUMp*yv2r=5l=$Lbp#cDW6dT@M&k znSDC>JlVZoph+tY%fopx^6f8cUxPFpt>A4+vM)eyLX3jV9rr1xd4|OAF^c;kCq-M) zeb2oquZe&-g)ekU{>!DyC3~&hm}}1Br^U#v0xwVr@|mnT1ey+(yWIx+O-w;LLI4$| zl?OD-DL_VjP&}Wc(!}Niddg0=)ZG>liOJZ$3+^yxWC}St z4T839pA#`|jJ_vSG(~%J>sq%NjYA!|8NF&DaLDJsVm+distI;C;r+T7)*gfpU{i65 z3>4~CTC_Qd0v0PBIKX{L_zXM+W9gfS-yR*NA(;0m;pEUx{zHQ(_^gm(1 zVHMESq-V%#rJGjX_|=Elu&X{R^Gc!f=st(t@RKHp)jG68*{zb8-%G4)Lny8-4tvZA z9lPOhxTSzczWx-9p6p>BLyqr%&|tuk^Z^QbQO9lo#ydiWK|>!ggJ;_+6_YS$)`-(i ze%1p)T7m$C3o$+ibCUY}CU^?iF*MY`EN6bkg9MheC}xg>#oXdQ0FzXFl>qPe*te02 qkw$<9OY2XvbYpq}>gLF#1hh%o0%;_ivjKh{K+tn=C(4 + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.Internal.TestMergeBase Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.html new file mode 100644 index 0000000000..292c1f7102 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.html @@ -0,0 +1,332 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Internal.TestMergeBase Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Internal.TestMergeBase Class Reference
+
+
+ +

Layer of test merge data required internally + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.Internal.TestMergeBase:
+
+
+ + +Tgstation.Server.Api.Models.TestMergeParameters +Tgstation.Server.Api.Models.Internal.TestMerge +Tgstation.Server.Host.Components.Interop.TestMerge +Tgstation.Server.Api.Models.TestMerge +Tgstation.Server.Host.Models.TestMerge + +
+ + + + + + + + +

+Protected Member Functions

 TestMergeBase ()
 Construct a TestMergeBase More...
 
 TestMergeBase (TestMergeBase copy)
 Construct a TestMergeBase from a copy More...
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Properties

string TitleAtMerge [get, set]
 The title of the pull request More...
 
string BodyAtMerge [get, set]
 The body of the pull request More...
 
string Url [get, set]
 The URL of the pull request More...
 
string Author [get, set]
 The author of the pull request More...
 
- Properties inherited from Tgstation.Server.Api.Models.TestMergeParameters
int? Number [get, set]
 The number of the pull request More...
 
string PullRequestRevision [get, set]
 The sha of the pull request revision to merge. If not specified, the latest commit shall be used (semi-unsafe) More...
 
string Comment [get, set]
 Optional comment about the test More...
 
+

Detailed Description

+

Layer of test merge data required internally

+ +

Definition at line 9 of file TestMergeBase.cs.

+

Constructor & Destructor Documentation

+ +

◆ TestMergeBase() [1/2]

+ +
+
+ + + + + +
+ + + + + + + +
Tgstation.Server.Api.Models.Internal.TestMergeBase.TestMergeBase ()
+
+protected
+
+ +

Construct a TestMergeBase

+ +

Definition at line 40 of file TestMergeBase.cs.

+
40 { }
+
+
+ +

◆ TestMergeBase() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + +
Tgstation.Server.Api.Models.Internal.TestMergeBase.TestMergeBase (TestMergeBase copy)
+
+protected
+
+ +

Construct a TestMergeBase from a copy

+
Parameters
+ + +
copyThe TestMergeBase to copy data from
+
+
+ +

Definition at line 46 of file TestMergeBase.cs.

+
47  {
48  if (copy == null)
49  throw new ArgumentNullException(nameof(copy));
50  Author = copy.Author;
51  BodyAtMerge = copy.BodyAtMerge;
52  Comment = copy.Comment;
53  Number = copy.Number;
54  PullRequestRevision = copy.PullRequestRevision;
55  TitleAtMerge = copy.TitleAtMerge;
56  Url = copy.Url;
57  }
string TitleAtMerge
The title of the pull request
+
string Author
The author of the pull request
+
int? Number
The number of the pull request
+
string BodyAtMerge
The body of the pull request
+
string Url
The URL of the pull request
+
string PullRequestRevision
The sha of the pull request revision to merge. If not specified, the latest commit shall be used (sem...
+
string Comment
Optional comment about the test
+
+

References Tgstation.Server.Api.Models.Internal.TestMergeBase.Author, Tgstation.Server.Api.Models.Internal.TestMergeBase.BodyAtMerge, Tgstation.Server.Api.Models.TestMergeParameters.Comment, Tgstation.Server.Api.Models.TestMergeParameters.Number, Tgstation.Server.Api.Models.TestMergeParameters.PullRequestRevision, Tgstation.Server.Api.Models.Internal.TestMergeBase.TitleAtMerge, and Tgstation.Server.Api.Models.Internal.TestMergeBase.Url.

+ +
+
+

Property Documentation

+ +

◆ Author

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.TestMergeBase.Author
+
+getset
+
+ +

The author of the pull request

+ +

Definition at line 35 of file TestMergeBase.cs.

+
35 { get; set; }
+

Referenced by Tgstation.Server.Api.Models.Internal.TestMergeBase.TestMergeBase().

+ +
+
+ +

◆ BodyAtMerge

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.TestMergeBase.BodyAtMerge
+
+getset
+
+ +

The body of the pull request

+ +

Definition at line 21 of file TestMergeBase.cs.

+
21 { get; set; }
+

Referenced by Tgstation.Server.Api.Models.Internal.TestMergeBase.TestMergeBase().

+ +
+
+ +

◆ TitleAtMerge

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.TestMergeBase.TitleAtMerge
+
+getset
+
+ +

The title of the pull request

+ +

Definition at line 15 of file TestMergeBase.cs.

+
15 { get; set; }
+

Referenced by Tgstation.Server.Api.Models.Internal.TestMergeBase.TestMergeBase().

+ +
+
+ +

◆ Url

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.TestMergeBase.Url
+
+getset
+
+ +

The URL of the pull request

+ +

Definition at line 28 of file TestMergeBase.cs.

+
28 { get; set; }
+

Referenced by Tgstation.Server.Api.Models.Internal.TestMergeBase.TestMergeBase().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.png new file mode 100644 index 0000000000000000000000000000000000000000..755bbbd1eceee5a385ff9b07694793906c39cdb3 GIT binary patch literal 3643 zcmcInc~n#9wpWl~fgp9b3PBPzlvtFMFgQUVRfYru6qG?okOC^wFqJ7x5z}J53dDeb zsDLsRP|yfLk|0znQ=}k>2!RAkAVfqU3^56icS8H#UGJ@T?;l;OXRWi(ch0xZx4yIY z@3(*ZTy=MK0&5v)ZP>5@jCDTYv0;Nc3>dd;RtGFsP3iz#cDbKC<)Bn5f#KALrP!?J zG+?xTwzRZpTpfV|x0_=;Ts=1cPO4*|>l6xDuM2wub1Gru%;+nR@uPY_yhF}Zag_U@ zu&4u_y0nBRnw;a}Ehn7!Rh~b?`cWi3abvWB)c?}JJ`^iuC!X93;kmD)doyH zL*p7GdACP0Zu^%i z+3FBIgf&>=6*5cV?Bum)Bq^RQrY4(}C76~?&#a(7ph~CT>qOs0H^cBzJr?p8tga%b z9(AN2@24m$SLlWMT3*_uQYs?;4);9+?6M~pQ!~-ayu+wFXYVb*??-yd-y5~P1T`*8 z!$=QDn$;^xLxZmK_O7N{JHB)@h=0^Lgxb7fF=F1~q1RwQY%HtHpD3ISZC(b2=DoG< zVENdM3Ue`D5OUI1FXC>uhCtfK2O)Z&&VTw9h99Ej448n#RkH>`g>NCH;tSyD>JQzQ zKN{U5rycR|>s`oxbr7|QHB*xD+8|iQ&%*W9sRG)g!ys4GfKff6wUfLb`7z*cnnP%T z!;d-#mITe#w_QgPJEC!eOkGR#UR5IEb@~LAfuA z@jxww3#+D$%7HyOy+w5-VNynbMEvb5v17!F+1331d@J6@)1ri-P+|3=7Htq?+(oGQ5mihfuc;_~iI{>;J z{g(JFHI40al*n{7EkrL6m+kKMJu-jYG&QX$1l4|{#v(^nVhFfQ0a?{ToOKvd2P^ki zbXnM7KGSTkkm$I%KmTRE(x!D=PGn^AmpyZvj13Ko{+t#Si25fq@qW*qt=1Ftrm>M% z!iAi+WkT)3|+I^|!*=-ME`GYF1eY{o>YVuug>I}H=^n5wS zt8C~Q%#^yQo$@V>2dP7KT;xSWI4HyGRfw>A&cqZjl!zQRoxXv7t2Ud*wLh1aP_|pQ z23*O?a#y^JnU{|;oeJ9P`7FqNU*^?>yCYA_b<~s_;&m9yzm{VrkKi?s-Z9PgkR?Bm zemUtGtd;xPjg(oJsAUH>H+;a8rANBAeC`V=O)@w7%Gui`$lLE6Au2pqIwRio@)4>d zVO3z!ag~{2(%58_^3yR9lG@Vz{47nnSN1biHoo{OYTEYRcwg+QTfCrw&`{OnFOXi0 z$+R+i^Xr8$vTt!lug%$2$C`UgFMlM@=mU#SN&rIfxwT~F_t(m?uEgLlRdS9OM&uzm z>CiL2S%n;+e4c-~AYOd`Qu(?oaZadmxOqO|@>bnUw+a2i;vcBvp5$~B#JjOirwZSF zhCBQ}(>>ytqdO}4#fu04>PpS?0Mym+rt3_((=(w$e&!z}x^36B$K5`y=BA1nUOBdZ zjUO$_7FjZSr)WXOQAdm=oQe*FmhCaj!I^z1vHXGR(fMOa4iMZg8y{u$>FMH(cP@Wp z@ElVqe2&H)Ka9BP|JEsVvt}7xTY&(-EB-4l_gLWj7lV$t^;@oxCXo&&u~R6{t8kYj$2WHO z#1W~OH&+yAo@TAhPEOTXNvf7%@}jRgn)Z=u^Wg!HmM(LA>UzKunjBlOT#AVclPkcI zxHhRBKT95UdSsoB*Ysux)=6Xk(z1-Yh3l!09i>_9D#0*k(x(2iQ5)lhtx(M&pZNk| zxhWR(5h4t^f3T=^PdckG?`h`l*FF?>_?)TlV3MF(TzjbFbOUoDr_4&7B@f4uZ!xMq z#=ZQGcBE|djGt-5hnoG|z=qZxNw@;*nuOc@7~{?s0+r)h$7?xuF{X>C75lL5ZiL`Q zY?JhEfzdCpYtb30L96u*-t_*0<*GKh=c|5QqZxA`{!nii$!2DB;m#c#L00JU=^|$T{ez~K3%NY|nGk+_tu$(A!kfXLTx1Uez_IQa%YlYuv1#lyh0-*QG>DgSEEaV`RVBrKa9vnUyNv#typB=ElF>!i7G%l%joTw_{=RDQZ%U2mR(YuW z@tum$g48d|-dW=N(PLLEjIlT1S+CYx7V>qVxi!oI%!d-7U(qZBi~<4lDHv6=f(Clw zXm`LcvP$%YF*0ml-NZC6pjBBw#!3#dZVV#74}g~W$+-CNc4xXMp$$Of9O^s670(cx zF>S`15I@1dPqSKy!vU zn#a%TacI4rI|vb{ybW<49MBgYP1*NERVvIv7N*E!Az={n8vO_sU6}L%)xq85kG?Xl zbk@(hNSk)(`=ja2%l|@?n}a^snm+^^TuXiU@TLMH&9Nk1kMb)O+ykcfk_Rn(K#y1?vec4PAwgRUp(5fT#}N#aHd^SY+B zbNoA7n!qd~$oqDmndY=pvOe82mudDqDq!4EZjY7V;|zooYT<~5@nD-O48Pu|aFolH zr`C=TSND9sz&@sYzxN=aLFgY|nN*n%@HaM%mByXg)Apr1JvrMJpqpA|yYdFgs26tp zezwq + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.Internal.User Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html new file mode 100644 index 0000000000..cd9c984400 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html @@ -0,0 +1,326 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Internal.User Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Internal.User Class Reference
+
+
+ +

Represents a server User + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.Internal.User:
+
+
+ + +Tgstation.Server.Api.Models.User +Tgstation.Server.Host.Models.User +Tgstation.Server.Api.Models.UserUpdate + +
+ + + + + + + + + + + + + + + + + + + + + + + +

+Properties

long Id [get, set]
 The ID of the User More...
 
bool? Enabled [get, set]
 If the User is enabled since users cannot be deleted. System users cannot be disabled More...
 
DateTimeOffset? CreatedAt [get, set]
 When the User was created More...
 
string SystemIdentifier [get, set]
 The SID/UID of the User on Windows/POSIX respectively More...
 
string Name [get, set]
 The name of the User More...
 
AdministrationRightsAdministrationRights [get, set]
 The Rights.AdministrationRights for the User More...
 
InstanceManagerRightsInstanceManagerRights [get, set]
 The Rights.InstanceManagerRights for the User More...
 
+

Detailed Description

+

Represents a server User

+ +

Definition at line 10 of file User.cs.

+

Property Documentation

+ +

◆ AdministrationRights

+ +
+
+ + + + + +
+ + + + +
AdministrationRights? Tgstation.Server.Api.Models.Internal.User.AdministrationRights
+
+getset
+
+ +

The Rights.AdministrationRights for the User

+ +

Definition at line 44 of file User.cs.

+
44 { get; set; }
+

Referenced by Tgstation.Server.Host.Controllers.UserController.Update().

+ +
+
+ +

◆ CreatedAt

+ +
+
+ + + + + +
+ + + + +
DateTimeOffset? Tgstation.Server.Api.Models.Internal.User.CreatedAt
+
+getset
+
+ +

When the User was created

+ +

Definition at line 27 of file User.cs.

+
27 { get; set; }
+
+
+ +

◆ Enabled

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.Internal.User.Enabled
+
+getset
+
+ +

If the User is enabled since users cannot be deleted. System users cannot be disabled

+ +

Definition at line 21 of file User.cs.

+
21 { get; set; }
+

Referenced by Tgstation.Server.Host.Controllers.UserController.Create().

+ +
+
+ +

◆ Id

+ + + +

◆ InstanceManagerRights

+ +
+
+ + + + + +
+ + + + +
InstanceManagerRights? Tgstation.Server.Api.Models.Internal.User.InstanceManagerRights
+
+getset
+
+
+ +

◆ Name

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.User.Name
+
+getset
+
+
+ +

◆ SystemIdentifier

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Internal.User.SystemIdentifier
+
+getset
+
+ +

The SID/UID of the User on Windows/POSIX respectively

+ +

Definition at line 32 of file User.cs.

+
32 { get; set; }
+

Referenced by Tgstation.Server.Host.Security.AuthenticationContext.AuthenticationContext().

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Api/Models/Internal/User.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.png new file mode 100644 index 0000000000000000000000000000000000000000..9904dbc93aaa4e58da4fc68465491e2210d23dec GIT binary patch literal 1812 zcma)73s93+7Ea6}k2MC7N*8s5H5kAkiU=x5kP+eMO#qFc$fE@jO^OwSN*;rzDlHof z2rGh&5_u!?wkQO77$ggkKmzhg6+)m8ke|jh;Sc|&c6Zj9-PzqcbMN`?eCM3GGvAr- z-U{^hL>rkKArJ^O;B}0IKp-I+i-F4yfK;IA#7>0Flc0rlM?#R-ikGs9S zUGLU7R(CbHO!5y#=#qY0;@%K@1Y&(LaO`ME3Q|!xcIn+-W4$qcCNN!5kCj!k6fDS-7iP1OaPdor}pb73h2QnqQCCqB?@xCW)EX z#7^rDKB)MS_D1k?M8$0$VSNQYnHDwx#u#hPrEQ;=FYCSApLw2gwe*d9F6Qeanb0$q ztn-Vh#4`49m?p(6^wDxyLr8dKh{qkMT1~O)k%kXlV-+rYxhaP}>{FH0&TBtoIM2kW z3n5S6C?m{fnc-(PS9bjE5fHaWa%jWF)pGL$2QV@@s>rdvdW%B=TgINwd(X;hu0=+Yn^ zz=SfC7gigj{d_P$M)X_NHimgLoL;SkN9KLNd$FC_(rt5zqgdYo5Z3f#1vMY~PUTlG z$@eD-7ooU#_>r>|6i(YEV(x;sZS#s#xnR`&2}XH;JR!qrskoVfzq6=+O>E9q1g*b$ zB&REQ*RbCJ7?A#TBAE^h+4BDA?)wA6EK-f&UE5_4e(4WS4FvkXZvRgrIQRv7BQ~_h zJw<-bOe4Fx`BR+6^u2D$P}9?klOK@w(P~6|?YB&>jv{>`UWN>X>jse=9Szi`{YL9r zOi-E^5Zo?(yF>$m6hzkji~Jw8ztctN7cRn;(x-hZE)1g^k+Hel>&Mib9AiOq8sPn% zEWAzTLvkd*yVZjlytRvLUK_j;ehv@V1&PPo7QRZd6ZiNn&rh}PfHle*@n|n`Gpi;}>&Q5-Hca>jR{Qe=tzs|LG$q%_7_#i*&um15O z;h~{JCX-u)=c@*K5;LYY;mYN<>fvg*>|n&mqo9;C^goqskR1OamJ5iOzcy|ROuDf# zZ=$=b8(j|gVzw8dF= zg0@o7(t2wyuct_!+V7P`6s{C(VzLuadlBj>G{};X&{hOlFsMP8Ey*t*q|}hnEi)cC&TQ*2*Y=zH)ko*@9fUF}zX~@u5l0y1TpqU?=qp>T)?_zGFCWa0zNXZi8 + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.IrcConnectionStringBuilder Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html new file mode 100644 index 0000000000..e06e3bd3d2 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html @@ -0,0 +1,436 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.IrcConnectionStringBuilder Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.IrcConnectionStringBuilder Class Reference
+
+
+ +

ChatConnectionStringBuilder for ChatProvider.Irc + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.IrcConnectionStringBuilder:
+
+
+ + +Tgstation.Server.Api.Models.Internal.ChatConnectionStringBuilder + +
+ + + + + + + + + + + +

+Public Member Functions

 IrcConnectionStringBuilder ()
 Construct an IrcConnectionStringBuilder More...
 
 IrcConnectionStringBuilder (string connectionString)
 Construct a DiscordConnectionStringBuilder from a connectionString More...
 
override string ToString ()
 Gets the ChatBot.ConnectionString associated with the ChatConnectionStringBuilder More...
 
+ + + +

+Public Attributes

override bool Valid => Address != null && Port.HasValue && Port != 0 && UseSsl.HasValue && (PasswordType.HasValue ^ Password == null)
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Properties

string Address [get, set]
 The IP address or URL of the IRC server More...
 
ushort? Port [get, set]
 The port the server runs on More...
 
string Nickname [get, set]
 The nickname for the bot to use More...
 
bool? UseSsl [get, set]
 If the connection should be made using SSL More...
 
IrcPasswordTypePasswordType [get, set]
 The optional IrcPasswordType to use More...
 
string Password [get, set]
 The optional password to use More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.ChatConnectionStringBuilder
abstract bool Valid [get]
 If the ChatConnectionStringBuilder evaluates to a valid ChatBot.ConnectionString More...
 
+

Detailed Description

+

ChatConnectionStringBuilder for ChatProvider.Irc

+ +

Definition at line 11 of file IrcConnectionStringBuilder.cs.

+

Constructor & Destructor Documentation

+ +

◆ IrcConnectionStringBuilder() [1/2]

+ +
+
+ + + + + + + +
Tgstation.Server.Api.Models.IrcConnectionStringBuilder.IrcConnectionStringBuilder ()
+
+ +

Construct an IrcConnectionStringBuilder

+ +

Definition at line 49 of file IrcConnectionStringBuilder.cs.

+
49 { }
+
+
+ +

◆ IrcConnectionStringBuilder() [2/2]

+ +
+
+ + + + + + + + +
Tgstation.Server.Api.Models.IrcConnectionStringBuilder.IrcConnectionStringBuilder (string connectionString)
+
+ +

Construct a DiscordConnectionStringBuilder from a connectionString

+
Parameters
+ + +
connectionStringThe connection string
+
+
+ +

Definition at line 55 of file IrcConnectionStringBuilder.cs.

+
56  {
57  if (connectionString == null)
58  throw new ArgumentNullException(nameof(connectionString));
59  var splits = connectionString.Split(';');
60 
61  Address = splits[0];
62 
63  if (splits.Length < 2)
64  return;
65 
66  if (UInt16.TryParse(splits[1], out var port))
67  Port = port;
68 
69  if (splits.Length < 3)
70  return;
71 
72  Nickname = splits[2];
73 
74  if (splits.Length < 4)
75  return;
76 
77  if (Int32.TryParse(splits[3], out var intSsl))
78  UseSsl = Convert.ToBoolean(intSsl);
79 
80  if (splits.Length < 5)
81  return;
82  if (Enum.TryParse<IrcPasswordType>(splits[4], out var passwordType))
83  switch (passwordType)
84  {
85  case IrcPasswordType.NickServ:
86  case IrcPasswordType.Sasl:
87  case IrcPasswordType.Server:
88  PasswordType = passwordType;
89  break;
90  default:
91  break;
92  }
93 
94  if (splits.Length < 6)
95  return;
96 
97  var rest = new List<string>(splits);
98  rest.RemoveRange(0, 5);
99  Password = String.Join(";", rest);
100  }
string Address
The IP address or URL of the IRC server
+ + +
bool? UseSsl
If the connection should be made using SSL
+ +
IrcPasswordType
Represents the type of a password for a ChatProvider.Irc
+
IrcPasswordType? PasswordType
The optional IrcPasswordType to use
+
+

References Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Address, Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Nickname, Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Password, Tgstation.Server.Api.Models.IrcConnectionStringBuilder.PasswordType, Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Port, and Tgstation.Server.Api.Models.IrcConnectionStringBuilder.UseSsl.

+ +
+
+

Member Function Documentation

+ +

◆ ToString()

+ +
+
+ + + + + +
+ + + + + + + +
override string Tgstation.Server.Api.Models.IrcConnectionStringBuilder.ToString ()
+
+virtual
+
+ +

Gets the ChatBot.ConnectionString associated with the ChatConnectionStringBuilder

+ +

Implements Tgstation.Server.Api.Models.Internal.ChatConnectionStringBuilder.

+ +

Definition at line 103 of file IrcConnectionStringBuilder.cs.

+
104  {
105  var sb = new StringBuilder();
106  sb.Append(Address);
107  sb.Append(';');
108  sb.Append(Port);
109  sb.Append(';');
110  sb.Append(Nickname);
111  sb.Append(';');
112  if(UseSsl.HasValue)
113  sb.Append(Convert.ToInt32(UseSsl.Value));
114  if (PasswordType.HasValue)
115  {
116  sb.Append(';');
117  sb.Append((int)PasswordType);
118  sb.Append(';');
119  sb.Append(Password);
120  }
121 
122  return sb.ToString();
123  }
string Address
The IP address or URL of the IRC server
+ + +
bool? UseSsl
If the connection should be made using SSL
+ +
IrcPasswordType? PasswordType
The optional IrcPasswordType to use
+
+

References Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Address, Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Nickname, Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Password, Tgstation.Server.Api.Models.IrcConnectionStringBuilder.PasswordType, Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Port, and Tgstation.Server.Api.Models.IrcConnectionStringBuilder.UseSsl.

+ +
+
+

Member Data Documentation

+ +

◆ Valid

+ +
+
+ + + + +
override bool Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Valid => Address != null && Port.HasValue && Port != 0 && UseSsl.HasValue && (PasswordType.HasValue ^ Password == null)
+
+ +

+ +

Definition at line 14 of file IrcConnectionStringBuilder.cs.

+ +
+
+

Property Documentation

+ +

◆ Address

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Address
+
+getset
+
+ +

The IP address or URL of the IRC server

+ +

Definition at line 19 of file IrcConnectionStringBuilder.cs.

+
19 { get; set; }
+

Referenced by Tgstation.Server.Api.Models.IrcConnectionStringBuilder.IrcConnectionStringBuilder(), and Tgstation.Server.Api.Models.IrcConnectionStringBuilder.ToString().

+ +
+
+ +

◆ Nickname

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Nickname
+
+getset
+
+
+ +

◆ Password

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Password
+
+getset
+
+
+ +

◆ PasswordType

+ +
+
+ + + + + +
+ + + + +
IrcPasswordType? Tgstation.Server.Api.Models.IrcConnectionStringBuilder.PasswordType
+
+getset
+
+
+ +

◆ Port

+ +
+
+ + + + + +
+ + + + +
ushort? Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Port
+
+getset
+
+
+ +

◆ UseSsl

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.IrcConnectionStringBuilder.UseSsl
+
+getset
+
+ +

If the connection should be made using SSL

+ +

Definition at line 34 of file IrcConnectionStringBuilder.cs.

+
34 { get; set; }
+

Referenced by Tgstation.Server.Api.Models.IrcConnectionStringBuilder.IrcConnectionStringBuilder(), and Tgstation.Server.Api.Models.IrcConnectionStringBuilder.ToString().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.png new file mode 100644 index 0000000000000000000000000000000000000000..e379afcf8f1b5de6b5cd808d6ec0de85a74c47d8 GIT binary patch literal 1370 zcmeAS@N?(olHy`uVBq!ia0y~yU~B@i12~w0r1H`xZ6GBP;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|!1B`5#WAFU@$KB#c~2C0-1z&he6N2p zSB1x6IUC=@v5iL@MwB}Rms|Qk;}6#ch$aMyD?+`Z0}pATwk31et6-#@X|PA ztGIL-za*We+Q5m6uS0wfhYk2Dk?xN82b=nt7UrgsX6Kk;Svzy|p?Pa@PeAAA< z|Mc_8@a=oHU77vm>!#>p?c~j=;+F+A`)V0;9c7)OS7qs3%YS|P!t=I!zn<;fb>oWv zUGryI4hyn(cbr)MCGoS8(#9%@1+EF}qXZ|Kzuxcmq4|&R@&`7mN=ovV{?~HNdwyQq z1)Lu07r7`X39UjS#G7(&Z@U6aITIM_w(nyIVhHqNVVL;qmlqpDBZyTc=)uNN2xJ}f zVqjPZq-lzO{pIk|R1Njg3|z#pgdu4P2ZPg8BwWhwxOYe6KTztuf6Rt6VPWEvpMkgC zv=5)+W+`ER}d_4wDvJQq_wsWq{mu3r4=%hJ}H z|Mok4ICXTN;XYewV0t~iER!?4?fl(Owrk#LUp4tr=(ql$221I&9Wx#kuUq%~%crwN zTQA4wv7Bv{J)F4XY;MlE?;ox17CvT!V9pp`sk_u?f2)lHk`N1Pp#+7 z-4(TMUGR(Z3GtQr&$nsFN}pn{u47EIb-B>|y0O|ZlY`X&luUy|Wm!I-o9%0{Z2I~_ z;cV$^)t`f=AJyVEFa9mjSoGFrnK#Si^`@(ztt)<%xw3G3ZuCt{kL>~_%-Jkvv-$Qt z_1tt-AYtKrg&jIBYMi_DUiR8P^Nilxdcf!RMa_b~PgaNd1!L}fW@x@wC;o$jt?IMm zTaIU+>{zQx#UpNqi@vaG@@9FaC$ag{NvA98e^61O z#4NhZaQ14eOFH?!e6@KjYxC!=?)LqAr8fBlgZQq_0~;8AblBy{J + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.Job Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job.html new file mode 100644 index 0000000000..72ddb6e6e1 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job.html @@ -0,0 +1,221 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Job Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Job Class Reference
+
+
+ +

Represents a long running job on the server. Model is read-only, updates attempt to cancel the job + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.Job:
+
+
+ + +Tgstation.Server.Api.Models.Internal.Job + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

User StartedBy [get, set]
 The User that started the job More...
 
User CancelledBy [get, set]
 The User that cancelled the job More...
 
int? Progress [get, set]
 Optional progress between 0 and 100 inclusive More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.Job
long Id [get, set]
 The Job ID More...
 
string Description [get, set]
 English description of the Job More...
 
string ExceptionDetails [get, set]
 Details of any exceptions caught during the Job More...
 
DateTimeOffset? StartedAt [get, set]
 When the Job was started More...
 
DateTimeOffset? StoppedAt [get, set]
 When the Job stopped More...
 
bool? Cancelled [get, set]
 If the Job was cancelled More...
 
RightsTypeCancelRightsType [get, set]
 The RightsType of CancelRight if it can be cancelled More...
 
ulong? CancelRight [get, set]
 The Rights required to cancel the Job More...
 
+

Detailed Description

+

Represents a long running job on the server. Model is read-only, updates attempt to cancel the job

+ +

Definition at line 6 of file Job.cs.

+

Property Documentation

+ +

◆ CancelledBy

+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Api.Models.Job.CancelledBy
+
+getset
+
+ +

The User that cancelled the job

+ +

Definition at line 16 of file Job.cs.

+
16 { get; set; }
+
+
+ +

◆ Progress

+ +
+
+ + + + + +
+ + + + +
int? Tgstation.Server.Api.Models.Job.Progress
+
+getset
+
+ +

Optional progress between 0 and 100 inclusive

+ +

Definition at line 21 of file Job.cs.

+
21 { get; set; }
+
+
+ +

◆ StartedBy

+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Api.Models.Job.StartedBy
+
+getset
+
+ +

The User that started the job

+ +

Definition at line 11 of file Job.cs.

+
11 { get; set; }
+
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Api/Models/Job.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job.png new file mode 100644 index 0000000000000000000000000000000000000000..ccea754211043b62fa089cfdc4485c6c44071f78 GIT binary patch literal 912 zcmeAS@N?(olHy`uVBq!ia0vp^Uw}A(gBeIl)~qlAQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;lKdQHFze5L@nr)Sr`6qH6d26~C9O zKg)AciGq1i?TueGBHKTuZdbW}=JY$B;!C-6UYkDq=f2WA|H-cO#Mk$DYNP-DJ8#?h zQ{emjrRD$DYQCFzjd?$RblVO+_Pu`h{cbtr8~;g4b5A?`^U5~U?JL#3OiP$t+A=TM z^QejF)ikypb9}2xy(Vvz-F&H?vCkpulY*mrcLWI?9J_3()VU@ zd)ds=g|px02`*U_mVTl11mhOR$T=lEd-E0>UVG>F-t_iE{`JyzviEN7zIE{E=bQgH zeqFh@@LSaO+lOCIeSWO@_=Uu%?@OASZ>{WiiogHTZp-cU*Y1g0#a-@O=>P7^%)R~# z``>R_d#`%#9PW6H73chyO}gc=_4G8(;JwMOmS5eiyR4K^dg0%?IU($5?j$(!MMYJv0@6W?GX#y{${j48oxFV?Sb zxgxnR|IE)7!A||JcqceBODQz7nK%FyH}FVZV30IfzzB>B=9CK!Y$p~l@=kC>Q}8}m zb7_h&tHN}crd=lL1LN%a{Cj>(789g*+U3;Rbwx`WynQ0taQUm}_V?=_pa0t* zR304hT_@-6?1k6!ZzIQ+;dN+iO+RE+Yn{ow_w0x6R@s-&7%yCGzF@2S6$&Wh0yx{8N3#AjQ-ag`sm@K+L`S**3vAr*x%x}NF{N@>>z*pOh z=1o6-=WIOs|LW%5)@yrf+gtB-GQZtdl>9#2asDmqD{-&Osw?(>db4!{NSG#1#Wm{+YJ1<|fsyp6(wRif5ojz?%ukPe~ZS4)&oio$ms&&rw%CBY0 z^FsIT|M-{r$Hq9Bf9w~oe`k3R{>$dYSqBFFOYBa}e^dK+2zsyUtjas|& S6Sn}f4}+(xpUXO@geCw&ZNilR literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository-members.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository-members.html new file mode 100644 index 0000000000..41c47ee6d9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository-members.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.Repository Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html new file mode 100644 index 0000000000..2220070d85 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html @@ -0,0 +1,408 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Repository Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Repository Class Reference
+
+
+ +

Represents a git repository + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.Repository:
+
+
+ + +Tgstation.Server.Api.Models.Internal.RepositorySettings + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

string Origin [get, set]
 The origin URL. If null, the Repository does not exist More...
 
string CheckoutSha [get, set]
 The commit HEAD should point to. Not populated in responses, use RevisionInformation instead for retrieval More...
 
RevisionInformation RevisionInformation [get, set]
 The current Models.RevisionInformation for the Repository More...
 
string GitHubOwner [get, set]
 If the repository was cloned from GitHub.com this will be set with the owner of the repository More...
 
string GitHubName [get, set]
 If the repository was cloned from GitHub.com this will be set with the name of the repository More...
 
Job ActiveJob [get, set]
 The Job started by the Repository if any More...
 
bool? UpdateFromOrigin [get, set]
 Do the equivalent of a git pull. Will attempt to merge unless Reference is also specified in which case a hard reset will be performed after checking out More...
 
string Reference [get, set]
 The branch or tag HEAD points to More...
 
List< TestMergeParametersNewTestMerges [get, set]
 TestMergeParameters for new TestMerges. Note that merges that conflict will not be performed More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.RepositorySettings
string CommitterName [get, set]
 The name of the committer More...
 
string CommitterEmail [get, set]
 The e-mail of the committer More...
 
string AccessUser [get, set]
 The username to access the git repository with More...
 
string AccessToken [get, set]
 The token/password to access the git repository with More...
 
bool? PushTestMergeCommits [get, set]
 If commits created from testmerges are pushed to the remote More...
 
bool? ShowTestMergeCommitters [get, set]
 If test merge commits are signed with the username of the person who merged it. Note this only affects future commits More...
 
bool? AutoUpdatesKeepTestMerges [get, set]
 If test merge commits should be kept when auto updating. May cause merge conflicts which will block the update More...
 
bool? AutoUpdatesSynchronize [get, set]
 If synchronization should occur when auto updating More...
 
bool? PostTestMergeComment [get, set]
 If test merging should create a comment More...
 
+

Detailed Description

+

Represents a git repository

+ +

Definition at line 8 of file Repository.cs.

+

Property Documentation

+ +

◆ ActiveJob

+ +
+
+ + + + + +
+ + + + +
Job Tgstation.Server.Api.Models.Repository.ActiveJob
+
+getset
+
+ +

The Job started by the Repository if any

+ +

Definition at line 38 of file Repository.cs.

+
38 { get; set; }
+
+
+ +

◆ CheckoutSha

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Repository.CheckoutSha
+
+getset
+
+ +

The commit HEAD should point to. Not populated in responses, use RevisionInformation instead for retrieval

+ +

Definition at line 18 of file Repository.cs.

+
18 { get; set; }
+
+
+ +

◆ GitHubName

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Repository.GitHubName
+
+getset
+
+ +

If the repository was cloned from GitHub.com this will be set with the name of the repository

+ +

Definition at line 33 of file Repository.cs.

+
33 { get; set; }
+

Referenced by Tgstation.Server.Host.Controllers.RepositoryController.PopulateApi().

+ +
+
+ +

◆ GitHubOwner

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Repository.GitHubOwner
+
+getset
+
+ +

If the repository was cloned from GitHub.com this will be set with the owner of the repository

+ +

Definition at line 28 of file Repository.cs.

+
28 { get; set; }
+

Referenced by Tgstation.Server.Host.Controllers.RepositoryController.PopulateApi().

+ +
+
+ +

◆ NewTestMerges

+ +
+
+ + + + + +
+ + + + +
List<TestMergeParameters> Tgstation.Server.Api.Models.Repository.NewTestMerges
+
+getset
+
+ +

TestMergeParameters for new TestMerges. Note that merges that conflict will not be performed

+ +

Definition at line 53 of file Repository.cs.

+
53 { get; set; }
+
+
+ +

◆ Origin

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Repository.Origin
+
+getset
+
+ +

The origin URL. If null, the Repository does not exist

+ +

Definition at line 13 of file Repository.cs.

+
13 { get; set; }
+

Referenced by Tgstation.Server.Host.Controllers.RepositoryController.PopulateApi().

+ +
+
+ +

◆ Reference

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Repository.Reference
+
+getset
+
+ +

The branch or tag HEAD points to

+ +

Definition at line 48 of file Repository.cs.

+
48 { get; set; }
+

Referenced by Tgstation.Server.Host.Controllers.RepositoryController.PopulateApi().

+ +
+
+ +

◆ RevisionInformation

+ +
+
+ + + + + +
+ + + + +
RevisionInformation Tgstation.Server.Api.Models.Repository.RevisionInformation
+
+getset
+
+ +

The current Models.RevisionInformation for the Repository

+ +

Definition at line 23 of file Repository.cs.

+
23 { get; set; }
+

Referenced by Tgstation.Server.Host.Controllers.RepositoryController.PopulateApi().

+ +
+
+ +

◆ UpdateFromOrigin

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Api.Models.Repository.UpdateFromOrigin
+
+getset
+
+ +

Do the equivalent of a git pull. Will attempt to merge unless Reference is also specified in which case a hard reset will be performed after checking out

+ +

Definition at line 43 of file Repository.cs.

+
43 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.png new file mode 100644 index 0000000000000000000000000000000000000000..21716ca7e7d0fe577a95aef4adce1b1891bbb135 GIT binary patch literal 1199 zcmeAS@N?(olHy`uVBq!ia0y~yU~~tv12~w0|u-;Y={r#`M zrm-d>DCdO2jk(cFHRanRqNiC+`Z_%|a@wU$I^JG7lR_pfY3W+5@-$RNRdf9#4bMtZ zch6JV&u?6__e}e8{Py+_xBnf^oUG#eBrK2r_nhsI{OT-qPxjvZlKp&HVe5fwrT#rL zYi!n6z5SN_PwRwP)Xqw2rhh!gz0di6dYmNZYk7}pSN+c8Un`W4AGiAb<4vIavF+Q- z2 zlP6y}6A&z))_6EU$!wkrN7-4yH)8$P*(IM2Sbsj%yj^d>j$q$Hm-o&IwLJTLExyI~ ze!u8D`IGM@hi?~)c@FYf%zO0pspz8b?2?yn%bIWgeJJRLwbKRL*##zU*N)69z7yBC za>Zhu+=;x0t-MN~JT5F+@p_)Xxq08O9lxYISJ|d`Oa8w1vPu&(6W3?tCE1&d5xAx{972eXXceY=1?c3PyajE_5Y0J2%vO^`Oj_b}SF+=iiSO1$_{Zy1r^pmqE!0& z|EA>ZwNs3;D(re%-M!S$cXy`mv9f3imfX)?M&>dUZ^Hd40{A&Hd-)z7}4Zrv5$k zwUGH!ncLgm|IDy>XZd`T3u;8Ae99O|R{$ zTo2TLvA8>@>rS>ju4`P?U@c{B+PI-!dglFU{z1F`mwo$r=A*8H{KFqx);VwAnwl4! zb7eyEFPn!F+j#q|e-^KM%`)Nr{r<-XVl19ddNpz0x;@3J^>6C_gv;dax105Cv3{G_ zt5f&BxPwy5>+FK#;MB6aH~jCf0_!y61N>j~jx&fn(Ec^&=jv(y7>}3FmOkM6x3n)` zZpP{3YZVywE!lteG_d2lR|){3xlVt KpUXO@geCwA0a(KT literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information-members.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information-members.html new file mode 100644 index 0000000000..553d54f872 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information-members.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.RevisionInformation Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information.html new file mode 100644 index 0000000000..f28d3192f2 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information.html @@ -0,0 +1,204 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.RevisionInformation Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.RevisionInformation Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.RevisionInformation:
+
+
+ + +Tgstation.Server.Api.Models.Internal.RevisionInformation + +
+ + + + + + + + + + + + + + + + + + +

+Properties

TestMerge PrimaryTestMerge [get, set]
 The TestMerge that was created with this RevisionInformation More...
 
List< TestMergeActiveTestMerges [get, set]
 The TestMerges active in the RevisionInformation More...
 
List< CompileJobCompileJobs [get, set]
 The CompileJobs made from the RevisionInformation More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.RevisionInformation
string CommitSha [get, set]
 The revision sha More...
 
string OriginCommitSha [get, set]
 The sha of the most recent remote commit More...
 
+

Detailed Description

+
+

Definition at line 6 of file RevisionInformation.cs.

+

Property Documentation

+ +

◆ ActiveTestMerges

+ +
+
+ + + + + +
+ + + + +
List<TestMerge> Tgstation.Server.Api.Models.RevisionInformation.ActiveTestMerges
+
+getset
+
+ +

The TestMerges active in the RevisionInformation

+ +

Definition at line 16 of file RevisionInformation.cs.

+
16 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew().

+ +
+
+ +

◆ CompileJobs

+ +
+
+ + + + + +
+ + + + +
List<CompileJob> Tgstation.Server.Api.Models.RevisionInformation.CompileJobs
+
+getset
+
+ +

The CompileJobs made from the RevisionInformation

+ +

Definition at line 21 of file RevisionInformation.cs.

+
21 { get; set; }
+
+
+ +

◆ PrimaryTestMerge

+ +
+
+ + + + + +
+ + + + +
TestMerge Tgstation.Server.Api.Models.RevisionInformation.PrimaryTestMerge
+
+getset
+
+ +

The TestMerge that was created with this RevisionInformation

+ +

Definition at line 11 of file RevisionInformation.cs.

+
11 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information.png new file mode 100644 index 0000000000000000000000000000000000000000..8581a60c9ff7a30c223bc6892e69ee92be3be1d3 GIT binary patch literal 1201 zcmeAS@N?(olHy`uVBq!ia0y~yVDtsD12~w0_AE)z$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opP>J8uU@N>i0KOalB*WIkD-n#Dlv%R%1!Y^;Wy}CQQ z$YlG&QpT~Q%_E9bxaI~O|3NdIH~z;wJJ?ey^qi6yC(VxDu~ zEM9&yQtpC{%DeBY8=u-m@6PvQI=4)!{oDMKrevqfR}Wd9efxWc)aulP(|H-|rd>Y~ zJ$L8oFWdTJZ04{19^}2L_`BWNVj1IE%cs`enRUnR)+Rf-TZ@b4TzJ#Qdp&LYv*%Oq zJvW{CvFjOYpZzWK<0i4Ij(g?n{n{lt!|JB_d9A-C_e*&H^Z8aUyZ$-%e)Hdl8DaY@ z8FH80YqB+O@0>sH8esN8xqUZgK`HM6?H9dbZtNMC&1zno5L<7#S&Col&Y00$INIUTZ@eAY| zL>w9>sX0ujs}oXp=mD|h420DkI)JP>lT;n10BM@ye`2$iPMM^&bP7WtLlA?!b|#aH zCK7(x^sFv~@hvEQJ$`uHkwJLpyxWKGJzKnE=58IvIa#M4PR-omQJf|4V8!dLm6M*8 zyt!3p-kZoZ`}DatJb2(n*k{Ijwzg&dnFZ@i&RSo7I^of;O}jpLzFYnAj=}*4^UQS<7tZK*+U>*6e)z{W zxoVMR{%gPJ)&mn(+U%tN`I8p?ekvT%dDnoW;7aW*-QUj^x@TvvU|_!K?teKq*m)NF z?7RCcUm8i@x%@_XzBJ2=uX4WOmf@54YAv0buPYUO(OG1xguBYCGmD?bdT%=Yy>^y4 z4^zcn&(B*f?H0Z%wl6ksvGZ+r%cVDYrTxv%e^)!p-ORx3`fhe|^|>1xFU@{_IIO~@ zARm;1+-H6BS-#dw+)zdZcoiKDw=9%%wcfN z^emtDf$%R+KQP2!_nmcpKI;SJze=;VwlVBmeBVV_fwf@S5>A1o$e8_XkeBDwpi|F( av0r@ZGE*&4cnPq4VeoYIb6Mw<&;$U1a73~I literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_server_information-members.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_server_information-members.html new file mode 100644 index 0000000000..96c16b44c9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_server_information-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.ServerInformation Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_server_information.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_server_information.html new file mode 100644 index 0000000000..8fe41066ce --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_server_information.html @@ -0,0 +1,158 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.ServerInformation Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.ServerInformation Class Reference
+
+
+ +

Represents basic server information + More...

+ + + + + + + + +

+Properties

Version Version [get, set]
 The version of the host More...
 
Version ApiVersion [get, set]
 The Api version of the host More...
 
+

Detailed Description

+

Represents basic server information

+ +

Definition at line 8 of file ServerInformation.cs.

+

Property Documentation

+ +

◆ ApiVersion

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Api.Models.ServerInformation.ApiVersion
+
+getset
+
+ +

The Api version of the host

+ +

Definition at line 18 of file ServerInformation.cs.

+
18 { get; set; }
+
+
+ +

◆ Version

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Api.Models.ServerInformation.Version
+
+getset
+
+ +

The version of the host

+ +

Definition at line 13 of file ServerInformation.cs.

+
13 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge-members.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge-members.html new file mode 100644 index 0000000000..b094169330 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge-members.html @@ -0,0 +1,97 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.TestMerge Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge.html new file mode 100644 index 0000000000..d0aa92561f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge.html @@ -0,0 +1,179 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.TestMerge Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.TestMerge Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.TestMerge:
+
+
+ + +Tgstation.Server.Api.Models.Internal.TestMerge +Tgstation.Server.Api.Models.Internal.TestMergeBase +Tgstation.Server.Api.Models.TestMergeParameters + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

User MergedBy [get, set]
 The User who created the TestMerge More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.TestMerge
long Id [get, set]
 The ID of the TestMerge More...
 
DateTimeOffset MergedAt [get, set]
 When the TestMerge was created More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.TestMergeBase
string TitleAtMerge [get, set]
 The title of the pull request More...
 
string BodyAtMerge [get, set]
 The body of the pull request More...
 
string Url [get, set]
 The URL of the pull request More...
 
string Author [get, set]
 The author of the pull request More...
 
- Properties inherited from Tgstation.Server.Api.Models.TestMergeParameters
int? Number [get, set]
 The number of the pull request More...
 
string PullRequestRevision [get, set]
 The sha of the pull request revision to merge. If not specified, the latest commit shall be used (semi-unsafe) More...
 
string Comment [get, set]
 Optional comment about the test More...
 
+ + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from Tgstation.Server.Api.Models.Internal.TestMergeBase
 TestMergeBase ()
 Construct a TestMergeBase More...
 
 TestMergeBase (TestMergeBase copy)
 Construct a TestMergeBase from a copy More...
 
+

Detailed Description

+
+

Definition at line 4 of file TestMerge.cs.

+

Property Documentation

+ +

◆ MergedBy

+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Api.Models.TestMerge.MergedBy
+
+getset
+
+ +

The User who created the TestMerge

+ +

Definition at line 9 of file TestMerge.cs.

+
9 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge.png new file mode 100644 index 0000000000000000000000000000000000000000..af916945c16684d972d10fa7a98f943bac1f2e83 GIT binary patch literal 2402 zcmcJRc~BEs9>;@-IJ!|;1!WMJ(cl>5P-KXPh2X(pdjtzPgeY>zp@BdQkbn?eS3zJT zp;1r*A`k`L90p-Pj!l4(2;oS;I1m&>rqOZ7n)!2gyXtlSy5Db3J`{piP=&|YeQCG*s#YLzbRm?=vp3tG{ z;}8f0T1ir4=yhd;3-$yITC{Y%XmPcIKB<6%`&=m+%AASRH|W1PdXSmXi%#|qmJiqS zd;;HIiTJTh2M&aA{;fLWg=ckn;gKDPVg&G&E(&NV;R7z-4adMYrUdXtri}Z*7zmse zNjNVt<<6ith^w+wkUne(dRLsT(gzhQxrbet69N9U;u8Oed**?~hv83(?T z?MC#ah0hogP_kKLva!*W{H<4z@nFAD_(W|n)!J=BXdz0tQ||)(2FMiuHBGfKXZY26 z*$-9I+Q+Dd8p_3a{`}tO{Lm6bd%pd%WgEFkrD3XlYw@Y*$U9++ju~;?W}v=IKT&7O zxztZ?8?z35v6;o0@MvGzq4)C^Bt33gDlOb_f#J`Ouo|-2>ojI-yoy^F4 z7^vKflHVvkiVCnCNt5V=ZwhiP5&<@CcJ=w>Bw-T8PaZ4BLfDjBR_<7COD_-ZRC5-oTprg>C0< z&(vUZFO)A-%$D43sIszA1`%Q=;p}3f-e>@(azzZr&Yjk8g&yqC zqL(^2(a5UoKFq4j&=K&)weK#cyAU-GO~{J`8fV?4u%D}acZ9u zsV3RL!Mg$e4QFTt-GivvRKnMI1ugzBr{~TSSe5SQS(P_}L06D@|# z9g)+-k{YS^#wVA*kMIHwCUS$mZO}96(+RoRmDtRS?jxa$fBi@qgZ!`b_NL_{fmFNW{$Sd;f{Dz}fJeYD-)uA1Mlz)XEu2euFQs-(F|jH*{JOI*Ai^Y*R(8 zr#UQ3F>ns+cJxi9@k6JCYs|-mX5qe!mGc?M;723(I+bpFaB0H=+h3El!xA5OB6k0f zB2vG+mj2e6AKBU{=`cUBD~0Kx?jVusuS&Pk7L?ZEzb07l4fSn_3@LY(AtQ>#?I({6 zWixjBn|2=SD~Wm)b!A;X@7&nvTmUBL;t7@&W#SvWlFrWfAaBnxp9 zfz12MQIo68C!9e21(h2A_PHXRnfc0{uy#Hh)8I)(n>Sydd0tNUO93N_J7XEoqbEoF zKe%aU1P|-=t{XfPZo3-E-40~NJW)nT7eotPqE>Wmcb|yN>$5vmH2H=YsKYi_P=2`yf?y+{b$mj)!U*(H! zh-eG#)f-M}3G6fK&MH)-rh0k$1)K6P+^B* z$R(txR0t_|NK`BX?lNt=@x|C1jJ`AXLE z(E`i>wINZ=fMNe2Yy52N3W06Qh@=Lsrh2LF-)_%?3ms%#7e+r$#Ly(-w+o{FL{W*| zN1$e3mzEaR$Msb|J+?QItGrly`_`=Cz%9)(&cH@CTPrB!AL0#y9Wf~qwOZkmx3*kx zHFS#t7uzn(D!}qQUWP!Kc-hjYk<#e<^r%KnKDjCqGp}pCzv5~I?4ODP`G`f~5<%>o zANk@`SWW(5_-^a&{dRKh;~sCfi<_dx`7bmHP6EwR;hUu>%uwF(X}gxQjN(`~6y;fT z0JYiHt8Qo{Va&Pel}*TMgEY$*^*ZtE1V`qi3wk6{lN_y-Cd`}P|CD`;Z}3+q7&7Ek^updw|z_oaChW2oZBr|s?-fPRQzfFt%Gd%w@+-vIC^$(jHF literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters-members.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters-members.html new file mode 100644 index 0000000000..5cb98b6f18 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.TestMergeParameters Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters.html new file mode 100644 index 0000000000..32153a91ab --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters.html @@ -0,0 +1,206 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.TestMergeParameters Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.TestMergeParameters Class Reference
+
+
+ +

Parameters for creating a TestMerge + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.TestMergeParameters:
+
+
+ + +Tgstation.Server.Api.Models.Internal.TestMergeBase +Tgstation.Server.Api.Models.Internal.TestMerge +Tgstation.Server.Host.Components.Interop.TestMerge +Tgstation.Server.Api.Models.TestMerge +Tgstation.Server.Host.Models.TestMerge + +
+ + + + + + + + + + + +

+Properties

int? Number [get, set]
 The number of the pull request More...
 
string PullRequestRevision [get, set]
 The sha of the pull request revision to merge. If not specified, the latest commit shall be used (semi-unsafe) More...
 
string Comment [get, set]
 Optional comment about the test More...
 
+

Detailed Description

+

Parameters for creating a TestMerge

+ +

Definition at line 8 of file TestMergeParameters.cs.

+

Property Documentation

+ +

◆ Comment

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.TestMergeParameters.Comment
+
+getset
+
+
+ +

◆ Number

+ +
+
+ + + + + +
+ + + + +
int? Tgstation.Server.Api.Models.TestMergeParameters.Number
+
+getset
+
+ +

The number of the pull request

+ +

Definition at line 14 of file TestMergeParameters.cs.

+
14 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Repository.Repository.AddTestMerge(), and Tgstation.Server.Api.Models.Internal.TestMergeBase.TestMergeBase().

+ +
+
+ +

◆ PullRequestRevision

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.TestMergeParameters.PullRequestRevision
+
+getset
+
+ +

The sha of the pull request revision to merge. If not specified, the latest commit shall be used (semi-unsafe)

+ +

Definition at line 20 of file TestMergeParameters.cs.

+
20 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Repository.Repository.AddTestMerge(), Tgstation.Server.Host.Components.Instance.CompileProcess(), and Tgstation.Server.Api.Models.Internal.TestMergeBase.TestMergeBase().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters.png new file mode 100644 index 0000000000000000000000000000000000000000..2a41963de43b7db2e2651519da4c279f06015932 GIT binary patch literal 3648 zcmeH~dsI^S7RU2NWuo1h245-NNUbI*^ZktSg^HL~rY6>;l_I`1-%e8Ym<&SA(nL#> zDIb*i7Qr$TAEn7vGDR~mHB=N8!x#6^%)K+~uKDAxS?m6HS?hfH9nL<#wbyU&&)%Es zZmtesMRmn>>(+shj<)XW*2zJEb<+kpKs#g??SL;;HVRR-XWrmExP3pGG;Rfz1`Xm~a zD#^Bvm2bC(vwE)y`Z@x!ys8UVKQuN7KkL+-Ex@S+S1HN1oSSMq-oLCZXc2{ThphD* zwey{K4;?-gI<|Nwdxx**c_M#atPpr3f&32McYMt`Mn6lgZ`+42H5Q6sr8IMLNHf$Y zSr6YdD}Dt<^`~U^>VhVo2-MG#-)j_2TmVOuOuk8-)_M?k$;{oSdoJVMJ_GssslxPs zsQZhD2!~ni(6B`7gUru)^~Ov~N@GqaB%a}wK1=!CRF#-s8~&72bp`iYm_P!`^)@5mr^e8!_%_= z;c&E5n?ktdBiOh-yPOZ_Bn`)Kf+i#ShfBuI`f5)?e$lACsr6$ps2)XLjI`oZWK0jD zG=C_Qh6qFUyDwpQW8hxWh@Ict#qr&gLS~%6z%88BN^FWlW}h~c}2a`cKvdI7AOI~>~{kJR;u5ulrj+o zKgojHp>Bs{eJmZ!i7t%~$+fSca=7-?9u*Hrw<*cDo?mVQptKfwap+ zka!!V@ok49h4KNLO|1inu((u%4Vw7|jwDNj^aOjMlnw?AV&2 zM%0v$+qe@)y<3FS@W`l?hUI)5qHkd)+A4WIg}sAPcAIUW`D7NY${V^}?dj4}O;tGo zgyNt&uPkIp5)02KSj>yUCsx0nx`Ex@;>=!t+CeNYImnD&T1hn=HSZdSV1vZmH9?Ir z)eMb0Y=Um1y=p}mpP;Ez{HiVNw$hbkC5m`Nxk>OqM0-z;jBk?3BbtlX@rxGcjG0vo zKP+}MonwU2im{-{QHlb&H)SKR}(Y8wHs44M$|?FD9awt4tg{TXI2O zS?88hOO<-y^Vbm}q22A!5*(v(+iF8E83>nT!vH9-eXY>V`hcS+nyotbY6yyQkmv=c zF_g8nABgTvd|GJ05ex~~#%L4U=fPWN&FjKZYVvC`)2jYc*HQS+$Q(sX`FJt*+R{F} z63f_+I1=!MV(j2;btOMdRk?3!MMRaJB91uS659mz-Iwl*yBFP3=QUJAIlI5P9m-uu z>4H*_vz@6#a;d^!#9ZlS5Z(WLWn{#a>3;1MC& zp(I+Gb`a44jgf|p4yCY4Hhrbgp(?nJi3CFfP;d{T zSjT{Tv{D2Jki1Y+)GIgylo$XFtFcHkfTDszDL>tFp9v8FBn5yI05IDERQ?(^Gd5w? z`CTpIL~Fr1MN_S;Q|}!DH>`g|+O(_(9w|5$aYp;m4$Vv_{mDYZ%Xs&;D@mDYVQzcs zo)UUCD?9Cih>ohiL_Frbw01gTs`po3p8FlWte&u(;y~@0=6j?fM^ftrFbQTyva|;d zNZAPx(NPeRgm(udNs46wApY6_j%Ip*^tV!tm=i)cl68j~ngV7R&5?LMQ9G%ApXt_4 zHNtETvOY#U`wcG={G=Lh;h`^@RD`P$s65X15A0$t=^C!SfisuF{5CDVlW;Wis_iko zTDFp{pt_4iQ`<6lo2oHH$j_oWgqFJvl0`OThM-ayh@rP%*IJj4+LYfIXnnNEjr`lg z#*T9;r_!Q)^AP2%F-Xzv7-?@CUkmqK@X2N0rx-uTrTAk$aiJP}F&TqVyV{zP@HCgo z(MZ!*ZtS@&>}Pm&ekdE9yo(<%NHAJm0M&iztG@qx+dI+Axpfb0K&kZk71{u^$(Y(7 z(MZ+n?%MDCpuD$sZpxyfe390#rS6Za+|OR#%29T8cb3)LC^9}nVbj+Hefi>t$&UGex}c%5J0Ldi;H zvBLq!j2C7$ixEkUx}RHPAB(H`cP7F3!Km%-?~mEfZK&#Ufl!BW2}N`4>GVY! z%w!=j&<|fze{i-8A!f1Y`}k=Ha_{_pkQcV`9zV`CyIX8N!7}~4*eEq9uJ#&X#nQw&C)cO~w<`8-S(W9q& z7FLrRlEg}3LE#YGk@N%IJ@lEj=882lR7xXaNTrgNmpwMS8gVxPr~u`Ju@yf^;6#w1 zlyG4n{_V5ZEjg-X)87h!{`9W}AgCXvR)-}rpdVtd#dY8cLV5AIgF_5$gjI-=-|F68g7M^H=!b9=ZT2luiBxLAMtB;#U;jk$3|us`%0?;#D|P zsIJqt_v>RgGh3G-Nu^;bVPa#OF$J%UbIafIzqB@#2-{8K?FBkegc~3g1fcV1W&$!< z2$YQVj{sTL!^7GTy8*FIzJe$Y%()SmQ@nmRm=c&Hl2Nd1{eKbpFN?@KrHJ|!=bmrV zZ*%Ay8ch5>hsn>bqY`?`Rz`uz7S!r?uu!K9n1uHv4I0!CoCU384@XcP{PcP2NrNK( z7o~_i`tANWd&bG^inw{pnTo1(RrXC2U!>3~MvWIBtDoOIn^JVs!HBu=_dp+4FYki| z&Mq1F0H^#rXF7w4*c3)zU;Ao$g43^KFi=+(-ve%LjMb=p)Je#gZ31~^o-#P7(~v|% zBaJUGL`L2E&+__@t0mIg$~wzUNU-6v6a)tLaR9uwCK%dcQPlR~enx`05p$r! z*?JQvhO>oshUnvzmTBDEear*$_{~}(JNoBJsgr9z0gQi?GQMJ~MhGEBJDJQ`bWM;< zhi!2fws_Uxd2{8NjFN^rh7Q}+g%m2(RT9R_q*UKrZ|rz+#ELkq9}2MCqraZ-kf=uT zxKpkFGTe`AzjO#GM8&A{MrA|v=D7ZrPY^>@C&`?Sj-_PkAZB$(N@dB7wCqYRFk=G@uxr^O3CvD^dSJC!+%itC$MroRsC~{AKxtwj3@rq=$?yJ3e9XXma04|fWLd| Nkan)N<%dtF{u2^@*Kz;= literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests_1_1_test_irc_connection_string_builder-members.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests_1_1_test_irc_connection_string_builder-members.html new file mode 100644 index 0000000000..796e6781aa --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests_1_1_test_irc_connection_string_builder-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.Tests.TestIrcConnectionStringBuilder Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests_1_1_test_irc_connection_string_builder.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests_1_1_test_irc_connection_string_builder.html new file mode 100644 index 0000000000..6c6ea719dc --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests_1_1_test_irc_connection_string_builder.html @@ -0,0 +1,118 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Tests.TestIrcConnectionStringBuilder Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Tests.TestIrcConnectionStringBuilder Class Reference
+
+
+ + + + +

+Public Member Functions

void TestBasicParseAndBuild ()
 
+

Detailed Description

+
+

Definition at line 6 of file TestIrcConnectionStringBuilder.cs.

+

Member Function Documentation

+ +

◆ TestBasicParseAndBuild()

+ +
+
+ + + + + + + +
void Tgstation.Server.Api.Models.Tests.TestIrcConnectionStringBuilder.TestBasicParseAndBuild ()
+
+ +

Definition at line 9 of file TestIrcConnectionStringBuilder.cs.

+
10  {
11  const string exampleString = "server;1234;nick;1;2;asdf";
12  var builder = new IrcConnectionStringBuilder(exampleString);
13 
14  Assert.IsTrue(builder.Valid);
15  Assert.AreEqual("server", builder.Address);
16  Assert.AreEqual((ushort)1234, builder.Port);
17  Assert.AreEqual("nick", builder.Nickname);
18  Assert.IsTrue(builder.UseSsl.Value);
19  Assert.AreEqual(IrcPasswordType.NickServ, builder.PasswordType);
20  Assert.AreEqual("asdf", builder.Password);
21 
22  Assert.AreEqual(exampleString, builder.ToString());
23  }
IrcPasswordType
Represents the type of a password for a ChatProvider.Irc
+
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_token-members.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_token-members.html new file mode 100644 index 0000000000..7cf9501893 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_token-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.Token Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Api.Models.Token, including all inherited members.

+ + + +
BearerTgstation.Server.Api.Models.Token
ExpiresAtTgstation.Server.Api.Models.Token
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_token.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_token.html new file mode 100644 index 0000000000..83d270ca33 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_token.html @@ -0,0 +1,162 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Token Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Token Class Reference
+
+
+ +

Represents a JWT returned by the API + More...

+ + + + + + + + +

+Properties

string Bearer [get, set]
 The value of the JWT More...
 
DateTimeOffset? ExpiresAt [get, set]
 When the Token expires More...
 
+

Detailed Description

+

Represents a JWT returned by the API

+ +

Definition at line 8 of file Token.cs.

+

Property Documentation

+ +

◆ Bearer

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.Token.Bearer
+
+getset
+
+
+ +

◆ ExpiresAt

+ +
+
+ + + + + +
+ + + + +
DateTimeOffset? Tgstation.Server.Api.Models.Token.ExpiresAt
+
+getset
+
+ +

When the Token expires

+ +

Definition at line 18 of file Token.cs.

+
18 { get; set; }
+

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

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Api/Models/Token.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user-members.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user-members.html new file mode 100644 index 0000000000..5d082a7ff6 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user-members.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.User Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user.html new file mode 100644 index 0000000000..9801e30568 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user.html @@ -0,0 +1,211 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.User Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.User Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.User:
+
+
+ + +Tgstation.Server.Api.Models.Internal.User +Tgstation.Server.Api.Models.UserUpdate + +
+ + + + + + + + +

+Public Attributes

const string AdminName = "Admin"
 The name of the default admin user More...
 
const string DefaultAdminPassword = "ISolemlySwearToDeleteTheDataDirectory"
 The default admin password More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

User CreatedBy [get, set]
 The User who created this User More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.User
long Id [get, set]
 The ID of the User More...
 
bool? Enabled [get, set]
 If the User is enabled since users cannot be deleted. System users cannot be disabled More...
 
DateTimeOffset? CreatedAt [get, set]
 When the User was created More...
 
string SystemIdentifier [get, set]
 The SID/UID of the User on Windows/POSIX respectively More...
 
string Name [get, set]
 The name of the User More...
 
AdministrationRightsAdministrationRights [get, set]
 The Rights.AdministrationRights for the User More...
 
InstanceManagerRightsInstanceManagerRights [get, set]
 The Rights.InstanceManagerRights for the User More...
 
+

Detailed Description

+
+

Definition at line 4 of file User.cs.

+

Member Data Documentation

+ +

◆ AdminName

+ +
+
+ + + + +
const string Tgstation.Server.Api.Models.User.AdminName = "Admin"
+
+ +

The name of the default admin user

+ +

Definition at line 9 of file User.cs.

+ +

Referenced by Tgstation.Server.Tests.IntegrationTest.TestStandardOperation(), and Tgstation.Server.Tests.IntegrationTest.TestUpdate().

+ +
+
+ +

◆ DefaultAdminPassword

+ +
+
+ + + + +
const string Tgstation.Server.Api.Models.User.DefaultAdminPassword = "ISolemlySwearToDeleteTheDataDirectory"
+
+ +

The default admin password

+ +

Definition at line 14 of file User.cs.

+ +

Referenced by Tgstation.Server.Tests.IntegrationTest.TestStandardOperation(), and Tgstation.Server.Tests.IntegrationTest.TestUpdate().

+ +
+
+

Property Documentation

+ +

◆ CreatedBy

+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Api.Models.User.CreatedBy
+
+getset
+
+ +

The User who created this User

+ +

Definition at line 19 of file User.cs.

+
19 { get; set; }
+
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Api/Models/User.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user.png new file mode 100644 index 0000000000000000000000000000000000000000..ca3884b57e4ed456fb0d4c92f9c1f4abf2364531 GIT binary patch literal 1371 zcmai!YgE#A9LCX>b~It9R4gZE7tNN4R(A24MhXNP*~QRkWfv(?5j924a_VYc7;a|j zwDMkFI+ZY;n$welXr>irASRMR^7n735ME-mwq9&6_C4o&`JMB;dOqj*T?-)ini#D$ zf<)B>K)!m1*|#_Fk{<9YP&c+^B^qv74QjcZUO3w(%=P&;_oj;O?6s#Z zI-;JEDYZMwt5`n=9Mv*)LWB818be1cBivy~Sj zn5(`$G$S65zja}Pr8vAlPuQL|w_u=gPwOi2wdKbmI5G4_jvMT;P~h2fWc5xdmm_B+ zq$ie)rrtaggzc+jcZn*G4=(h!x+Mp$2Skeem*8iWQln>6)|{LM!ln^~2I* z;c|`M<18O_VLTbAMHP9Lgp&cMl5I*p1KnPB+W=Rd)-^at(qinu{k*h0QqvOZ%pE^b;=tOorh z+ORDhrtCE1NwtX*m{D^>hn|kHvytk&iP31`e8vz(k{)a%oK5O8(Rg$iZsXIKV7iUI zS0$VWKd^cH&NJlcH>-B8X|PXv-8o*R3U>;rIT%_f*`@DQKgc7MnL8p=9lG>ahFZHf zPFngXsl8+4bf_L-7ST8w#9t~(6qX$+bj`HdQy@!OY=d%rr4K3KddO@-?&5>jKIhm^ zA~;bmnpMYOWgIwA!o%NSm^tHtl5_Z(y~E7@LiVlTwAYy=CP)_yTLPD#Y_ zHmB6f4Vc6*UIeE`7RCeLVESiRePSpR|33`=14(r|JtaPiG})-0>&t?GVGyd#okf#|es-u>R`)y&7Gm!fmke#C$^K~!V70JM~_#7#hC&>178d(Q*DZd#_c`tE(Mcl$Nc#u;pn#;0@=Zr^1?}z#m z6LWQeYM>EX9U|}bT6IFL@N}=_lZMg_%Af|rj8apQs@06lBp+eOde|QTm+S(LnubAC zq + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Models.UserUpdate Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user_update.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user_update.html new file mode 100644 index 0000000000..6b8e96ae9e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user_update.html @@ -0,0 +1,175 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.UserUpdate Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.UserUpdate Class Reference
+
+
+ +

For editing a given User. Will never be returned by the API + More...

+
+Inheritance diagram for Tgstation.Server.Api.Models.UserUpdate:
+
+
+ + +Tgstation.Server.Api.Models.User +Tgstation.Server.Api.Models.Internal.User + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

string Password [get, set]
 Cleartext password of the User More...
 
- Properties inherited from Tgstation.Server.Api.Models.User
User CreatedBy [get, set]
 The User who created this User More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.User
long Id [get, set]
 The ID of the User More...
 
bool? Enabled [get, set]
 If the User is enabled since users cannot be deleted. System users cannot be disabled More...
 
DateTimeOffset? CreatedAt [get, set]
 When the User was created More...
 
string SystemIdentifier [get, set]
 The SID/UID of the User on Windows/POSIX respectively More...
 
string Name [get, set]
 The name of the User More...
 
AdministrationRightsAdministrationRights [get, set]
 The Rights.AdministrationRights for the User More...
 
InstanceManagerRightsInstanceManagerRights [get, set]
 The Rights.InstanceManagerRights for the User More...
 
+ + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from Tgstation.Server.Api.Models.User
const string AdminName = "Admin"
 The name of the default admin user More...
 
const string DefaultAdminPassword = "ISolemlySwearToDeleteTheDataDirectory"
 The default admin password More...
 
+

Detailed Description

+

For editing a given User. Will never be returned by the API

+ +

Definition at line 6 of file UserUpdate.cs.

+

Property Documentation

+ +

◆ Password

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Api.Models.UserUpdate.Password
+
+getset
+
+ +

Cleartext password of the User

+ +

Definition at line 11 of file UserUpdate.cs.

+
11 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user_update.png b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user_update.png new file mode 100644 index 0000000000000000000000000000000000000000..c04566386fa4789694c46c7ee97b3a7def380fe4 GIT binary patch literal 1367 zcmcJPi&N5B6vuJ3Y<<*DR_^M8kHnQqODkO~MN3jvK}5GUElhiju|f)Ffaa#tOV>au zFnlzdk6Jg&tVDc}JuFBqkf03sX+;nrng|kBve>jcvwy(enRCDA&YUx6=6vRRPh!xq zu1+3KAP~qE85e`Ksl^s2=Goish2!1#ZSpN9Aq8QzT5ai@QBxlM4#Spxj-H;LIVTlf zw&y%D7M%>T70n*$!;}yZ$U%*aiB36Wr>}X@TIcPunSOqCp*0rRf>?M$HkNHZ7)t(F zUFst|@{Kj*@nki&pLqsTvYnZm#fZlSEjDC*LWXQD?6Ts4v+hbi|9+`K2!$ z%u)sErbVJr3UP9Sh(|(BaeVu-UvNwxTn#iQI-H)s(kqC%H@R0SV~4rTMU~C|1VIH+ z5>GwW)&K5xf9r|{P4e>Kz7$=DVze{jJgXol0Hq$Rr+#P8ZasFB z`(J?(@DXk>`PMnJ6z6=`GC4FQ1=OUN!>RgDNx2$6#Kfn>LMc%|g0s16sK5Pr$s+4i z^#c__JpHx_b|W_I()el8;VpXhBg;{MpD%78h3aKz*;&=HWN_=n0pnDtRRRF{LmoZU z1L^FSEhuqC`iCt)4L&wzn3-fmAVuEoryZEa8nA9mqfg;-o?nB=n_a)%L&ZE3pKqYl zYJUIf{aPgmyDZS6XDyBhw179js5paIZr7T{uvZOwI|>@2=QH9|* zG=iYd#jAfs9~$RUHIMm3>uV{7{R>QZ39XfchSF{l%e0w@itN%H2jttlny$@F6VLaw zy#5jCwA(9!r}Ol&;nJ(g^P$?PtFy2abRiejbaUIzQ4tVhZvb~j153SrrnyHmsoill zP^f)vy+m&CegNo$QC2r=4`gGIrKU$D$mvdm4u8#G0ao()>FYI2^5t7^^t6)njvNU= znXxKcMs3Wct*VSCUezoS(2jPX?hvM2`${bQ>yfBOxwL>?Kv|i><@iK#m}6vd z1Re0YMPoTd)wSGfJBpW$hY7fe%B83GtT)Tobtv$)ZF@@}NbkAw4#h^DZ+UTUb6u`(@P@I zJ^&-^V?#I6wxSycQWNt8wJ3>PZcLUl4>upkuCV+*$lLg-*fO literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper-members.html b/class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper-members.html new file mode 100644 index 0000000000..73841d8096 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper-members.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Rights.RightsHelper Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Api.Rights.RightsHelper, including all inherited members.

+ + + + + + +
IsInstanceRight(RightsType rightsType)Tgstation.Server.Api.Rights.RightsHelperstatic
RightToType(RightsType rightsType)Tgstation.Server.Api.Rights.RightsHelperstatic
RoleName(RightsType rightsType, Enum right)Tgstation.Server.Api.Rights.RightsHelperstatic
RoleNames< TRight >(TRight right)Tgstation.Server.Api.Rights.RightsHelperstatic
TypeMapTgstation.Server.Api.Rights.RightsHelperprivatestatic
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper.html b/class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper.html new file mode 100644 index 0000000000..91ac219895 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper.html @@ -0,0 +1,326 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Rights.RightsHelper Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Rights.RightsHelper Class Reference
+
+
+ +

Helper for RightsTypes + More...

+ + + + + + + + + + + + + + +

+Static Public Member Functions

static Type RightToType (RightsType rightsType)
 Map a given rightsType to its respective Enum Type More...
 
static string RoleNames< TRight > (TRight right)
 Gets the role claim name used for a given right More...
 
static string RoleName (RightsType rightsType, Enum right)
 Gets the role claim name used for a given rightsType and right More...
 
static bool IsInstanceRight (RightsType rightsType)
 Check if a given rightsType is meant for an Models.Instance More...
 
+ + + + +

+Static Private Attributes

static readonly IReadOnlyDictionary< RightsType, Type > TypeMap
 Map of RightsTypes to their respective flag Enums More...
 
+

Detailed Description

+

Helper for RightsTypes

+ +

Definition at line 10 of file RightsHelper.cs.

+

Member Function Documentation

+ +

◆ IsInstanceRight()

+ +
+
+ + + + + +
+ + + + + + + + +
static bool Tgstation.Server.Api.Rights.RightsHelper.IsInstanceRight (RightsType rightsType)
+
+static
+
+ +

Check if a given rightsType is meant for an Models.Instance

+
Parameters
+ + +
rightsTypeThe RightsType to check
+
+
+
Returns
true if rightsType is an instance right, false otherwise
+ +

Referenced by Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), and Tgstation.Server.Host.Security.ClaimsInjector.InjectClaimsIntoContext().

+ +
+
+ +

◆ RightToType()

+ +
+
+ + + + + +
+ + + + + + + + +
static Type Tgstation.Server.Api.Rights.RightsHelper.RightToType (RightsType rightsType)
+
+static
+
+ +

Map a given rightsType to its respective Enum Type

+
Parameters
+ + +
rightsTypeThe RightsType to lookup
+
+
+
Returns
The Enum Type of the given rightsType
+ +

Referenced by Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Host.Security.ClaimsInjector.InjectClaimsIntoContext(), and Tgstation.Server.Api.Rights.Tests.TestRights.TestAllPowerOfTwo().

+ +
+
+ +

◆ RoleName()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static string Tgstation.Server.Api.Rights.RightsHelper.RoleName (RightsType rightsType,
Enum right 
)
+
+static
+
+ +

Gets the role claim name used for a given rightsType and right

+
Parameters
+ + + +
rightsTypeThe RightsType
rightThe right value
+
+
+
Returns
A string representing the claim role name
+ +

Definition at line 61 of file RightsHelper.cs.

+
62  {
63  var enumType = TypeMap[rightsType];
64  return String.Concat(enumType.Name, '.', Enum.GetName(enumType, right));
65  }
static readonly IReadOnlyDictionary< RightsType, Type > TypeMap
Map of RightsTypes to their respective flag Enums
Definition: RightsHelper.cs:15
+
+

References Tgstation.Server.Api.Rights.RightsHelper.TypeMap.

+ +

Referenced by Tgstation.Server.Host.Security.ClaimsInjector.InjectClaimsIntoContext().

+ +
+
+ +

◆ RoleNames< TRight >()

+ +
+
+ + + + + +
+ + + + + + + + +
static string Tgstation.Server.Api.Rights.RightsHelper.RoleNames< TRight > (TRight right)
+
+static
+
+ +

Gets the role claim name used for a given right

+
Template Parameters
+ + +
TRightThe RightsType
+
+
+
Parameters
+ + +
rightThe TRight
+
+
+
Returns
A string representing the claim role name
+
+
Type Constraints
+ + +
TRight :Enum 
+
+
+
+ +

Definition at line 41 of file RightsHelper.cs.

+
41  : Enum
42  {
43  var flags = new List<string>();
44  IEnumerable<string> GetRoleNames()
45  {
46  foreach (Enum J in Enum.GetValues(right.GetType()))
47  if (Convert.ToInt32(J, CultureInfo.InvariantCulture) != 0 && right.HasFlag(J))
48  yield return String.Concat(typeof(TRight).Name, '.', J.ToString());
49  }
50 
51  var names = GetRoleNames();
52  return String.Join(",", names);
53  }
+
+
+

Member Data Documentation

+ +

◆ TypeMap

+ +
+
+ + + + + +
+ + + + +
readonly IReadOnlyDictionary<RightsType, Type> Tgstation.Server.Api.Rights.RightsHelper.TypeMap
+
+staticprivate
+
+Initial value:
= new Dictionary<RightsType, Type>
{
{ RightsType.Administration, typeof(AdministrationRights) },
{ RightsType.InstanceManager, typeof(InstanceManagerRights) },
{ RightsType.Repository, typeof(RepositoryRights) },
{ RightsType.Byond, typeof(ByondRights) },
{ RightsType.DreamMaker, typeof(DreamMakerRights) },
{ RightsType.DreamDaemon, typeof(DreamDaemonRights) },
{ RightsType.ChatBots, typeof(ChatBotRights) },
{ RightsType.Configuration, typeof(ConfigurationRights) },
{ RightsType.InstanceUser, typeof(InstanceUserRights) }
}
+

Map of RightsTypes to their respective flag Enums

+ +

Definition at line 15 of file RightsHelper.cs.

+ +

Referenced by Tgstation.Server.Api.Rights.RightsHelper.RoleName().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests_1_1_test_rights-members.html b/class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests_1_1_test_rights-members.html new file mode 100644 index 0000000000..cb2d762c35 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests_1_1_test_rights-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Rights.Tests.TestRights Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Api.Rights.Tests.TestRights, including all inherited members.

+ + +
TestAllPowerOfTwo()Tgstation.Server.Api.Rights.Tests.TestRights
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests_1_1_test_rights.html b/class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests_1_1_test_rights.html new file mode 100644 index 0000000000..8dfd889aab --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests_1_1_test_rights.html @@ -0,0 +1,124 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Rights.Tests.TestRights Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Rights.Tests.TestRights Class Reference
+
+
+ +

Tests for Rights + More...

+ + + + +

+Public Member Functions

void TestAllPowerOfTwo ()
 
+

Detailed Description

+

Tests for Rights

+ +

Definition at line 11 of file TestRights.cs.

+

Member Function Documentation

+ +

◆ TestAllPowerOfTwo()

+ +
+
+ + + + + + + +
void Tgstation.Server.Api.Rights.Tests.TestRights.TestAllPowerOfTwo ()
+
+ +

Definition at line 14 of file TestRights.cs.

+
15  {
16  var ulongType = typeof(ulong);
17  foreach (var I in Enum.GetValues(typeof(RightsType)).Cast<RightsType>())
18  {
19  var expectedLog = -1;
20  var rightType = RightsHelper.RightToType(I);
21  foreach (var J in Enum.GetValues(rightType))
22  {
23  Assert.AreEqual(ulongType, Enum.GetUnderlyingType(rightType));
24  var asUlong = (ulong)J;
25  var isOne = asUlong == 1;
26  if(!isOne)
27  Assert.AreEqual(0U, asUlong % 2, String.Format("Enum {0} of {1} is not a power of 2!", Enum.GetName(rightType, asUlong), rightType));
28 
29  if (expectedLog > -1)
30  {
31  var log = Math.Log(asUlong, 2);
32  if (log != expectedLog)
33  Assert.Fail(String.Format("Expected Log2({1}) == {0} to come next for {2}, got {3} instead!", expectedLog, Enum.GetName(rightType, asUlong), rightType, log));
34  }
35  ++expectedLog;
36  }
37  }
38  }
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
+

References Tgstation.Server.Api.Rights.RightsHelper.RightToType().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_routes-members.html b/class_tgstation_1_1_server_1_1_api_1_1_routes-members.html new file mode 100644 index 0000000000..b4879c5d04 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_routes-members.html @@ -0,0 +1,101 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Routes Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_routes.html b/class_tgstation_1_1_server_1_1_api_1_1_routes.html new file mode 100644 index 0000000000..d6ab7fe756 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_routes.html @@ -0,0 +1,494 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Routes Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Routes Class Reference
+
+
+ +

Routes to a server actions + More...

+ + + + + + + + +

+Static Public Member Functions

static string SetID (string route, long id)
 Apply an id postfix to a route More...
 
static string List (string route)
 Get the /List postfix for a route More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

const string Root = "/"
 The root controller More...
 
const string Administration = Root + nameof(Models.Administration)
 The Models.Administration controller More...
 
const string User = Root + nameof(Models.User)
 The Models.User controller More...
 
const string InstanceManager = Root + nameof(Models.Instance)
 The Models.Instance controller More...
 
const string Byond = Root + nameof(Models.Byond)
 The Models.Byond controller More...
 
const string Repository = Root + nameof(Models.Repository)
 The Models.Repository controller More...
 
const string DreamDaemon = Root + nameof(Models.DreamDaemon)
 The Models.DreamDaemon controller More...
 
const string Configuration = Root + "Config"
 The Models.ConfigurationFile controller More...
 
const string File = "File"
 To be paired with Configuration for accessing Models.ConfigurationFiles More...
 
const string ConfigurationFile = Configuration + "/" + File
 Full combination of Configuration and File More...
 
const string InstanceUser = Root + nameof(Models.InstanceUser)
 The Models.InstanceUser controller More...
 
const string Chat = Root + "Chat"
 The Models.ChatBot controller More...
 
const string DreamMaker = Root + nameof(Models.DreamMaker)
 The Models.DreamMaker controller More...
 
const string Jobs = Root + nameof(Models.Job)
 The Models.Job controller More...
 
+

Detailed Description

+

Routes to a server actions

+ +

Definition at line 9 of file Routes.cs.

+

Member Function Documentation

+ +

◆ List()

+ +
+
+ + + + + +
+ + + + + + + + +
static string Tgstation.Server.Api.Routes.List (string route)
+
+static
+
+ +

Get the /List postfix for a route

+
Parameters
+ + +
routeThe route
+
+
+
Returns
The route with /List appended
+ +
+
+ +

◆ SetID()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static string Tgstation.Server.Api.Routes.SetID (string route,
long id 
)
+
+static
+
+ +

Apply an id postfix to a route

+
Parameters
+ + + +
routeThe route
idThe ID
+
+
+
Returns
The route with id appended
+ +
+
+

Member Data Documentation

+ +

◆ Administration

+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.Administration = Root + nameof(Models.Administration)
+
+ +

The Models.Administration controller

+ +

Definition at line 19 of file Routes.cs.

+ +
+
+ +

◆ Byond

+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.Byond = Root + nameof(Models.Byond)
+
+
+ +

◆ Chat

+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.Chat = Root + "Chat"
+
+ +

The Models.ChatBot controller

+ +

Definition at line 69 of file Routes.cs.

+ +
+
+ +

◆ Configuration

+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.Configuration = Root + "Config"
+
+ +

The Models.ConfigurationFile controller

+ +

Definition at line 49 of file Routes.cs.

+ +
+
+ +

◆ ConfigurationFile

+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.ConfigurationFile = Configuration + "/" + File
+
+ +

Full combination of Configuration and File

+ +

Definition at line 59 of file Routes.cs.

+ +

Referenced by Tgstation.Server.Client.Components.ConfigurationClient.Read().

+ +
+
+ +

◆ DreamDaemon

+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.DreamDaemon = Root + nameof(Models.DreamDaemon)
+
+ +

The Models.DreamDaemon controller

+ +

Definition at line 44 of file Routes.cs.

+ +

Referenced by Tgstation.Server.Client.Components.Tests.TestDreamDaemonClient.TestStart().

+ +
+
+ +

◆ DreamMaker

+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.DreamMaker = Root + nameof(Models.DreamMaker)
+
+ +

The Models.DreamMaker controller

+ +

Definition at line 74 of file Routes.cs.

+ +
+
+ +

◆ File

+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.File = "File"
+
+ +

To be paired with Configuration for accessing Models.ConfigurationFiles

+ +

Definition at line 54 of file Routes.cs.

+ +
+
+ +

◆ InstanceManager

+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.InstanceManager = Root + nameof(Models.Instance)
+
+ +

The Models.Instance controller

+ +

Definition at line 29 of file Routes.cs.

+ +
+
+ +

◆ InstanceUser

+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.InstanceUser = Root + nameof(Models.InstanceUser)
+
+ +

The Models.InstanceUser controller

+ +

Definition at line 64 of file Routes.cs.

+ +
+
+ +

◆ Jobs

+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.Jobs = Root + nameof(Models.Job)
+
+ +

The Models.Job controller

+ +

Definition at line 79 of file Routes.cs.

+ +
+
+ +

◆ Repository

+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.Repository = Root + nameof(Models.Repository)
+
+ +

The Models.Repository controller

+ +

Definition at line 39 of file Routes.cs.

+ +
+
+ +

◆ Root

+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.Root = "/"
+
+ +

The root controller

+ +

Definition at line 14 of file Routes.cs.

+ +

Referenced by Tgstation.Server.Client.ServerClientFactory.CreateServerClient().

+ +
+
+ +

◆ User

+ +
+
+ + + + +
const string Tgstation.Server.Api.Routes.User = Root + nameof(Models.User)
+
+ +

The Models.User controller

+ +

Definition at line 24 of file Routes.cs.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_tests_1_1_test_api_headers-members.html b/class_tgstation_1_1_server_1_1_api_1_1_tests_1_1_test_api_headers-members.html new file mode 100644 index 0000000000..741d541037 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_tests_1_1_test_api_headers-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Tests.TestApiHeaders Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_api_1_1_tests_1_1_test_api_headers.html b/class_tgstation_1_1_server_1_1_api_1_1_tests_1_1_test_api_headers.html new file mode 100644 index 0000000000..a7bed92d3b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_api_1_1_tests_1_1_test_api_headers.html @@ -0,0 +1,180 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Tests.TestApiHeaders Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Tests.TestApiHeaders Class Reference
+
+
+ +

Tests for ApiHeaders + More...

+ + + + + + +

+Public Member Functions

void TestConstruction ()
 
void TestUserAgentsAreValid ()
 
+ + + +

+Private Attributes

readonly ProductHeaderValue productHeaderValue = new ProductHeaderValue("Tgstation.Server.Api.Tests", "1.0.0")
 
+

Detailed Description

+

Tests for ApiHeaders

+ +

Definition at line 13 of file TestApiHeaders.cs.

+

Member Function Documentation

+ +

◆ TestConstruction()

+ +
+
+ + + + + + + +
void Tgstation.Server.Api.Tests.TestApiHeaders.TestConstruction ()
+
+ +

Definition at line 18 of file TestApiHeaders.cs.

+
19  {
20  Assert.ThrowsException<ArgumentNullException>(() => new ApiHeaders(null, null));
21  Assert.ThrowsException<ArgumentNullException>(() => new ApiHeaders(productHeaderValue, null));
22  var headers = new ApiHeaders(productHeaderValue, String.Empty);
23  }
readonly ProductHeaderValue productHeaderValue
+
+

References Tgstation.Server.Api.Tests.TestApiHeaders.productHeaderValue.

+ +
+
+ +

◆ TestUserAgentsAreValid()

+ +
+
+ + + + + + + +
void Tgstation.Server.Api.Tests.TestApiHeaders.TestUserAgentsAreValid ()
+
+ +

Definition at line 26 of file TestApiHeaders.cs.

+
27  {
28  const string BrowserHeader = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36.";
29  const string ConformantHeader = "TGSClient/3.2.1.4";
30 
31  ApiHeaders TestHeader(string userAgent)
32  {
33  var headers = new HeaderDictionary
34  {
35  { "Accept", ApiHeaders.ApplicationJson },
36  { "Api", "Tgstation.Server.Api/4.0.0.0" },
37  { "Authorization", "Bearer asdfasdf" },
38  { "User-Agent", userAgent }
39  };
40 
41  return new ApiHeaders(new RequestHeaders(headers));
42  };
43 
44  var header = TestHeader(BrowserHeader);
45  Assert.AreEqual(BrowserHeader, header.RawUserAgent);
46  Assert.IsNull(header.UserAgent);
47 
48  header = TestHeader(ConformantHeader);
49  Assert.AreEqual(ConformantHeader, header.RawUserAgent);
50  Assert.IsNotNull(header.UserAgent);
51 
52  Assert.ThrowsException<InvalidOperationException>(() => TestHeader(String.Empty));
53  }
+

References Tgstation.Server.Api.ApiHeaders.ApplicationJson.

+ +
+
+

Member Data Documentation

+ +

◆ productHeaderValue

+ +
+
+ + + + + +
+ + + + +
readonly ProductHeaderValue Tgstation.Server.Api.Tests.TestApiHeaders.productHeaderValue = new ProductHeaderValue("Tgstation.Server.Api.Tests", "1.0.0")
+
+private
+
+ +

Definition at line 15 of file TestApiHeaders.cs.

+ +

Referenced by Tgstation.Server.Api.Tests.TestApiHeaders.TestConstruction().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_administration_client-members.html b/class_tgstation_1_1_server_1_1_client_1_1_administration_client-members.html new file mode 100644 index 0000000000..a58a02673d --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_administration_client-members.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.AdministrationClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.AdministrationClient, including all inherited members.

+ + + + + + +
AdministrationClient(IApiClient apiClient)Tgstation.Server.Client.AdministrationClient
apiClientTgstation.Server.Client.AdministrationClientprivate
Read(CancellationToken cancellationToken)Tgstation.Server.Client.AdministrationClient
Restart(CancellationToken cancellationToken)Tgstation.Server.Client.AdministrationClient
Update(Administration administration, CancellationToken cancellationToken)Tgstation.Server.Client.AdministrationClient
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_administration_client.html b/class_tgstation_1_1_server_1_1_client_1_1_administration_client.html new file mode 100644 index 0000000000..3fde9dea3d --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_administration_client.html @@ -0,0 +1,264 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.AdministrationClient Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.AdministrationClient Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Client.AdministrationClient:
+
+
+ + +Tgstation.Server.Client.IAdministrationClient + +
+ + + + + + + + + + + + + + +

+Public Member Functions

 AdministrationClient (IApiClient apiClient)
 Construct an AdministrationClient More...
 
Task< AdministrationRead (CancellationToken cancellationToken)
 Get the Administration represented by the IAdministrationClient More...
 
Task Update (Administration administration, CancellationToken cancellationToken)
 Updates the Administration setttings More...
 
Task Restart (CancellationToken cancellationToken)
 Restarts the TGS server More...
 
+ + + + +

+Private Attributes

readonly IApiClient apiClient
 The apiClient for the AdministrationClient More...
 
+

Detailed Description

+
+

Definition at line 10 of file AdministrationClient.cs.

+

Constructor & Destructor Documentation

+ +

◆ AdministrationClient()

+ +
+
+ + + + + + + + +
Tgstation.Server.Client.AdministrationClient.AdministrationClient (IApiClient apiClient)
+
+ +

Construct an AdministrationClient

+
Parameters
+ + +
apiClientThe value of apiClient
+
+
+ +

Definition at line 21 of file AdministrationClient.cs.

+
22  {
23  this.apiClient = apiClient;
24  }
readonly IApiClient apiClient
The apiClient for the AdministrationClient
+
+

References Tgstation.Server.Client.AdministrationClient.apiClient.

+ +
+
+

Member Function Documentation

+ +

◆ Read()

+ +
+
+ + + + + + + + +
Task<Administration> Tgstation.Server.Client.AdministrationClient.Read (CancellationToken cancellationToken)
+
+ +

Get the Administration represented by the IAdministrationClient

+ +

Implements Tgstation.Server.Client.IAdministrationClient.

+ +
+
+ +

◆ Restart()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Client.AdministrationClient.Restart (CancellationToken cancellationToken)
+
+ +

Restarts the TGS server

+ +

Implements Tgstation.Server.Client.IAdministrationClient.

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.AdministrationClient.Update (Administration administration,
CancellationToken cancellationToken 
)
+
+ +

Updates the Administration setttings

+ +

Implements Tgstation.Server.Client.IAdministrationClient.

+ +
+
+

Member Data Documentation

+ +

◆ apiClient

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.AdministrationClient.apiClient
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_administration_client.png b/class_tgstation_1_1_server_1_1_client_1_1_administration_client.png new file mode 100644 index 0000000000000000000000000000000000000000..66414e1b3da9c5e6580273447e17cc759aef71df GIT binary patch literal 927 zcmeAS@N?(olHy`uVBq!ia0y~yU}Ofe12{mWR?-6zASDst6XN>+|9>F!#hb6C{f8z1 zSzvtNzya3IJMus-M@f)hFauB#2wXiCV#L6}tmo>S z$hAXCC*RF$pV{@IX^XO=0((n*q0I4(J0B^WTx%++(ws7Z$A)?5KM$>!@%R1n*5|c2 zt5{x3vi=k*wys|7jm69zw!WY2R=sMjsGH-np@L)Kt-dp+%rpOaOmbVM`aAN|;+ zxZx^!#pU(QX|uX+=+>BBo4zTqO7&Jk%bBDjGao;F*5G*m?aWGrU$Zz)HojWV&9*GK zbxE+|))mVi)IF@&X_>fS_PGoFJX|--Dzl7dFJ)|gcEdQ}c}vNn)AxmEs{d4Z)pPKZ zUW;N{eTF>eukHL=kA9yEsW_{!<<@6Aj=*|T{$o5m`zpk@ynUoMgNfs1i<5FW&pemd zz2dh%tVv$!8(N!w>dSh4#Alm|c$G@=t40y~(>*_VUp4;l zxld((th4+SKDCpvB_-k>Me4q6Clw@Bn2$cN=u6ILZKz+Z&u}AVGGpBOmI*v|9NXF_ z@D!=3fx>$dBZDePDVXhO#IQgG&h}tqm;w{`VEZr0EI9G3C=)|;wvh+ObQZQ!7p51N z_V1g2Y{Mf(28ryAvOkR`9=cp$`pnAXiKoY1_KQce{MXvI1mwCuTilX&$M5x5amCZY zm9cdn=JMP=zO^backBDUbxZpr8P`v*Vcfg^p3m7|H5&3yeRNlPy}L6b?Z@T`Y_k}m z6kaUi$y)a{=d>T|TQNJu*WSigt<(1%bzxA~yL09B-L#Yoyj9=iI_%UK*jDY=lem%A zYj^Bw$G-5m_h!d=O772Oa$#%DmA1ROGE&MQqmP%l)Pq5N*B{&N%C>%|bCNpmn=&T` zxSI-n$(I*7`h9LEPowx{md(>5zdLgLyj^LKmhj=|?ghE&H>G|tSu`FvA=|93n17Eu zx9-}>D{QOx8K?fbKE2`FmFXdue<{j758>2p5Uv(q^;hZe?g@3rY+aauyxl&A=d?2?<0EHYKI%*Yf5ireCZQl)HeriNVv=&t;ucLK6UeFrnE1 literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_client_1_1_api_client-members.html b/class_tgstation_1_1_server_1_1_client_1_1_api_client-members.html new file mode 100644 index 0000000000..6ce8bcdd57 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_api_client-members.html @@ -0,0 +1,112 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.ApiClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.ApiClient, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddRequestLogger(IRequestLogger requestLogger)Tgstation.Server.Client.ApiClient
ApiClient(IHttpClient httpClient, Uri url, ApiHeaders apiHeaders)Tgstation.Server.Client.ApiClient
Create< TBody, TResult >(string route, TBody body, CancellationToken cancellationToken)Tgstation.Server.Client.ApiClient
Create< TBody, TResult >(string route, TBody body, long instanceId, CancellationToken cancellationToken)Tgstation.Server.Client.ApiClient
Create< TResult >(string route, CancellationToken cancellationToken)Tgstation.Server.Client.ApiClient
Create< TResult >(string route, long instanceId, CancellationToken cancellationToken)Tgstation.Server.Client.ApiClient
Delete(string route, CancellationToken cancellationToken)Tgstation.Server.Client.ApiClient
Delete(string route, long instanceId, CancellationToken cancellationToken)Tgstation.Server.Client.ApiClient
Delete< TBody >(string route, TBody body, long instanceId, CancellationToken cancellationToken)Tgstation.Server.Client.ApiClient
Delete< TResult >(string route, long instanceId, CancellationToken cancellationToken)Tgstation.Server.Client.ApiClient
Dispose()Tgstation.Server.Client.ApiClient
GetSerializerSettings()Tgstation.Server.Client.ApiClientprivatestatic
HandleBadResponse(HttpResponseMessage response, string json)Tgstation.Server.Client.ApiClientprivatestatic
HeadersTgstation.Server.Client.ApiClient
headersTgstation.Server.Client.ApiClientprivate
httpClientTgstation.Server.Client.ApiClientprivate
Patch< TResult >(string route, long instanceId, CancellationToken cancellationToken)Tgstation.Server.Client.ApiClient
Read< TResult >(string route, CancellationToken cancellationToken)Tgstation.Server.Client.ApiClient
Read< TResult >(string route, long instanceId, CancellationToken cancellationToken)Tgstation.Server.Client.ApiClient
requestLoggersTgstation.Server.Client.ApiClientprivate
RunRequest< TResult >(string route, object body, HttpMethod method, long? instanceId, CancellationToken cancellationToken)Tgstation.Server.Client.ApiClientprivate
TimeoutTgstation.Server.Client.ApiClient
Update< TBody >(string route, TBody body, CancellationToken cancellationToken)Tgstation.Server.Client.ApiClient
Update< TBody, TResult >(string route, TBody body, CancellationToken cancellationToken)Tgstation.Server.Client.ApiClient
Update< TBody, TResult >(string route, TBody body, long instanceId, CancellationToken cancellationToken)Tgstation.Server.Client.ApiClient
Update< TResult >(string route, CancellationToken cancellationToken)Tgstation.Server.Client.ApiClient
UrlTgstation.Server.Client.ApiClient
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_api_client.html b/class_tgstation_1_1_server_1_1_client_1_1_api_client.html new file mode 100644 index 0000000000..3f7fb0852a --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_api_client.html @@ -0,0 +1,1195 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.ApiClient Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+ +
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Client.ApiClient:
+
+
+ + +Tgstation.Server.Client.IApiClient +IDisposable + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ApiClient (IHttpClient httpClient, Uri url, ApiHeaders apiHeaders)
 Construct an ApiClient More...
 
void Dispose ()
 
Task< TResult > Create< TResult > (string route, CancellationToken cancellationToken)
 Run an HTTP PUT request More...
 
Task< TResult > Read< TResult > (string route, CancellationToken cancellationToken)
 Run an HTTP GET request More...
 
Task< TResult > Update< TResult > (string route, CancellationToken cancellationToken)
 Run an HTTP POST request More...
 
Task< TResult > Update< TBody, TResult > (string route, TBody body, CancellationToken cancellationToken)
 Run an HTTP POST request More...
 
Task Update< TBody > (string route, TBody body, CancellationToken cancellationToken)
 Run an HTTP POST request More...
 
Task< TResult > Create< TBody, TResult > (string route, TBody body, CancellationToken cancellationToken)
 Run an HTTP PUT request More...
 
Task Delete (string route, CancellationToken cancellationToken)
 Run an HTTP DELETE request More...
 
Task< TResult > Create< TBody, TResult > (string route, TBody body, long instanceId, CancellationToken cancellationToken)
 Run an HTTP PUT request More...
 
Task< TResult > Read< TResult > (string route, long instanceId, CancellationToken cancellationToken)
 Run an HTTP GET request More...
 
Task< TResult > Update< TBody, TResult > (string route, TBody body, long instanceId, CancellationToken cancellationToken)
 Run an HTTP POST request More...
 
Task Delete (string route, long instanceId, CancellationToken cancellationToken)
 Run an HTTP DELETE request More...
 
Task Delete< TBody > (string route, TBody body, long instanceId, CancellationToken cancellationToken)
 Run an HTTP DELETE request More...
 
Task< TResult > Delete< TResult > (string route, long instanceId, CancellationToken cancellationToken)
 Run an HTTP DELETE request More...
 
Task< TResult > Create< TResult > (string route, long instanceId, CancellationToken cancellationToken)
 Run an HTTP PUT request More...
 
Task< TResult > Patch< TResult > (string route, long instanceId, CancellationToken cancellationToken)
 Run an HTTP PATCH request More...
 
void AddRequestLogger (IRequestLogger requestLogger)
 Adds a requestLogger to the request pipeline More...
 
+ + + + + + + + + + + + + + + + + +

+Properties

Uri Url [get]
 
ApiHeaders?? Headers [get, set]
 
TimeSpan Timeout [get, set]
 
- Properties inherited from Tgstation.Server.Client.IApiClient
ApiHeaders Headers [get, set]
 The ApiHeaders the IApiClient uses More...
 
Uri Url [get]
 The Uri pointing the tgstation-server More...
 
TimeSpan Timeout [get, set]
 The request timeout More...
 
+ + + + +

+Private Member Functions

async Task< TResult > RunRequest< TResult > (string route, object body, HttpMethod method, long? instanceId, CancellationToken cancellationToken)
 Main request method More...
 
+ + + + + +

+Static Private Member Functions

static JsonSerializerSettings GetSerializerSettings ()
 
static void HandleBadResponse (HttpResponseMessage response, string json)
 
+ + + + + + + + + + +

+Private Attributes

readonly IHttpClient httpClient
 The HttpClient for the ApiClient More...
 
readonly List< IRequestLoggerrequestLoggers
 The IRequestLoggers used by the ApiClient More...
 
ApiHeaders headers
 Backing field for Headers More...
 
+

Detailed Description

+
+

Definition at line 18 of file ApiClient.cs.

+

Constructor & Destructor Documentation

+ +

◆ ApiClient()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.ApiClient.ApiClient (IHttpClient httpClient,
Uri url,
ApiHeaders apiHeaders 
)
+
+ +

Construct an ApiClient

+
Parameters
+ + + + +
httpClientThe value of httpClient
urlThe value of Url
apiHeadersThe value of ApiHeaders
+
+
+ +

Definition at line 131 of file ApiClient.cs.

+
132  {
133  this.httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient));
134  Url = url ?? throw new ArgumentNullException(nameof(url));
135  headers = apiHeaders ?? throw new ArgumentNullException(nameof(apiHeaders));
136 
137  requestLoggers = new List<IRequestLogger>();
138  }
ApiHeaders headers
Backing field for Headers
Definition: ApiClient.cs:50
+
readonly List< IRequestLogger > requestLoggers
The IRequestLoggers used by the ApiClient
Definition: ApiClient.cs:45
+ +
readonly IHttpClient httpClient
The HttpClient for the ApiClient
Definition: ApiClient.cs:40
+
+

References Tgstation.Server.Client.ApiClient.headers, Tgstation.Server.Client.ApiClient.httpClient, Tgstation.Server.Client.ApiClient.requestLoggers, and Tgstation.Server.Client.ApiClient.Url.

+ +
+
+

Member Function Documentation

+ +

◆ AddRequestLogger()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Client.ApiClient.AddRequestLogger (IRequestLogger requestLogger)
+
+ +

Adds a requestLogger to the request pipeline

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +

◆ Create< TBody, TResult >() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Create< TBody, TResult > (string route,
TBody body,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP PUT request

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +

◆ Create< TBody, TResult >() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Create< TBody, TResult > (string route,
TBody body,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP PUT request

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +

◆ Create< TResult >() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Create< TResult > (string route,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP PUT request

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +

◆ Create< TResult >() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Create< TResult > (string route,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP PUT request

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +

◆ Delete() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.ApiClient.Delete (string route,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP DELETE request

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +

◆ Delete() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.ApiClient.Delete (string route,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP DELETE request

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +

◆ Delete< TBody >()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.ApiClient.Delete< TBody > (string route,
TBody body,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP DELETE request

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +

◆ Delete< TResult >()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Delete< TResult > (string route,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP DELETE request

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Client.ApiClient.Dispose ()
+
+ +

+ +
+
+ +

◆ GetSerializerSettings()

+ +
+
+ + + + + +
+ + + + + + + +
static JsonSerializerSettings Tgstation.Server.Client.ApiClient.GetSerializerSettings ()
+
+staticprivate
+
+
+ +

◆ HandleBadResponse()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void Tgstation.Server.Client.ApiClient.HandleBadResponse (HttpResponseMessage response,
string json 
)
+
+staticprivate
+
+ +

Definition at line 58 of file ApiClient.cs.

+
59  {
60  ErrorMessage errorMessage = null;
61  try
62  {
63  // check if json serializes to an error message
64  errorMessage = JsonConvert.DeserializeObject<ErrorMessage>(json, GetSerializerSettings());
65  }
66  catch (JsonException) { }
67 
68  const string BadSpecExtension = " This is not part of TGS4 communication specification and should be reported if it was returned from a TGS4 server!";
69 
70 #pragma warning disable IDE0010 // Add missing cases
71  switch (response.StatusCode)
72 #pragma warning restore IDE0010 // Add missing cases
73  {
74  case HttpStatusCode.UpgradeRequired:
75  throw new ApiMismatchException(errorMessage ?? new ErrorMessage
76  {
77  Message = "API Mismatch but no current API version provided!" + BadSpecExtension,
78  SeverApiVersion = null
79  });
80  case HttpStatusCode.Unauthorized:
81  throw new UnauthorizedException();
82  case HttpStatusCode.RequestTimeout:
83  throw new RequestTimeoutException();
84  case HttpStatusCode.Forbidden:
85  throw new InsufficientPermissionsException();
86  case HttpStatusCode.ServiceUnavailable:
87  throw new ServiceUnavailableException();
88  case HttpStatusCode.Gone:
89  errorMessage = errorMessage ?? new ErrorMessage
90  {
91  Message = "The requested resource could not be found!",
92  SeverApiVersion = null
93  };
94  goto case HttpStatusCode.Conflict;
95  case HttpStatusCode.NotFound:
96  // our fault somehow
97  errorMessage = errorMessage ?? new ErrorMessage
98  {
99  Message = "This is not a valid route!" + BadSpecExtension,
100  SeverApiVersion = null
101  };
102  goto case HttpStatusCode.Conflict;
103  case HttpStatusCode.Conflict:
104  throw new ConflictException(errorMessage ?? new ErrorMessage
105  {
106  Message = "An undescribed conflict occurred!" + BadSpecExtension,
107  SeverApiVersion = null
108  }, response.StatusCode);
109  case HttpStatusCode.NotImplemented:
110  // unprocessable entity
111  case (HttpStatusCode)422:
112  throw new MethodNotSupportedException();
113  case HttpStatusCode.InternalServerError:
114  // response json is html
115  throw new ServerErrorException(json);
116  case (HttpStatusCode)429:
117  // rate limited
118  response.Headers.TryGetValues("Retry-After", out var values);
119  throw new RateLimitException(values?.FirstOrDefault());
120  default:
121  throw new ApiConflictException(errorMessage, response.StatusCode);
122  }
123  }
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
static JsonSerializerSettings GetSerializerSettings()
+
+

References Tgstation.Server.Client.ApiClient.GetSerializerSettings().

+ +

Referenced by Tgstation.Server.Client.ApiClient.RunRequest< TResult >().

+ +
+
+ +

◆ Patch< TResult >()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Patch< TResult > (string route,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP PATCH request

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +

◆ Read< TResult >() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Read< TResult > (string route,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP GET request

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +

◆ Read< TResult >() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Read< TResult > (string route,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP GET request

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +

◆ RunRequest< TResult >()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task<TResult> Tgstation.Server.Client.ApiClient.RunRequest< TResult > (string route,
object body,
HttpMethod method,
long? instanceId,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Main request method

+
Template Parameters
+ + +
TResultThe resulting POCO type
+
+
+
Parameters
+ + + + + + +
routeThe route to run
bodyThe body of the request
methodThe method of the request
instanceIdThe optional Instance.Id for the request
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the response on success
+ +

Definition at line 153 of file ApiClient.cs.

+
154  {
155  if (route == null)
156  throw new ArgumentNullException(nameof(route));
157  if (method == null)
158  throw new ArgumentNullException(nameof(method));
159  if (body == null && (method == HttpMethod.Post || method == HttpMethod.Put))
160  throw new InvalidOperationException("Body cannot be null for POST or PUT!");
161 
162  HttpResponseMessage response;
163  var fullUri = new Uri(Url, route);
164  var serializerSettings = GetSerializerSettings();
165  using (var request = new HttpRequestMessage(method, fullUri))
166  {
167  if (body != null)
168  request.Content = new StringContent(JsonConvert.SerializeObject(body, serializerSettings), Encoding.UTF8, ApiHeaders.ApplicationJson);
169 
170  headers.SetRequestHeaders(request.Headers, instanceId);
171 
172  await Task.WhenAll(requestLoggers.Select(x => x.LogRequest(request, cancellationToken))).ConfigureAwait(false);
173 
174  response = await httpClient.SendAsync(request, cancellationToken).ConfigureAwait(false);
175  }
176 
177  using (response)
178  {
179  await Task.WhenAll(requestLoggers.Select(x => x.LogResponse(response, cancellationToken))).ConfigureAwait(false);
180 
181  var json = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
182 
183  if (!response.IsSuccessStatusCode)
184  HandleBadResponse(response, json);
185 
186  if (String.IsNullOrWhiteSpace(json))
187  json = JsonConvert.SerializeObject(new object());
188 
189  try
190  {
191  return JsonConvert.DeserializeObject<TResult>(json, serializerSettings);
192  }
193  catch (JsonException)
194  {
195  throw new UnrecognizedResponseException(json, response.StatusCode);
196  }
197  }
198  }
const string ApplicationJson
TODO: Remove this when https://github.com/dotnet/corefx/pull/26701 makes it into the sdk
Definition: ApiHeaders.cs:21
+
ApiHeaders headers
Backing field for Headers
Definition: ApiClient.cs:50
+
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
readonly List< IRequestLogger > requestLoggers
The IRequestLoggers used by the ApiClient
Definition: ApiClient.cs:45
+
static void HandleBadResponse(HttpResponseMessage response, string json)
Definition: ApiClient.cs:58
+
void SetRequestHeaders(HttpRequestHeaders headers, long? instanceId=null)
Set HttpRequestHeaders using the ApiHeaders. This initially clears headers
Definition: ApiHeaders.cs:232
+ +
readonly IHttpClient httpClient
The HttpClient for the ApiClient
Definition: ApiClient.cs:40
+
Task< HttpResponseMessage > SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
Send an HTTP request
+
static JsonSerializerSettings GetSerializerSettings()
+
+

References Tgstation.Server.Api.ApiHeaders.ApplicationJson, Tgstation.Server.Client.ApiClient.GetSerializerSettings(), Tgstation.Server.Client.ApiClient.HandleBadResponse(), Tgstation.Server.Client.ApiClient.headers, Tgstation.Server.Client.ApiClient.httpClient, Tgstation.Server.Client.ApiClient.requestLoggers, Tgstation.Server.Client.IHttpClient.SendAsync(), Tgstation.Server.Api.ApiHeaders.SetRequestHeaders(), and Tgstation.Server.Client.ApiClient.Url.

+ +
+
+ +

◆ Update< TBody >()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.ApiClient.Update< TBody > (string route,
TBody body,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP POST request

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +

◆ Update< TBody, TResult >() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Update< TBody, TResult > (string route,
TBody body,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP POST request

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +

◆ Update< TBody, TResult >() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Update< TBody, TResult > (string route,
TBody body,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP POST request

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+ +

◆ Update< TResult >()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.ApiClient.Update< TResult > (string route,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP POST request

+ +

Implements Tgstation.Server.Client.IApiClient.

+ +
+
+

Member Data Documentation

+ +

◆ headers

+ +
+
+ + + + + +
+ + + + +
ApiHeaders Tgstation.Server.Client.ApiClient.headers
+
+private
+
+ +

Backing field for Headers

+ +

Definition at line 50 of file ApiClient.cs.

+ +

Referenced by Tgstation.Server.Client.ApiClient.ApiClient(), and Tgstation.Server.Client.ApiClient.RunRequest< TResult >().

+ +
+
+ +

◆ httpClient

+ +
+
+ + + + + +
+ + + + +
readonly IHttpClient Tgstation.Server.Client.ApiClient.httpClient
+
+private
+
+
+ +

◆ requestLoggers

+ +
+
+ + + + + +
+ + + + +
readonly List<IRequestLogger> Tgstation.Server.Client.ApiClient.requestLoggers
+
+private
+
+
+

Property Documentation

+ +

◆ Headers

+ +
+
+ + + + + +
+ + + + +
ApiHeaders?? Tgstation.Server.Client.ApiClient.Headers
+
+getset
+
+ +

+ +

Definition at line 25 of file ApiClient.cs.

+
25  {
26  get => headers;
27  set => headers = value ?? throw new InvalidOperationException("Cannot set null headers!");
28  }
ApiHeaders headers
Backing field for Headers
Definition: ApiClient.cs:50
+
+
+
+ +

◆ Timeout

+ +
+
+ + + + + +
+ + + + +
TimeSpan Tgstation.Server.Client.ApiClient.Timeout
+
+getset
+
+ +

+ +

Definition at line 32 of file ApiClient.cs.

+
32  {
33  get => httpClient.Timeout;
34  set => httpClient.Timeout = value;
35  }
TimeSpan Timeout
The request timeout
Definition: IHttpClient.cs:16
+
readonly IHttpClient httpClient
The HttpClient for the ApiClient
Definition: ApiClient.cs:40
+
+
+
+ +

◆ Url

+ +
+
+ + + + + +
+ + + + +
Uri Tgstation.Server.Client.ApiClient.Url
+
+get
+
+ +

+ +

Definition at line 21 of file ApiClient.cs.

+
21 { get; }
+

Referenced by Tgstation.Server.Client.ApiClient.ApiClient(), and Tgstation.Server.Client.ApiClient.RunRequest< TResult >().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_api_client.png b/class_tgstation_1_1_server_1_1_client_1_1_api_client.png new file mode 100644 index 0000000000000000000000000000000000000000..30b02a6be5deb31219e7f8472e64c43e72b499ce GIT binary patch literal 1087 zcmeAS@N?(olHy`uVBq!ia0vp^$AP$mgBeJsT;=x#QW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;xAv-@5pw#Y`g~5l!X}m2xPywGbs{p8p199{=yCqrFWv8xN>&_w z*0WM&?uF+T|5B6gSzeo+nR=K^H3uYJC$bDzn$$4D( zv6w>n!;UJ}2c8ERAGi~b3xX`4*Dz01efbG)LzLyEKa*3UDr@eUzP~0ucd|h_GUDW}CYewKIH8v9>MnD6@H&wsA|lPC^ReDV3zEx9M5 z4_CZdl5*>OW$NpzVFJr8C1|&v-M>_8?a`BcA-mX?JIu8`yKG*b&oa5{cXOUE=Qs2G zHS1rln6CTocGZ{pU*wLLZSc4>|CKMF=dJ}!&XfLVSg4%rpC-7L@aBXafI6EzkK<9D4c_tvayP3SuOE&ttI<;`my zB{SYt&D1@(Irgmi?v1Aw>0LXm{^ra19akT4<|qfkgMUlJ7U5OLHx(K_{vwmSUD4f8 z!#HE%nrJ4rP5taLrB{9%`t5vMG~?#k&aLM+9!bC5^Ljz(^@e2W9ghtBlKU3kwmY5} z7wUcW=;a(i>;H}kx4*96w`afH+}ruzkIz`l + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.ApiClientFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.ApiClientFactory, including all inherited members.

+ + +
CreateApiClient(Uri url, ApiHeaders apiHeaders)Tgstation.Server.Client.ApiClientFactory
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_api_client_factory.html b/class_tgstation_1_1_server_1_1_client_1_1_api_client_factory.html new file mode 100644 index 0000000000..da5146c18b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_api_client_factory.html @@ -0,0 +1,145 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.ApiClientFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.ApiClientFactory Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Client.ApiClientFactory:
+
+
+ + +Tgstation.Server.Client.IApiClientFactory + +
+ + + + + +

+Public Member Functions

IApiClient CreateApiClient (Uri url, ApiHeaders apiHeaders)
 Create an IApiClient More...
 
+

Detailed Description

+
+

Definition at line 7 of file ApiClientFactory.cs.

+

Member Function Documentation

+ +

◆ CreateApiClient()

+ +
+
+ + + + + + + + + + + + + + + + + + +
IApiClient Tgstation.Server.Client.ApiClientFactory.CreateApiClient (Uri url,
ApiHeaders apiHeaders 
)
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_api_client_factory.png b/class_tgstation_1_1_server_1_1_client_1_1_api_client_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..6de92a9028ef429a1eb975e988c7f9b99e28a6bb GIT binary patch literal 956 zcmeAS@N?(olHy`uVBq!ia0vp^pMf}lgBeKvUa;90NJ#|vgt-3y{~ySF@#br3|Dg#$ z78oBmaDcV*jy#adQ4-`A%m7pb0#{Fk7%?y~dwaS#hEy=Vo%^=$u>pr`fBurn|L*s; z{WM5;(-(Gk?URbB*0(JjEF>oH&$+$ru20US5^dcy&sp)^k&~WXKN<6_e$tuHeEI!{ zHh*?}tm3(o@3zjhjT`CtRpAd7U+~|Y?EYqw`PTmL5zoyc+aK#rTlx5=%EQUu zBUR7nJFlGK?fTV-Expt4{^}65-C2Uh-#7O7a$GespI645bjolwUomg6aVP7B+;|n$ zP1~8%woi2p3YfoBZ^q*{Nur*CwQ0_q%suDd+Gz^#>;2{PFb6#mnEmb^P4& z+K|6`x1^Qa8QFOk?aW`^;FEq=95vY_>_+E)yYrTtwZm`UzE*bO_SBp6Jw>l-ulM|K z(?9d=9kXV`Gr84lXV!cvKA@)>A9?>^qQc&~8JCT|lobD-buBM%x0~^q{XaH&UiyFO z_~sWz$A7AL-oLnf^NNqNYS$&lPujPFe|h4e)V;c%#@UA6m;OYZnPjqG?#%6Nx!;8j zlz(9^FuptC=kw=v7tB-Y6z=o=>N}I2$9%`JTQZ?eH?864))|b?t|zh0h$kfQBVTLj zl-Zq31;F@&YCBrfXR;vf>$i{E`hKrjCcNHoHfg7M>(h<0Uu0M1w=KIp+H#cgQX(pI%eB~#5?YOp1 z@bR@L52U{fJ~cCbTfiCDg>lCo=v;hRJ@u4Igl^I&yJ>3|c3w6z&pUYesdVrwPBQtscm|9p#@ufq2I^FHUFD?az;)YNYw_F;$LoL6bBdTRP|{`2i; z%JOF4lz6tymN_lvmu15AN&IW`lej + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.ApiConflictException Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_api_conflict_exception.html b/class_tgstation_1_1_server_1_1_client_1_1_api_conflict_exception.html new file mode 100644 index 0000000000..7d63c96070 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_api_conflict_exception.html @@ -0,0 +1,273 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.ApiConflictException Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.ApiConflictException Class Reference
+
+
+ +

Occurs when the server returns an unknown response + More...

+
+Inheritance diagram for Tgstation.Server.Client.ApiConflictException:
+
+
+ + +Tgstation.Server.Client.ClientException + +
+ + + + + + + + + + + + + + +

+Public Member Functions

 ApiConflictException?? (ErrorMessage errorMessage, HttpStatusCode statusCode)
 Construct an ApiConflictException using an errorMessage More...
 
 ApiConflictException ()
 Construct an ApiConflictException More...
 
 ApiConflictException (string message)
 Construct an ApiConflictException with a message More...
 
 ApiConflictException (string message, Exception innerException)
 Construct an ApiConflictException with a message and innerException More...
 
+ + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from Tgstation.Server.Client.ClientException
 ClientException??? (ErrorMessage errorMessage, HttpStatusCode statusCode)
 Construct a ClientException using an errorMessage and statusCode More...
 
 ClientException ()
 Construct a ClientException More...
 
 ClientException (string message)
 Construct a ClientException with a message More...
 
 ClientException (string message, Exception innerException)
 Construct a ClientException with a message and innerException More...
 
- Properties inherited from Tgstation.Server.Client.ClientException
HttpStatusCode StatusCode [get]
 The HttpStatusCode of the ClientException More...
 
Version ServerApiVersion [get]
 The Version of the server's API More...
 
+

Detailed Description

+

Occurs when the server returns an unknown response

+ +

Definition at line 10 of file ApiConflictException.cs.

+

Constructor & Destructor Documentation

+ +

◆ ApiConflictException() [1/3]

+ +
+
+ + + + + + + +
Tgstation.Server.Client.ApiConflictException.ApiConflictException ()
+
+ +

Construct an ApiConflictException

+ +

Definition at line 27 of file ApiConflictException.cs.

+
27 { }
+
+
+ +

◆ ApiConflictException() [2/3]

+ +
+
+ + + + + + + + +
Tgstation.Server.Client.ApiConflictException.ApiConflictException (string message)
+
+ +

Construct an ApiConflictException with a message

+
Parameters
+ + +
messageThe message for the Exception
+
+
+ +

Definition at line 33 of file ApiConflictException.cs.

+
33 : base(message) { }
+
+
+ +

◆ ApiConflictException() [3/3]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.ApiConflictException.ApiConflictException (string message,
Exception innerException 
)
+
+ +

Construct an ApiConflictException with a message and innerException

+
Parameters
+ + + +
messageThe message for the Exception
innerExceptionThe inner Exception for the base Exception
+
+
+ +

Definition at line 40 of file ApiConflictException.cs.

+
40 : base(message, innerException) { }
+
+
+

Member Function Documentation

+ +

◆ ApiConflictException??()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.ApiConflictException.ApiConflictException?? (ErrorMessage errorMessage,
HttpStatusCode statusCode 
)
+
+ +

Construct an ApiConflictException using an errorMessage

+
Parameters
+ + + +
errorMessageThe ErrorMessage for the ClientException
statusCodeThe HttpStatusCode for the ClientException
+
+
+ +

Definition at line 17 of file ApiConflictException.cs.

+
17  : base(errorMessage ?? new ErrorMessage
18  {
19  Message = "An unknown API error occurred!",
20  SeverApiVersion = null
21  }, statusCode)
22  { }
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_api_conflict_exception.png b/class_tgstation_1_1_server_1_1_client_1_1_api_conflict_exception.png new file mode 100644 index 0000000000000000000000000000000000000000..6de14591647d03a00cc60476c5c92959fd928ed4 GIT binary patch literal 1188 zcmeAS@N?(olHy`uVBq!ia0y~yU}OWbJ2;quq>NPz-IQrB7?A?EH#_r$JU;bVd(6(2bC4X>k>#;j`|HtXS z;5{CfZYDaVZ^G{1_g}N_U3f^~;vE6!lcgad%2vsQAj68|Nh4u${>wbcBed1T{PJRxF4x&fZ(n;#FS@U5 z!c!gP_*~*tmFkX*yLgmlL@xfb%VXoJZ^pClNPk*%x2oHtzOQjo_wuBtHb=v2mUL?K z-2BMoob8-G!GLE?Tx(*b#;ds*t4xz6O84I?jILd7_III#=+SJ0Ip5n1+qx3!HExuZ zX`IV>6*~U~@BX6)%vrbITlW9c!-sjXUq$4+%w*(#pW2&~Tl}T%sIOt)l{0IuS+>oO z+nbgqzr?=#7t7%}^Jm^vf9-9!#L3wBcm2z3!x=O0I)D?)nTQs}#2edkckg97aP=1} zLr~%k&6>_;0}-xA3Ord889YdfAZV=GF*zrp|i!QE21N>w{oqe|GO6#{yekCr_cF*nx>OfmeJdqslGOA`c+^3%~Ri?yz7_oyX3!V zw^aJ24(D;R2(gGLHoNqitJiAv?+IyM`0Z%KN&e&)>OFN|xpgLK6|+fn9iMdIgmE(m zgVfXOtZh~2tL0_ezBxKByEnmE%2)cC;X#L!fq!`or*L%jn-sPxTCX#>uw;Jni?U@E ze^lF^E?g10eYfY^#>?^{&e643PwhW`LH9yYE!W}7e2L^09N*fTa?{%vC9LRC6IR>1 z@LpGF{*2@YvzumRUrzk_p}>A!6&Js%G~a?%b$%)T9n;rj{)|=Aytdd}C$Fne?r`<5 zmA}Oq{sqO$9qK$R=6w4f!vm(hQqEec3_Ak!k25fQ4~FCmB_2*-fZvJx&%CGjvgyA) SLcrpKfx*+&&t;ucLK6UX1Qoyl literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception-members.html b/class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception-members.html new file mode 100644 index 0000000000..a20858b449 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception-members.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.ApiMismatchException Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception.html b/class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception.html new file mode 100644 index 0000000000..65e95a924c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception.html @@ -0,0 +1,260 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.ApiMismatchException Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.ApiMismatchException Class Reference
+
+
+ +

Occurs when the API version of the client is not compatible with the server's + More...

+
+Inheritance diagram for Tgstation.Server.Client.ApiMismatchException:
+
+
+ + +Tgstation.Server.Client.ClientException + +
+ + + + + + + + + + + + + + +

+Public Member Functions

 ApiMismatchException (ErrorMessage errorMessage)
 Construct an ApiMismatchException using an errorMessage More...
 
 ApiMismatchException ()
 Construct an ApiMismatchException More...
 
 ApiMismatchException (string message)
 Construct an ApiMismatchException with a message More...
 
 ApiMismatchException (string message, Exception innerException)
 Construct an ApiMismatchException with a message and innerException More...
 
+ + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from Tgstation.Server.Client.ClientException
 ClientException??? (ErrorMessage errorMessage, HttpStatusCode statusCode)
 Construct a ClientException using an errorMessage and statusCode More...
 
 ClientException ()
 Construct a ClientException More...
 
 ClientException (string message)
 Construct a ClientException with a message More...
 
 ClientException (string message, Exception innerException)
 Construct a ClientException with a message and innerException More...
 
- Properties inherited from Tgstation.Server.Client.ClientException
HttpStatusCode StatusCode [get]
 The HttpStatusCode of the ClientException More...
 
Version ServerApiVersion [get]
 The Version of the server's API More...
 
+

Detailed Description

+

Occurs when the API version of the client is not compatible with the server's

+ +

Definition at line 10 of file ApiMismatchException.cs.

+

Constructor & Destructor Documentation

+ +

◆ ApiMismatchException() [1/4]

+ +
+
+ + + + + + + + +
Tgstation.Server.Client.ApiMismatchException.ApiMismatchException (ErrorMessage errorMessage)
+
+ +

Construct an ApiMismatchException using an errorMessage

+
Parameters
+ + +
errorMessageThe ErrorMessage for the ClientException
+
+
+ +

Definition at line 16 of file ApiMismatchException.cs.

+
16  : base(errorMessage, HttpStatusCode.BadRequest)
17  {
18  if (errorMessage == null)
19  throw new ArgumentNullException(nameof(errorMessage));
20  }
+
+
+ +

◆ ApiMismatchException() [2/4]

+ +
+
+ + + + + + + +
Tgstation.Server.Client.ApiMismatchException.ApiMismatchException ()
+
+ +

Construct an ApiMismatchException

+ +

Definition at line 25 of file ApiMismatchException.cs.

+
25 { }
+
+
+ +

◆ ApiMismatchException() [3/4]

+ +
+
+ + + + + + + + +
Tgstation.Server.Client.ApiMismatchException.ApiMismatchException (string message)
+
+ +

Construct an ApiMismatchException with a message

+
Parameters
+ + +
messageThe message for the Exception
+
+
+ +

Definition at line 31 of file ApiMismatchException.cs.

+
31 : base(message) { }
+
+
+ +

◆ ApiMismatchException() [4/4]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.ApiMismatchException.ApiMismatchException (string message,
Exception innerException 
)
+
+ +

Construct an ApiMismatchException with a message and innerException

+
Parameters
+ + + +
messageThe message for the Exception
innerExceptionThe inner Exception for the base Exception
+
+
+ +

Definition at line 38 of file ApiMismatchException.cs.

+
38 : base(message, innerException) { }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception.png b/class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception.png new file mode 100644 index 0000000000000000000000000000000000000000..52e2f40a33e44ffdb0c80cd62bccbba8555eeea4 GIT binary patch literal 1336 zcmeAS@N?(olHy`uVBq!ia0y~yU=#qdJ2;quq{K9ry&x*UC&cyt|NlVdi#K0O`wvY3 zvcUMjfdj0acjSRwj*=k1U~9&eY#jesx0S-*7M9dAzI7oDsjdJIjMPrRmG+#w(HiW~bgW8;M`#Hhr?5 z-AJ~-Ir`b_{(DCCmJ`mLvHjiS0(HkKex^w?f7TgKI1?i2k+upZ%03~;YvWq}1MW9u z52PtDDDS@S%d)~qz~Re-L?t$+4cW&SSMaa|NOCLyilr(voN{28+Q^{A%oxJPM23VN z+ljYjyKlZatgCcrn+=)w2^v)<;rc6HsnB;C_>&y4HiH=b4I*<%JY=t~*v3F9;uLDx>L!iXQb zwc&k63twII-_~1t(fwMY@dbmok7G*(J!E$-vpnT6aZ1MvpLl+?+jClt=WlIW)0}tA z`h0%_qBO>0`kOrXLt5+;jI^!5~@jw^E_qeOc_>JpJ_!ZeKU? z-g$o_c>ddolDSjtd7tcQ>uEI6+3xOE`@QeXOn>WFtx})vH@?tSPTjrwZq=48m&~`i z&lZ#S4M|>m_5F?Xb&BlU&sbdU=xChF@bg-zoZv^vZ@p{QGgu}{34UDo&DmjEu7u#n z|C{DB2?>6TJ_8KOR0Y9>MiV*$Bt2YK$T{R~zkPO_9fN#gIm7HmhMqTd=7I}=5qYt> zy;FkYz&c5G>O?Lio&1teSUM$XH9zZtZSVM*8C~G%B&tD2Rcyto_5J^kJ=ivv;h5R) zz9ds+)3c|4=dmrmxA-K(s=XD!=)GTl>5Z+PP-Kn!yGbtlHBL7%zPTaBabV-y^DCH* z;*Z30+9&n?m;njN2-`Mhh{Ii8A^3$w2YWvOnUtZTa zILFic(Yc-|g<>u(uFyvpbRKXy?!Ka#)3{}$$c7`8UV>+;{1%+glgXQWp`dE(c?OT( zh~-9IYdp9v%-ko(a5JP!?--khaN-A}{LadkyZ>(5e&m%Yi_+yeW>4%U%yR7ASYpGp zi7l_eV|m%+E$(jT?h2ep+nV(zpUKk3s5$u7F^NWrHxthClsqvM&{*4dD0hEuWIRJr zobxdUscE;B7w@ZfU*@;-`(lG@nLA1=`?5~h3G7W>B2#V}**`7p!?JG~mme+WG)Yh1 z%q|uF_Nx5MXN$73PaM=Wo_F!Zz5Qj~%zu{rP2f^rSglZdkfoxzmTy98HRGO(b{rfB n^39NQXcdFzQjy!g{xI9C-Y(lSFX0rhm}BsC^>bP0l+XkKJ-9`s literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_client_1_1_client_exception-members.html b/class_tgstation_1_1_server_1_1_client_1_1_client_exception-members.html new file mode 100644 index 0000000000..4ed3f157dd --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_client_exception-members.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.ClientException Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.ClientException, including all inherited members.

+ + + + + + + +
ClientException()Tgstation.Server.Client.ClientExceptionprotected
ClientException(string message)Tgstation.Server.Client.ClientExceptionprotected
ClientException(string message, Exception innerException)Tgstation.Server.Client.ClientExceptionprotected
ClientException???(ErrorMessage errorMessage, HttpStatusCode statusCode)Tgstation.Server.Client.ClientExceptionprotected
ServerApiVersionTgstation.Server.Client.ClientException
StatusCodeTgstation.Server.Client.ClientException
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_client_exception.html b/class_tgstation_1_1_server_1_1_client_1_1_client_exception.html new file mode 100644 index 0000000000..8282214440 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_client_exception.html @@ -0,0 +1,364 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.ClientException Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.ClientException Class Reference
+
+
+ +

Exceptions thrown by IServerClients + More...

+
+Inheritance diagram for Tgstation.Server.Client.ClientException:
+
+
+ + +Tgstation.Server.Client.ApiConflictException +Tgstation.Server.Client.ApiMismatchException +Tgstation.Server.Client.ConflictException +Tgstation.Server.Client.InsufficientPermissionsException +Tgstation.Server.Client.MethodNotSupportedException +Tgstation.Server.Client.RateLimitException +Tgstation.Server.Client.RequestTimeoutException +Tgstation.Server.Client.ServerErrorException +Tgstation.Server.Client.ServiceUnavailableException +Tgstation.Server.Client.UnauthorizedException +Tgstation.Server.Client.UnrecognizedResponseException + +
+ + + + + + + + + + + + + + +

+Protected Member Functions

 ClientException??? (ErrorMessage errorMessage, HttpStatusCode statusCode)
 Construct a ClientException using an errorMessage and statusCode More...
 
 ClientException ()
 Construct a ClientException More...
 
 ClientException (string message)
 Construct a ClientException with a message More...
 
 ClientException (string message, Exception innerException)
 Construct a ClientException with a message and innerException More...
 
+ + + + + + + +

+Properties

HttpStatusCode StatusCode [get]
 The HttpStatusCode of the ClientException More...
 
Version ServerApiVersion [get]
 The Version of the server's API More...
 
+

Detailed Description

+

Exceptions thrown by IServerClients

+ +

Definition at line 10 of file ClientException.cs.

+

Constructor & Destructor Documentation

+ +

◆ ClientException() [1/3]

+ +
+
+ + + + + +
+ + + + + + + +
Tgstation.Server.Client.ClientException.ClientException ()
+
+protected
+
+ +

Construct a ClientException

+ +

Definition at line 36 of file ClientException.cs.

+
36 { }
+
+
+ +

◆ ClientException() [2/3]

+ +
+
+ + + + + +
+ + + + + + + + +
Tgstation.Server.Client.ClientException.ClientException (string message)
+
+protected
+
+ +

Construct a ClientException with a message

+
Parameters
+ + +
messageThe message for the Exception
+
+
+ +

Definition at line 42 of file ClientException.cs.

+
42 : base(message) { }
+
+
+ +

◆ ClientException() [3/3]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.ClientException.ClientException (string message,
Exception innerException 
)
+
+protected
+
+ +

Construct a ClientException with a message and innerException

+
Parameters
+ + + +
messageThe message for the Exception
innerExceptionThe inner Exception for the base Exception
+
+
+ +

Definition at line 49 of file ClientException.cs.

+
49 : base(message, innerException) { }
+
+
+

Member Function Documentation

+ +

◆ ClientException???()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.ClientException.ClientException??? (ErrorMessage errorMessage,
HttpStatusCode statusCode 
)
+
+protected
+
+ +

Construct a ClientException using an errorMessage and statusCode

+
Parameters
+ + + +
errorMessageThe ErrorMessage associated with the ClientException
statusCodeThe HttpStatusCode of the ClientException
+
+
+ +

Definition at line 27 of file ClientException.cs.

+
27  : base(errorMessage == null ? throw new ArgumentNullException(nameof(errorMessage)) : errorMessage.Message ?? "Unknown Error")
28  {
29  StatusCode = statusCode;
30  ServerApiVersion = errorMessage?.SeverApiVersion;
31  }
HttpStatusCode StatusCode
The HttpStatusCode of the ClientException
+
string Message
A human readable description of the error
Definition: ErrorMessage.cs:13
+
Version ServerApiVersion
The Version of the server's API
+
Version SeverApiVersion
The version of the API the server is using
Definition: ErrorMessage.cs:18
+
+

References Tgstation.Server.Client.ClientException.ServerApiVersion, Tgstation.Server.Api.Models.ErrorMessage.SeverApiVersion, and Tgstation.Server.Client.ClientException.StatusCode.

+ +
+
+

Property Documentation

+ +

◆ ServerApiVersion

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Client.ClientException.ServerApiVersion
+
+get
+
+ +

The Version of the server's API

+ +

Definition at line 20 of file ClientException.cs.

+
20 { get; }
+

Referenced by Tgstation.Server.Client.ClientException.ClientException???().

+ +
+
+ +

◆ StatusCode

+ +
+
+ + + + + +
+ + + + +
HttpStatusCode Tgstation.Server.Client.ClientException.StatusCode
+
+get
+
+ +

The HttpStatusCode of the ClientException

+ +

Definition at line 15 of file ClientException.cs.

+
15 { get; }
+

Referenced by Tgstation.Server.Client.ClientException.ClientException???().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_client_exception.png b/class_tgstation_1_1_server_1_1_client_1_1_client_exception.png new file mode 100644 index 0000000000000000000000000000000000000000..f7880deb09a4e68f26f5aed920d895bbad97f8d5 GIT binary patch literal 9509 zcmeHNc~nz(w}q{GfP#QZ z1i2wWgn$r26f39<(I6m0h=_n8gn$eQ3B&u{pdG%iU9WGw_4>zKy=#ReH+S9NaL?Ii z?|r!Vo%P`bN^6u96ciSq%@5isD11Q%uZQzyfip>QYDDn1>boNjX4BKt;Nyq>(V&FN zpTH;i>(Qe}b1t^4fv@ujcGmU^;3DK`eBq#{prBraKKQLesG^XI54lsj^iXHbNvdRe zdI){TeE3e*S2w*fOAFuFrrjyKZ3wxiTj$vC27lI_RgeW3WwLwEm}atBn@N?52RXyz z5gq5vmF6x+vwMfb)HZ6a-KTB>E{VKAKBI7TB*HXPya8M|qR!{bMBtm~V^}e-Sqq#Z zXz<4)Oi|f_N;Pz+g3+}RSr_GBZg5|B*T{I-_|zn2wK2GlDRLhZ49C)jbvjhGJDn|j z6_?KL4P1H9ZueQ5!MIE$t0|||UvnKNf=Rh92Db{&BL|{&-yO1(9Og5)ek)#^D@`w7 zXCa;RcN!aS7;j&Hb@|kivex&OIF^NUbl52T>X@ucOBA$?R2iL-VE`tTDH>WRi2L0F zeqHIH4k-gnK!i-dJRA%vLk8W5EJk!dJ!aMga_{hX`J$`K7k-UgIBbes*uWz^5R>Lrt9MGF1}^6QFHc(>)$9TmT8dopY=t4 zaYjxhgUkQ#PgSC7_ynUEFxghcdG~e0?%!V&mV8Fxzk5eT-p{E~OZAYBkK>Jpr5oS$ ztYIVx38-K6SqSFk7+9N;l zdt&Au{qu?Z(_b9QsmA&F8j`G*SSt3GX2f}Q#5W#HtC@m^6Ts-k=0+{sa|=(IQTSge zw`MMyeRFgO^)#ZX8h6o0FF$J_Z@C*1r~T?)SsizIs8;E#49)7$&P`~)i)!X&aX0Eq zNWKTn>^>wh)g#{w^g=$b&ij#cFh#Z+DM_+~9fDvM^xY;+LhV9Qy;iR>seZz(L}oDN z#+bIRjc9txUnX3FzHJ$`mEY`UBb?#{up%DP2VHA}qivQjF&0n*5dZXInulFS!w43*GtD0KD@-GM$>M;t;kNnfyViY2mqBrcT zK4?4drS?_uizWDli<~M!F8@1D)wH3F=08~+dtz0vLdRKgViBz608OUK!G;2lA&=`I z2Zm>mrU>?)0Us*dir~>;5jm&E9n!BJ86IwX=Mv}&HSTorC<&;;I?ea98QNoDIWp?e zr2@ky109EQ2CZl{#tH*eRx^gUI zq*4idq>fed!R(4NGxdGh{K%O2sa*$@7de(@e-RpAVZ9?isYbc=V3$%`N~h8Ey9af$ zd$4pFz=XG_(5#RLeXrLB!Sa}Gt2D?+HTB)NO+CHW`>x-|A`(sajkGx9?PDuu)5Ina z<2LH)V?+)P$8)x_f#|m;$MP(FcbgRoq8JQx+zL4mmr9+bPP;oiX@vz?7> z#tQVxVhl8?AM9Sa@GE4oHKdB8t}uM%Yf>d!GFOXFM}wb1s!zm4XK@{&7#LnH2UZLu zoWWWMnt@+0s8J5I=1veD!QSJmVmHixvb|rST+wff=4?sGg})a{{|b0_3)R=fo|yM! z`+Q>szeh5(6SM+`qpajLaiHR;pRLl1Epy7S=~)b*#8(%`<;v;yZ+?9RH_YF>!r z{h-mNItPfj_k|-AB+rO{X}F47)&(UmvGE;S#aI!gYOHPJ?n=DZ?gX-^dgAAo=1SFr zByy%fL<&PU4U53AU8p^lB+wgK5ll@MzN~x#(Q^A;v-0gDGRx3LG{I8B#kBmwQr|Hr z7sm(J{fDo>@Oq>ex?LTC&4{mav$MXszM?Gcx=scOtEPC#Wd zn0j5+xv&Wc#~`po+@hS~aIYG7Sp=?Ad6Fg^56?~_80@Mlva6L!VNCu0HcGN^Y7N6& zY|=c^s*hW1@5cqm;(-*dM3RmV6_(=GKKzk)_X>hN=F$kOT-YeiT#5CT<%-Uy7QlVF zOVOPxCwki=A?P0Lv<#sc{~qVR#KQ&hr;q`7S-E}wlZB5|2ZI5Jhz8I8Z=eo;CEkCf zG#%EQ6RTpuEbq@6{IWa~O#L?8*DPmLpYr!V*Y(TN)y%`oCLk#A2nxm0uGepdAd@Hh z!CRa0$BlWtZ~EbUHB|u>9(&060K=Xa!QP@MWWj>;W3~|e9dQD^tm+MQ(BH?H2MHZV zWz5@GmtW~LB)MH`YOZ!H@Sbu#q+8K$anxB+mz95R_;%Q7qLhToyIAL3u(!=kUnfU@ z+NcHKxtSwmf@G>BhRjQI4)VTY)JWK+nAL!%s@hno85*jP>I3mVZ>#r>boL~knTzt7 zLhvqxWUX|h&nNfgFF{_PDz@NsA1=HjVg*l8YX-E-;J!UbgorfouW_lu^vU%}Hv-~T znvzD6CFe;rHhh_93dy?$^)A3w2PNUR^DT%#eWbmeUJkcw>0LGUuv)t379?Z zKM{JwW!#biaqFZWFPn_h_Varx@rS(=%$3rIl+i4MP&t5WJf_CzjxfeX1UE38mY1s< z)-?32NgLV7i=}i`Rv61pK`FBfYkX}fVByUD$ii=sm7OVY$2Ai_0M?2V`#G5^H(}WK z0{P`0RxY`@;uthqe9-R0P4{9M3d3)VO&^dlm`rB z_WFh~yWK@!2^jyQRw3moYWxA30?qw@7Gn}#LIsZ8W|UzeCU zeW?SvSV?Zh(R{ImhzNABlb{}K;O7NYe9iY^Gz%-@BVlgBiVzKc`fTMrC9RVH*bV&7 zjKcA1Iq(=D)X^t20b4)96>%Wen4qaLMa3nS=GilcvU-h2YhC*2`|dFtX4sI@t`zO1 zyO?E>mIHKIcU@e_PHb5RaoKLu#L=f9<+H95PT(LYv^y8smb>KP*6*Mdpn#ZRl15tJ z!7xZARy~H14=X`XKC%b@WXbNcH~yHryUwi|LLG@vz4_FHnH=`g@j*N>AK<)90pMlT z1CsBHGh&yWQ{=lI{TRtN{6^*$b=TUxRVIbWbWmUt#t)bS*m{#Z5-8S%_>4!prfKv( z<3a2zyoi?cVQasWcH3vP_YfZ5Ii&we;{SYm8rJ14^agB2uwhAw4doj#iQ4gFCe- zqY9QD0#QIDS#yqrmI%^NOx2KYK~PIYIXrEvtxC0P;KxiH_+KpCwOGrd!+o(|QoR8Jpg`ik-W zlff)5cI7O?O(L{3@}x>c371FG=G}L$qk^fa$4slHk)rS~UJvNT58=9ewIgox=sE7} zB2s;9)%D<%HWz2Dc+2aHTn=Yn^!2ZEqG^mf`KBnZ^}{JKi^llcc-pE4A7nx2A6!Gy zqS1J#s1<@x?@9#-`OhW`HUedE<)GcsK{Zf9+#I3N4&)2ZODtyyUf@CRQ~#v!7Nh@6 z1U}k6|G=u)6K@nlXLVTH%^MUg{ySysUlYpzJ8^sG&k{rhcfAg!26kDS0k?Jyv{K*< z#6Ku^LpK|jlE|=kl~|If6j$KfN&V5eup{h1Myf0&76fH%riJuaazzdIu7%uyu?wZR z8YpiLDg$8h?U3KXWx{=5$r+J4{xxG4_pqu-ncn9dxI?-!8NQ-eo8RYpBYR4$J}Hq%LbpU|%1gqr z%QWIlNdW5BSQy2~=HbN7bM%vzOS^i1$MSs{ylW#DEsUb~R3+F$KwW&esAeIh7uqve zBW?Ly)^EKU?{JA#l0ozP2Es>T(~kb8M>bHy(29?d*zm`xjV?=l^1*zOKz$^TbNq0> zU<0Ac-EFSenT z6sOkxedgd_X82*o=<~m7kSHKnfoymGi|S>)#UGRVpyM73AP8q&GG}_n1g;F#%Ow5) zz9ajbsl^XZ#DZa{lJ(I6A=QB1+j2Y`nA=5xQszmyXJgI5`AfC-@)~=`M0(+xF(nTO zZEd)_QY8kaCioLE613Mbhgzu-C6eb-+n=4E2~*oRZIZCpPgL{ZR)pg2)!>U`q4d-& zYyEXrk3Ni8<-NLf=x5E7n*6=Zc3GPJoB7@v!tZrYP@Wlt>kt3HnDiKp2kL`uVT2cu z>zl@kQ!`-iZ)L;h$c3>J$DXwkn&ILlds0TC>R*lQ@GHDU9LV>*4|}6QDutSH4lylR z(M9L8zO=tGRC$=xu~b*fD^TddNji-~JMQUCBIxk-Bq+^K(w0PC)HYeZR(p+iSL2cT zc#E>U_8J1kqIL5_d$j2FGvN)-$GPOelrRkESa-y?oEtn~SO$A%aoG*7Dm%4v!HU>L zGCros? zw>73TnKEOnUW=L9J%BwqN)qMz!07FVrxV+vku_OxP%E#(@bspu%cEXIgA5>^fFR)G zOEjms!S0CnF#z=LKLiLcgkE(M*C`m@lbxB#Q|V0=z;H$<@YHc@Lv^@KPMIb$N$@AD zC4)v5;M0J0glOC6lk0(NneSnfEz3FwD39c-T-} zbV7X1@U3xD>{G^8+O6^!HqtIl$7j1+ zg^0lINi|Hlujod6GR2_I= z9vQ~~&zkj6m+$E{t`p*JP=^>dcLy=izGcfm@kjVQ5qCHqcYuQPu`;6sm4Q84z=X6rCh8D~Dsei$Px_$ua;!yP&Ra+|xV)%K8=(1|QflkX&2jlTO48L0D z_~!QLd7$NK)1EYf3&{?S_KJ5m4wYM$R%7AWbZ>*#MQ^j`8XDBC8OD_HNj)9~BuszJ zgEo6!$c{7_r!^;~@VV)ie%ugwW2W2edQfM2h{Hk*1RckC~bGrM~k?XIxx@C>(E6V&zr*YZ1bzufVDXtcFp zBq||di(gfBOO=vI1`f1_ZuSyGZ6HXDxTLz~QYI0~>6y{9Mka2=K*kdPOGhn?*z^GJ z9pj;|e9DhK!@REg*COA+7Nd3Y!ayKl?L2Y$zqY21g=A>)Pkt26X|HT*h=Q7Nk?GxK zvUha@xp3b?!~zWh4Jw_xn+YVV{6KV(><;HcLMMH!Z?p+ zWg03+Ba&wwm_um>a|ivdg>U!Fw5trq8z+&T^-A@~vO5kCQ}gQb@UA3_aC{sDO+%m* zR9zNUAk9j={67Q!vFy)Y{w?~qhn@@qeGr4@H&mDAbE1TtVSHYoL9zc~2#P)_K!cuD zJ8>YEa+ERYRH{?PykN* zGJ>ckzbgRUse65C>xQ?Prar_qx@5ZMkzFSyFg+f_^t>*S=@lT(wxxX4*!LiHgt8ft_AXMSRUa5*LF3 z%=^8tbo8}*V^C6O)b}l?N}2^7>4E!SJcPO;c9Mb@w z{^x1*hz;EI092;e2EN`f(Q>9&>tiXs&t)su-ZAS?cYOxhR)&K27>&s9UiFY@iN#GO z4+BasP=o6ASak9rChwD-gO?ztKMIhg(QS@~A*VO+cZt&ZBI>Cnp>prPdS}WAPBnE( z%}J qq)JAC?~I!RGUb2b=A4^WbX!;&aNK-t3izKU1+ + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Components.ByondClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.Components.ByondClient, including all inherited members.

+ + + + + + + + +
ActiveVersion(CancellationToken cancellationToken)Tgstation.Server.Client.Components.ByondClient
apiClientTgstation.Server.Client.Components.ByondClientprivate
Byond(Routes.Byond, byond ?? throw new ArgumentNullException(nameof(byond)), instance.Id, cancellationToken)Tgstation.Server.Client.Components.ByondClientprivate
ByondClient(IApiClient apiClient, Instance instance)Tgstation.Server.Client.Components.ByondClient
InstalledVersions(CancellationToken cancellationToken)Tgstation.Server.Client.Components.ByondClient
instanceTgstation.Server.Client.Components.ByondClientprivate
SetActiveVersion(Byond byond, CancellationToken cancellationToken)Tgstation.Server.Client.Components.ByondClient
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html new file mode 100644 index 0000000000..d19e56746f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html @@ -0,0 +1,361 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components.ByondClient Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components.ByondClient Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Client.Components.ByondClient:
+
+
+ + +Tgstation.Server.Client.Components.IByondClient + +
+ + + + + + + + + + + + + + +

+Public Member Functions

 ByondClient (IApiClient apiClient, Instance instance)
 Construct a ByondClient More...
 
Task< ByondActiveVersion (CancellationToken cancellationToken)
 Get the Byond active System.Version information More...
 
Task< IReadOnlyList< Byond > > InstalledVersions (CancellationToken cancellationToken)
 Get all installed Byond System.Versions More...
 
Task< ByondSetActiveVersion (Byond byond, CancellationToken cancellationToken)
 Updates the Byond information More...
 
+ + + +

+Private Member Functions

Task< ByondByond (Routes.Byond, byond ?? throw new ArgumentNullException(nameof(byond)), instance.Id, cancellationToken)
 
+ + + + + + + +

+Private Attributes

readonly IApiClient apiClient
 The IApiClient for the ByondClient More...
 
readonly Instance instance
 The Instance for the ByondClient More...
 
+

Detailed Description

+
+

Definition at line 11 of file ByondClient.cs.

+

Constructor & Destructor Documentation

+ +

◆ ByondClient()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.Components.ByondClient.ByondClient (IApiClient apiClient,
Instance instance 
)
+
+ +

Construct a ByondClient

+
Parameters
+ + + +
apiClientThe value of apiClient
instanceThe value of Instance
+
+
+ +

Definition at line 28 of file ByondClient.cs.

+
29  {
30  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
31  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
32  }
readonly IApiClient apiClient
The IApiClient for the ByondClient
Definition: ByondClient.cs:16
+
readonly Instance instance
The Instance for the ByondClient
Definition: ByondClient.cs:21
+
+

References Tgstation.Server.Client.Components.ByondClient.apiClient, and Tgstation.Server.Client.Components.ByondClient.instance.

+ +
+
+

Member Function Documentation

+ +

◆ ActiveVersion()

+ +
+
+ + + + + + + + +
Task<Byond> Tgstation.Server.Client.Components.ByondClient.ActiveVersion (CancellationToken cancellationToken)
+
+ +

Get the Byond active System.Version information

+ +

Implements Tgstation.Server.Client.Components.IByondClient.

+ +
+
+ +

◆ Byond()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<Byond> Tgstation.Server.Client.Components.ByondClient.Byond (Routes. Byond,
byond ?? throw new  ArgumentNullExceptionnameof(byond),
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +

◆ InstalledVersions()

+ +
+
+ + + + + + + + +
Task<IReadOnlyList<Byond> > Tgstation.Server.Client.Components.ByondClient.InstalledVersions (CancellationToken cancellationToken)
+
+ +

Get all installed Byond System.Versions

+ +

Implements Tgstation.Server.Client.Components.IByondClient.

+ +
+
+ +

◆ SetActiveVersion()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<Byond> Tgstation.Server.Client.Components.ByondClient.SetActiveVersion (Byond byond,
CancellationToken cancellationToken 
)
+
+ +

Updates the Byond information

+ +

Implements Tgstation.Server.Client.Components.IByondClient.

+ +
+
+

Member Data Documentation

+ +

◆ apiClient

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.Components.ByondClient.apiClient
+
+private
+
+ +

The IApiClient for the ByondClient

+ +

Definition at line 16 of file ByondClient.cs.

+ +

Referenced by Tgstation.Server.Client.Components.ByondClient.ByondClient().

+ +
+
+ +

◆ instance

+ +
+
+ + + + + +
+ + + + +
readonly Instance Tgstation.Server.Client.Components.ByondClient.instance
+
+private
+
+ +

The Instance for the ByondClient

+ +

Definition at line 21 of file ByondClient.cs.

+ +

Referenced by Tgstation.Server.Client.Components.ByondClient.ByondClient().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.png b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.png new file mode 100644 index 0000000000000000000000000000000000000000..5b82c0ab4c6e3347914389c79a9084aee563dd71 GIT binary patch literal 1105 zcmeAS@N?(olHy`uVBq!ia0y~yU{nOM12~w0Wa25~pFm0?z$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opgRv| zeLESOTT&elsd4-6RPU5uRIAgidwP@3($vUloe?T4RXi7VO;AbIa+)+{C5LCwG9?wy znN|z8{qr<>`{U=YGO5?hhm}0Lww~=xdMi8s$mEn+(ck_{hA+I=e0`n|U++U1MNg?M zcCM4wU48C$x%$5PN0pmq0=u}jPTcv)M4(EsRzKGN;GgK~>l=PQysk)sqoSpdP;=akcGmH&dHtc)z%>DiAws#d)!nfp-XV2sH#YxUle(hsGBX0V}t=kB{w@cJsaD`7Pb)MCwn63_I&zA4)%K7{0uu?Jw+< zc0c>qIZocPU#^>D85i1q_}e@%2VzcO^A9AUr~Lx; zX>xh#Cl=0|HR+3W)q|HW%N9kec`gM8cX>#Qie|9jq$NJC9+QmrasXpz%CywTB*s5e z{xNtl2#YE8vEmberD-(?hH;>*Bk71&)2K!mQdjH?{)PHu9tDnm{ Hr-UW|O8fRJ literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client-members.html b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client-members.html new file mode 100644 index 0000000000..eb57f71e01 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client-members.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Components.ChatBotsClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.Components.ChatBotsClient, including all inherited members.

+ + + + + + + + + + + +
apiClientTgstation.Server.Client.Components.ChatBotsClientprivate
ChatBot(Routes.Chat, settings ?? throw new ArgumentNullException(nameof(settings)), instance.Id, cancellationToken)Tgstation.Server.Client.Components.ChatBotsClientprivate
ChatBot(Routes.Chat, settings ?? throw new ArgumentNullException(nameof(settings)), instance.Id, cancellationToken)Tgstation.Server.Client.Components.ChatBotsClientprivate
ChatBotsClient(IApiClient apiClient, Instance instance)Tgstation.Server.Client.Components.ChatBotsClient
Create(ChatBot settings, CancellationToken cancellationToken)Tgstation.Server.Client.Components.ChatBotsClient
Delete(ChatBot settings, CancellationToken cancellationToken)Tgstation.Server.Client.Components.ChatBotsClient
GetId(ChatBot settings, CancellationToken cancellationToken)Tgstation.Server.Client.Components.ChatBotsClient
instanceTgstation.Server.Client.Components.ChatBotsClientprivate
List(CancellationToken cancellationToken)Tgstation.Server.Client.Components.ChatBotsClient
Update(ChatBot settings, CancellationToken cancellationToken)Tgstation.Server.Client.Components.ChatBotsClient
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html new file mode 100644 index 0000000000..10e2c71e2e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html @@ -0,0 +1,491 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components.ChatBotsClient Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components.ChatBotsClient Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Client.Components.ChatBotsClient:
+
+
+ + +Tgstation.Server.Client.Components.IChatBotsClient + +
+ + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ChatBotsClient (IApiClient apiClient, Instance instance)
 Construct a ChatBotsClient More...
 
Task< ChatBotCreate (ChatBot settings, CancellationToken cancellationToken)
 Create a ChatBot More...
 
Task Delete (ChatBot settings, CancellationToken cancellationToken)
 Delete a ChatBot More...
 
Task< IReadOnlyList< ChatBot > > List (CancellationToken cancellationToken)
 List the ChatBots More...
 
Task< ChatBotUpdate (ChatBot settings, CancellationToken cancellationToken)
 Updates a ChatBot's setttings More...
 
Task< ChatBotGetId (ChatBot settings, CancellationToken cancellationToken)
 Get a ChatBot's setttings More...
 
+ + + + + +

+Private Member Functions

Task< ChatBotChatBot (Routes.Chat, settings ?? throw new ArgumentNullException(nameof(settings)), instance.Id, cancellationToken)
 
Task< ChatBotChatBot (Routes.Chat, settings ?? throw new ArgumentNullException(nameof(settings)), instance.Id, cancellationToken)
 
+ + + + + + + +

+Private Attributes

readonly IApiClient apiClient
 The IApiClient for the ChatBotsClient More...
 
readonly Instance instance
 The Instance for the ChatBotsClient More...
 
+

Detailed Description

+
+

Definition at line 11 of file ChatBotsClient.cs.

+

Constructor & Destructor Documentation

+ +

◆ ChatBotsClient()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.Components.ChatBotsClient.ChatBotsClient (IApiClient apiClient,
Instance instance 
)
+
+ +

Construct a ChatBotsClient

+
Parameters
+ + + +
apiClientThe value of apiClient
instanceThe value of instance
+
+
+ +

Definition at line 28 of file ChatBotsClient.cs.

+
29  {
30  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
31  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
32  }
readonly Instance instance
The Instance for the ChatBotsClient
+
readonly IApiClient apiClient
The IApiClient for the ChatBotsClient
+
+

References Tgstation.Server.Client.Components.ChatBotsClient.apiClient, and Tgstation.Server.Client.Components.ChatBotsClient.instance.

+ +
+
+

Member Function Documentation

+ +

◆ ChatBot() [1/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<ChatBot> Tgstation.Server.Client.Components.ChatBotsClient.ChatBot (Routes. Chat,
settings ?? throw new  ArgumentNullExceptionnameof(settings),
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +

◆ ChatBot() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<ChatBot> Tgstation.Server.Client.Components.ChatBotsClient.ChatBot (Routes. Chat,
settings ?? throw new  ArgumentNullExceptionnameof(settings),
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +

◆ Create()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<ChatBot> Tgstation.Server.Client.Components.ChatBotsClient.Create (ChatBot settings,
CancellationToken cancellationToken 
)
+
+ +

Create a ChatBot

+ +

Implements Tgstation.Server.Client.Components.IChatBotsClient.

+ +
+
+ +

◆ Delete()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.Components.ChatBotsClient.Delete (ChatBot settings,
CancellationToken cancellationToken 
)
+
+ +

Delete a ChatBot

+ +

Implements Tgstation.Server.Client.Components.IChatBotsClient.

+ +
+
+ +

◆ GetId()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<ChatBot> Tgstation.Server.Client.Components.ChatBotsClient.GetId (ChatBot settings,
CancellationToken cancellationToken 
)
+
+ +

Get a ChatBot's setttings

+ +

Implements Tgstation.Server.Client.Components.IChatBotsClient.

+ +
+
+ +

◆ List()

+ +
+
+ + + + + + + + +
Task<IReadOnlyList<ChatBot> > Tgstation.Server.Client.Components.ChatBotsClient.List (CancellationToken cancellationToken)
+
+ +

List the ChatBots

+ +

Implements Tgstation.Server.Client.Components.IChatBotsClient.

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<ChatBot> Tgstation.Server.Client.Components.ChatBotsClient.Update (ChatBot settings,
CancellationToken cancellationToken 
)
+
+ +

Updates a ChatBot's setttings

+ +

Implements Tgstation.Server.Client.Components.IChatBotsClient.

+ +
+
+

Member Data Documentation

+ +

◆ apiClient

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.Components.ChatBotsClient.apiClient
+
+private
+
+ +

The IApiClient for the ChatBotsClient

+ +

Definition at line 16 of file ChatBotsClient.cs.

+ +

Referenced by Tgstation.Server.Client.Components.ChatBotsClient.ChatBotsClient().

+ +
+
+ +

◆ instance

+ +
+
+ + + + + +
+ + + + +
readonly Instance Tgstation.Server.Client.Components.ChatBotsClient.instance
+
+private
+
+ +

The Instance for the ChatBotsClient

+ +

Definition at line 21 of file ChatBotsClient.cs.

+ +

Referenced by Tgstation.Server.Client.Components.ChatBotsClient.ChatBotsClient().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.png b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.png new file mode 100644 index 0000000000000000000000000000000000000000..95b3e1d5634003cd20a89514b89e57cbbe9ad4d8 GIT binary patch literal 1135 zcmeAS@N?(olHy`uVBq!ia0y~yVAKb)12~w0WIZ#p7m$(&@CkAK|NlRb`Qpvj(*8pe zfGjXRaNq!I=N)+ zzsh2e5VU=@&YvT-mm8AbFqdtUIbOJ=@3Do`qX|ox%PR0ALS+K`V z+VY~udy?JiTUF0W-$~a`dJ|Fc^Y>Lw{p}7d-0Q_3d{29BIphDio5mB$Y`(?KIY0fO zh3TwYPcMht<_lNFuH6}bu8l!V+)Qut{Eh2oei8W9J&_|l?)vVs6)X6Y13upRyvF;l z|LMf8v@cI@#H>!QJND*TWyo<877n_{@_c3Vt{nx&&EvJe+KP}5K z-|2a@=ls`<{rztb2kg%KopfgUof@9C%k4sQ+k`gQE?H{$!+4|rWohxlweq*8oJ_g3 zq&~vl#p2VZzaEq3Ejiv|@_APEP8C~+{->d~HZZYl z^r+xlFaFs4>1T~I_0Qi_GQDkivvVnx?cP2bfNPM&14lOefmApKo;u^e%d}qu2qGPU39W zW$LV(Q&nHT}q@9Z$EeKCZea{`d6r*$#WJE#7)J z?niDp=hUZb7xVws7P + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Components.ConfigurationClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.Components.ConfigurationClient, including all inherited members.

+ + + + + + + + + + + + +
apiClientTgstation.Server.Client.Components.ConfigurationClientprivate
ConfigurationClient(IApiClient apiClient, Instance instance)Tgstation.Server.Client.Components.ConfigurationClient
ConfigurationFile(Routes.Configuration, directory, instance.Id, cancellationToken)Tgstation.Server.Client.Components.ConfigurationClientprivate
ConfigurationFile(Routes.Configuration, file ?? throw new ArgumentNullException(nameof(file)), instance.Id, cancellationToken)Tgstation.Server.Client.Components.ConfigurationClientprivate
CreateDirectory(ConfigurationFile directory, CancellationToken cancellationToken)Tgstation.Server.Client.Components.ConfigurationClient
DeleteEmptyDirectory(ConfigurationFile directory, CancellationToken cancellationToken)Tgstation.Server.Client.Components.ConfigurationClient
instanceTgstation.Server.Client.Components.ConfigurationClientprivate
List(string directory, CancellationToken cancellationToken)Tgstation.Server.Client.Components.ConfigurationClient
Read(ConfigurationFile file, CancellationToken cancellationToken)Tgstation.Server.Client.Components.ConfigurationClient
SanitizeGetPath(string path)Tgstation.Server.Client.Components.ConfigurationClientprivatestatic
Write(ConfigurationFile file, CancellationToken cancellationToken)Tgstation.Server.Client.Components.ConfigurationClient
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html new file mode 100644 index 0000000000..cf7c114fcf --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html @@ -0,0 +1,559 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components.ConfigurationClient Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components.ConfigurationClient Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Client.Components.ConfigurationClient:
+
+
+ + +Tgstation.Server.Client.Components.IConfigurationClient + +
+ + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ConfigurationClient (IApiClient apiClient, Instance instance)
 Construct a ConfigurationClient More...
 
Task DeleteEmptyDirectory (ConfigurationFile directory, CancellationToken cancellationToken)
 Delete an empty directory More...
 
Task< ConfigurationFileCreateDirectory (ConfigurationFile directory, CancellationToken cancellationToken)
 Creates an empty directory More...
 
Task< IReadOnlyList< ConfigurationFile > > List (string directory, CancellationToken cancellationToken)
 List configuration files More...
 
Task< ConfigurationFileRead (ConfigurationFile file, CancellationToken cancellationToken)
 Read a ConfigurationFile file More...
 
Task< ConfigurationFileWrite (ConfigurationFile file, CancellationToken cancellationToken)
 Overwrite a ConfigurationFile file More...
 
+ + + + + +

+Private Member Functions

Task< ConfigurationFileConfigurationFile (Routes.Configuration, directory, instance.Id, cancellationToken)
 
Task< ConfigurationFileConfigurationFile (Routes.Configuration, file ?? throw new ArgumentNullException(nameof(file)), instance.Id, cancellationToken)
 
+ + + + +

+Static Private Member Functions

static string SanitizeGetPath (string path)
 Sanitize a ConfigurationFile path for use in a GET Uri More...
 
+ + + + + + + +

+Private Attributes

readonly IApiClient apiClient
 The IApiClient for the ConfigurationClient More...
 
readonly Instance instance
 The Instance for the ConfigurationClient More...
 
+

Detailed Description

+
+

Definition at line 11 of file ConfigurationClient.cs.

+

Constructor & Destructor Documentation

+ +

◆ ConfigurationClient()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.Components.ConfigurationClient.ConfigurationClient (IApiClient apiClient,
Instance instance 
)
+
+ +

Construct a ConfigurationClient

+
Parameters
+ + + +
apiClientThe value of apiClient
instanceThe value of instance
+
+
+ +

Definition at line 42 of file ConfigurationClient.cs.

+
43  {
44  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
45  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
46  }
readonly IApiClient apiClient
The IApiClient for the ConfigurationClient
+
readonly Instance instance
The Instance for the ConfigurationClient
+
+

References Tgstation.Server.Client.Components.ConfigurationClient.apiClient, and Tgstation.Server.Client.Components.ConfigurationClient.instance.

+ +
+
+

Member Function Documentation

+ +

◆ ConfigurationFile() [1/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<ConfigurationFile> Tgstation.Server.Client.Components.ConfigurationClient.ConfigurationFile (Routes. Configuration,
directory ,
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +

◆ ConfigurationFile() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<ConfigurationFile> Tgstation.Server.Client.Components.ConfigurationClient.ConfigurationFile (Routes. Configuration,
file ?? throw new  ArgumentNullExceptionnameof(file),
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +

◆ CreateDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<ConfigurationFile> Tgstation.Server.Client.Components.ConfigurationClient.CreateDirectory (ConfigurationFile directory,
CancellationToken cancellationToken 
)
+
+ +

Creates an empty directory

+ +

Implements Tgstation.Server.Client.Components.IConfigurationClient.

+ +
+
+ +

◆ DeleteEmptyDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.Components.ConfigurationClient.DeleteEmptyDirectory (ConfigurationFile directory,
CancellationToken cancellationToken 
)
+
+ +

Delete an empty directory

+ +

Implements Tgstation.Server.Client.Components.IConfigurationClient.

+ +
+
+ +

◆ List()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<IReadOnlyList<ConfigurationFile> > Tgstation.Server.Client.Components.ConfigurationClient.List (string directory,
CancellationToken cancellationToken 
)
+
+ +

List configuration files

+ +

Implements Tgstation.Server.Client.Components.IConfigurationClient.

+ +
+
+ +

◆ Read()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<ConfigurationFile> Tgstation.Server.Client.Components.ConfigurationClient.Read (ConfigurationFile file,
CancellationToken cancellationToken 
)
+
+ +

Read a ConfigurationFile file

+ +

Implements Tgstation.Server.Client.Components.IConfigurationClient.

+ +

Definition at line 58 of file ConfigurationClient.cs.

+
59  {
60  if (file == null)
61  throw new ArgumentNullException(nameof(file));
62  return apiClient.Read<ConfigurationFile>(Routes.ConfigurationFile + SanitizeGetPath(file.Path), instance.Id, cancellationToken);
63  }
readonly IApiClient apiClient
The IApiClient for the ConfigurationClient
+
string Path
The path to the ConfigurationFile file
+
Routes to a server actions
Definition: Routes.cs:9
+
readonly Instance instance
The Instance for the ConfigurationClient
+
static string SanitizeGetPath(string path)
Sanitize a ConfigurationFile path for use in a GET Uri
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Represents a game configuration file. Create and delete actions uncerimonuously overwrite/delete file...
+
const string ConfigurationFile
Full combination of Configuration and File
Definition: Routes.cs:59
+
+

References Tgstation.Server.Client.Components.ConfigurationClient.apiClient, Tgstation.Server.Api.Routes.ConfigurationFile, Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Client.Components.ConfigurationClient.instance, Tgstation.Server.Api.Models.ConfigurationFile.Path, and Tgstation.Server.Client.Components.ConfigurationClient.SanitizeGetPath().

+ +
+
+ +

◆ SanitizeGetPath()

+ +
+
+ + + + + +
+ + + + + + + + +
static string Tgstation.Server.Client.Components.ConfigurationClient.SanitizeGetPath (string path)
+
+staticprivate
+
+ +

Sanitize a ConfigurationFile path for use in a GET Uri

+
Parameters
+ + +
pathThe path to sanitize
+
+
+
Returns
The sanitized path
+ +

Definition at line 28 of file ConfigurationClient.cs.

+
29  {
30  if (path == null)
31  path = String.Empty;
32  if (path.Length == 0 || path[0] != '/')
33  path = '/' + path;
34  return path;
35  }
+

Referenced by Tgstation.Server.Client.Components.ConfigurationClient.Read().

+ +
+
+ +

◆ Write()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<ConfigurationFile> Tgstation.Server.Client.Components.ConfigurationClient.Write (ConfigurationFile file,
CancellationToken cancellationToken 
)
+
+ +

Overwrite a ConfigurationFile file

+ +

Implements Tgstation.Server.Client.Components.IConfigurationClient.

+ +
+
+

Member Data Documentation

+ +

◆ apiClient

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.Components.ConfigurationClient.apiClient
+
+private
+
+
+ +

◆ instance

+ +
+
+ + + + + +
+ + + + +
readonly Instance Tgstation.Server.Client.Components.ConfigurationClient.instance
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.png b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.png new file mode 100644 index 0000000000000000000000000000000000000000..7a4820e62ea2f0de995f826a52132f03249fdb88 GIT binary patch literal 1186 zcmeAS@N?(olHy`uVBq!ia0y~yVDtpC12~w0$>^=;n!6Vt!%vi^^y`@ZE}d-A8wJ!q1e zt*rN@?5h#_d%o?R>^~`2*wg;{=_h#ySl))Nb?rl_+-TTJc zaQUqE`8!`dG7JuP*Pdz{nV#U4SZld6Dq{8K%D=S{)2fdC_9)t(JiDtejY+FwH`}c9 z`%Wv~d|s6F?c&}?SH0)mZ(Q;}=y~afy_?FdUQDoYvyL`aKD^08Dn;Jkqb$|`>iWfd z<^RX*|FF)qGU`x`qd)+@R0m|B2sn<@rt8zyA_%Xe;d_VijGAH}H&U2Ty zU+)q3v97Fq`|6eRe!o4pX?eq5x81FYyU)Cne82yn(Cg2V@14IZxo&q~7IWA&qdx1- zqATI|swaKBGkHn=rTGzEzE+cD@`XKrF||f_tuKz6{JU?$68)e(%RgA{y{qe~=~?BD z5;Nc^;-7STTkgu-+uN#{epLNsSi+E}<;leI;<u8SgXP*u=ojw zz(OERQ~aO(WRREV)Sy$ofeb+mz~saTOi2iQ#p4<`hsCXrKYpBcx7*M1AiMu-(bm55 zPmIfY@7;A-zb<0`IqzfDQ4P82$;z*E7><7yJA9Z+Lw))8hSnv^Plt)6cca zqdS~|=|{SC@yrIUefw^!9jN)zA;J4~=bRa}CHhrgCq2LJZxUi`VYBjcSK<68f(19E zdP^qrO^N*Wu_a}Dp&G;MjQ7Vad-e8Y$j+;%wtO+!q~_JMh>3U7SIC|+&Ak3}LQbc> zy5-UWzqzYbu9wCc);WDDDK9_0)jPwpYP#qAiaX5mYfgSOtLlH^IXAqgzRK^H%5KjY z-}`!FcgcQ|eS1mG-uKD8$&W8S0lM_Z&%1Z?mRG&oo_%^A(>JNNVr_4Yq%-y~{q|mS zKK%{<-ENV~$J=H+ezVEmG%xVE_G96bKX2dr7TU!y2)^6zB~ zKa^Oje>E%Jy~{g+slwS)NWlpi^G{kjWs=s?Db>IDUuL`LeEgo%11wM&JYD@<);T3K F0RW}VDRuw= literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client-members.html b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client-members.html new file mode 100644 index 0000000000..5993919c6b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client-members.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Components.DreamDaemonClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.Components.DreamDaemonClient, including all inherited members.

+ + + + + + + + + + +
apiClientTgstation.Server.Client.Components.DreamDaemonClientprivate
DreamDaemon(Routes.DreamDaemon, dreamDaemon ?? throw new ArgumentNullException(nameof(dreamDaemon)), instance.Id, cancellationToken)Tgstation.Server.Client.Components.DreamDaemonClientprivate
DreamDaemonClient(IApiClient apiClient, Instance instance)Tgstation.Server.Client.Components.DreamDaemonClient
instanceTgstation.Server.Client.Components.DreamDaemonClientprivate
Read(CancellationToken cancellationToken)Tgstation.Server.Client.Components.DreamDaemonClient
Restart(CancellationToken cancellationToken)Tgstation.Server.Client.Components.DreamDaemonClient
Shutdown(CancellationToken cancellationToken)Tgstation.Server.Client.Components.DreamDaemonClient
Start(CancellationToken cancellationToken)Tgstation.Server.Client.Components.DreamDaemonClient
Update(DreamDaemon dreamDaemon, CancellationToken cancellationToken)Tgstation.Server.Client.Components.DreamDaemonClient
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html new file mode 100644 index 0000000000..9ff8b0f3e5 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html @@ -0,0 +1,411 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components.DreamDaemonClient Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components.DreamDaemonClient Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Client.Components.DreamDaemonClient:
+
+
+ + +Tgstation.Server.Client.Components.IDreamDaemonClient + +
+ + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 DreamDaemonClient (IApiClient apiClient, Instance instance)
 Construct a DreamDaemonClient More...
 
Task Shutdown (CancellationToken cancellationToken)
 Shutdown DreamDaemon More...
 
Task< JobStart (CancellationToken cancellationToken)
 Start DreamDaemon More...
 
Task< JobRestart (CancellationToken cancellationToken)
 Restart DreamDaemon More...
 
Task< DreamDaemonRead (CancellationToken cancellationToken)
 Get the DreamDaemon represented by the IDreamDaemonClient More...
 
Task< DreamDaemonUpdate (DreamDaemon dreamDaemon, CancellationToken cancellationToken)
 Update DreamDaemon. This may trigger Api.Models.Internal.DreamDaemonSettings.SoftRestart More...
 
+ + + +

+Private Member Functions

Task< DreamDaemonDreamDaemon (Routes.DreamDaemon, dreamDaemon ?? throw new ArgumentNullException(nameof(dreamDaemon)), instance.Id, cancellationToken)
 
+ + + + + + + +

+Private Attributes

readonly IApiClient apiClient
 The IApiClient for the DreamDaemonClient More...
 
readonly Instance instance
 The Instance for the DreamDaemonClient More...
 
+

Detailed Description

+
+

Definition at line 10 of file DreamDaemonClient.cs.

+

Constructor & Destructor Documentation

+ +

◆ DreamDaemonClient()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.Components.DreamDaemonClient.DreamDaemonClient (IApiClient apiClient,
Instance instance 
)
+
+ +

Construct a DreamDaemonClient

+
Parameters
+ + + +
apiClientThe value of apiClient
instanceThe value of instance
+
+
+ +

Definition at line 27 of file DreamDaemonClient.cs.

+
28  {
29  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
30  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
31  }
readonly Instance instance
The Instance for the DreamDaemonClient
+
readonly IApiClient apiClient
The IApiClient for the DreamDaemonClient
+
+

References Tgstation.Server.Client.Components.DreamDaemonClient.apiClient, and Tgstation.Server.Client.Components.DreamDaemonClient.instance.

+ +
+
+

Member Function Documentation

+ +

◆ DreamDaemon()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<DreamDaemon> Tgstation.Server.Client.Components.DreamDaemonClient.DreamDaemon (Routes. DreamDaemon,
dreamDaemon ?? throw new  ArgumentNullExceptionnameof(dreamDaemon),
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +

◆ Read()

+ +
+
+ + + + + + + + +
Task<DreamDaemon> Tgstation.Server.Client.Components.DreamDaemonClient.Read (CancellationToken cancellationToken)
+
+ +

Get the DreamDaemon represented by the IDreamDaemonClient

+ +

Implements Tgstation.Server.Client.Components.IDreamDaemonClient.

+ +
+
+ +

◆ Restart()

+ +
+
+ + + + + + + + +
Task<Job> Tgstation.Server.Client.Components.DreamDaemonClient.Restart (CancellationToken cancellationToken)
+
+ +

Restart DreamDaemon

+ +

Implements Tgstation.Server.Client.Components.IDreamDaemonClient.

+ +
+
+ +

◆ Shutdown()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Client.Components.DreamDaemonClient.Shutdown (CancellationToken cancellationToken)
+
+ +

Shutdown DreamDaemon

+ +

Implements Tgstation.Server.Client.Components.IDreamDaemonClient.

+ +
+
+ +

◆ Start()

+ +
+
+ + + + + + + + +
Task<Job> Tgstation.Server.Client.Components.DreamDaemonClient.Start (CancellationToken cancellationToken)
+
+ +

Start DreamDaemon

+ +

Implements Tgstation.Server.Client.Components.IDreamDaemonClient.

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<DreamDaemon> Tgstation.Server.Client.Components.DreamDaemonClient.Update (DreamDaemon dreamDaemon,
CancellationToken cancellationToken 
)
+
+
+

Member Data Documentation

+ +

◆ apiClient

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.Components.DreamDaemonClient.apiClient
+
+private
+
+
+ +

◆ instance

+ +
+
+ + + + + +
+ + + + +
readonly Instance Tgstation.Server.Client.Components.DreamDaemonClient.instance
+
+private
+
+ +

The Instance for the DreamDaemonClient

+ +

Definition at line 20 of file DreamDaemonClient.cs.

+ +

Referenced by Tgstation.Server.Client.Components.DreamDaemonClient.DreamDaemonClient().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.png b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.png new file mode 100644 index 0000000000000000000000000000000000000000..fe211a87df37eda27cf1b8bfec7a3e3da42c5846 GIT binary patch literal 1201 zcmeAS@N?(olHy`uVBq!ia0y~yU40lTxuoWM8I5jnL+NDi8-hB}&D^)xtwH8d8vVuv=vlGsE<#79# z^2sfaKmNRLaE*Q0bQR5OV$zjwW#9ksG&;NYTYaB(*!HG-QB9T$H*aLt@|^tdSAN=+ zuk-X9ZETX0_X$L;3Q{fgMYE8anHW~aK|p5^3%!`!5uup2z`(?sEo%_Uh zA%ipBLErmc?yA|Rn0nty=i7uGVORgMX~m(-E7h+1>EzG5kjW`u>zuscpR)bbJ-xQR zr5~(stvxk=|H5Q7#S7w(AAedmy`c2;`|aWXUEW`xrLS6kI$C}IGCAv*iT~z(u2cKI z@b{5J>vlxne7#Fwo#WN^`TtdZbH?i)WZrt;#q*b1ZKBsCkqj2AIEzVNSbxPX*lVKl zvir+n2UTD^&0pEz6|{(Jg^KDb7~>UZN#wMpTXarOQfiogfq4PTgvCr;6P6!e+`+VD zWdqZbmnS!OFr@%lOI8&ysjO>; zr8SQ}Y92lPCwW1h-gAQmMjp}zC+y-FN>fc3ZTtKF`CK*AFpy=-*kQK(N09*=BpsF9 zUh%j2t}i?#2~OMNd362Jse3-}W;QwXpXo*F$=$W3ZDJWE_bVQ6RI;;J_}o==o}bjZ zxj*jOEDZiPzYdg;ticKCY#BHq$(N=1D6{-Zs)@OseM@}%pSs4c>%Y`({+U&@eNXA9 z)2}uj)_wWj@_qUx`Ca}xea;v4 + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Components.DreamMakerClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.Components.DreamMakerClient, including all inherited members.

+ + + + + + + + + + +
apiClientTgstation.Server.Client.Components.DreamMakerClientprivate
Compile(CancellationToken cancellationToken)Tgstation.Server.Client.Components.DreamMakerClient
DreamMaker(Routes.DreamMaker, dreamMaker ?? throw new ArgumentNullException(nameof(dreamMaker)), instance.Id, cancellationToken)Tgstation.Server.Client.Components.DreamMakerClientprivate
DreamMakerClient(IApiClient apiClient, Instance instance)Tgstation.Server.Client.Components.DreamMakerClient
GetCompileJob(CompileJob compileJob, CancellationToken cancellationToken)Tgstation.Server.Client.Components.DreamMakerClient
GetJobIds(CancellationToken cancellationToken)Tgstation.Server.Client.Components.DreamMakerClient
instanceTgstation.Server.Client.Components.DreamMakerClientprivate
Read(CancellationToken cancellationToken)Tgstation.Server.Client.Components.DreamMakerClient
Update(DreamMaker dreamMaker, CancellationToken cancellationToken)Tgstation.Server.Client.Components.DreamMakerClient
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html new file mode 100644 index 0000000000..b00df4c9b5 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html @@ -0,0 +1,421 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components.DreamMakerClient Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components.DreamMakerClient Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Client.Components.DreamMakerClient:
+
+
+ + +Tgstation.Server.Client.Components.IDreamMakerClient + +
+ + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 DreamMakerClient (IApiClient apiClient, Instance instance)
 Construct a DreamMakerClient More...
 
Task< JobCompile (CancellationToken cancellationToken)
 Compile the current repository revision More...
 
Task< CompileJobGetCompileJob (CompileJob compileJob, CancellationToken cancellationToken)
 Get a compileJob More...
 
Task< IReadOnlyList< CompileJob > > GetJobIds (CancellationToken cancellationToken)
 Gets the Api.Models.Internal.CompileJob.Ids of all CompileJobs for the instance More...
 
Task< DreamMakerRead (CancellationToken cancellationToken)
 Get the DreamMaker information More...
 
Task< DreamMakerUpdate (DreamMaker dreamMaker, CancellationToken cancellationToken)
 Updates the DreamMaker setttings More...
 
+ + + +

+Private Member Functions

Task< DreamMakerDreamMaker (Routes.DreamMaker, dreamMaker ?? throw new ArgumentNullException(nameof(dreamMaker)), instance.Id, cancellationToken)
 
+ + + + + + + +

+Private Attributes

readonly IApiClient apiClient
 The IApiClient for the DreamMakerClient More...
 
readonly Instance instance
 The Instance for the DreamMakerClient More...
 
+

Detailed Description

+
+

Definition at line 11 of file DreamMakerClient.cs.

+

Constructor & Destructor Documentation

+ +

◆ DreamMakerClient()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.Components.DreamMakerClient.DreamMakerClient (IApiClient apiClient,
Instance instance 
)
+
+ +

Construct a DreamMakerClient

+
Parameters
+ + + +
apiClientThe value of apiClient
instanceThe value of Instance
+
+
+ +

Definition at line 28 of file DreamMakerClient.cs.

+
29  {
30  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
31  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
32  }
readonly IApiClient apiClient
The IApiClient for the DreamMakerClient
+
readonly Instance instance
The Instance for the DreamMakerClient
+
+

References Tgstation.Server.Client.Components.DreamMakerClient.apiClient, and Tgstation.Server.Client.Components.DreamMakerClient.instance.

+ +
+
+

Member Function Documentation

+ +

◆ Compile()

+ +
+
+ + + + + + + + +
Task<Job> Tgstation.Server.Client.Components.DreamMakerClient.Compile (CancellationToken cancellationToken)
+
+ +

Compile the current repository revision

+ +

Implements Tgstation.Server.Client.Components.IDreamMakerClient.

+ +
+
+ +

◆ DreamMaker()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<DreamMaker> Tgstation.Server.Client.Components.DreamMakerClient.DreamMaker (Routes. DreamMaker,
dreamMaker ?? throw new  ArgumentNullExceptionnameof(dreamMaker),
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +

◆ GetCompileJob()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<CompileJob> Tgstation.Server.Client.Components.DreamMakerClient.GetCompileJob (CompileJob compileJob,
CancellationToken cancellationToken 
)
+
+ +

Get a compileJob

+ +

Implements Tgstation.Server.Client.Components.IDreamMakerClient.

+ +
+
+ +

◆ GetJobIds()

+ +
+
+ + + + + + + + +
Task<IReadOnlyList<CompileJob> > Tgstation.Server.Client.Components.DreamMakerClient.GetJobIds (CancellationToken cancellationToken)
+
+ +

Gets the Api.Models.Internal.CompileJob.Ids of all CompileJobs for the instance

+ +

Implements Tgstation.Server.Client.Components.IDreamMakerClient.

+ +
+
+ +

◆ Read()

+ +
+
+ + + + + + + + +
Task<DreamMaker> Tgstation.Server.Client.Components.DreamMakerClient.Read (CancellationToken cancellationToken)
+
+ +

Get the DreamMaker information

+ +

Implements Tgstation.Server.Client.Components.IDreamMakerClient.

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<DreamMaker> Tgstation.Server.Client.Components.DreamMakerClient.Update (DreamMaker dreamMaker,
CancellationToken cancellationToken 
)
+
+ +

Updates the DreamMaker setttings

+ +

Implements Tgstation.Server.Client.Components.IDreamMakerClient.

+ +
+
+

Member Data Documentation

+ +

◆ apiClient

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.Components.DreamMakerClient.apiClient
+
+private
+
+
+ +

◆ instance

+ +
+
+ + + + + +
+ + + + +
readonly Instance Tgstation.Server.Client.Components.DreamMakerClient.instance
+
+private
+
+ +

The Instance for the DreamMakerClient

+ +

Definition at line 21 of file DreamMakerClient.cs.

+ +

Referenced by Tgstation.Server.Client.Components.DreamMakerClient.DreamMakerClient().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.png b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.png new file mode 100644 index 0000000000000000000000000000000000000000..0baf38f3ba82caea3f60055fe34acfefb075d416 GIT binary patch literal 1200 zcmeAS@N?(olHy`uVBq!ia0y~yU~~hr12~w0WY9;Q4?s#Hz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-op$ow4m$g^i5Z=TqBqqqA;r(^WF_^zyv)+pA}iNLbR8B^!hmtF%s) zP}N-1wegMpB%jyQ`~SC9e?9hPg38*`p4iH*ec^vpWiEQ zAssV&`@h+r*CkJPy#HZx%I%hqeODQ8eTcIuRQ}QO@!=2mx_JN3+3)X$FWq}B>|$Ll z&zIP`6?^wqU)^Q6d1ZP3!QqrAb|T=CRrz%y{r-_fwh0zvs=)eX~m}bJoY-66)QX zeRD7Uco{P3S=im*>ui9^4p;14dH2*Vs|^z8`3`4FyRZ6K#H_0w=;|yTXV|u1_|Mw> z$5M-<8^6w*(3NRC@#6aJ(bd)e%=$e2rajMDcJE26Z?6BVGO?@tMfPXzq!p@fE&XJ? zGP#}k{QRhU=co0&x7)bEcwN}p9sdl!n(x{g_2u(UzITSV^5?45PO>wYwB(*!&*P7Z zp7IOw4@azyoMh(_-yS$AXwsK1cmy5M@Jv*7^W=KnSO|>At+}_w1P&~J&91;I5SYZ$ z@#?v{B@@e33C2ZL0X}^UhN^B2{};4y2!tiEaA+GcwE$%fdG#;=O=#F4r0fvUDX6gK z2&K~3%oB8$P6^Rm>f*xa!MJBVnt@pouREE)T+^5Tzqax`KjRu$f?~LQC%OA1L&a6b zyjcu>+k@h(VtzwYQ{?>*%sHPW-v5wU!2ABFaCwlvft}C)2mkF}*1g^P`_LBi+ghvY zj^Dbu?%~|Y;kvTI%kJ5-$*=#ysMf6*zFp$jbr#vh+B*}C&I9$yMdmENFkA9L*p`Kx z`)_PWR(QWvqWI2T@e4e=cS!YK>)f^SVT}8hE6*;bue>htyJ22t%Bxpw8jzHf3Q0-J z=9*?0g=}ld-GxYnu z)xGH}^$p_kvbOIycOl8fnt%CS@s-Cu^KMz=!sRUe=lGNIp#8sdW0Fg>H{25o@QKdp zKL}1p5&ee8PTrd1dwKSrZ7bh;-tAlb%lF;$nYZ=dE!pN*XH@#8;MvdM)4y-7`gm7e zY_G_jhxtCfe|y8$iv3Ml7wj*=K950uF@MjK$GnWkA2UB-{*o(^?Z{j+VIQBe1J?sq mv`D|koUFNYiI=A8f_mk4=Lrdq&UFKe7Y0vPKbLh*2~7ZdmpKmr literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client-members.html b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client-members.html new file mode 100644 index 0000000000..25297ea2b2 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client-members.html @@ -0,0 +1,96 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Components.InstanceClient Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html new file mode 100644 index 0000000000..da5171eb91 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html @@ -0,0 +1,493 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components.InstanceClient Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components.InstanceClient Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Client.Components.InstanceClient:
+
+
+ + +Tgstation.Server.Client.Components.IInstanceClient + +
+ + + + + +

+Public Member Functions

 InstanceClient (IApiClient apiClient, Instance instance)
 Construct a InstanceClient More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

Instance Metadata [get]
 
IByondClient Byond [get]
 
IRepositoryClient Repository [get]
 
IDreamDaemonClient DreamDaemon [get]
 
IConfigurationClient Configuration [get]
 
IInstanceUserClient Users [get]
 
IChatBotsClient ChatBots [get]
 
IDreamMakerClient DreamMaker [get]
 
IJobsClient Jobs [get]
 
- Properties inherited from Tgstation.Server.Client.Components.IInstanceClient
Instance Metadata [get]
 The Instance used to create the IInstanceClient More...
 
IByondClient Byond [get]
 Access the IByondClient More...
 
IRepositoryClient Repository [get]
 Access the IRepositoryClient More...
 
IDreamDaemonClient DreamDaemon [get]
 Access the IDreamDaemonClient More...
 
IConfigurationClient Configuration [get]
 Access the IConfigurationClient More...
 
IInstanceUserClient Users [get]
 Access the IInstanceUserClient More...
 
IChatBotsClient ChatBots [get]
 Access the IChatBotsClient More...
 
IDreamMakerClient DreamMaker [get]
 Access the IDreamMakerClient More...
 
IJobsClient Jobs [get]
 Access the IJobsClient More...
 
+ + + + +

+Private Attributes

readonly IApiClient apiClient
 The IApiClient for the InstanceClient More...
 
+

Detailed Description

+
+

Definition at line 7 of file InstanceClient.cs.

+

Constructor & Destructor Documentation

+ +

◆ InstanceClient()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.Components.InstanceClient.InstanceClient (IApiClient apiClient,
Instance instance 
)
+
+ +

Construct a InstanceClient

+
Parameters
+ + + +
apiClientThe value of apiClient
instanceThe value of Metadata
+
+
+ +

Definition at line 46 of file InstanceClient.cs.

+
47  {
48  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
49  Metadata = instance ?? throw new ArgumentNullException(nameof(instance));
50 
51  Byond = new ByondClient(apiClient, instance);
52  Repository = new RepositoryClient(apiClient, instance);
53  DreamDaemon = new DreamDaemonClient(apiClient, instance);
54  Configuration = new ConfigurationClient(apiClient, instance);
55  Users = new InstanceUserClient(apiClient, instance);
56  ChatBots = new ChatBotsClient(apiClient, instance);
57  DreamMaker = new DreamMakerClient(apiClient, instance);
58  Jobs = new JobsClient(apiClient, instance);
59  }
+
Represents the state of the DreamMaker compiler. Create action starts a new compile....
Definition: DreamMaker.cs:8
+ +
readonly IApiClient apiClient
The IApiClient for the InstanceClient
+ + +
Represents a git repository
Definition: Repository.cs:8
+
Represents a BYOND installation
Definition: Byond.cs:8
+ +
Represents an instance of BYOND's DreamDaemon game server. Create action starts the server....
Definition: DreamDaemon.cs:8
+
+

References Tgstation.Server.Client.Components.InstanceClient.apiClient, Tgstation.Server.Client.Components.InstanceClient.ChatBots, Tgstation.Server.Client.Components.InstanceClient.Configuration, Tgstation.Server.Client.Components.InstanceClient.Jobs, Tgstation.Server.Client.Components.InstanceClient.Metadata, and Tgstation.Server.Client.Components.InstanceClient.Users.

+ +
+
+

Member Data Documentation

+ +

◆ apiClient

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.Components.InstanceClient.apiClient
+
+private
+
+ +

The IApiClient for the InstanceClient

+ +

Definition at line 39 of file InstanceClient.cs.

+ +

Referenced by Tgstation.Server.Client.Components.InstanceClient.InstanceClient().

+ +
+
+

Property Documentation

+ +

◆ Byond

+ +
+
+ + + + + +
+ + + + +
IByondClient Tgstation.Server.Client.Components.InstanceClient.Byond
+
+get
+
+ +

+ +

Definition at line 13 of file InstanceClient.cs.

+
13 { get; }
+
+
+ +

◆ ChatBots

+ +
+
+ + + + + +
+ + + + +
IChatBotsClient Tgstation.Server.Client.Components.InstanceClient.ChatBots
+
+get
+
+ +

+ +

Definition at line 28 of file InstanceClient.cs.

+
28 { get; }
+

Referenced by Tgstation.Server.Client.Components.InstanceClient.InstanceClient().

+ +
+
+ +

◆ Configuration

+ +
+
+ + + + + +
+ + + + +
IConfigurationClient Tgstation.Server.Client.Components.InstanceClient.Configuration
+
+get
+
+ +

+ +

Definition at line 22 of file InstanceClient.cs.

+
22 { get; }
+

Referenced by Tgstation.Server.Client.Components.InstanceClient.InstanceClient().

+ +
+
+ +

◆ DreamDaemon

+ +
+
+ + + + + +
+ + + + +
IDreamDaemonClient Tgstation.Server.Client.Components.InstanceClient.DreamDaemon
+
+get
+
+ +

+ +

Definition at line 19 of file InstanceClient.cs.

+
19 { get; }
+
+
+ +

◆ DreamMaker

+ +
+
+ + + + + +
+ + + + +
IDreamMakerClient Tgstation.Server.Client.Components.InstanceClient.DreamMaker
+
+get
+
+ +

+ +

Definition at line 31 of file InstanceClient.cs.

+
31 { get; }
+
+
+ +

◆ Jobs

+ +
+
+ + + + + +
+ + + + +
IJobsClient Tgstation.Server.Client.Components.InstanceClient.Jobs
+
+get
+
+ +

+ +

Definition at line 34 of file InstanceClient.cs.

+
34 { get; }
+

Referenced by Tgstation.Server.Client.Components.InstanceClient.InstanceClient().

+ +
+
+ +

◆ Metadata

+ +
+
+ + + + + +
+ + + + +
Instance Tgstation.Server.Client.Components.InstanceClient.Metadata
+
+get
+
+ +

+ +

Definition at line 10 of file InstanceClient.cs.

+
10 { get; }
+

Referenced by Tgstation.Server.Client.Components.InstanceClient.InstanceClient().

+ +
+
+ +

◆ Repository

+ +
+
+ + + + + +
+ + + + +
IRepositoryClient Tgstation.Server.Client.Components.InstanceClient.Repository
+
+get
+
+ +

+ +

Definition at line 16 of file InstanceClient.cs.

+
16 { get; }
+
+
+ +

◆ Users

+ +
+
+ + + + + +
+ + + + +
IInstanceUserClient Tgstation.Server.Client.Components.InstanceClient.Users
+
+get
+
+ +

+ +

Definition at line 25 of file InstanceClient.cs.

+
25 { get; }
+

Referenced by Tgstation.Server.Client.Components.InstanceClient.InstanceClient().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.png b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.png new file mode 100644 index 0000000000000000000000000000000000000000..35ee52e3bbd0a8b7f2f3dd37c6919ca22f2bf4de GIT binary patch literal 1108 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!12~w0z$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opHrE68ioyD1w~G*`5!dOE7=cyehadIkmX zhTW`FnORm-_fPuRtpg^Wldj#$4c}LFT)2LcPw{23>^r;m@}Ez+_U7!tNlQHI{~o++ zdV6Z+>*`1TlXCxaYYW_CdF}kY|NVQD@7b^K-uQlbyX3~&_ig)5&%X8WY`C|2u~lw~ z`Mv317=83|V(Qo4ym^-Aa`p4t3gtDmuD3%kHwBo=?%Cua8hMVZgB zH;+zRM)j;&&d*sYc#r9t;j8d@1`;u@mlS?iGM;X=I%u^$?yqF_o1bZIrsorP9u$sX zJ2-9s^9|pG4Nl%!zvlFN!&&csR7XtieknCC_t?71l6$S?Y_C5_?J6#Mo|L#YYkRrP z+}EGa?ApzvK6~c%o|f;SXQK`mEj)Yu!mW8>JqPb!blP6HDw1EXSY^-Z>l^m7tUWWU z{jmDB%3o`iFJ66fhjub|O!tZ3#vA+fuirXabo_E!+w)zvLDwHvMr>pAyfphu-vqaa zEs5mxp48+OF-auk(4-{`gr=#mer*KC%*v?jy`l%W zzcNo?+7W(;spI8y^-RW=DH|A)er@oIVh~i-Y1kkn>JY%mt+1knRUqUL6NgqJBg@nc z3_!yefDzfSKuC;IY5mqvFU^%fUOUBE6<7iFxn$^ye~W$6qw#ayMq{ z&7FN)a<(gfx1qxO?8MFedB;=E=n5q#M-@@q4~{oRvq!T zEU)iWeNA7r@%3CD?sUb4~Bhvgy{6_g;N- zial<2P-+F^9=G)znN6l*`3>NN5y!O0UB8ue0@Dm&RHMYCe8kczleCsjiT=wh?_%en U_~MHNun1uAboFyt=akR{0Ml>=@&Et; literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client-members.html b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client-members.html new file mode 100644 index 0000000000..fed2ee8163 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client-members.html @@ -0,0 +1,96 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Components.InstanceUserClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.Components.InstanceUserClient, including all inherited members.

+ + + + + + + + + + + + +
apiClientTgstation.Server.Client.Components.InstanceUserClientprivate
Create(InstanceUser instanceUser, CancellationToken cancellationToken)Tgstation.Server.Client.Components.InstanceUserClient
Delete(InstanceUser instanceUser, CancellationToken cancellationToken)Tgstation.Server.Client.Components.InstanceUserClient
GetId(InstanceUser instanceUser, CancellationToken cancellationToken)Tgstation.Server.Client.Components.InstanceUserClient
instanceTgstation.Server.Client.Components.InstanceUserClientprivate
InstanceUser(Routes.InstanceUser, instanceUser ?? throw new ArgumentNullException(nameof(instanceUser)), instance.Id, cancellationToken)Tgstation.Server.Client.Components.InstanceUserClientprivate
InstanceUser(Routes.InstanceUser, instanceUser ?? throw new ArgumentNullException(nameof(instanceUser)), instance.Id, cancellationToken)Tgstation.Server.Client.Components.InstanceUserClientprivate
InstanceUserClient(IApiClient apiClient, Instance instance)Tgstation.Server.Client.Components.InstanceUserClient
List(CancellationToken cancellationToken)Tgstation.Server.Client.Components.InstanceUserClient
Read(CancellationToken cancellationToken)Tgstation.Server.Client.Components.InstanceUserClient
Update(InstanceUser instanceUser, CancellationToken cancellationToken)Tgstation.Server.Client.Components.InstanceUserClient
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html new file mode 100644 index 0000000000..436c49797b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html @@ -0,0 +1,516 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components.InstanceUserClient Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components.InstanceUserClient Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Client.Components.InstanceUserClient:
+
+
+ + +Tgstation.Server.Client.Components.IInstanceUserClient + +
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 InstanceUserClient (IApiClient apiClient, Instance instance)
 Construct an InstanceUserClient More...
 
Task< InstanceUserCreate (InstanceUser instanceUser, CancellationToken cancellationToken)
 Create a instanceUser More...
 
Task Delete (InstanceUser instanceUser, CancellationToken cancellationToken)
 Delete a instanceUser More...
 
Task< InstanceUserRead (CancellationToken cancellationToken)
 Get the InstanceUser associated with the logged on user More...
 
Task< InstanceUserUpdate (InstanceUser instanceUser, CancellationToken cancellationToken)
 Update a instanceUser More...
 
Task< IReadOnlyList< InstanceUser > > List (CancellationToken cancellationToken)
 Get the InstanceUsers in the Instance More...
 
Task< InstanceUserGetId (InstanceUser instanceUser, CancellationToken cancellationToken)
 Get a specific instanceUser More...
 
+ + + + + +

+Private Member Functions

Task< InstanceUserInstanceUser (Routes.InstanceUser, instanceUser ?? throw new ArgumentNullException(nameof(instanceUser)), instance.Id, cancellationToken)
 
Task< InstanceUserInstanceUser (Routes.InstanceUser, instanceUser ?? throw new ArgumentNullException(nameof(instanceUser)), instance.Id, cancellationToken)
 
+ + + + + + + +

+Private Attributes

readonly IApiClient apiClient
 The IApiClient for the InstanceUserClient More...
 
readonly Instance instance
 The Instance for the InstanceUserClient More...
 
+

Detailed Description

+
+

Definition at line 11 of file InstanceUserClient.cs.

+

Constructor & Destructor Documentation

+ +

◆ InstanceUserClient()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.Components.InstanceUserClient.InstanceUserClient (IApiClient apiClient,
Instance instance 
)
+
+ +

Construct an InstanceUserClient

+
Parameters
+ + + +
apiClientThe value of apiClient
instanceThe value of instance
+
+
+ +

Definition at line 28 of file InstanceUserClient.cs.

+
29  {
30  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
31  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
32  }
readonly IApiClient apiClient
The IApiClient for the InstanceUserClient
+
readonly Instance instance
The Instance for the InstanceUserClient
+
+

References Tgstation.Server.Client.Components.InstanceUserClient.apiClient, and Tgstation.Server.Client.Components.InstanceUserClient.instance.

+ +
+
+

Member Function Documentation

+ +

◆ Create()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<InstanceUser> Tgstation.Server.Client.Components.InstanceUserClient.Create (InstanceUser instanceUser,
CancellationToken cancellationToken 
)
+
+ +

Create a instanceUser

+ +

Implements Tgstation.Server.Client.Components.IInstanceUserClient.

+ +
+
+ +

◆ Delete()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.Components.InstanceUserClient.Delete (InstanceUser instanceUser,
CancellationToken cancellationToken 
)
+
+ +

Delete a instanceUser

+ +

Implements Tgstation.Server.Client.Components.IInstanceUserClient.

+ +
+
+ +

◆ GetId()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<InstanceUser> Tgstation.Server.Client.Components.InstanceUserClient.GetId (InstanceUser instanceUser,
CancellationToken cancellationToken 
)
+
+ +

Get a specific instanceUser

+ +

Implements Tgstation.Server.Client.Components.IInstanceUserClient.

+ +
+
+ +

◆ InstanceUser() [1/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<InstanceUser> Tgstation.Server.Client.Components.InstanceUserClient.InstanceUser (Routes. InstanceUser,
instanceUser ?? throw new  ArgumentNullExceptionnameof(instanceUser),
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +

◆ InstanceUser() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<InstanceUser> Tgstation.Server.Client.Components.InstanceUserClient.InstanceUser (Routes. InstanceUser,
instanceUser ?? throw new  ArgumentNullExceptionnameof(instanceUser),
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +

◆ List()

+ +
+
+ + + + + + + + +
Task<IReadOnlyList<InstanceUser> > Tgstation.Server.Client.Components.InstanceUserClient.List (CancellationToken cancellationToken)
+
+ +

Get the InstanceUsers in the Instance

+ +

Implements Tgstation.Server.Client.Components.IInstanceUserClient.

+ +
+
+ +

◆ Read()

+ +
+
+ + + + + + + + +
Task<InstanceUser> Tgstation.Server.Client.Components.InstanceUserClient.Read (CancellationToken cancellationToken)
+
+ +

Get the InstanceUser associated with the logged on user

+ +

Implements Tgstation.Server.Client.Components.IInstanceUserClient.

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<InstanceUser> Tgstation.Server.Client.Components.InstanceUserClient.Update (InstanceUser instanceUser,
CancellationToken cancellationToken 
)
+
+ +

Update a instanceUser

+ +

Implements Tgstation.Server.Client.Components.IInstanceUserClient.

+ +
+
+

Member Data Documentation

+ +

◆ apiClient

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.Components.InstanceUserClient.apiClient
+
+private
+
+
+ +

◆ instance

+ +
+
+ + + + + +
+ + + + +
readonly Instance Tgstation.Server.Client.Components.InstanceUserClient.instance
+
+private
+
+ +

The Instance for the InstanceUserClient

+ +

Definition at line 21 of file InstanceUserClient.cs.

+ +

Referenced by Tgstation.Server.Client.Components.InstanceUserClient.InstanceUserClient().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.png b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.png new file mode 100644 index 0000000000000000000000000000000000000000..542bbad55486d7bdae039bfa7a40e59a1c871f9b GIT binary patch literal 1179 zcmeAS@N?(olHy`uVBq!ia0y~yU~~hr12~w0WY9;Q4?s#Hz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opLp>H1b>$>9m@$*s7t-QO?PYVZ85>wDoa&f)~dRBa%mfS1x0iQPCDe( zGf5=uXvDYrNj|Up`}enPv@-CWv}9}FjnH-1K6=@CF58*eZ8~qsUunC}%Dg*sj#;)J z*6^IXPHg&-)k#d2V`pKXFfD&7mI;{<;4vpY=Qc{oVUs)`s6i-kx_~@cz@n zvWoMe{R=AdOTTc~P5Z*OOyt`2_|=7F#)rRLyP2c^?em!*9Ung=&F-o)W}I3TyI&iY2HTFjPo5LxGyPYNaoO2> znN7Vvt&g2Ih>Oemo_E)BgGBh%!|HPW|D~6Iyvb^H^UR)Qnudq#-bvKIzP;nv3!nAx zTS9zhZ#Q}N`t7y5^Y-=X*GYw3i8il4{3CQ}-qsa$FMI<(Uq2FJHv8nvjE&9*KZl-v zZhY_fs$G7CaT;&Z?v#AKeCpSZ`Pq-<7XQ8Gc}e{xv##f>+#?p#_&t9y)Jh+#nx*=( z`AeyUs-~*vdJUAANt&``gPg?n+}lC7x8*W2*6gZd2x1Uab!%8rS2s!7A)r%GVHNw) zCmaI7Ni09)rwA|tBa|T#D8E5S*&zZbyXFXoKv)tBhqfV8%Tx(UrGK&YES)k*Yw45@ z4F=7I@8|~dCa<+{$p8EC0+CcKh0}|icfEKXT4Eo z`mLt+z*eckfC!fs$wzFNUk7S&99(6=! z@o#REL~(z;i#PVp%kH}+@$y^c)2iN$>=ORnTXjz`@oefBm$*B1rolY-^>xege^#j< zZjw_DV6!c*?Yns3rv4GjV~@Y?xE-h-mzdLe|G34{55Ux;UUm?adOlmP(+8)Xs#vG) z!cg0qM<2iJFO<^Pzi`s;8LMxnq*?Ltuef}yr=3rK)8AS;_fUS-PGR%wf3|G0 z%X@a~YfIq+&JTva9K7${ODNEhXOLfze>j5Q + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Components.JobsClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.Components.JobsClient, including all inherited members.

+ + + + + + + + +
apiClientTgstation.Server.Client.Components.JobsClientprivate
Cancel(Job job, CancellationToken cancellationToken)Tgstation.Server.Client.Components.JobsClient
GetId(Job job, CancellationToken cancellationToken)Tgstation.Server.Client.Components.JobsClient
instanceTgstation.Server.Client.Components.JobsClientprivate
JobsClient(IApiClient apiClient, Instance instance)Tgstation.Server.Client.Components.JobsClient
List(CancellationToken cancellationToken)Tgstation.Server.Client.Components.JobsClient
ListActive(CancellationToken cancellationToken)Tgstation.Server.Client.Components.JobsClient
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html new file mode 100644 index 0000000000..76a5a48a93 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html @@ -0,0 +1,342 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components.JobsClient Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components.JobsClient Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Client.Components.JobsClient:
+
+
+ + +Tgstation.Server.Client.Components.IJobsClient + +
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

 JobsClient (IApiClient apiClient, Instance instance)
 Construct a JobsClient More...
 
Task Cancel (Job job, CancellationToken cancellationToken)
 Cancels a job More...
 
Task< IReadOnlyList< Job > > List (CancellationToken cancellationToken)
 List the Api.Models.Internal.Job.Ids in the Instance More...
 
Task< IReadOnlyList< Job > > ListActive (CancellationToken cancellationToken)
 List the active Jobs in the Instance More...
 
Task< JobGetId (Job job, CancellationToken cancellationToken)
 Get a job More...
 
+ + + + + + + +

+Private Attributes

readonly IApiClient apiClient
 The IApiClient for the JobsClient More...
 
readonly Instance instance
 The Instance for the JobsClient More...
 
+

Detailed Description

+
+

Definition at line 11 of file JobsClient.cs.

+

Constructor & Destructor Documentation

+ +

◆ JobsClient()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.Components.JobsClient.JobsClient (IApiClient apiClient,
Instance instance 
)
+
+ +

Construct a JobsClient

+
Parameters
+ + + +
apiClientThe value of apiClient
instanceThe value of Instance
+
+
+ +

Definition at line 28 of file JobsClient.cs.

+
29  {
30  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
31  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
32  }
readonly IApiClient apiClient
The IApiClient for the JobsClient
Definition: JobsClient.cs:16
+
readonly Instance instance
The Instance for the JobsClient
Definition: JobsClient.cs:21
+
+

References Tgstation.Server.Client.Components.JobsClient.apiClient, and Tgstation.Server.Client.Components.JobsClient.instance.

+ +
+
+

Member Function Documentation

+ +

◆ Cancel()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.Components.JobsClient.Cancel (Job job,
CancellationToken cancellationToken 
)
+
+ +

Cancels a job

+ +

Implements Tgstation.Server.Client.Components.IJobsClient.

+ +
+
+ +

◆ GetId()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<Job> Tgstation.Server.Client.Components.JobsClient.GetId (Job job,
CancellationToken cancellationToken 
)
+
+ +

Get a job

+ +

Implements Tgstation.Server.Client.Components.IJobsClient.

+ +
+
+ +

◆ List()

+ +
+
+ + + + + + + + +
Task<IReadOnlyList<Job> > Tgstation.Server.Client.Components.JobsClient.List (CancellationToken cancellationToken)
+
+ +

List the Api.Models.Internal.Job.Ids in the Instance

+ +

Implements Tgstation.Server.Client.Components.IJobsClient.

+ +
+
+ +

◆ ListActive()

+ +
+
+ + + + + + + + +
Task<IReadOnlyList<Job> > Tgstation.Server.Client.Components.JobsClient.ListActive (CancellationToken cancellationToken)
+
+ +

List the active Jobs in the Instance

+ +

Implements Tgstation.Server.Client.Components.IJobsClient.

+ +
+
+

Member Data Documentation

+ +

◆ apiClient

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.Components.JobsClient.apiClient
+
+private
+
+ +

The IApiClient for the JobsClient

+ +

Definition at line 16 of file JobsClient.cs.

+ +

Referenced by Tgstation.Server.Client.Components.JobsClient.JobsClient().

+ +
+
+ +

◆ instance

+ +
+
+ + + + + +
+ + + + +
readonly Instance Tgstation.Server.Client.Components.JobsClient.instance
+
+private
+
+ +

The Instance for the JobsClient

+ +

Definition at line 21 of file JobsClient.cs.

+ +

Referenced by Tgstation.Server.Client.Components.JobsClient.JobsClient().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.png b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.png new file mode 100644 index 0000000000000000000000000000000000000000..b8b81d3f3fcc6845e2b4f9f9bea2007621ae697d GIT binary patch literal 1053 zcmeAS@N?(olHy`uVBq!ia0y~yV3Yu|12~w0yBTqKO7-HBW{w)dgW_Rt*q~zRM*_{<<`duVjt#B4KUoiF!kP@{{^bH z*IK{tEC1x#^;Xt^e~nK;I50;-|Q4WwLQ$u!2R2eD%RKJ@kw{ zc6R2E=LyS1o@wm-RhyK``s|wq@Ahb$NXDMs;l+ggrG*o8DAd-r7*aON-(TG#FP+{ zz|h0R(-7FmXrN`l;Ks^!V8sCj383U+CT0pGzXT>kWv{&wl^to)AT%Kg)%3XuzhZe} z-d5H8ea?AKpRq!Aqu%wKAN}kUwv?VLd@-^A>+ABB#s3da{SqO5@Ativ>_@&yoDr61 zJM)qC|LHICH$Gp#w|lW&x#_!-^W|^c-bg*0Q}oq{Gws(4!5W{Lygr&iThF#tFRXce zxWRJMaks}=iVKQud`spfUeZo7nNmD+MsmshNdje`r<{JUyF*%D?u=-`OukN4t-O z%)r=Rn&ic)EK$Dx*^%Vde+!bXx#sZ#Bmd`*m!Qah35xvbsy0t{-&!o3dfjpz(0jkv zU#blJuKi)p!Q|3o{4Te)-ME?@bn`g(%GsxWHvL^#J@L^kq5q<FHJcFVdQ&MBb@0PQ^Ja{vGU literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client-members.html b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client-members.html new file mode 100644 index 0000000000..6f103c63b5 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client-members.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Components.RepositoryClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.Components.RepositoryClient, including all inherited members.

+ + + + + + + + + + +
apiClientTgstation.Server.Client.Components.RepositoryClientprivate
Clone(Repository repository, CancellationToken cancellationToken)Tgstation.Server.Client.Components.RepositoryClient
Delete(CancellationToken cancellationToken)Tgstation.Server.Client.Components.RepositoryClient
instanceTgstation.Server.Client.Components.RepositoryClientprivate
Read(CancellationToken cancellationToken)Tgstation.Server.Client.Components.RepositoryClient
Repository(Routes.Repository, repository, instance.Id, cancellationToken)Tgstation.Server.Client.Components.RepositoryClientprivate
Repository(Routes.Repository, repository ?? throw new ArgumentNullException(nameof(repository)), instance.Id, cancellationToken)Tgstation.Server.Client.Components.RepositoryClientprivate
RepositoryClient(IApiClient apiClient, Instance instance)Tgstation.Server.Client.Components.RepositoryClient
Update(Repository repository, CancellationToken cancellationToken)Tgstation.Server.Client.Components.RepositoryClient
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html new file mode 100644 index 0000000000..61fd9e7770 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html @@ -0,0 +1,446 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components.RepositoryClient Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components.RepositoryClient Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Client.Components.RepositoryClient:
+
+
+ + +Tgstation.Server.Client.Components.IRepositoryClient + +
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

 RepositoryClient (IApiClient apiClient, Instance instance)
 Construct a RepositoryClient More...
 
Task< RepositoryClone (Repository repository, CancellationToken cancellationToken)
 Clones a repository More...
 
Task< RepositoryDelete (CancellationToken cancellationToken)
 Deletes the Repository More...
 
Task< RepositoryRead (CancellationToken cancellationToken)
 Get the Repository represented by the IRepositoryClient More...
 
Task< RepositoryUpdate (Repository repository, CancellationToken cancellationToken)
 Update the Repository More...
 
+ + + + + +

+Private Member Functions

Task< RepositoryRepository (Routes.Repository, repository, instance.Id, cancellationToken)
 
Task< RepositoryRepository (Routes.Repository, repository ?? throw new ArgumentNullException(nameof(repository)), instance.Id, cancellationToken)
 
+ + + + + + + +

+Private Attributes

readonly IApiClient apiClient
 The IApiClient for the RepositoryClient More...
 
readonly Instance instance
 The Instance for the RepositoryClient More...
 
+

Detailed Description

+
+

Definition at line 10 of file RepositoryClient.cs.

+

Constructor & Destructor Documentation

+ +

◆ RepositoryClient()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.Components.RepositoryClient.RepositoryClient (IApiClient apiClient,
Instance instance 
)
+
+ +

Construct a RepositoryClient

+
Parameters
+ + + +
apiClientThe value of apiClient
instanceThe value of instance
+
+
+ +

Definition at line 27 of file RepositoryClient.cs.

+
28  {
29  this.apiClient = apiClient;
30  this.instance = instance;
31  }
readonly Instance instance
The Instance for the RepositoryClient
+
readonly IApiClient apiClient
The IApiClient for the RepositoryClient
+
+

References Tgstation.Server.Client.Components.RepositoryClient.apiClient, and Tgstation.Server.Client.Components.RepositoryClient.instance.

+ +
+
+

Member Function Documentation

+ +

◆ Clone()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<Repository> Tgstation.Server.Client.Components.RepositoryClient.Clone (Repository repository,
CancellationToken cancellationToken 
)
+
+ +

Clones a repository

+ +

Implements Tgstation.Server.Client.Components.IRepositoryClient.

+ +
+
+ +

◆ Delete()

+ +
+
+ + + + + + + + +
Task<Repository> Tgstation.Server.Client.Components.RepositoryClient.Delete (CancellationToken cancellationToken)
+
+ +

Deletes the Repository

+ +

Implements Tgstation.Server.Client.Components.IRepositoryClient.

+ +
+
+ +

◆ Read()

+ +
+
+ + + + + + + + +
Task<Repository> Tgstation.Server.Client.Components.RepositoryClient.Read (CancellationToken cancellationToken)
+
+ +

Get the Repository represented by the IRepositoryClient

+ +

Implements Tgstation.Server.Client.Components.IRepositoryClient.

+ +
+
+ +

◆ Repository() [1/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<Repository> Tgstation.Server.Client.Components.RepositoryClient.Repository (Routes. Repository,
repository ,
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +

◆ Repository() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<Repository> Tgstation.Server.Client.Components.RepositoryClient.Repository (Routes. Repository,
repository ?? throw new  ArgumentNullExceptionnameof(repository),
instance. Id,
cancellationToken  
)
+
+private
+
+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<Repository> Tgstation.Server.Client.Components.RepositoryClient.Update (Repository repository,
CancellationToken cancellationToken 
)
+
+ +

Update the Repository

+ +

Implements Tgstation.Server.Client.Components.IRepositoryClient.

+ +
+
+

Member Data Documentation

+ +

◆ apiClient

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.Components.RepositoryClient.apiClient
+
+private
+
+
+ +

◆ instance

+ +
+
+ + + + + +
+ + + + +
readonly Instance Tgstation.Server.Client.Components.RepositoryClient.instance
+
+private
+
+ +

The Instance for the RepositoryClient

+ +

Definition at line 20 of file RepositoryClient.cs.

+ +

Referenced by Tgstation.Server.Client.Components.RepositoryClient.RepositoryClient().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.png b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.png new file mode 100644 index 0000000000000000000000000000000000000000..d7ad80c04bc63949476b06f20f32abe64f405d95 GIT binary patch literal 1172 zcmeAS@N?(olHy`uVBq!ia0y~yV6+6X12~w0Wa#EkPl1#~fKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+1B{VcGHHpsSJ5Pqz)6#rbWEC~;yUGt zismA(b#Lq^`Rta9|8M&KRrfn(PpQ`(vQMq7=RKL6GVAx7^q%i4mu=ql`0ACI`9~&B zUgEd^ule$*WcP<#-+S75ZYzC~w{#ZEoe#GrRxkY5x_AAopIg7b<1W-&wsz{@pB!Ie z?XK**SA6xAfp_SAxr4_i+;fwc}f*!$f&F1qOWhixlgWT`D^vXc#a zkak3SQR(Ai-lV?mzh}+daCEYF%IRhQ-L#hV?%Ds@N}+sjsacg;TkOOuC+zf2Sgw}c zS^4Efzy0*}i?ht)oY&3$ck6Y_oQE65zs!kA-z>KGt<(f-;o~PuHE-R`s_7{^G-1x{ zyN6!)+$q|=tEi+q^$Uyhe9p~$Rld4+uHy^7 z<=I#B-(A~3r}&xO?uVtN+vkOQ+AcqDee6AJ`Sx2r=Z;9;z7ziM(#M}Y-{OI0$Ls;GMks#X`J*7a`E(=q*OKW_O@K_+}qo1g%2Em#jU{lA;6PQVZr+K zF6oT`D0vkz0F7$sm?Y!i0+e2)!cL*|#q`PA zOQ(crF0~P11-ion&CrrbtHs$0w!Z%O^}a;mf58J0?r$`%-~6Z|pD^opj)CNXtuLqK zNqsG0xE=Q1=l|K2*KPz>yse(Zzv1lU-BZ(r3XZ>MxYPYj|NVUZyX*Is$9EUo=B~X` zbG+#0y0kNT;kp9J%l6qe^(*de)NB2I)q35utox>04C_F;4EN-UtV?6kdT}|0HIHqt zQk1jZb%kdYyVuX;jJ7fDTqf^en49uv?nT3$+7C8e?0d6{S!3^;$4zsJZ%>@<-v4jM zq^+(}8fYTxrGWwnbe*Oun*W_xn(NMTVd*Y@b%&WmOelZu0*C1NK; zzY7cR(_5%&ZuO`3QQqA7*YDKK_HmkZa_8KKz3Y42&hOml{CxHOwPt0zIB$J^8TDiK zZqu4`l2YY8>)v1cY_{_Gm&&t0-adF2Hv8mHi{#nbr{k^c=5M@T;vcjlsv4M{ZeI$2 zb1TDrog>Ew!(WS+?w)Tiu}m45a2Vtl{8#**GG*VhzE`Y26#jDWbZ_P<*LL7aScn$4 fRTH5Rb=kbl#^KH438KJqhk?P<)z4*}Q$iB}82LUi literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests_1_1_test_dream_daemon_client-members.html b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests_1_1_test_dream_daemon_client-members.html new file mode 100644 index 0000000000..e7a30f1c4b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests_1_1_test_dream_daemon_client-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Components.Tests.TestDreamDaemonClient Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests_1_1_test_dream_daemon_client.html b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests_1_1_test_dream_daemon_client.html new file mode 100644 index 0000000000..876a0bd999 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests_1_1_test_dream_daemon_client.html @@ -0,0 +1,123 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components.Tests.TestDreamDaemonClient Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components.Tests.TestDreamDaemonClient Class Reference
+
+
+ + + + +

+Public Member Functions

async Task TestStart ()
 
+

Detailed Description

+
+

Definition at line 14 of file TestDreamDaemonClient.cs.

+

Member Function Documentation

+ +

◆ TestStart()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Client.Components.Tests.TestDreamDaemonClient.TestStart ()
+
+ +

Definition at line 17 of file TestDreamDaemonClient.cs.

+
18  {
19  var example = new Job
20  {
21  Id = 347,
22  StartedAt = DateTimeOffset.Now
23  };
24 
25  var inst = new Instance
26  {
27  Id = 4958
28  };
29 
30  var mockApiClient = new Mock<IApiClient>();
31  mockApiClient.Setup(x => x.Create<Job>(Routes.DreamDaemon, inst.Id, It.IsAny<CancellationToken>())).Returns(Task.FromResult(example));
32 
33  var client = new DreamDaemonClient(mockApiClient.Object, inst);
34 
35  var result = await client.Start(default).ConfigureAwait(false);
36  Assert.AreSame(example, result);
37  }
Routes to a server actions
Definition: Routes.cs:9
+
const string DreamDaemon
The Models.DreamDaemon controller
Definition: Routes.cs:44
+
Metadata about a server instance
Definition: Instance.cs:9
+
Represents a long running job on the server. Model is read-only, updates attempt to cancel the job
Definition: Job.cs:6
+
+

References Tgstation.Server.Api.Routes.DreamDaemon.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_conflict_exception-members.html b/class_tgstation_1_1_server_1_1_client_1_1_conflict_exception-members.html new file mode 100644 index 0000000000..b47c40bfa7 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_conflict_exception-members.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.ConflictException Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_conflict_exception.html b/class_tgstation_1_1_server_1_1_client_1_1_conflict_exception.html new file mode 100644 index 0000000000..02994858ce --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_conflict_exception.html @@ -0,0 +1,271 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.ConflictException Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.ConflictException Class Reference
+
+
+ +

Occurs when the client performs an action that would result in data conflict + More...

+
+Inheritance diagram for Tgstation.Server.Client.ConflictException:
+
+
+ + +Tgstation.Server.Client.ClientException + +
+ + + + + + + + + + + + + + +

+Public Member Functions

 ConflictException (ErrorMessage errorMessage, HttpStatusCode statusCode)
 Construct an ConflictException with a errorMessage and statusCode More...
 
 ConflictException ()
 Construct a ConflictException More...
 
 ConflictException (string message)
 Construct an ConflictException with a message More...
 
 ConflictException (string message, Exception innerException)
 Construct an ConflictException with a message and innerException More...
 
+ + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from Tgstation.Server.Client.ClientException
 ClientException??? (ErrorMessage errorMessage, HttpStatusCode statusCode)
 Construct a ClientException using an errorMessage and statusCode More...
 
 ClientException ()
 Construct a ClientException More...
 
 ClientException (string message)
 Construct a ClientException with a message More...
 
 ClientException (string message, Exception innerException)
 Construct a ClientException with a message and innerException More...
 
- Properties inherited from Tgstation.Server.Client.ClientException
HttpStatusCode StatusCode [get]
 The HttpStatusCode of the ClientException More...
 
Version ServerApiVersion [get]
 The Version of the server's API More...
 
+

Detailed Description

+

Occurs when the client performs an action that would result in data conflict

+ +

Definition at line 10 of file ConflictException.cs.

+

Constructor & Destructor Documentation

+ +

◆ ConflictException() [1/4]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.ConflictException.ConflictException (ErrorMessage errorMessage,
HttpStatusCode statusCode 
)
+
+ +

Construct an ConflictException with a errorMessage and statusCode

+
Parameters
+ + + +
errorMessageThe ErrorMessage for the ClientException
statusCodeThe HttpStatusCode for the ClientException
+
+
+ +

Definition at line 17 of file ConflictException.cs.

+
17  : base(errorMessage, statusCode)
18  { }
+
+
+ +

◆ ConflictException() [2/4]

+ +
+
+ + + + + + + +
Tgstation.Server.Client.ConflictException.ConflictException ()
+
+ +

Construct a ConflictException

+ +

Definition at line 23 of file ConflictException.cs.

+
23 { }
+
+
+ +

◆ ConflictException() [3/4]

+ +
+
+ + + + + + + + +
Tgstation.Server.Client.ConflictException.ConflictException (string message)
+
+ +

Construct an ConflictException with a message

+
Parameters
+ + +
messageThe message for the Exception
+
+
+ +

Definition at line 29 of file ConflictException.cs.

+
29 : base(message) { }
+
+
+ +

◆ ConflictException() [4/4]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.ConflictException.ConflictException (string message,
Exception innerException 
)
+
+ +

Construct an ConflictException with a message and innerException

+
Parameters
+ + + +
messageThe message for the Exception
innerExceptionThe inner Exception for the base Exception
+
+
+ +

Definition at line 36 of file ConflictException.cs.

+
36 : base(message, innerException) { }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_conflict_exception.png b/class_tgstation_1_1_server_1_1_client_1_1_conflict_exception.png new file mode 100644 index 0000000000000000000000000000000000000000..116300934739e3fb37154422c33fab7c9f56b360 GIT binary patch literal 1152 zcmeAS@N?(olHy`uVBq!ia0vp^pMki8gBeJ&p4H_CQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;Rd|YTw!D z?~V|@n36D=FZ62p%i`xd6VFwCIJc*%ciU~%&zBDC%}M7!v$K!?*SGWbx3}+~9~oNe zU%#cqVD+lH0Ar)otNt}MMTTD84<_W!Xf8FG&hXEzyy2vY;^)71@?Toc@IQIEAU&mT zAFn}kljMQ@#N!9ayYA*~KY7I0B}I#Mb4N!#m@qw~`M1!JglR%>0Go7COuC;r?IaB_`WykX;WNM`o*jSAl>WRk(j!y~ln%v1^FclW3T*WUl4p?2g zeSCdk-Zp*4o~<|fYOZ!}+(?}=ndSp58t>x(37BmLs!dhccD zG8v4&HNTrNef@QRuKAT~{(s7e+oyKpoqu7tl1cE|m9=wfr^*_8zMFq*`x*6ZYDJN2 zs&my}O#7M1eUeA$wE>%|Ynl3~#b1M_znT#p&pi9x%NN(L-DYfzO+CD)Dn?nda@!To z7b*GtGiH0;HTW(r9B6sI^zX&&!wbr1@OG|Tqxf0s;H$-ZDvrd+?mw~TyT80Mw@)!W>HfTO{>^W> zm;de(%Q)YVJHuCgL-5gKYzehj`7ZyGUNHT@w9hpcwjX!gerEZ7(}wjII33RK`T2*r zW_I1lm@bwF*XLQy$JcZ>^{0U%j!QkoY=d#Wzp$P!f CPDC>R literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_client_1_1_http_client-members.html b/class_tgstation_1_1_server_1_1_client_1_1_http_client-members.html new file mode 100644 index 0000000000..bc02a4e333 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_http_client-members.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.HttpClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.HttpClient, including all inherited members.

+ + + + + + +
Dispose()Tgstation.Server.Client.HttpClient
httpClientTgstation.Server.Client.HttpClientprivate
HttpClient()Tgstation.Server.Client.HttpClient
SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)Tgstation.Server.Client.HttpClient
TimeoutTgstation.Server.Client.HttpClient
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_http_client.html b/class_tgstation_1_1_server_1_1_client_1_1_http_client.html new file mode 100644 index 0000000000..5f4d732239 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_http_client.html @@ -0,0 +1,271 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.HttpClient Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.HttpClient Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Client.HttpClient:
+
+
+ + +Tgstation.Server.Client.IHttpClient +IDisposable + +
+ + + + + + + + + + +

+Public Member Functions

 HttpClient ()
 Construct an HttpClient More...
 
void Dispose ()
 
Task< HttpResponseMessage > SendAsync (HttpRequestMessage request, CancellationToken cancellationToken)
 Send an HTTP request More...
 
+ + + + + + + +

+Properties

TimeSpan Timeout [get, set]
 
- Properties inherited from Tgstation.Server.Client.IHttpClient
TimeSpan Timeout [get, set]
 The request timeout More...
 
+ + + + +

+Private Attributes

readonly System.Net.Http.HttpClient httpClient
 The real System.Net.Http.HttpClient More...
 
+

Detailed Description

+
+

Definition at line 9 of file HttpClient.cs.

+

Constructor & Destructor Documentation

+ +

◆ HttpClient()

+ +
+
+ + + + + + + +
Tgstation.Server.Client.HttpClient.HttpClient ()
+
+ +

Construct an HttpClient

+ +

Definition at line 26 of file HttpClient.cs.

+
27  {
28  httpClient = new System.Net.Http.HttpClient();
29  }
readonly System.Net.Http.HttpClient httpClient
The real System.Net.Http.HttpClient
Definition: HttpClient.cs:21
+
HttpClient()
Construct an HttpClient
Definition: HttpClient.cs:26
+
+

References Tgstation.Server.Client.HttpClient.httpClient, and Tgstation.Server.Client.HttpClient.HttpClient().

+ +

Referenced by Tgstation.Server.Client.HttpClient.HttpClient().

+ +
+
+

Member Function Documentation

+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Client.HttpClient.Dispose ()
+
+ +

+ +
+
+ +

◆ SendAsync()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<HttpResponseMessage> Tgstation.Server.Client.HttpClient.SendAsync (HttpRequestMessage request,
CancellationToken cancellationToken 
)
+
+ +

Send an HTTP request

+ +

Implements Tgstation.Server.Client.IHttpClient.

+ +
+
+

Member Data Documentation

+ +

◆ httpClient

+ +
+
+ + + + + +
+ + + + +
readonly System.Net.Http.HttpClient Tgstation.Server.Client.HttpClient.httpClient
+
+private
+
+ +

The real System.Net.Http.HttpClient

+ +

Definition at line 21 of file HttpClient.cs.

+ +

Referenced by Tgstation.Server.Client.HttpClient.HttpClient().

+ +
+
+

Property Documentation

+ +

◆ Timeout

+ +
+
+ + + + + +
+ + + + +
TimeSpan Tgstation.Server.Client.HttpClient.Timeout
+
+getset
+
+ +

+ +

Definition at line 13 of file HttpClient.cs.

+
13  {
14  get => httpClient.Timeout;
15  set => httpClient.Timeout = value;
16  }
+
readonly System.Net.Http.HttpClient httpClient
The real System.Net.Http.HttpClient
Definition: HttpClient.cs:21
+
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_http_client.png b/class_tgstation_1_1_server_1_1_client_1_1_http_client.png new file mode 100644 index 0000000000000000000000000000000000000000..9e2fc402ced33f3128395acdcc9d24a07eea0bc2 GIT binary patch literal 1072 zcmeAS@N?(olHy`uVBq!ia0vp^r+~PFgBeIp)Nc6;q$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IZ0_j|fHhEy=Vo%?XwCoLXV^Y*PZ|K0ax zd2{Ms`ek|VRD7+rg+QLAok0m1{Xu=l6-%`fgHrDO|g-$+sZv&0eE*3FqtAi~3CB z`*ktedD1a15l^eDE*g`**lWRE(g$>0Fvo-6yBN0_P{*yAlKL49(9>&J!H|fgttlQmN%W|AgH=A0Qn?+jst#q8Y zq+^M6F1HhpG%dhXwn`W>e7-tRXVMXPN)kzFL0_WIGyb=R)&>2LJP;yty? z`&xNy;l0H+?MqT-P0BK6Yu)oBPdnjWgzmS^naO+4cv;((yjx(xczefN6<(i7TPFXt zbjbX6cGI!b8!cwcwcPJuDE#JluHO@@MybUXeF57JJYMr9uR<`BfuJor}pI0>Hetj6Jne%Xibm7|Ir7<@>wywT$ z!}3PNTQ$Adtxa>S_V0MBf4_3lm(;z6(``@v^YFfu|B89a+d~so*nhFOPWrbDlnOLK zk?>B#^0`eb!@l*>2V`ckKP{WxmMS;J`lODI@In_><`2sq7(Xl{9#=SPE;VWQU;rjH z2B7&2dorChLm5`A{kO;d>&$*XhT65;_C}_4nBYZv?Eeci(3f53HK^zbfpP##t>H z^BG%fcY*``xhLywuOpiyZrn;Ve-yRcYv-nkS>YQuUf!^AmhqlH>qOsN`TRAv{^vR7 zAIt8|I>DG)zl5>QcmBc|*6a_;zbbMam>;r$p&}TFFFzLY(p)O}Mc!#cP@>|TCBDGy O&EV + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.InstanceManagerClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.InstanceManagerClient, including all inherited members.

+ + + + + + + + + + + + +
apiClientTgstation.Server.Client.InstanceManagerClientprivate
cachedClientsTgstation.Server.Client.InstanceManagerClientprivate
CreateClient(Instance instance)Tgstation.Server.Client.InstanceManagerClient
CreateOrAttach(Instance instance, CancellationToken cancellationToken)Tgstation.Server.Client.InstanceManagerClient
Detach(Instance instance, CancellationToken cancellationToken)Tgstation.Server.Client.InstanceManagerClient
GetId(Instance instance, CancellationToken cancellationToken)Tgstation.Server.Client.InstanceManagerClient
Instance(Routes.InstanceManager, instance ?? throw new ArgumentNullException(nameof(instance)), cancellationToken)Tgstation.Server.Client.InstanceManagerClientprivate
Instance(Routes.InstanceManager, instance ?? throw new ArgumentNullException(nameof(instance)), cancellationToken)Tgstation.Server.Client.InstanceManagerClientprivate
InstanceManagerClient(IApiClient apiClient)Tgstation.Server.Client.InstanceManagerClient
List(CancellationToken cancellationToken)Tgstation.Server.Client.InstanceManagerClient
Update(Instance instance, CancellationToken cancellationToken)Tgstation.Server.Client.InstanceManagerClient
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html b/class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html new file mode 100644 index 0000000000..733036b834 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html @@ -0,0 +1,501 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.InstanceManagerClient Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.InstanceManagerClient Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Client.InstanceManagerClient:
+
+
+ + +Tgstation.Server.Client.IInstanceManagerClient + +
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 InstanceManagerClient (IApiClient apiClient)
 Construct an InstanceManagerClient More...
 
Task< InstanceCreateOrAttach (Instance instance, CancellationToken cancellationToken)
 Create or attach an instance More...
 
Task Detach (Instance instance, CancellationToken cancellationToken)
 Deletes an instance More...
 
Task< IReadOnlyList< Instance > > List (CancellationToken cancellationToken)
 Get all IInstanceClients for Instances the user can view More...
 
Task< InstanceUpdate (Instance instance, CancellationToken cancellationToken)
 Relocates, renamed, and/or on/offlines an instance More...
 
Task< InstanceGetId (Instance instance, CancellationToken cancellationToken)
 Get a specific instance More...
 
IInstanceClient CreateClient (Instance instance)
 Create an IInstanceClient for a given Instance More...
 
+ + + + + +

+Private Member Functions

Task< InstanceInstance (Routes.InstanceManager, instance ?? throw new ArgumentNullException(nameof(instance)), cancellationToken)
 
Task< InstanceInstance (Routes.InstanceManager, instance ?? throw new ArgumentNullException(nameof(instance)), cancellationToken)
 
+ + + + + + + +

+Private Attributes

readonly IApiClient apiClient
 The IApiClient for the InstanceManagerClient More...
 
readonly Dictionary< long, IInstanceClientcachedClients
 Map of already created IInstanceClients More...
 
+

Detailed Description

+
+

Definition at line 12 of file InstanceManagerClient.cs.

+

Constructor & Destructor Documentation

+ +

◆ InstanceManagerClient()

+ +
+
+ + + + + + + + +
Tgstation.Server.Client.InstanceManagerClient.InstanceManagerClient (IApiClient apiClient)
+
+ +

Construct an InstanceManagerClient

+
Parameters
+ + +
apiClientThe value of apiClient
+
+
+ +

Definition at line 28 of file InstanceManagerClient.cs.

+
29  {
30  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
31 
32  cachedClients = new Dictionary<long, IInstanceClient>();
33  }
readonly IApiClient apiClient
The IApiClient for the InstanceManagerClient
+
readonly Dictionary< long, IInstanceClient > cachedClients
Map of already created IInstanceClients
+
+

References Tgstation.Server.Client.InstanceManagerClient.apiClient, and Tgstation.Server.Client.InstanceManagerClient.cachedClients.

+ +
+
+

Member Function Documentation

+ +

◆ CreateClient()

+ +
+
+ + + + + + + + +
IInstanceClient Tgstation.Server.Client.InstanceManagerClient.CreateClient (Instance instance)
+
+ +

Create an IInstanceClient for a given Instance

+ +

Implements Tgstation.Server.Client.IInstanceManagerClient.

+ +

Definition at line 51 of file InstanceManagerClient.cs.

+
52  {
53  if (!cachedClients.TryGetValue(instance?.Id ?? throw new ArgumentNullException(nameof(instance)), out var client))
54  {
55  client = new InstanceClient(apiClient, instance);
56  cachedClients.Add(instance.Id, client);
57  }
58 
59  return client;
60  }
+
readonly IApiClient apiClient
The IApiClient for the InstanceManagerClient
+
readonly Dictionary< long, IInstanceClient > cachedClients
Map of already created IInstanceClients
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
+

References Tgstation.Server.Client.InstanceManagerClient.apiClient, Tgstation.Server.Client.InstanceManagerClient.cachedClients, and Tgstation.Server.Api.Models.Instance.Id.

+ +
+
+ +

◆ CreateOrAttach()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<Instance> Tgstation.Server.Client.InstanceManagerClient.CreateOrAttach (Instance instance,
CancellationToken cancellationToken 
)
+
+ +

Create or attach an instance

+ +

Implements Tgstation.Server.Client.IInstanceManagerClient.

+ +
+
+ +

◆ Detach()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.InstanceManagerClient.Detach (Instance instance,
CancellationToken cancellationToken 
)
+
+ +

Deletes an instance

+ +

Implements Tgstation.Server.Client.IInstanceManagerClient.

+ +
+
+ +

◆ GetId()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<Instance> Tgstation.Server.Client.InstanceManagerClient.GetId (Instance instance,
CancellationToken cancellationToken 
)
+
+ +

Get a specific instance

+ +

Implements Tgstation.Server.Client.IInstanceManagerClient.

+ +
+
+ +

◆ Instance() [1/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<Instance> Tgstation.Server.Client.InstanceManagerClient.Instance (Routes. InstanceManager,
instance ?? throw new  ArgumentNullExceptionnameof(instance),
cancellationToken  
)
+
+private
+
+ +
+
+ +

◆ Instance() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<Instance> Tgstation.Server.Client.InstanceManagerClient.Instance (Routes. InstanceManager,
instance ?? throw new  ArgumentNullExceptionnameof(instance),
cancellationToken  
)
+
+private
+
+ +
+
+ +

◆ List()

+ +
+
+ + + + + + + + +
Task<IReadOnlyList<Instance> > Tgstation.Server.Client.InstanceManagerClient.List (CancellationToken cancellationToken)
+
+ +

Get all IInstanceClients for Instances the user can view

+ +

Implements Tgstation.Server.Client.IInstanceManagerClient.

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<Instance> Tgstation.Server.Client.InstanceManagerClient.Update (Instance instance,
CancellationToken cancellationToken 
)
+
+ +

Relocates, renamed, and/or on/offlines an instance

+ +

Implements Tgstation.Server.Client.IInstanceManagerClient.

+ +
+
+

Member Data Documentation

+ +

◆ apiClient

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.InstanceManagerClient.apiClient
+
+private
+
+
+ +

◆ cachedClients

+ +
+
+ + + + + +
+ + + + +
readonly Dictionary<long, IInstanceClient> Tgstation.Server.Client.InstanceManagerClient.cachedClients
+
+private
+
+ +

Map of already created IInstanceClients

+ +

Definition at line 22 of file InstanceManagerClient.cs.

+ +

Referenced by Tgstation.Server.Client.InstanceManagerClient.CreateClient(), and Tgstation.Server.Client.InstanceManagerClient.InstanceManagerClient().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.png b/class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.png new file mode 100644 index 0000000000000000000000000000000000000000..4ad9dcd99989726837d41f4a5f3d4b904ce309eb GIT binary patch literal 1060 zcmeAS@N?(olHy`uVBq!ia0y~yU=#zg12~w0gZ+fl3!!mo}t2gy0 z%{y~-6gTYrXT`sChK+-UbMyiIt=DF)+Pcea>XIocmxa1jSXIS5xx92HiA;%5(R^_r zXxns^%jf2=&%b-aP(aP|QbhF|jqCReC3c;x8hpX0?u!b?^{+moFE#zH-^R47WxRK`95L2m z<~O?{VO`!lJ6B!OSlcZvLeG3+wcNWenoyk%P|VhkN&w zBu1x|3+qaJjQF)XdQx4h+?wUbFUc>T^kwqb0^5aA-?AnziC>uhS~6G3^Vefo0BdaY z2ntA=xMYF&w5V*~t5LbkKlFYvc`&Y16>Er#k3Y$}AUKKf#n(lXVi@)aaUXEtWL41E z$iM=WU2ud+U`hl-lMuH z{?*hNza)7jAusP=fsUZhpN=I_1Gfp z76R{8)~e*Xk9ubDCq8M`9BJl7v`LKuK~=`44$rj JF6*2UngBWn&(i<^ literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception-members.html b/class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception-members.html new file mode 100644 index 0000000000..e0df5ffd36 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception-members.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.InsufficientPermissionsException Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception.html b/class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception.html new file mode 100644 index 0000000000..49b5b98590 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception.html @@ -0,0 +1,230 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.InsufficientPermissionsException Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.InsufficientPermissionsException Class Reference
+
+
+ +

Occurs when the client attempts to perform an action they do not have the rights for + More...

+
+Inheritance diagram for Tgstation.Server.Client.InsufficientPermissionsException:
+
+
+ + +Tgstation.Server.Client.ClientException + +
+ + + + + + + + + + + +

+Public Member Functions

 InsufficientPermissionsException ()
 Construct an InsufficientPermissionsException More...
 
 InsufficientPermissionsException (string message)
 Construct an InsufficientPermissionsException with a message More...
 
 InsufficientPermissionsException (string message, Exception innerException)
 Construct an InsufficientPermissionsException with a message and innerException More...
 
+ + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from Tgstation.Server.Client.ClientException
 ClientException??? (ErrorMessage errorMessage, HttpStatusCode statusCode)
 Construct a ClientException using an errorMessage and statusCode More...
 
 ClientException ()
 Construct a ClientException More...
 
 ClientException (string message)
 Construct a ClientException with a message More...
 
 ClientException (string message, Exception innerException)
 Construct a ClientException with a message and innerException More...
 
- Properties inherited from Tgstation.Server.Client.ClientException
HttpStatusCode StatusCode [get]
 The HttpStatusCode of the ClientException More...
 
Version ServerApiVersion [get]
 The Version of the server's API More...
 
+

Detailed Description

+

Occurs when the client attempts to perform an action they do not have the rights for

+ +

Definition at line 10 of file InsufficientPermissionsException.cs.

+

Constructor & Destructor Documentation

+ +

◆ InsufficientPermissionsException() [1/3]

+ +
+
+ + + + + + + +
Tgstation.Server.Client.InsufficientPermissionsException.InsufficientPermissionsException ()
+
+ +

Construct an InsufficientPermissionsException

+ +

Definition at line 15 of file InsufficientPermissionsException.cs.

+
15  : base(new ErrorMessage
16  {
17  Message = "The credentials provided do not have sufficient rights to make this request!",
18  SeverApiVersion = null
19  }, HttpStatusCode.Forbidden)
20  { }
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+
+
+ +

◆ InsufficientPermissionsException() [2/3]

+ +
+
+ + + + + + + + +
Tgstation.Server.Client.InsufficientPermissionsException.InsufficientPermissionsException (string message)
+
+ +

Construct an InsufficientPermissionsException with a message

+
Parameters
+ + +
messageThe message for the Exception
+
+
+ +

Definition at line 26 of file InsufficientPermissionsException.cs.

+
26 : base(message) { }
+
+
+ +

◆ InsufficientPermissionsException() [3/3]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.InsufficientPermissionsException.InsufficientPermissionsException (string message,
Exception innerException 
)
+
+ +

Construct an InsufficientPermissionsException with a message and innerException

+
Parameters
+ + + +
messageThe message for the Exception
innerExceptionThe inner Exception for the base Exception
+
+
+ +

Definition at line 33 of file InsufficientPermissionsException.cs.

+
33 : base(message, innerException) { }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception.png b/class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception.png new file mode 100644 index 0000000000000000000000000000000000000000..31a40a82617b47a77ffa9ce98bbc48c85e06676c GIT binary patch literal 1486 zcmb_cYcShc9Q`L)rS)jEwS7p_H0)}%sHj~_QHg}LRA?)GpwdR|1GOblE3_y9 zy5TY*AQ%8e?}p@Y$RPkQIO~h?3ZX)jWm7SWuA2;SXmf#X=LmZEwspV?y*=S-Ftr3z z)tKiyWzQ)@`q^GE&EfOoDCJ&Ag~Eb?r)cz1PZjPE`ejPss1H)w*{{$Z=;u>XW+|{K z6|MJ1?IaBuzT2awnLN1?#4dlMk#YwnR5ZhwV&)Ipx;yy=ui)e!P_x?)E zS14lJtu!LP@qH)3TiPn^l|hkymHbufrE`lyxGhtqa(@X=y7awnEw{P}^N6p@Sq&uo z?`J(5bd|gpR2ktb`N>ew2RjW^eKEI%=x2MYkWd9Ya5n=W4p|tec#$eXwWDE14*kz6 z{Gnnb6R^ea^@PHV7-<+N3c&=7@TgBpQ;&}G>~cekF0j&tV*g@RFM>%XgGO0IC@h*> zl!hr`SyA2-&u{1kYHL{yYtX(}B%-bPfrZ_* z+8+As{ffC(rMK8}FDF!N{`QwKZei$1>T+{a-BkQ}thjPXvn|v`a&uliBxRG!Bb!#U zR6k{Sg}4MeHHje56ZA}~wX>OQ#6s!( z!YX&avv<#|~r1C*9-icvlQlqPt}jj@GsczLe{} zptIN>sEpfmIO?1n`s#0@^4|UE0{X_h6sziv1aT8CtaRufRtZb{s}b`?kW)h&X5nrW zHlW4ZsX@p5lP>QOif3Xkxqxqb6xk~#Fz`+dV55rdAau0Tx1+Z4#3HO+56>SGmkbA> z5vFwg;>mf2Z(1}87QwE@vGj|vNC<)9lctY?As}>pyeAR@W8gn2UC$5^{5Eq64;dPG z0^*Natv**?03U7XEANjbjcL6BQj;tw{B$S3j>fL-69yTk8{`$mI}hNY=3I(R$IQyA zrA2`}>d|tuf*3v-uZ&S<iAmRe>m8bfeT zGE2WMdKu7WLDVF4wQO&F>pG1fudz0sCU1Go9iwWu*xPKY9;Uk`Z|d23Z~tvOPw%y) zJ-mIIrgL_@jq)pQn$ZdRMcc~th?a^18;=oANZyW|yT+rZ&NpYbJ|aEy9Dg!D5V%C^ zLcTQZL)K(muQ}=Lwy(54*Z`Y;RbZJ!979*gfkUb!0Qwcz?8GUi(hG`M t_ZnyS0g*naG+^24qqqoUeu&B(9q + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.MethodNotSupportedException Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_method_not_supported_exception.html b/class_tgstation_1_1_server_1_1_client_1_1_method_not_supported_exception.html new file mode 100644 index 0000000000..5eae29eb00 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_method_not_supported_exception.html @@ -0,0 +1,230 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.MethodNotSupportedException Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.MethodNotSupportedException Class Reference
+
+
+ +

Occurs when the client tries to use a currently unsupported API + More...

+
+Inheritance diagram for Tgstation.Server.Client.MethodNotSupportedException:
+
+
+ + +Tgstation.Server.Client.ClientException + +
+ + + + + + + + + + + +

+Public Member Functions

 MethodNotSupportedException ()
 Construct an MethodNotSupportedException More...
 
 MethodNotSupportedException (string message)
 Construct an MethodNotSupportedException with a message More...
 
 MethodNotSupportedException (string message, Exception innerException)
 Construct an MethodNotSupportedException with a message and innerException More...
 
+ + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from Tgstation.Server.Client.ClientException
 ClientException??? (ErrorMessage errorMessage, HttpStatusCode statusCode)
 Construct a ClientException using an errorMessage and statusCode More...
 
 ClientException ()
 Construct a ClientException More...
 
 ClientException (string message)
 Construct a ClientException with a message More...
 
 ClientException (string message, Exception innerException)
 Construct a ClientException with a message and innerException More...
 
- Properties inherited from Tgstation.Server.Client.ClientException
HttpStatusCode StatusCode [get]
 The HttpStatusCode of the ClientException More...
 
Version ServerApiVersion [get]
 The Version of the server's API More...
 
+

Detailed Description

+

Occurs when the client tries to use a currently unsupported API

+ +

Definition at line 10 of file MethodNotSupportedException.cs.

+

Constructor & Destructor Documentation

+ +

◆ MethodNotSupportedException() [1/3]

+ +
+
+ + + + + + + +
Tgstation.Server.Client.MethodNotSupportedException.MethodNotSupportedException ()
+
+ +

Construct an MethodNotSupportedException

+ +

Definition at line 15 of file MethodNotSupportedException.cs.

+
15  : base(new ErrorMessage
16  {
17  Message = "This method is not currently supported!",
18  SeverApiVersion = null
19  }, HttpStatusCode.NotImplemented)
20  { }
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+
+
+ +

◆ MethodNotSupportedException() [2/3]

+ +
+
+ + + + + + + + +
Tgstation.Server.Client.MethodNotSupportedException.MethodNotSupportedException (string message)
+
+ +

Construct an MethodNotSupportedException with a message

+
Parameters
+ + +
messageThe message for the Exception
+
+
+ +

Definition at line 26 of file MethodNotSupportedException.cs.

+
26 : base(message) { }
+
+
+ +

◆ MethodNotSupportedException() [3/3]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.MethodNotSupportedException.MethodNotSupportedException (string message,
Exception innerException 
)
+
+ +

Construct an MethodNotSupportedException with a message and innerException

+
Parameters
+ + + +
messageThe message for the Exception
innerExceptionThe inner Exception for the base Exception
+
+
+ +

Definition at line 33 of file MethodNotSupportedException.cs.

+
33 : base(message, innerException) { }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_method_not_supported_exception.png b/class_tgstation_1_1_server_1_1_client_1_1_method_not_supported_exception.png new file mode 100644 index 0000000000000000000000000000000000000000..af69c2a3bf3551b50bcf59bd7b923b7baa9fc976 GIT binary patch literal 1462 zcmcIkX;4#F6n=yNVnr-vaU;;8v<$Q=VH2VOC9()e5kX|DGA4sSK@bB4^AJR#vMH1j zs77S~6(Q1y0TT_?V5o#iRfGtHrx3uJkeEaQS$OHQGyd>*r+4Pw``vTCnRDlyZ@%)# zh#-rV>sJB*U=b1=7zF@Ecm$WNFhB$B;A{o)8IM(xImwbx4)Z=QYO<8*1@nsPm}7Z#xJY`c<(AgPtWp z&wTuj1_jDwOac;C4bWHx7)=gY;Dm(oF>t60p)M-aw8&3o> zM!RW^W4YdlT_QCSU%(gPlx8(SFrY+87>)6O6A0vsEgh@%|0UUbpOf0?ye<5BUGbm% zumn$TcX>RzEb%&tc(Qc!$>EVhSr}~SGyYU= z!wu?7LbfUs%9s}L(|HX2kq4e9t&;|mxCw9m&dATy7Oaxzp!m)9@KB3Nd~nYHH*b~7 zN@&}CRk1J;b19mBq<*n|rsZ6~@OS&MjCS^GIkh;>{8yXt&NY#_qxag?@0Q~O<*gZ# zBVlXrCI&salhdx*0mfe&kFB(-GCfbtfqvE@{MRm z58%_&nqzP(rdQzJdZoZn)Lz8bwQA@}k7I>+A0rpmp zUWe$=+JZZj*eMG2&;OR_>O-~cO5v0^F%f)(o(lMgi zEF1Q{KqNw3PQ$_m_@Wb$s6H%vP46_vGUQXvNIzluhlXM_SnQw^NF?Tq1$;NbBgiAX zwxKok36Mpi0BHY}8slJ<%IP!^hfH^9Hw}&2gbbftv*Ujezz1D17h^+RuGK|FMIz-< zpGxZn{5BPpKB`_?@>H|w=&i(Z`|fV*VWpity)=AcCSmLf^w<u)l9OIw>7U-{aMy6MIS-R9S)nfZ(et#E7p(#D_lO0vG|iuOomQ^Icj zZfl|M&gj^-_or|kE9@F4FD?7Vi^j2_%1U>?uBW7l&VEY4x`7JUHo$mlx|~Basa&2X z1enJL=RpR?rqj*$JkOo6)Jo7Bmp-HNpDzoc`aeeYbmYxuX7nTm9GFzYTwdpCJ4HuV z;><|0gYs*zO~UlsI{too(gU}jWm6!Q|6DD?-Irz#>vl4n#Wy*lI!Kt@OyN*cqzbJ) zy{Y8eG;e%knF1yY58{_dI;e}22cNBN^P^1p%Bz^dXED(!jiLu}`*ieMF7M~^ecYRR zY6f3wSf@s8ed#Z1Rb;m-3wDdxqAhKBwUHJ3I;4{bOpD}VEc{k%vh?Flv86wdu + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.RateLimitException Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception.html b/class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception.html new file mode 100644 index 0000000000..04e734280e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception.html @@ -0,0 +1,262 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.RateLimitException Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.RateLimitException Class Reference
+
+
+ +

Occurs when a GitHub rate limit occurs + More...

+
+Inheritance diagram for Tgstation.Server.Client.RateLimitException:
+
+
+ + +Tgstation.Server.Client.ClientException + +
+ + + + + + + + + + + +

+Public Member Functions

 RateLimitException ()
 Construct an RateLimitException More...
 
 RateLimitException (string secondsString)
 Construct an RateLimitException with a secondsString More...
 
 RateLimitException (string message, Exception innerException)
 Construct an RateLimitException with a message and innerException More...
 
+ + + + + + + + + + +

+Properties

DateTimeOffset RetryAfter [get]
 
- Properties inherited from Tgstation.Server.Client.ClientException
HttpStatusCode StatusCode [get]
 The HttpStatusCode of the ClientException More...
 
Version ServerApiVersion [get]
 The Version of the server's API More...
 
+ + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from Tgstation.Server.Client.ClientException
 ClientException??? (ErrorMessage errorMessage, HttpStatusCode statusCode)
 Construct a ClientException using an errorMessage and statusCode More...
 
 ClientException ()
 Construct a ClientException More...
 
 ClientException (string message)
 Construct a ClientException with a message More...
 
 ClientException (string message, Exception innerException)
 Construct a ClientException with a message and innerException More...
 
+

Detailed Description

+

Occurs when a GitHub rate limit occurs

+ +

Definition at line 10 of file RateLimitException.cs.

+

Constructor & Destructor Documentation

+ +

◆ RateLimitException() [1/3]

+ +
+
+ + + + + + + +
Tgstation.Server.Client.RateLimitException.RateLimitException ()
+
+ +

Construct an RateLimitException

+ +

Definition at line 17 of file RateLimitException.cs.

+
17 { }
+
+
+ +

◆ RateLimitException() [2/3]

+ +
+
+ + + + + + + + +
Tgstation.Server.Client.RateLimitException.RateLimitException (string secondsString)
+
+ +

Construct an RateLimitException with a secondsString

+
Parameters
+ + +
secondsStringThe message for the Exception
+
+
+ +

Definition at line 23 of file RateLimitException.cs.

+
23  : base(new ErrorMessage
24  {
25  Message = "GitHub rate limit reached!",
26  SeverApiVersion = null
27  }, (HttpStatusCode)429)
28  {
29  if (Int32.TryParse(secondsString, out var seconds) && seconds >= 0)
30  RetryAfter = DateTimeOffset.Now.AddSeconds(seconds);
31  else
32  RetryAfter = DateTimeOffset.Now;
33  }
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+
+
+ +

◆ RateLimitException() [3/3]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.RateLimitException.RateLimitException (string message,
Exception innerException 
)
+
+ +

Construct an RateLimitException with a message and innerException

+
Parameters
+ + + +
messageThe message for the Exception
innerExceptionThe inner Exception for the base Exception
+
+
+ +

Definition at line 40 of file RateLimitException.cs.

+
40 : base(message, innerException) { }
+
+
+

Property Documentation

+ +

◆ RetryAfter

+ +
+
+ + + + + +
+ + + + +
DateTimeOffset Tgstation.Server.Client.RateLimitException.RetryAfter
+
+getprivate
+
+ +

Definition at line 12 of file RateLimitException.cs.

+
12 { get; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception.png b/class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception.png new file mode 100644 index 0000000000000000000000000000000000000000..481e4adc860b6426f53082e0268a06b9314deb4a GIT binary patch literal 1172 zcmeAS@N?(olHy`uVBq!ia0vp^zks-dgBeKvyuo%9NJ#|vgt-3y{~ySF@#br3|Dg#$ z78oBmaDcV*jy#adQ4-`A%m7pb0#{Fk7%?!gD0{j%hEy=Vo%_1zvlWNy^b%#dm#_LYx$1T7 z{c|Pf-6wY_YOh*lzjFJ%uWYu<4|7&Moh|z>-tGRaJH5OAwO=SMoL}$^ry1V1QwBFI)o&4p+ z2ZnzlFBtBTfaNbd{#fxtgkMmwpQ}VrFds}vT?qasENJ}d@u#)b>DM|t?p#c>{=C(H z&h0ZzB7)X@%C^>D3tgM_l#DXw?mroqlm0CA-Jxg4{HCiNf8iZ;eamy1+4YrX@+aq2 zR!9A;G|pKb75v-kx0ZWl>gK)og}1yl*eIp6*DXH0Tg6z#Q})<`lvQi)8mBp}7qbm} z{d!sN$sZdon!NE`I%nZ^+boC8dv$7rCi;E*$g+Cn6Ybf5*S(+3_j|5O75`m^r(O2N z5lO4;P8~A-a`z)=Retij>5lUwYT5s8d2qX@eCm$H=dB`M?^wUdd-lc$>FxjDzqnpr z+jlP|SEnMoI^;vR+1qvI?|y|}$Za>*-TZp?x1<|-x4&>$hvwvXT)Td+|6K02-F259 zKA#x3@c#cy5y7ALU*=tDf3ex7v*XYIueo1>T$Ggdd*62#7yNk{5q41*ojQvWW z{Pg_KBE8)V&u-INcdwkpToqFej^*6swc^i_Q6`vme^g-E|vh3NjuEs|0 zbl<zuQW&-k=?cU@1O^`6WLvD3GRAO3b_nfndR;G?ze^1EUyGiTT9K4d9f6I+-6 zHwhz%?UB3hwG3<|xcV+*u(1HEKG7!FgzRpXt@=E;+ XrIV@uLuaf279k9tu6{1-oD!M<5>Z$y literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception-members.html b/class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception-members.html new file mode 100644 index 0000000000..2d0dbd018e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception-members.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.RequestTimeoutException Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception.html b/class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception.html new file mode 100644 index 0000000000..22fcb2e8d6 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception.html @@ -0,0 +1,230 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.RequestTimeoutException Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.RequestTimeoutException Class Reference
+
+
+ +

Occurs when the client provides invalid credentials + More...

+
+Inheritance diagram for Tgstation.Server.Client.RequestTimeoutException:
+
+
+ + +Tgstation.Server.Client.ClientException + +
+ + + + + + + + + + + +

+Public Member Functions

 RequestTimeoutException ()
 Construct an RequestTimeoutException More...
 
 RequestTimeoutException (string message)
 Construct an RequestTimeoutException with a message More...
 
 RequestTimeoutException (string message, Exception innerException)
 Construct an RequestTimeoutException with a message and innerException More...
 
+ + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from Tgstation.Server.Client.ClientException
 ClientException??? (ErrorMessage errorMessage, HttpStatusCode statusCode)
 Construct a ClientException using an errorMessage and statusCode More...
 
 ClientException ()
 Construct a ClientException More...
 
 ClientException (string message)
 Construct a ClientException with a message More...
 
 ClientException (string message, Exception innerException)
 Construct a ClientException with a message and innerException More...
 
- Properties inherited from Tgstation.Server.Client.ClientException
HttpStatusCode StatusCode [get]
 The HttpStatusCode of the ClientException More...
 
Version ServerApiVersion [get]
 The Version of the server's API More...
 
+

Detailed Description

+

Occurs when the client provides invalid credentials

+ +

Definition at line 10 of file RequestTimeoutException.cs.

+

Constructor & Destructor Documentation

+ +

◆ RequestTimeoutException() [1/3]

+ +
+
+ + + + + + + +
Tgstation.Server.Client.RequestTimeoutException.RequestTimeoutException ()
+
+ +

Construct an RequestTimeoutException

+ +

Definition at line 15 of file RequestTimeoutException.cs.

+
15  : base(new ErrorMessage
16  {
17  Message = "The request timed out!",
18  SeverApiVersion = null
19  }, HttpStatusCode.RequestTimeout)
20  { }
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+
+
+ +

◆ RequestTimeoutException() [2/3]

+ +
+
+ + + + + + + + +
Tgstation.Server.Client.RequestTimeoutException.RequestTimeoutException (string message)
+
+ +

Construct an RequestTimeoutException with a message

+
Parameters
+ + +
messageThe message for the Exception
+
+
+ +

Definition at line 26 of file RequestTimeoutException.cs.

+
26 : base(message) { }
+
+
+ +

◆ RequestTimeoutException() [3/3]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.RequestTimeoutException.RequestTimeoutException (string message,
Exception innerException 
)
+
+ +

Construct an RequestTimeoutException with a message and innerException

+
Parameters
+ + + +
messageThe message for the Exception
innerExceptionThe inner Exception for the base Exception
+
+
+ +

Definition at line 33 of file RequestTimeoutException.cs.

+
33 : base(message, innerException) { }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception.png b/class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception.png new file mode 100644 index 0000000000000000000000000000000000000000..08565eb9bffb0e40186ed8d9391745fa5a996b38 GIT binary patch literal 1405 zcmb_ceNfV89Dj_NEl?>?s;Q)a=?D}78E(7V_3v)a-Sa%3`@Y*vHV4G!<{dqed)a)ZQ{w}2Z)QB!p%JHbgv<} z|JxUfOQT^z4&iceC1)u|hP%eav@;`CueDs`{#wtI;nL8OM05?!= zKbTUHS=2Inhu7Jebu+Z_{%MXi(>gmHKOmLa4@Hq6DSEG0Ix46^bSsC;6-%q9cr-@( zOJq`ci%g~+R@m^r(~hS=eDm56KJ-EN03xe$XG?j9zAG;yYn@{zeTMa!jHn4&YI`PA zs_-dQBNttaGS1C0F|1gv2^{m|%?s_H#YzKc>2jcAR1jH?_2CDGq^Hjy{m* zz+w*@R-iXiAp`ZyS7W}uy znb8|`I~IH5hjFru#tyt7m`d&-y&t7xGG@5dy6~T*>G95zR_V~u%*1ZnA2xs0VA>Xa z=gy=faStz_iqeKg<@jM4+^yJ^gA=Cr=wFBl9F-u1()&QvntE3vj9Jn-*u)60DlMty z?|8P?YKJSAo7zJtM&+vyvqsD zU!gIZF5>M=sJDhmR)4IcnWr%K$_H*vtcUn_h4kq}K^S#rPDYf)lriBbK<>mmTZs-bBQ9 zh&yth&Uiz<>=>-3Ks(vcm+p!^3A5(2rjMxb*z*!58okEigSc7GW5K%&w9=|)E*aRM z*@q0~Q&9zk~JM zZ%XqS+5E3TP;$zdd + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.ServerClient Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_server_client.html b/class_tgstation_1_1_server_1_1_client_1_1_server_client.html new file mode 100644 index 0000000000..87d60e569b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_server_client.html @@ -0,0 +1,503 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.ServerClient Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.ServerClient Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Client.ServerClient:
+
+
+ + +Tgstation.Server.Client.IServerClient +IDisposable + +
+ + + + + + + + + + + + + +

+Public Member Functions

 ServerClient (IApiClient apiClient, Token token)
 Construct a ServerClient More...
 
void Dispose ()
 
Task< ServerInformationVersion (CancellationToken cancellationToken)
 The ServerInformation of the IServerClient More...
 
void AddRequestLogger (IRequestLogger requestLogger)
 Adds a requestLogger to the request pipeline More...
 
+ + + +

+Public Attributes

Uri Url => apiClient.Url
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

Token?? Token [get, set]
 
TimeSpan Timeout [get, set]
 
IInstanceManagerClient Instances [get]
 
IAdministrationClient Administration [get]
 
IUsersClient Users [get]
 
- Properties inherited from Tgstation.Server.Client.IServerClient
Uri Url [get]
 The connected server Uri More...
 
Token Token [get, set]
 The Token used to access the server More...
 
TimeSpan Timeout [get, set]
 The connection timeout More...
 
IInstanceManagerClient Instances [get]
 Access the IInstanceManagerClient More...
 
IAdministrationClient Administration [get]
 Access the IAdministrationClient More...
 
IUsersClient Users [get]
 Access the IUsersClient More...
 
+ + + + + + + +

+Private Attributes

readonly IApiClient apiClient
 The IApiClient for the ServerClient More...
 
Token token
 Backing field for Token More...
 
+

Detailed Description

+
+

Definition at line 10 of file ServerClient.cs.

+

Constructor & Destructor Documentation

+ +

◆ ServerClient()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.ServerClient.ServerClient (IApiClient apiClient,
Token token 
)
+
+ +

Construct a ServerClient

+
Parameters
+ + + +
apiClientThe value of apiClient
tokenThe value of Token
+
+
+ +

Definition at line 57 of file ServerClient.cs.

+
58  {
59  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
60  this.token = token ?? throw new ArgumentNullException(nameof(token));
61 
63  throw new ArgumentOutOfRangeException(nameof(token), token, "Provided token does not match apiClient headers!");
64 
65  Instances = new InstanceManagerClient(apiClient);
66  Users = new UsersClient(apiClient);
67  Administration = new AdministrationClient(apiClient);
68  }
+
ApiHeaders Headers
The ApiHeaders the IApiClient uses
Definition: IApiClient.cs:16
+
Token token
Backing field for Token
Definition: ServerClient.cs:50
+
readonly IApiClient apiClient
The IApiClient for the ServerClient
Definition: ServerClient.cs:45
+
Represents administrative server information
+
Represents a JWT returned by the API
Definition: Token.cs:8
+
string Token
The client's JWT
Definition: ApiHeaders.cs:81
+
string Bearer
The value of the JWT
Definition: Token.cs:13
+
IInstanceManagerClient Instances
Definition: ServerClient.cs:34
+
+

References Tgstation.Server.Client.ServerClient.apiClient, Tgstation.Server.Api.Models.Token.Bearer, Tgstation.Server.Client.IApiClient.Headers, Tgstation.Server.Client.ServerClient.Instances, Tgstation.Server.Client.ServerClient.token, Tgstation.Server.Api.ApiHeaders.Token, and Tgstation.Server.Client.ServerClient.Users.

+ +
+
+

Member Function Documentation

+ +

◆ AddRequestLogger()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Client.ServerClient.AddRequestLogger (IRequestLogger requestLogger)
+
+ +

Adds a requestLogger to the request pipeline

+ +

Implements Tgstation.Server.Client.IServerClient.

+ +
+
+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Client.ServerClient.Dispose ()
+
+ +

+ +
+
+ +

◆ Version()

+ +
+
+ + + + + + + + +
Task<ServerInformation> Tgstation.Server.Client.ServerClient.Version (CancellationToken cancellationToken)
+
+ +

The ServerInformation of the IServerClient

+ +

Implements Tgstation.Server.Client.IServerClient.

+ +
+
+

Member Data Documentation

+ +

◆ apiClient

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.ServerClient.apiClient
+
+private
+
+ +

The IApiClient for the ServerClient

+ +

Definition at line 45 of file ServerClient.cs.

+ +

Referenced by Tgstation.Server.Client.ServerClient.ServerClient().

+ +
+
+ +

◆ token

+ +
+
+ + + + + +
+ + + + +
Token Tgstation.Server.Client.ServerClient.token
+
+private
+
+ +

Backing field for Token

+ +

Definition at line 50 of file ServerClient.cs.

+ +

Referenced by Tgstation.Server.Client.ServerClient.ServerClient().

+ +
+
+ +

◆ Url

+ +
+
+ + + + +
Uri Tgstation.Server.Client.ServerClient.Url => apiClient.Url
+
+ +

+ +

Definition at line 13 of file ServerClient.cs.

+ +
+
+

Property Documentation

+ +

◆ Administration

+ +
+
+ + + + + +
+ + + + +
IAdministrationClient Tgstation.Server.Client.ServerClient.Administration
+
+get
+
+ +

+ +

Definition at line 37 of file ServerClient.cs.

+
37 { get; }
+
+
+ +

◆ Instances

+ +
+
+ + + + + +
+ + + + +
IInstanceManagerClient Tgstation.Server.Client.ServerClient.Instances
+
+get
+
+ +

+ +

Definition at line 34 of file ServerClient.cs.

+
34 { get; }
+

Referenced by Tgstation.Server.Client.ServerClient.ServerClient().

+ +
+
+ +

◆ Timeout

+ +
+
+ + + + + +
+ + + + +
TimeSpan Tgstation.Server.Client.ServerClient.Timeout
+
+getset
+
+ +

+ +

Definition at line 28 of file ServerClient.cs.

+
28  {
29  get => apiClient.Timeout;
30  set => apiClient.Timeout = value;
31  }
TimeSpan Timeout
The request timeout
Definition: IApiClient.cs:26
+
readonly IApiClient apiClient
The IApiClient for the ServerClient
Definition: ServerClient.cs:45
+
+

Referenced by Tgstation.Server.Client.ServerClientFactory.CreateServerClient().

+ +
+
+ +

◆ Token

+ +
+
+ + + + + +
+ + + + +
Token?? Tgstation.Server.Client.ServerClient.Token
+
+getset
+
+ +

+ +

Definition at line 17 of file ServerClient.cs.

+
17  {
18  get => token;
19  set
20  {
21  token = value ?? throw new InvalidOperationException("Cannot set a null Token!");
23  }
24  }
ApiHeaders Headers
The ApiHeaders the IApiClient uses
Definition: IApiClient.cs:16
+
Token token
Backing field for Token
Definition: ServerClient.cs:50
+
ProductHeaderValue UserAgent
The client's user agent as a ProductHeaderValue if valid
Definition: ApiHeaders.cs:66
+
readonly IApiClient apiClient
The IApiClient for the ServerClient
Definition: ServerClient.cs:45
+
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
string Bearer
The value of the JWT
Definition: Token.cs:13
+
+
+
+ +

◆ Users

+ +
+
+ + + + + +
+ + + + +
IUsersClient Tgstation.Server.Client.ServerClient.Users
+
+get
+
+ +

+ +

Definition at line 40 of file ServerClient.cs.

+
40 { get; }
+

Referenced by Tgstation.Server.Client.ServerClient.ServerClient().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_server_client.png b/class_tgstation_1_1_server_1_1_client_1_1_server_client.png new file mode 100644 index 0000000000000000000000000000000000000000..89fb244bdcfe3e9b2bf7609d4ccfdb26ff93d873 GIT binary patch literal 1060 zcmeAS@N?(olHy`uVBq!ia0vp^w}H5WgBeIhy60&FDTx4|5ZC|z{{xvX-h3_XKQsZz z0^11C+Jve|Qzt>tW$o0pg0JhXYQ-SMp|v9D$r z8;4G+Tav%wZ^}loo0pDmYfk)M_4dWTsrh{iYhSfTcy7(TYt;X^Hs?-Q|~8pZ02r zO6jjtFI7FS7nynf;*Xl?JLw-g$Q6@8&au6j)Kloo_-C#hLw8oqc>F-Q%kY@1>y#y`Pje=v_@7e)hQp0R|0afPsrkJp>)0iS@5-K1 zuV+|)va;It(DQip_N4n&$GdzdS>^tnT#)%LqbhB7>70VsH|8C@v3R@dvLEF~N@iEM zeJinR`a7%4W%HX=%cmXQ9e!(7(c0^M#(BE8%~V9RhND=XjbDy}{p_T#ur+9CAXL7Ot*{_-}XsYGyIYPuhQLTo{`>pGU<2fzV7S2xoShtW_K=E>1R*Y zJZ`xiI@hNATv*+ytdM8#0(S>-YR_Hex-`Q{QWmX~U_ zelmmD(;S9xPl(6zfgFlDT1*Ef6`3(qgRs@jpiIW1)7#IlE)@7B&)8FXMz(TkU*vAi z)miteF0bCWs9s3#tgNrU;JhufH%M)iJ$^`ACpza`ef4{}wZ=PcX1uTRwPuPcGd=%i z&!s%yTW2G9Z)^+Xa8;fVZK&9)^!FQ&=f?{+i(>=cel^~$xmq!L-h}Y0P1EeT4>&x1 z%Njj9#<;9F?EQ@{_cx%x?zs80Nd5Av> + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.ServerClientFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.ServerClientFactory, including all inherited members.

+ + + + + + +
ApiClientFactoryTgstation.Server.Client.ServerClientFactoryprivatestatic
CreateServerClient(Uri host, string username, string password, TimeSpan timeout, CancellationToken cancellationToken)Tgstation.Server.Client.ServerClientFactory
CreateServerClient(Uri host, Token token, TimeSpan timeout)Tgstation.Server.Client.ServerClientFactory
productHeaderValueTgstation.Server.Client.ServerClientFactoryprivate
ServerClientFactory(ProductHeaderValue productHeaderValue)Tgstation.Server.Client.ServerClientFactory
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.html b/class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.html new file mode 100644 index 0000000000..bcb9b0ab6d --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.html @@ -0,0 +1,327 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.ServerClientFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.ServerClientFactory Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Client.ServerClientFactory:
+
+
+ + +Tgstation.Server.Client.IServerClientFactory + +
+ + + + + + + + + + + +

+Public Member Functions

 ServerClientFactory (ProductHeaderValue productHeaderValue)
 Construct a ServerClientFactory More...
 
async Task< IServerClientCreateServerClient (Uri host, string username, string password, TimeSpan timeout, CancellationToken cancellationToken)
 Create a IServerClient More...
 
IServerClient CreateServerClient (Uri host, Token token, TimeSpan timeout)
 Create a IServerClient More...
 
+ + + + +

+Private Attributes

readonly ProductHeaderValue productHeaderValue
 The ProductHeaderValue for the ServerClientFactory More...
 
+ + + + +

+Static Private Attributes

static readonly IApiClientFactory ApiClientFactory = new ApiClientFactory()
 The IApiClientFactory for the ServerClientFactory More...
 
+

Detailed Description

+
+

Definition at line 11 of file ServerClientFactory.cs.

+

Constructor & Destructor Documentation

+ +

◆ ServerClientFactory()

+ +
+
+ + + + + + + + +
Tgstation.Server.Client.ServerClientFactory.ServerClientFactory (ProductHeaderValue productHeaderValue)
+
+ +

Construct a ServerClientFactory

+
Parameters
+ + +
productHeaderValueThe value of productHeaderValue
+
+
+ +

Definition at line 27 of file ServerClientFactory.cs.

+
28  {
29  this.productHeaderValue = productHeaderValue ?? throw new ArgumentNullException(nameof(productHeaderValue));
30  }
readonly ProductHeaderValue productHeaderValue
The ProductHeaderValue for the ServerClientFactory
+
+

References Tgstation.Server.Client.ServerClientFactory.productHeaderValue.

+ +
+
+

Member Function Documentation

+ +

◆ CreateServerClient() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task<IServerClient> Tgstation.Server.Client.ServerClientFactory.CreateServerClient (Uri host,
string username,
string password,
TimeSpan timeout,
CancellationToken cancellationToken 
)
+
+ +

Create a IServerClient

+ +

Implements Tgstation.Server.Client.IServerClientFactory.

+ +

Definition at line 33 of file ServerClientFactory.cs.

+
34  {
35  if (host == null)
36  throw new ArgumentNullException(nameof(host));
37  if (username == null)
38  throw new ArgumentNullException(nameof(username));
39  if (password == null)
40  throw new ArgumentNullException(nameof(password));
41 
42  Token token;
43  using (var api = ApiClientFactory.CreateApiClient(host, new ApiHeaders(productHeaderValue, username, password)))
44  {
45  if (timeout != default)
46  api.Timeout = timeout;
47  token = await api.Update<Token>(Routes.Root, cancellationToken).ConfigureAwait(false);
48  }
49 
50  return CreateServerClient(host, token, timeout);
51  }
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
Routes to a server actions
Definition: Routes.cs:9
+
IApiClient CreateApiClient(Uri url, ApiHeaders apiHeaders)
Create an IApiClient
+
const string Root
The root controller
Definition: Routes.cs:14
+
Represents a JWT returned by the API
Definition: Token.cs:8
+
readonly ProductHeaderValue productHeaderValue
The ProductHeaderValue for the ServerClientFactory
+
static readonly IApiClientFactory ApiClientFactory
The IApiClientFactory for the ServerClientFactory
+
async Task< IServerClient > CreateServerClient(Uri host, string username, string password, TimeSpan timeout, CancellationToken cancellationToken)
Create a IServerClient
+
+

References Tgstation.Server.Client.ApiClientFactory.CreateApiClient(), Tgstation.Server.Client.ServerClientFactory.productHeaderValue, and Tgstation.Server.Api.Routes.Root.

+ +
+
+ +

◆ CreateServerClient() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
IServerClient Tgstation.Server.Client.ServerClientFactory.CreateServerClient (Uri host,
Token token,
TimeSpan timeout 
)
+
+ +

Create a IServerClient

+ +

Implements Tgstation.Server.Client.IServerClientFactory.

+ +

Definition at line 54 of file ServerClientFactory.cs.

+
55  {
56  if (host == null)
57  throw new ArgumentNullException(nameof(host));
58  if (token == null)
59  throw new ArgumentNullException(nameof(token));
60  var result = new ServerClient(ApiClientFactory.CreateApiClient(host, new ApiHeaders(productHeaderValue, token.Bearer)), token);
61  if (timeout != default)
62  result.Timeout = timeout;
63  return result;
64  }
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
IApiClient CreateApiClient(Uri url, ApiHeaders apiHeaders)
Create an IApiClient
+
readonly ProductHeaderValue productHeaderValue
The ProductHeaderValue for the ServerClientFactory
+
static readonly IApiClientFactory ApiClientFactory
The IApiClientFactory for the ServerClientFactory
+
string Bearer
The value of the JWT
Definition: Token.cs:13
+
+

References Tgstation.Server.Api.Models.Token.Bearer, Tgstation.Server.Client.ApiClientFactory.CreateApiClient(), Tgstation.Server.Client.ServerClientFactory.productHeaderValue, and Tgstation.Server.Client.ServerClient.Timeout.

+ +
+
+

Member Data Documentation

+ +

◆ ApiClientFactory

+ +
+
+ + + + + +
+ + + + +
readonly IApiClientFactory Tgstation.Server.Client.ServerClientFactory.ApiClientFactory = new ApiClientFactory()
+
+staticprivate
+
+ +

The IApiClientFactory for the ServerClientFactory

+ +

Definition at line 16 of file ServerClientFactory.cs.

+ +
+
+ +

◆ productHeaderValue

+ +
+
+ + + + + +
+ + + + +
readonly ProductHeaderValue Tgstation.Server.Client.ServerClientFactory.productHeaderValue
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.png b/class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..b952c64fcc845cb5a86f04d75722a1fb38f8e7a8 GIT binary patch literal 923 zcmeAS@N?(olHy`uVBq!ia0y~yU}Oif12~w0q;jW29*~j<@CkAK|NlRb`Qpvj(*8pe zfGjXRaNq!I=N)++ZVUp80m+$#y%90)>-)>wh{6SeA*zS)~iWXtpB`rZlnB3n?wI?0nw z`1OQ_p0z3^$JAG^7JPeZarlaE;p1~>%Z2Rjy;go`;jNaOx7U?bgigBs+VMbO(}E=` zGjFV%8?`gDn&V$*%4$pY$kTIuiuoSi_flW?K*ZtR%V};MnR&+bgx@Pxj^*@7W0s?);GklENN(*1@D7^i>-IRT={*s?& z-&?Qse|dZ(yhQ8xi%nO&Z#`Z3_?Ye;@u$-`zPow^JuE0VJ?Tkw=Bb5m8&!VpTV?(B z)517&m7n(}&Fy>Dq+;*;EP?Nt!=%7x0TwaWOCuRRtpCc&FwN3NVjs^T8Ifkk8O^^{ z7+7XDTh3r+a3PucD=rh{b<)d&;loEG_F@Beh7P0lHs`$A46j!7->>g&{3_3QAj1F6 z32py5x7Mz8tDc#=;C#DX-dDe8{Ekm<1XkGfI`8hi`s4&d!lHSHi>Lm3P-CdO|J}{s zB3y4ieLehN{f(u@+^&VcetkQ&ygXz3=2tn7@)o_Haadc-!)QW4J4;H=&)ZG@ViC%> zj=Hbkzxj6LOUDgejZ3U?KrLY`QiGo`*Ie)4IFy$BR`=7w=!*;Qp34dlZ=K|vNm?kt=u)={wAJwe9!%I|JmAwUzK$&zlqL0Ww^`et5#)g+V+iH-(7dA z9;&? + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.ServerErrorException Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_server_error_exception.html b/class_tgstation_1_1_server_1_1_client_1_1_server_error_exception.html new file mode 100644 index 0000000000..57dd3bd344 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_server_error_exception.html @@ -0,0 +1,265 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.ServerErrorException Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.ServerErrorException Class Reference
+
+
+ +

Occurs when an error occurs in the server + More...

+
+Inheritance diagram for Tgstation.Server.Client.ServerErrorException:
+
+
+ + +Tgstation.Server.Client.ClientException + +
+ + + + + + + + + + + +

+Public Member Functions

 ServerErrorException ()
 Construct an ServerErrorException More...
 
 ServerErrorException (string html)
 Construct an ServerErrorException with html More...
 
 ServerErrorException (string message, Exception innerException)
 Construct an ServerErrorException with a message and innerException More...
 
+ + + + + + + + + + + +

+Properties

string Html [get]
 The raw HTML of the error More...
 
- Properties inherited from Tgstation.Server.Client.ClientException
HttpStatusCode StatusCode [get]
 The HttpStatusCode of the ClientException More...
 
Version ServerApiVersion [get]
 The Version of the server's API More...
 
+ + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from Tgstation.Server.Client.ClientException
 ClientException??? (ErrorMessage errorMessage, HttpStatusCode statusCode)
 Construct a ClientException using an errorMessage and statusCode More...
 
 ClientException ()
 Construct a ClientException More...
 
 ClientException (string message)
 Construct a ClientException with a message More...
 
 ClientException (string message, Exception innerException)
 Construct a ClientException with a message and innerException More...
 
+

Detailed Description

+

Occurs when an error occurs in the server

+ +

Definition at line 10 of file ServerErrorException.cs.

+

Constructor & Destructor Documentation

+ +

◆ ServerErrorException() [1/3]

+ +
+
+ + + + + + + +
Tgstation.Server.Client.ServerErrorException.ServerErrorException ()
+
+ +

Construct an ServerErrorException

+ +

Definition at line 20 of file ServerErrorException.cs.

+
20 { }
+
+
+ +

◆ ServerErrorException() [2/3]

+ +
+
+ + + + + + + + +
Tgstation.Server.Client.ServerErrorException.ServerErrorException (string html)
+
+ +

Construct an ServerErrorException with html

+
Parameters
+ + +
htmlThe raw HTML response of the ServerErrorException
+
+
+ +

Definition at line 26 of file ServerErrorException.cs.

+
26  : base(new ErrorMessage
27  {
28  Message = "An internal server error occurred!",
29  SeverApiVersion = null
30  }, HttpStatusCode.InternalServerError)
31  {
32  Html = html;
33  }
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+
+
+ +

◆ ServerErrorException() [3/3]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.ServerErrorException.ServerErrorException (string message,
Exception innerException 
)
+
+ +

Construct an ServerErrorException with a message and innerException

+
Parameters
+ + + +
messageThe message for the Exception
innerExceptionThe inner Exception for the base Exception
+
+
+ +

Definition at line 40 of file ServerErrorException.cs.

+
40 : base(message, innerException) { }
+
+
+

Property Documentation

+ +

◆ Html

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Client.ServerErrorException.Html
+
+get
+
+ +

The raw HTML of the error

+ +

Definition at line 15 of file ServerErrorException.cs.

+
15 { get; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_server_error_exception.png b/class_tgstation_1_1_server_1_1_client_1_1_server_error_exception.png new file mode 100644 index 0000000000000000000000000000000000000000..a402e6d2b419ffba86523ffe2e31b6e9b766ba20 GIT binary patch literal 1235 zcmeAS@N?(olHy`uVBq!ia0y~yVB`g|J2;quIz>rW{OH}-S^5_Rc+0>0EK-zu_ipCC>2A7r z-o2YXtLnbF{e7RqclWN}u6K3&g&Fek-3!)D{-tqw^S}A`oo4U;{r!b)_Ts$uS?|AT zy!*(P`|jQSMdnv~Q=gf;@Xi+2DF2>+arP@W=fy(5_L_W~vRU=h=?tCFk_CBxa->Sb zOU_MMKfhwxpA?{#;lEleT%1kr+%>M{1G=N!+r;JYUE9eS9c{a-mvy>nF7^1z^n<~c zQRN~-#@8CI_6&wOCIKa=AZ`jM+3+k3^Re|F&K5WWiX@& z@m^#&p(2G%;m1xBx&GtMQF?M|X_sn%s%Okh1u8c%K3(Fw_{!-shxYFG`_EVV(As#j zpzgMr>(?&KpUj$>_Hkd&l{0HX%X8<7#8wJBy?4iyz*$(zN&P)$3Ld%gwz1AIp(c+-T*Rl~#7aw)f`3NY3q| zx8EmhI267Au0mT*S$FcXwd);c8*nafytHBW>&%X0c5md8&1#+mo_Vw2$E}lFZZegd zMc=)_X4`wc^U9f7)ic~qY|NW_Pa=E9?*6Zb<$BK+wjaBwmUG5IdE>9cCcCVc&YgZ( z=w3z&>!#A0nC|Un&*x6kooMg%cwgQV6R8Q$=L+SnFFQ5Y*ZP&i-5>oXk7f#WeOVZE zTvqgTRd9aN($K$J%I6eMh6s+Gb5LE9((+;f`$?4rRf@_$JG!L-UdnuO5l{B z-Me)e({E5D7G*u}XD9;2;nu`6v0|??^3CUNFgy2`m$zZ^vu}%#ZQI%nqp8&_r>d-p1P?rF#JgIC|=d>5!P|KWW; zaYuJal+7|A7=0#GxCvsLx(zjT#)eTeBtW7Sl)1M8}kk`alU-{EgZaj-VIrTcQ1Y+=X^>bP0l+XkK D!w*vQ literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception-members.html b/class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception-members.html new file mode 100644 index 0000000000..af8185e96f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception-members.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.ServiceUnavailableException Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception.html b/class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception.html new file mode 100644 index 0000000000..a86e401b3b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception.html @@ -0,0 +1,230 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.ServiceUnavailableException Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.ServiceUnavailableException Class Reference
+
+
+ +

Occurs when the client makes a request while the server is starting or stopping + More...

+
+Inheritance diagram for Tgstation.Server.Client.ServiceUnavailableException:
+
+
+ + +Tgstation.Server.Client.ClientException + +
+ + + + + + + + + + + +

+Public Member Functions

 ServiceUnavailableException ()
 Construct an ServiceUnavailableException More...
 
 ServiceUnavailableException (string message)
 Construct an ServiceUnavailableException with a message More...
 
 ServiceUnavailableException (string message, Exception innerException)
 Construct an ServiceUnavailableException with a message and innerException More...
 
+ + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from Tgstation.Server.Client.ClientException
 ClientException??? (ErrorMessage errorMessage, HttpStatusCode statusCode)
 Construct a ClientException using an errorMessage and statusCode More...
 
 ClientException ()
 Construct a ClientException More...
 
 ClientException (string message)
 Construct a ClientException with a message More...
 
 ClientException (string message, Exception innerException)
 Construct a ClientException with a message and innerException More...
 
- Properties inherited from Tgstation.Server.Client.ClientException
HttpStatusCode StatusCode [get]
 The HttpStatusCode of the ClientException More...
 
Version ServerApiVersion [get]
 The Version of the server's API More...
 
+

Detailed Description

+

Occurs when the client makes a request while the server is starting or stopping

+ +

Definition at line 10 of file ServiceUnavailableException.cs.

+

Constructor & Destructor Documentation

+ +

◆ ServiceUnavailableException() [1/3]

+ +
+
+ + + + + + + +
Tgstation.Server.Client.ServiceUnavailableException.ServiceUnavailableException ()
+
+ +

Construct an ServiceUnavailableException

+ +

Definition at line 15 of file ServiceUnavailableException.cs.

+
15  : base(new ErrorMessage
16  {
17  Message = "The server is currently starting or stopping and is unable to process the request!",
18  SeverApiVersion = null
19  }, HttpStatusCode.ServiceUnavailable)
20  { }
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+
+
+ +

◆ ServiceUnavailableException() [2/3]

+ +
+
+ + + + + + + + +
Tgstation.Server.Client.ServiceUnavailableException.ServiceUnavailableException (string message)
+
+ +

Construct an ServiceUnavailableException with a message

+
Parameters
+ + +
messageThe message for the Exception
+
+
+ +

Definition at line 26 of file ServiceUnavailableException.cs.

+
26 : base(message) { }
+
+
+ +

◆ ServiceUnavailableException() [3/3]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.ServiceUnavailableException.ServiceUnavailableException (string message,
Exception innerException 
)
+
+ +

Construct an ServiceUnavailableException with a message and innerException

+
Parameters
+ + + +
messageThe message for the Exception
innerExceptionThe inner Exception for the base Exception
+
+
+ +

Definition at line 33 of file ServiceUnavailableException.cs.

+
33 : base(message, innerException) { }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception.png b/class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception.png new file mode 100644 index 0000000000000000000000000000000000000000..7b5e6b91605b5e2a4f3e248ec8409f31163988d8 GIT binary patch literal 1437 zcmbtUYfw{17`=!Ri!wv8DxyrNP~QRbFhUTamSDnbY>H6LC_baX-lQ}_(4#r@$}rxMwx12IDg`=Yg%n)HbMk_b3H|zG`NNFYJ+v$9kg0aLs2{< zEKDr9dcW**uEUmkQzP#p%8HTLKquL-nZ)EcGW5HfvNdsrraodY_1x>`q68!>suyCv zt)Q1KhMkyqtD=Zuo~Rn4MSoaXTnO~n?f@1>xG`PZCNkPqM|iyf%5`iYMB>r!8sOn~ zS?MAvAZ8J|+^$3!fG*1F2p^^^#UBKilJ_Ay${OOj3As#B)zVl7qp96O>S8d2QHJ*R zE{eExpAQp{k16U&91h1Xc{)8gD_5;7$K&CqP^jb-=-oO+Vlu`_mYULMA+sq)tsJ=v z4e2xM#W7z6@tL8yssg@S!FSY%f`R_WYWex^gJP_#mK3xJpbE~ zK1Y(uw*7QPde}BRtjjSRWD_?J+&*GlzF@_}hYH!~Rtu(LFU_p>UdA}(s9-gA$4qlT z`aE=RYHn5Ya{Q?a;izb-p1VR}1z*N+ZL6nx+AWt%%q6(ty`(?eapjoSiGGSvlyO6T z`2*gr&L_EZLTF&E{DgX6m<;M;C9h}6oCJoJ!XrC;K{Jn@Oh3-oQjS_4uMNwqF`Yfk zcGfAIiwJAtI%Ypw$=T5%4Z{*K*wkR`Q#CjLXdlnmA28}ba{8PBFNfn5^ULPr>%x14 z*U@-I=-6H`WOLh zwll76AAf9ZUBq3UcT$CjtVfuFKg70xl?PmThR+fCIzD} z_WKCB?dXs*T)WiK*x9)X=UI0%H7CVrGHJYS3`U!bzaPw4L&N#%vJlT=TZdT6FuOK- z@C0A4Riy=%qzRxLbJg{qx#Z?55}~i0gDKicS&0uMJMTV*S}aah5?A)et;uVb;3v}; zv%Lb{-#VewgsIRcn$^X%@po)2$4!TnAsbn@!LyFh>kHCbK%J&NRkG+LVhBTe=pGl+ z{lKRNgTSgjV7lldd=AxU{B2mNOfEIoLvj>d@Zw$pv@I1j`AUrHJ7N2h?6(Uc#c{f% zA@|BpA}PseoK=(bPZAwe_1T8)2B@j`>dCq+QF)retSqyEIp5~z!3QMR z>5~P5ZeI%+S1r;E^V!Bn9rfq^!SMi(94e>6B5X;YYL2yUg^nv9HPq()avCloNa$=g zJ*RO<{)$QpYP&}@pt*7kD-bv*T85HC=`d<0FQ5Ta={{ESAjQ=a@PGHO57+!FTfht| YIb*JJaOvy_(n|p*P-wK24E)1{Qv*} literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_api_client-members.html b/class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_api_client-members.html new file mode 100644 index 0000000000..59437d7257 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_api_client-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Tests.TestApiClient Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_api_client.html b/class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_api_client.html new file mode 100644 index 0000000000..b1efb325a8 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_api_client.html @@ -0,0 +1,150 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Tests.TestApiClient Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Tests.TestApiClient Class Reference
+
+
+ + + + + + +

+Public Member Functions

async Task TestDeserializingByondModelsWork ()
 
async Task TestUnrecognizedResponse ()
 
+

Detailed Description

+
+

Definition at line 18 of file TestApiClient.cs.

+

Member Function Documentation

+ +

◆ TestDeserializingByondModelsWork()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Client.Tests.TestApiClient.TestDeserializingByondModelsWork ()
+
+ +

Definition at line 21 of file TestApiClient.cs.

+
22  {
23  var sample = new Byond
24  {
25  Version = new Version(511, 1385)
26  };
27 
28  var sampleJson = JsonConvert.SerializeObject(sample, new JsonSerializerSettings
29  {
30  ContractResolver = new CamelCasePropertyNamesContractResolver(),
31  Converters = new[] { new VersionConverter() }
32  });
33 
34  var response = new HttpResponseMessage(HttpStatusCode.OK)
35  {
36  Content = new StringContent(sampleJson)
37  };
38 
39  var httpClient = new Mock<IHttpClient>();
40  httpClient.Setup(x => x.SendAsync(It.IsNotNull<HttpRequestMessage>(), It.IsAny<CancellationToken>())).Returns(Task.FromResult(response));
41 
42  var client = new ApiClient(httpClient.Object, new Uri("http://fake.com"), new ApiHeaders(new ProductHeaderValue("fake"), "fake"));
43 
44  var result = await client.Read<Byond>(Routes.Byond, default).ConfigureAwait(false);
45  Assert.AreEqual(sample.Version, result.Version);
46  }
const string Byond
The Models.Byond controller
Definition: Routes.cs:34
+
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
Routes to a server actions
Definition: Routes.cs:9
+
Represents a BYOND installation
Definition: Byond.cs:8
+
+

References Tgstation.Server.Api.Routes.Byond.

+ +
+
+ +

◆ TestUnrecognizedResponse()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Client.Tests.TestApiClient.TestUnrecognizedResponse ()
+
+ +

Definition at line 49 of file TestApiClient.cs.

+
50  {
51  var sample = new Byond
52  {
53  Version = new Version(511, 1385)
54  };
55 
56  var fakeJson = "asdfasd <>F#(*)U*#JLI";
57 
58  var response = new HttpResponseMessage(HttpStatusCode.OK)
59  {
60  Content = new StringContent(fakeJson)
61  };
62 
63  var httpClient = new Mock<IHttpClient>();
64  httpClient.Setup(x => x.SendAsync(It.IsNotNull<HttpRequestMessage>(), It.IsAny<CancellationToken>())).Returns(Task.FromResult(response));
65 
66  var client = new ApiClient(httpClient.Object, new Uri("http://fake.com"), new ApiHeaders(new ProductHeaderValue("fake"), "fake"));
67 
68  await Assert.ThrowsExceptionAsync<UnrecognizedResponseException>(() => client.Read<Byond>(Routes.Byond, default)).ConfigureAwait(false);
69  }
const string Byond
The Models.Byond controller
Definition: Routes.cs:34
+
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
Routes to a server actions
Definition: Routes.cs:9
+
Represents a BYOND installation
Definition: Byond.cs:8
+
+

References Tgstation.Server.Api.Routes.Byond.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_server_client_factory-members.html b/class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_server_client_factory-members.html new file mode 100644 index 0000000000..7b2e94e338 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_server_client_factory-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Tests.TestServerClientFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.Tests.TestServerClientFactory, including all inherited members.

+ + +
TestConstruction()Tgstation.Server.Client.Tests.TestServerClientFactory
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_server_client_factory.html b/class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_server_client_factory.html new file mode 100644 index 0000000000..6c890d24f3 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_server_client_factory.html @@ -0,0 +1,117 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Tests.TestServerClientFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Tests.TestServerClientFactory Class Reference
+
+
+ + + + +

+Public Member Functions

void TestConstruction ()
 
+

Detailed Description

+
+

Definition at line 8 of file TestServerClientFactory.cs.

+

Member Function Documentation

+ +

◆ TestConstruction()

+ +
+
+ + + + + + + +
void Tgstation.Server.Client.Tests.TestServerClientFactory.TestConstruction ()
+
+ +

Definition at line 11 of file TestServerClientFactory.cs.

+
12  {
13  Assert.ThrowsException<ArgumentNullException>(() => new ServerClientFactory(null));
14  new ServerClientFactory(new ProductHeaderValue("Tgstation.Server.Client.Tests", GetType().Assembly.GetName().Version.ToString()));
15  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception-members.html b/class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception-members.html new file mode 100644 index 0000000000..e7af46f067 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception-members.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.UnauthorizedException Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception.html b/class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception.html new file mode 100644 index 0000000000..076802bbad --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception.html @@ -0,0 +1,230 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.UnauthorizedException Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.UnauthorizedException Class Reference
+
+
+ +

Occurs when the client provides invalid credentials + More...

+
+Inheritance diagram for Tgstation.Server.Client.UnauthorizedException:
+
+
+ + +Tgstation.Server.Client.ClientException + +
+ + + + + + + + + + + +

+Public Member Functions

 UnauthorizedException ()
 Construct an UnauthorizedException More...
 
 UnauthorizedException (string message)
 Construct an UnauthorizedException with a message More...
 
 UnauthorizedException (string message, Exception innerException)
 Construct an UnauthorizedException with a message and innerException More...
 
+ + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from Tgstation.Server.Client.ClientException
 ClientException??? (ErrorMessage errorMessage, HttpStatusCode statusCode)
 Construct a ClientException using an errorMessage and statusCode More...
 
 ClientException ()
 Construct a ClientException More...
 
 ClientException (string message)
 Construct a ClientException with a message More...
 
 ClientException (string message, Exception innerException)
 Construct a ClientException with a message and innerException More...
 
- Properties inherited from Tgstation.Server.Client.ClientException
HttpStatusCode StatusCode [get]
 The HttpStatusCode of the ClientException More...
 
Version ServerApiVersion [get]
 The Version of the server's API More...
 
+

Detailed Description

+

Occurs when the client provides invalid credentials

+ +

Definition at line 10 of file UnauthorizedException.cs.

+

Constructor & Destructor Documentation

+ +

◆ UnauthorizedException() [1/3]

+ +
+
+ + + + + + + +
Tgstation.Server.Client.UnauthorizedException.UnauthorizedException ()
+
+ +

Construct an UnauthorizedException

+ +

Definition at line 15 of file UnauthorizedException.cs.

+
15  : base(new ErrorMessage
16  {
17  Message = "Invalid credentials!",
18  SeverApiVersion = null
19  }, HttpStatusCode.Unauthorized)
20  { }
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+
+
+ +

◆ UnauthorizedException() [2/3]

+ +
+
+ + + + + + + + +
Tgstation.Server.Client.UnauthorizedException.UnauthorizedException (string message)
+
+ +

Construct an UnauthorizedException with a message

+
Parameters
+ + +
messageThe message for the Exception
+
+
+ +

Definition at line 26 of file UnauthorizedException.cs.

+
26 : base(message) { }
+
+
+ +

◆ UnauthorizedException() [3/3]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.UnauthorizedException.UnauthorizedException (string message,
Exception innerException 
)
+
+ +

Construct an UnauthorizedException with a message and innerException

+
Parameters
+ + + +
messageThe message for the Exception
innerExceptionThe inner Exception for the base Exception
+
+
+ +

Definition at line 33 of file UnauthorizedException.cs.

+
33 : base(message, innerException) { }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception.png b/class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception.png new file mode 100644 index 0000000000000000000000000000000000000000..64648733984f13dd4cb2f649984f9b4f43a07155 GIT binary patch literal 1361 zcmeAS@N?(olHy`uVBq!ia0y~yU=#wfJ2;quq)hUZ1|TI7;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|!1BP;#WAFU@$KB3MUSm`SZ5bZ{rJDW zM)vfS0+p4Ns!t!b}ZPoFV4ovJ!>X4BM^G_J5oGc_YT)0Ta> z>a}dnyqP;sKYq7e@A7o*lV@z6?cV;@T(h#SHm5!FxKI4skG6m7{%M!aoEd+t{OzQd zB|ekq?T<>+U8-mNdG(KNF`sTRZ&nxFvT^FnpP@C;dV;Exm&LD3nfX0q^B*_W^BggsFS=W}-_-wr_bWS@o zy!_XHt}9x+Yqu}o_UqF8qkG<+e-vlSv&c-jx8p{E=gG}iJHouSM0jz&VEes!^GTzn zs!6u7xv!IaB0GKE4=2ulvu3r|w0+YX`;G-H-O>>e_+QQ^-0w)_nK|Ci{LKH#_LwL+ z{S;PBU3B@R<*OC_rJ0NEE0(0>{ct#GwQSDiMJWPb^{2?l$;2+a+Ba`%kI{0oJ@=+A zH@w|!d`qW3{$!<|q_*Jf+s(nr-}%l(_Iv}yBCqP#-r%4gTK(6V!#3}GvLNbe@~eRC z=wdmWzRIVQn$6EuED;n`J~yT2-Bmfkk76}xSEf&yQ`y^5;s0;uq}*Rx3o{X{kF{bDN_aiJBDLk4BvL#f6KDss277Kzj7JVlq6LKZ5`QJ>1NW~bQB`{%t*zTWyL@yE)_ ze>1X{r_TGU&+i{9pSXT*z-p5%_vYPt#l0({+V=MLtDB$QtXTPe@7KH6-;1giH{ZH< za!$xeW3ebrlW9RryAJ+)le5XEx-ξx;qmh|+uVlYSXZ2)wdjb2H~P$DAoT&M|CO zSv$Ql4|M(d?$G(>bJeybpFc7@+mO4xSZ`+gcHWyaFZWF{y7=wrcaYb=sCT7Po6OKF3}13^lx=`Z{)Jm{HW#TGhpD+vj?o2vvQ) zGi8lSP9DEs@7{`nZ<9_u=y>-;D0b1}m`&@K>?`z2ic5X|^_t%MhFh0{O!MEqm3B`H z + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.UnrecognizedResponseException Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html b/class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html new file mode 100644 index 0000000000..50e2064412 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html @@ -0,0 +1,272 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.UnrecognizedResponseException Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.UnrecognizedResponseException Class Reference
+
+
+ +

Occurs when a response is received that did not deserialize to one of the expected Api.Models + More...

+
+Inheritance diagram for Tgstation.Server.Client.UnrecognizedResponseException:
+
+
+ + +Tgstation.Server.Client.ClientException + +
+ + + + + + + + + + + + + + +

+Public Member Functions

 UnrecognizedResponseException (string data, HttpStatusCode statusCode)
 Construct an UnrecognizedResponseException with the data of a response body and the statusCode More...
 
 UnrecognizedResponseException ()
 Construct a UnrecognizedResponseException More...
 
 UnrecognizedResponseException (string message)
 Construct an UnrecognizedResponseException with a message More...
 
 UnrecognizedResponseException (string message, Exception innerException)
 Construct an UnrecognizedResponseException with a message and innerException More...
 
+ + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from Tgstation.Server.Client.ClientException
 ClientException??? (ErrorMessage errorMessage, HttpStatusCode statusCode)
 Construct a ClientException using an errorMessage and statusCode More...
 
 ClientException ()
 Construct a ClientException More...
 
 ClientException (string message)
 Construct a ClientException with a message More...
 
 ClientException (string message, Exception innerException)
 Construct a ClientException with a message and innerException More...
 
- Properties inherited from Tgstation.Server.Client.ClientException
HttpStatusCode StatusCode [get]
 The HttpStatusCode of the ClientException More...
 
Version ServerApiVersion [get]
 The Version of the server's API More...
 
+

Detailed Description

+

Occurs when a response is received that did not deserialize to one of the expected Api.Models

+ +

Definition at line 11 of file UnrecognizedResponseException.cs.

+

Constructor & Destructor Documentation

+ +

◆ UnrecognizedResponseException() [1/4]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException (string data,
HttpStatusCode statusCode 
)
+
+ +

Construct an UnrecognizedResponseException with the data of a response body and the statusCode

+
Parameters
+ + + +
dataThe body of the response
statusCodeThe HttpStatusCode for the ClientException
+
+
+ +

Definition at line 18 of file UnrecognizedResponseException.cs.

+
18  : base(new ErrorMessage
19  {
20  Message = String.Format(CultureInfo.InvariantCulture, "Unrecognized response body: {0}", data),
21  SeverApiVersion = null
22  }, statusCode)
23  { }
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+
+
+ +

◆ UnrecognizedResponseException() [2/4]

+ +
+
+ + + + + + + +
Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException ()
+
+ +

Construct a UnrecognizedResponseException

+ +

Definition at line 28 of file UnrecognizedResponseException.cs.

+
28 { }
+
+
+ +

◆ UnrecognizedResponseException() [3/4]

+ +
+
+ + + + + + + + +
Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException (string message)
+
+ +

Construct an UnrecognizedResponseException with a message

+
Parameters
+ + +
messageThe message for the Exception
+
+
+ +

Definition at line 34 of file UnrecognizedResponseException.cs.

+
34 : base(message) { }
+
+
+ +

◆ UnrecognizedResponseException() [4/4]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException (string message,
Exception innerException 
)
+
+ +

Construct an UnrecognizedResponseException with a message and innerException

+
Parameters
+ + + +
messageThe message for the Exception
innerExceptionThe inner Exception for the base Exception
+
+
+ +

Definition at line 41 of file UnrecognizedResponseException.cs.

+
41 : base(message, innerException) { }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.png b/class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.png new file mode 100644 index 0000000000000000000000000000000000000000..ed3fd45f9ffc3c707c55d526ae7cac70dfd7facf GIT binary patch literal 1472 zcmeAS@N?(olHy`uVBq!ia0y~yVDtsDJ2;quWJrytE0B^1@CkAK|NlRb`Qpvj(*8pe zfGjXRaNq!I=N)+BeOJEz_dor#%Xk0I@YY}IeXFMCkLbgg<)7Vm)}OmCzu#&0?%$?6 z(sIw8uKc#OPUL$Bho-i`UEmhJw{cfR)X1E2rD#m|=jCH~KeKM@RfOWkpxf~yl@&feoW@vh+ z_MQE`x?bdX4Cll9cdW$EMagem_U!)o1G`r8^=^N@aavQg=;uBAt?JJibi6V$HU2%} zvza{S%&7&D8{cvSSfJE! zcDwf8b=_&4>&)EQeQXPMi^U!LqFo!ZX!@p~Rrh6XuZeTne<}IRJ+FGv;PbzZ?fYqe zyC=QMLS^=3qjwx1W7dAVePhd!Bg=b|*B(Dwc&7Nijm72TpkO$sIlDK^cyqjx{p-(W z=l24`@qf4Wt(dU>nK$zbJ!hw-IRV2rXd-I(<`vIc=IL|UWG?#y_8p8I4J@DpaNF04 zu?QI3D({Sz3M;Szqu*JN>d}vsuzrZnUOGj|OH-ARtAW9yH-{-jaW+Hb2{i|?O`H>s zCKX#wZg_jE?%w|1wcqD590Mf)TWLA@`TOq$_V16h^IYfm*>%6I>_W5Ozo+^(^!dxx zciyf1CTzwSHLbJg9bLT!^wtqwV-=oW{OzzD) z9+j0SEcZ+Av5CCmyU6yxchx4(sQIf=8a>xrzJ9^tZ9h9&h4i>?i!zD*%szM8o8#EF zj%#VQVc%J*54YCby7%|)zOAn|{a@2;!~ZDx-`ulW`?GEw3;qz<(Dvi=fwZqIXFqR0 zT-toR`tOy~|E}9!KKEtg?I`x@&wQnCZt(OyTe>fQvv*D8n~j+Xz;rV8tnLSoW1D2! zS1;bUd2_?7nNqXgo{+z36Z5k9>{7Ypl)`}7hfhggedgGE#q77^>g4?W>9db$oX>hv zp1bd!`Ej$=XMRnUOWq&z^6=b^H?8dNn3o5=;(C14Zg;Zryq6FEWbtjR5)DnSlF7`D zx}I3S%>1~Y`QeW<<;?rmpZih~vMyPt{oA>jcGm)L_q=9&@Tz9|vz_hL7k6*HInRJW z{K;>V|0~Zf-N3l+%=OHF(X$zt9&jT?BdC0MXXXtm98XpLW3GF`yTq-_Y#Xq+W$<+M Kb6Mw<&;$S_pT=we literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_client_1_1_users_client-members.html b/class_tgstation_1_1_server_1_1_client_1_1_users_client-members.html new file mode 100644 index 0000000000..83422d8e5f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_users_client-members.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.UsersClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.UsersClient, including all inherited members.

+ + + + + + + + + + +
apiClientTgstation.Server.Client.UsersClientprivate
Create(UserUpdate user, CancellationToken cancellationToken)Tgstation.Server.Client.UsersClient
GetId(User user, CancellationToken cancellationToken)Tgstation.Server.Client.UsersClient
List(CancellationToken cancellationToken)Tgstation.Server.Client.UsersClient
Read(CancellationToken cancellationToken)Tgstation.Server.Client.UsersClient
Update(UserUpdate user, CancellationToken cancellationToken)Tgstation.Server.Client.UsersClient
User(Routes.User, user ?? throw new ArgumentNullException(nameof(user)), cancellationToken)Tgstation.Server.Client.UsersClientprivate
User(Routes.User, user ?? throw new ArgumentNullException(nameof(user)), cancellationToken)Tgstation.Server.Client.UsersClientprivate
UsersClient(IApiClient apiClient)Tgstation.Server.Client.UsersClient
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_users_client.html b/class_tgstation_1_1_server_1_1_client_1_1_users_client.html new file mode 100644 index 0000000000..59a60314cc --- /dev/null +++ b/class_tgstation_1_1_server_1_1_client_1_1_users_client.html @@ -0,0 +1,426 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.UsersClient Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.UsersClient Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Client.UsersClient:
+
+
+ + +Tgstation.Server.Client.IUsersClient + +
+ + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 UsersClient (IApiClient apiClient)
 Construct an UsersClient More...
 
Task< UserCreate (UserUpdate user, CancellationToken cancellationToken)
 Create a new user More...
 
Task< UserGetId (User user, CancellationToken cancellationToken)
 Get a specific user More...
 
Task< IReadOnlyList< User > > List (CancellationToken cancellationToken)
 List all Users More...
 
Task< UserRead (CancellationToken cancellationToken)
 Read the current user's information and general rights More...
 
Task< UserUpdate (UserUpdate user, CancellationToken cancellationToken)
 Update a user More...
 
+ + + + + +

+Private Member Functions

Task< UserUser (Routes.User, user ?? throw new ArgumentNullException(nameof(user)), cancellationToken)
 
Task< UserUser (Routes.User, user ?? throw new ArgumentNullException(nameof(user)), cancellationToken)
 
+ + + + +

+Private Attributes

readonly IApiClient apiClient
 The apiClient for the UsersClient More...
 
+

Detailed Description

+
+

Definition at line 11 of file UsersClient.cs.

+

Constructor & Destructor Documentation

+ +

◆ UsersClient()

+ +
+
+ + + + + + + + +
Tgstation.Server.Client.UsersClient.UsersClient (IApiClient apiClient)
+
+ +

Construct an UsersClient

+
Parameters
+ + +
apiClientThe value of apiClient
+
+
+ +

Definition at line 22 of file UsersClient.cs.

+
23  {
24  this.apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient));
25  }
readonly IApiClient apiClient
The apiClient for the UsersClient
Definition: UsersClient.cs:16
+
+

References Tgstation.Server.Client.UsersClient.apiClient.

+ +
+
+

Member Function Documentation

+ +

◆ Create()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<User> Tgstation.Server.Client.UsersClient.Create (UserUpdate user,
CancellationToken cancellationToken 
)
+
+ +

Create a new user

+ +

Implements Tgstation.Server.Client.IUsersClient.

+ +
+
+ +

◆ GetId()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<User> Tgstation.Server.Client.UsersClient.GetId (User user,
CancellationToken cancellationToken 
)
+
+ +

Get a specific user

+ +

Implements Tgstation.Server.Client.IUsersClient.

+ +
+
+ +

◆ List()

+ +
+
+ + + + + + + + +
Task<IReadOnlyList<User> > Tgstation.Server.Client.UsersClient.List (CancellationToken cancellationToken)
+
+ +

List all Users

+ +

Implements Tgstation.Server.Client.IUsersClient.

+ +
+
+ +

◆ Read()

+ +
+
+ + + + + + + + +
Task<User> Tgstation.Server.Client.UsersClient.Read (CancellationToken cancellationToken)
+
+ +

Read the current user's information and general rights

+ +

Implements Tgstation.Server.Client.IUsersClient.

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<User> Tgstation.Server.Client.UsersClient.Update (UserUpdate user,
CancellationToken cancellationToken 
)
+
+ +

Update a user

+ +

Implements Tgstation.Server.Client.IUsersClient.

+ +
+
+ +

◆ User() [1/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<User> Tgstation.Server.Client.UsersClient.User (Routes. User,
user ?? throw new  ArgumentNullExceptionnameof(user),
cancellationToken  
)
+
+private
+
+ +
+
+ +

◆ User() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<User> Tgstation.Server.Client.UsersClient.User (Routes. User,
user ?? throw new  ArgumentNullExceptionnameof(user),
cancellationToken  
)
+
+private
+
+ +
+
+

Member Data Documentation

+ +

◆ apiClient

+ +
+
+ + + + + +
+ + + + +
readonly IApiClient Tgstation.Server.Client.UsersClient.apiClient
+
+private
+
+ +

The apiClient for the UsersClient

+ +

Definition at line 16 of file UsersClient.cs.

+ +

Referenced by Tgstation.Server.Client.UsersClient.UsersClient().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_client_1_1_users_client.png b/class_tgstation_1_1_server_1_1_client_1_1_users_client.png new file mode 100644 index 0000000000000000000000000000000000000000..16264e51a437e6592961c886614ec74188b9f148 GIT binary patch literal 846 zcmeAS@N?(olHy`uVBq!ia0vp^SAaNxgBeJMDXxA3q$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IZ0?s~d7hEy=VoqMEvrng(pI*H3>E5w7S6*Ck^t`m-x5%*@8h`2?{w5eZ>jj z>~t$FUsZf>gMUPvoAs6UTgR7&-^}Bldf!YfwK*@>CZz6qoLAO#PL1q<%^KN>X*q&+ zv+rf!S*f?`{L5=<4O#xXR~{?j4V&~NC0{)tR`+Ybq)C_a&BO!Lu5SLfZs8}dtCyp> z)=6`1T6xSc};AfEq;4vY+!^2yRgp2^*q-#_Ph`M$!k_`6>K;~TQI)v zW9H1M^FMDjKA)R*cYWEE{QQk;k4;d@3rJpyIP)h+4*kW6qQWQ zN{#z0Dw&qN)}eL@leVl{^l9>vrCS%OWU_+8D1XIci@tWw2l6jjKbY7GzWQ3Fa8-EW zJ)iT7t5mMMt7FK{aAsVyfR}YclbOf?u3G^N+5`pa!@V?ZeN`ILGhte_LS9Nc?7sE( zces!JJ{AG(<8E=P-F0CM%d7kAmb-1fxjBBbMDpSf@eAudbSx;E{(sH!^1xU7i@(Gy z+hu+Bh0L#(r&G5$=bbyaI;Xt#)OxA*O^(~;7(?pr#;M#&WjZBw#pP7g4A1Bm{}tbh ztgp6y;k;XQBtUn8?^DjV*_<5Uz_`MfuJpUc+h_-r_}&nRc{hh^bU%`5(V^*I`_&a39{>)i9 zx9nZv<-b|MKevhB&dr&*%Pn>8t$@yrnGx%wT(9O8tXO8;&-m)wVwMd}Y{0N*2)n!^ z_^mYCh9!qSF-Js7b0q*nzCrZM&o#@YT-y9ao;_bD|w- Bi + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Byond.ByondExecutableLock Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.html new file mode 100644 index 0000000000..789279434b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.html @@ -0,0 +1,318 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Byond.ByondExecutableLock Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Byond.ByondExecutableLock Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Byond.ByondExecutableLock:
+
+
+ + +Tgstation.Server.Host.Components.Byond.IByondExecutableLock +IDisposable + +
+ + + + + + + + + + +

+Public Member Functions

 ByondExecutableLock (Version version, string dreamDaemonPath, string dreamMakerPath)
 Construct a ByondExecutableLock More...
 
void Dispose ()
 
void DoNotDeleteThisSession ()
 Call if, during a detach, this version should not be deleted More...
 
+ + + + + + + + + + + + + + + + + +

+Properties

Version Version [get]
 
string DreamDaemonPath [get]
 
string DreamMakerPath [get]
 
- Properties inherited from Tgstation.Server.Host.Components.Byond.IByondExecutableLock
Version Version [get]
 The System.Version of the locked executables More...
 
string DreamDaemonPath [get]
 The path to the DreamDaemon executable More...
 
string DreamMakerPath [get]
 The path to the dm/DreamMaker executable More...
 
+

Detailed Description

+
+

Definition at line 6 of file ByondExecutableLock.cs.

+

Constructor & Destructor Documentation

+ +

◆ ByondExecutableLock()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Byond.ByondExecutableLock.ByondExecutableLock (Version version,
string dreamDaemonPath,
string dreamMakerPath 
)
+
+ +

Construct a ByondExecutableLock

+
Parameters
+ + + + +
versionThe value of Version
dreamDaemonPathThe value of DreamDaemonPath
dreamMakerPathThe value of DreamMakerPath
+
+
+ +

Definition at line 23 of file ByondExecutableLock.cs.

+
24  {
25  Version = version ?? throw new ArgumentNullException(nameof(version));
26  DreamDaemonPath = dreamDaemonPath ?? throw new ArgumentNullException(nameof(dreamDaemonPath));
27  DreamMakerPath = dreamMakerPath ?? throw new ArgumentNullException(nameof(dreamMakerPath));
28  }
+ + +
+

References Tgstation.Server.Host.Components.Byond.ByondExecutableLock.DreamDaemonPath, Tgstation.Server.Host.Components.Byond.ByondExecutableLock.DreamMakerPath, and Tgstation.Server.Host.Components.Byond.ByondExecutableLock.Version.

+ +
+
+

Member Function Documentation

+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Byond.ByondExecutableLock.Dispose ()
+
+ +

+ +

Definition at line 34 of file ByondExecutableLock.cs.

+
34 { }
+
+
+ +

◆ DoNotDeleteThisSession()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Byond.ByondExecutableLock.DoNotDeleteThisSession ()
+
+ +

Call if, during a detach, this version should not be deleted

+ +

Implements Tgstation.Server.Host.Components.Byond.IByondExecutableLock.

+ +

Definition at line 37 of file ByondExecutableLock.cs.

+
37 { }
+
+
+

Property Documentation

+ +

◆ DreamDaemonPath

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Byond.ByondExecutableLock.DreamDaemonPath
+
+get
+
+ +

+ +

Definition at line 12 of file ByondExecutableLock.cs.

+
12 { get; }
+

Referenced by Tgstation.Server.Host.Components.Byond.ByondExecutableLock.ByondExecutableLock().

+ +
+
+ +

◆ DreamMakerPath

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Byond.ByondExecutableLock.DreamMakerPath
+
+get
+
+ +

+ +

Definition at line 15 of file ByondExecutableLock.cs.

+
15 { get; }
+

Referenced by Tgstation.Server.Host.Components.Byond.ByondExecutableLock.ByondExecutableLock().

+ +
+
+ +

◆ Version

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Host.Components.Byond.ByondExecutableLock.Version
+
+get
+
+ +

+ +

Definition at line 9 of file ByondExecutableLock.cs.

+
9 { get; }
+

Referenced by Tgstation.Server.Host.Components.Byond.ByondExecutableLock.ByondExecutableLock().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..06a6b209abb85773e73235ebf6feaae08b425af3 GIT binary patch literal 1699 zcmb`Ic~H|w6vuyvNQf|Trg#()WQ-^v1QA70lTtwVMFSL2ps08N9-u)(5@{~6Qc$OY zK@JTNEuex33ThI<5fv?m5akFefq*20G>}vx1o;u@&raLv*#6h<%-6*#^#%?1QY9sFh%k z9Fi(Sk7IWx!Yk&)-tFrt`uszEN~dqxF3mgv5jEpokh}t|x$jQZl!Z6;zs_*8J*PP&7QdSj@X%?isNKMhG{a#$l) zU`P7Ka*KYhn2K(;>`b_a1b4k*)?!9{N184a*DM2{!V?bJ-2&|@?gzG7?8yqEg-bbe7db7T>UVq*G)Q2wObJs-fXbMd?`J#`iZaR9a!YUtfYgB851ZzdUPo+V? zJ>gA$(!wWvABRm#xg`xE1rEKa=Ln%!$B%J>PPKQESTmP2SEq`h$Rk|RXs~J4R%E%h z!9!$9JJgn{0GYe_`uHw_b^DNMk1%^%uNYdfRr`8bqR1#D7YP^9LB603Cw^ zj6^@1=>eCSnR9di1=G0DW5Ui>lmheUm-m12_%E;zw)SCKtLC>>t+P!tfwkiLnGo&? z#o?G>d~z*gIWa_r*xzU+S)dgwx6IqQzHPxBpe&?v=|DPkfx95m=PB~KBRQ6#fdwuYVs;O(3!2(@U!~I+TFA zMX|MUiSWl*{|fFSvrU>YG+rn%tgEnic&PFf%^-Q8X}#8*?H8$LM)~iJSX+W@ihAhO zhV9+8QCY9<7#+kmKAL^i)Ytjd6~o#Cn8sbu8-L1#aqPs|asM$PHQFj?xM(mQTKMu$ zEX#C@^=e)+T{4g$E!6fly$Wsk@~OyCWi9Z)yp%Go#;I0$xNA6(Id=P~vg7a8Dy_@5 zEe~JaRaN--B+L@jPoHczLIAT@K6~c)g6N!Bvz*vSY#Ym5o~N|* SOO?Ps3IO^A`c{0s|LkwOd~W9e literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager-members.html new file mode 100644 index 0000000000..fc78cbb77c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager-members.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Byond.ByondManager Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Byond.ByondManager, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + +
ActiveVersionTgstation.Server.Host.Components.Byond.ByondManager
ActiveVersionFileNameTgstation.Server.Host.Components.Byond.ByondManagerprivate
BinPathTgstation.Server.Host.Components.Byond.ByondManager
byondInstallerTgstation.Server.Host.Components.Byond.ByondManagerprivate
ByondManager(IIOManager ioManager, IByondInstaller byondInstaller, IEventConsumer eventConsumer, ILogger< ByondManager > logger)Tgstation.Server.Host.Components.Byond.ByondManager
ChangeVersion(Version version, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Byond.ByondManager
Dispose()Tgstation.Server.Host.Components.Byond.ByondManager
eventConsumerTgstation.Server.Host.Components.Byond.ByondManagerprivate
InstalledVersionsTgstation.Server.Host.Components.Byond.ByondManager
installedVersionsTgstation.Server.Host.Components.Byond.ByondManagerprivate
InstallVersion(Version version, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Byond.ByondManagerprivate
ioManagerTgstation.Server.Host.Components.Byond.ByondManagerprivate
loggerTgstation.Server.Host.Components.Byond.ByondManagerprivate
semaphoreTgstation.Server.Host.Components.Byond.ByondManagerprivate
StartAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Byond.ByondManager
StopAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Byond.ByondManager
UseExecutables(Version requiredVersion, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Byond.ByondManager
VersionFileNameTgstation.Server.Host.Components.Byond.ByondManagerprivate
VersionKey(Version version)Tgstation.Server.Host.Components.Byond.ByondManagerprivatestatic
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html new file mode 100644 index 0000000000..0d25db53b7 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html @@ -0,0 +1,833 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Byond.ByondManager Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Byond.ByondManager Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Byond.ByondManager:
+
+
+ + +Tgstation.Server.Host.Components.Byond.IByondManager +IHostedService +IDisposable + +
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

 ByondManager (IIOManager ioManager, IByondInstaller byondInstaller, IEventConsumer eventConsumer, ILogger< ByondManager > logger)
 Construct a ByondManager More...
 
void Dispose ()
 
async Task ChangeVersion (Version version, CancellationToken cancellationToken)
 Change the active BYOND version More...
 
async Task< IByondExecutableLockUseExecutables (Version requiredVersion, CancellationToken cancellationToken)
 Lock the current installation's location and return a IByondExecutableLock More...
 
async Task StartAsync (CancellationToken cancellationToken)
 
Task StopAsync (CancellationToken cancellationToken)
 
+ + + + +

+Public Attributes

const string BinPath = "byond/bin"
 The path to the BYOND bin folder More...
 
+ + + + + + + + + + + + +

+Properties

Version ActiveVersion [get, private set]
 
IReadOnlyList< Version > InstalledVersions [get]
 
- Properties inherited from Tgstation.Server.Host.Components.Byond.IByondManager
Version ActiveVersion [get]
 The currently active BYOND version More...
 
IReadOnlyList< Version > InstalledVersions [get]
 The installed BYOND versions More...
 
+ + + + +

+Private Member Functions

async Task InstallVersion (Version version, CancellationToken cancellationToken)
 Installs a BYOND version if it isn't already More...
 
+ + + + +

+Static Private Member Functions

static string VersionKey (Version version)
 Converts a BYOND version to a string More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

const string VersionFileName = "Version.txt"
 The file in which we store the VersionKey(Version) for installations More...
 
const string ActiveVersionFileName = "ActiveVersion.txt"
 The file in which we store the VersionKey(Version) for the active installation More...
 
readonly IIOManager ioManager
 The IIOManager for the ByondManager More...
 
readonly IByondInstaller byondInstaller
 The IByondInstaller for the ByondManager More...
 
readonly IEventConsumer eventConsumer
 The IEventConsumer for the ByondManager More...
 
readonly ILogger< ByondManagerlogger
 The ILogger for the ByondManager More...
 
readonly Dictionary< string, Task > installedVersions
 Map of byond Versions to Tasks that complete when they are installed More...
 
readonly SemaphoreSlim semaphore
 The SemaphoreSlim for the ByondManager More...
 
+

Detailed Description

+
+

Definition at line 16 of file ByondManager.cs.

+

Constructor & Destructor Documentation

+ +

◆ ByondManager()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Byond.ByondManager.ByondManager (IIOManager ioManager,
IByondInstaller byondInstaller,
IEventConsumer eventConsumer,
ILogger< ByondManagerlogger 
)
+
+ +

Construct a ByondManager

+
Parameters
+ + + + + +
ioManagerThe value of ioManager
byondInstallerThe value of byondInstaller
eventConsumerThe value of eventConsumer
loggerThe value of logger
+
+
+ +

Definition at line 90 of file ByondManager.cs.

+
91  {
92  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
93  this.byondInstaller = byondInstaller ?? throw new ArgumentNullException(nameof(byondInstaller));
94  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
95  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
96 
97  installedVersions = new Dictionary<string, Task>();
98  semaphore = new SemaphoreSlim(1);
99  }
readonly IIOManager ioManager
The IIOManager for the ByondManager
Definition: ByondManager.cs:49
+
readonly Dictionary< string, Task > installedVersions
Map of byond Versions to Tasks that complete when they are installed
Definition: ByondManager.cs:69
+
readonly ILogger< ByondManager > logger
The ILogger for the ByondManager
Definition: ByondManager.cs:64
+
readonly IByondInstaller byondInstaller
The IByondInstaller for the ByondManager
Definition: ByondManager.cs:54
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the ByondManager
Definition: ByondManager.cs:74
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the ByondManager
Definition: ByondManager.cs:59
+
+

References Tgstation.Server.Host.Components.Byond.ByondManager.byondInstaller, Tgstation.Server.Host.Components.Byond.ByondManager.eventConsumer, Tgstation.Server.Host.Components.Byond.ByondManager.installedVersions, Tgstation.Server.Host.Components.Byond.ByondManager.ioManager, Tgstation.Server.Host.Components.Byond.ByondManager.logger, and Tgstation.Server.Host.Components.Byond.ByondManager.semaphore.

+ +
+
+

Member Function Documentation

+ +

◆ ChangeVersion()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Byond.ByondManager.ChangeVersion (Version version,
CancellationToken cancellationToken 
)
+
+ +

Change the active BYOND version

+ +

Implements Tgstation.Server.Host.Components.Byond.IByondManager.

+ +

Definition at line 179 of file ByondManager.cs.

+
180  {
181  if (version == null)
182  throw new ArgumentNullException(nameof(version));
183  var versionKey = VersionKey(version);
184  await InstallVersion(version, cancellationToken).ConfigureAwait(false);
185  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
186  {
187  await ioManager.WriteAllBytes(ActiveVersionFileName, Encoding.UTF8.GetBytes(versionKey), cancellationToken).ConfigureAwait(false);
188  await eventConsumer.HandleEvent(EventType.ByondActiveVersionChange, new List<string> { ActiveVersion != null ? VersionKey(ActiveVersion) : null, versionKey }, cancellationToken).ConfigureAwait(false);
189  ActiveVersion = version;
190  }
191  }
readonly IIOManager ioManager
The IIOManager for the ByondManager
Definition: ByondManager.cs:49
+
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+ +
const string ActiveVersionFileName
The file in which we store the VersionKey(Version) for the active installation
Definition: ByondManager.cs:31
+
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+
async Task InstallVersion(Version version, CancellationToken cancellationToken)
Installs a BYOND version if it isn't already
+
Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+
static string VersionKey(Version version)
Converts a BYOND version to a string
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the ByondManager
Definition: ByondManager.cs:74
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the ByondManager
Definition: ByondManager.cs:59
+ +
+

References Tgstation.Server.Host.Components.Byond.ByondManager.ActiveVersion, Tgstation.Server.Host.Components.Byond.ByondManager.ActiveVersionFileName, Tgstation.Server.Host.Components.Byond.ByondManager.eventConsumer, Tgstation.Server.Host.Components.IEventConsumer.HandleEvent(), Tgstation.Server.Host.Components.Byond.ByondManager.InstallVersion(), Tgstation.Server.Host.Components.Byond.ByondManager.ioManager, Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), Tgstation.Server.Host.Components.Byond.ByondManager.semaphore, Tgstation.Server.Host.Components.Byond.ByondManager.VersionKey(), and Tgstation.Server.Host.IO.IIOManager.WriteAllBytes().

+ +
+
+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Byond.ByondManager.Dispose ()
+
+ +

+ +
+
+ +

◆ InstallVersion()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Byond.ByondManager.InstallVersion (Version version,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Installs a BYOND version if it isn't already

+
Parameters
+ + + +
versionThe BYOND Version to install
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 110 of file ByondManager.cs.

+
111  {
112  var ourTcs = new TaskCompletionSource<object>();
113  Task inProgressTask;
114 
115  var versionKey = VersionKey(version);
116  bool installed;
117  lock (installedVersions)
118  {
119  installed = installedVersions.TryGetValue(versionKey, out inProgressTask);
120  if (!installed)
121  installedVersions.Add(versionKey, ourTcs.Task);
122  }
123 
124  if (installed)
125  using (cancellationToken.Register(() => ourTcs.SetCanceled()))
126  {
127  await Task.WhenAny(ourTcs.Task, inProgressTask).ConfigureAwait(false);
128  cancellationToken.ThrowIfCancellationRequested();
129  return;
130  }
131 
132  // okay up to us to install it then
133  try
134  {
135  await eventConsumer.HandleEvent(EventType.ByondInstallStart, new List<string> { versionKey }, cancellationToken).ConfigureAwait(false);
136  var downloadTask = byondInstaller.DownloadVersion(version, cancellationToken);
137 
138  await ioManager.DeleteDirectory(versionKey, cancellationToken).ConfigureAwait(false);
139  await ioManager.CreateDirectory(versionKey, cancellationToken).ConfigureAwait(false);
140 
141  try
142  {
143  var download = await downloadTask.ConfigureAwait(false);
144  await ioManager.ZipToDirectory(versionKey, download, cancellationToken).ConfigureAwait(false);
145  await byondInstaller.InstallByond(ioManager.ResolvePath(versionKey), version, cancellationToken).ConfigureAwait(false);
146 
147  // make sure to do this last because this is what tells us we have a valid version in the future
148  await ioManager.WriteAllBytes(ioManager.ConcatPath(versionKey, VersionFileName), Encoding.UTF8.GetBytes(version.ToString()), cancellationToken).ConfigureAwait(false);
149  }
150  catch (WebException e)
151  {
152  // since the user can easily provide non-exitent version numbers, we'll turn this into a JobException
153  throw new JobException(String.Format(CultureInfo.InvariantCulture, "Error downloading BYOND version: {0}", e.Message));
154  }
155  catch (OperationCanceledException)
156  {
157  throw;
158  }
159  catch
160  {
161  await ioManager.DeleteDirectory(versionKey, cancellationToken).ConfigureAwait(false);
162  throw;
163  }
164 
165  ourTcs.SetResult(null);
166  }
167  catch (Exception e)
168  {
169  if (!(e is OperationCanceledException))
170  await eventConsumer.HandleEvent(EventType.ByondInstallFail, new List<string> { e.Message }, cancellationToken).ConfigureAwait(false);
171  lock (installedVersions)
172  installedVersions.Remove(versionKey);
173  ourTcs.SetException(e);
174  throw;
175  }
176  }
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
readonly IIOManager ioManager
The IIOManager for the ByondManager
Definition: ByondManager.cs:49
+
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+
Task ZipToDirectory(string path, byte[] zipFileBytes, CancellationToken cancellationToken)
Extract a set of zipFileBytes to a given path
+
Task< byte[]> DownloadVersion(Version version, CancellationToken cancellationToken)
Download a given BYOND version
+
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+
Task InstallByond(string path, Version version, CancellationToken cancellationToken)
Does actions necessary to get an extracted BYOND installation working
+
Task CreateDirectory(string path, CancellationToken cancellationToken)
Create a directory at path
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
readonly Dictionary< string, Task > installedVersions
Map of byond Versions to Tasks that complete when they are installed
Definition: ByondManager.cs:69
+
const string VersionFileName
The file in which we store the VersionKey(Version) for installations
Definition: ByondManager.cs:26
+
readonly IByondInstaller byondInstaller
The IByondInstaller for the ByondManager
Definition: ByondManager.cs:54
+
Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+
static string VersionKey(Version version)
Converts a BYOND version to a string
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the ByondManager
Definition: ByondManager.cs:59
+
+

References Tgstation.Server.Host.Components.Byond.ByondManager.byondInstaller, Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.IO.IIOManager.CreateDirectory(), Tgstation.Server.Host.IO.IIOManager.DeleteDirectory(), Tgstation.Server.Host.Components.Byond.IByondInstaller.DownloadVersion(), Tgstation.Server.Host.Components.Byond.ByondManager.eventConsumer, Tgstation.Server.Host.Components.IEventConsumer.HandleEvent(), Tgstation.Server.Host.Components.Byond.IByondInstaller.InstallByond(), Tgstation.Server.Host.Components.Byond.ByondManager.installedVersions, Tgstation.Server.Host.Components.Byond.ByondManager.ioManager, Tgstation.Server.Host.IO.IIOManager.ResolvePath(), Tgstation.Server.Host.Components.Byond.ByondManager.VersionFileName, Tgstation.Server.Host.Components.Byond.ByondManager.VersionKey(), Tgstation.Server.Host.IO.IIOManager.WriteAllBytes(), and Tgstation.Server.Host.IO.IIOManager.ZipToDirectory().

+ +

Referenced by Tgstation.Server.Host.Components.Byond.ByondManager.ChangeVersion(), and Tgstation.Server.Host.Components.Byond.ByondManager.UseExecutables().

+ +
+
+ +

◆ StartAsync()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Byond.ByondManager.StartAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 207 of file ByondManager.cs.

+
208  {
209  async Task<byte[]> GetActiveVersion()
210  {
211  var activeVersionFileExists = await ioManager.FileExists(ActiveVersionFileName, cancellationToken).ConfigureAwait(false);
212  return !activeVersionFileExists ? null : await ioManager.ReadAllBytes(ActiveVersionFileName, cancellationToken).ConfigureAwait(false);
213  }
214 
215  var activeVersionBytesTask = GetActiveVersion();
216 
217  await ioManager.CreateDirectory(".", cancellationToken).ConfigureAwait(false);
218  var directories = await ioManager.GetDirectories(".", cancellationToken).ConfigureAwait(false);
219 
220  async Task ReadVersion(string path)
221  {
222  var versionFile = ioManager.ConcatPath(path, VersionFileName);
223  if (!await ioManager.FileExists(versionFile, cancellationToken).ConfigureAwait(false))
224  {
225  logger.LogInformation("Cleaning unparsable version path: {0}", ioManager.ResolvePath(path));
226  await ioManager.DeleteDirectory(path, cancellationToken).ConfigureAwait(false); // cleanup
227  return;
228  }
229 
230  var bytes = await ioManager.ReadAllBytes(versionFile, cancellationToken).ConfigureAwait(false);
231  var text = Encoding.UTF8.GetString(bytes);
232  if (Version.TryParse(text, out var version))
233  {
234  var key = VersionKey(version);
235  lock (installedVersions)
236  if (!installedVersions.ContainsKey(key))
237  {
238  installedVersions.Add(key, Task.CompletedTask);
239  return;
240  }
241  }
242 
243  await ioManager.DeleteDirectory(path, cancellationToken).ConfigureAwait(false);
244  }
245 
246  await Task.WhenAll(directories.Select(x => ReadVersion(x))).ConfigureAwait(false);
247 
248  var activeVersionBytes = await activeVersionBytesTask.ConfigureAwait(false);
249  if (activeVersionBytes != null)
250  {
251  var activeVersionString = Encoding.UTF8.GetString(activeVersionBytes);
252  if (Version.TryParse(activeVersionString, out var activeVersion))
253  ActiveVersion = activeVersion;
254  else
255  await ioManager.DeleteFile(ActiveVersionFileName, cancellationToken).ConfigureAwait(false);
256  }
257  }
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
readonly IIOManager ioManager
The IIOManager for the ByondManager
Definition: ByondManager.cs:49
+ +
const string ActiveVersionFileName
The file in which we store the VersionKey(Version) for the active installation
Definition: ByondManager.cs:31
+
Task< IReadOnlyList< string > > GetDirectories(string path, CancellationToken cancellationToken)
Returns directory names in a given path
+
Task CreateDirectory(string path, CancellationToken cancellationToken)
Create a directory at path
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists
+
readonly Dictionary< string, Task > installedVersions
Map of byond Versions to Tasks that complete when they are installed
Definition: ByondManager.cs:69
+
readonly ILogger< ByondManager > logger
The ILogger for the ByondManager
Definition: ByondManager.cs:64
+
const string VersionFileName
The file in which we store the VersionKey(Version) for installations
Definition: ByondManager.cs:26
+
static string VersionKey(Version version)
Converts a BYOND version to a string
+
Task< byte[]> ReadAllBytes(string path, CancellationToken cancellationToken)
Returns all the contents of a file at path as a byte array
+
Task DeleteFile(string path, CancellationToken cancellationToken)
Deletes a file at path
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
+

References Tgstation.Server.Host.Components.Byond.ByondManager.ActiveVersion, Tgstation.Server.Host.Components.Byond.ByondManager.ActiveVersionFileName, Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.IO.IIOManager.CreateDirectory(), Tgstation.Server.Host.IO.IIOManager.DeleteDirectory(), Tgstation.Server.Host.IO.IIOManager.DeleteFile(), Tgstation.Server.Host.IO.IIOManager.FileExists(), Tgstation.Server.Host.IO.IIOManager.GetDirectories(), Tgstation.Server.Host.Components.Byond.ByondManager.installedVersions, Tgstation.Server.Host.Components.Byond.ByondManager.ioManager, Tgstation.Server.Host.Components.Byond.ByondManager.logger, Tgstation.Server.Host.IO.IIOManager.ReadAllBytes(), Tgstation.Server.Host.IO.IIOManager.ResolvePath(), Tgstation.Server.Host.Components.Byond.ByondManager.VersionFileName, and Tgstation.Server.Host.Components.Byond.ByondManager.VersionKey().

+ +

Referenced by Tgstation.Server.Host.Components.Instance.StartAsync().

+ +
+
+ +

◆ StopAsync()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.Byond.ByondManager.StopAsync (CancellationToken cancellationToken)
+
+ +

+ +
+
+ +

◆ UseExecutables()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task<IByondExecutableLock> Tgstation.Server.Host.Components.Byond.ByondManager.UseExecutables (Version requiredVersion,
CancellationToken cancellationToken 
)
+
+ +

Lock the current installation's location and return a IByondExecutableLock

+ +

Implements Tgstation.Server.Host.Components.Byond.IByondManager.

+ +

Definition at line 194 of file ByondManager.cs.

+
195  {
196  var versionToUse = requiredVersion ?? ActiveVersion;
197  if (versionToUse == null)
198  throw new JobException("No BYOND versions installed!");
199  await InstallVersion(versionToUse, cancellationToken).ConfigureAwait(false);
200 
201  var versionKey = VersionKey(versionToUse);
202 
204  }
readonly IIOManager ioManager
The IIOManager for the ByondManager
Definition: ByondManager.cs:49
+ +
string DreamMakerName
Get the file name of the DreamMaker executable
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
async Task InstallVersion(Version version, CancellationToken cancellationToken)
Installs a BYOND version if it isn't already
+
string DreamDaemonName
Get the file name of the DreamDaemon executable
+
readonly IByondInstaller byondInstaller
The IByondInstaller for the ByondManager
Definition: ByondManager.cs:54
+
static string VersionKey(Version version)
Converts a BYOND version to a string
+
const string BinPath
The path to the BYOND bin folder
Definition: ByondManager.cs:21
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+
+

References Tgstation.Server.Host.Components.Byond.ByondManager.ActiveVersion, Tgstation.Server.Host.Components.Byond.ByondManager.BinPath, Tgstation.Server.Host.Components.Byond.ByondManager.byondInstaller, Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.Components.Byond.IByondInstaller.DreamDaemonName, Tgstation.Server.Host.Components.Byond.IByondInstaller.DreamMakerName, Tgstation.Server.Host.Components.Byond.ByondManager.InstallVersion(), Tgstation.Server.Host.Components.Byond.ByondManager.ioManager, Tgstation.Server.Host.IO.IIOManager.ResolvePath(), and Tgstation.Server.Host.Components.Byond.ByondManager.VersionKey().

+ +
+
+ +

◆ VersionKey()

+ +
+
+ + + + + +
+ + + + + + + + +
static string Tgstation.Server.Host.Components.Byond.ByondManager.VersionKey (Version version)
+
+staticprivate
+
+
+

Member Data Documentation

+ +

◆ ActiveVersionFileName

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.ByondManager.ActiveVersionFileName = "ActiveVersion.txt"
+
+private
+
+ +

The file in which we store the VersionKey(Version) for the active installation

+ +

Definition at line 31 of file ByondManager.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Byond.ByondManager.ChangeVersion(), and Tgstation.Server.Host.Components.Byond.ByondManager.StartAsync().

+ +
+
+ +

◆ BinPath

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Byond.ByondManager.BinPath = "byond/bin"
+
+
+ +

◆ byondInstaller

+ +
+
+ + + + + +
+ + + + +
readonly IByondInstaller Tgstation.Server.Host.Components.Byond.ByondManager.byondInstaller
+
+private
+
+
+ +

◆ eventConsumer

+ +
+
+ + + + + +
+ + + + +
readonly IEventConsumer Tgstation.Server.Host.Components.Byond.ByondManager.eventConsumer
+
+private
+
+
+ +

◆ installedVersions

+ +
+
+ + + + + +
+ + + + +
readonly Dictionary<string, Task> Tgstation.Server.Host.Components.Byond.ByondManager.installedVersions
+
+private
+
+
+ +

◆ ioManager

+ + + +

◆ logger

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<ByondManager> Tgstation.Server.Host.Components.Byond.ByondManager.logger
+
+private
+
+
+ +

◆ semaphore

+ +
+
+ + + + + +
+ + + + +
readonly SemaphoreSlim Tgstation.Server.Host.Components.Byond.ByondManager.semaphore
+
+private
+
+
+ +

◆ VersionFileName

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.ByondManager.VersionFileName = "Version.txt"
+
+private
+
+ +

The file in which we store the VersionKey(Version) for installations

+ +

Definition at line 26 of file ByondManager.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Byond.ByondManager.InstallVersion(), and Tgstation.Server.Host.Components.Byond.ByondManager.StartAsync().

+ +
+
+

Property Documentation

+ +

◆ ActiveVersion

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Host.Components.Byond.ByondManager.ActiveVersion
+
+getprivate set
+
+
+ +

◆ InstalledVersions

+ +
+
+ + + + + +
+ + + + +
IReadOnlyList<Version> Tgstation.Server.Host.Components.Byond.ByondManager.InstalledVersions
+
+get
+
+ +

+ +

Definition at line 38 of file ByondManager.cs.

+
38  {
39  get
40  {
41  lock (installedVersions)
42  return installedVersions.Select(x => Version.Parse(x.Key)).ToList();
43  }
44  }
readonly Dictionary< string, Task > installedVersions
Map of byond Versions to Tasks that complete when they are installed
Definition: ByondManager.cs:69
+
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..3821aec1097ba6f07996d3b5b8a4193daa090b96 GIT binary patch literal 2280 zcmbW3e^^p!7ROE3n$()9G+pyYju@sH=9*fTw5Fq126GHy^0!m>1Vf=P(A+Am9u z1a=0MO0iMWMn!Z~#L+1y(MnJ$6iCfX6D>&?L}9Nx&ush0&dxr2pXc6t&ikDAz3=-y zpL3pjIU+n{gPEfR+-nfrGFQZi(JFRzb^rs-j-d1977~sFJ@iwjhuc;ERhU>-!G&;VJM*37xQh z*7l2SF{Jdip%Y99tP=;cx%xS33@=NjIGCmp=r?d+fm9kOb$MF$LKg$uG{XT%E2qbm z1ubV6N%Z}(q8$%+$6(ux+WNn8P6u>IcA0E8Zq81Skge!$ZJ+nO@j~L4&y6#EMKxH| zE2iSN4`LVuLAD%%Uy)t+0dklbp}NFBjZ}BQAhW`-5eF5K&)}J#fv-TcF7YwafJvlC z_;4wZ+HQQ$McET@T2`JSpsPk?y16FHp=A43Ca{2Ouj6LqW%NqmaSJRc3!XvFIv0@u zNFiFv#9lU%x&g*hK_52%hOGUUL6sXn1J5x4MtJ?#G|Y>_e@R`>K&U@bi~JinqEm1OgNwUcg9HlMto`c0VCzfXOsR4Qw;NF>rW6U#RW zHYC?L{4ii{T6%%H)y!{$i-+YY+puWY=iVjUh)%34_ExSqLKL{>&aKM)-wDhz{0gbD z>D8oPIIYY-x2oYT7Y~a{P_yGZu}Rxk!9)P&CLpCRJ`anw`6)^&T)a`ak1p02(3&}4 zpATIgI!ONV`hiNTvUiy-oU1Qu4i(uoGaX^?g2cKN$M9Nk**+Sf&9e-obWF9B;l9+w zg}-tIi0?!>k|WN_Eyz@~;hhd8>Nv71$@k zH)PW`(--f(W6jUn`W8W!eCArhEajU#`ACQdT$9#ArS52Tyk#A8wug zHZ3jljDOMVT~n!}wXBrQ!i+M!!Z+?i>Ca@`leI@hU4le9LElHpq%M0=0vL`5v_x3D z>NJ@DX*S;Xdx#dV&)RKx@N8Wg4Lo)fo1gkMuwcAAeL^2qCM)8AnZ65x^D&@55AHn@ zEV=qsc~%=A`#-@2cFX(TNb$KtYYdt4o4Ll14z04C-`v~)(!G9_?yd4N58SQXj8&?k zw@ZGH>i-%4|2OcyZYurz*ek-x^nD+>CR$i|+98t7OsaFoK6g866KZPF6Zv)5A-6<7 zdavc$$Ti*ds4CCmm`=v)b^Z0F9foGX=8=nuMYzVy3GK4B@QJ9P zi>9K$64<|Iz#&0~tAjUxl7P_t4GiLQ6^j`R^<{!DhoVn*10lujQ7~Rju!?9)cY{^; zUJpH12>0{y7qWA3PZMU?d_{{!{&+m#$66)+Zq5t!tj`ZL?h1rHH7v>*s-qE7mt8n> z!61gcVbYQ4ri%rWCvCaOCy(jW*R_#QWtA{of96tfY5z~m#;6b`;O#+qGN)f5`Q>Oj zkiomb&&Pl@LN|?vp)s~;&qU?&8gb9m*hhS>?r^}8*lLCl*hVSGOG4Xfgl+sf%`VsH zr_^jbs=YuRDvh~+%&rASAYt!_b{}4jm0nxPpyAwJ9fq>-L=CSXiNwnp09jr*B(3#U z)RIXZw9F7`f1SP}OqYdeQDlWl?@9NHaxia*)I8(DFWvE&W0dW9=mbF$ix^3rUKCZ7KXNLz3k literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer-members.html new file mode 100644 index 0000000000..cefa26082b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer-members.html @@ -0,0 +1,99 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Byond.PosixByondInstaller Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Byond.PosixByondInstaller, including all inherited members.

+ + + + + + + + + + + + + + + +
ByondCachePathTgstation.Server.Host.Components.Byond.PosixByondInstallerprivate
ByondRevisionsURLTemplateTgstation.Server.Host.Components.Byond.PosixByondInstallerprivate
CleanCache(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Byond.PosixByondInstaller
DownloadVersion(Version version, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Byond.PosixByondInstaller
DreamDaemonExecutableNameTgstation.Server.Host.Components.Byond.PosixByondInstallerprivate
DreamDaemonNameTgstation.Server.Host.Components.Byond.PosixByondInstaller
DreamMakerExecutableNameTgstation.Server.Host.Components.Byond.PosixByondInstallerprivate
DreamMakerNameTgstation.Server.Host.Components.Byond.PosixByondInstaller
InstallByond(string path, Version version, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Byond.PosixByondInstaller
ioManagerTgstation.Server.Host.Components.Byond.PosixByondInstallerprivate
loggerTgstation.Server.Host.Components.Byond.PosixByondInstallerprivate
PosixByondInstaller(IIOManager ioManager, IPostWriteHandler postWriteHandler, ILogger< PosixByondInstaller > logger)Tgstation.Server.Host.Components.Byond.PosixByondInstaller
postWriteHandlerTgstation.Server.Host.Components.Byond.PosixByondInstallerprivate
ShellScriptExtensionTgstation.Server.Host.Components.Byond.PosixByondInstallerprivate
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html new file mode 100644 index 0000000000..e7b37ac274 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html @@ -0,0 +1,593 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Byond.PosixByondInstaller Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Byond.PosixByondInstaller Class Reference
+
+
+ +

IByondInstaller for Posix systems + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Byond.PosixByondInstaller:
+
+
+ + +Tgstation.Server.Host.Components.Byond.IByondInstaller + +
+ + + + + + + + + + + + + + +

+Public Member Functions

 PosixByondInstaller (IIOManager ioManager, IPostWriteHandler postWriteHandler, ILogger< PosixByondInstaller > logger)
 Construct a WindowsByondInstaller More...
 
async Task CleanCache (CancellationToken cancellationToken)
 Attempts to cleans the BYOND cache folder for the system More...
 
async Task< byte[]> DownloadVersion (Version version, CancellationToken cancellationToken)
 Download a given BYOND version More...
 
Task InstallByond (string path, Version version, CancellationToken cancellationToken)
 Does actions necessary to get an extracted BYOND installation working More...
 
+ + + + + +

+Public Attributes

string DreamDaemonName => DreamDaemonExecutableName + ShellScriptExtension
 
string DreamMakerName => DreamMakerExecutableName + ShellScriptExtension
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

const string ByondRevisionsURLTemplate = "https://secure.byond.com/download/build/{0}/{0}.{1}_byond_linux.zip"
 The URL format string for getting BYOND linux version {0}.{1} zipfile More...
 
const string ByondCachePath = "~/.byond/cache"
 Path to the BYOND cache More...
 
const string DreamDaemonExecutableName = "DreamDaemon"
 
const string DreamMakerExecutableName = "DreamMaker"
 
const string ShellScriptExtension = ".sh"
 
readonly IIOManager ioManager
 The IIOManager for the PosixByondInstaller More...
 
readonly IPostWriteHandler postWriteHandler
 The IPostWriteHandler for the PosixByondInstaller More...
 
readonly ILogger< PosixByondInstallerlogger
 The ILogger for the PosixByondInstaller More...
 
+ + + + + + + + +

+Additional Inherited Members

- Properties inherited from Tgstation.Server.Host.Components.Byond.IByondInstaller
string DreamDaemonName [get]
 Get the file name of the DreamDaemon executable More...
 
string DreamMakerName [get]
 Get the file name of the DreamMaker executable More...
 
+

Detailed Description

+

IByondInstaller for Posix systems

+ +

Definition at line 14 of file PosixByondInstaller.cs.

+

Constructor & Destructor Documentation

+ +

◆ PosixByondInstaller()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Byond.PosixByondInstaller.PosixByondInstaller (IIOManager ioManager,
IPostWriteHandler postWriteHandler,
ILogger< PosixByondInstallerlogger 
)
+
+ +

Construct a WindowsByondInstaller

+
Parameters
+ + + + +
ioManagerThe value of ioManager
postWriteHandlerThe value of postWriteHandler
loggerThe value of logger
+
+
+ +

Definition at line 57 of file PosixByondInstaller.cs.

+
58  {
59  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
60  this.postWriteHandler = postWriteHandler ?? throw new ArgumentNullException(nameof(postWriteHandler));
61  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
62  }
readonly ILogger< PosixByondInstaller > logger
The ILogger for the PosixByondInstaller
+
readonly IIOManager ioManager
The IIOManager for the PosixByondInstaller
+
readonly IPostWriteHandler postWriteHandler
The IPostWriteHandler for the PosixByondInstaller
+
+

References Tgstation.Server.Host.Components.Byond.PosixByondInstaller.ioManager, Tgstation.Server.Host.Components.Byond.PosixByondInstaller.logger, and Tgstation.Server.Host.Components.Byond.PosixByondInstaller.postWriteHandler.

+ +
+
+

Member Function Documentation

+ +

◆ CleanCache()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Byond.PosixByondInstaller.CleanCache (CancellationToken cancellationToken)
+
+ +

Attempts to cleans the BYOND cache folder for the system

+ +

Implements Tgstation.Server.Host.Components.Byond.IByondInstaller.

+ +

Definition at line 65 of file PosixByondInstaller.cs.

+
66  {
67  try
68  {
69  await ioManager.DeleteDirectory(ByondCachePath, cancellationToken).ConfigureAwait(false);
70  }
71  catch (OperationCanceledException)
72  {
73  throw;
74  }
75  catch (Exception e)
76  {
77  logger.LogWarning("Error deleting BYOND cache! Exception: {0}", e);
78  }
79  }
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+ +
readonly ILogger< PosixByondInstaller > logger
The ILogger for the PosixByondInstaller
+
readonly IIOManager ioManager
The IIOManager for the PosixByondInstaller
+
+

References Tgstation.Server.Host.Components.Byond.PosixByondInstaller.ByondCachePath, Tgstation.Server.Host.IO.IIOManager.DeleteDirectory(), Tgstation.Server.Host.Components.Byond.PosixByondInstaller.ioManager, and Tgstation.Server.Host.Components.Byond.PosixByondInstaller.logger.

+ +
+
+ +

◆ DownloadVersion()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task<byte[]> Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DownloadVersion (Version version,
CancellationToken cancellationToken 
)
+
+ +

Download a given BYOND version

+ +

Implements Tgstation.Server.Host.Components.Byond.IByondInstaller.

+ +

Definition at line 82 of file PosixByondInstaller.cs.

+
83  {
84  if (version == null)
85  throw new ArgumentNullException(nameof(version));
86 
87  var url = String.Format(CultureInfo.InvariantCulture, ByondRevisionsURLTemplate, version.Major, version.Minor);
88 
89  return await ioManager.DownloadFile(new Uri(url), cancellationToken).ConfigureAwait(false);
90  }
Task< byte[]> DownloadFile(Uri url, CancellationToken cancellationToken)
Downloads a file from url
+
const string ByondRevisionsURLTemplate
The URL format string for getting BYOND linux version {0}.{1} zipfile
+
readonly IIOManager ioManager
The IIOManager for the PosixByondInstaller
+
+

References Tgstation.Server.Host.Components.Byond.PosixByondInstaller.ByondRevisionsURLTemplate, Tgstation.Server.Host.IO.IIOManager.DownloadFile(), and Tgstation.Server.Host.Components.Byond.PosixByondInstaller.ioManager.

+ +
+
+ +

◆ InstallByond()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Byond.PosixByondInstaller.InstallByond (string path,
Version version,
CancellationToken cancellationToken 
)
+
+ +

Does actions necessary to get an extracted BYOND installation working

+ +

Implements Tgstation.Server.Host.Components.Byond.IByondInstaller.

+ +

Definition at line 93 of file PosixByondInstaller.cs.

+
94  {
95  if (path == null)
96  throw new ArgumentNullException(nameof(path));
97  if (version == null)
98  throw new ArgumentNullException(nameof(version));
99 
100  // write the scripts for running the ting
101  // need to add $ORIGIN to LD_LIBRARY_PATH
102  const string StandardScript = "#!/bin/sh\nexport LD_LIBRARY_PATH=\"\\$ORIGIN:$LD_LIBRARY_PATH\"\nBASEDIR=$(dirname \"$0\")\nexec \"$BASEDIR/{0}\" \"$@\"\n";
103 
104  var dreamDaemonScript = String.Format(CultureInfo.InvariantCulture, StandardScript, DreamDaemonExecutableName);
105  var dreamMakerScript = String.Format(CultureInfo.InvariantCulture, StandardScript, DreamMakerExecutableName);
106 
107  async Task WriteAndMakeExecutable(string fullPath, string script)
108  {
109  await ioManager.WriteAllBytes(fullPath, Encoding.ASCII.GetBytes(script), cancellationToken).ConfigureAwait(false);
110  postWriteHandler.HandleWrite(fullPath);
111  }
112 
113  var basePath = ioManager.ConcatPath(path, ByondManager.BinPath);
114 
115  var task = Task.WhenAll(WriteAndMakeExecutable(ioManager.ConcatPath(basePath, DreamDaemonName), dreamDaemonScript), WriteAndMakeExecutable(ioManager.ConcatPath(basePath, DreamMakerName), dreamMakerScript));
116 
119 
120  return task;
121  }
+
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+ +
void HandleWrite(string filePath)
For handling system specific necessities after a write
+ + +
readonly IIOManager ioManager
The IIOManager for the PosixByondInstaller
+
readonly IPostWriteHandler postWriteHandler
The IPostWriteHandler for the PosixByondInstaller
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
+

References Tgstation.Server.Host.Components.Byond.ByondManager.BinPath, Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DreamDaemonExecutableName, Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DreamDaemonName, Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DreamMakerExecutableName, Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DreamMakerName, Tgstation.Server.Host.IO.IPostWriteHandler.HandleWrite(), Tgstation.Server.Host.Components.Byond.PosixByondInstaller.ioManager, Tgstation.Server.Host.Components.Byond.PosixByondInstaller.postWriteHandler, and Tgstation.Server.Host.IO.IIOManager.WriteAllBytes().

+ +
+
+

Member Data Documentation

+ +

◆ ByondCachePath

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.PosixByondInstaller.ByondCachePath = "~/.byond/cache"
+
+private
+
+ +

Path to the BYOND cache

+ +

Definition at line 24 of file PosixByondInstaller.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Byond.PosixByondInstaller.CleanCache().

+ +
+
+ +

◆ ByondRevisionsURLTemplate

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.PosixByondInstaller.ByondRevisionsURLTemplate = "https://secure.byond.com/download/build/{0}/{0}.{1}_byond_linux.zip"
+
+private
+
+ +

The URL format string for getting BYOND linux version {0}.{1} zipfile

+ +

Definition at line 19 of file PosixByondInstaller.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DownloadVersion().

+ +
+
+ +

◆ DreamDaemonExecutableName

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DreamDaemonExecutableName = "DreamDaemon"
+
+private
+
+
+ +

◆ DreamDaemonName

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DreamDaemonName => DreamDaemonExecutableName + ShellScriptExtension
+
+
+ +

◆ DreamMakerExecutableName

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DreamMakerExecutableName = "DreamMaker"
+
+private
+
+
+ +

◆ DreamMakerName

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DreamMakerName => DreamMakerExecutableName + ShellScriptExtension
+
+
+ +

◆ ioManager

+ + + +

◆ logger

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<PosixByondInstaller> Tgstation.Server.Host.Components.Byond.PosixByondInstaller.logger
+
+private
+
+
+ +

◆ postWriteHandler

+ +
+
+ + + + + +
+ + + + +
readonly IPostWriteHandler Tgstation.Server.Host.Components.Byond.PosixByondInstaller.postWriteHandler
+
+private
+
+
+ +

◆ ShellScriptExtension

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.PosixByondInstaller.ShellScriptExtension = ".sh"
+
+private
+
+ +

Definition at line 28 of file PosixByondInstaller.cs.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.png new file mode 100644 index 0000000000000000000000000000000000000000..8bf239d366e70d621bce1d1f8ab9c2d7891e0020 GIT binary patch literal 1300 zcmeAS@N?(olHy`uVBq!ia0y~yV9W%v12~w0F0m{ zd2vn$?o2B4vz0w5x;vLcqMGrW_U&!C3v+L84di*y2^SW8;p3kfJvf1U&U+48SI_o3tqPQ~a_vvZ}@ixD^bA@*nEc@MgY@JGJ z)t7kXEoy(86g`(kUP>?1x+LCKH|b06?DzHWcK^Nc>GA8Ezkk&2dE58obESO7Zk?BZ zl%lr_K2iO)@pn|&(_fk88x(WrYJ6r}67DR&w$Qv^npJaUmiMLI*Gq$gGOsr5F=RjR z#!uRzc$xL&wBvoM-vZpV%l&&7p6kqdGUZFbi-f6y6E|I+ zE`~In6q@#>;^fW#okClk56@TgkKa)1mNLm>-Gp^NQmu?H&Ao2fcqO*kICfga+>-67 zi{BV7y)pl#=m*n@Y95}UyIrbg+DbW<8m;u`&zd)P-wCd9X!=gCbr)8pNAT+5$-Qrc`)|GXcrmzr(%N?Cn+F@2M}-ud&^8^dqK%=5armit@W zO#b8DOE0DN-7{ROwXk=g)|6$tzdwGNI{DZd;ZU{}p7Z$MZgN*lN}jmH&-fB=k>{`P zRrjZhr`2gaP<{C`bb?C#-nXa48|*AE|8(=bB>o~ceIMhO%5M{vOi=l|v}ubX7GvB=WxOvN`3}2PXI~H}`Ro{2zsd%ksd(vxJb1r*ZoLTxVds7EAuILI z=U8aMx`>(XmnO_h;omG=c~SLcZFzS#diry{daYgUUU!(=M2U#lKgpL)zqu$rP3^+G z4-H?8s^`pm`SY)}&>!t3iZ{!$QUy+G=&$pb|NNz4=H_=VzUh4WVv`@|rBpj_p5dm@ z#hWjN9GN<`aFTl9Eu-oupY|+Yoz8mp>B=kDc4@tT`u)SY2(4IOtu?3q7B=-Pw5qs$ z_xHyyn>>@Rb-tQ)JNu$V@q~Q|OHa$OPUGFI9{W7DVf}^Q`~LWe>_5Ip^=_DTL;cF_ zwLi@+{GEC3I@<&8FYAos*{f#QGB`2pUkOZC3z4z(%PB!zOQ&2)|H^*S$?FrV-5qvd P5ys%@>gTe~DWM4fE?8UU literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests_1_1_test_posix_byond_installer-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests_1_1_test_posix_byond_installer-members.html new file mode 100644 index 0000000000..81c3577655 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests_1_1_test_posix_byond_installer-members.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Byond.Tests.TestPosixByondInstaller Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests_1_1_test_posix_byond_installer.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests_1_1_test_posix_byond_installer.html new file mode 100644 index 0000000000..5c92abcb9b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests_1_1_test_posix_byond_installer.html @@ -0,0 +1,180 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Byond.Tests.TestPosixByondInstaller Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Byond.Tests.TestPosixByondInstaller Class Reference
+
+
+ + + + + + + + + + +

+Public Member Functions

void TestConstruction ()
 
async Task TestCacheClean ()
 
async Task TestDownload ()
 
async Task TestInstallByond ()
 
+

Detailed Description

+
+

Definition at line 11 of file TestPosixByondInstaller.cs.

+

Member Function Documentation

+ +

◆ TestCacheClean()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.Components.Byond.Tests.TestPosixByondInstaller.TestCacheClean ()
+
+ +

Definition at line 27 of file TestPosixByondInstaller.cs.

+
28  {
29  var mockIOManager = new Mock<IIOManager>();
30  var mockPostWriteHandler = new Mock<IPostWriteHandler>();
31  var mockLogger = new Mock<ILogger<PosixByondInstaller>>();
32  var installer = new PosixByondInstaller(mockIOManager.Object, mockPostWriteHandler.Object, mockLogger.Object);
33 
34  const string ByondCachePath = "~/.byond/cache";
35 
36  mockIOManager.Setup(x => x.DeleteDirectory(ByondCachePath, default)).Returns(Task.CompletedTask).Verifiable();
37 
38  await installer.CleanCache(default);
39 
40  mockIOManager.Verify();
41 
42 
43  mockIOManager.Setup(x => x.DeleteDirectory(ByondCachePath, default)).Throws(new OperationCanceledException()).Verifiable();
44 
45  await Assert.ThrowsExceptionAsync<OperationCanceledException>(() => installer.CleanCache(default)).ConfigureAwait(false);
46 
47  mockIOManager.Verify();
48 
49  mockIOManager.Setup(x => x.DeleteDirectory(ByondCachePath, default)).Throws(new Exception()).Verifiable();
50 
51  await installer.CleanCache(default).ConfigureAwait(false);
52 
53  mockIOManager.Verify();
54  }
+
+
+ +

◆ TestConstruction()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Byond.Tests.TestPosixByondInstaller.TestConstruction ()
+
+ +

Definition at line 14 of file TestPosixByondInstaller.cs.

+
15  {
16  Assert.ThrowsException<ArgumentNullException>(() => new PosixByondInstaller(null, null, null));
17  var mockIOManager = new Mock<IIOManager>();
18  Assert.ThrowsException<ArgumentNullException>(() => new PosixByondInstaller(mockIOManager.Object, null, null));
19  var mockPostWriteHandler = new Mock<IPostWriteHandler>();
20  Assert.ThrowsException<ArgumentNullException>(() => new PosixByondInstaller(mockIOManager.Object, mockPostWriteHandler.Object, null));
21 
22  var mockLogger = new Mock<ILogger<PosixByondInstaller>>();
23  new PosixByondInstaller(mockIOManager.Object, mockPostWriteHandler.Object, mockLogger.Object);
24  }
+
+
+ +

◆ TestDownload()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.Components.Byond.Tests.TestPosixByondInstaller.TestDownload ()
+
+ +

Definition at line 58 of file TestPosixByondInstaller.cs.

+
59  {
60  var mockIOManager = new Mock<IIOManager>();
61  var mockPostWriteHandler = new Mock<IPostWriteHandler>();
62  var mockLogger = new Mock<ILogger<PosixByondInstaller>>();
63  var installer = new PosixByondInstaller(mockIOManager.Object, mockPostWriteHandler.Object, mockLogger.Object);
64 
65  await Assert.ThrowsExceptionAsync<ArgumentNullException>(() => installer.DownloadVersion(null, default)).ConfigureAwait(false);
66 
67  var ourArray = Array.Empty<byte>();
68  mockIOManager.Setup(x => x.DownloadFile(It.Is<Uri>(uri => uri == new Uri("https://secure.byond.com/download/build/511/511.1385_byond_linux.zip")), default)).Returns(Task.FromResult(ourArray)).Verifiable();
69 
70  var result = await installer.DownloadVersion(new Version(511, 1385), default).ConfigureAwait(false);
71 
72  Assert.AreSame(ourArray, result);
73  mockIOManager.Verify();
74  }
+
+
+ +

◆ TestInstallByond()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.Components.Byond.Tests.TestPosixByondInstaller.TestInstallByond ()
+
+ +

Definition at line 77 of file TestPosixByondInstaller.cs.

+
78  {
79  var mockIOManager = new Mock<IIOManager>();
80  var mockPostWriteHandler = new Mock<IPostWriteHandler>();
81  var mockLogger = new Mock<ILogger<PosixByondInstaller>>();
82  var installer = new PosixByondInstaller(mockIOManager.Object, mockPostWriteHandler.Object, mockLogger.Object);
83 
84  const string FakePath = "fake";
85  await Assert.ThrowsExceptionAsync<ArgumentNullException>(() => installer.InstallByond(null, null, default)).ConfigureAwait(false);
86  await Assert.ThrowsExceptionAsync<ArgumentNullException>(() => installer.InstallByond(FakePath, null, default)).ConfigureAwait(false);
87 
88  await installer.InstallByond(FakePath, new Version(511, 1385), default).ConfigureAwait(false);
89 
90  mockIOManager.Verify(x => x.ConcatPath(It.IsAny<string>(), It.IsNotNull<string>()), Times.Exactly(5));
91  mockIOManager.Verify(x => x.WriteAllBytes(It.IsAny<string>(), It.IsNotNull<byte[]>(), default), Times.Exactly(2));
92  mockPostWriteHandler.Verify(x => x.HandleWrite(It.IsAny<string>()), Times.Exactly(4));
93  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer-members.html new file mode 100644 index 0000000000..5eebdd47a6 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer-members.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Byond.WindowsByondInstaller Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Byond.WindowsByondInstaller, including all inherited members.

+ + + + + + + + + + + + + + + + + + +
ByondConfigDirTgstation.Server.Host.Components.Byond.WindowsByondInstallerprivate
ByondDDConfigTgstation.Server.Host.Components.Byond.WindowsByondInstallerprivate
ByondDXDirTgstation.Server.Host.Components.Byond.WindowsByondInstallerprivate
ByondNoPromptTrustedModeTgstation.Server.Host.Components.Byond.WindowsByondInstallerprivate
ByondRevisionsURLTemplateTgstation.Server.Host.Components.Byond.WindowsByondInstallerprivate
CleanCache(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Byond.WindowsByondInstaller
Dispose()Tgstation.Server.Host.Components.Byond.WindowsByondInstaller
DownloadVersion(Version version, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Byond.WindowsByondInstaller
DreamDaemonNameTgstation.Server.Host.Components.Byond.WindowsByondInstaller
DreamMakerNameTgstation.Server.Host.Components.Byond.WindowsByondInstaller
InstallByond(string path, Version version, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Byond.WindowsByondInstaller
installedDirectXTgstation.Server.Host.Components.Byond.WindowsByondInstallerprivate
ioManagerTgstation.Server.Host.Components.Byond.WindowsByondInstallerprivate
loggerTgstation.Server.Host.Components.Byond.WindowsByondInstallerprivate
processExecutorTgstation.Server.Host.Components.Byond.WindowsByondInstallerprivate
semaphoreTgstation.Server.Host.Components.Byond.WindowsByondInstallerprivate
WindowsByondInstaller(IIOManager ioManager, IProcessExecutor processExecutor, ILogger< WindowsByondInstaller > logger)Tgstation.Server.Host.Components.Byond.WindowsByondInstaller
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html new file mode 100644 index 0000000000..4cb318fb8c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html @@ -0,0 +1,695 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Byond.WindowsByondInstaller Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Byond.WindowsByondInstaller Class Reference
+
+
+ +

IByondInstaller for windows systems + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Byond.WindowsByondInstaller:
+
+
+ + +Tgstation.Server.Host.Components.Byond.IByondInstaller +IDisposable + +
+ + + + + + + + + + + + + + + + +

+Public Member Functions

 WindowsByondInstaller (IIOManager ioManager, IProcessExecutor processExecutor, ILogger< WindowsByondInstaller > logger)
 Construct a WindowsByondInstaller More...
 
void Dispose ()
 
async Task CleanCache (CancellationToken cancellationToken)
 Attempts to cleans the BYOND cache folder for the system More...
 
Task< byte[]> DownloadVersion (Version version, CancellationToken cancellationToken)
 Download a given BYOND version More...
 
async Task InstallByond (string path, Version version, CancellationToken cancellationToken)
 Does actions necessary to get an extracted BYOND installation working More...
 
+ + + + + +

+Public Attributes

string DreamDaemonName => "dreamdaemon.exe"
 
string DreamMakerName => "dm.exe"
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

const string ByondRevisionsURLTemplate = "https://secure.byond.com/download/build/{0}/{0}.{1}_byond.zip"
 The URL format string for getting BYOND windows version {0}.{1} zipfile More...
 
const string ByondConfigDir = "byond/cfg"
 Directory to byond installation configuration More...
 
const string ByondDDConfig = "daemon.txt"
 BYOND's DreamDaemon config file More...
 
const string ByondNoPromptTrustedMode = "trusted-check 0"
 Setting to add to ByondDDConfig to suppress an invisible user prompt for running a trusted mode .dmb More...
 
const string ByondDXDir = "byond/directx"
 The directory that contains the BYOND directx redistributable More...
 
readonly IIOManager ioManager
 The IIOManager for the WindowsByondInstaller More...
 
readonly IProcessExecutor processExecutor
 The IProcessExecutor for the WindowsByondInstaller More...
 
readonly ILogger< WindowsByondInstallerlogger
 The ILogger for the WindowsByondInstaller More...
 
readonly SemaphoreSlim semaphore
 The SemaphoreSlim for the WindowsByondInstaller More...
 
bool installedDirectX
 If DirectX was installed More...
 
+ + + + + + + + +

+Additional Inherited Members

- Properties inherited from Tgstation.Server.Host.Components.Byond.IByondInstaller
string DreamDaemonName [get]
 Get the file name of the DreamDaemon executable More...
 
string DreamMakerName [get]
 Get the file name of the DreamMaker executable More...
 
+

Detailed Description

+

IByondInstaller for windows systems

+ +

Definition at line 15 of file WindowsByondInstaller.cs.

+

Constructor & Destructor Documentation

+ +

◆ WindowsByondInstaller()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.WindowsByondInstaller (IIOManager ioManager,
IProcessExecutor processExecutor,
ILogger< WindowsByondInstallerlogger 
)
+
+ +

Construct a WindowsByondInstaller

+
Parameters
+ + + + +
ioManagerThe value of ioManager
processExecutorThe value of processExecutor
loggerThe value of logger
+
+
+ +

Definition at line 79 of file WindowsByondInstaller.cs.

+
80  {
81  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
82  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
83  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
84 
85  semaphore = new SemaphoreSlim(1);
86  installedDirectX = false;
87  }
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the WindowsByondInstaller
+
readonly IProcessExecutor processExecutor
The IProcessExecutor for the WindowsByondInstaller
+
readonly ILogger< WindowsByondInstaller > logger
The ILogger for the WindowsByondInstaller
+ +
readonly IIOManager ioManager
The IIOManager for the WindowsByondInstaller
+
+

References Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.installedDirectX, Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ioManager, Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.logger, Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.processExecutor, and Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.semaphore.

+ +
+
+

Member Function Documentation

+ +

◆ CleanCache()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.CleanCache (CancellationToken cancellationToken)
+
+ +

Attempts to cleans the BYOND cache folder for the system

+ +

Implements Tgstation.Server.Host.Components.Byond.IByondInstaller.

+ +

Definition at line 93 of file WindowsByondInstaller.cs.

+
94  {
95  try
96  {
97  await ioManager.DeleteDirectory(ioManager.ConcatPath(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "byond/cache"), cancellationToken).ConfigureAwait(false);
98  }
99  catch(OperationCanceledException)
100  {
101  throw;
102  }
103  catch (Exception e)
104  {
105  logger.LogWarning("Error deleting BYOND cache! Exception: {0}", e);
106  }
107  }
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
readonly ILogger< WindowsByondInstaller > logger
The ILogger for the WindowsByondInstaller
+
readonly IIOManager ioManager
The IIOManager for the WindowsByondInstaller
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
+

References Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.IO.IIOManager.DeleteDirectory(), Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ioManager, and Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.logger.

+ +
+
+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.Dispose ()
+
+ +

+ +
+
+ +

◆ DownloadVersion()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<byte[]> Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.DownloadVersion (Version version,
CancellationToken cancellationToken 
)
+
+ +

Download a given BYOND version

+ +

Implements Tgstation.Server.Host.Components.Byond.IByondInstaller.

+ +

Definition at line 110 of file WindowsByondInstaller.cs.

+
111  {
112  var url = String.Format(CultureInfo.InvariantCulture, ByondRevisionsURLTemplate, version.Major, version.Minor);
113 
114  return ioManager.DownloadFile(new Uri(url), cancellationToken);
115  }
Task< byte[]> DownloadFile(Uri url, CancellationToken cancellationToken)
Downloads a file from url
+
const string ByondRevisionsURLTemplate
The URL format string for getting BYOND windows version {0}.{1} zipfile
+
readonly IIOManager ioManager
The IIOManager for the WindowsByondInstaller
+
+

References Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ByondRevisionsURLTemplate, Tgstation.Server.Host.IO.IIOManager.DownloadFile(), and Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ioManager.

+ +
+
+ +

◆ InstallByond()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.InstallByond (string path,
Version version,
CancellationToken cancellationToken 
)
+
+ +

Does actions necessary to get an extracted BYOND installation working

+ +

Implements Tgstation.Server.Host.Components.Byond.IByondInstaller.

+ +

Definition at line 118 of file WindowsByondInstaller.cs.

+
119  {
120  async Task SetNoPromptTrusted()
121  {
122  var configPath = ioManager.ConcatPath(path, ByondConfigDir);
123  await ioManager.CreateDirectory(configPath, cancellationToken).ConfigureAwait(false);
124  await ioManager.WriteAllBytes(ioManager.ConcatPath(configPath, ByondDDConfig), Encoding.UTF8.GetBytes(ByondNoPromptTrustedMode), cancellationToken).ConfigureAwait(false);
125  }
126 
127  var setNoPromptTrustedModeTask = SetNoPromptTrusted();
128 
129  // after this version lummox made DD depend of directx lol
130  // but then he became amazing and not only fixed it but also gave us 30s compiles \[T]/
131  // then he readded it again so -_-
132  if (!installedDirectX)
133  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
134  if (!installedDirectX)
135  {
136  // ^check again because race conditions
137  // always install it, it's pretty fast and will do better redundancy checking than us
138  var rbdx = ioManager.ConcatPath(path, ByondDXDir);
139 
140  // noShellExecute because we aren't doing runas shennanigans
141  IProcess directXInstaller;
142  try
143  {
144  directXInstaller = processExecutor.LaunchProcess(ioManager.ConcatPath(rbdx, "DXSETUP.exe"), rbdx, "/silent", noShellExecute: true);
145  }
146  catch (Exception e)
147  {
148  throw new JobException("Unable to start DirectX installer process! Is the server running with admin privileges?", e);
149  }
150 
151  using (directXInstaller)
152  {
153  int exitCode;
154  using (cancellationToken.Register(() => directXInstaller.Terminate()))
155  exitCode = await directXInstaller.Lifetime.ConfigureAwait(false);
156  cancellationToken.ThrowIfCancellationRequested();
157 
158  if (exitCode != 0)
159  throw new JobException(String.Format(CultureInfo.InvariantCulture, "Failed to install included DirectX! Exit code: {0}", exitCode));
160  installedDirectX = true;
161  }
162  }
163 
164  await setNoPromptTrustedModeTask.ConfigureAwait(false);
165  }
readonly SemaphoreSlim semaphore
The SemaphoreSlim for the WindowsByondInstaller
+
Task< int > Lifetime
The Task<TResult> resulting in the exit code of the process
Definition: IProcessBase.cs:14
+
readonly IProcessExecutor processExecutor
The IProcessExecutor for the WindowsByondInstaller
+
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+
Task CreateDirectory(string path, CancellationToken cancellationToken)
Create a directory at path
+ +
const string ByondNoPromptTrustedMode
Setting to add to ByondDDConfig to suppress an invisible user prompt for running a trusted mode ....
+
IProcess LaunchProcess(string fileName, string workingDirectory, string arguments=null, bool readOutput=false, bool readError=false, bool noShellExecute=false)
Launch a IProcess
+
const string ByondDDConfig
BYOND's DreamDaemon config file
+
void Terminate()
Terminates the process
+
Abstraction over a System.Diagnostics.Process
Definition: IProcess.cs:9
+
const string ByondConfigDir
Directory to byond installation configuration
+
const string ByondDXDir
The directory that contains the BYOND directx redistributable
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+
readonly IIOManager ioManager
The IIOManager for the WindowsByondInstaller
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+ +
+

References Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ByondConfigDir, Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ByondDDConfig, Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ByondDXDir, Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ByondNoPromptTrustedMode, Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.IO.IIOManager.CreateDirectory(), Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.installedDirectX, Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ioManager, Tgstation.Server.Host.Core.IProcessExecutor.LaunchProcess(), Tgstation.Server.Host.Core.IProcessBase.Lifetime, Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.processExecutor, Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.semaphore, Tgstation.Server.Host.Core.IProcess.Terminate(), and Tgstation.Server.Host.IO.IIOManager.WriteAllBytes().

+ +
+
+

Member Data Documentation

+ +

◆ ByondConfigDir

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ByondConfigDir = "byond/cfg"
+
+private
+
+ +

Directory to byond installation configuration

+ +

Definition at line 25 of file WindowsByondInstaller.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.InstallByond().

+ +
+
+ +

◆ ByondDDConfig

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ByondDDConfig = "daemon.txt"
+
+private
+
+ +

BYOND's DreamDaemon config file

+ +

Definition at line 30 of file WindowsByondInstaller.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.InstallByond().

+ +
+
+ +

◆ ByondDXDir

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ByondDXDir = "byond/directx"
+
+private
+
+ +

The directory that contains the BYOND directx redistributable

+ +

Definition at line 40 of file WindowsByondInstaller.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.InstallByond().

+ +
+
+ +

◆ ByondNoPromptTrustedMode

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ByondNoPromptTrustedMode = "trusted-check 0"
+
+private
+
+ +

Setting to add to ByondDDConfig to suppress an invisible user prompt for running a trusted mode .dmb

+ +

Definition at line 35 of file WindowsByondInstaller.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.InstallByond().

+ +
+
+ +

◆ ByondRevisionsURLTemplate

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ByondRevisionsURLTemplate = "https://secure.byond.com/download/build/{0}/{0}.{1}_byond.zip"
+
+private
+
+ +

The URL format string for getting BYOND windows version {0}.{1} zipfile

+ +

Definition at line 20 of file WindowsByondInstaller.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.DownloadVersion().

+ +
+
+ +

◆ DreamDaemonName

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.DreamDaemonName => "dreamdaemon.exe"
+
+ +

+ +

Definition at line 43 of file WindowsByondInstaller.cs.

+ +
+
+ +

◆ DreamMakerName

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.DreamMakerName => "dm.exe"
+
+ +

+ +

Definition at line 46 of file WindowsByondInstaller.cs.

+ +
+
+ +

◆ installedDirectX

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.installedDirectX
+
+private
+
+
+ +

◆ ioManager

+ + + +

◆ logger

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<WindowsByondInstaller> Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.logger
+
+private
+
+
+ +

◆ processExecutor

+ +
+
+ + + + + +
+ + + + +
readonly IProcessExecutor Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.processExecutor
+
+private
+
+
+ +

◆ semaphore

+ +
+
+ + + + + +
+ + + + +
readonly SemaphoreSlim Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.semaphore
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.png new file mode 100644 index 0000000000000000000000000000000000000000..715e58855dd847c6290c458b9936fc272ce12349 GIT binary patch literal 1778 zcmbtVX;70#7~YT&K1B@yN))1rF$JlSqaL(eiI6BkISil(L<8smiii|jC}2Yr+Ypo( z5o!VPK!qSmR0IU&;}W5$6o@ziAr@j$j>K{V%aMLMb^5REOm}AYdG_7+-JRWeo>`%< z_m;&A%@+ay7PCE=901T5g!@8hWE6L}T}NQ4?>2vyPNzfY(8%PG%zE+rwf7x{VSQmQ z387Ft$J-AeN$;Dy)&FwT4(-D8l7xokDSQ<~-d?EB;j6YK_6QD^UMeq4at<`FK z#wY~^IjOQW>AVzKP-aWHjVy!vEPYM4&(By3e52RMIF^#IexiCq54ZW`5^MGz_}=5R_U?7g`Gsap-Xntnd#)N%4W)t@tfT%bK{8tf)rsltGzg?T39kX zXID4lsqrw(bm<^+B%6`5>X#FScUv5n6D0B5cbnE-{)|Y-x+w26%bLQRzW%{&vTSg(CXLF?`i&CV zMP|R7O}4ddo7LfFT`A(iQzcdv)clu)(2X6PM{9DnM!`rh`N?RiiZzd%+@xbo;O*mi;fq+innCfP`mLm|Gd`=Bu<-%OjboYTvlnkHHg}Lcwb&_mH5Yx$T-Krzsv@Ov%8iEy zO#oWF*|g61_j~rTiv6(koY*h4_1P!P_H)q=_O`M@d8BHr*uLxFCG%ays-d~7^>h9A zV3VJZd7UIapT@wT@E0M^r`W~+AfrLPc$>@QKwMHk{rjy)jjKYA&jc!E;IN%HDlg{Nuz&#ycXBj+CTEVF%k4|3cfC(M!u=JO$G zzN^gHksGUQw*px5Ng1>vV0>d@NlB&Irtn&mzg?QiDx(u`-fG>u=ao=Z_uA25$`xe? zqT(r#gU*lwy`+COhwBW}#PzocEoP2GcO{3(0%`qv?32J1%XvzM2q-<7_}=iUo#R!4 z{)Pur-VEMYkm7i7)!0J9)W&_>uw~q3(vGXI$F%n9I6qC8RdiSZA+EMNHl=NUT#S$>80^E*iZ`cK>;?)n|Z^HC-@Tr@F!gW literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel-members.html new file mode 100644 index 0000000000..21e4a59dfc --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel-members.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.Channel Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html new file mode 100644 index 0000000000..7916f4621b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html @@ -0,0 +1,315 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Channel Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Channel Class Reference
+
+
+ +

Represents a Providers.IProvider channel + More...

+ + + + + + + + + + + + + + + + + + + + + + + +

+Properties

string Id [get, set]
 Backing field for RealId. Represented as a string to avoid BYOND percision loss More...
 
ulong RealId [get, set]
 The Providers.IProvider channel Id. More...
 
string FriendlyName [get, set]
 The user friendly name of the Channel More...
 
string ConnectionName [get, set]
 The name of the connection the Channel belongs to More...
 
bool IsAdminChannel [get, set]
 If this is considered a channel for admin commands More...
 
bool IsPrivateChannel [get, set]
 If this is a 1-to-1 chat channel More...
 
string Tag [get, set]
 For user use More...
 
+

Detailed Description

+

Represents a Providers.IProvider channel

+ +

Definition at line 10 of file Channel.cs.

+

Property Documentation

+ +

◆ ConnectionName

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.Channel.ConnectionName
+
+getset
+
+ +

The name of the connection the Channel belongs to

+ +

Definition at line 36 of file Channel.cs.

+
36 { get; set; }
+
+
+ +

◆ FriendlyName

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.Channel.FriendlyName
+
+getset
+
+ +

The user friendly name of the Channel

+ +

Definition at line 31 of file Channel.cs.

+
31 { get; set; }
+
+
+ +

◆ Id

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.Channel.Id
+
+getset
+
+
+ +

◆ IsAdminChannel

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Channel.IsAdminChannel
+
+getset
+
+ +

If this is considered a channel for admin commands

+ +

Definition at line 41 of file Channel.cs.

+
41 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ProcessMessage().

+ +
+
+ +

◆ IsPrivateChannel

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Channel.IsPrivateChannel
+
+getset
+
+ +

If this is a 1-to-1 chat channel

+ +

Definition at line 46 of file Channel.cs.

+
46 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ProcessMessage().

+ +
+
+ +

◆ RealId

+ +
+
+ + + + + +
+ + + + +
ulong Tgstation.Server.Host.Components.Chat.Channel.RealId
+
+getset
+
+ +

The Providers.IProvider channel Id.

+

Chat remaps this to an internal id using ChannelMapping

+ +

Definition at line 23 of file Channel.cs.

+
23  {
24  get => UInt64.Parse(Id, CultureInfo.InvariantCulture);
25  set => Id = value.ToString(CultureInfo.InvariantCulture);
26  }
string Id
Backing field for RealId. Represented as a string to avoid BYOND percision loss
Definition: Channel.cs:15
+
+

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ProcessMessage().

+ +
+
+ +

◆ Tag

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.Channel.Tag
+
+getset
+
+ +

For user use

+ +

Definition at line 51 of file Channel.cs.

+
51 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ProcessMessage().

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Host/Components/Chat/Channel.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping-members.html new file mode 100644 index 0000000000..bdec27a86b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping-members.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.ChannelMapping Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping.html new file mode 100644 index 0000000000..87c36eb208 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping.html @@ -0,0 +1,247 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.ChannelMapping Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.ChannelMapping Class Reference
+
+
+ +

Represents a mapping of a Channel.RealId + More...

+ + + + + + + + + + + + + + + + + +

+Properties

long ProviderId [get, set]
 The Id of the Providers.IProvider More...
 
ulong ProviderChannelId [get, set]
 The original Components.Chat.Channel.RealId More...
 
bool IsWatchdogChannel [get, set]
 If Channel is a watchdog channel More...
 
bool IsUpdatesChannel [get, set]
 If the Channel is an updates channel More...
 
Channel Channel [get, set]
 The Components.Chat.Channel with the mapped Id More...
 
+

Detailed Description

+

Represents a mapping of a Channel.RealId

+ +

Definition at line 6 of file ChannelMapping.cs.

+

Property Documentation

+ +

◆ Channel

+ +
+
+ + + + + +
+ + + + +
Channel Tgstation.Server.Host.Components.Chat.ChannelMapping.Channel
+
+getset
+
+ +

The Components.Chat.Channel with the mapped Id

+ +

Definition at line 31 of file ChannelMapping.cs.

+
31 { get; set; }
+
+
+ +

◆ IsUpdatesChannel

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.ChannelMapping.IsUpdatesChannel
+
+getset
+
+ +

If the Channel is an updates channel

+ +

Definition at line 26 of file ChannelMapping.cs.

+
26 { get; set; }
+
+
+ +

◆ IsWatchdogChannel

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.ChannelMapping.IsWatchdogChannel
+
+getset
+
+ +

If Channel is a watchdog channel

+ +

Definition at line 21 of file ChannelMapping.cs.

+
21 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ChangeChannels().

+ +
+
+ +

◆ ProviderChannelId

+ +
+
+ + + + + +
+ + + + +
ulong Tgstation.Server.Host.Components.Chat.ChannelMapping.ProviderChannelId
+
+getset
+
+ +

The original Components.Chat.Channel.RealId

+ +

Definition at line 16 of file ChannelMapping.cs.

+
16 { get; set; }
+
+
+ +

◆ ProviderId

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Components.Chat.ChannelMapping.ProviderId
+
+getset
+
+ +

The Id of the Providers.IProvider

+ +

Definition at line 11 of file ChannelMapping.cs.

+
11 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat-members.html new file mode 100644 index 0000000000..3d123ccbe3 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat-members.html @@ -0,0 +1,121 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.Chat Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Chat.Chat, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
asyncDelayerTgstation.Server.Host.Components.Chat.Chatprivate
builtinCommandsTgstation.Server.Host.Components.Chat.Chatprivate
ChangeChannels(long connectionId, IEnumerable< Api.Models.ChatChannel > newChannels, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Chat
ChangeSettings(ChatBot newSettings, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Chat
channelIdCounterTgstation.Server.Host.Components.Chat.Chatprivate
Chat(IProviderFactory providerFactory, IIOManager ioManager, ICommandFactory commandFactory, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILoggerFactory loggerFactory, ILogger< Chat > logger, IEnumerable< Models.ChatBot > initialChatBots)Tgstation.Server.Host.Components.Chat.Chat
chatHandlerTgstation.Server.Host.Components.Chat.Chatprivate
commandFactoryTgstation.Server.Host.Components.Chat.Chatprivate
CommonMentionTgstation.Server.Host.Components.Chat.Chatprivate
Connected(long connectionId)Tgstation.Server.Host.Components.Chat.Chat
connectionsUpdatedTgstation.Server.Host.Components.Chat.Chatprivate
customCommandHandlerTgstation.Server.Host.Components.Chat.Chatprivate
DeleteConnection(long connectionId, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Chat
Dispose()Tgstation.Server.Host.Components.Chat.Chat
handlerCtsTgstation.Server.Host.Components.Chat.Chatprivate
HandleRestart(Version updateVersion, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Chat
initialChatBotsTgstation.Server.Host.Components.Chat.Chatprivate
ioManagerTgstation.Server.Host.Components.Chat.Chatprivate
loggerTgstation.Server.Host.Components.Chat.Chatprivate
loggerFactoryTgstation.Server.Host.Components.Chat.Chatprivate
mappedChannelsTgstation.Server.Host.Components.Chat.Chatprivate
MonitorMessages(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Chatprivate
ProcessMessage(IProvider provider, Message message, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Chatprivate
providerFactoryTgstation.Server.Host.Components.Chat.Chatprivate
providersTgstation.Server.Host.Components.Chat.Chatprivate
RegisterCommandHandler(ICustomCommandHandler customCommandHandler)Tgstation.Server.Host.Components.Chat.Chat
RemoveProvider(long connectionId, bool updateTrackings, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Chatprivate
restartRegistrationTgstation.Server.Host.Components.Chat.Chatprivate
SendMessage(string message, IEnumerable< ulong > channelIds, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Chat
SendUpdateMessage(string message, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Chat
SendWatchdogMessage(string message, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Chat
StartAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Chat
startedTgstation.Server.Host.Components.Chat.Chatprivate
StopAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Chat
trackingContextsTgstation.Server.Host.Components.Chat.Chatprivate
TrackJsons(string basePath, string channelsJsonName, string commandsJsonName, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Chat
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html new file mode 100644 index 0000000000..8a76c95e5e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html @@ -0,0 +1,1535 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Chat Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Chat Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.Chat:
+
+
+ + +Tgstation.Server.Host.Components.Chat.IChat +Tgstation.Server.Host.Core.IRestartHandler +IHostedService +IDisposable + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 Chat (IProviderFactory providerFactory, IIOManager ioManager, ICommandFactory commandFactory, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILoggerFactory loggerFactory, ILogger< Chat > logger, IEnumerable< Models.ChatBot > initialChatBots)
 Construct a Chat More...
 
void Dispose ()
 
async Task ChangeChannels (long connectionId, IEnumerable< Api.Models.ChatChannel > newChannels, CancellationToken cancellationToken)
 Change chat channels More...
 
async Task ChangeSettings (ChatBot newSettings, CancellationToken cancellationToken)
 Change chat settings. If the ChatBot.Id is not currently in use, a new connection will be made instead More...
 
Task SendMessage (string message, IEnumerable< ulong > channelIds, CancellationToken cancellationToken)
 Send a chat message to a given set of channelIds More...
 
Task SendWatchdogMessage (string message, CancellationToken cancellationToken)
 Send a chat message to configured watchdog channels More...
 
Task SendUpdateMessage (string message, CancellationToken cancellationToken)
 Send a chat message to configured update channels More...
 
async Task StartAsync (CancellationToken cancellationToken)
 
async Task StopAsync (CancellationToken cancellationToken)
 
async Task< IJsonTrackingContextTrackJsons (string basePath, string channelsJsonName, string commandsJsonName, CancellationToken cancellationToken)
 Start tracking json files for commands and channels More...
 
bool Connected (long connectionId)
 If a given set of ChatBot is connected More...
 
void RegisterCommandHandler (ICustomCommandHandler customCommandHandler)
 Registers a customCommandHandler to use More...
 
async Task DeleteConnection (long connectionId, CancellationToken cancellationToken)
 Disconnects and deletes a given connection More...
 
Task HandleRestart (Version updateVersion, CancellationToken cancellationToken)
 Handle a restart of the server More...
 
+ + + + + + + + + + +

+Private Member Functions

async Task< IProviderRemoveProvider (long connectionId, bool updateTrackings, CancellationToken cancellationToken)
 Remove a IProvider from providers and mappedChannels optionally updating the trackingContexts as well More...
 
async Task ProcessMessage (IProvider provider, Message message, CancellationToken cancellationToken)
 Processes a message More...
 
async Task MonitorMessages (CancellationToken cancellationToken)
 Monitors active providers for new Messages More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

const string CommonMention = "!tgs"
 
readonly IProviderFactory providerFactory
 The IProviderFactory for the Chat More...
 
readonly IIOManager ioManager
 The IIOManager for the Chat More...
 
readonly ICommandFactory commandFactory
 The ICommandFactory for the Chat More...
 
readonly IRestartRegistration restartRegistration
 The IRestartRegistration for the Chat More...
 
readonly IAsyncDelayer asyncDelayer
 The IAsyncDelayer for the Chat More...
 
readonly ILoggerFactory loggerFactory
 The ILoggerFactory for the Chat More...
 
readonly ILogger< Chatlogger
 The ILogger for the Chat More...
 
readonly Dictionary< string, ICommandbuiltinCommands
 Unchanging ICommands in the Chat mapped by ICommand.Name More...
 
readonly Dictionary< long, IProviderproviders
 Map of IProviders in use, keyed by ChatBot.Id More...
 
readonly Dictionary< ulong, ChannelMappingmappedChannels
 Map of Channel.RealIds to ChannelMappings More...
 
readonly List< IJsonTrackingContexttrackingContexts
 The active IJsonTrackingContexts for the Chat More...
 
readonly CancellationTokenSource handlerCts
 The CancellationTokenSource for chatHandler More...
 
readonly List< Models.ChatBotinitialChatBots
 The initial Models.ChatBot for the Chat More...
 
ICustomCommandHandler customCommandHandler
 The ICustomCommandHandler for the ChangeChannels(long, IEnumerable<Api.Models.ChatChannel>, CancellationToken) More...
 
Task chatHandler
 The Task that monitors incoming chat messages More...
 
TaskCompletionSource< object > connectionsUpdated
 The TaskCompletionSource<TResult> that completes when ChatBots change More...
 
ulong channelIdCounter
 Used for remapping Channel.RealIds More...
 
bool started
 If StartAsync(CancellationToken) has been called More...
 
+

Detailed Description

+
+

Definition at line 20 of file Chat.cs.

+

Constructor & Destructor Documentation

+ +

◆ Chat()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Chat.Chat.Chat (IProviderFactory providerFactory,
IIOManager ioManager,
ICommandFactory commandFactory,
IServerControl serverControl,
IAsyncDelayer asyncDelayer,
ILoggerFactory loggerFactory,
ILogger< Chatlogger,
IEnumerable< Models.ChatBotinitialChatBots 
)
+
+ +

Construct a Chat

+
Parameters
+ + + + + + + + + +
providerFactoryThe value of providerFactory
ioManagerThe value of ioManager
commandFactoryThe value of commandFactory
serverControlThe IServerControl to populate restartRegistration with
asyncDelayerThe value of asyncDelayer
loggerFactoryThe value of loggerFactory
loggerThe value of logger
initialChatBotsThe IEnumerable<T> used to populate initialChatBots
+
+
+ +

Definition at line 125 of file Chat.cs.

+
126  {
127  this.providerFactory = providerFactory ?? throw new ArgumentNullException(nameof(providerFactory));
128  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
129  this.commandFactory = commandFactory ?? throw new ArgumentNullException(nameof(commandFactory));
130  if (serverControl == null)
131  throw new ArgumentNullException(nameof(serverControl));
132  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
133  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
134  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
135  this.initialChatBots = initialChatBots?.ToList() ?? throw new ArgumentNullException(nameof(initialChatBots));
136 
137  restartRegistration = serverControl.RegisterForRestart(this);
138 
139  builtinCommands = new Dictionary<string, ICommand>();
140  providers = new Dictionary<long, IProvider>();
141  mappedChannels = new Dictionary<ulong, ChannelMapping>();
142  trackingContexts = new List<IJsonTrackingContext>();
143  handlerCts = new CancellationTokenSource();
144  connectionsUpdated = new TaskCompletionSource<object>();
145  channelIdCounter = 1;
146  }
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the Chat
Definition: Chat.cs:52
+
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:67
+
readonly List< Models.ChatBot > initialChatBots
The initial Models.ChatBot for the Chat
Definition: Chat.cs:87
+
readonly IProviderFactory providerFactory
The IProviderFactory for the Chat
Definition: Chat.cs:27
+
TaskCompletionSource< object > connectionsUpdated
The TaskCompletionSource<TResult> that completes when ChatBots change
Definition: Chat.cs:102
+
readonly ILogger< Chat > logger
The ILogger for the Chat
Definition: Chat.cs:57
+
readonly ICommandFactory commandFactory
The ICommandFactory for the Chat
Definition: Chat.cs:37
+
readonly IIOManager ioManager
The IIOManager for the Chat
Definition: Chat.cs:32
+
readonly Dictionary< ulong, ChannelMapping > mappedChannels
Map of Channel.RealIds to ChannelMappings
Definition: Chat.cs:72
+
ulong channelIdCounter
Used for remapping Channel.RealIds
Definition: Chat.cs:107
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the Chat
Definition: Chat.cs:47
+
readonly Dictionary< string, ICommand > builtinCommands
Unchanging ICommands in the Chat mapped by ICommand.Name
Definition: Chat.cs:62
+
readonly List< IJsonTrackingContext > trackingContexts
The active IJsonTrackingContexts for the Chat
Definition: Chat.cs:77
+
IRestartRegistration RegisterForRestart(IRestartHandler handler)
Register a given handler to run before stopping the server for a restart
+
readonly IRestartRegistration restartRegistration
The IRestartRegistration for the Chat
Definition: Chat.cs:42
+
readonly CancellationTokenSource handlerCts
The CancellationTokenSource for chatHandler
Definition: Chat.cs:82
+
+

References Tgstation.Server.Host.Components.Chat.Chat.asyncDelayer, Tgstation.Server.Host.Components.Chat.Chat.builtinCommands, Tgstation.Server.Host.Components.Chat.Chat.channelIdCounter, Tgstation.Server.Host.Components.Chat.Chat.commandFactory, Tgstation.Server.Host.Components.Chat.Chat.connectionsUpdated, Tgstation.Server.Host.Components.Chat.Chat.handlerCts, Tgstation.Server.Host.Components.Chat.Chat.initialChatBots, Tgstation.Server.Host.Components.Chat.Chat.ioManager, Tgstation.Server.Host.Components.Chat.Chat.logger, Tgstation.Server.Host.Components.Chat.Chat.loggerFactory, Tgstation.Server.Host.Components.Chat.Chat.mappedChannels, Tgstation.Server.Host.Components.Chat.Chat.providerFactory, Tgstation.Server.Host.Components.Chat.Chat.providers, Tgstation.Server.Host.Core.IServerControl.RegisterForRestart(), Tgstation.Server.Host.Components.Chat.Chat.restartRegistration, and Tgstation.Server.Host.Components.Chat.Chat.trackingContexts.

+ +
+
+

Member Function Documentation

+ +

◆ ChangeChannels()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Chat.Chat.ChangeChannels (long connectionId,
IEnumerable< Api.Models.ChatChannelnewChannels,
CancellationToken cancellationToken 
)
+
+ +

Change chat channels

+ +

Implements Tgstation.Server.Host.Components.Chat.IChat.

+ +

Definition at line 388 of file Chat.cs.

+
389  {
390  if (newChannels == null)
391  throw new ArgumentNullException(nameof(newChannels));
392  var provider = await RemoveProvider(connectionId, false, cancellationToken).ConfigureAwait(false);
393  if (provider == null)
394  return;
395  var results = await provider.MapChannels(newChannels, cancellationToken).ConfigureAwait(false);
396  if (results == null) // aborted
397  return;
398  var mappings = Enumerable.Zip(newChannels, results, (x, y) => new ChannelMapping
399  {
400  IsWatchdogChannel = x.IsWatchdogChannel == true,
401  IsUpdatesChannel = x.IsUpdatesChannel == true,
402  ProviderChannelId = y.RealId,
403  ProviderId = connectionId,
404  Channel = y
405  });
406 
407  ulong baseId;
408  lock (this)
409  {
410  baseId = channelIdCounter;
411  channelIdCounter += (ulong)results.Count;
412  }
413 
414  Task task;
415  lock (mappedChannels)
416  {
417  lock (providers)
418  if (!providers.TryGetValue(connectionId, out IProvider verify) || verify != provider) // aborted again
419  return;
420  foreach (var I in mappings)
421  {
422  var newId = baseId++;
423  mappedChannels.Add(newId, I);
424  I.Channel.RealId = newId;
425  }
426 
427  lock (trackingContexts)
428  task = Task.WhenAll(trackingContexts.Select(x => x.SetChannels(mappedChannels.Select(y => y.Value.Channel), cancellationToken)));
429  }
430 
431  await task.ConfigureAwait(false);
432  }
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:67
+ +
async Task< IProvider > RemoveProvider(long connectionId, bool updateTrackings, CancellationToken cancellationToken)
Remove a IProvider from providers and mappedChannels optionally updating the trackingContexts as well
Definition: Chat.cs:164
+
readonly Dictionary< ulong, ChannelMapping > mappedChannels
Map of Channel.RealIds to ChannelMappings
Definition: Chat.cs:72
+
ulong channelIdCounter
Used for remapping Channel.RealIds
Definition: Chat.cs:107
+
readonly List< IJsonTrackingContext > trackingContexts
The active IJsonTrackingContexts for the Chat
Definition: Chat.cs:77
+
+

References Tgstation.Server.Host.Components.Chat.Chat.channelIdCounter, Tgstation.Server.Host.Components.Chat.ChannelMapping.IsWatchdogChannel, Tgstation.Server.Host.Components.Chat.Chat.mappedChannels, Tgstation.Server.Host.Components.Chat.Chat.providers, Tgstation.Server.Host.Components.Chat.Chat.RemoveProvider(), and Tgstation.Server.Host.Components.Chat.Chat.trackingContexts.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.StartAsync().

+ +
+
+ +

◆ ChangeSettings()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Chat.Chat.ChangeSettings (ChatBot newSettings,
CancellationToken cancellationToken 
)
+
+ +

Change chat settings. If the ChatBot.Id is not currently in use, a new connection will be made instead

+ +

Implements Tgstation.Server.Host.Components.Chat.IChat.

+ +

Definition at line 435 of file Chat.cs.

+
436  {
437  if (newSettings == null)
438  throw new ArgumentNullException(nameof(newSettings));
439  IProvider provider;
440 
441  async Task DisconnectProvider(IProvider p)
442  {
443  try
444  {
445  await p.Disconnect(cancellationToken).ConfigureAwait(false);
446  }
447  finally
448  {
449  p.Dispose();
450  }
451  }
452 
453  Task disconnectTask;
454  lock (providers)
455  {
456  // raw settings changes forces a rebuild of the provider
457  if (providers.TryGetValue(newSettings.Id, out provider))
458  {
459  providers.Remove(newSettings.Id);
460  disconnectTask = DisconnectProvider(provider);
461  }
462  else
463  disconnectTask = Task.CompletedTask;
464  if (newSettings.Enabled.Value)
465  {
466  provider = providerFactory.CreateProvider(newSettings);
467  providers.Add(newSettings.Id, provider);
468  }
469  }
470 
471  lock (mappedChannels)
472  foreach (var I in mappedChannels.Where(x => x.Value.ProviderId == newSettings.Id).Select(x => x.Key).ToList())
473  mappedChannels.Remove(I);
474 
475  await disconnectTask.ConfigureAwait(false);
476 
477  if (started)
478  {
479  if (newSettings.Enabled.Value)
480  await provider.Connect(cancellationToken).ConfigureAwait(false);
481  lock (this)
482  {
483  // same thread shennanigans
484  var oldOne = connectionsUpdated;
485  connectionsUpdated = new TaskCompletionSource<object>();
486  oldOne.SetResult(null);
487  }
488  }
489  }
Task Disconnect(CancellationToken cancellationToken)
Gracefully disconnects the provider. Implies a call to IDisposable.Dispose
+
bool started
If StartAsync(CancellationToken) has been called
Definition: Chat.cs:112
+
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:67
+ +
IProvider CreateProvider(ChatBot settings)
Create a IProvider
+
readonly IProviderFactory providerFactory
The IProviderFactory for the Chat
Definition: Chat.cs:27
+
TaskCompletionSource< object > connectionsUpdated
The TaskCompletionSource<TResult> that completes when ChatBots change
Definition: Chat.cs:102
+
bool? Enabled
If the connection is enabled
Definition: ChatBot.cs:25
+ +
readonly Dictionary< ulong, ChannelMapping > mappedChannels
Map of Channel.RealIds to ChannelMappings
Definition: Chat.cs:72
+
+

References Tgstation.Server.Host.Components.Chat.Chat.connectionsUpdated, Tgstation.Server.Host.Components.Chat.IProviderFactory.CreateProvider(), Tgstation.Server.Host.Components.Chat.Providers.IProvider.Disconnect(), Tgstation.Server.Api.Models.Internal.ChatBot.Enabled, Tgstation.Server.Api.Models.Internal.ChatBot.Id, Tgstation.Server.Host.Components.Chat.Chat.mappedChannels, Tgstation.Server.Host.Components.Chat.Chat.providerFactory, Tgstation.Server.Host.Components.Chat.Chat.providers, and Tgstation.Server.Host.Components.Chat.Chat.started.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.StartAsync().

+ +
+
+ +

◆ Connected()

+ +
+
+ + + + + + + + +
bool Tgstation.Server.Host.Components.Chat.Chat.Connected (long connectionId)
+
+ +

If a given set of ChatBot is connected

+ +

Implements Tgstation.Server.Host.Components.Chat.IChat.

+ +

Definition at line 583 of file Chat.cs.

+
584  {
585  lock (providers)
586  return providers.TryGetValue(connectionId, out var provider) && provider.Connected;
587  }
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:67
+
+

References Tgstation.Server.Host.Components.Chat.Chat.providers.

+ +
+
+ +

◆ DeleteConnection()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Chat.Chat.DeleteConnection (long connectionId,
CancellationToken cancellationToken 
)
+
+ +

Disconnects and deletes a given connection

+ +

Implements Tgstation.Server.Host.Components.Chat.IChat.

+ +

Definition at line 598 of file Chat.cs.

+
599  {
600  var provider = await RemoveProvider(connectionId, true, cancellationToken).ConfigureAwait(false);
601  if (provider != null)
602  try
603  {
604  await provider.Disconnect(cancellationToken).ConfigureAwait(false);
605  }
606  finally
607  {
608  provider.Dispose();
609  }
610  }
async Task< IProvider > RemoveProvider(long connectionId, bool updateTrackings, CancellationToken cancellationToken)
Remove a IProvider from providers and mappedChannels optionally updating the trackingContexts as well
Definition: Chat.cs:164
+
+

References Tgstation.Server.Host.Components.Chat.Chat.RemoveProvider().

+ +
+
+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Chat.Chat.Dispose ()
+
+ +

+ +

Definition at line 149 of file Chat.cs.

+
150  {
151  restartRegistration.Dispose();
152  handlerCts.Dispose();
153  foreach (var I in providers)
154  I.Value.Dispose();
155  }
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:67
+
readonly IRestartRegistration restartRegistration
The IRestartRegistration for the Chat
Definition: Chat.cs:42
+
readonly CancellationTokenSource handlerCts
The CancellationTokenSource for chatHandler
Definition: Chat.cs:82
+
+

References Tgstation.Server.Host.Components.Chat.Chat.handlerCts, Tgstation.Server.Host.Components.Chat.Chat.providers, and Tgstation.Server.Host.Components.Chat.Chat.restartRegistration.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.Dispose().

+ +
+
+ +

◆ HandleRestart()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Chat.Chat.HandleRestart (Version updateVersion,
CancellationToken cancellationToken 
)
+
+ +

Handle a restart of the server

+ +

Implements Tgstation.Server.Host.Core.IRestartHandler.

+ +

Definition at line 613 of file Chat.cs.

+
614  {
615  var message = updateVersion == null ? "TGS: Restart requested..." : String.Format(CultureInfo.InvariantCulture, "TGS: Updating to version {0}...", updateVersion);
616  List<ulong> wdChannels;
617  lock (mappedChannels) // so it doesn't change while we're using it
618  wdChannels = mappedChannels.Select(x => x.Key).ToList();
619  return SendMessage(message, wdChannels, cancellationToken);
620  }
readonly Dictionary< ulong, ChannelMapping > mappedChannels
Map of Channel.RealIds to ChannelMappings
Definition: Chat.cs:72
+
Task SendMessage(string message, IEnumerable< ulong > channelIds, CancellationToken cancellationToken)
Send a chat message to a given set of channelIds
Definition: Chat.cs:492
+
+

References Tgstation.Server.Host.Components.Chat.Chat.mappedChannels, and Tgstation.Server.Host.Components.Chat.Chat.SendMessage().

+ +
+
+ +

◆ MonitorMessages()

+ +
+
+ + + + + +
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Chat.Chat.MonitorMessages (CancellationToken cancellationToken)
+
+private
+
+ +

Monitors active providers for new Messages

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 337 of file Chat.cs.

+
338  {
339  var messageTasks = new Dictionary<IProvider, Task<Message>>();
340  try
341  {
342  while (!cancellationToken.IsCancellationRequested)
343  {
344  // prune disconnected providers
345  foreach (var I in messageTasks.Where(x => !x.Key.Connected).ToList())
346  messageTasks.Remove(I.Key);
347 
348  // add new ones
349  Task updatedTask;
350  lock (this)
351  updatedTask = connectionsUpdated.Task;
352  lock (providers)
353  foreach (var I in providers)
354  if (I.Value.Connected && !messageTasks.ContainsKey(I.Value))
355  messageTasks.Add(I.Value, I.Value.NextMessage(cancellationToken));
356 
357  if (messageTasks.Count == 0)
358  {
359  await asyncDelayer.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
360  continue;
361  }
362 
363  // wait for a message
364  await Task.WhenAny(updatedTask, Task.WhenAny(messageTasks.Select(x => x.Value))).ConfigureAwait(false);
365 
366  // process completed ones
367  foreach (var I in messageTasks.Where(x => x.Value.IsCompleted).ToList())
368  {
369  var message = await I.Value.ConfigureAwait(false);
370 
371  await ProcessMessage(I.Key, message, cancellationToken).ConfigureAwait(false);
372 
373  messageTasks.Remove(I.Key);
374  }
375  }
376  }
377  catch (OperationCanceledException)
378  {
379  logger.LogTrace("Message processing loop cancelled!");
380  }
381  catch (Exception e)
382  {
383  logger.LogError("Message monitor crashed! Exception: {0}", e);
384  }
385  }
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:67
+
bool Connected(long connectionId)
If a given set of ChatBot is connected
Definition: Chat.cs:583
+
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+
TaskCompletionSource< object > connectionsUpdated
The TaskCompletionSource<TResult> that completes when ChatBots change
Definition: Chat.cs:102
+
readonly ILogger< Chat > logger
The ILogger for the Chat
Definition: Chat.cs:57
+
async Task ProcessMessage(IProvider provider, Message message, CancellationToken cancellationToken)
Processes a message
Definition: Chat.cs:194
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the Chat
Definition: Chat.cs:47
+
+

References Tgstation.Server.Host.Components.Chat.Chat.asyncDelayer, Tgstation.Server.Host.Components.Chat.Chat.connectionsUpdated, Tgstation.Server.Host.Core.IAsyncDelayer.Delay(), Tgstation.Server.Host.Components.Chat.Chat.logger, Tgstation.Server.Host.Components.Chat.Chat.ProcessMessage(), and Tgstation.Server.Host.Components.Chat.Chat.providers.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.StartAsync().

+ +
+
+ +

◆ ProcessMessage()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Chat.Chat.ProcessMessage (IProvider provider,
Message message,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Processes a message

+
Parameters
+ + + + +
providerThe IProvider who recevied message
messageThe Message to process
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 194 of file Chat.cs.

+
195  {
196  // map the channel if it's private and we haven't seen it
197  lock (providers)
198  {
199  var providerId = providers.Where(x => x.Value == provider).Select(x => x.Key).First();
200  var enumerable = mappedChannels.Where(x => x.Value.ProviderId == providerId && x.Value.ProviderChannelId == message.User.Channel.RealId);
201  if (message.User.Channel.IsPrivateChannel)
202  lock (mappedChannels)
203  {
204  if (!provider.Connected)
205  return;
206  if (!enumerable.Any())
207  {
208  ulong newId;
209  lock (this)
210  newId = channelIdCounter++;
211  mappedChannels.Add(newId, new ChannelMapping
212  {
213  IsWatchdogChannel = false,
214  ProviderChannelId = message.User.Channel.RealId,
215  ProviderId = providerId,
216  Channel = message.User.Channel
217  });
218  message.User.Channel.RealId = newId;
219  }
220  else
221  message.User.Channel.RealId = enumerable.First().Key;
222  }
223  else
224  {
225  // need to add tag and isAdminChannel
226  var mapping = enumerable.First().Value;
227  message.User.Channel.Id = mapping.Channel.Id;
228  message.User.Channel.Tag = mapping.Channel.Tag;
229  message.User.Channel.IsAdminChannel = mapping.Channel.IsAdminChannel;
230  }
231  }
232 
233  var splits = new List<string>(message.Content.Trim().Split(' '));
234  var address = splits[0];
235  if (address.Length > 1 && (address[address.Length - 1] == ':' || address[address.Length - 1] == ','))
236  address = address.Substring(0, address.Length - 1);
237 
238  address = address.ToUpperInvariant();
239 
240  var addressed = address == CommonMention.ToUpperInvariant() || address == provider.BotMention.ToUpperInvariant();
241 
242  // no mention
243  if (!addressed && !message.User.Channel.IsPrivateChannel)
244  return;
245 
246  logger.LogTrace("Chat command: {0}. User (True provider Id): {1}", message.Content, JsonConvert.SerializeObject(message.User));
247 
248  if (addressed)
249  splits.RemoveAt(0);
250 
251  if (splits.Count == 0)
252  {
253  // just a mention
254  await SendMessage("Hi!", new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
255  return;
256  }
257 
258  var command = splits[0].ToUpperInvariant();
259  splits.RemoveAt(0);
260  var arguments = String.Join(" ", splits);
261 
262  try
263  {
264  async Task<ICommand> GetCommand(string commandName)
265  {
266  if (!builtinCommands.TryGetValue(commandName, out var handler))
267  {
268  var tasks = trackingContexts.Select(x => x.GetCustomCommands(cancellationToken));
269  await Task.WhenAll(tasks).ConfigureAwait(false);
270  handler = tasks.SelectMany(x => x.Result).Where(x => x.Name.ToUpperInvariant() == commandName).FirstOrDefault();
271  }
272 
273  return handler;
274  }
275 
276  const string UnknownCommandMessage = "Unknown command! Type '?' or 'help' for available commands.";
277 
278  if (command == "HELP" || command == "?")
279  {
280  string helpText;
281  if (splits.Count == 0)
282  {
283  var allCommands = builtinCommands.Select(x => x.Value).ToList();
284  var tasks = trackingContexts.Select(x => x.GetCustomCommands(cancellationToken)).ToList();
285  await Task.WhenAll(tasks).ConfigureAwait(false);
286  allCommands.AddRange(tasks.SelectMany(x => x.Result));
287  helpText = String.Format(CultureInfo.InvariantCulture, "Available commands (Type '?' or 'help' and then a command name for more details): {0}", String.Join(", ", allCommands.Select(x => x.Name)));
288  }
289  else
290  {
291  var helpHandler = await GetCommand(splits[0].ToUpperInvariant()).ConfigureAwait(false);
292  if (helpHandler != default)
293  helpText = String.Format(CultureInfo.InvariantCulture, "{0}: {1}{2}", helpHandler.Name, helpHandler.HelpText, helpHandler.AdminOnly ? " - May only be used in admin channels" : String.Empty);
294  else
295  helpText = UnknownCommandMessage;
296  }
297 
298  await SendMessage(helpText, new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
299  return;
300  }
301 
302  var commandHandler = await GetCommand(command).ConfigureAwait(false);
303 
304  if (commandHandler == default)
305  {
306  await SendMessage(UnknownCommandMessage, new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
307  return;
308  }
309 
310  if (commandHandler.AdminOnly && !message.User.Channel.IsAdminChannel)
311  {
312  await SendMessage("Use this command in an admin channel!", new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
313  return;
314  }
315 
316  var result = await commandHandler.Invoke(arguments, message.User, cancellationToken).ConfigureAwait(false);
317  if (result != null)
318  await SendMessage(result, new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
319  }
320  catch (OperationCanceledException)
321  {
322  throw;
323  }
324  catch (Exception e)
325  {
326  // error bc custom commands should reply about why it failed
327  logger.LogError("Error processing chat command: {0}", e);
328  await SendMessage("Internal error processing command!", new List<ulong> { message.User.Channel.RealId }, cancellationToken).ConfigureAwait(false);
329  }
330  }
User User
The Components.Chat.User who sent the Message
Definition: Message.cs:16
+ + +
Channel Channel
The Components.Chat.Channel the user spoke from
Definition: User.cs:40
+
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:67
+ +
bool IsPrivateChannel
If this is a 1-to-1 chat channel
Definition: Channel.cs:46
+
readonly ILogger< Chat > logger
The ILogger for the Chat
Definition: Chat.cs:57
+
string Id
Backing field for RealId. Represented as a string to avoid BYOND percision loss
Definition: Channel.cs:15
+ +
readonly Dictionary< ulong, ChannelMapping > mappedChannels
Map of Channel.RealIds to ChannelMappings
Definition: Chat.cs:72
+
string BotMention
The string that indicates the IProvider was mentioned
Definition: IProvider.cs:21
+
ulong channelIdCounter
Used for remapping Channel.RealIds
Definition: Chat.cs:107
+
ulong RealId
The Providers.IProvider channel Id.
Definition: Channel.cs:23
+
readonly Dictionary< string, ICommand > builtinCommands
Unchanging ICommands in the Chat mapped by ICommand.Name
Definition: Chat.cs:62
+
Task SendMessage(string message, IEnumerable< ulong > channelIds, CancellationToken cancellationToken)
Send a chat message to a given set of channelIds
Definition: Chat.cs:492
+
readonly List< IJsonTrackingContext > trackingContexts
The active IJsonTrackingContexts for the Chat
Definition: Chat.cs:77
+
bool IsAdminChannel
If this is considered a channel for admin commands
Definition: Channel.cs:41
+
+

References Tgstation.Server.Host.Components.Chat.Providers.IProvider.BotMention, Tgstation.Server.Host.Components.Chat.Chat.builtinCommands, Tgstation.Server.Host.Components.Chat.User.Channel, Tgstation.Server.Host.Components.Chat.Chat.channelIdCounter, Tgstation.Server.Host.Components.Chat.Chat.CommonMention, Tgstation.Server.Host.Components.Chat.Providers.IProvider.Connected, Tgstation.Server.Host.Components.Chat.Providers.Message.Content, Tgstation.Server.Host.Components.Chat.Channel.Id, Tgstation.Server.Host.Components.Chat.Channel.IsAdminChannel, Tgstation.Server.Host.Components.Chat.Channel.IsPrivateChannel, Tgstation.Server.Host.Components.Chat.Chat.logger, Tgstation.Server.Host.Components.Chat.Chat.mappedChannels, Tgstation.Server.Host.Components.Chat.Chat.providers, Tgstation.Server.Host.Components.Chat.Channel.RealId, Tgstation.Server.Host.Components.Chat.Chat.SendMessage(), Tgstation.Server.Host.Components.Chat.Channel.Tag, Tgstation.Server.Host.Components.Chat.Chat.trackingContexts, and Tgstation.Server.Host.Components.Chat.Providers.Message.User.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.MonitorMessages().

+ +
+
+ +

◆ RegisterCommandHandler()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.Components.Chat.Chat.RegisterCommandHandler (ICustomCommandHandler customCommandHandler)
+
+ +

Registers a customCommandHandler to use

+ +

Implements Tgstation.Server.Host.Components.Chat.IChat.

+ +

Definition at line 590 of file Chat.cs.

+
591  {
592  if (this.customCommandHandler != null)
593  throw new InvalidOperationException("RegisterCommandHandler() already called!");
594  this.customCommandHandler = customCommandHandler ?? throw new ArgumentNullException(nameof(customCommandHandler));
595  }
ICustomCommandHandler customCommandHandler
The ICustomCommandHandler for the ChangeChannels(long, IEnumerable<Api.Models.ChatChannel>,...
Definition: Chat.cs:92
+
+

References Tgstation.Server.Host.Components.Chat.Chat.customCommandHandler.

+ +
+
+ +

◆ RemoveProvider()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task<IProvider> Tgstation.Server.Host.Components.Chat.Chat.RemoveProvider (long connectionId,
bool updateTrackings,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Remove a IProvider from providers and mappedChannels optionally updating the trackingContexts as well

+
Parameters
+ + + + +
connectionIdThe ChatBot.Id of the IProvider to delete
updateTrackingsIf trackingContexts should be update
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the IProvider being removed if it exists, false otherwise
+ +

Definition at line 164 of file Chat.cs.

+
165  {
166  IProvider provider;
167  lock (providers)
168  if (!providers.TryGetValue(connectionId, out provider))
169  return null;
170  Task task;
171  lock (mappedChannels)
172  {
173  foreach (var I in mappedChannels.Where(x => x.Value.ProviderId == connectionId).Select(x => x.Key).ToList())
174  mappedChannels.Remove(I);
175 
176  if (updateTrackings)
177  lock (trackingContexts)
178  task = Task.WhenAll(trackingContexts.Select(x => x.SetChannels(mappedChannels.Select(y => y.Value.Channel), cancellationToken)));
179  else
180  task = Task.CompletedTask;
181  }
182 
183  await task.ConfigureAwait(false);
184  return provider;
185  }
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:67
+ +
readonly Dictionary< ulong, ChannelMapping > mappedChannels
Map of Channel.RealIds to ChannelMappings
Definition: Chat.cs:72
+
readonly List< IJsonTrackingContext > trackingContexts
The active IJsonTrackingContexts for the Chat
Definition: Chat.cs:77
+
+

References Tgstation.Server.Host.Components.Chat.Chat.mappedChannels, Tgstation.Server.Host.Components.Chat.Chat.providers, and Tgstation.Server.Host.Components.Chat.Chat.trackingContexts.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ChangeChannels(), and Tgstation.Server.Host.Components.Chat.Chat.DeleteConnection().

+ +
+
+ +

◆ SendMessage()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Chat.Chat.SendMessage (string message,
IEnumerable< ulong > channelIds,
CancellationToken cancellationToken 
)
+
+ +

Send a chat message to a given set of channelIds

+ +

Implements Tgstation.Server.Host.Components.Chat.IChat.

+ +

Definition at line 492 of file Chat.cs.

+
493  {
494  if (message == null)
495  throw new ArgumentNullException(nameof(message));
496  if (channelIds == null)
497  throw new ArgumentNullException(nameof(channelIds));
498 
499  return Task.WhenAll(channelIds.Select(x =>
500  {
501  ChannelMapping channelMapping;
502  lock (mappedChannels)
503  if (!mappedChannels.TryGetValue(x, out channelMapping))
504  return Task.CompletedTask;
505  IProvider provider;
506  lock (providers)
507  if (!providers.TryGetValue(channelMapping.ProviderId, out provider))
508  return Task.CompletedTask;
509  return provider.SendMessage(channelMapping.ProviderChannelId, message, cancellationToken);
510  }));
511  }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.WatchdogBase.HandleEvent(), Tgstation.Server.Host.Components.Chat.Chat.HandleRestart(), Tgstation.Server.Host.Components.Chat.Chat.ProcessMessage(), Tgstation.Server.Host.Components.Chat.Chat.SendUpdateMessage(), and Tgstation.Server.Host.Components.Chat.Chat.SendWatchdogMessage().

+ +
+
+ +

◆ SendUpdateMessage()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Chat.Chat.SendUpdateMessage (string message,
CancellationToken cancellationToken 
)
+
+ +

Send a chat message to configured update channels

+ +

Implements Tgstation.Server.Host.Components.Chat.IChat.

+ +

Definition at line 524 of file Chat.cs.

+
525  {
526  List<ulong> wdChannels;
527  message = String.Format(CultureInfo.InvariantCulture, "DM: {0}", message);
528  lock (mappedChannels) // so it doesn't change while we're using it
529  wdChannels = mappedChannels.Where(x => x.Value.IsUpdatesChannel).Select(x => x.Key).ToList();
530  return SendMessage(message, wdChannels, cancellationToken);
531  }
readonly Dictionary< ulong, ChannelMapping > mappedChannels
Map of Channel.RealIds to ChannelMappings
Definition: Chat.cs:72
+
Task SendMessage(string message, IEnumerable< ulong > channelIds, CancellationToken cancellationToken)
Send a chat message to a given set of channelIds
Definition: Chat.cs:492
+
+

References Tgstation.Server.Host.Components.Chat.Chat.mappedChannels, and Tgstation.Server.Host.Components.Chat.Chat.SendMessage().

+ +
+
+ +

◆ SendWatchdogMessage()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Chat.Chat.SendWatchdogMessage (string message,
CancellationToken cancellationToken 
)
+
+ +

Send a chat message to configured watchdog channels

+ +

Implements Tgstation.Server.Host.Components.Chat.IChat.

+ +

Definition at line 514 of file Chat.cs.

+
515  {
516  List<ulong> wdChannels;
517  message = String.Format(CultureInfo.InvariantCulture, "WD: {0}", message);
518  lock (mappedChannels) // so it doesn't change while we're using it
519  wdChannels = mappedChannels.Where(x => x.Value.IsWatchdogChannel).Select(x => x.Key).ToList();
520  return SendMessage(message, wdChannels, cancellationToken);
521  }
readonly Dictionary< ulong, ChannelMapping > mappedChannels
Map of Channel.RealIds to ChannelMappings
Definition: Chat.cs:72
+
Task SendMessage(string message, IEnumerable< ulong > channelIds, CancellationToken cancellationToken)
Send a chat message to a given set of channelIds
Definition: Chat.cs:492
+
+

References Tgstation.Server.Host.Components.Chat.Chat.mappedChannels, and Tgstation.Server.Host.Components.Chat.Chat.SendMessage().

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.HandleMonitorWakeup(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.HandleRestart(), Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.HandlerMonitorWakeup(), Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.InitControllers(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.LaunchImplNoLock(), Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.MonitorLifetimes(), Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.MonitorLifetimes(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.NotifyOfFailedReattach(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Restart(), and Tgstation.Server.Host.Components.Watchdog.WatchdogBase.TerminateNoLock().

+ +
+
+ +

◆ StartAsync()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Chat.Chat.StartAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 534 of file Chat.cs.

+
535  {
536  foreach (var I in commandFactory.GenerateCommands())
537  builtinCommands.Add(I.Name.ToUpperInvariant(), I);
538  await Task.WhenAll(initialChatBots.Select(x => ChangeSettings(x, cancellationToken))).ConfigureAwait(false);
539  await Task.WhenAll(providers.Select(x => x.Value).Select(x => x.Connect(cancellationToken))).ConfigureAwait(false);
540  await Task.WhenAll(initialChatBots.Select(x => ChangeChannels(x.Id, x.Channels, cancellationToken))).ConfigureAwait(false);
542  started = true;
543  }
bool started
If StartAsync(CancellationToken) has been called
Definition: Chat.cs:112
+
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:67
+
readonly List< Models.ChatBot > initialChatBots
The initial Models.ChatBot for the Chat
Definition: Chat.cs:87
+
IReadOnlyList< ICommand > GenerateCommands()
Generate builtin ICommands
+
readonly ICommandFactory commandFactory
The ICommandFactory for the Chat
Definition: Chat.cs:37
+
async Task MonitorMessages(CancellationToken cancellationToken)
Monitors active providers for new Messages
Definition: Chat.cs:337
+
async Task ChangeSettings(ChatBot newSettings, CancellationToken cancellationToken)
Change chat settings. If the ChatBot.Id is not currently in use, a new connection will be made instea...
Definition: Chat.cs:435
+
Task chatHandler
The Task that monitors incoming chat messages
Definition: Chat.cs:97
+
readonly Dictionary< string, ICommand > builtinCommands
Unchanging ICommands in the Chat mapped by ICommand.Name
Definition: Chat.cs:62
+
async Task ChangeChannels(long connectionId, IEnumerable< Api.Models.ChatChannel > newChannels, CancellationToken cancellationToken)
Change chat channels
Definition: Chat.cs:388
+
readonly CancellationTokenSource handlerCts
The CancellationTokenSource for chatHandler
Definition: Chat.cs:82
+
+

References Tgstation.Server.Host.Components.Chat.Chat.builtinCommands, Tgstation.Server.Host.Components.Chat.Chat.ChangeChannels(), Tgstation.Server.Host.Components.Chat.Chat.ChangeSettings(), Tgstation.Server.Host.Components.Chat.Chat.chatHandler, Tgstation.Server.Host.Components.Chat.Chat.commandFactory, Tgstation.Server.Host.Components.Chat.Commands.ICommandFactory.GenerateCommands(), Tgstation.Server.Host.Components.Chat.Chat.handlerCts, Tgstation.Server.Host.Components.Chat.Chat.initialChatBots, Tgstation.Server.Host.Components.Chat.Chat.MonitorMessages(), Tgstation.Server.Host.Components.Chat.Chat.providers, and Tgstation.Server.Host.Components.Chat.Chat.started.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.StartAsync().

+ +
+
+ +

◆ StopAsync()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Chat.Chat.StopAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 546 of file Chat.cs.

+
547  {
548  handlerCts.Cancel();
549  await chatHandler.ConfigureAwait(false);
550  await Task.WhenAll(providers.Select(x => x.Value).Select(x => x.Disconnect(cancellationToken))).ConfigureAwait(false);
551  }
readonly Dictionary< long, IProvider > providers
Map of IProviders in use, keyed by ChatBot.Id
Definition: Chat.cs:67
+
Task chatHandler
The Task that monitors incoming chat messages
Definition: Chat.cs:97
+
readonly CancellationTokenSource handlerCts
The CancellationTokenSource for chatHandler
Definition: Chat.cs:82
+
+

References Tgstation.Server.Host.Components.Chat.Chat.chatHandler, Tgstation.Server.Host.Components.Chat.Chat.handlerCts, and Tgstation.Server.Host.Components.Chat.Chat.providers.

+ +
+
+ +

◆ TrackJsons()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task<IJsonTrackingContext> Tgstation.Server.Host.Components.Chat.Chat.TrackJsons (string basePath,
string channelsJsonName,
string commandsJsonName,
CancellationToken cancellationToken 
)
+
+ +

Start tracking json files for commands and channels

+ +

Implements Tgstation.Server.Host.Components.Chat.IChat.

+ +

Definition at line 554 of file Chat.cs.

+
555  {
556  if (customCommandHandler == null)
557  throw new InvalidOperationException("RegisterCommandHandler() hasn't been called!");
558  JsonTrackingContext context = null;
559  context = new JsonTrackingContext(
560  ioManager,
562  loggerFactory.CreateLogger<JsonTrackingContext>(),
563  () =>
564  {
565  lock (trackingContexts)
566  trackingContexts.Remove(context);
567  },
568  ioManager.ConcatPath(basePath, commandsJsonName),
569  ioManager.ConcatPath(basePath, channelsJsonName));
570  Task task;
571  lock (trackingContexts)
572  {
573  trackingContexts.Add(context);
574  lock (mappedChannels)
575  task = context.SetChannels(mappedChannels.Select(y => y.Value.Channel), cancellationToken);
576  }
577 
578  await task.ConfigureAwait(false);
579  return context;
580  }
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the Chat
Definition: Chat.cs:52
+
readonly IIOManager ioManager
The IIOManager for the Chat
Definition: Chat.cs:32
+
readonly Dictionary< ulong, ChannelMapping > mappedChannels
Map of Channel.RealIds to ChannelMappings
Definition: Chat.cs:72
+
readonly List< IJsonTrackingContext > trackingContexts
The active IJsonTrackingContexts for the Chat
Definition: Chat.cs:77
+
ICustomCommandHandler customCommandHandler
The ICustomCommandHandler for the ChangeChannels(long, IEnumerable<Api.Models.ChatChannel>,...
Definition: Chat.cs:92
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
+

References Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.Components.Chat.Chat.customCommandHandler, Tgstation.Server.Host.Components.Chat.Chat.ioManager, Tgstation.Server.Host.Components.Chat.Chat.loggerFactory, Tgstation.Server.Host.Components.Chat.Chat.mappedChannels, Tgstation.Server.Host.Components.Chat.JsonTrackingContext.SetChannels(), and Tgstation.Server.Host.Components.Chat.Chat.trackingContexts.

+ +
+
+

Member Data Documentation

+ +

◆ asyncDelayer

+ +
+
+ + + + + +
+ + + + +
readonly IAsyncDelayer Tgstation.Server.Host.Components.Chat.Chat.asyncDelayer
+
+private
+
+ +

The IAsyncDelayer for the Chat

+ +

Definition at line 47 of file Chat.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.Chat(), and Tgstation.Server.Host.Components.Chat.Chat.MonitorMessages().

+ +
+
+ +

◆ builtinCommands

+ +
+
+ + + + + +
+ + + + +
readonly Dictionary<string, ICommand> Tgstation.Server.Host.Components.Chat.Chat.builtinCommands
+
+private
+
+ +

Unchanging ICommands in the Chat mapped by ICommand.Name

+ +

Definition at line 62 of file Chat.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.Chat(), Tgstation.Server.Host.Components.Chat.Chat.ProcessMessage(), and Tgstation.Server.Host.Components.Chat.Chat.StartAsync().

+ +
+
+ +

◆ channelIdCounter

+ +
+
+ + + + + +
+ + + + +
ulong Tgstation.Server.Host.Components.Chat.Chat.channelIdCounter
+
+private
+
+
+ +

◆ chatHandler

+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Components.Chat.Chat.chatHandler
+
+private
+
+ +

The Task that monitors incoming chat messages

+ +

Definition at line 97 of file Chat.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.StartAsync(), and Tgstation.Server.Host.Components.Chat.Chat.StopAsync().

+ +
+
+ +

◆ commandFactory

+ +
+
+ + + + + +
+ + + + +
readonly ICommandFactory Tgstation.Server.Host.Components.Chat.Chat.commandFactory
+
+private
+
+ +

The ICommandFactory for the Chat

+ +

Definition at line 37 of file Chat.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.Chat(), and Tgstation.Server.Host.Components.Chat.Chat.StartAsync().

+ +
+
+ +

◆ CommonMention

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Chat.Chat.CommonMention = "!tgs"
+
+private
+
+ +

Definition at line 22 of file Chat.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ProcessMessage().

+ +
+
+ +

◆ connectionsUpdated

+ +
+
+ + + + + +
+ + + + +
TaskCompletionSource<object> Tgstation.Server.Host.Components.Chat.Chat.connectionsUpdated
+
+private
+
+ +

The TaskCompletionSource<TResult> that completes when ChatBots change

+ +

Definition at line 102 of file Chat.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ChangeSettings(), Tgstation.Server.Host.Components.Chat.Chat.Chat(), and Tgstation.Server.Host.Components.Chat.Chat.MonitorMessages().

+ +
+
+ +

◆ customCommandHandler

+ +
+
+ + + + + +
+ + + + +
ICustomCommandHandler Tgstation.Server.Host.Components.Chat.Chat.customCommandHandler
+
+private
+
+ +

The ICustomCommandHandler for the ChangeChannels(long, IEnumerable<Api.Models.ChatChannel>, CancellationToken)

+ +

Definition at line 92 of file Chat.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.RegisterCommandHandler(), and Tgstation.Server.Host.Components.Chat.Chat.TrackJsons().

+ +
+
+ +

◆ handlerCts

+ +
+
+ + + + + +
+ + + + +
readonly CancellationTokenSource Tgstation.Server.Host.Components.Chat.Chat.handlerCts
+
+private
+
+
+ +

◆ initialChatBots

+ +
+
+ + + + + +
+ + + + +
readonly List<Models.ChatBot> Tgstation.Server.Host.Components.Chat.Chat.initialChatBots
+
+private
+
+
+ +

◆ ioManager

+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.Chat.Chat.ioManager
+
+private
+
+ +

The IIOManager for the Chat

+ +

Definition at line 32 of file Chat.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.Chat(), and Tgstation.Server.Host.Components.Chat.Chat.TrackJsons().

+ +
+
+ +

◆ logger

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<Chat> Tgstation.Server.Host.Components.Chat.Chat.logger
+
+private
+
+
+ +

◆ loggerFactory

+ +
+
+ + + + + +
+ + + + +
readonly ILoggerFactory Tgstation.Server.Host.Components.Chat.Chat.loggerFactory
+
+private
+
+ +

The ILoggerFactory for the Chat

+ +

Definition at line 52 of file Chat.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.Chat(), and Tgstation.Server.Host.Components.Chat.Chat.TrackJsons().

+ +
+
+ +

◆ mappedChannels

+ + + +

◆ providerFactory

+ +
+
+ + + + + +
+ + + + +
readonly IProviderFactory Tgstation.Server.Host.Components.Chat.Chat.providerFactory
+
+private
+
+
+ +

◆ providers

+ + + +

◆ restartRegistration

+ +
+
+ + + + + +
+ + + + +
readonly IRestartRegistration Tgstation.Server.Host.Components.Chat.Chat.restartRegistration
+
+private
+
+ +

The IRestartRegistration for the Chat

+ +

Definition at line 42 of file Chat.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.Chat(), and Tgstation.Server.Host.Components.Chat.Chat.Dispose().

+ +
+
+ +

◆ started

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Chat.started
+
+private
+
+
+ +

◆ trackingContexts

+ + +
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Host/Components/Chat/Chat.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2e57850cd74ec2be3fb6a2a52f295a259266fd GIT binary patch literal 2225 zcmbtWX;f3!7QO-Hu^_biw18SbXpk}oP!I&6LJUEqB!)y}h8I&LpkP8}5Mrq^31T3q zOg@oG2vaZt#4r>T2@Z>BpkWkzX&4eILIPnh@8Z(-b@}i0uC?#k-?#QYKlVA_w@$jZ z7g9rQw;BKd8Yp)+3;-xG!8}b>8T^|GR=mMQ+uIY1P$(2&IxUt`uKkh&W*?%nvvX_u zs2&Ja$r!H_09ds7@wr%Qka9t}eTTgOkra>6rX03y$&LA0p~!tfJxe=f>)E4JYa^ss zg!$#WQ4BcN$6x-7ow9MWBHY?ai)v|uqWNZHd{Nf=Ab7(&>5F>M!}Y*;Fc>fd80DMb z58{0ev$?l*U4Q1_+}s*pBFZUy(ie$Z9ZC!oBpeyRCkr#{A`jn8r#qo#!U7a;WF?!~ zA)m#`a=B3veawcup@gPV{+o&M?r|B1wOYdL)e2}&lvDaMrReMFFixR!wOIdkQdF{p zH9T(-dgJU)J=&6Pd!2Z@yHVrnz)1H>8`lC^9uU+WCaRPBz;t)@$C;Jg5k^r z4^6gfvTe0aY?C&r<9tSRJ$QaA519OUwug8@ILDcJ7IIP$YA<0F)s&WVbikJ4#2`Vg zMpe_hBoDl)U&&fL+SHF;9ps9NSDrY*_A-Kz{qNhsW+dxq!u%ltv#VC2Gc@-yQgKN0 z)!hOV;+}p? zd0VsvuE>|++>hjSKyadbFf@O)Zi_M!kGU;CtUSI%(--PvBet)JU^2=Y2(O!jx5895`2hF= z)gy||CEuL0yncb6wWBV>0CnjR1QpMvppyo!m(7Y>w5BZcIHYs!+|ypfHQUO^iVpgQ zy!NnK+j>l6>2sV(Y=Zb$dhypCIq~XOgr9CyCC2@biwa1!>yiDQi$B& z+=*G0UlZ}{iyIfh3Qr5(s)l^|uw)3})(I`YA0rnbQfjXV-?5w=4$G8qJZ!*VMWidk zSa$RaJSTft{trTeM#;B@uwv%jqXL=qw=DS60XSO^DQLJvHoCZjvvHFL6 zUu3p^Qa!0Eif9=nO0FRBUmqZJ6npVq*M^7BI(1jYT!nj4%m|jv?fag_7@1}8+;?Wg zu%u2w1WR0=Y_gn5NztNj#5hP^ghmM7+C8iGJuM}5>^>$qGq!?2S2rB;3-UC@*_f>L zjA}V#&~DpZs3Tn=4>#{2oW;boSCDj;+_~eGNhGs=ujn9cnS{~gWL__!AB=a1VkPh# zcqP~o^!B*(hn|Ps5?WzN56HZ$JNG!^ZBY(uocIHhj&{!|4kOiGbDfE{;)}Vq{Oe`& zi<7NIriIozs8!WlbO}j~wsauIxX^qP-@^+iVL4?`m>(gx{2P>>K8s0P`Z2D80o(Z8 z@;>uGn(-mfK?l2AJzwre08sBD8!Dvgf8_SfqIej%4=VAK(5~O+w%7t1pb|fd3HIpn z2dRE4`2UpnQO2~m5~9tE#Ze#_fV${KCURxHKqYt^!;A{i-eRi$H|W>9 znnxt3*~*;&?6FUbHlRFdVh^QWI!FInrPHOw;|t~Bz5a%&5cswTdQ?ATrzl#!i0>#` zFr?}pYho`XZNwv8K5CEMUE~DXMEbq^Teyp}zR?QSks#Bx%xvnccv>qdL;}ZY278|} zPu9HCYfY|?kWR$>=vyk=+UU>8pJRnwtii=5G)MzqgzgEAY|Hk!<{wzQHK(As9loX5gkUmC6onEX%$L}Eqg+UP z7HGtHpHs_3DirkLHzpABIc-1?{n=sF(YgWcv=K?H%?KptvI5X4m}11 + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.ChatFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Chat.ChatFactory, including all inherited members.

+ + + + + + + +
asyncDelayerTgstation.Server.Host.Components.Chat.ChatFactoryprivate
ChatFactory(IProviderFactory providerFactory, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILoggerFactory loggerFactory)Tgstation.Server.Host.Components.Chat.ChatFactory
CreateChat(IIOManager ioManager, ICommandFactory commandFactory, IEnumerable< Models.ChatBot > initialChatBots)Tgstation.Server.Host.Components.Chat.ChatFactory
loggerFactoryTgstation.Server.Host.Components.Chat.ChatFactoryprivate
providerFactoryTgstation.Server.Host.Components.Chat.ChatFactoryprivate
serverControlTgstation.Server.Host.Components.Chat.ChatFactoryprivate
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html new file mode 100644 index 0000000000..f0dac41cef --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html @@ -0,0 +1,341 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.ChatFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.ChatFactory Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.ChatFactory:
+
+
+ + +Tgstation.Server.Host.Components.Chat.IChatFactory + +
+ + + + + + + + +

+Public Member Functions

 ChatFactory (IProviderFactory providerFactory, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILoggerFactory loggerFactory)
 Construct a ChatFactory More...
 
IChat CreateChat (IIOManager ioManager, ICommandFactory commandFactory, IEnumerable< Models.ChatBot > initialChatBots)
 Create a IChat More...
 
+ + + + + + + + + + + + + +

+Private Attributes

readonly ILoggerFactory loggerFactory
 The ILoggerFactory for the ChatFactory More...
 
readonly IProviderFactory providerFactory
 The IProviderFactory for the ChatFactory More...
 
readonly IServerControl serverControl
 The IServerControl for the ChatFactory More...
 
readonly IAsyncDelayer asyncDelayer
 The IAsyncDelayer for the ChatFactory More...
 
+

Detailed Description

+
+

Definition at line 11 of file ChatFactory.cs.

+

Constructor & Destructor Documentation

+ +

◆ ChatFactory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Chat.ChatFactory.ChatFactory (IProviderFactory providerFactory,
IServerControl serverControl,
IAsyncDelayer asyncDelayer,
ILoggerFactory loggerFactory 
)
+
+ +

Construct a ChatFactory

+
Parameters
+ + + + + +
providerFactoryThe value of providerFactory
serverControlThe value of serverControl
asyncDelayerThe value of asyncDelayer
loggerFactoryThe value of loggerFactory
+
+
+ +

Definition at line 40 of file ChatFactory.cs.

+
41  {
42  this.providerFactory = providerFactory ?? throw new ArgumentNullException(nameof(providerFactory));
43  this.serverControl = serverControl ?? throw new ArgumentNullException(nameof(serverControl));
44  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
45  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
46  }
readonly IServerControl serverControl
The IServerControl for the ChatFactory
Definition: ChatFactory.cs:26
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the ChatFactory
Definition: ChatFactory.cs:31
+
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the ChatFactory
Definition: ChatFactory.cs:16
+
readonly IProviderFactory providerFactory
The IProviderFactory for the ChatFactory
Definition: ChatFactory.cs:21
+
+

References Tgstation.Server.Host.Components.Chat.ChatFactory.asyncDelayer, Tgstation.Server.Host.Components.Chat.ChatFactory.loggerFactory, Tgstation.Server.Host.Components.Chat.ChatFactory.providerFactory, and Tgstation.Server.Host.Components.Chat.ChatFactory.serverControl.

+ +
+
+

Member Function Documentation

+ +

◆ CreateChat()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
IChat Tgstation.Server.Host.Components.Chat.ChatFactory.CreateChat (IIOManager ioManager,
ICommandFactory commandFactory,
IEnumerable< Models.ChatBotinitialChatBots 
)
+
+
+

Member Data Documentation

+ +

◆ asyncDelayer

+ +
+
+ + + + + +
+ + + + +
readonly IAsyncDelayer Tgstation.Server.Host.Components.Chat.ChatFactory.asyncDelayer
+
+private
+
+ +

The IAsyncDelayer for the ChatFactory

+ +

Definition at line 31 of file ChatFactory.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.ChatFactory.ChatFactory().

+ +
+
+ +

◆ loggerFactory

+ +
+
+ + + + + +
+ + + + +
readonly ILoggerFactory Tgstation.Server.Host.Components.Chat.ChatFactory.loggerFactory
+
+private
+
+ +

The ILoggerFactory for the ChatFactory

+ +

Definition at line 16 of file ChatFactory.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.ChatFactory.ChatFactory().

+ +
+
+ +

◆ providerFactory

+ +
+
+ + + + + +
+ + + + +
readonly IProviderFactory Tgstation.Server.Host.Components.Chat.ChatFactory.providerFactory
+
+private
+
+ +

The IProviderFactory for the ChatFactory

+ +

Definition at line 21 of file ChatFactory.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.ChatFactory.ChatFactory().

+ +
+
+ +

◆ serverControl

+ +
+
+ + + + + +
+ + + + +
readonly IServerControl Tgstation.Server.Host.Components.Chat.ChatFactory.serverControl
+
+private
+
+ +

The IServerControl for the ChatFactory

+ +

Definition at line 26 of file ChatFactory.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.ChatFactory.ChatFactory().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..6e770120f1096a0bf9434c8e5a593b18a722e4fb GIT binary patch literal 1190 zcmeAS@N?(olHy`uVBq!ia0y~yV6+0V12~w0#nq8mNE+^DqMrqZFh*JEtl&F37{N!gR=*B=v5oWg^feE+%1`vYkSqM{?b_({6H0HzfWp=%=YLacySK~Isy$`WhTYrO znP0i(Ub)-U+kvsZkl#$!fu&mhqg_6%qyvM_k)D{ z>J8T>#8ypxWX>Jay7%>})f?W$NtZkh*7l6QrhoL3>y^c?y&F_&gYDbbv6|f36}CY2 zHrBjwKVgR}W-O#*}tyv6ffeGsNoR2@08)lwM{rhP5|DB2lw%Wb8 zJVE~LU7pRG->&~=b8lDS-Mn)>_1m7>?qY9axUM##ZSuRjJuev8Y@NS5{V&&f?g>gp zl_}qU-nhKx+pCqc6#Litg}nYZVO4kb+oz|ix9!zFps29Bq`>$LpY%tDKj)r-64K%e zvmygL@4IOAmGzaLSSaoDt6^1lvAyn$*!;8={q^?Q7x{(np1by9*3xGM9f#wD7xZk3 z{XR=C=F7tKG3)Hq^t%i9+9__f{(NQUSJoF>UDF$`yj^#}^1Pbs-3w2ynTnsk$eV89 zeM9fx-<)vwX)kovvF^$}R2Kd2UG;Yjor~~P^!eN7$t`nL`j3lNzJB&XW|HTjclUPP z3&@s#`u5rd_s#F`@7n$%r*$uPMD6DHr>@*V_QqFUt26aKdM3h_4K65=5_jv4EL|(FZ_ITWB=N#84c@Smp9K; s({bQRSdJFkRSUJ3P6^RmYICLDWul{k_KMyAfQ1T!r>mdKI;Vst01+ZWZU6uP literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_bool_converter-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_bool_converter-members.html new file mode 100644 index 0000000000..e7d1da07d3 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_bool_converter-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.Commands.BoolConverter Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Chat.Commands.BoolConverter, including all inherited members.

+ + + + +
CanConvert(Type objectType)Tgstation.Server.Host.Components.Chat.Commands.BoolConverter
ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)Tgstation.Server.Host.Components.Chat.Commands.BoolConverter
WriteJson(JsonWriter writer, object value, JsonSerializer serializer)Tgstation.Server.Host.Components.Chat.Commands.BoolConverter
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_bool_converter.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_bool_converter.html new file mode 100644 index 0000000000..bc92e107de --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_bool_converter.html @@ -0,0 +1,213 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Commands.BoolConverter Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Commands.BoolConverter Class Reference
+
+
+ +

JsonConverter for decoding bools returned by BYOND + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.Commands.BoolConverter:
+
+
+ + +JsonConverter + +
+ + + + + + + + +

+Public Member Functions

override void WriteJson (JsonWriter writer, object value, JsonSerializer serializer)
 
override object ReadJson (JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
 
override bool CanConvert (Type objectType)
 
+

Detailed Description

+

JsonConverter for decoding bools returned by BYOND

+ +

Definition at line 9 of file BoolConverter.cs.

+

Member Function Documentation

+ +

◆ CanConvert()

+ +
+
+ + + + + + + + +
override bool Tgstation.Server.Host.Components.Chat.Commands.BoolConverter.CanConvert (Type objectType)
+
+ +

+ +
+
+ +

◆ ReadJson()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
override object Tgstation.Server.Host.Components.Chat.Commands.BoolConverter.ReadJson (JsonReader reader,
Type objectType,
object existingValue,
JsonSerializer serializer 
)
+
+ +

+ +
+
+ +

◆ WriteJson()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
override void Tgstation.Server.Host.Components.Chat.Commands.BoolConverter.WriteJson (JsonWriter writer,
object value,
JsonSerializer serializer 
)
+
+ +

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_bool_converter.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_bool_converter.png new file mode 100644 index 0000000000000000000000000000000000000000..5757685091d471319e88a51a8fc3384d62d30d50 GIT binary patch literal 1033 zcmeAS@N?(olHy`uVBq!ia0y~yU~B=h12~w0q~7jNIY3Gxz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opZyfG)G9~W%Zup1(u&qpVaqW-Cp)8?p}nd?tSlk zuS>i;_qV+Lwc~5pbd!?rx7U?V)$}ZXtg132Of4z#JT$BD-sB0j z$4yjU*4>G4;-6D}&0pn={k`38_v4%9zl$}0w%^Bn(iicFO(&uP+IcoVkyu|{u~GE- zy(vq67k-|l;Aua9ih}3CB`ls?Y8dVgYEohSJRu-^t>@aUZHylt?O{}5C|ttQ5OMF` zB_;m5zfY-W^%*PHd}jD|>(+I4rnc<;FH#q5{4RZ& zr{CH!t3O8eX61<*PWEQ`y_w6{D^Bff@#kUTnJ)b9<(Zn~S%FQz|Ec{wbs}8FrlhXt z=f3`j`z22tP1%rlB2MI2s$9moH<20kUvF<~e0wnSgkf23SL**-!*t#J z1%H3d_uc%@kk^*q{_RDt58+mA>3nBZ7WUsvFKaiE;@WW7tbJ9n!Oh zin`E(p6h`V%1s~cWO-jEAr;@mnah1=VoT^A&GzV5Qd&>`dA|s*i93{X+1q{h*Z3(0 z{BM^oUM(~y;?3exrH3Z6Z=2FLPoDVT>XDCMvoBiO%oMj@>0itFkMp0Cm6Ylk`@V%g zoqR1~ro?{yb9U|(mh|#qFFSvC|MRbYnzRe)U2AEMpA!+|;htR^ReUt+MD*2LTL1rL zn}5C6XR_u{$cJxTE1&Fc^a&`t``Kz*=(m;6+^0L9TWa#dTF>q$@C zcR(y8{!q*vhNhjDqZs~iR&)Md#4T`g{gey)L>jC=SgSIqF#PXFOFESv8cU}vnG$s9 Z2lLs4psVXm+(7x3!PC{xWt~$(696U?zMTL7 literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command-members.html new file mode 100644 index 0000000000..ff0a51c306 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command-members.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.Commands.ByondCommand Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html new file mode 100644 index 0000000000..cfb50a3264 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html @@ -0,0 +1,350 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Commands.ByondCommand Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Commands.ByondCommand Class Reference
+
+
+ +

For displaying the installed Byond version + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.Commands.ByondCommand:
+
+
+ + +Tgstation.Server.Host.Components.Chat.Commands.ICommand + +
+ + + + + + + + +

+Public Member Functions

 ByondCommand (IByondManager byondManager, IWatchdog watchdog)
 Construct a ByondCommand More...
 
Task< string > Invoke (string arguments, User user, CancellationToken cancellationToken)
 Invoke the ICommand More...
 
+ + + + + + + +

+Public Attributes

string Name => "byond"
 
string HelpText => "Displays the running Byond version. Use --active for the version used in future deployments"
 
bool AdminOnly => false
 
+ + + + + + + +

+Private Attributes

readonly IByondManager byondManager
 The IByondManager for the ByondCommand More...
 
readonly IWatchdog watchdog
 The IWatchdog for the ByondCommand More...
 
+ + + + + + + + + + + +

+Additional Inherited Members

- Properties inherited from Tgstation.Server.Host.Components.Chat.Commands.ICommand
string Name [get]
 The text to invoke the command. May not be "?" or "help" (case-insensitive) More...
 
string HelpText [get]
 The help text to display when queires are made about the command More...
 
bool AdminOnly [get]
 If the command should only be available to Users who's User.Channel has Channel.IsAdminChannel set More...
 
+

Detailed Description

+

For displaying the installed Byond version

+ +

Definition at line 14 of file ByondCommand.cs.

+

Constructor & Destructor Documentation

+ +

◆ ByondCommand()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.ByondCommand (IByondManager byondManager,
IWatchdog watchdog 
)
+
+ +

Construct a ByondCommand

+
Parameters
+ + + +
byondManagerThe value of byondManager
watchdogThe value of watchdog
+
+
+ +

Definition at line 40 of file ByondCommand.cs.

+
41  {
42  this.byondManager = byondManager ?? throw new ArgumentNullException(nameof(byondManager));
43  this.watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
44  }
readonly IByondManager byondManager
The IByondManager for the ByondCommand
Definition: ByondCommand.cs:28
+
readonly IWatchdog watchdog
The IWatchdog for the ByondCommand
Definition: ByondCommand.cs:33
+
+

References Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.byondManager, and Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.watchdog.

+ +
+
+

Member Function Documentation

+ +

◆ Invoke()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<string> Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.Invoke (string arguments,
User user,
CancellationToken cancellationToken 
)
+
+ +

Invoke the ICommand

+ +

Implements Tgstation.Server.Host.Components.Chat.Commands.ICommand.

+ +

Definition at line 47 of file ByondCommand.cs.

+
48  {
49  if (arguments.Split(' ').Any(x => x.ToUpperInvariant() == "--ACTIVE"))
50  return Task.FromResult(byondManager.ActiveVersion == null ? "None!" : String.Format(CultureInfo.InvariantCulture, "{0}.{1}", byondManager.ActiveVersion.Major, byondManager.ActiveVersion.Minor));
51  if (!watchdog.Running)
52  return Task.FromResult("Server offline!");
53  return Task.FromResult(watchdog.ActiveCompileJob.ByondVersion);
54  }
readonly IByondManager byondManager
The IByondManager for the ByondCommand
Definition: ByondCommand.cs:28
+
Models.CompileJob ActiveCompileJob
The CompileJob currently running on the server
Definition: IWatchdog.cs:27
+
Version ActiveVersion
The currently active BYOND version
+
readonly IWatchdog watchdog
The IWatchdog for the ByondCommand
Definition: ByondCommand.cs:33
+
bool Running
If the watchdog is running
Definition: IWatchdog.cs:17
+
+

References Tgstation.Server.Host.Components.Watchdog.IWatchdog.ActiveCompileJob, Tgstation.Server.Host.Components.Byond.IByondManager.ActiveVersion, Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.byondManager, Tgstation.Server.Host.Components.Watchdog.IWatchdog.Running, and Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.watchdog.

+ +
+
+

Member Data Documentation

+ +

◆ AdminOnly

+ +
+
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.AdminOnly => false
+
+ +

+ +

Definition at line 23 of file ByondCommand.cs.

+ +
+
+ +

◆ byondManager

+ +
+
+ + + + + +
+ + + + +
readonly IByondManager Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.byondManager
+
+private
+
+
+ +

◆ HelpText

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.HelpText => "Displays the running Byond version. Use --active for the version used in future deployments"
+
+ +

+ +

Definition at line 20 of file ByondCommand.cs.

+ +
+
+ +

◆ Name

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.Name => "byond"
+
+ +

+ +

Definition at line 17 of file ByondCommand.cs.

+ +
+
+ +

◆ watchdog

+ +
+
+ + + + + +
+ + + + +
readonly IWatchdog Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.watchdog
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.png new file mode 100644 index 0000000000000000000000000000000000000000..d3a3f4da3e7c31bd97a0a00bb77dfef81e14f569 GIT binary patch literal 1301 zcmeAS@N?(olHy`uVBq!ia0y~yVC)6512~w00G|-o|Ns93nJ?aaE$u%v z0muU50|ySUcHWT(ayd$Z{DK*Pia_A%sSqOu29_nBE{-7;jBn>&EV`q>C`0s!J zcWM&R3U9tv&0e=Gv~Bhg32!I%CE?RjBZE$F(qTNJm)J=tYOyO8ZG?Zph33=Y4;seA1Vg(wjRfs`ur21eqUOuzF$LH(v9*pWe5d=f>=o z{x`X=O~vx+3ze5E&t>jO04hU5E z#@_J%YI3VPZSV7YFfz}Z)tkjiVXQQ z$L93&KGj?Q-z?jtTcY+`#Z0_ZxY{7y-`F|%&-puR{##sL{ByRM%E^~Zy?0Z^o6c{3 z7^uR#sXsQ|s^DUN;k!>S&M#RabzR+L$tC{sq&X0!O1zUFPdk|Wd#lKsy~V4uVy$K0 zAA9$xREqEQnjqef@k<{1%7?BJ&-J*pVzr5%_SFfl(K~p0BbndY@1M5p@aC$IllGRF zFZ-8v{Y@LM=c}*ozmCm0Ca`ODNP2CuiHY{@=Tl$ZxS(p@KC`6u@iJb|qAIuKT$gOg zm7xz`Z^*xzo+D72ReM=h#rmr3!?(hhzp*=~r61nXzu0Z(?oZyUCl;G8J2m5U?&giT zkLK}uN|ibtE_d?$wL$5ql4pI``HVTCmY%)Ewv ziK1uV6cZKAE>NsqY(BP0$2%)>+SAWWKiI!;E3gVUcrq(=)cy66VKAIx!qD`BQMr(z zCEyZ6$Kn)50au`8*CaLv5mnv>U}|6hn#8b3Ba^`;5U60$5~?Wp&(#~`8+S%*H~ai%URv9+AM3-<+RrazhRk*zxr-4G zXWiQwx^>;$zVhVqk5;_xrC}@Ee&}ENu#8{ps^%1Hpu#y}s}#Gp6-Y{LX1i5ir|aAP zdvC?bxLwl0^>zEV+3xdueB$KZeTK^oTi$71jl4fYBqe;?dF`tk7kcOM37fu`b~njs zthjix$1VHA)tt3lTYs)M&%sQ8Y9A7B9S>Z5C-&#kt0#6!2fO5~@-@qGefQmB&AyjQ zmOr#sJkTzxDV88_FLc8r`OO7}`5_@v_QKP5OTSfPVhIS4vKP6wCWvtf!@q6l3Fw96 j;weEvOQ(FQ{LAKlGAR1;+MENxGK|5~)z4*}Q$iB}njKj~ literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory-members.html new file mode 100644 index 0000000000..e046a3bc00 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory-members.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.Commands.CommandFactory Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html new file mode 100644 index 0000000000..464c74f32c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html @@ -0,0 +1,438 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Commands.CommandFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Commands.CommandFactory Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.Commands.CommandFactory:
+
+
+ + +Tgstation.Server.Host.Components.Chat.Commands.ICommandFactory + +
+ + + + + + + + + + + +

+Public Member Functions

 CommandFactory (IApplication application, IByondManager byondManager, IRepositoryManager repositoryManager, IDatabaseContextFactory databaseContextFactory, Models.Instance instance)
 Construct a CommandFactory More...
 
void SetWatchdog (IWatchdog watchdog)
 Set a watchdog for the CommandFactory More...
 
IReadOnlyList< ICommandGenerateCommands ()
 Generate builtin ICommands More...
 
+ + + + + + + + + + + + + + + + + + + +

+Private Attributes

readonly IApplication application
 The IApplication for the CommandFactory More...
 
readonly IByondManager byondManager
 The IByondManager for the CommandFactory More...
 
readonly IRepositoryManager repositoryManager
 The IRepositoryManager for the CommandFactory More...
 
readonly IDatabaseContextFactory databaseContextFactory
 The IDatabaseContextFactory for the CommandFactory More...
 
readonly Models.Instance instance
 The Models.Instance for the CommandFactory More...
 
IWatchdog watchdog
 The IWatchdog for the CommandFactory More...
 
+

Detailed Description

+
+

Definition at line 11 of file CommandFactory.cs.

+

Constructor & Destructor Documentation

+ +

◆ CommandFactory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.CommandFactory (IApplication application,
IByondManager byondManager,
IRepositoryManager repositoryManager,
IDatabaseContextFactory databaseContextFactory,
Models.Instance instance 
)
+
+ +

Construct a CommandFactory

+
Parameters
+ + + + + + +
applicationThe value of application
byondManagerThe value of byondManager
repositoryManagerThe value of repositoryManager
databaseContextFactoryThe value of databaseContextFactory
instanceThe value of instance
+
+
+ +

Definition at line 51 of file CommandFactory.cs.

+
52  {
53  this.application = application ?? throw new ArgumentNullException(nameof(application));
54  this.byondManager = byondManager ?? throw new ArgumentNullException(nameof(byondManager));
55  this.repositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
56  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
57  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
58  }
readonly IByondManager byondManager
The IByondManager for the CommandFactory
+
readonly Models.Instance instance
The Models.Instance for the CommandFactory
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the CommandFactory
+
readonly IApplication application
The IApplication for the CommandFactory
+
readonly IRepositoryManager repositoryManager
The IRepositoryManager for the CommandFactory
+
+

References Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.application, Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.byondManager, Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.databaseContextFactory, Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.instance, and Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.repositoryManager.

+ +
+
+

Member Function Documentation

+ +

◆ GenerateCommands()

+ +
+
+ + + + + + + +
IReadOnlyList<ICommand> Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.GenerateCommands ()
+
+ +

Generate builtin ICommands

+ +

Implements Tgstation.Server.Host.Components.Chat.Commands.ICommandFactory.

+ +

Definition at line 72 of file CommandFactory.cs.

+
73  {
74  if (watchdog == null)
75  throw new InvalidOperationException("SetWatchdog has not been called!");
76  return new List<ICommand>
77  {
78  new VersionCommand(application),
79  new ByondCommand(byondManager, watchdog),
80  new RevisionCommand(watchdog, repositoryManager, instance),
81  new PullRequestsCommand(watchdog, repositoryManager, databaseContextFactory, instance),
82  new KekCommand()
83  };
84  }
readonly IByondManager byondManager
The IByondManager for the CommandFactory
+
readonly Models.Instance instance
The Models.Instance for the CommandFactory
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the CommandFactory
+
IWatchdog watchdog
The IWatchdog for the CommandFactory
+
readonly IApplication application
The IApplication for the CommandFactory
+
readonly IRepositoryManager repositoryManager
The IRepositoryManager for the CommandFactory
+
+

References Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.application, Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.byondManager, Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.databaseContextFactory, Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.instance, Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.repositoryManager, and Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.watchdog.

+ +
+
+ +

◆ SetWatchdog()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.SetWatchdog (IWatchdog watchdog)
+
+ +

Set a watchdog for the CommandFactory

+
Parameters
+ + +
watchdogThe IWatchdog to set
+
+
+ +

Definition at line 64 of file CommandFactory.cs.

+
65  {
66  if (this.watchdog != null)
67  throw new InvalidOperationException("SetWatchdog has already been called!");
68  this.watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
69  }
IWatchdog watchdog
The IWatchdog for the CommandFactory
+
+

References Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.watchdog.

+ +
+
+

Member Data Documentation

+ +

◆ application

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.application
+
+private
+
+
+ +

◆ byondManager

+ +
+
+ + + + + +
+ + + + +
readonly IByondManager Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.byondManager
+
+private
+
+
+ +

◆ databaseContextFactory

+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContextFactory Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.databaseContextFactory
+
+private
+
+
+ +

◆ instance

+ +
+
+ + + + + +
+ + + + +
readonly Models.Instance Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.instance
+
+private
+
+
+ +

◆ repositoryManager

+ +
+
+ + + + + +
+ + + + +
readonly IRepositoryManager Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.repositoryManager
+
+private
+
+
+ +

◆ watchdog

+ +
+
+ + + + + +
+ + + + +
IWatchdog Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.watchdog
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..dba3faf17ca8b8225a2c7612e2b5c481ddebbc47 GIT binary patch literal 1352 zcmeAS@N?(olHy`uVBq!ia0y~yV4MMD2XHV0Nny>&API>8pAgso|NjG-FW!7D?LRaD z$O7X72M(}y-jN4#IZA^3f*F8{K;Y`B5F-W#mg}A_jv*C{Z|AGqK>pCFm8U#GX_MrYmLraSG1il(aP#3>0XnhS(_R9HirCN634 zGMFS1!0WTJe$p8WdHMUh?%(1+>^;dOIQE*p-MshGlb*QAmzX|DuYY(<_kU%@>0>(k zS1&13Pm6hSz~j;asTC@=S50S#^LQ2|HzllC9KS>Iz@GHv!0VGtt};Ax{Cd2)HRs>e zn^HF$?}a7R-V^_&$-nIHg*Cs0GW4RvZaunsS?+q`NWj- z8~pFGoZ07T9a6%#c|qZpsaNW(?E8FWx!EV%%|Cl|-~5@+A7-Yl=>I=+wsHNvlKg+Q z((iO=}oOYo~Vo$ZwMLT_1Hb+bl7YY)V1 z+oZSfuH)CeMZC}QH1)NAJiA!^@`%shvwZhgo2jkMxfFS;_0Ka|WA@8$lQL4n%YE`Q zu02{Gee>1@UGvjR_{z`xHk)_H@Or|x-`Vetx8~O9+usVlFZli3O}jZui%*Gu``ESf zla+JY@bC!BlBr=DgXF-gR+p1bGf+ci@?gS;l$tzc31WSoi;-&GAax8-{0 z-rm+Kbl|^RJcDLKgqH!s$1h)}rZ61RJjih5a9Pr4f0@Cl^BK$W z=?rPBPX9W3{Bx~ygLLhMs}tt`ZJoWdvSIeGb9YsCuI}jrrp@xNvuExXe*sFEjCno+ zJf&Z_&5J)Xm~Yj~YG`#c;NM`+8g4nezI2<|W5@epNt>^~y6RJD@U}he?sSLZjqC5$ zR-XTs$zQ;6LT~TmWvY9NOHv-2v$dK0{PJth*@JIpZ)rYcd8X;u#}nn=-y&7Zf{!0M zxP*Vj&KuiJKHJ!w<@x&2zPNbVh1vULpKoRSKJBc-{OzVQjQfmdB~IT~(qMGTZdY{9 z!$thH&x*bpzTA22t83iCABH05xBg_hJ44za{7lZx32Rg(Ccm3@MpWYYO%r`{Q%l3; z-PaHDw4|?H)BQg!&i!)uGwzb)tOMINX&Z*+n{aWbO+^g$i^$ycN&MxMB{_U>KDRnD8m>hGSq)|R(3^4Zno)X{^)22WQ%mvv4FO#m{na}EFi literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command-members.html new file mode 100644 index 0000000000..19193f56f9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command-members.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.Commands.CustomCommand Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.html new file mode 100644 index 0000000000..afedda0988 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.html @@ -0,0 +1,328 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Commands.CustomCommand Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Commands.CustomCommand Class Reference
+
+
+ +

Represents a command made from DM code + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.Commands.CustomCommand:
+
+
+ + +Tgstation.Server.Host.Components.Chat.Commands.ICommand + +
+ + + + + + + + +

+Public Member Functions

void SetHandler (ICustomCommandHandler handler)
 Set a new handler More...
 
Task< string > Invoke (string arguments, User user, CancellationToken cancellationToken)
 Invoke the ICommand More...
 
+ + + + + + + + + + + + + + + + + +

+Properties

string Name [get, set]
 
string HelpText [get, set]
 
bool AdminOnly [get, set]
 
- Properties inherited from Tgstation.Server.Host.Components.Chat.Commands.ICommand
string Name [get]
 The text to invoke the command. May not be "?" or "help" (case-insensitive) More...
 
string HelpText [get]
 The help text to display when queires are made about the command More...
 
bool AdminOnly [get]
 If the command should only be available to Users who's User.Channel has Channel.IsAdminChannel set More...
 
+ + + + +

+Private Attributes

ICustomCommandHandler handler
 The ICustomCommandHandler for the CustomCommand More...
 
+

Detailed Description

+

Represents a command made from DM code

+ +

Definition at line 11 of file CustomCommand.cs.

+

Member Function Documentation

+ +

◆ Invoke()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<string> Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.Invoke (string arguments,
User user,
CancellationToken cancellationToken 
)
+
+ +

Invoke the ICommand

+ +

Implements Tgstation.Server.Host.Components.Chat.Commands.ICommand.

+ +

Definition at line 40 of file CustomCommand.cs.

+
41  {
42  if (handler == null)
43  throw new InvalidOperationException("SetHandler() has not been called!");
44  return handler.HandleChatCommand(Name, arguments, user, cancellationToken);
45  }
+
ICustomCommandHandler handler
The ICustomCommandHandler for the CustomCommand
+
Task< string > HandleChatCommand(string commandName, string arguments, User sender, CancellationToken cancellationToken)
Handle a chat command
+
+

References Tgstation.Server.Host.Components.Chat.ICustomCommandHandler.HandleChatCommand(), Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.handler, and Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.Name.

+ +
+
+ +

◆ SetHandler()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.SetHandler (ICustomCommandHandler handler)
+
+ +

Set a new handler

+
Parameters
+ + +
handlerThe value of handler
+
+
+ +

Definition at line 32 of file CustomCommand.cs.

+
33  {
34  if (this.handler != null)
35  throw new InvalidOperationException("SetHandler() already called!");
36  this.handler = handler ?? throw new ArgumentNullException(nameof(handler));
37  }
ICustomCommandHandler handler
The ICustomCommandHandler for the CustomCommand
+
+

References Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.handler.

+ +
+
+

Member Data Documentation

+ +

◆ handler

+ +
+
+ + + + + +
+ + + + +
ICustomCommandHandler Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.handler
+
+private
+
+
+

Property Documentation

+ +

◆ AdminOnly

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.AdminOnly
+
+getset
+
+ +

+ +

Definition at line 21 of file CustomCommand.cs.

+
21 { get; set; }
+
+
+ +

◆ HelpText

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.HelpText
+
+getset
+
+ +

+ +

Definition at line 17 of file CustomCommand.cs.

+
17 { get; set; }
+
+
+ +

◆ Name

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.Name
+
+getset
+
+ +

+ +

Definition at line 14 of file CustomCommand.cs.

+
14 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.Invoke().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.png new file mode 100644 index 0000000000000000000000000000000000000000..1fef101686c1de65f3a4c389d430f0cc9908cdee GIT binary patch literal 1287 zcmeAS@N?(olHy`uVBq!ia0y~yV4MVG2XHV0NfvJA!$3+Rz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opqI+|pCKeP3$T5q#PzQ!ireA1OIb}w_Te5(^!Ci(C4hlTA+Ze3fR zQnTJs$+NkrYtomnY!&k!71P{JKMwQ#QaID_B$(fGYpmm^TMYJv`_r%fIlb3%dGhod zcc;()-k2NSz2r~8o#-E`E;H*TYrbt!w@^uGkK+vPcli8mqg3+N9nTd#7wak9T%JCA zQkF3@m*ej0Q~qBc&p2mTupuXWQ_BhCl_%HCOLMFJ_x{kEc(&K~{w-`*@h#!??7jWO zP;Xn~B$d)l{bzGag%-_yZu8{k@g;|5UEo#;%DTNFm+g1E+$58Wr7CF)PaDl+KRI<_ z+$#5p+3#-tn{q|q`$V3c^w!m<|0_+p_-jqU-7gcC1e#CK;SS$EWm})5%I4WyYyaMg zn)~in_wl#aG-n>0ExUtVZqk+4|95#m^Vs#L{m|B3-c^euHRHwC6)*Nq^qXG1!&|P( zW;vPCtg`Z1hlE|bb z@j(g`Rl**(29 zTZ6n#c6%@=GRR}t(6l7xn?vr`k6&~9@@hB}mf7+p-2PZ|mm?!;eu-IDwLORNcJ{2< zR(5?UekU_7C@@NVxm>UNN$Mo8@`B9CN9D^duqQqP8en|*`9wAq{Vn#h-&BX4-G67c z`GbS^-|b5Z|F+^~*2F3DUDe$CTW%bGxAE4AZ<+oD9w+$r3N2fcB>p0z_ujrUOF0vH z=DW@Ur9SD-TW1=a3Qlau3$~t{{2;+{=Bx51%b$@?9%iOpdH!GT%)itPanCLFe7{x- zykzk#T~o>PdGl@tkHv42i=*eZMEIBfHC(wt?aNltT({mvKi+4*-y|+!7213uRr36V zH!WwER*CFbAThE|#^WE_#QY(oDA~g-Ee=d78Ph#vWqd0zc4zw^qryRj!c@l|`h*BrcES|yO#w&c#ApAOHIKH9#}aQnM- z;_h$pvvgB;&pKPPCn*2ny%Q?;O8YCH=wz=b%rJ{=H+*_Trg*p1-h(^*&VH*9Tj^?a zFOi{M$A2fopQb96zgKxbOa~=A#t#b|m;{)9SfeMDOWe>H?)=AWb~!kqdD^WTz*39B M)78&qol`;+039kzrvLx| literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command-members.html new file mode 100644 index 0000000000..5b5968955b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command-members.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.Commands.KekCommand Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command.html new file mode 100644 index 0000000000..709cea38f1 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command.html @@ -0,0 +1,261 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Commands.KekCommand Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Commands.KekCommand Class Reference
+
+
+ +

kek + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.Commands.KekCommand:
+
+
+ + +Tgstation.Server.Host.Components.Chat.Commands.ICommand + +
+ + + + + +

+Public Member Functions

Task< string > Invoke (string arguments, User user, CancellationToken cancellationToken)
 Invoke the ICommand More...
 
+ + + + + + + +

+Public Attributes

string Name => Kek
 
string HelpText => Kek
 
bool AdminOnly => false
 
+ + + + +

+Private Attributes

const string Kek = "kek"
 kek More...
 
+ + + + + + + + + + + +

+Additional Inherited Members

- Properties inherited from Tgstation.Server.Host.Components.Chat.Commands.ICommand
string Name [get]
 The text to invoke the command. May not be "?" or "help" (case-insensitive) More...
 
string HelpText [get]
 The help text to display when queires are made about the command More...
 
bool AdminOnly [get]
 If the command should only be available to Users who's User.Channel has Channel.IsAdminChannel set More...
 
+

Detailed Description

+

kek

+ +

Definition at line 9 of file KekCommand.cs.

+

Member Function Documentation

+ +

◆ Invoke()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<string> Tgstation.Server.Host.Components.Chat.Commands.KekCommand.Invoke (string arguments,
User user,
CancellationToken cancellationToken 
)
+
+
+

Member Data Documentation

+ +

◆ AdminOnly

+ +
+
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Commands.KekCommand.AdminOnly => false
+
+ +

+ +

Definition at line 23 of file KekCommand.cs.

+ +
+
+ +

◆ HelpText

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.KekCommand.HelpText => Kek
+
+ +

+ +

Definition at line 20 of file KekCommand.cs.

+ +
+
+ +

◆ Kek

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Chat.Commands.KekCommand.Kek = "kek"
+
+private
+
+ +

kek

+ +

Definition at line 14 of file KekCommand.cs.

+ +
+
+ +

◆ Name

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.KekCommand.Name => Kek
+
+ +

+ +

Definition at line 17 of file KekCommand.cs.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Host/Components/Chat/Commands/KekCommand.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command.png new file mode 100644 index 0000000000000000000000000000000000000000..990006bd4ea6936513bac66b51795dbafeaa9836 GIT binary patch literal 1250 zcmeAS@N?(olHy`uVBq!ia0y~yV5|eO12~w0q~_IkHb6=uz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-op9% zrhbyo?Opx(XY-#~dRDEijIyqLJKucLlc?EWa-O)~=Xku#-a5bP&76PtEn1btjm|J<`$p`P4Ua^kM);M3DI2Y(!n%==|`Pv zT>~(UA#muQuS#s&ww21?KX&_yJ&VC5A@&Wqz!b(5lRbG}@1GaaiFdxFA5W}2e-)U- z7W6akxVD6O!}8=m;yn!4*%s`+{K;(w-+svm#e1c1KiF^kDEYXU_1%3NtK;$CZ_Qhk z6&`HjELZ<`;jZ7k>l9x_y?(Oy-lT--6XsT_`7FJ`5|#NwYs0>zyyfe6@_o?v-q?Ex zYdY&gO=la+U*A1892Q8l5JHEhc)&=$-3x8ab zop|wMnN9v~xd-L}+M8_uc*{LI6wN(#H}mbw`&)PP?Z16I@MGpDd(Ktcwd^w{dX-R zq^iIB{Jx7T4R$ZMb<2KL_4gR}A9rKz_s7p?ex1QMXIfT-{hZ5YPxxN`>e#tjT6uDX z@tx-vLl}cUzq)esiA9g5@UwtusXW2h3DWE2>g#J6SzfC@W%_V5>*Mz8S`JJ8N&JhF zWTGBa5VSRgTYy85}Sb4q9e0GJ1U Al>h($ literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command-members.html new file mode 100644 index 0000000000..f10548031a --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command-members.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html new file mode 100644 index 0000000000..39b1aca991 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html @@ -0,0 +1,432 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand Class Reference
+
+
+ +

Command for reading the active Api.Models.TestMerges + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand:
+
+
+ + +Tgstation.Server.Host.Components.Chat.Commands.ICommand + +
+ + + + + + + + +

+Public Member Functions

 PullRequestsCommand (IWatchdog watchdog, IRepositoryManager repositoryManager, IDatabaseContextFactory databaseContextFactory, Models.Instance instance)
 Construct a PullRequestsCommand More...
 
async Task< string > Invoke (string arguments, User user, CancellationToken cancellationToken)
 Invoke the ICommand More...
 
+ + + + + + + +

+Public Attributes

string Name => "prs"
 
string HelpText => "Display live test merge pull request numbers. Add --repo to view repository test merges"
 
bool AdminOnly => false
 
+ + + + + + + + + + + + + +

+Private Attributes

readonly IWatchdog watchdog
 The IWatchdog for the PullRequestsCommand More...
 
readonly IRepositoryManager repositoryManager
 The IRepositoryManager for the PullRequestsCommand More...
 
readonly IDatabaseContextFactory databaseContextFactory
 The IDatabaseContextFactory for the PullRequestsCommand More...
 
readonly Models.Instance instance
 The Models.Instance for the PullRequestsCommand More...
 
+ + + + + + + + + + + +

+Additional Inherited Members

- Properties inherited from Tgstation.Server.Host.Components.Chat.Commands.ICommand
string Name [get]
 The text to invoke the command. May not be "?" or "help" (case-insensitive) More...
 
string HelpText [get]
 The help text to display when queires are made about the command More...
 
bool AdminOnly [get]
 If the command should only be available to Users who's User.Channel has Channel.IsAdminChannel set More...
 
+

Detailed Description

+

Command for reading the active Api.Models.TestMerges

+ +

Definition at line 17 of file PullRequestsCommand.cs.

+

Constructor & Destructor Documentation

+ +

◆ PullRequestsCommand()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.PullRequestsCommand (IWatchdog watchdog,
IRepositoryManager repositoryManager,
IDatabaseContextFactory databaseContextFactory,
Models.Instance instance 
)
+
+ +

Construct a PullRequestsCommand

+
Parameters
+ + + + + +
watchdogThe value of watchdog
repositoryManagerThe value of repositoryManager
databaseContextFactoryThe value of databaseContextFactory
instanceThe value of instance
+
+
+ +

Definition at line 55 of file PullRequestsCommand.cs.

+
56  {
57  this.watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
58  this.repositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
59  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
60  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
61  }
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the PullRequestsCommand
+
readonly IRepositoryManager repositoryManager
The IRepositoryManager for the PullRequestsCommand
+
readonly Models.Instance instance
The Models.Instance for the PullRequestsCommand
+
readonly IWatchdog watchdog
The IWatchdog for the PullRequestsCommand
+
+

References Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.databaseContextFactory, Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.instance, Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.repositoryManager, and Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.watchdog.

+ +
+
+

Member Function Documentation

+ +

◆ Invoke()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task<string> Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.Invoke (string arguments,
User user,
CancellationToken cancellationToken 
)
+
+ +

Invoke the ICommand

+ +

Implements Tgstation.Server.Host.Components.Chat.Commands.ICommand.

+ +

Definition at line 66 of file PullRequestsCommand.cs.

+
67  {
68  IEnumerable<Models.TestMerge> results = null;
69  if (arguments.Split(' ').Any(x => x.ToUpperInvariant() == "--REPO"))
70  {
71  string head;
72  using (var repo = await repositoryManager.LoadRepository(cancellationToken).ConfigureAwait(false))
73  {
74  if (repo == null)
75  return "Repository unavailable!";
76  head = repo.Head;
77  }
78 
79  await databaseContextFactory.UseContext(async db => results = await db.RevisionInformations.Where(x => x.Instance.Id == instance.Id && x.CommitSha == head)
80  .SelectMany(x => x.ActiveTestMerges)
81  .Select(x => x.TestMerge)
82  .Select(x => new Models.TestMerge
83  {
84  Number = x.Number,
85  PullRequestRevision = x.PullRequestRevision
86  }).ToListAsync(cancellationToken).ConfigureAwait(false)).ConfigureAwait(false);
87  }
88  else
89  {
90  if (!watchdog.Running)
91  return "Server offline!";
92  results = watchdog.ActiveCompileJob?.RevisionInformation.ActiveTestMerges.Select(x => x.TestMerge).ToList() ?? new List<Models.TestMerge>();
93  }
94 
95  return !results.Any() ? "None!" : String.Join(", ", results.Select(x => String.Format(CultureInfo.InvariantCulture, "#{0} at {1}", x.Number, x.PullRequestRevision.Substring(0, 7))));
96  }
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the PullRequestsCommand
+ +
readonly IRepositoryManager repositoryManager
The IRepositoryManager for the PullRequestsCommand
+
Models.CompileJob ActiveCompileJob
The CompileJob currently running on the server
Definition: IWatchdog.cs:27
+
readonly Models.Instance instance
The Models.Instance for the PullRequestsCommand
+
Task< IRepository > LoadRepository(CancellationToken cancellationToken)
Attempt to load the IRepository from the default location
+
readonly IWatchdog watchdog
The IWatchdog for the PullRequestsCommand
+
bool Running
If the watchdog is running
Definition: IWatchdog.cs:17
+
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+
+

References Tgstation.Server.Host.Components.Watchdog.IWatchdog.ActiveCompileJob, Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.databaseContextFactory, Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.instance, Tgstation.Server.Host.Components.Repository.IRepositoryManager.LoadRepository(), Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.repositoryManager, Tgstation.Server.Host.Components.Watchdog.IWatchdog.Running, Tgstation.Server.Host.Core.IDatabaseContextFactory.UseContext(), and Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.watchdog.

+ +
+
+

Member Data Documentation

+ +

◆ AdminOnly

+ +
+
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.AdminOnly => false
+
+ +

+ +

Definition at line 26 of file PullRequestsCommand.cs.

+ +
+
+ +

◆ databaseContextFactory

+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContextFactory Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.databaseContextFactory
+
+private
+
+
+ +

◆ HelpText

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.HelpText => "Display live test merge pull request numbers. Add --repo to view repository test merges"
+
+ +

+ +

Definition at line 23 of file PullRequestsCommand.cs.

+ +
+
+ +

◆ instance

+ +
+
+ + + + + +
+ + + + +
readonly Models.Instance Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.instance
+
+private
+
+
+ +

◆ Name

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.Name => "prs"
+
+ +

+ +

Definition at line 20 of file PullRequestsCommand.cs.

+ +
+
+ +

◆ repositoryManager

+ +
+
+ + + + + +
+ + + + +
readonly IRepositoryManager Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.repositoryManager
+
+private
+
+
+ +

◆ watchdog

+ +
+
+ + + + + +
+ + + + +
readonly IWatchdog Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.watchdog
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.png new file mode 100644 index 0000000000000000000000000000000000000000..5047f8d4db0527b21cb8b40697c6fad95536897e GIT binary patch literal 1366 zcmb`HX;4#F6vtm!WD5x*I7-4|g{Wm6nK89CL4^npQ7}?8#XyjO28Fm1c1Suc0TIH4 zRWewt(H3M$QHcu5LlHz0S(HEshz4W}5o<{>iI6@!(+{m*duQ%F|1wk$7aD-5!e&p3ycoNOp1a0WAe4IFNnb@n~%hPka*{J&`*h z&fqOYCCl!lVxsY`wHaMCH?CxBjPc{|7dtpRT<3yBj7rfcqQv#rdk8T7#yJ`u3C>@( za7cMTJUz+EI^oYNS^`Ft?=l0`w`bm7eJ0Hlt&0z3I5t`7Yn_hjuTU1b`_2tCKVR=$ zC1;ET8yG~FKbOjXZGKb4_H!mz6DA@)f~<1e6j)ZO9dd}^SdQM?(yysM#s}ttl z)U=PRkwdt(30zEe9vQ_Cr+?eqH(VxrIyO>2|3bGv1*-~AS=(}?sz9pHh{V&J1n0oQ zvng*XA~w%3LU#JPJ&cc)clv&6hKQx@@&pY>+qbO;bur^+%o~c}L9{y?9K0k|dV%eq zhDqivVag!aZN;{guBK$862b0Z8qY4so7UUxQ5#1ow=w$Qtu}Kpwehz=x)iN`1djtT zr4XQ)ee9l(2smV9Y<{iN)FueNEVkXS8>WH<7Xa9>1;zwnLWT_jlQsW`!Qd$*2ZLqg zVB{fy46Oa^1#1{XR+{FuQjV?9v7lWaLeqXu${e@pC&cy-h56~(e1^7IP*o0218ocZ z&`BS>7&FU4e3jJ~{bwd>A$L8hS3Er})0ClcD^ zbHXj6ODAXKA!=w8ElF=Ln?6o$)y)&+0}eG-PrU9cuE(7@eJk#fBd1VWzLFJ7w4w?^ zCo6%-1I&&)?41y99cG3RDvuZalzo$WnP1>A`7b0@5@&>O2}XD(=6e+bYX&h3GD;cC znv1~WUR0}B+N)nCI>z1%w1cW0jiIbPbIuj|j<&gCT*c&6_M`*SRD2KPFr7FCm zh9dEa^L>0jk9_&5)w4P(Y^0$1#u(;Iu!4f#m56#^?^xOy>t8X3#hn;@giEN>2v;xM zu}bqR+9+&@Zs9iZWnaHurqLskPpn+qRm7}oHJ7_fNJ^AG68A1 zzrt^2BQ%%F0$6sCcldt^yU&6dsVgP#o%QbDPkFwN{zWhR2?8MLU_j$u+7EvLoj!U& literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command-members.html new file mode 100644 index 0000000000..7f44fca2fc --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command-members.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html new file mode 100644 index 0000000000..87eb994b20 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html @@ -0,0 +1,389 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand Class Reference
+
+
+ +

For displaying Api.Models.Internal.RevisionInformation + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand:
+
+
+ + +Tgstation.Server.Host.Components.Chat.Commands.ICommand + +
+ + + + + + + + +

+Public Member Functions

 RevisionCommand (IWatchdog watchdog, IRepositoryManager repositoryManager, Models.Instance instance)
 Construct a RevisionCommand More...
 
async Task< string > Invoke (string arguments, User user, CancellationToken cancellationToken)
 Invoke the ICommand More...
 
+ + + + + + + +

+Public Attributes

string Name => "revision"
 
string HelpText => "Display live commit sha. Add --repo to view repository revision"
 
bool AdminOnly => false
 
+ + + + + + + + + + +

+Private Attributes

readonly IWatchdog watchdog
 The IWatchdog for the PullRequestsCommand More...
 
readonly IRepositoryManager repositoryManager
 The IRepositoryManager for the PullRequestsCommand More...
 
readonly Models.Instance instance
 The Models.Instance for the PullRequestsCommand More...
 
+ + + + + + + + + + + +

+Additional Inherited Members

- Properties inherited from Tgstation.Server.Host.Components.Chat.Commands.ICommand
string Name [get]
 The text to invoke the command. May not be "?" or "help" (case-insensitive) More...
 
string HelpText [get]
 The help text to display when queires are made about the command More...
 
bool AdminOnly [get]
 If the command should only be available to Users who's User.Channel has Channel.IsAdminChannel set More...
 
+

Detailed Description

+

For displaying Api.Models.Internal.RevisionInformation

+ +

Definition at line 15 of file RevisionCommand.cs.

+

Constructor & Destructor Documentation

+ +

◆ RevisionCommand()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.RevisionCommand (IWatchdog watchdog,
IRepositoryManager repositoryManager,
Models.Instance instance 
)
+
+ +

Construct a RevisionCommand

+
Parameters
+ + + + +
watchdogThe value of watchdog
repositoryManagerThe value of repositoryManager
instanceThe value of instance
+
+
+ +

Definition at line 47 of file RevisionCommand.cs.

+
48  {
49  this.watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
50  this.repositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
51  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
52  }
readonly IRepositoryManager repositoryManager
The IRepositoryManager for the PullRequestsCommand
+
readonly IWatchdog watchdog
The IWatchdog for the PullRequestsCommand
+
readonly Models.Instance instance
The Models.Instance for the PullRequestsCommand
+
+

References Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.instance, Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.repositoryManager, and Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.watchdog.

+ +
+
+

Member Function Documentation

+ +

◆ Invoke()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task<string> Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.Invoke (string arguments,
User user,
CancellationToken cancellationToken 
)
+
+ +

Invoke the ICommand

+ +

Implements Tgstation.Server.Host.Components.Chat.Commands.ICommand.

+ +

Definition at line 55 of file RevisionCommand.cs.

+
56  {
57  string result;
58  if (arguments.Split(' ').Any(x => x.ToUpperInvariant() == "--REPO"))
59  using (var repo = await repositoryManager.LoadRepository(cancellationToken).ConfigureAwait(false))
60  {
61  if (repo == null)
62  return "Repository unavailable!";
63  result = repo.Head;
64  }
65  else
66  {
67  if (!watchdog.Running)
68  return "Server offline!";
69  result = watchdog.ActiveCompileJob?.RevisionInformation.CommitSha;
70  }
71 
72  return String.Format(CultureInfo.InvariantCulture, "^{0}", result);
73  }
readonly IRepositoryManager repositoryManager
The IRepositoryManager for the PullRequestsCommand
+
Models.CompileJob ActiveCompileJob
The CompileJob currently running on the server
Definition: IWatchdog.cs:27
+
readonly IWatchdog watchdog
The IWatchdog for the PullRequestsCommand
+
Task< IRepository > LoadRepository(CancellationToken cancellationToken)
Attempt to load the IRepository from the default location
+
bool Running
If the watchdog is running
Definition: IWatchdog.cs:17
+
+

References Tgstation.Server.Host.Components.Watchdog.IWatchdog.ActiveCompileJob, Tgstation.Server.Host.Components.Repository.IRepositoryManager.LoadRepository(), Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.repositoryManager, Tgstation.Server.Host.Components.Watchdog.IWatchdog.Running, and Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.watchdog.

+ +
+
+

Member Data Documentation

+ +

◆ AdminOnly

+ +
+
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.AdminOnly => false
+
+ +

+ +

Definition at line 24 of file RevisionCommand.cs.

+ +
+
+ +

◆ HelpText

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.HelpText => "Display live commit sha. Add --repo to view repository revision"
+
+ +

+ +

Definition at line 21 of file RevisionCommand.cs.

+ +
+
+ +

◆ instance

+ +
+
+ + + + + +
+ + + + +
readonly Models.Instance Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.instance
+
+private
+
+
+ +

◆ Name

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.Name => "revision"
+
+ +

+ +

Definition at line 18 of file RevisionCommand.cs.

+ +
+
+ +

◆ repositoryManager

+ +
+
+ + + + + +
+ + + + +
readonly IRepositoryManager Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.repositoryManager
+
+private
+
+
+ +

◆ watchdog

+ +
+
+ + + + + +
+ + + + +
readonly IWatchdog Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.watchdog
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.png new file mode 100644 index 0000000000000000000000000000000000000000..67d53e66f762c3e1b13d595314ec1ccc1bf6a98d GIT binary patch literal 1310 zcmeAS@N?(olHy`uVBq!ia0y~yV4MkL2XHV0$v>}um;fn>0G|-o|Ns93nJ?aaE$u%v z0muU50|ySUcHWT(ayd$Z{DK*Pia_A%sSqOu29~v+E{-7;jBn?@E&9BM&sF@k@!tR5 zc9|P_A8Bvnb$RX2b~BaCMW<7` zs)haPpNY;^Ss8fObZX9{LwV(IioO|o?4J6XRZ{cjwY&4q{c)C_WO7m0=xU|>a?9^i zFT1YXo&L;t>5f|Cqep9vWFG~ZWk1^QvCQ1|beegt$EAqxCv-MP7B4C-T79CYYkh3p z+Y`&me>{4;`)gX;KezMm8+kpYUfQoQPBuDgwkv1bD&w^a182pjZ{E4kJ8#+YTUTd- zU6!5lO=;WmS#vD+$se4#@K)2L_HXfLSXZ~7xoS6kiql=GRb@AMz85~x=w4lyWwxm- zICashi`SPI<~^DTH2$^j%za&6m*h_e>rDFc|AMK}`^}3~{?2RivFtMU44hOK2#iOk zNnd_*8BKZuVk5<=_{`kf+b(R&ovqLK$M_c$2ct#s1jd3D>(@IlKk#>CJFqY=fr+=l znpKivK9?SYoM;LIP%}eC$OOg@D-@U?1Ok;TZsKVGCJ=^xE+c9v_?kb_Q*&v6m!_pK zrvl3ZFLWD9CwTtkUlH|k-@abXZ`}-TxBfDeTK~Sz%eZW-W4d$M7iROcUk@hqlrpS7 z&bQip^9PIC2>Zv^ZPuT>W56=QEa5`z68<|8M&;M-%Wq7q6#Tcd=>BZu|DQ7U^*uLT z@%~ZbyB!;^PEalWQxLJe{6WFS^LJ|_&zAxd;QoDAuW0A>1?R}jU7pCl%jV4Crn}$r z9;`gfIJ0(osd6AF6;`rU&nXkl+q$|qDSgvf_M5JK8(B8L>gCz`aewjV`j>V4dC3erL<++siw91ifQtsx-`LE8XH2pkP z%_p96=5fsAn~ve7-_O)MbKJgh_Vc>QKJ67#&d&OwKk23K_GfRO-MV{6&A4QT!sat+ zXFIQ*T&rZPwXf{wR^{36zC)8@*zdXWH%yI;+t0r`V{s`>I@T=u>P$zb_m}=y%|6Q; zTV!mzB6Y4I^I_wvX9X^4>%D(JJ~Q)i^(Cx{ktx6Jw?)yEqoMYu(viDYPU=1zs5*PD z*(teKje$A-vQb90qO3oXE4x@9e7`a&bG7w>c&!st8kNs8{@L5azopr02^I#egFUf literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command-members.html new file mode 100644 index 0000000000..fc3979085c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command-members.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.Commands.VersionCommand Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.html new file mode 100644 index 0000000000..7ac4ac4970 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.html @@ -0,0 +1,298 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Commands.VersionCommand Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Commands.VersionCommand Class Reference
+
+
+ +

ICommand to return the IApplication.VersionString + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.Commands.VersionCommand:
+
+
+ + +Tgstation.Server.Host.Components.Chat.Commands.ICommand + +
+ + + + + + + + +

+Public Member Functions

 VersionCommand (IApplication application)
 Construct a VersionCommand More...
 
Task< string > Invoke (string arguments, User user, CancellationToken cancellationToken)
 Invoke the ICommand More...
 
+ + + + + + + +

+Public Attributes

string Name => "version"
 
string HelpText => "Displays the tgstation server version"
 
bool AdminOnly => false
 
+ + + + +

+Private Attributes

readonly IApplication application
 The IApplication for the VersionCommand More...
 
+ + + + + + + + + + + +

+Additional Inherited Members

- Properties inherited from Tgstation.Server.Host.Components.Chat.Commands.ICommand
string Name [get]
 The text to invoke the command. May not be "?" or "help" (case-insensitive) More...
 
string HelpText [get]
 The help text to display when queires are made about the command More...
 
bool AdminOnly [get]
 If the command should only be available to Users who's User.Channel has Channel.IsAdminChannel set More...
 
+

Detailed Description

+

ICommand to return the IApplication.VersionString

+ +

Definition at line 11 of file VersionCommand.cs.

+

Constructor & Destructor Documentation

+ +

◆ VersionCommand()

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.VersionCommand (IApplication application)
+
+ +

Construct a VersionCommand

+
Parameters
+ + +
applicationThe value of application
+
+
+ +

Definition at line 31 of file VersionCommand.cs.

+
32  {
33  this.application = application ?? throw new ArgumentNullException(nameof(application));
34  }
readonly IApplication application
The IApplication for the VersionCommand
+
+

References Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.application.

+ +
+
+

Member Function Documentation

+ +

◆ Invoke()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<string> Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.Invoke (string arguments,
User user,
CancellationToken cancellationToken 
)
+
+
+

Member Data Documentation

+ +

◆ AdminOnly

+ +
+
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.AdminOnly => false
+
+ +

+ +

Definition at line 20 of file VersionCommand.cs.

+ +
+
+ +

◆ application

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.application
+
+private
+
+ +

The IApplication for the VersionCommand

+ +

Definition at line 25 of file VersionCommand.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.VersionCommand().

+ +
+
+ +

◆ HelpText

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.HelpText => "Displays the tgstation server version"
+
+ +

+ +

Definition at line 17 of file VersionCommand.cs.

+ +
+
+ +

◆ Name

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.Name => "version"
+
+ +

+ +

Definition at line 14 of file VersionCommand.cs.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.png new file mode 100644 index 0000000000000000000000000000000000000000..2e74a56d0756991b25789f9b9a1931b947e2c1ed GIT binary patch literal 1303 zcmeAS@N?(olHy`uVBq!ia0y~yV4MnM2XHV0$!FIkb^$4g0G|-o|Ns93nJ?aaE$u%v z0muU50|ySUcHWT(ayd$Z{DK*Pia_A%sSqOu29{->E{-7;jBn>Y%=@Cn!`d#q^8No4 z<QZqH z4w|?m!)kHRtNALIzrA}M{e5<%y65}Q`GXe7dt<7IgKUk9gZy~SetXE1? z?{4KzwaGuc)Z3GOHsNmOt(LSEXSmkJ*S+1r z_x{~c_wv_keg2-Ecb8dulF6(3)!M~ccg5Ox%EH2{oHuW&n|H8}H@2v_Vv%!fWrp*l zWkAp9Mr2p5y!q(&r~Js3`U<5Pe~-rMSU*|!Wm}5=slAGu59d|%EOy(uTWWcj^7A~O zZ-)JM=N;SDnQo?%xy(G|SeK?}{Th#r9+&>F*ABUt>gf5)S5A767Y$S?_^b&Hi^r@VDADIv4#LIEryR% zd>9sKu4Hft4r1(B22|wh$*M35sKi87v>^ki0GLXsq2Oiwq98BLl|f#dDqId+3O(pH ztPITDDu3hlz1rH@m!-uS&usa{m~;Erbza7GUme4p>%K6X=l!Y?c5m*VJ9E2{R6z&> z+uxq}&ozEe+Y}FMJ^7P=`U__B@RbY|w&i94l^6f+%(^dK{Qp(P-nQGK8_GA#%r?Ku z^OJY0{H)UR`*%h>U$<{h`t4|D8KzCa>vv=>zhQaHFL`_Zv$foRr(HklKi7A~8oQju z8_bOtI&L|*ZT`3ZT=&~Y4lc1j^K8+v9qh%|W=p<$T>m`nuhERMXPOT}4{SR*Y4$n3 z6>r48@8yZ!BF?C>IOlrkI%e@Y_TuU8@{>cdW9A1mKDu2{yelW7VdlB8yTxTrM{Q3P zYiXwhCvVSrE>|SKyZV{=N}h^z$u-^om8M?YaysGdfj@2h`e%jH)kFM@Bg$vpWj0@$ zsYbJ69h*NQu|AdECxy)~mJmE{u$_Kc8^CO>d{A&5C^< zGjxBI*j6U?&pEqdO=(8$6w~M$|67|b1-xCg^xH$7x6bdp^1Z)h-IO+JEI*tqV|wcD zRg0}smgUKlx+>p%Guh?-GUnW)s#j-%CAHNK$ZH4bFzjDE&nx~UbP0l+XkKTf=8< literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context-members.html new file mode 100644 index 0000000000..d527bcd1aa --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context-members.html @@ -0,0 +1,98 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.JsonTrackingContext Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html new file mode 100644 index 0000000000..37e88fe15f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html @@ -0,0 +1,572 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.JsonTrackingContext Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.JsonTrackingContext Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.JsonTrackingContext:
+
+
+ + +Tgstation.Server.Host.Components.Chat.IJsonTrackingContext +IDisposable + +
+ + + + + + + + + + + + + +

+Public Member Functions

 JsonTrackingContext (IIOManager ioManager, ICustomCommandHandler customCommandHandler, ILogger< JsonTrackingContext > logger, Action onDispose, string commandsPath, string channelsPath)
 Construct a JsonTrackingContext More...
 
void Dispose ()
 
async Task< IReadOnlyList< CustomCommand > > GetCustomCommands (CancellationToken cancellationToken)
 Read CustomCommands from the IJsonTrackingContext More...
 
async Task SetChannels (IEnumerable< Channel > channels, CancellationToken cancellationToken)
 Writes information about connected channels to the IJsonTrackingContext More...
 
+ + + + + + + +

+Properties

bool? Active [get, set]
 
- Properties inherited from Tgstation.Server.Host.Components.Chat.IJsonTrackingContext
bool Active [get, set]
 If the IJsonTrackingContext should be used for GetCustomCommands(CancellationToken) More...
 
+ + + + + + + + + + + + + + + + + +

+Private Attributes

readonly IIOManager ioManager
 
readonly ICustomCommandHandler customCommandHandler
 
readonly ILogger< JsonTrackingContextlogger
 
readonly Action onDispose
 
readonly string commandsPath
 
readonly string channelsPath
 
readonly SemaphoreSlim channelsSemaphore
 
bool active
 
+

Detailed Description

+
+

Definition at line 16 of file JsonTrackingContext.cs.

+

Constructor & Destructor Documentation

+ +

◆ JsonTrackingContext()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Chat.JsonTrackingContext.JsonTrackingContext (IIOManager ioManager,
ICustomCommandHandler customCommandHandler,
ILogger< JsonTrackingContextlogger,
Action onDispose,
string commandsPath,
string channelsPath 
)
+
+ +

Construct a JsonTrackingContext

+
Parameters
+ + + + + + + +
ioManagerThe value of ioManager
customCommandHandlerThe value of customCommandHandler
loggerThe value of logger
onDisposeThe value of onDispose
commandsPathThe value of commandsPath
channelsPathThe value of channelsPath
+
+
+ +

Definition at line 50 of file JsonTrackingContext.cs.

+
51  {
52  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
53  this.customCommandHandler = customCommandHandler ?? throw new ArgumentNullException(nameof(customCommandHandler));
54  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
55  this.onDispose = onDispose ?? throw new ArgumentNullException(nameof(onDispose));
56  this.commandsPath = commandsPath ?? throw new ArgumentNullException(nameof(commandsPath));
57  this.channelsPath = channelsPath ?? throw new ArgumentNullException(nameof(channelsPath));
58 
59  channelsSemaphore = new SemaphoreSlim(1);
60  active = false;
61 
62  logger.LogTrace("Created tracking context for {0} and {1}", commandsPath, channelsPath);
63  }
+ + + + + + + +
+

References Tgstation.Server.Host.Components.Chat.JsonTrackingContext.active, Tgstation.Server.Host.Components.Chat.JsonTrackingContext.channelsPath, Tgstation.Server.Host.Components.Chat.JsonTrackingContext.channelsSemaphore, Tgstation.Server.Host.Components.Chat.JsonTrackingContext.commandsPath, Tgstation.Server.Host.Components.Chat.JsonTrackingContext.customCommandHandler, Tgstation.Server.Host.Components.Chat.JsonTrackingContext.ioManager, Tgstation.Server.Host.Components.Chat.JsonTrackingContext.logger, and Tgstation.Server.Host.Components.Chat.JsonTrackingContext.onDispose.

+ +
+
+

Member Function Documentation

+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Chat.JsonTrackingContext.Dispose ()
+
+
+ +

◆ GetCustomCommands()

+ +
+
+ + + + + + + + +
async Task<IReadOnlyList<CustomCommand> > Tgstation.Server.Host.Components.Chat.JsonTrackingContext.GetCustomCommands (CancellationToken cancellationToken)
+
+ +

Read CustomCommands from the IJsonTrackingContext

+ +

Implements Tgstation.Server.Host.Components.Chat.IJsonTrackingContext.

+ +

Definition at line 74 of file JsonTrackingContext.cs.

+
75  {
76  try
77  {
78  if (Active && await ioManager.FileExists(commandsPath, cancellationToken).ConfigureAwait(false))
79  {
80  var resultBytes = await ioManager.ReadAllBytes(commandsPath, cancellationToken).ConfigureAwait(false);
81  var resultJson = Encoding.UTF8.GetString(resultBytes);
82  logger.LogTrace("Read commands JSON: {0}", resultJson);
83  var result = JsonConvert.DeserializeObject<List<CustomCommand>>(resultJson, new JsonSerializerSettings
84  {
85  ContractResolver = new DefaultContractResolver
86  {
87  NamingStrategy = new SnakeCaseNamingStrategy()
88  }
89  });
90  foreach (var I in result)
91  I.SetHandler(customCommandHandler);
92  return result;
93  }
94  }
95  catch (OperationCanceledException)
96  {
97  throw;
98  }
99  catch (Exception e)
100  {
101  logger.LogWarning("Error retrieving custom commands! Exception: {0}", e);
102  }
103 
104  return new List<CustomCommand>();
105  }
+ +
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists
+ + +
Task< byte[]> ReadAllBytes(string path, CancellationToken cancellationToken)
Returns all the contents of a file at path as a byte array
+ +
+

References Tgstation.Server.Host.Components.Chat.JsonTrackingContext.Active, Tgstation.Server.Host.Components.Chat.JsonTrackingContext.commandsPath, Tgstation.Server.Host.Components.Chat.JsonTrackingContext.customCommandHandler, Tgstation.Server.Host.IO.IIOManager.FileExists(), Tgstation.Server.Host.Components.Chat.JsonTrackingContext.ioManager, Tgstation.Server.Host.Components.Chat.JsonTrackingContext.logger, and Tgstation.Server.Host.IO.IIOManager.ReadAllBytes().

+ +
+
+ +

◆ SetChannels()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Chat.JsonTrackingContext.SetChannels (IEnumerable< Channelchannels,
CancellationToken cancellationToken 
)
+
+ +

Writes information about connected channels to the IJsonTrackingContext

+ +

Implements Tgstation.Server.Host.Components.Chat.IJsonTrackingContext.

+ +

Definition at line 108 of file JsonTrackingContext.cs.

+
109  {
110  using (await SemaphoreSlimContext.Lock(channelsSemaphore, cancellationToken).ConfigureAwait(false))
111  {
112  var json = JsonConvert.SerializeObject(channels, new JsonSerializerSettings
113  {
114  ContractResolver = new CamelCasePropertyNamesContractResolver()
115  });
116  logger.LogTrace("Writing channels JSON: {0}", json);
117  await ioManager.WriteAllBytes(channelsPath, Encoding.UTF8.GetBytes(json), cancellationToken).ConfigureAwait(false);
118  }
119  }
+
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+ + + +
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+

References Tgstation.Server.Host.Components.Chat.JsonTrackingContext.channelsPath, Tgstation.Server.Host.Components.Chat.JsonTrackingContext.channelsSemaphore, Tgstation.Server.Host.Components.Chat.JsonTrackingContext.ioManager, Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), Tgstation.Server.Host.Components.Chat.JsonTrackingContext.logger, and Tgstation.Server.Host.IO.IIOManager.WriteAllBytes().

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.TrackJsons().

+ +
+
+

Member Data Documentation

+ +

◆ active

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.JsonTrackingContext.active
+
+private
+
+
+ +

◆ channelsPath

+ +
+
+ + + + + +
+ + + + +
readonly string Tgstation.Server.Host.Components.Chat.JsonTrackingContext.channelsPath
+
+private
+
+
+ +

◆ channelsSemaphore

+ +
+
+ + + + + +
+ + + + +
readonly SemaphoreSlim Tgstation.Server.Host.Components.Chat.JsonTrackingContext.channelsSemaphore
+
+private
+
+
+ +

◆ commandsPath

+ +
+
+ + + + + +
+ + + + +
readonly string Tgstation.Server.Host.Components.Chat.JsonTrackingContext.commandsPath
+
+private
+
+
+ +

◆ customCommandHandler

+ +
+
+ + + + + +
+ + + + +
readonly ICustomCommandHandler Tgstation.Server.Host.Components.Chat.JsonTrackingContext.customCommandHandler
+
+private
+
+
+ +

◆ ioManager

+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.Chat.JsonTrackingContext.ioManager
+
+private
+
+
+ +

◆ logger

+ + + +

◆ onDispose

+ +
+
+ + + + + +
+ + + + +
readonly Action Tgstation.Server.Host.Components.Chat.JsonTrackingContext.onDispose
+
+private
+
+
+

Property Documentation

+ +

◆ Active

+ +
+
+ + + + + +
+ + + + +
bool? Tgstation.Server.Host.Components.Chat.JsonTrackingContext.Active
+
+getset
+
+ +

+ +

Definition at line 20 of file JsonTrackingContext.cs.

+
20  {
21  get => active;
22  set
23  {
24  active = true;
25  logger.LogDebug("Tracking {0}activated", !active ? "de" : String.Empty);
26  }
27  }
+ +
+

Referenced by Tgstation.Server.Host.Components.Chat.JsonTrackingContext.GetCustomCommands().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.png new file mode 100644 index 0000000000000000000000000000000000000000..9da0a72513e4cf96bebcb6a704a8395fbee01e6f GIT binary patch literal 1708 zcmcIlc~Fx_6#pVZks5S_Vg%$+6ap$9K{TR*oQa$v;Sd8VXlf9_ga8Rh0JSKJiD?lz zf^vwEKq!RZfk*@~AOtM%HHw^Sr346aL=g(IK%as~AEZ#%adSmm~iPy$*l}>_eBDyAQ zspAg)#Z{qKJg;nfWKdwXn==!9SY(zp$lK7e)PFN(<2^EF`%p2jvGAfA1)V$Wc6z5I!9|27>;P^`Rwt>wKYiFHNj)S) zp)Usf;YS`fR@Z98?HA~aHCMxrr0_MiJ|?K$805j+qd)*UE}#R^mqF&G5c$8E8%VsX z+g!|_A_m|-977DlT5yO1?ZOF5;a@k?`5ZW#kox9kQ8CymxjS_CkH#6cS^2I9>D*T3 zv>HaljG6Y$S zLWVZYf+D3x1ZMAy((!H)Qo(d_8R-ssoJ2)r9P8qGh5E%FeOSWi5fWf)UWa_g)&Uo& z*8KL%%md1kur<0OWsy%EdUj6YrPX}gZ(=|!mB$Jz2&@inQzcU>&}ycY2lEwrl@=x> z5ySBNO_yZqVf&xslnjT1paVHb=S5-_r8<)pNJFQ0x{X*!N%+02)Q>`=7kzF@zmT=9 z$o@Pxf7ivWqfrPOUn!C0fGsZ-u4vR&HzTBU=36I@mW10YOFY1GpS{MLIWv-8q#nj2 zes`6RGVU#=Glb#=)>om9(-`Z`MzniTd}ioLg1uSGwIXKPmk0kluk7#=M4?XTl}L@j z>DeVwKz}-4Ewj%KWFUXWc>5^MmJCHq@E|yMT$N zud*Rco`78<`m9i8UfT*-*%y7nhz95OX~-vb`p?r&tqb_((YN$^aj^OG8sR|pd!ATG*{HTIL%g^mt|$++O<5uL7-NyH42J zcwL(-zCV}simy9(?6@dACy`F;B2NwU)IT)7pCPWTJM8o$GjbIZ2Z_@lxhGqjPQv~X z7~;WyQ0AgUg+*F;UDK=1raw3YM?D>oH8hd2Jh+ubOIMpr`+nLF_7U-*$Pvy=tL^hO zX{*j8+Vr~rBB{%xe5@>qmUdf#)Lh34;V~8En9F@ZF20;G9Buv9(U+y3K|O{pw_ik4 z(*ygQrwZgJJN(qcE;21m%z3q`!TwzT#awyUlI<4cQA{C&_Fl=lsmpFH>#t8Xfbqcy zJZlA4y^<-(voMi~808OwBn3&ip#03OO3UEY>;?N)Dcz5jRAb{aPO=7FP$ZZl9zG=VH^Yt1lJ9W;4I4b`6d+ hP19Yb=ii@LR5M_4OtC?A%b~9Yz&Lw42@V`d`4ba-GAjT8 literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory-members.html new file mode 100644 index 0000000000..8bfe2a51a5 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory-members.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.ProviderFactory Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html new file mode 100644 index 0000000000..b5910903e3 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html @@ -0,0 +1,299 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.ProviderFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.ProviderFactory Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.ProviderFactory:
+
+
+ + +Tgstation.Server.Host.Components.Chat.IProviderFactory + +
+ + + + + + + + + + + +

+Public Member Functions

 ProviderFactory (IApplication application, IAsyncDelayer asyncDelayer, ILoggerFactory loggerFactory)
 Construct a ProviderFactory More...
 
IProvider CreateProvider (Api.Models.Internal.ChatBot settings)
 
- Public Member Functions inherited from Tgstation.Server.Host.Components.Chat.IProviderFactory
IProvider CreateProvider (ChatBot settings)
 Create a IProvider More...
 
+ + + + + + + + + + +

+Private Attributes

readonly IApplication application
 The IApplication for the ProviderFactory More...
 
readonly IAsyncDelayer asyncDelayer
 The IAsyncDelayer for the ProviderFactory More...
 
readonly ILoggerFactory loggerFactory
 The ILoggerFactory for the ProviderFactory More...
 
+

Detailed Description

+
+

Definition at line 11 of file ProviderFactory.cs.

+

Constructor & Destructor Documentation

+ +

◆ ProviderFactory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Chat.ProviderFactory.ProviderFactory (IApplication application,
IAsyncDelayer asyncDelayer,
ILoggerFactory loggerFactory 
)
+
+ +

Construct a ProviderFactory

+
Parameters
+ + + + +
applicationThe value of application
asyncDelayerThe value of asyncDelayer
loggerFactoryThe value of loggerFactory
+
+
+ +

Definition at line 34 of file ProviderFactory.cs.

+
35  {
36  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
37  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
38  this.application = application ?? throw new ArgumentNullException(nameof(application));
39  }
readonly IApplication application
The IApplication for the ProviderFactory
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the ProviderFactory
+
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the ProviderFactory
+
+

References Tgstation.Server.Host.Components.Chat.ProviderFactory.application, Tgstation.Server.Host.Components.Chat.ProviderFactory.asyncDelayer, and Tgstation.Server.Host.Components.Chat.ProviderFactory.loggerFactory.

+ +
+
+

Member Function Documentation

+ +

◆ CreateProvider()

+ +
+
+ + + + + + + + +
IProvider Tgstation.Server.Host.Components.Chat.ProviderFactory.CreateProvider (Api.Models.Internal.ChatBot settings)
+
+ +

+ +

Definition at line 42 of file ProviderFactory.cs.

+
43  {
44  if (settings == null)
45  throw new ArgumentNullException(nameof(settings));
46  var builder = settings.CreateConnectionStringBuilder();
47  if (builder == null || !builder.Valid)
48  throw new InvalidOperationException("Invalid ChatConnectionStringBuilder!");
49  switch (settings.Provider)
50  {
51  case ChatProvider.Irc:
52  var ircBuilder = (IrcConnectionStringBuilder)builder;
53  return new IrcProvider(application, asyncDelayer, loggerFactory.CreateLogger<IrcProvider>(), ircBuilder.Address, ircBuilder.Port.Value, ircBuilder.Nickname, ircBuilder.Password, ircBuilder.PasswordType, ircBuilder.UseSsl.Value);
54  case ChatProvider.Discord:
55  var discordBuilder = (DiscordConnectionStringBuilder)builder;
56  return new DiscordProvider(loggerFactory.CreateLogger<DiscordProvider>(), discordBuilder.BotToken);
57  default:
58  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid ChatProvider: {0}", settings.Provider));
59  }
60  }
readonly IApplication application
The IApplication for the ProviderFactory
+ +
ChatConnectionStringBuilder for ChatProvider.Discord
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the ProviderFactory
+ +
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the ProviderFactory
+
ChatConnectionStringBuilder for ChatProvider.Irc
+
ChatProvider
Represents a chat service provider
Definition: ChatProvider.cs:6
+
+

References Tgstation.Server.Host.Components.Chat.ProviderFactory.application, Tgstation.Server.Host.Components.Chat.ProviderFactory.asyncDelayer, and Tgstation.Server.Host.Components.Chat.ProviderFactory.loggerFactory.

+ +
+
+

Member Data Documentation

+ +

◆ application

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Components.Chat.ProviderFactory.application
+
+private
+
+
+ +

◆ asyncDelayer

+ +
+
+ + + + + +
+ + + + +
readonly IAsyncDelayer Tgstation.Server.Host.Components.Chat.ProviderFactory.asyncDelayer
+
+private
+
+
+ +

◆ loggerFactory

+ +
+
+ + + + + +
+ + + + +
readonly ILoggerFactory Tgstation.Server.Host.Components.Chat.ProviderFactory.loggerFactory
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..466108ae20ae5b87d578da55214c28832af687de GIT binary patch literal 1279 zcmeAS@N?(olHy`uVBq!ia0y~yUbOI+`kxm1dgx%Se$q5?a7&66n1sj<}1(Gee+a6PrZ^=YgLcHZrjy6%%pZHSSb}0 zo>{|lSxxhVU+mI-1%i*`cJBEVIYs^PE#bGJg?y!j(p7hYtvkEt37O8ZYSmt(=QsKJ zyNi$d_{8nitz^$?y>|YyabJ~$H+$W3ZSRK>?>g?K)hY-E9iBcld(rmD|6lszo?mvI z^snPZ&Bg1}4(V3y?pxPs71X_E|LVmT1J-1n-~8{^1#XwO;p>3nZB|wOSHAt)JoTH| z!|27HT9?1CSt{}7&TIF#-`jXre5mM4{!*2FLho*G%cShXWq(h7t(yPU-PIuD&^+6V zJ9l|s(toXgRLOJtE)}WWeJX#K*|omtDBiW$mS5#1{|o1iSq9;e`ktzuRqn1KlZ--L zR5gR)4E{y8x8*Jc##RDzxv}125SV&&bt)}Q~F3VnB}Pv9s>KA5+QVcPYz(@$G}wYzw{vqt{o{{?sIe_#Il<9zbw z@HMwzn;)_HI&)AO2T4bGPyC)5ZFE_4B&#f0*?` zaIUNgB)MsTliRl#i()$@yNB(Jw+tnVtG)4f`NYrXXhHkZ55^mhE_th$0{ec6H^k(1o( z?aFsDY#X@J#I8T*ym))feDB%}1LKpdKxTcF`})r>mHgw?t?qxi+2j09b6>Fgbr;!{ zuGj8gy_lgPw(WUjeeMg%z~7y#7iTY8*k`AjRsHv-SM}@*7Dv z&TJtSHpdOC_L` + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider, including all inherited members.

+ + + + + + + + + + + + + + + + + + + +
BotMentionTgstation.Server.Host.Components.Chat.Providers.DiscordProvider
botTokenTgstation.Server.Host.Components.Chat.Providers.DiscordProviderprivate
clientTgstation.Server.Host.Components.Chat.Providers.DiscordProviderprivate
Client_MessageReceived(SocketMessage e)Tgstation.Server.Host.Components.Chat.Providers.DiscordProviderprivate
Connect(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.DiscordProvidervirtual
ConnectedTgstation.Server.Host.Components.Chat.Providers.DiscordProvider
Disconnect(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.DiscordProvidervirtual
DiscordProvider(ILogger< DiscordProvider > logger, string botToken)Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider
Dispose()Tgstation.Server.Host.Components.Chat.Providers.DiscordProvidervirtual
EnqueueMessage(Message message)Tgstation.Server.Host.Components.Chat.Providers.Providerprotected
loggerTgstation.Server.Host.Components.Chat.Providers.DiscordProviderprivate
MapChannels(IEnumerable< ChatChannel > channels, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.DiscordProvidervirtual
Tgstation::Server::Host::Components::Chat::Providers::IProvider.MapChannels(IEnumerable< Api.Models.ChatChannel > channels, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.IProvider
mappedChannelsTgstation.Server.Host.Components.Chat.Providers.DiscordProviderprivate
NextMessage(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.Provider
NormalizeMention(string fromDiscord)Tgstation.Server.Host.Components.Chat.Providers.DiscordProviderprivatestatic
Provider()Tgstation.Server.Host.Components.Chat.Providers.Providerprotected
SendMessage(ulong channelId, string message, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.DiscordProvidervirtual
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html new file mode 100644 index 0000000000..10b508f80c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html @@ -0,0 +1,713 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider Class Reference
+
+
+ +

IProvider for the Discord app + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider:
+
+
+ + +Tgstation.Server.Host.Components.Chat.Providers.Provider +Tgstation.Server.Host.Components.Chat.Providers.IProvider +IDisposable + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 DiscordProvider (ILogger< DiscordProvider > logger, string botToken)
 Construct a DiscordProvider More...
 
override void Dispose ()
 
override async Task< bool > Connect (CancellationToken cancellationToken)
 Attempt to connect the IProvider More...
 
override async Task Disconnect (CancellationToken cancellationToken)
 Gracefully disconnects the provider. Implies a call to IDisposable.Dispose More...
 
override Task< IReadOnlyList< Channel > > MapChannels (IEnumerable< ChatChannel > channels, CancellationToken cancellationToken)
 
override async Task SendMessage (ulong channelId, string message, CancellationToken cancellationToken)
 Send a message to the IProvider More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Components.Chat.Providers.Provider
async Task< MessageNextMessage (CancellationToken cancellationToken)
 Get a Task<TResult> resulting in the next Message the IProvider recieves or null on a disconnect More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Components.Chat.Providers.IProvider
Task< IReadOnlyList< Channel > > MapChannels (IEnumerable< Api.Models.ChatChannel > channels, CancellationToken cancellationToken)
 Get the Channels for given channels More...
 
+ + + +

+Public Attributes

override bool Connected => client.ConnectionState == ConnectionState.Connected
 
+ + + + + + + + + + + + + + + +

+Properties

override string BotMention [get]
 
- Properties inherited from Tgstation.Server.Host.Components.Chat.Providers.Provider
abstract bool Connected [get]
 
abstract string BotMention [get]
 
- Properties inherited from Tgstation.Server.Host.Components.Chat.Providers.IProvider
bool Connected [get]
 If the IProvider More...
 
string BotMention [get]
 The string that indicates the IProvider was mentioned More...
 
+ + + + +

+Private Member Functions

async Task Client_MessageReceived (SocketMessage e)
 Handle a message recieved from Discord More...
 
+ + + + +

+Static Private Member Functions

static string NormalizeMention (string fromDiscord)
 Normalize a discord mention string More...
 
+ + + + + + + + + + + + + +

+Private Attributes

readonly ILogger< DiscordProviderlogger
 The ILogger for the DiscordProvider More...
 
readonly DiscordSocketClient client
 The DiscordSocketClient for the DiscordProvider More...
 
readonly string botToken
 The token used for connecting to discord More...
 
readonly List< ulong > mappedChannels
 List<T> of mapped ITextChannel IEntity<TId>.Ids More...
 
+ + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from Tgstation.Server.Host.Components.Chat.Providers.Provider
 Provider ()
 Construct a Provider More...
 
void EnqueueMessage (Message message)
 Queues a message for NextMessage(CancellationToken) More...
 
+

Detailed Description

+

IProvider for the Discord app

+ +

Definition at line 16 of file DiscordProvider.cs.

+

Constructor & Destructor Documentation

+ +

◆ DiscordProvider()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.DiscordProvider (ILogger< DiscordProviderlogger,
string botToken 
)
+
+ +

Construct a DiscordProvider

+
Parameters
+ + + +
loggerThe value of logger
botTokenThe value of botToken
+
+
+ +

Definition at line 64 of file DiscordProvider.cs.

+
65  {
66  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
67  this.botToken = botToken ?? throw new ArgumentNullException(nameof(botToken));
68  client = new DiscordSocketClient();
69  client.MessageReceived += Client_MessageReceived;
70  mappedChannels = new List<ulong>();
71  logger.LogTrace("Created.");
72  }
async Task Client_MessageReceived(SocketMessage e)
Handle a message recieved from Discord
+
readonly ILogger< DiscordProvider > logger
The ILogger for the DiscordProvider
+
readonly string botToken
The token used for connecting to discord
+
readonly DiscordSocketClient client
The DiscordSocketClient for the DiscordProvider
+
readonly List< ulong > mappedChannels
List<T> of mapped ITextChannel IEntity<TId>.Ids
+
+

References Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.botToken, Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.client, Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Client_MessageReceived(), Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.logger, and Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.mappedChannels.

+ +
+
+

Member Function Documentation

+ +

◆ Client_MessageReceived()

+ +
+
+ + + + + +
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Client_MessageReceived (SocketMessage e)
+
+private
+
+ +

Handle a message recieved from Discord

+
Parameters
+ + +
eThe SocketMessage
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 86 of file DiscordProvider.cs.

+
87  {
88  if (e.Author.Id == client.CurrentUser.Id)
89  return;
90 
91  var pm = e.Channel is IPrivateChannel;
92 
93  if (!pm && !mappedChannels.Contains(e.Channel.Id))
94  {
95  var mentionedUs = e.MentionedUsers.Any(x => x.Id == client.CurrentUser.Id);
96  if (mentionedUs)
97  {
98  logger.LogTrace("Ignoring mention from {0} ({1}) by {2} ({3}). Channel not mapped!", e.Channel.Id, e.Channel.Name, e.Author.Id, e.Author.Username);
99  await SendMessage(e.Channel.Id, "I do not respond to this channel!", default).ConfigureAwait(false);
100  }
101 
102  return;
103  }
104 
105  var result = new Message
106  {
107  Content = e.Content,
108  User = new User
109  {
110  RealId = e.Author.Id,
111  Channel = new Channel
112  {
113  RealId = e.Channel.Id,
114  IsPrivateChannel = pm,
115  ConnectionName = pm ? e.Author.Username : (e.Channel as ITextChannel)?.Guild.Name ?? "UNKNOWN",
116  FriendlyName = e.Channel.Name
117 
118  // isAdmin and Tag populated by manager
119  },
120  FriendlyName = e.Author.Username,
121  Mention = NormalizeMention(e.Author.Mention)
122  }
123  };
124  EnqueueMessage(result);
125  }
override async Task SendMessage(ulong channelId, string message, CancellationToken cancellationToken)
Send a message to the IProvider
+
readonly ILogger< DiscordProvider > logger
The ILogger for the DiscordProvider
+
static string NormalizeMention(string fromDiscord)
Normalize a discord mention string
+
readonly DiscordSocketClient client
The DiscordSocketClient for the DiscordProvider
+
readonly List< ulong > mappedChannels
List<T> of mapped ITextChannel IEntity<TId>.Ids
+ +
long Id
The ID of the User
Definition: User.cs:15
+
void EnqueueMessage(Message message)
Queues a message for NextMessage(CancellationToken)
Definition: Provider.cs:40
+
+

References Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.client, Tgstation.Server.Host.Components.Chat.Providers.Message.Content, Tgstation.Server.Host.Components.Chat.Providers.Provider.EnqueueMessage(), Tgstation.Server.Host.Components.Chat.Channel.Id, Tgstation.Server.Host.Components.Chat.User.Id, Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.logger, Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.mappedChannels, Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.NormalizeMention(), and Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.SendMessage().

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.DiscordProvider().

+ +
+
+ +

◆ Connect()

+ +
+
+ + + + + +
+ + + + + + + + +
override async Task<bool> Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Connect (CancellationToken cancellationToken)
+
+virtual
+
+ +

Attempt to connect the IProvider

+ +

Implements Tgstation.Server.Host.Components.Chat.Providers.Provider.

+ +

Definition at line 128 of file DiscordProvider.cs.

+
129  {
130  logger.LogTrace("Connecting...");
131  if (Connected)
132  {
133  logger.LogTrace("Already connected not doing connection attempt!");
134  return true;
135  }
136 
137  try
138  {
139  await client.LoginAsync(TokenType.Bot, botToken, true).ConfigureAwait(false);
140 
141  logger.LogTrace("Logged in.");
142  cancellationToken.ThrowIfCancellationRequested();
143 
144  await client.StartAsync().ConfigureAwait(false);
145 
146  logger.LogTrace("Started.");
147 
148  var channelsAvailable = new TaskCompletionSource<object>();
149  client.Ready += () =>
150  {
151  channelsAvailable.TrySetResult(null);
152  return Task.CompletedTask;
153  };
154  using (cancellationToken.Register(() => channelsAvailable.SetCanceled()))
155  await channelsAvailable.Task.ConfigureAwait(false);
156  logger.LogDebug("Connection established!");
157  }
158  catch (OperationCanceledException)
159  {
160  throw;
161  }
162  catch (Exception e)
163  {
164  logger.LogWarning("Error connecting to Discord: {0}", e);
165  return false;
166  }
167 
168  return true;
169  }
+
readonly ILogger< DiscordProvider > logger
The ILogger for the DiscordProvider
+
readonly string botToken
The token used for connecting to discord
+
readonly DiscordSocketClient client
The DiscordSocketClient for the DiscordProvider
+
+

References Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.botToken, Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.client, Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Connected, and Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.logger.

+ +
+
+ +

◆ Disconnect()

+ +
+
+ + + + + +
+ + + + + + + + +
override async Task Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Disconnect (CancellationToken cancellationToken)
+
+virtual
+
+ +

Gracefully disconnects the provider. Implies a call to IDisposable.Dispose

+ +

Implements Tgstation.Server.Host.Components.Chat.Providers.Provider.

+ +

Definition at line 172 of file DiscordProvider.cs.

+
173  {
174  logger.LogTrace("Disconnecting...");
175  if (!Connected)
176  {
177  logger.LogTrace("Already disconnected not doing disconnection attempt!");
178  return;
179  }
180 
181  try
182  {
183  await client.StopAsync().ConfigureAwait(false);
184  logger.LogTrace("Stopped.");
185  cancellationToken.ThrowIfCancellationRequested();
186  await client.LogoutAsync().ConfigureAwait(false);
187  logger.LogDebug("Disconnected!");
188  }
189  catch (OperationCanceledException)
190  {
191  throw;
192  }
193  catch (Exception e)
194  {
195  logger.LogWarning("Error disconnecting from discord: {0}", e);
196  }
197  }
+
readonly ILogger< DiscordProvider > logger
The ILogger for the DiscordProvider
+
readonly DiscordSocketClient client
The DiscordSocketClient for the DiscordProvider
+
+

References Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.client, Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Connected, and Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.logger.

+ +
+
+ +

◆ Dispose()

+ +
+
+ + + + + +
+ + + + + + + +
override void Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Dispose ()
+
+virtual
+
+ +

+ +

Implements Tgstation.Server.Host.Components.Chat.Providers.Provider.

+ +

Definition at line 75 of file DiscordProvider.cs.

+
76  {
77  logger.LogTrace("Disposed.");
78  client.Dispose();
79  }
readonly ILogger< DiscordProvider > logger
The ILogger for the DiscordProvider
+
readonly DiscordSocketClient client
The DiscordSocketClient for the DiscordProvider
+
+

References Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.client, and Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.logger.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider.TestConstructionAndDisposal().

+ +
+
+ +

◆ MapChannels()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
override Task<IReadOnlyList<Channel> > Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.MapChannels (IEnumerable< ChatChannelchannels,
CancellationToken cancellationToken 
)
+
+virtual
+
+ +

+ +

Implements Tgstation.Server.Host.Components.Chat.Providers.Provider.

+ +

Definition at line 200 of file DiscordProvider.cs.

+
201  {
202  if (channels == null)
203  throw new ArgumentNullException(nameof(channels));
204 
205  if (!Connected)
206  throw new InvalidOperationException("Provider not connected!");
207 
208  Channel GetModelChannelFromDBChannel(ChatChannel channelFromDB)
209  {
210  if (!channelFromDB.DiscordChannelId.HasValue)
211  throw new InvalidOperationException("ChatChannel missing DiscordChannelId!");
212 
213  var channelId = channelFromDB.DiscordChannelId.Value;
214  var discordChannel = client.GetChannel(channelId);
215  if (discordChannel is ITextChannel textChannel)
216  {
217  var channelModel = new Channel
218  {
219  RealId = discordChannel.Id,
220  IsAdminChannel = channelFromDB.IsAdminChannel == true,
221  ConnectionName = textChannel.Guild.Name,
222  FriendlyName = textChannel.Name,
223  IsPrivateChannel = false,
224  Tag = channelFromDB.Tag
225  };
226  logger.LogTrace("Mapped channel {0}: {1}", channelModel.RealId, channelModel.FriendlyName);
227  return channelModel;
228  }
229 
230  logger.LogWarning("Cound not map channel {0}! Incorrect type: {1}", channelId, discordChannel.GetType());
231  return null;
232  }
233 
234  var enumerator = channels.Select(x => GetModelChannelFromDBChannel(x)).Where(x => x != null).ToList();
235 
236  lock (this)
237  {
238  mappedChannels.Clear();
239  mappedChannels.AddRange(enumerator.Select(x => x.RealId));
240  }
241 
242  return Task.FromResult<IReadOnlyList<Channel>>(enumerator);
243  }
+ +
readonly ILogger< DiscordProvider > logger
The ILogger for the DiscordProvider
+
readonly DiscordSocketClient client
The DiscordSocketClient for the DiscordProvider
+
string Tag
A custom tag users can define to group channels together
Definition: ChatChannel.cs:41
+
bool? IsAdminChannel
If the ChatChannel is an admin channel
Definition: ChatChannel.cs:24
+
ulong? DiscordChannelId
The Discord channel ID
Definition: ChatChannel.cs:18
+
readonly List< ulong > mappedChannels
List<T> of mapped ITextChannel IEntity<TId>.Ids
+
+

References Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.client, Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Connected, Tgstation.Server.Api.Models.ChatChannel.DiscordChannelId, Tgstation.Server.Host.Components.Chat.Channel.Id, Tgstation.Server.Api.Models.ChatChannel.IsAdminChannel, Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.logger, Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.mappedChannels, and Tgstation.Server.Api.Models.ChatChannel.Tag.

+ +
+
+ +

◆ NormalizeMention()

+ +
+
+ + + + + +
+ + + + + + + + +
static string Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.NormalizeMention (string fromDiscord)
+
+staticprivate
+
+ +

Normalize a discord mention string

+
Parameters
+ + +
fromDiscordThe mention string provided by the Discord library
+
+
+
Returns
The normalized mention string
+ +

Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Client_MessageReceived().

+ +
+
+ +

◆ SendMessage()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
override async Task Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.SendMessage (ulong channelId,
string message,
CancellationToken cancellationToken 
)
+
+virtual
+
+ +

Send a message to the IProvider

+ +

Implements Tgstation.Server.Host.Components.Chat.Providers.Provider.

+ +

Definition at line 246 of file DiscordProvider.cs.

+
247  {
248  try
249  {
250  var channel = client.GetChannel(channelId) as IMessageChannel;
251  await (channel?.SendMessageAsync(message, false, null, new RequestOptions
252  {
253  CancelToken = cancellationToken
254  }) ?? Task.CompletedTask).ConfigureAwait(false);
255  }
256  catch (OperationCanceledException)
257  {
258  throw;
259  }
260  catch (Exception e)
261  {
262  logger.LogWarning("Error sending discord message: {0}", e);
263  }
264  }
readonly ILogger< DiscordProvider > logger
The ILogger for the DiscordProvider
+
readonly DiscordSocketClient client
The DiscordSocketClient for the DiscordProvider
+
+

References Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.client, and Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.logger.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Client_MessageReceived().

+ +
+
+

Member Data Documentation

+ +

◆ botToken

+ +
+
+ + + + + +
+ + + + +
readonly string Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.botToken
+
+private
+
+
+ +

◆ client

+ + + +

◆ Connected

+ +
+
+ + + + +
override bool Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Connected => client.ConnectionState == ConnectionState.Connected
+
+
+ +

◆ logger

+ + + +

◆ mappedChannels

+ +
+
+ + + + + +
+ + + + +
readonly List<ulong> Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.mappedChannels
+
+private
+
+
+

Property Documentation

+ +

◆ BotMention

+ +
+
+ + + + + +
+ + + + +
override string Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.BotMention
+
+get
+
+ +

+ +

Definition at line 23 of file DiscordProvider.cs.

+
23  {
24  get
25  {
26  if (!Connected)
27  throw new InvalidOperationException("Provider not connected");
28  return NormalizeMention(client.CurrentUser.Mention);
29  }
30  }
+
static string NormalizeMention(string fromDiscord)
Normalize a discord mention string
+
readonly DiscordSocketClient client
The DiscordSocketClient for the DiscordProvider
+
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.png new file mode 100644 index 0000000000000000000000000000000000000000..f97d857670fbce37edea44e2a5281562f8536007 GIT binary patch literal 2344 zcmd6pc~Fx_AIBf03gInKh}McAS4e;Y1;ICkHxQ*kdBULtER;(GObuv|BY=Ve>I*)j z6bM(ilB(PoKmoZSN(8xwAcsH-QV|lAQ?3BX8=RK6&bkXW;%CB=2CW&lInd~?Ru$x0*=iRH}u6-vVMM6vo5EEa1o zG^Q%+hEk#`{8>n5RolnuwghGFcX)h?;( zJK4dBg@J;DzVMBNp*h++Mj7|0DCO={-`I+AWMn>+$BZHoNUIKCYk;L2F7S=JXl#Bk zEireV_|Pn)%CjW-Sd#oTaH%UU^CG&X)x6>?qTNW9_?!+4w72H;64En@&6s;h!uEq@ zB7C3V-sMGgB%cmNuN1A1R^0wl3~S&+N(ugvb~~nxFQaH*mfcb}7P|bEoV;cvNL>oyvRY zhLVpZ)y#9P_r*9m@Vo|?FFV+Iu%WB%OB-OXCnaj%Fyn6PNq}dX!X9oA{N??xf&Y@4s{n&hA&e$;US|uX>dmnF@ zC)!Sz$xnQdy4CS;siLWK262r30}aIgUC z%ur2`5$IR=T{l>%@I3RIxG}+@ls?^%s_a_M+EqD=`*XPsX0Fs&cS8qefM=sV9NF&Y zlj(NL+`-Zv-KV2+wg4$w?5C3dwYg+)nNnxsN*tIrNIDjc>1vy5+)lZkNUB4lQtP1Rfzpn2bm{1u#LN%F;`ZCpb z$}^a>38+sOF(XjAqUSu3Nlqz`vl7;0LNNgqTAv9Wj#tsjYBr{dOJ zS5E1X_(lJN#oiG`+rhGWTp zaooQtLOW4gvyC4sr`Ygl=&^J`)nw&4t5SO2owSS*-%eT(>n$qufnQA4==CGPX z6nd`3X?}M1dG~4O;(j;r`Y-Q8!dJ<;S&J!m5!a=rZI$QsL4m2T6rzlSR7qhu43t6e z7z+RQ-bl+Q$>ftV$+0jspeEH&Vj||RaY=(Qew-vW#-U*sth5(fQL1osheTH8KY3R* zBEo8w8hl12z1U_SwL8o5uAywJP=bQiFOIhrjrGuK3>Caayt?b<3p}H_+M~!GB+ciX zY=1_0N91)v#mFDF7(c`ap&LXc4e0x8U|&|aO`EbgVbBH5A!nPL9+nhmcz#zinXdfk zM(0?;cH$D>Y5siO5Yj&G5Y6T0P&~vbmix&a=5{2NvEuQ*`D2sh<^ruCJR*iQtpV76|OS5KDekpcL7Oj)OYPYtk+hnH#6?l5f zd)hG5ep_K!xuG#82IBHVYEVzt0@fCap=Ubd7sf6Ga&grb0ok9hJXIesz2lPK@^@Ww z|3bVbv6(gyH^Vd3gim?(O7+afn$F4AYNS1PA^O3!eL5s6j$9!=;8Xs}rN@KpI8(3L zEj)$q*L?No(QT&TATEk8F?O%O9T2K8p;eQ8HOV_JX#>cuw;;s^s49MsKYMp4NZy(G fI${*+(nWx4I`4P$CF{%LZw&xi+2cwry>9*oS#uif literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider-members.html new file mode 100644 index 0000000000..fd7e8eb79b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider-members.html @@ -0,0 +1,114 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.Providers.IrcProvider Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Chat.Providers.IrcProvider, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
addressTgstation.Server.Host.Components.Chat.Providers.IrcProviderprivate
asyncDelayerTgstation.Server.Host.Components.Chat.Providers.IrcProviderprivate
BotMentionTgstation.Server.Host.Components.Chat.Providers.IrcProvider
channelIdCounterTgstation.Server.Host.Components.Chat.Providers.IrcProviderprivate
channelIdMapTgstation.Server.Host.Components.Chat.Providers.IrcProviderprivate
clientTgstation.Server.Host.Components.Chat.Providers.IrcProviderprivate
Client_OnChannelMessage(object sender, IrcEventArgs e)Tgstation.Server.Host.Components.Chat.Providers.IrcProviderprivate
Client_OnQueryMessage(object sender, IrcEventArgs e)Tgstation.Server.Host.Components.Chat.Providers.IrcProviderprivate
Connect(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.IrcProvidervirtual
ConnectedTgstation.Server.Host.Components.Chat.Providers.IrcProvider
Disconnect(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.IrcProvidervirtual
disconnectingTgstation.Server.Host.Components.Chat.Providers.IrcProviderprivate
Dispose()Tgstation.Server.Host.Components.Chat.Providers.IrcProvidervirtual
EnqueueMessage(Message message)Tgstation.Server.Host.Components.Chat.Providers.Providerprotected
HandleMessage(IrcEventArgs e, bool isPrivate)Tgstation.Server.Host.Components.Chat.Providers.IrcProviderprivate
IrcProvider(IApplication application, IAsyncDelayer asyncDelayer, ILogger< IrcProvider > logger, string address, ushort port, string nickname, string password, IrcPasswordType? passwordType, bool useSsl)Tgstation.Server.Host.Components.Chat.Providers.IrcProvider
listenTaskTgstation.Server.Host.Components.Chat.Providers.IrcProviderprivate
loggerTgstation.Server.Host.Components.Chat.Providers.IrcProviderprivate
MapChannels(IEnumerable< ChatChannel > channels, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.IrcProvidervirtual
Tgstation::Server::Host::Components::Chat::Providers::IProvider.MapChannels(IEnumerable< Api.Models.ChatChannel > channels, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.IProvider
NextMessage(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.Provider
nicknameTgstation.Server.Host.Components.Chat.Providers.IrcProviderprivate
passwordTgstation.Server.Host.Components.Chat.Providers.IrcProviderprivate
passwordTypeTgstation.Server.Host.Components.Chat.Providers.IrcProviderprivate
portTgstation.Server.Host.Components.Chat.Providers.IrcProviderprivate
Provider()Tgstation.Server.Host.Components.Chat.Providers.Providerprotected
queryChannelIdMapTgstation.Server.Host.Components.Chat.Providers.IrcProviderprivate
SendMessage(ulong channelId, string message, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.IrcProvidervirtual
TimeoutSecondsTgstation.Server.Host.Components.Chat.Providers.IrcProviderprivate
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html new file mode 100644 index 0000000000..256615d609 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html @@ -0,0 +1,1102 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Providers.IrcProvider Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Providers.IrcProvider Class Reference
+
+
+ +

IProvider for internet relay chat + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.Providers.IrcProvider:
+
+
+ + +Tgstation.Server.Host.Components.Chat.Providers.Provider +Tgstation.Server.Host.Components.Chat.Providers.IProvider +IDisposable + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 IrcProvider (IApplication application, IAsyncDelayer asyncDelayer, ILogger< IrcProvider > logger, string address, ushort port, string nickname, string password, IrcPasswordType? passwordType, bool useSsl)
 Construct an IrcProvider More...
 
override void Dispose ()
 
override Task< bool > Connect (CancellationToken cancellationToken)
 Attempt to connect the IProvider More...
 
override async Task Disconnect (CancellationToken cancellationToken)
 Gracefully disconnects the provider. Implies a call to IDisposable.Dispose More...
 
override Task< IReadOnlyList< Channel > > MapChannels (IEnumerable< ChatChannel > channels, CancellationToken cancellationToken)
 
override Task SendMessage (ulong channelId, string message, CancellationToken cancellationToken)
 Send a message to the IProvider More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Components.Chat.Providers.Provider
async Task< MessageNextMessage (CancellationToken cancellationToken)
 Get a Task<TResult> resulting in the next Message the IProvider recieves or null on a disconnect More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Components.Chat.Providers.IProvider
Task< IReadOnlyList< Channel > > MapChannels (IEnumerable< Api.Models.ChatChannel > channels, CancellationToken cancellationToken)
 Get the Channels for given channels More...
 
+ + + + + +

+Public Attributes

override bool Connected => client.IsConnected
 
override string BotMention => client.Nickname
 
+ + + + + + + + + + +

+Private Member Functions

void HandleMessage (IrcEventArgs e, bool isPrivate)
 Handle an IRC message More...
 
void Client_OnQueryMessage (object sender, IrcEventArgs e)
 When a query message is received in IRC More...
 
void Client_OnChannelMessage (object sender, IrcEventArgs e)
 When a channel message is received in IRC More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

const int TimeoutSeconds = 5
 
readonly IAsyncDelayer asyncDelayer
 The IAsyncDelayer for the IrcProvider More...
 
readonly ILogger< IrcProviderlogger
 The ILogger for the IrcProvider More...
 
readonly IrcFeatures client
 The IrcFeatures client More...
 
readonly string address
 Address of the server to connect to More...
 
readonly ushort port
 Port of the server to connect to More...
 
readonly string nickname
 IRC nickname More...
 
readonly string password
 Password which will used for authentication More...
 
readonly? IrcPasswordType passwordType
 The IrcPasswordType of password More...
 
readonly Dictionary< ulong, string > channelIdMap
 Map of Channel.RealIds to channel names More...
 
readonly Dictionary< ulong, string > queryChannelIdMap
 Map of Channel.RealIds to query users More...
 
ulong channelIdCounter
 Id counter for channelIdMap More...
 
Task listenTask
 The Task used for IrcConnection.Listen(bool) More...
 
bool disconnecting
 If we are disconnecting More...
 
+ + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from Tgstation.Server.Host.Components.Chat.Providers.Provider
 Provider ()
 Construct a Provider More...
 
void EnqueueMessage (Message message)
 Queues a message for NextMessage(CancellationToken) More...
 
- Properties inherited from Tgstation.Server.Host.Components.Chat.Providers.Provider
abstract bool Connected [get]
 
abstract string BotMention [get]
 
- Properties inherited from Tgstation.Server.Host.Components.Chat.Providers.IProvider
bool Connected [get]
 If the IProvider More...
 
string BotMention [get]
 The string that indicates the IProvider was mentioned More...
 
+

Detailed Description

+

IProvider for internet relay chat

+ +

Definition at line 18 of file IrcProvider.cs.

+

Constructor & Destructor Documentation

+ +

◆ IrcProvider()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.IrcProvider (IApplication application,
IAsyncDelayer asyncDelayer,
ILogger< IrcProviderlogger,
string address,
ushort port,
string nickname,
string password,
IrcPasswordTypepasswordType,
bool useSsl 
)
+
+ +

Construct an IrcProvider

+
Parameters
+ + + + + + + + + + +
applicationThe IApplication to get the IApplication.VersionString from
asyncDelayerThe value of asyncDelayer
loggerThe value of logger
addressThe value of address
portThe value of port
nicknameThe value of nickname
passwordThe value of password
passwordTypeThe value of passwordType
useSslIf IrcConnection.UseSsl should be used
+
+
+ +

Definition at line 105 of file IrcProvider.cs.

+
106  {
107  if (application == null)
108  throw new ArgumentNullException(nameof(application));
109  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
110  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
111 
112  this.address = address ?? throw new ArgumentNullException(nameof(address));
113  this.port = port;
114  this.nickname = nickname ?? throw new ArgumentNullException(nameof(nickname));
115 
116  if (passwordType.HasValue && password == null)
117  throw new ArgumentNullException(nameof(password));
118 
119  if (password != null && !passwordType.HasValue)
120  throw new ArgumentNullException(nameof(passwordType));
121 
122  this.password = password;
123  this.passwordType = passwordType;
124 
125  client = new IrcFeatures
126  {
127  SupportNonRfc = true,
128  CtcpUserInfo = "You are going to play. And I am going to watch. And everything will be just fine...",
129  AutoRejoin = true,
130  AutoRejoinOnKick = true,
131  AutoRelogin = true,
132  AutoRetry = true,
133  AutoRetryLimit = TimeoutSeconds,
134  AutoRetryDelay = TimeoutSeconds,
135  ActiveChannelSyncing = true,
136  AutoNickHandling = true,
137  CtcpVersion = application.VersionString,
138  UseSsl = useSsl
139  };
140  if (useSsl)
141  client.ValidateServerCertificate = true; // dunno if it defaults to that or what
142 
143  client.OnChannelMessage += Client_OnChannelMessage;
144  client.OnQueryMessage += Client_OnQueryMessage;
145 
146  channelIdMap = new Dictionary<ulong, string>();
147  queryChannelIdMap = new Dictionary<ulong, string>();
148  channelIdCounter = 1;
149  disconnecting = false;
150  }
+
readonly Dictionary< ulong, string > queryChannelIdMap
Map of Channel.RealIds to query users
Definition: IrcProvider.cs:76
+
readonly IrcFeatures client
The IrcFeatures client
Definition: IrcProvider.cs:41
+
readonly ushort port
Port of the server to connect to
Definition: IrcProvider.cs:51
+
readonly? IrcPasswordType passwordType
The IrcPasswordType of password
Definition: IrcProvider.cs:66
+
readonly ILogger< IrcProvider > logger
The ILogger for the IrcProvider
Definition: IrcProvider.cs:36
+
readonly string address
Address of the server to connect to
Definition: IrcProvider.cs:46
+
readonly Dictionary< ulong, string > channelIdMap
Map of Channel.RealIds to channel names
Definition: IrcProvider.cs:71
+ +
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the IrcProvider
Definition: IrcProvider.cs:31
+
string VersionString
A more verbose version of Version
Definition: IApplication.cs:18
+
void Client_OnChannelMessage(object sender, IrcEventArgs e)
When a channel message is received in IRC
+
void Client_OnQueryMessage(object sender, IrcEventArgs e)
When a query message is received in IRC
+
readonly string password
Password which will used for authentication
Definition: IrcProvider.cs:61
+ + +
+

References Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.address, Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.asyncDelayer, Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.channelIdCounter, Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.channelIdMap, Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.client, Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Client_OnChannelMessage(), Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Client_OnQueryMessage(), Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.disconnecting, Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.logger, Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.nickname, Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.password, Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.passwordType, Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.port, Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.queryChannelIdMap, Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.TimeoutSeconds, and Tgstation.Server.Host.Core.IApplication.VersionString.

+ +
+
+

Member Function Documentation

+ +

◆ Client_OnChannelMessage()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Client_OnChannelMessage (object sender,
IrcEventArgs e 
)
+
+private
+
+ +

When a channel message is received in IRC

+
Parameters
+ + + +
senderThe sender of the event
eThe IrcEventArgs
+
+
+ +

Referenced by Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.IrcProvider().

+ +
+
+ +

◆ Client_OnQueryMessage()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Client_OnQueryMessage (object sender,
IrcEventArgs e 
)
+
+private
+
+ +

When a query message is received in IRC

+
Parameters
+ + + +
senderThe sender of the event
eThe IrcEventArgs
+
+
+ +

Referenced by Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.IrcProvider().

+ +
+
+ +

◆ Connect()

+ +
+
+ + + + + +
+ + + + + + + + +
override Task<bool> Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Connect (CancellationToken cancellationToken)
+
+virtual
+
+ +

Attempt to connect the IProvider

+ +

Implements Tgstation.Server.Host.Components.Chat.Providers.Provider.

+ +
+
+ +

◆ Disconnect()

+ +
+
+ + + + + +
+ + + + + + + + +
override async Task Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Disconnect (CancellationToken cancellationToken)
+
+virtual
+
+ +

Gracefully disconnects the provider. Implies a call to IDisposable.Dispose

+ +

Implements Tgstation.Server.Host.Components.Chat.Providers.Provider.

+ +

Definition at line 339 of file IrcProvider.cs.

+
340  {
341  if (!Connected)
342  return;
343  try
344  {
345  await Task.Factory.StartNew(() =>
346  {
347  try
348  {
349  client.RfcQuit("Mr. Stark, I don't feel so good...", Priority.Critical); // priocritical otherwise it wont go through
350  }
351  catch (Exception e)
352  {
353  logger.LogWarning("Error quitting IRC: {0}", e);
354  }
355  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
356  Dispose();
357  await listenTask.ConfigureAwait(false);
358  }
359  catch (OperationCanceledException)
360  {
361  throw;
362  }
363  catch (Exception e)
364  {
365  logger.LogWarning("Error disconnecting from IRC! Exception: {0}", e);
366  }
367  }
readonly IrcFeatures client
The IrcFeatures client
Definition: IrcProvider.cs:41
+
readonly ILogger< IrcProvider > logger
The ILogger for the IrcProvider
Definition: IrcProvider.cs:36
+ +
Task listenTask
The Task used for IrcConnection.Listen(bool)
Definition: IrcProvider.cs:86
+ +
+

References Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.client, Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Connected, Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Dispose(), Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.listenTask, and Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.logger.

+ +
+
+ +

◆ Dispose()

+ +
+
+ + + + + +
+ + + + + + + +
override void Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Dispose ()
+
+virtual
+
+
+ +

◆ HandleMessage()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.HandleMessage (IrcEventArgs e,
bool isPrivate 
)
+
+private
+
+ +

Handle an IRC message

+
Parameters
+ + + +
eThe IrcEventArgs
isPrivateIf this is a query message
+
+
+ +

Definition at line 167 of file IrcProvider.cs.

+
168  {
169  if (e.Data.Nick.ToUpperInvariant() == client.Nickname.ToUpperInvariant())
170  return;
171 
172  var username = e.Data.Nick;
173  var channelName = isPrivate ? username : e.Data.Channel;
174 
175  ulong MapAndGetChannelId(Dictionary<ulong, string> dicToCheck)
176  {
177  ulong? resultId = null;
178  if (!dicToCheck.Any(x =>
179  {
180  if (x.Value != channelName)
181  return false;
182  resultId = x.Key;
183  return true;
184  }))
185  {
186  resultId = channelIdCounter++;
187  dicToCheck.Add(resultId.Value, channelName);
188  if (dicToCheck == queryChannelIdMap)
189  channelIdMap.Add(resultId.Value, null);
190  }
191 
192  return resultId.Value;
193  }
194 
195  ulong userId, channelId;
196  lock (this)
197  {
198  userId = MapAndGetChannelId(queryChannelIdMap);
199  channelId = isPrivate ? userId : MapAndGetChannelId(channelIdMap);
200  }
201 
202  var message = new Message
203  {
204  Content = e.Data.Message,
205  User = new User
206  {
207  Channel = new Channel
208  {
209  ConnectionName = address,
210  FriendlyName = isPrivate ? String.Format(CultureInfo.InvariantCulture, "PM: {0}", channelName) : channelName,
211  RealId = channelId,
212  IsPrivateChannel = isPrivate
213 
214  // isAdmin and Tag populated by manager
215  },
216  FriendlyName = username,
217  RealId = userId,
218  Mention = username
219  }
220  };
221 
222  EnqueueMessage(message);
223  }
+
readonly Dictionary< ulong, string > queryChannelIdMap
Map of Channel.RealIds to query users
Definition: IrcProvider.cs:76
+
readonly IrcFeatures client
The IrcFeatures client
Definition: IrcProvider.cs:41
+
readonly string address
Address of the server to connect to
Definition: IrcProvider.cs:46
+
readonly Dictionary< ulong, string > channelIdMap
Map of Channel.RealIds to channel names
Definition: IrcProvider.cs:71
+ +
void EnqueueMessage(Message message)
Queues a message for NextMessage(CancellationToken)
Definition: Provider.cs:40
+
+

References Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.address, Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.channelIdCounter, Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.channelIdMap, Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.client, Tgstation.Server.Host.Components.Chat.Providers.Provider.EnqueueMessage(), and Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.queryChannelIdMap.

+ +
+
+ +

◆ MapChannels()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
override Task<IReadOnlyList<Channel> > Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.MapChannels (IEnumerable< ChatChannelchannels,
CancellationToken cancellationToken 
)
+
+virtual
+
+
+ +

◆ SendMessage()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
override Task Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.SendMessage (ulong channelId,
string message,
CancellationToken cancellationToken 
)
+
+virtual
+
+ +

Send a message to the IProvider

+ +

Implements Tgstation.Server.Host.Components.Chat.Providers.Provider.

+ +
+
+

Member Data Documentation

+ +

◆ address

+ +
+
+ + + + + +
+ + + + +
readonly string Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.address
+
+private
+
+
+ +

◆ asyncDelayer

+ +
+
+ + + + + +
+ + + + +
readonly IAsyncDelayer Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.asyncDelayer
+
+private
+
+ +

The IAsyncDelayer for the IrcProvider

+ +

Definition at line 31 of file IrcProvider.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.IrcProvider().

+ +
+
+ +

◆ BotMention

+ +
+
+ + + + +
override string Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.BotMention => client.Nickname
+
+ +

+ +

Definition at line 26 of file IrcProvider.cs.

+ +
+
+ +

◆ channelIdCounter

+ +
+
+ + + + + +
+ + + + +
ulong Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.channelIdCounter
+
+private
+
+
+ +

◆ channelIdMap

+ +
+
+ + + + + +
+ + + + +
readonly Dictionary<ulong, string> Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.channelIdMap
+
+private
+
+
+ +

◆ client

+ +
+
+ + + + + +
+ + + + +
readonly IrcFeatures Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.client
+
+private
+
+
+ +

◆ Connected

+ +
+
+ + + + +
override bool Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Connected => client.IsConnected
+
+
+ +

◆ disconnecting

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.disconnecting
+
+private
+
+
+ +

◆ listenTask

+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.listenTask
+
+private
+
+ +

The Task used for IrcConnection.Listen(bool)

+ +

Definition at line 86 of file IrcProvider.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Disconnect().

+ +
+
+ +

◆ logger

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<IrcProvider> Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.logger
+
+private
+
+
+ +

◆ nickname

+ +
+
+ + + + + +
+ + + + +
readonly string Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.nickname
+
+private
+
+ +

IRC nickname

+ +

Definition at line 56 of file IrcProvider.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.IrcProvider().

+ +
+
+ +

◆ password

+ +
+
+ + + + + +
+ + + + +
readonly string Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.password
+
+private
+
+ +

Password which will used for authentication

+ +

Definition at line 61 of file IrcProvider.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.IrcProvider().

+ +
+
+ +

◆ passwordType

+ +
+
+ + + + + +
+ + + + +
readonly? IrcPasswordType Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.passwordType
+
+private
+
+ +

The IrcPasswordType of password

+ +

Definition at line 66 of file IrcProvider.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.IrcProvider().

+ +
+
+ +

◆ port

+ +
+
+ + + + + +
+ + + + +
readonly ushort Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.port
+
+private
+
+ +

Port of the server to connect to

+ +

Definition at line 51 of file IrcProvider.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.IrcProvider().

+ +
+
+ +

◆ queryChannelIdMap

+ +
+
+ + + + + +
+ + + + +
readonly Dictionary<ulong, string> Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.queryChannelIdMap
+
+private
+
+
+ +

◆ TimeoutSeconds

+ +
+
+ + + + + +
+ + + + +
const int Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.TimeoutSeconds = 5
+
+private
+
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Host/Components/Chat/Providers/IrcProvider.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.png new file mode 100644 index 0000000000000000000000000000000000000000..d3774bde7fb9819412cabe3ad611511870e9846d GIT binary patch literal 2230 zcmd6pdr(u^8Nfp$kBZ1BZjt2?HHkFK%YsH((4ZpZA>byUB9F+DfIRuhPen&1TqawSCDU68cyPIwst##T%W1X&&d0s_4_c4z9^nVso$X79|s_q*pi ze|+bh-}#-Je=IoAYW>ISVKA5#0q;+S!AuxXEVF<^Puo{tH$tzi$Bu>`SzTR)!dH3& ztN0NYir(HbnanhQ7y*4+q>+OuFsReo)!!592{j!d_#X_tXfjdzk8=LD4FO_=c6J$& z4u*XJJ2i2X;^W->j2VVkxO~|uC?#{r#K}AqAqUk_!*wGBf59N6?4Xf&Hrpe3SKAu( zx~w;=5mJ)EU0#VijMjNYhR@k$K)Gm?{0Y@5F|!)CA~qWNS6wBV>nFli&_G4(as%OI zlLSa5v~N`-eZ&znF=lxT0z0P=`+1s(`PZH&OO2?gKPH!qxa$fN;~tU}^=<78)ir)R zNg<}p=QbAJu8m#kb}qhD4@R=iQ^Q(OtjM;*cm?H9E6RHlfPS1W=D88nN4v{W&ObJ- z)jmuYz8z1p`E$$rChK66&NTSKIq)(QW_t*mZTao|F7wPlHOJFUuU)n5E?_stkT{ki6(ka2(Qk|I?-IL?Sd0L z10!Y~x}&3>n04ND+)hBQ*k9yakN`_10nj}7iV#;?JeK^o5j0!RObi6L#qO1h^n>xq z-BKLb^{Db1&7jU?MeiPmi)=NS(hV&YxAmFGKuPf);mL2^?=v)u3`~>DO{WA!>B6`R z_ey`KXR%%P0pF#3JvxhXhV0#FVpNuH?zuC4w;bH4KXfY4`bk;MG!Z<`}hbmyvQK;0iAH$U(b5z&! zEXxwCiKkm*`)z={jF;Bzxs$CW`_3RU_JdY^tq-+Kn$P!MO2d|3mg;L^Jnl-=T;GFD zzV4N^16Lu_W zE)T?^)1Kw#DwB z&05wjRtvE7@I$0cK%}+m2Zc#;DNfq;Xn`s=CQCo{s5aOQTBaVLnhlYTUyzpYRbAB- z*Vu|kY$~U9%hQiSt@oTIzA=2%{dkO8)zt!6hj838@~MdG(4qvtENp#2%B{@XFGX;W zJMdZX?<%MTN*{aEgmKBY?VncgF>lN%#gE^Vj^ zRnE1b{q7l(!dai-UgZZ^8*Er1e&-~|ZZ>Dq#PO1xq2PrFg$#4{PO$Ftk0-xtaN3N{ilLS|YIgK|&{yw-Gw=KUutAlG8$ZcboR^4w}sS^)}eW zz3~{M$h9j!X8q(yYz0uh7=V5aY%vzijWJ8(P1)u@vk=;e=%%SY&f9gV3}35Xnqj;CY1L4@s<}0DBOH;?u`9LhfvE9kP!^g~ z6RzE1Me~>%&&^K>g-l4M7dfxR>-6!IT9lH!4P?`_(t2o3|A-8Pe_`;^y71g+Mx1-)NIy5?gzhxNo8McnDc|>60pzvjHLnSxV_Ll&ifQ!unhmnN`(!s5 z?nc>2QWosmXox&oZIQi39DE(DGvvLqZkYaVk(0FumgFg|)W6_7^pgQ290~Rp9XkDo Fe*vFv7>57= literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_message-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_message-members.html new file mode 100644 index 0000000000..42533f47bc --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_message-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.Providers.Message Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_message.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_message.html new file mode 100644 index 0000000000..69be93182e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_message.html @@ -0,0 +1,162 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Providers.Message Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Providers.Message Class Reference
+
+
+ +

Represents a message recieved by a IProvider + More...

+ + + + + + + + +

+Properties

string Content [get, set]
 The text of the message More...
 
User User [get, set]
 The Components.Chat.User who sent the Message More...
 
+

Detailed Description

+

Represents a message recieved by a IProvider

+ +

Definition at line 6 of file Message.cs.

+

Property Documentation

+ +

◆ Content

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.Providers.Message.Content
+
+getset
+
+ +

The text of the message

+ +

Definition at line 11 of file Message.cs.

+
11 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Client_MessageReceived(), and Tgstation.Server.Host.Components.Chat.Chat.ProcessMessage().

+ +
+
+ +

◆ User

+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Host.Components.Chat.Providers.Message.User
+
+getset
+
+ +

The Components.Chat.User who sent the Message

+ +

Definition at line 16 of file Message.cs.

+
16 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ProcessMessage().

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Host/Components/Chat/Message.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider-members.html new file mode 100644 index 0000000000..1509fad580 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider-members.html @@ -0,0 +1,98 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.Providers.Provider Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Chat.Providers.Provider, including all inherited members.

+ + + + + + + + + + + + + + +
BotMentionTgstation.Server.Host.Components.Chat.Providers.Provider
Connect(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.Providerpure virtual
ConnectedTgstation.Server.Host.Components.Chat.Providers.Provider
Disconnect(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.Providerpure virtual
Dispose()Tgstation.Server.Host.Components.Chat.Providers.Providerpure virtual
EnqueueMessage(Message message)Tgstation.Server.Host.Components.Chat.Providers.Providerprotected
MapChannels(IEnumerable< ChatChannel > channels, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.Providerpure virtual
Tgstation::Server::Host::Components::Chat::Providers::IProvider.MapChannels(IEnumerable< Api.Models.ChatChannel > channels, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.IProvider
messageQueueTgstation.Server.Host.Components.Chat.Providers.Providerprivate
NextMessage(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.Provider
nextMessageTgstation.Server.Host.Components.Chat.Providers.Providerprivate
Provider()Tgstation.Server.Host.Components.Chat.Providers.Providerprotected
SendMessage(ulong channelId, string message, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.Providerpure virtual
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html new file mode 100644 index 0000000000..0929d30fc6 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html @@ -0,0 +1,561 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Providers.Provider Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Providers.Provider Class Referenceabstract
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.Providers.Provider:
+
+
+ + +Tgstation.Server.Host.Components.Chat.Providers.IProvider +IDisposable +Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider +Tgstation.Server.Host.Components.Chat.Providers.IrcProvider + +
+ + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

abstract void Dispose ()
 
abstract Task< bool > Connect (CancellationToken cancellationToken)
 Attempt to connect the IProvider More...
 
abstract Task Disconnect (CancellationToken cancellationToken)
 Gracefully disconnects the provider. Implies a call to IDisposable.Dispose More...
 
abstract Task< IReadOnlyList< Channel > > MapChannels (IEnumerable< ChatChannel > channels, CancellationToken cancellationToken)
 
async Task< MessageNextMessage (CancellationToken cancellationToken)
 Get a Task<TResult> resulting in the next Message the IProvider recieves or null on a disconnect More...
 
abstract Task SendMessage (ulong channelId, string message, CancellationToken cancellationToken)
 Send a message to the IProvider More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Components.Chat.Providers.IProvider
Task< IReadOnlyList< Channel > > MapChannels (IEnumerable< Api.Models.ChatChannel > channels, CancellationToken cancellationToken)
 Get the Channels for given channels More...
 
+ + + + + + + +

+Protected Member Functions

 Provider ()
 Construct a Provider More...
 
void EnqueueMessage (Message message)
 Queues a message for NextMessage(CancellationToken) More...
 
+ + + + + + + + + + + + +

+Properties

abstract bool Connected [get]
 
abstract string BotMention [get]
 
- Properties inherited from Tgstation.Server.Host.Components.Chat.Providers.IProvider
bool Connected [get]
 If the IProvider More...
 
string BotMention [get]
 The string that indicates the IProvider was mentioned More...
 
+ + + + + + + +

+Private Attributes

readonly Queue< MessagemessageQueue
 Queue<T> of received Messages More...
 
TaskCompletionSource< object > nextMessage
 TaskCompletionSource<TResult> that completes while messageQueue isn't empty More...
 
+

Detailed Description

+
+

Definition at line 9 of file Provider.cs.

+

Constructor & Destructor Documentation

+ +

◆ Provider()

+ +
+
+ + + + + +
+ + + + + + + +
Tgstation.Server.Host.Components.Chat.Providers.Provider.Provider ()
+
+protected
+
+ +

Construct a Provider

+ +

Definition at line 24 of file Provider.cs.

+
25  {
26  messageQueue = new Queue<Message>();
27  nextMessage = new TaskCompletionSource<object>();
28  }
TaskCompletionSource< object > nextMessage
TaskCompletionSource<TResult> that completes while messageQueue isn't empty
Definition: Provider.cs:19
+
readonly Queue< Message > messageQueue
Queue<T> of received Messages
Definition: Provider.cs:14
+
+

References Tgstation.Server.Host.Components.Chat.Providers.Provider.messageQueue, and Tgstation.Server.Host.Components.Chat.Providers.Provider.nextMessage.

+ +
+
+

Member Function Documentation

+ +

◆ Connect()

+ +
+
+ + + + + +
+ + + + + + + + +
abstract Task<bool> Tgstation.Server.Host.Components.Chat.Providers.Provider.Connect (CancellationToken cancellationToken)
+
+pure virtual
+
+
+ +

◆ Disconnect()

+ +
+
+ + + + + +
+ + + + + + + + +
abstract Task Tgstation.Server.Host.Components.Chat.Providers.Provider.Disconnect (CancellationToken cancellationToken)
+
+pure virtual
+
+ +

Gracefully disconnects the provider. Implies a call to IDisposable.Dispose

+ +

Implements Tgstation.Server.Host.Components.Chat.Providers.IProvider.

+ +

Implemented in Tgstation.Server.Host.Components.Chat.Providers.IrcProvider, and Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.

+ +
+
+ +

◆ Dispose()

+ +
+
+ + + + + +
+ + + + + + + +
abstract void Tgstation.Server.Host.Components.Chat.Providers.Provider.Dispose ()
+
+pure virtual
+
+
+ +

◆ EnqueueMessage()

+ +
+
+ + + + + +
+ + + + + + + + +
void Tgstation.Server.Host.Components.Chat.Providers.Provider.EnqueueMessage (Message message)
+
+protected
+
+ +

Queues a message for NextMessage(CancellationToken)

+
Parameters
+ + +
messageThe Message to queue
+
+
+ +

Definition at line 40 of file Provider.cs.

+
41  {
42  lock (messageQueue)
43  {
44  messageQueue.Enqueue(message);
45  nextMessage.TrySetResult(null);
46  }
47  }
TaskCompletionSource< object > nextMessage
TaskCompletionSource<TResult> that completes while messageQueue isn't empty
Definition: Provider.cs:19
+
readonly Queue< Message > messageQueue
Queue<T> of received Messages
Definition: Provider.cs:14
+
+

References Tgstation.Server.Host.Components.Chat.Providers.Provider.messageQueue, and Tgstation.Server.Host.Components.Chat.Providers.Provider.nextMessage.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Client_MessageReceived(), and Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.HandleMessage().

+ +
+
+ +

◆ MapChannels()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
abstract Task<IReadOnlyList<Channel> > Tgstation.Server.Host.Components.Chat.Providers.Provider.MapChannels (IEnumerable< ChatChannelchannels,
CancellationToken cancellationToken 
)
+
+pure virtual
+
+
+ +

◆ NextMessage()

+ +
+
+ + + + + + + + +
async Task<Message> Tgstation.Server.Host.Components.Chat.Providers.Provider.NextMessage (CancellationToken cancellationToken)
+
+ +

Get a Task<TResult> resulting in the next Message the IProvider recieves or null on a disconnect

+ +

Implements Tgstation.Server.Host.Components.Chat.Providers.IProvider.

+ +

Definition at line 62 of file Provider.cs.

+
63  {
64  var cancelTcs = new TaskCompletionSource<object>();
65  using (cancellationToken.Register(() => cancelTcs.SetCanceled()))
66  await Task.WhenAny(nextMessage.Task, cancelTcs.Task).ConfigureAwait(false);
67  cancellationToken.ThrowIfCancellationRequested();
68  lock (messageQueue)
69  {
70  var result = messageQueue.Dequeue();
71  if (messageQueue.Count == 0)
72  nextMessage = new TaskCompletionSource<object>();
73  return result;
74  }
75  }
TaskCompletionSource< object > nextMessage
TaskCompletionSource<TResult> that completes while messageQueue isn't empty
Definition: Provider.cs:19
+
readonly Queue< Message > messageQueue
Queue<T> of received Messages
Definition: Provider.cs:14
+
+

References Tgstation.Server.Host.Components.Chat.Providers.Provider.messageQueue, and Tgstation.Server.Host.Components.Chat.Providers.Provider.nextMessage.

+ +
+
+ +

◆ SendMessage()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
abstract Task Tgstation.Server.Host.Components.Chat.Providers.Provider.SendMessage (ulong channelId,
string message,
CancellationToken cancellationToken 
)
+
+pure virtual
+
+
+

Member Data Documentation

+ +

◆ messageQueue

+ +
+
+ + + + + +
+ + + + +
readonly Queue<Message> Tgstation.Server.Host.Components.Chat.Providers.Provider.messageQueue
+
+private
+
+
+ +

◆ nextMessage

+ +
+
+ + + + + +
+ + + + +
TaskCompletionSource<object> Tgstation.Server.Host.Components.Chat.Providers.Provider.nextMessage
+
+private
+
+
+

Property Documentation

+ +

◆ BotMention

+ +
+
+ + + + + +
+ + + + +
abstract string Tgstation.Server.Host.Components.Chat.Providers.Provider.BotMention
+
+get
+
+ +

+ +

Definition at line 34 of file Provider.cs.

+
34 { get; }
+
+
+ +

◆ Connected

+ +
+
+ + + + + +
+ + + + +
abstract bool Tgstation.Server.Host.Components.Chat.Providers.Provider.Connected
+
+get
+
+ +

+ +

Definition at line 31 of file Provider.cs.

+
31 { get; }
+
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Host/Components/Chat/Providers/Provider.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.png new file mode 100644 index 0000000000000000000000000000000000000000..e85774f01bbae045cddc70b6410e0141cbcff37b GIT binary patch literal 3179 zcmd6qdsLEX9>+~fM@OyQoEe=!Y9%jCWm>72VU4Ad*VHcKz07P@QNg>Qc-hg)#6ry+ z@>1TiCQY5j%4<_bKx$?x8z34WGK7YPf}re!&FtAf=FHjsW6v(<@bbLx^YT2u_s941 z`~JA#>+NQs_obeOhK2#k{g9uAh86^jdq2?v$A|r;^WekS*E8U-N~HqB>37nkqMt8= z(dxUmw|CtI77UzzlIZ8{uK{jSzeZ>Qwi+6rE};$`3`kugW;3yGJ3l`>StPvOsWO}O z?%lk}A{(i+>@e?g-AH%5QMZNtvr32Fx;^rntNgwL*=Z+9wQ#COBV?CJsTnHNho42g z1wqZFZ`1K~<-3!{{1M@{+uTTFuZmNW=7fF z(S<#b?L6s5ZCR0E@~;ns&8E=gqJ{Xhq^70aM(X9Aj}kqCRWz%1Mt2|-MQU8V7C@AS zGVthaCk!p$cPI}bkg<6c5J790DlE28B%M2Y8J?hyAhQ;t_=;QH+W#F1zH#+J354uL zc=(r}BFpkK4w7DYfw*Nh*iJ%I&h2s&64`lcBZ8Ea--KJw?8UK_SB+k-Y*M1A) zTOEErEcUhG$BFk=$F%f}E*(WwA9!qB`oA9bhJonow$ocXjV*Vr_aK$P)2vFh%xkc4 zs^||jfGp!CuE0&+F33d9?2a2DB>dpRH{Ekmxr9iHIqfV=aAUrr4?m7$jk%M|#!pNv z23eTYV0+Kt(-K%w$!6;8A6;Qwl?4(l9FMeK&@z|_HnpEEtHE1QX4}1OT|wqk4-mtm zxRl2@q*cCZpibZ-PtPLisN`}#Owf;|5g9ED-6QePw|ek@c`k_;!4Wsr`&v^XoiAPSkF^On8S)5S&b-4MOTvYGHJ#mN(oya6I-W4d&&eND9tr7T6$mDF5Pdv8~AlX%>_zcf!(?OnJ2f zC;tJ$yub-@_POs(!m00e!N$a1wBRvfmNJIAAniNXJ3i{OCpx_xO2J<8%KKE?<838O3R{8<3SeUyTaw3cR@i-6$ud{;o$>O_^_-v0}XKBBBV=G`#dcpV%HvNh*l*7l0NH4V4@ z-Y9i{zm}(Kv1W5aS{C)3--L9}`dubodYzS1Ys|TKYOfE#^f5T4bPOX>xW+&I4WoM( zmTL#0Xb)>2ogPe>7EzX4&p4#cw7Jz{vpu#K3gZ`TRYW5yr#~S(yqp-|V^o<4ngFZJ z^p8<1-U&`==1RB|8JsZkulVHsXZXD1r#`TP_z^$<2}{r_yTkuhzmL@>`bK&?A^#v z;`_zH2A3GVgXvsb^C`OyqV|?CM9i7-#a6Ox$`#jS1yL9D%F7XqIZ@t9PeocE)TOXD*Gx+54S~nugu~WM@Yr+m?KEmdAhy zeK?RR4mQQQsx)Gs#QB__j#`X5d}#|vNtYnPbxW|aR#|gbf)j( zvB3&`?T~0t&(zGM*dxb{4ArHy$UL&1x9l8Ss|L~CZ&d4xv(-S{1eyy9QBh9|;b&>8 zO3c@V`pjz-5B;%r8is`dKxIPU*P4U^drRNy0D#BD`S$iV0Fc;KZ`shpx&{4p!vD6m zk)?4B*e%CKZBGB*u&0m7WCo?-a5%D#<@?j$>t4H9zxHf(c~;}OBjMWr-BVRj2{0vP z;`r6bZ!#UdsK8(YK6WN1pbH_vt?Ph8>4P#-ei77^-M$FYnQg$BUmO6lji6z%)dJm1 z{pr$wH7RLdNDUnEHW(cyUs9&Jq3l|!K0K^J3;Dtc`}W|alCUm z-5$QAEi2UxHDqr0+*xrkkC^`x-7H#l2z(QBkCqY?8C+!TCQlc`$|oEb+MeJE340C> zK9?x=XY8a{vyq)hSk@DQ;8olF2@6UBUx{ygu;WeB^3rK>2AQ99-h)j)$-F{ops$@Z z-*cR;pCD4D=iJRL?7`k`<2Z_b(eH`y&nV$eo~pcDqr2pEu;aLoU^CSihuHa~@S~0S zCz1QaBVv)GLOkpCR4hI@2jo< z{A08<(U5crvzdbKW!}qYo;tbgPl9r}{J*8D@QzQD#YOqbchT4Sn`*?+%<{)WPV4RZ z7ouXzPVbX0`w)_^2|#v`9xoY!SssX}>bcDi(~m-{?k=C*r(gEEetIJOk%2_{hO<>N zJv!d6l8MoeQi2p%A_SvUd5?hY1X_Z-yGO%Eh?wV?7GE=MG6*x#~1-n;+7 z{gmjQuDBE^`|S<7f==uXQnXOx$Dw=hT{1qE zTvr)anKIdAFUkB;aFb5%-(vGQdY~w}82mWm8#Sj;DSeCc4uf-cuQNsxEEJyw32b6Y zB`1jO3-MZ<hs1N9^d`csP;;<(pj|%_ugV_?S{n%3^Dq!J zFjbW8XF$-PV8E#XYSm{0)%#04h`;upf!YWF3Jp*aEr*eJI1M-5xgZDs3^Y)Oy$>~g H9iH + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests_1_1_test_discord_provider.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests_1_1_test_discord_provider.html new file mode 100644 index 0000000000..0720609bee --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests_1_1_test_discord_provider.html @@ -0,0 +1,221 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider Class Reference
+
+
+ + + + + + + + + + +

+Public Member Functions

void Initialize ()
 
void TestConstructionAndDisposal ()
 
async Task TestConnectWithFakeTokenFails ()
 
async Task TestConnectAndDisconnect ()
 
+ + + +

+Private Attributes

string testToken1
 
+

Detailed Description

+
+

Definition at line 11 of file TestDiscordProvider.cs.

+

Member Function Documentation

+ +

◆ Initialize()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider.Initialize ()
+
+ +

Definition at line 16 of file TestDiscordProvider.cs.

+
17  {
18  testToken1 = Environment.GetEnvironmentVariable("TGS4_TEST_DISCORD_TOKEN_1");
19  }
+
+

References Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider.testToken1.

+ +
+
+ +

◆ TestConnectAndDisconnect()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider.TestConnectAndDisconnect ()
+
+ +

Definition at line 44 of file TestDiscordProvider.cs.

+
45  {
46  if (testToken1 == null)
47  Assert.Inconclusive("Required environment variable TGS4_TEST_DISCORD_TOKEN_1 isn't set!");
48 
49 
50  var mockLogger = new Mock<ILogger<DiscordProvider>>();
51  using (var provider = new DiscordProvider(mockLogger.Object, testToken1))
52  {
53  Assert.IsFalse(provider.Connected);
54  await provider.Disconnect(default).ConfigureAwait(false);
55  Assert.IsFalse(provider.Connected);
56  Assert.IsTrue(await provider.Connect(default).ConfigureAwait(false));
57  Assert.IsTrue(provider.Connected);
58  Assert.IsTrue(await provider.Connect(default).ConfigureAwait(false));
59  Assert.IsTrue(provider.Connected);
60 
61  await provider.Disconnect(default).ConfigureAwait(false);
62  Assert.IsFalse(provider.Connected);
63  await provider.Disconnect(default).ConfigureAwait(false);
64  Assert.IsFalse(provider.Connected);
65 
66  //now try it with cancellationTokens
67  using (var cts = new CancellationTokenSource())
68  {
69  cts.Cancel();
70  var cancellationToken = cts.Token;
71  await Assert.ThrowsExceptionAsync<OperationCanceledException>(() => provider.Connect(cancellationToken)).ConfigureAwait(false);
72  Assert.IsFalse(provider.Connected);
73  Assert.IsTrue(await provider.Connect(default).ConfigureAwait(false));
74  Assert.IsTrue(provider.Connected);
75  await Assert.ThrowsExceptionAsync<OperationCanceledException>(() => provider.Disconnect(cancellationToken)).ConfigureAwait(false);
76  Assert.IsTrue(provider.Connected);
77  await provider.Disconnect(default).ConfigureAwait(false);
78  Assert.IsFalse(provider.Connected);
79  }
80 
81  }
82  }
+
+

References Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider.testToken1.

+ +
+
+ +

◆ TestConnectWithFakeTokenFails()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider.TestConnectWithFakeTokenFails ()
+
+ +

Definition at line 32 of file TestDiscordProvider.cs.

+
33  {
34  var mockLogger = new Mock<ILogger<DiscordProvider>>();
35  using (var provider = new DiscordProvider(mockLogger.Object, "asdf"))
36  {
37  Assert.IsFalse(await provider.Connect(default).ConfigureAwait(false));
38  Assert.IsFalse(provider.Connected);
39  }
40  }
+
+
+ +

◆ TestConstructionAndDisposal()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider.TestConstructionAndDisposal ()
+
+ +

Definition at line 22 of file TestDiscordProvider.cs.

+
23  {
24  Assert.ThrowsException<ArgumentNullException>(() => new DiscordProvider(null, null));
25  var mockLogger = new Mock<ILogger<DiscordProvider>>();
26  Assert.ThrowsException<ArgumentNullException>(() => new DiscordProvider(mockLogger.Object, null));
27  var mockToken = "asdf";
28  new DiscordProvider(mockLogger.Object, mockToken).Dispose();
29  }
+

References Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Dispose().

+ +
+
+

Member Data Documentation

+ +

◆ testToken1

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider.testToken1
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_response-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_response-members.html new file mode 100644 index 0000000000..27e6b32040 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_response-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.Response Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_response.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_response.html new file mode 100644 index 0000000000..c4b9b15ea9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_response.html @@ -0,0 +1,158 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Response Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Response Class Reference
+
+
+ +

Represents a chat message requested by DD + More...

+ + + + + + + + +

+Properties

string Message [get, set]
 The message string More...
 
List< ulong > ChannelIds [get, set]
 The list of internal channel ids to send Message to More...
 
+

Detailed Description

+

Represents a chat message requested by DD

+ +

Definition at line 8 of file Response.cs.

+

Property Documentation

+ +

◆ ChannelIds

+ +
+
+ + + + + +
+ + + + +
List<ulong> Tgstation.Server.Host.Components.Chat.Response.ChannelIds
+
+getset
+
+ +

The list of internal channel ids to send Message to

+ +

Definition at line 18 of file Response.cs.

+
18 { get; set; }
+
+
+ +

◆ Message

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.Response.Message
+
+getset
+
+ +

The message string

+ +

Definition at line 13 of file Response.cs.

+
13 { get; set; }
+
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Host/Components/Chat/Response.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user-members.html new file mode 100644 index 0000000000..6fa68ea765 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user-members.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.User Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user.html new file mode 100644 index 0000000000..192dcbca73 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user.html @@ -0,0 +1,250 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.User Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.User Class Reference
+
+
+ +

Represents a tgs_chat_user datum + More...

+ + + + + + + + + + + + + + + + + +

+Properties

string Id [get, set]
 Backing field for RealId. Represented as a string to avoid BYOND percision loss More...
 
ulong RealId [get, set]
 The internal user id More...
 
string FriendlyName [get, set]
 The friendly name of the user More...
 
string Mention [get, set]
 The text to mention the user More...
 
Channel Channel [get, set]
 The Components.Chat.Channel the user spoke from More...
 
+

Detailed Description

+

Represents a tgs_chat_user datum

+ +

Definition at line 10 of file User.cs.

+

Property Documentation

+ +

◆ Channel

+ +
+
+ + + + + +
+ + + + +
Channel Tgstation.Server.Host.Components.Chat.User.Channel
+
+getset
+
+ +

The Components.Chat.Channel the user spoke from

+ +

Definition at line 40 of file User.cs.

+
40 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ProcessMessage().

+ +
+
+ +

◆ FriendlyName

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.User.FriendlyName
+
+getset
+
+ +

The friendly name of the user

+ +

Definition at line 30 of file User.cs.

+
30 { get; set; }
+
+
+ +

◆ Id

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.User.Id
+
+getset
+
+ +

Backing field for RealId. Represented as a string to avoid BYOND percision loss

+ +

Definition at line 15 of file User.cs.

+
15 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Client_MessageReceived().

+ +
+
+ +

◆ Mention

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.User.Mention
+
+getset
+
+ +

The text to mention the user

+ +

Definition at line 35 of file User.cs.

+
35 { get; set; }
+
+
+ +

◆ RealId

+ +
+
+ + + + + +
+ + + + +
ulong Tgstation.Server.Host.Components.Chat.User.RealId
+
+getset
+
+ +

The internal user id

+ +

Definition at line 22 of file User.cs.

+
22  {
23  get => UInt64.Parse(Id, CultureInfo.InvariantCulture);
24  set => Id = value.ToString(CultureInfo.InvariantCulture);
25  }
string Id
Backing field for RealId. Represented as a string to avoid BYOND percision loss
Definition: User.cs:15
+
+
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Host/Components/Chat/User.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory-members.html new file mode 100644 index 0000000000..83ded4ab50 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory-members.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Compiler.DmbFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Compiler.DmbFactory, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + +
CleanJob(CompileJob job)Tgstation.Server.Host.Components.Compiler.DmbFactoryprivate
CleanUnusedCompileJobs(CompileJob exceptThisOne, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Compiler.DmbFactory
cleanupCtsTgstation.Server.Host.Components.Compiler.DmbFactoryprivate
cleanupTaskTgstation.Server.Host.Components.Compiler.DmbFactoryprivate
databaseContextFactoryTgstation.Server.Host.Components.Compiler.DmbFactoryprivate
Dispose()Tgstation.Server.Host.Components.Compiler.DmbFactory
DmbAvailableTgstation.Server.Host.Components.Compiler.DmbFactory
DmbFactory(IDatabaseContextFactory databaseContextFactory, IIOManager ioManager, ILogger< DmbFactory > logger, Api.Models.Instance instance)Tgstation.Server.Host.Components.Compiler.DmbFactory
FromCompileJob(CompileJob compileJob, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Compiler.DmbFactory
instanceTgstation.Server.Host.Components.Compiler.DmbFactoryprivate
ioManagerTgstation.Server.Host.Components.Compiler.DmbFactoryprivate
jobLockCountsTgstation.Server.Host.Components.Compiler.DmbFactoryprivate
LoadCompileJob(CompileJob job, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Compiler.DmbFactory
LockNextDmb(int lockCount)Tgstation.Server.Host.Components.Compiler.DmbFactory
loggerTgstation.Server.Host.Components.Compiler.DmbFactoryprivate
newerDmbTcsTgstation.Server.Host.Components.Compiler.DmbFactoryprivate
nextDmbProviderTgstation.Server.Host.Components.Compiler.DmbFactoryprivate
OnNewerDmbTgstation.Server.Host.Components.Compiler.DmbFactory
StartAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Compiler.DmbFactory
StopAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Compiler.DmbFactory
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html new file mode 100644 index 0000000000..0dbb58732b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html @@ -0,0 +1,836 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Compiler.DmbFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Compiler.DmbFactory Class Reference
+
+
+ +

Standard IDmbFactory + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Compiler.DmbFactory:
+
+
+ + +Tgstation.Server.Host.Components.Compiler.IDmbFactory +Tgstation.Server.Host.Components.Compiler.ICompileJobConsumer +IHostedService +IDisposable + +
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 DmbFactory (IDatabaseContextFactory databaseContextFactory, IIOManager ioManager, ILogger< DmbFactory > logger, Api.Models.Instance instance)
 Construct a DmbFactory More...
 
void Dispose ()
 
async Task LoadCompileJob (CompileJob job, CancellationToken cancellationToken)
 Load a new job into the ICompileJobConsumer More...
 
IDmbProvider LockNextDmb (int lockCount)
 Gets the next IDmbProvider More...
 
Task StartAsync (CancellationToken cancellationToken)
 
async Task StopAsync (CancellationToken cancellationToken)
 
async Task< IDmbProviderFromCompileJob (CompileJob compileJob, CancellationToken cancellationToken)
 Gets a IDmbProvider for a given CompileJob More...
 
async Task CleanUnusedCompileJobs (CompileJob exceptThisOne, CancellationToken cancellationToken)
 Deletes all compile jobs that are inactive in the Game folder exceptThisOne More...
 
+ + + +

+Public Attributes

bool DmbAvailable => nextDmbProvider != null
 
+ + + + + + + + + + +

+Properties

Task OnNewerDmb [get]
 
- Properties inherited from Tgstation.Server.Host.Components.Compiler.IDmbFactory
Task OnNewerDmb [get]
 Get a Task that completes when the result of a call to LockNextDmb will be different than the previous call if any More...
 
bool DmbAvailable [get]
 If LockNextDmb will succeed More...
 
+ + + + +

+Private Member Functions

void CleanJob (CompileJob job)
 Delete the Api.Models.Internal.CompileJob.DirectoryName of job More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

readonly IDatabaseContextFactory databaseContextFactory
 The IDatabaseContextFactory for the DmbFactory More...
 
readonly IIOManager ioManager
 The IIOManager for the DmbFactory More...
 
readonly ILogger< DmbFactorylogger
 The ILogger for the DmbFactory More...
 
readonly Api.Models.Instance instance
 The Api.Models.Instance for the DmbFactory More...
 
readonly CancellationTokenSource cleanupCts
 The CancellationTokenSource for cleanupTask More...
 
readonly IDictionary< long, int > jobLockCounts
 Map of CompileJob.JobIds to locks on them. More...
 
Task cleanupTask
 Task representing calls to CleanJob(CompileJob) More...
 
TaskCompletionSource< object > newerDmbTcs
 TaskCompletionSource<TResult> resulting in the latest DmbProvider yet to exist More...
 
IDmbProvider nextDmbProvider
 The latest DmbProvider More...
 
+

Detailed Description

+

Standard IDmbFactory

+ +

Definition at line 17 of file DmbFactory.cs.

+

Constructor & Destructor Documentation

+ +

◆ DmbFactory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Compiler.DmbFactory.DmbFactory (IDatabaseContextFactory databaseContextFactory,
IIOManager ioManager,
ILogger< DmbFactorylogger,
Api.Models.Instance instance 
)
+
+ +

Construct a DmbFactory

+
Parameters
+ + + + + +
databaseContextFactoryThe value of databaseContextFactory
ioManagerThe value of ioManager
loggerThe value of logger
instanceThe value of instance
+
+
+ +

Definition at line 84 of file DmbFactory.cs.

+
85  {
86  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
87  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
88  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
89  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
90 
91  cleanupTask = Task.CompletedTask;
92  newerDmbTcs = new TaskCompletionSource<object>();
93  cleanupCts = new CancellationTokenSource();
94  jobLockCounts = new Dictionary<long, int>();
95  }
Task cleanupTask
Task representing calls to CleanJob(CompileJob)
Definition: DmbFactory.cs:65
+
readonly IIOManager ioManager
The IIOManager for the DmbFactory
Definition: DmbFactory.cs:40
+
readonly CancellationTokenSource cleanupCts
The CancellationTokenSource for cleanupTask
Definition: DmbFactory.cs:55
+
readonly ILogger< DmbFactory > logger
The ILogger for the DmbFactory
Definition: DmbFactory.cs:45
+
readonly IDictionary< long, int > jobLockCounts
Map of CompileJob.JobIds to locks on them.
Definition: DmbFactory.cs:60
+
readonly Api.Models.Instance instance
The Api.Models.Instance for the DmbFactory
Definition: DmbFactory.cs:50
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the DmbFactory
Definition: DmbFactory.cs:35
+
TaskCompletionSource< object > newerDmbTcs
TaskCompletionSource<TResult> resulting in the latest DmbProvider yet to exist
Definition: DmbFactory.cs:70
+
+

References Tgstation.Server.Host.Components.Compiler.DmbFactory.cleanupCts, Tgstation.Server.Host.Components.Compiler.DmbFactory.cleanupTask, Tgstation.Server.Host.Components.Compiler.DmbFactory.databaseContextFactory, Tgstation.Server.Host.Components.Compiler.DmbFactory.instance, Tgstation.Server.Host.Components.Compiler.DmbFactory.ioManager, Tgstation.Server.Host.Components.Compiler.DmbFactory.jobLockCounts, Tgstation.Server.Host.Components.Compiler.DmbFactory.logger, and Tgstation.Server.Host.Components.Compiler.DmbFactory.newerDmbTcs.

+ +
+
+

Member Function Documentation

+ +

◆ CleanJob()

+ +
+
+ + + + + +
+ + + + + + + + +
void Tgstation.Server.Host.Components.Compiler.DmbFactory.CleanJob (CompileJob job)
+
+private
+
+ +

Delete the Api.Models.Internal.CompileJob.DirectoryName of job

+
Parameters
+ + +
jobThe CompileJob to clean
+
+
+ +

Definition at line 104 of file DmbFactory.cs.

+
105  {
106  async Task HandleCleanup()
107  {
108  var deleteJob = ioManager.DeleteDirectory(job.DirectoryName.ToString(), cleanupCts.Token);
109  Task otherTask;
110 
111  // lock (this) //already locked below
112  otherTask = cleanupTask;
113  await Task.WhenAll(otherTask, deleteJob).ConfigureAwait(false);
114  }
115 
116  lock (this)
117  if (!jobLockCounts.TryGetValue(job.Id, out var currentVal) || currentVal == 1)
118  {
119  jobLockCounts.Remove(job.Id);
120  logger.LogDebug("Cleaning compile job {0} => {1}", job.Id, job.DirectoryName);
121  cleanupTask = HandleCleanup();
122  }
123  else
124  {
125  var decremented = --jobLockCounts[job.Id];
126  logger.LogTrace("Compile job {0} lock count now: {1}", job.Id, decremented);
127  }
128  }
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
Task cleanupTask
Task representing calls to CleanJob(CompileJob)
Definition: DmbFactory.cs:65
+ +
readonly IIOManager ioManager
The IIOManager for the DmbFactory
Definition: DmbFactory.cs:40
+
Guid? DirectoryName
The Game folder the results were compiled into
Definition: CompileJob.cs:32
+
readonly CancellationTokenSource cleanupCts
The CancellationTokenSource for cleanupTask
Definition: DmbFactory.cs:55
+
readonly ILogger< DmbFactory > logger
The ILogger for the DmbFactory
Definition: DmbFactory.cs:45
+
readonly IDictionary< long, int > jobLockCounts
Map of CompileJob.JobIds to locks on them.
Definition: DmbFactory.cs:60
+
+

References Tgstation.Server.Host.Components.Compiler.DmbFactory.cleanupCts, Tgstation.Server.Host.Components.Compiler.DmbFactory.cleanupTask, Tgstation.Server.Host.IO.IIOManager.DeleteDirectory(), Tgstation.Server.Api.Models.Internal.CompileJob.DirectoryName, Tgstation.Server.Api.Models.Internal.CompileJob.Id, Tgstation.Server.Host.Components.Compiler.DmbFactory.ioManager, Tgstation.Server.Host.Components.Compiler.DmbFactory.jobLockCounts, and Tgstation.Server.Host.Components.Compiler.DmbFactory.logger.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DmbFactory.FromCompileJob().

+ +
+
+ +

◆ CleanUnusedCompileJobs()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Compiler.DmbFactory.CleanUnusedCompileJobs (CompileJob exceptThisOne,
CancellationToken cancellationToken 
)
+
+ +

Deletes all compile jobs that are inactive in the Game folder exceptThisOne

+ +

Implements Tgstation.Server.Host.Components.Compiler.IDmbFactory.

+ +

Definition at line 243 of file DmbFactory.cs.

+
244  {
245  List<long> jobIdsToSkip;
246 
247  // don't clean locked directories
248  lock (this)
249  jobIdsToSkip = jobLockCounts.Select(x => x.Key).ToList();
250 
251  List<string> jobUidsToNotErase = null;
252 
253  // find the uids of locked directories
254  await databaseContextFactory.UseContext(async db =>
255  {
256  jobUidsToNotErase = await db.CompileJobs.Where(x => x.Job.Instance.Id == instance.Id && jobIdsToSkip.Contains(x.Id)).Select(x => x.DirectoryName.Value.ToString().ToUpperInvariant()).ToListAsync(cancellationToken).ConfigureAwait(false);
257  }).ConfigureAwait(false);
258 
259  // add the other exemption
260  if (exceptThisOne != null)
261  jobUidsToNotErase.Add(exceptThisOne.DirectoryName.Value.ToString().ToUpperInvariant());
262 
263  // cleanup
264  await ioManager.CreateDirectory(".", cancellationToken).ConfigureAwait(false);
265  var directories = await ioManager.GetDirectories(".", cancellationToken).ConfigureAwait(false);
266  int deleting = 0;
267  var tasks = directories.Select(async x =>
268  {
269  var nameOnly = ioManager.GetFileName(x);
270  if (jobUidsToNotErase.Contains(nameOnly.ToUpperInvariant()))
271  return;
272  try
273  {
274  ++deleting;
275  await ioManager.DeleteDirectory(x, cancellationToken).ConfigureAwait(false);
276  }
277  catch (OperationCanceledException)
278  {
279  throw;
280  }
281  catch (Exception e)
282  {
283  logger.LogWarning("Error deleting directory {0}! Exception: {1}", x, e);
284  }
285  }).ToList();
286  if (deleting > 0)
287  {
288  logger.LogDebug("Cleaning {0} unused game folders...", deleting);
289  await Task.WhenAll().ConfigureAwait(false);
290  }
291  }
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
Task< IReadOnlyList< string > > GetDirectories(string path, CancellationToken cancellationToken)
Returns directory names in a given path
+
readonly IIOManager ioManager
The IIOManager for the DmbFactory
Definition: DmbFactory.cs:40
+
Guid? DirectoryName
The Game folder the results were compiled into
Definition: CompileJob.cs:32
+
Task CreateDirectory(string path, CancellationToken cancellationToken)
Create a directory at path
+
string GetFileName(string path)
Gets the file name portion of a path
+
readonly ILogger< DmbFactory > logger
The ILogger for the DmbFactory
Definition: DmbFactory.cs:45
+
readonly IDictionary< long, int > jobLockCounts
Map of CompileJob.JobIds to locks on them.
Definition: DmbFactory.cs:60
+
readonly Api.Models.Instance instance
The Api.Models.Instance for the DmbFactory
Definition: DmbFactory.cs:50
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the DmbFactory
Definition: DmbFactory.cs:35
+
+

References Tgstation.Server.Host.IO.IIOManager.CreateDirectory(), Tgstation.Server.Host.Components.Compiler.DmbFactory.databaseContextFactory, Tgstation.Server.Host.IO.IIOManager.DeleteDirectory(), Tgstation.Server.Api.Models.Internal.CompileJob.DirectoryName, Tgstation.Server.Host.IO.IIOManager.GetDirectories(), Tgstation.Server.Host.IO.IIOManager.GetFileName(), Tgstation.Server.Host.Components.Compiler.DmbFactory.instance, Tgstation.Server.Host.Components.Compiler.DmbFactory.ioManager, Tgstation.Server.Host.Components.Compiler.DmbFactory.jobLockCounts, Tgstation.Server.Host.Components.Compiler.DmbFactory.logger, and Tgstation.Server.Host.Core.IDatabaseContextFactory.UseContext().

+ +
+
+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Compiler.DmbFactory.Dispose ()
+
+ +

+ +
+
+ +

◆ FromCompileJob()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task<IDmbProvider> Tgstation.Server.Host.Components.Compiler.DmbFactory.FromCompileJob (CompileJob compileJob,
CancellationToken cancellationToken 
)
+
+ +

Gets a IDmbProvider for a given CompileJob

+ +

Implements Tgstation.Server.Host.Components.Compiler.IDmbFactory.

+ +

Definition at line 186 of file DmbFactory.cs.

+
187  {
188  if (compileJob == null)
189  throw new ArgumentNullException(nameof(compileJob));
190 
191  // ensure we have the entire compile job tree
192  await databaseContextFactory.UseContext(async db => compileJob = await db.CompileJobs.Where(x => x.Id == compileJob.Id)
193  .Include(x => x.Job).ThenInclude(x => x.StartedBy)
194  .Include(x => x.RevisionInformation).ThenInclude(x => x.PrimaryTestMerge).ThenInclude(x => x.MergedBy)
195  .Include(x => x.RevisionInformation).ThenInclude(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy)
196  .FirstAsync(cancellationToken).ConfigureAwait(false)).ConfigureAwait(false); // can't wait to see that query
197 
198  logger.LogTrace("Loading compile job {0}...", compileJob.Id);
199  var providerSubmitted = false;
200  var newProvider = new DmbProvider(compileJob, ioManager, () =>
201  {
202  if (providerSubmitted)
203  CleanJob(compileJob);
204  });
205 
206  try
207  {
208  var primaryCheckTask = ioManager.FileExists(ioManager.ConcatPath(newProvider.PrimaryDirectory, newProvider.DmbName), cancellationToken);
209  var secondaryCheckTask = ioManager.FileExists(ioManager.ConcatPath(newProvider.PrimaryDirectory, newProvider.DmbName), cancellationToken);
210 
211  if (!(await primaryCheckTask.ConfigureAwait(false) && await secondaryCheckTask.ConfigureAwait(false)))
212  {
213  logger.LogWarning("Error loading compile job, .dmb missing!");
214  return null; // omae wa mou shinderu
215  }
216 
217  lock (this)
218  {
219  if (!jobLockCounts.TryGetValue(compileJob.Id, out int value))
220  {
221  value = 1;
222  jobLockCounts.Add(compileJob.Id, 1);
223  }
224  else
225  jobLockCounts[compileJob.Id] = ++value;
226 
227  logger.LogTrace("Compile job {0} lock count now: {1}", compileJob.Id, value);
228 
229  providerSubmitted = true;
230  return newProvider;
231  }
232  }
233  finally
234  {
235  if (!providerSubmitted)
236  newProvider.Dispose();
237  }
238  }
+
readonly IIOManager ioManager
The IIOManager for the DmbFactory
Definition: DmbFactory.cs:40
+
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists
+
readonly ILogger< DmbFactory > logger
The ILogger for the DmbFactory
Definition: DmbFactory.cs:45
+
readonly IDictionary< long, int > jobLockCounts
Map of CompileJob.JobIds to locks on them.
Definition: DmbFactory.cs:60
+
void CleanJob(CompileJob job)
Delete the Api.Models.Internal.CompileJob.DirectoryName of job
Definition: DmbFactory.cs:104
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the DmbFactory
Definition: DmbFactory.cs:35
+
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
+

References Tgstation.Server.Host.Components.Compiler.DmbFactory.CleanJob(), Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.Components.Compiler.DmbFactory.databaseContextFactory, Tgstation.Server.Host.IO.IIOManager.FileExists(), Tgstation.Server.Api.Models.Internal.CompileJob.Id, Tgstation.Server.Host.Components.Compiler.DmbFactory.ioManager, Tgstation.Server.Host.Components.Compiler.DmbFactory.jobLockCounts, Tgstation.Server.Host.Components.Compiler.DmbFactory.logger, and Tgstation.Server.Host.Core.IDatabaseContextFactory.UseContext().

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.HandlerMonitorWakeup(), and Tgstation.Server.Host.Components.Compiler.DmbFactory.LoadCompileJob().

+ +
+
+ +

◆ LoadCompileJob()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Compiler.DmbFactory.LoadCompileJob (CompileJob job,
CancellationToken cancellationToken 
)
+
+ +

Load a new job into the ICompileJobConsumer

+ +

Implements Tgstation.Server.Host.Components.Compiler.ICompileJobConsumer.

+ +

Definition at line 131 of file DmbFactory.cs.

+
132  {
133  if (job == null)
134  throw new ArgumentNullException(nameof(job));
135 
136  var newProvider = await FromCompileJob(job, cancellationToken).ConfigureAwait(false);
137  if (newProvider == null)
138  return;
139  lock (this)
140  {
141  nextDmbProvider?.Dispose();
142  nextDmbProvider = newProvider;
143  newerDmbTcs.SetResult(nextDmbProvider);
144  newerDmbTcs = new TaskCompletionSource<object>();
145  }
146  }
IDmbProvider nextDmbProvider
The latest DmbProvider
Definition: DmbFactory.cs:75
+
async Task< IDmbProvider > FromCompileJob(CompileJob compileJob, CancellationToken cancellationToken)
Gets a IDmbProvider for a given CompileJob
Definition: DmbFactory.cs:186
+
TaskCompletionSource< object > newerDmbTcs
TaskCompletionSource<TResult> resulting in the latest DmbProvider yet to exist
Definition: DmbFactory.cs:70
+
+

References Tgstation.Server.Host.Components.Compiler.DmbFactory.FromCompileJob(), Tgstation.Server.Host.Components.Compiler.DmbFactory.newerDmbTcs, and Tgstation.Server.Host.Components.Compiler.DmbFactory.nextDmbProvider.

+ +
+
+ +

◆ LockNextDmb()

+ +
+
+ + + + + + + + +
IDmbProvider Tgstation.Server.Host.Components.Compiler.DmbFactory.LockNextDmb (int lockCount)
+
+ +

Gets the next IDmbProvider

+ +

Implements Tgstation.Server.Host.Components.Compiler.IDmbFactory.

+ +

Definition at line 149 of file DmbFactory.cs.

+
150  {
151  if (!DmbAvailable)
152  throw new InvalidOperationException("No .dmb available!");
153  if (lockCount < 0)
154  throw new ArgumentOutOfRangeException(nameof(lockCount), lockCount, "lockCount must be greater than or equal to 0!");
155  lock (this)
156  {
157  var jobId = nextDmbProvider.CompileJob.Id;
158  var incremented = jobLockCounts[jobId] += lockCount;
159  logger.LogTrace("Compile job {0} lock count now: {1}", jobId, incremented);
160  return nextDmbProvider;
161  }
162  }
IDmbProvider nextDmbProvider
The latest DmbProvider
Definition: DmbFactory.cs:75
+
CompileJob CompileJob
The CompileJob of the .dmb
Definition: IDmbProvider.cs:29
+ +
readonly ILogger< DmbFactory > logger
The ILogger for the DmbFactory
Definition: DmbFactory.cs:45
+
readonly IDictionary< long, int > jobLockCounts
Map of CompileJob.JobIds to locks on them.
Definition: DmbFactory.cs:60
+ +
+

References Tgstation.Server.Host.Components.IDmbProvider.CompileJob, Tgstation.Server.Host.Components.Compiler.DmbFactory.DmbAvailable, Tgstation.Server.Api.Models.Internal.CompileJob.Id, Tgstation.Server.Host.Components.Compiler.DmbFactory.jobLockCounts, Tgstation.Server.Host.Components.Compiler.DmbFactory.logger, and Tgstation.Server.Host.Components.Compiler.DmbFactory.nextDmbProvider.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.HandlerMonitorWakeup(), Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.InitControllers(), and Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.InitControllers().

+ +
+
+ +

◆ StartAsync()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.Compiler.DmbFactory.StartAsync (CancellationToken cancellationToken)
+
+ +

+ +
+
+ +

◆ StopAsync()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Compiler.DmbFactory.StopAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 178 of file DmbFactory.cs.

+
179  {
180  using (cancellationToken.Register(() => cleanupCts.Cancel()))
181  await cleanupTask.ConfigureAwait(false);
182  }
Task cleanupTask
Task representing calls to CleanJob(CompileJob)
Definition: DmbFactory.cs:65
+
readonly CancellationTokenSource cleanupCts
The CancellationTokenSource for cleanupTask
Definition: DmbFactory.cs:55
+
+

References Tgstation.Server.Host.Components.Compiler.DmbFactory.cleanupCts, and Tgstation.Server.Host.Components.Compiler.DmbFactory.cleanupTask.

+ +
+
+

Member Data Documentation

+ +

◆ cleanupCts

+ +
+
+ + + + + +
+ + + + +
readonly CancellationTokenSource Tgstation.Server.Host.Components.Compiler.DmbFactory.cleanupCts
+
+private
+
+
+ +

◆ cleanupTask

+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Components.Compiler.DmbFactory.cleanupTask
+
+private
+
+
+ +

◆ databaseContextFactory

+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContextFactory Tgstation.Server.Host.Components.Compiler.DmbFactory.databaseContextFactory
+
+private
+
+
+ +

◆ DmbAvailable

+ +
+
+ + + + +
bool Tgstation.Server.Host.Components.Compiler.DmbFactory.DmbAvailable => nextDmbProvider != null
+
+ +

+ +

Definition at line 30 of file DmbFactory.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DmbFactory.LockNextDmb().

+ +
+
+ +

◆ instance

+ +
+
+ + + + + +
+ + + + +
readonly Api.Models.Instance Tgstation.Server.Host.Components.Compiler.DmbFactory.instance
+
+private
+
+
+ +

◆ ioManager

+ + + +

◆ jobLockCounts

+ +
+
+ + + + + +
+ + + + +
readonly IDictionary<long, int> Tgstation.Server.Host.Components.Compiler.DmbFactory.jobLockCounts
+
+private
+
+
+ +

◆ logger

+ + + +

◆ newerDmbTcs

+ +
+
+ + + + + +
+ + + + +
TaskCompletionSource<object> Tgstation.Server.Host.Components.Compiler.DmbFactory.newerDmbTcs
+
+private
+
+ +

TaskCompletionSource<TResult> resulting in the latest DmbProvider yet to exist

+ +

Definition at line 70 of file DmbFactory.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DmbFactory.DmbFactory(), and Tgstation.Server.Host.Components.Compiler.DmbFactory.LoadCompileJob().

+ +
+
+ +

◆ nextDmbProvider

+ +
+
+ + + + + +
+ + + + +
IDmbProvider Tgstation.Server.Host.Components.Compiler.DmbFactory.nextDmbProvider
+
+private
+
+
+

Property Documentation

+ +

◆ OnNewerDmb

+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Components.Compiler.DmbFactory.OnNewerDmb
+
+get
+
+ +

+ +

Definition at line 21 of file DmbFactory.cs.

+
21  {
22  get
23  {
24  lock (this)
25  return newerDmbTcs.Task;
26  }
27  }
TaskCompletionSource< object > newerDmbTcs
TaskCompletionSource<TResult> resulting in the latest DmbProvider yet to exist
Definition: DmbFactory.cs:70
+
+

Referenced by Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.MonitorLifetimes(), and Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.MonitorLifetimes().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..2f35a35f7a870580053ed4b86afae6efb8a4676a GIT binary patch literal 2710 zcmdUxcT^Mk7RM=xVj`dvrRT6jf+$iH2}+Z?krs+X=?aL_k&@t2mZ*TsO4f)X9X3*Y zf*>FW$pR4t0|*Mz7DD2Nwv-S;F+d(zwIO=OlXCWa`CSa$Di2_G-edHu?l0)0MS_uRKz?_+1jUl}L0kC%W*49?= z-7y$&DHiSQ;35Ph?Q8>`u6ja3kRvF|bFMhy1^Q_0FBB=O&xA=`oWN#0KY}YP#vi34 ztJ4C_YP7m8=$CllpedK-I(7E9*K z4N?FCT5Y1%UU>>^AAPQ1l}(;pT&e5QS2Ie_%6S0h0XC9ziKJbk9e+w^pr{Z<~r6(_LJMAX}dp7xHRXT^8Y z4yGn-%$>Zy(o~lvex)-YsfvlJk+P*CRAG0vIz_ywp9`0AV>z`QE{ljc>eFC@XLbEF z_=rl22Zy$ChBkm5M&QHG{9b7Y)Y5zmc1MMrXvKk#9B=XDtPduT!fRe2Xt4k)E~e4@ zY?hwkf|v^xF&Xm{o9G|RcczxbU7DEcdyIwCN_Ugwq1$EV65tq~aTu&uC3m_;5yPDD zCx#GwGO zsYDDPuosiLnCd1SlBN!VRGgdJciQsb(}O?U#EXBtZI-Nm&6t{U&Ag~pp{~H!;y>>4 zuQIm=|GSKD3uCb>v4s&1)<73UPu~&&j}svhU*Ec6yB^dL&zE8O2bZ*+`FHJ;6R({~SE!c8WM50i~Ln z%sMiV`+5YM60rJP+N9_sIjHsyRT~sn?ThWg-DILÜlY>^^f+aVw1NCeM`Z7(?` zZL|kOY!k4&uc?BH6h^XXNDwJ0b=<>_9Fpi9HjkkdV{RujT-bXyUoe zA*lhvp2{9bW=GvU z!u$%)1PQ53mC2e0Oy3p%J-|92=_0W7kd-Q~}IS)eepF?OP#%$-^KmNnALFhsE< zTsV@14U&Na!#}4Ww?Fs$Gr812h{@3}w&*OYQ=0W&M0wU!2 zSYF9;r}{GEe5g~c9~k!Z@#I(-G%+%$?(PY&U}O;n7JMogoG(%yVxm-)Ba6ulT_(3 zQgf@%ez}k0wYsVCs#gM?4_BJ9HUl@?wWwA5xk=FNY^S8z_K_i^ zdP5l&y9cJh!T^jpGC0Y>m!*RVj1%)d*}N> zh1mu0s=$|x{DrKID!jogs)ot1WQl?c=P#kSR}#~ilHy4&9BX6RL^+d#BrGz?^hcTt z4Px8FGY!}sKX2C$-PQc*`W?NWDEynf|Np2etQ}Rk|5qaMw^gOsj5;yA5KFEZU5M2N zLu4)z9v!0OTor~?*x5q8?Q4a=ZlxvQs?tl}iX7|j!(;l7n%V@QoE)O7mgAnZ_{)OSLn&lTi$W$gvwy2_1;pq2#snz$%lj7AMY}& znPkC>*FS0Vq(v{^@YG#qn+<_{RtiC>U_dcLZXrN|TAze1-p}>TU!E_wSS)@KEY_xr z^FEk(BNuWYi91r!l$oazNm=7n{Q97yk_E~N?i)yUs8oz1-&kMSDviu;)*0K;*N4C` zCmmbMCY^?u*-sly_#?>u-n%3Tr zeab}p1{6r~orklyg`*}TM_+j8g{c^{RQ0~M>9%iLd*|Up8sQs#c-g2mzDzMu!p<(` zO{)PK&-tq0Q2dhxRHp~t(Gr;v*|hY?vfsu?n|Gx|&V!f6#7@=Y*l}@9YCM*33NW%h z$59tUll;M9DgmLgzk6N62ntZ4~-vPHYmd(Ui10#m1Z{(Deq`66sa1_Kcl&8m))s>nu z0@caCz6!4SSP*V#{0naNTG9RQYT1)U615bgS+*I%ATa7IqmIIt%d-Gw+$u=2_m*P= zgQ~UD2;=Ud`DS2>i}CpffHaGPyKY~vh0|>@=j`oxz6(mDk{;#~!&3w$Mb7|D`oEf{ zu8uiy3JTD5cjpAaWIDUVEcqVC)VtWazEkAv4Db^vgtBt5d~WWG{|#@h BAjALw literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider-members.html new file mode 100644 index 0000000000..24844287e5 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider-members.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Compiler.DmbProvider Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html new file mode 100644 index 0000000000..edbde92081 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html @@ -0,0 +1,387 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Compiler.DmbProvider Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Compiler.DmbProvider Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Compiler.DmbProvider:
+
+
+ + +Tgstation.Server.Host.Components.IDmbProvider +IDisposable + +
+ + + + + + + + + + +

+Public Member Functions

 DmbProvider (CompileJob compileJob, IIOManager ioManager, Action onDispose)
 Construct a DmbProvider More...
 
void Dispose ()
 
void KeepAlive ()
 Disposing the IDmbProvider won't cause a cleanup of the working directory More...
 
+ + + + + + + +

+Public Attributes

string DmbName => String.Concat(CompileJob.DmeName, DreamMaker.DmbExtension)
 
string PrimaryDirectory => ioManager.ResolvePath(ioManager.ConcatPath(CompileJob.DirectoryName.ToString(), DreamMaker.ADirectoryName))
 
string SecondaryDirectory => ioManager.ResolvePath(ioManager.ConcatPath(CompileJob.DirectoryName.ToString(), DreamMaker.BDirectoryName))
 
+ + + + + + + + + + + + + + + + + +

+Properties

CompileJob CompileJob [get]
 The CompileJob for the DmbProvider More...
 
- Properties inherited from Tgstation.Server.Host.Components.IDmbProvider
string DmbName [get]
 The file name of the .dmb More...
 
string PrimaryDirectory [get]
 The primary game directory with a trailing directory separator More...
 
string SecondaryDirectory [get]
 The secondary game directory with a trailing directory separator More...
 
CompileJob CompileJob [get]
 The CompileJob of the .dmb More...
 
+ + + + + + + +

+Private Attributes

readonly IIOManager ioManager
 The IIOManager for the DmbProvider More...
 
Action onDispose
 The Action to run when Dispose is called More...
 
+

Detailed Description

+
+

Definition at line 8 of file DmbProvider.cs.

+

Constructor & Destructor Documentation

+ +

◆ DmbProvider()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Compiler.DmbProvider.DmbProvider (CompileJob compileJob,
IIOManager ioManager,
Action onDispose 
)
+
+ +

Construct a DmbProvider

+
Parameters
+ + + + +
compileJobThe value of CompileJob
ioManagerThe value of ioManager
onDisposeThe value of onDispose
+
+
+ +

Definition at line 40 of file DmbProvider.cs.

+
41  {
42  CompileJob = compileJob ?? throw new ArgumentNullException(nameof(compileJob));
43  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
44  this.onDispose = onDispose ?? throw new ArgumentNullException(nameof(onDispose));
45  }
Action onDispose
The Action to run when Dispose is called
Definition: DmbProvider.cs:32
+
readonly IIOManager ioManager
The IIOManager for the DmbProvider
Definition: DmbProvider.cs:27
+ +
+

References Tgstation.Server.Host.Components.Compiler.DmbProvider.ioManager, and Tgstation.Server.Host.Components.Compiler.DmbProvider.onDispose.

+ +
+
+

Member Function Documentation

+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Compiler.DmbProvider.Dispose ()
+
+ +

+ +
+
+ +

◆ KeepAlive()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Compiler.DmbProvider.KeepAlive ()
+
+ +

Disposing the IDmbProvider won't cause a cleanup of the working directory

+ +

Implements Tgstation.Server.Host.Components.IDmbProvider.

+ +
+
+

Member Data Documentation

+ +

◆ DmbName

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Compiler.DmbProvider.DmbName => String.Concat(CompileJob.DmeName, DreamMaker.DmbExtension)
+
+ +

+ +

Definition at line 11 of file DmbProvider.cs.

+ +
+
+ +

◆ ioManager

+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.Compiler.DmbProvider.ioManager
+
+private
+
+ +

The IIOManager for the DmbProvider

+ +

Definition at line 27 of file DmbProvider.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DmbProvider.DmbProvider().

+ +
+
+ +

◆ onDispose

+ +
+
+ + + + + +
+ + + + +
Action Tgstation.Server.Host.Components.Compiler.DmbProvider.onDispose
+
+private
+
+ +

The Action to run when Dispose is called

+ +

Definition at line 32 of file DmbProvider.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DmbProvider.DmbProvider().

+ +
+
+ +

◆ PrimaryDirectory

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Compiler.DmbProvider.PrimaryDirectory => ioManager.ResolvePath(ioManager.ConcatPath(CompileJob.DirectoryName.ToString(), DreamMaker.ADirectoryName))
+
+ +

+ +

Definition at line 14 of file DmbProvider.cs.

+ +
+
+ +

◆ SecondaryDirectory

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Compiler.DmbProvider.SecondaryDirectory => ioManager.ResolvePath(ioManager.ConcatPath(CompileJob.DirectoryName.ToString(), DreamMaker.BDirectoryName))
+
+ +

+ +

Definition at line 17 of file DmbProvider.cs.

+ +
+
+

Property Documentation

+ +

◆ CompileJob

+ +
+
+ + + + + +
+ + + + +
CompileJob Tgstation.Server.Host.Components.Compiler.DmbProvider.CompileJob
+
+get
+
+ +

The CompileJob for the DmbProvider

+ +

Definition at line 22 of file DmbProvider.cs.

+
22 { get; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.png new file mode 100644 index 0000000000000000000000000000000000000000..35195ae16937054ca10b6a00d39298eccd6bdc46 GIT binary patch literal 1539 zcmb`Hdr*>D7{)&{$}DEP+NNz-VWp;)S&pD-mMNB);3d&=*VQdk^M+t5SXo=HCWfw* z0=9;JnPs`&7TpAM%-iM-H99RZ1?7y9vbI$XedC$xl^9=0076h9l`;C4qmIT>gj6NNTc~p+U?t8N4;G%8jV(tPs-wHkF&Ju(^O~2$83`qc`$K&W_ z*QUJbnRdsO4WerKZGr4`HU}}5&5~>%Z>ZQsF@ZouZ``o51gWx9ZJ|;mj%wu)gF{x_ z3$?&l{TGEsHpB2%{4Zg?fDpd7sy`3LmyRsw1Dqc~pd^{%Z|1a(q@UI1QBt%B84Lo# zfgMhk+Jkh~qQAA4J7D@%Ew3f)epMbJ+#}TtbC^zl`1$$P|C{z4RB5llh}}zHNJ!FJ zUN+~Meg2eDlx*Sx^73l+Bzt`2nG%os=wWAiS!^gfQzsRVF-)-M<+gGKwu>`5egomQoOv(Po&1{5sIgL>LLmTDR;eVS2zDO@k)_qakGM; z*Ne(qY}XQNn*HGd8hh}hMQ69~sVX;7w_jr>rOSnglD-?a7S5;lG9Gqk`eTbPB3bXs z1RcHNmn~s#H39oxc89P@6K^BI#*vNpRJ+{*eJq3r-fKo?iBq&ewdBr*6Idp@OvRX) zC3>jR1ntc}5-N&p80gWj7E)`!sT_WF@_~va5bn2&7tL*y<1whwfH5`cURe^w-n{Pq zZ)gjpo08ca$77Lq9|O}H!+nlMS6Q8UD(OmlMOft@rz7Q*f zs=}-=DOXY&plT!%(w*PVbf;hE_zjdGM}t9nPCCmSXGt={aEF-v9~)vPKwTOHEHQ?o zVQ!-n?KmCla{PJkv+fq_j8~yyEl&>XXq)7G;N)84^;+A6{i;^sf<0o|l!J3OTnp%C zUHX#Qb}`YR{JbwgMzSS4s#ozdiV(M~0#u2{#yON8@WLB}HC2hrcN5kCSBW#kWFzLH z7540)xERUoH7BPXYc_xviVftQNk2+m2kjog+f{G&qiCB&RJJFAN2_VH321c4zvS8t zEd*cN<99B2GE=dx8d!J&o*gj(qyV-;VfZBTMNMA6PoN?=~LX&V{R6JG-d7#7FW6OHl-61tnHoDcw2= zuJ2Gy9Y0|!NtligI7ptAU6(J*7^9-4!M7w6WLmSmh?}yxOFe|Bc}kgikx1U+*{N!P z{^- SOlW^>0ONu^RObBs#eV?A;0Bxk literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker-members.html new file mode 100644 index 0000000000..2118cd2c73 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker-members.html @@ -0,0 +1,111 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Compiler.DreamMaker Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Compiler.DreamMaker, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
ADirectoryNameTgstation.Server.Host.Components.Compiler.DreamMaker
applicationTgstation.Server.Host.Components.Compiler.DreamMakerprivate
BDirectoryNameTgstation.Server.Host.Components.Compiler.DreamMaker
byondTgstation.Server.Host.Components.Compiler.DreamMakerprivate
chatTgstation.Server.Host.Components.Compiler.DreamMakerprivate
CleanupFailedCompile(Models.CompileJob job, bool cancelled, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Compiler.DreamMakerprivate
Compile(Models.RevisionInformation revisionInformation, Api.Models.DreamMaker dreamMakerSettings, uint apiValidateTimeout, IRepository repository, Action< int > progressReporter, TimeSpan? estimatedDuration, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Compiler.DreamMaker
Tgstation::Server::Host::Components::Compiler::IDreamMaker.Compile(Models.RevisionInformation revisionInformation, Api.Models.DreamMaker dreamMakerSettings, uint apiValidateTimeout, IRepository repository, Action< int > progressReporter, TimeSpan? estimatedDuration, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Compiler.IDreamMaker
compileJobConsumerTgstation.Server.Host.Components.Compiler.DreamMakerprivate
compilingTgstation.Server.Host.Components.Compiler.DreamMakerprivate
configurationTgstation.Server.Host.Components.Compiler.DreamMakerprivate
DmbExtensionTgstation.Server.Host.Components.Compiler.DreamMaker
DmeExtensionTgstation.Server.Host.Components.Compiler.DreamMakerprivate
DreamMaker(IByondManager byond, IIOManager ioManager, StaticFiles.IConfiguration configuration, ISessionControllerFactory sessionControllerFactory, ICompileJobConsumer compileJobConsumer, IApplication application, IEventConsumer eventConsumer, IChat chat, IProcessExecutor processExecutor, IWatchdog watchdog, ILogger< DreamMaker > logger)Tgstation.Server.Host.Components.Compiler.DreamMaker
eventConsumerTgstation.Server.Host.Components.Compiler.DreamMakerprivate
ioManagerTgstation.Server.Host.Components.Compiler.DreamMakerprivate
loggerTgstation.Server.Host.Components.Compiler.DreamMakerprivate
ModifyDme(Models.CompileJob job, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Compiler.DreamMakerprivate
processExecutorTgstation.Server.Host.Components.Compiler.DreamMakerprivate
ProgressTask(Action< int > progressReporter, TimeSpan estimatedDuration, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Compiler.DreamMakerprivatestatic
RunCompileJob(Models.CompileJob job, Api.Models.DreamMaker dreamMakerSettings, IByondExecutableLock byondLock, IRepository repository, uint apiValidateTimeout, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Compiler.DreamMakerprivate
RunDreamMaker(string dreamMakerPath, Models.CompileJob job, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Compiler.DreamMakerprivate
SendDeploymentMessage(Models.RevisionInformation revisionInformation, IByondExecutableLock byondLock, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Compiler.DreamMakerprivate
sessionControllerFactoryTgstation.Server.Host.Components.Compiler.DreamMakerprivate
VerifyApi(uint timeout, DreamDaemonSecurity securityLevel, Models.CompileJob job, IByondExecutableLock byondLock, ushort portToUse, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Compiler.DreamMakerprivate
watchdogTgstation.Server.Host.Components.Compiler.DreamMakerprivate
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html new file mode 100644 index 0000000000..c17dbcb902 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html @@ -0,0 +1,1331 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Compiler.DreamMaker Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Compiler.DreamMaker Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Compiler.DreamMaker:
+
+
+ + +Tgstation.Server.Host.Components.Compiler.IDreamMaker + +
+ + + + + + + + + + + +

+Public Member Functions

 DreamMaker (IByondManager byond, IIOManager ioManager, StaticFiles.IConfiguration configuration, ISessionControllerFactory sessionControllerFactory, ICompileJobConsumer compileJobConsumer, IApplication application, IEventConsumer eventConsumer, IChat chat, IProcessExecutor processExecutor, IWatchdog watchdog, ILogger< DreamMaker > logger)
 Construct DreamMaker More...
 
async Task< Models.CompileJobCompile (Models.RevisionInformation revisionInformation, Api.Models.DreamMaker dreamMakerSettings, uint apiValidateTimeout, IRepository repository, Action< int > progressReporter, TimeSpan? estimatedDuration, CancellationToken cancellationToken)
 
- Public Member Functions inherited from Tgstation.Server.Host.Components.Compiler.IDreamMaker
Task< Models.CompileJobCompile (Models.RevisionInformation revisionInformation, Api.Models.DreamMaker dreamMakerSettings, uint apiValidateTimeout, IRepository repository, Action< int > progressReporter, TimeSpan? estimatedDuration, CancellationToken cancellationToken)
 Starts a compile More...
 
+ + + + + + + + + + +

+Public Attributes

const string ADirectoryName = "A"
 Name of the primary directory used for compilation More...
 
const string BDirectoryName = "B"
 Name of the secondary directory used for compilation More...
 
const string DmbExtension = ".dmb"
 Extension for .dmbs More...
 
+ + + + + + + + + + + + + + + + + + + +

+Private Member Functions

async Task VerifyApi (uint timeout, DreamDaemonSecurity securityLevel, Models.CompileJob job, IByondExecutableLock byondLock, ushort portToUse, CancellationToken cancellationToken)
 Run a quick DD instance to test the DMAPI is installed on the target code More...
 
async Task< int > RunDreamMaker (string dreamMakerPath, Models.CompileJob job, CancellationToken cancellationToken)
 Compiles a .dme with DreamMaker More...
 
async Task ModifyDme (Models.CompileJob job, CancellationToken cancellationToken)
 Adds server side includes to the .dme being compiled More...
 
async Task CleanupFailedCompile (Models.CompileJob job, bool cancelled, CancellationToken cancellationToken)
 Cleans up a failed compile job More...
 
async Task SendDeploymentMessage (Models.RevisionInformation revisionInformation, IByondExecutableLock byondLock, CancellationToken cancellationToken)
 Send a message to chat about a deployment More...
 
async Task RunCompileJob (Models.CompileJob job, Api.Models.DreamMaker dreamMakerSettings, IByondExecutableLock byondLock, IRepository repository, uint apiValidateTimeout, CancellationToken cancellationToken)
 Executes and populate a given job More...
 
+ + + + +

+Static Private Member Functions

static async Task ProgressTask (Action< int > progressReporter, TimeSpan estimatedDuration, CancellationToken cancellationToken)
 Gradually triggers a given progressReporter over a given estimatedDuration More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

const string DmeExtension = "dme"
 Extension for .dmes More...
 
readonly IByondManager byond
 The IByondManager for DreamMaker More...
 
readonly IIOManager ioManager
 The IIOManager for DreamMaker More...
 
readonly StaticFiles.IConfiguration configuration
 The StaticFiles.IConfiguration for DreamMaker More...
 
readonly ISessionControllerFactory sessionControllerFactory
 The ISessionControllerFactory for DreamMaker More...
 
readonly ICompileJobConsumer compileJobConsumer
 The ICompileJobConsumer for DreamMaker More...
 
readonly IApplication application
 The IApplication for DreamMaker More...
 
readonly IEventConsumer eventConsumer
 The IEventConsumer for DreamMaker More...
 
readonly IChat chat
 The IChat for DreamMaker More...
 
readonly IProcessExecutor processExecutor
 The IProcessExecutor for DreamMaker More...
 
readonly IWatchdog watchdog
 The IWatchdog for DreamMaker More...
 
readonly ILogger< DreamMakerlogger
 The ILogger for DreamMaker More...
 
bool compiling
 If a compile job is running More...
 
+

Detailed Description

+
+

Definition at line 21 of file DreamMaker.cs.

+

Constructor & Destructor Documentation

+ +

◆ DreamMaker()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Compiler.DreamMaker.DreamMaker (IByondManager byond,
IIOManager ioManager,
StaticFiles.IConfiguration configuration,
ISessionControllerFactory sessionControllerFactory,
ICompileJobConsumer compileJobConsumer,
IApplication application,
IEventConsumer eventConsumer,
IChat chat,
IProcessExecutor processExecutor,
IWatchdog watchdog,
ILogger< DreamMakerlogger 
)
+
+ +

Construct DreamMaker

+
Parameters
+ + + + + + + + + + + + +
byondThe value of byond
ioManagerThe value of ioManager
configurationThe value of configuration
sessionControllerFactoryThe value of sessionControllerFactory
compileJobConsumerThe value of compileJobConsumer
applicationThe value of application
eventConsumerThe value of eventConsumer
chatThe value of chat
processExecutorThe value of processExecutor
watchdogThe value of watchdog
loggerThe value of logger
+
+
+ +

Definition at line 140 of file DreamMaker.cs.

+
141  {
142  this.byond = byond ?? throw new ArgumentNullException(nameof(byond));
143  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
144  this.configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
145  this.sessionControllerFactory = sessionControllerFactory ?? throw new ArgumentNullException(nameof(sessionControllerFactory));
146  this.compileJobConsumer = compileJobConsumer ?? throw new ArgumentNullException(nameof(compileJobConsumer));
147  this.application = application ?? throw new ArgumentNullException(nameof(application));
148  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
149  this.chat = chat ?? throw new ArgumentNullException(nameof(chat));
150  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
151  this.watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
152  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
153  }
readonly ILogger< DreamMaker > logger
The ILogger for DreamMaker
Definition: DreamMaker.cs:96
+
readonly StaticFiles.IConfiguration configuration
The StaticFiles.IConfiguration for DreamMaker
Definition: DreamMaker.cs:56
+
readonly IProcessExecutor processExecutor
The IProcessExecutor for DreamMaker
Definition: DreamMaker.cs:86
+
readonly ISessionControllerFactory sessionControllerFactory
The ISessionControllerFactory for DreamMaker
Definition: DreamMaker.cs:61
+
readonly IEventConsumer eventConsumer
The IEventConsumer for DreamMaker
Definition: DreamMaker.cs:76
+
readonly IChat chat
The IChat for DreamMaker
Definition: DreamMaker.cs:81
+
readonly IWatchdog watchdog
The IWatchdog for DreamMaker
Definition: DreamMaker.cs:91
+
readonly ICompileJobConsumer compileJobConsumer
The ICompileJobConsumer for DreamMaker
Definition: DreamMaker.cs:66
+
readonly IIOManager ioManager
The IIOManager for DreamMaker
Definition: DreamMaker.cs:51
+
readonly IApplication application
The IApplication for DreamMaker
Definition: DreamMaker.cs:71
+
readonly IByondManager byond
The IByondManager for DreamMaker
Definition: DreamMaker.cs:46
+
+

References Tgstation.Server.Host.Components.Compiler.DreamMaker.application, Tgstation.Server.Host.Components.Compiler.DreamMaker.byond, Tgstation.Server.Host.Components.Compiler.DreamMaker.chat, Tgstation.Server.Host.Components.Compiler.DreamMaker.compileJobConsumer, Tgstation.Server.Host.Components.Compiler.DreamMaker.configuration, Tgstation.Server.Host.Components.Compiler.DreamMaker.eventConsumer, Tgstation.Server.Host.Components.Compiler.DreamMaker.ioManager, Tgstation.Server.Host.Components.Compiler.DreamMaker.logger, Tgstation.Server.Host.Components.Compiler.DreamMaker.processExecutor, Tgstation.Server.Host.Components.Compiler.DreamMaker.sessionControllerFactory, and Tgstation.Server.Host.Components.Compiler.DreamMaker.watchdog.

+ +
+
+

Member Function Documentation

+ +

◆ CleanupFailedCompile()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Compiler.DreamMaker.CleanupFailedCompile (Models.CompileJob job,
bool cancelled,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Cleans up a failed compile job

+
Parameters
+ + + + +
jobThe running Models.CompileJob
cancelledIf the job was cancelled
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 312 of file DreamMaker.cs.

+
313  {
314  logger.LogTrace("Cleaning compile directory...");
315  var chatTask = chat.SendUpdateMessage(cancelled ? "Deploy cancelled!" : "Deploy failed!", cancellationToken);
316  var jobPath = job.DirectoryName.ToString();
317  try
318  {
319  await ioManager.DeleteDirectory(jobPath, CancellationToken.None).ConfigureAwait(false);
320  }
321  catch (Exception e)
322  {
323  logger.LogWarning("Error cleaning up compile directory {0}! Exception: {1}", ioManager.ResolvePath(jobPath), e);
324  }
325 
326  await chatTask.ConfigureAwait(false);
327  }
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
readonly ILogger< DreamMaker > logger
The ILogger for DreamMaker
Definition: DreamMaker.cs:96
+
Task SendUpdateMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured update channels
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
readonly IChat chat
The IChat for DreamMaker
Definition: DreamMaker.cs:81
+
readonly IIOManager ioManager
The IIOManager for DreamMaker
Definition: DreamMaker.cs:51
+
+

References Tgstation.Server.Host.Components.Compiler.DreamMaker.chat, Tgstation.Server.Host.IO.IIOManager.DeleteDirectory(), Tgstation.Server.Host.Components.Compiler.DreamMaker.ioManager, Tgstation.Server.Host.Components.Compiler.DreamMaker.logger, Tgstation.Server.Host.IO.IIOManager.ResolvePath(), and Tgstation.Server.Host.Components.Chat.IChat.SendUpdateMessage().

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DreamMaker.RunCompileJob().

+ +
+
+ +

◆ Compile()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task<Models.CompileJob> Tgstation.Server.Host.Components.Compiler.DreamMaker.Compile (Models.RevisionInformation revisionInformation,
Api.Models.DreamMaker dreamMakerSettings,
uint apiValidateTimeout,
IRepository repository,
Action< int > progressReporter,
TimeSpan? estimatedDuration,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 461 of file DreamMaker.cs.

+
462  {
463  if (revisionInformation == null)
464  throw new ArgumentNullException(nameof(revisionInformation));
465 
466  if (dreamMakerSettings == null)
467  throw new ArgumentNullException(nameof(dreamMakerSettings));
468 
469  if (repository == null)
470  throw new ArgumentNullException(nameof(repository));
471 
472  if (progressReporter == null)
473  throw new ArgumentNullException(nameof(progressReporter));
474 
475  if (dreamMakerSettings.ApiValidationSecurityLevel == DreamDaemonSecurity.Ultrasafe)
476  throw new ArgumentOutOfRangeException(nameof(dreamMakerSettings), dreamMakerSettings, "Cannot compile with ultrasafe security!");
477 
478  logger.LogTrace("Begin Compile");
479 
480  lock (this)
481  {
482  if (compiling)
483  throw new JobException("There is already a compile job in progress!");
484  compiling = true;
485  }
486 
487  using (var progressCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken))
488  {
489  var progressTask = estimatedDuration.HasValue ? ProgressTask(progressReporter, estimatedDuration.Value, cancellationToken) : Task.CompletedTask;
490  try
491  {
492  using (var byondLock = await byond.UseExecutables(null, cancellationToken).ConfigureAwait(false))
493  {
494  await SendDeploymentMessage(revisionInformation, byondLock, cancellationToken).ConfigureAwait(false);
495 
496  var job = new Models.CompileJob
497  {
498  DirectoryName = Guid.NewGuid(),
499  DmeName = dreamMakerSettings.ProjectName,
500  RevisionInformation = revisionInformation,
501  ByondVersion = byondLock.Version.ToString()
502  };
503 
504  await RunCompileJob(job, dreamMakerSettings, byondLock, repository, apiValidateTimeout, cancellationToken).ConfigureAwait(false);
505 
506  return job;
507  }
508  }
509  catch (OperationCanceledException)
510  {
511  await eventConsumer.HandleEvent(EventType.CompileCancelled, null, default).ConfigureAwait(false);
512  throw;
513  }
514  finally
515  {
516  compiling = false;
517  progressCts.Cancel();
518  await progressTask.ConfigureAwait(false);
519  }
520  }
521  }
readonly ILogger< DreamMaker > logger
The ILogger for DreamMaker
Definition: DreamMaker.cs:96
+
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+
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:370
+
bool compiling
If a compile job is running
Definition: DreamMaker.cs:101
+
readonly IEventConsumer eventConsumer
The IEventConsumer for DreamMaker
Definition: DreamMaker.cs:76
+
DreamDaemonSecurity
DreamDaemon's security level
+
static async Task ProgressTask(Action< int > progressReporter, TimeSpan estimatedDuration, CancellationToken cancellationToken)
Gradually triggers a given progressReporter over a given estimatedDuration
Definition: DreamMaker.cs:110
+
Task< IByondExecutableLock > UseExecutables(Version requiredVersion, CancellationToken cancellationToken)
Lock the current installation's location and return a IByondExecutableLock
+
Represents information about a current git revison
+
Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+
readonly IByondManager byond
The IByondManager for DreamMaker
Definition: DreamMaker.cs:46
+
async Task SendDeploymentMessage(Models.RevisionInformation revisionInformation, IByondExecutableLock byondLock, CancellationToken cancellationToken)
Send a message to chat about a deployment
Definition: DreamMaker.cs:336
+
+

References Tgstation.Server.Host.Components.Compiler.DreamMaker.byond, Tgstation.Server.Host.Components.Compiler.DreamMaker.compiling, Tgstation.Server.Host.Components.Compiler.DreamMaker.eventConsumer, Tgstation.Server.Host.Components.IEventConsumer.HandleEvent(), Tgstation.Server.Host.Components.Compiler.DreamMaker.logger, Tgstation.Server.Host.Components.Compiler.DreamMaker.ProgressTask(), Tgstation.Server.Host.Components.Compiler.DreamMaker.RunCompileJob(), Tgstation.Server.Host.Components.Compiler.DreamMaker.SendDeploymentMessage(), and Tgstation.Server.Host.Components.Byond.IByondManager.UseExecutables().

+ +
+
+ +

◆ ModifyDme()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Compiler.DreamMaker.ModifyDme (Models.CompileJob job,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Adds server side includes to the .dme being compiled

+
Parameters
+ + + +
jobThe Models.CompileJob for the operation
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 257 of file DreamMaker.cs.

+
258  {
259  var dirA = ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName);
260  var dmeFileName = String.Join('.', job.DmeName, DmeExtension);
261  var dmePath = ioManager.ConcatPath(dirA, dmeFileName);
262  var dmeReadTask = ioManager.ReadAllBytes(dmePath, cancellationToken);
263 
264  var dmeModificationsTask = configuration.CopyDMFilesTo(dmeFileName, ioManager.ResolvePath(dirA), cancellationToken);
265 
266  var dmeBytes = await dmeReadTask.ConfigureAwait(false);
267  var dme = Encoding.UTF8.GetString(dmeBytes);
268 
269  var dmeModifications = await dmeModificationsTask.ConfigureAwait(false);
270 
271  if (dmeModifications == null || dmeModifications.TotalDmeOverwrite)
272  {
273  if (dmeModifications != null)
274  logger.LogDebug(".dme replacement configured!");
275  else
276  logger.LogTrace("No .dme modifications required.");
277  return;
278  }
279 
280  if (dmeModifications.HeadIncludeLine != null)
281  logger.LogDebug("Head .dme include line: {0}", dmeModifications.HeadIncludeLine);
282  if (dmeModifications.TailIncludeLine != null)
283  logger.LogDebug("Tail .dme include line: {0}", dmeModifications.TailIncludeLine);
284 
285  var dmeLines = new List<string>(dme.Split(new[] { Environment.NewLine }, StringSplitOptions.None));
286  for (var I = 0; I < dmeLines.Count; ++I)
287  {
288  var line = dmeLines[I];
289  if (line.Contains("BEGIN_INCLUDE", StringComparison.Ordinal) && dmeModifications.HeadIncludeLine != null)
290  {
291  dmeLines.Insert(I + 1, dmeModifications.HeadIncludeLine);
292  ++I;
293  }
294  else if (line.Contains("END_INCLUDE", StringComparison.Ordinal) && dmeModifications.TailIncludeLine != null)
295  {
296  dmeLines.Insert(I, dmeModifications.TailIncludeLine);
297  break;
298  }
299  }
300 
301  dmeBytes = Encoding.UTF8.GetBytes(String.Join(Environment.NewLine, dmeLines));
302  await ioManager.WriteAllBytes(dmePath, dmeBytes, cancellationToken).ConfigureAwait(false);
303  }
readonly ILogger< DreamMaker > logger
The ILogger for DreamMaker
Definition: DreamMaker.cs:96
+
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+
readonly StaticFiles.IConfiguration configuration
The StaticFiles.IConfiguration for DreamMaker
Definition: DreamMaker.cs:56
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
const string ADirectoryName
Name of the primary directory used for compilation
Definition: DreamMaker.cs:26
+
const string DmeExtension
Extension for .dmes
Definition: DreamMaker.cs:41
+
readonly IIOManager ioManager
The IIOManager for DreamMaker
Definition: DreamMaker.cs:51
+
Task< byte[]> ReadAllBytes(string path, CancellationToken cancellationToken)
Returns all the contents of a file at path as a byte array
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
+

References Tgstation.Server.Host.Components.Compiler.DreamMaker.ADirectoryName, Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.Components.Compiler.DreamMaker.configuration, Tgstation.Server.Host.Components.Compiler.DreamMaker.DmeExtension, Tgstation.Server.Host.Components.Compiler.DreamMaker.ioManager, Tgstation.Server.Host.Components.Compiler.DreamMaker.logger, Tgstation.Server.Host.IO.IIOManager.ReadAllBytes(), Tgstation.Server.Host.IO.IIOManager.ResolvePath(), and Tgstation.Server.Host.IO.IIOManager.WriteAllBytes().

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DreamMaker.RunCompileJob().

+ +
+
+ +

◆ ProgressTask()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static async Task Tgstation.Server.Host.Components.Compiler.DreamMaker.ProgressTask (Action< int > progressReporter,
TimeSpan estimatedDuration,
CancellationToken cancellationToken 
)
+
+staticprivate
+
+ +

Gradually triggers a given progressReporter over a given estimatedDuration

+
Parameters
+ + + + +
progressReporterThe Action<T1> to report progress
estimatedDurationA TimeSpan representing the duration to give progress over
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 110 of file DreamMaker.cs.

+
111  {
112  progressReporter(0);
113  var sleepInterval = estimatedDuration / 100;
114 
115  try
116  {
117  for (var I = 0; I < 99; ++I)
118  {
119  await Task.Delay(sleepInterval, cancellationToken).ConfigureAwait(false);
120  progressReporter(I + 1);
121  }
122  }
123  catch (OperationCanceledException) { }
124  }
+

Referenced by Tgstation.Server.Host.Components.Compiler.DreamMaker.Compile().

+ +
+
+ +

◆ RunCompileJob()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Compiler.DreamMaker.RunCompileJob (Models.CompileJob job,
Api.Models.DreamMaker dreamMakerSettings,
IByondExecutableLock byondLock,
IRepository repository,
uint apiValidateTimeout,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Executes and populate a given job

+
Parameters
+ + + + + + + +
jobThe Models.CompileJob to run and populate
dreamMakerSettingsThe Api.Models.DreamMaker settings to use
byondLockThe IByondExecutableLock to use
repositoryThe IRepository to use
apiValidateTimeoutThe timeout for validating the DMAPI
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 370 of file DreamMaker.cs.

+
371  {
372  var jobPath = job.DirectoryName.ToString();
373  logger.LogTrace("Compile output GUID: {0}", jobPath);
374 
375  try
376  {
377  var dirA = ioManager.ConcatPath(jobPath, ADirectoryName);
378  var dirB = ioManager.ConcatPath(jobPath, BDirectoryName);
379 
380  // copy the repository
381  logger.LogTrace("Copying repository to game directory...");
382  var resolvedADirectory = ioManager.ResolvePath(dirA);
383  var repoOrigin = repository.Origin;
384  using (repository)
385  await repository.CopyTo(resolvedADirectory, cancellationToken).ConfigureAwait(false);
386 
387  // repository closed now
388 
389  // run precompile scripts
390  await eventConsumer.HandleEvent(EventType.CompileStart, new List<string> { resolvedADirectory, repoOrigin }, cancellationToken).ConfigureAwait(false);
391 
392  // determine the dme
393  if (job.DmeName == null)
394  {
395  logger.LogTrace("Searching for available .dmes...");
396  var foundPaths = await ioManager.GetFilesWithExtension(dirA, DmeExtension, cancellationToken).ConfigureAwait(false);
397  var foundPath = foundPaths.FirstOrDefault();
398  if (foundPath == default)
399  throw new JobException("Unable to find any .dme!");
400  var dmeWithExtension = ioManager.GetFileName(foundPath);
401  job.DmeName = dmeWithExtension.Substring(0, dmeWithExtension.Length - DmeExtension.Length - 1);
402  }
403  else
404  {
405  var targetDme = ioManager.ConcatPath(dirA, String.Join('.', job.DmeName, DmeExtension));
406  var targetDmeExists = await ioManager.FileExists(targetDme, cancellationToken).ConfigureAwait(false);
407  if (!targetDmeExists)
408  throw new JobException("Unable to locate specified .dme!");
409  }
410 
411  logger.LogDebug("Selected {0}.dme for compilation!", job.DmeName);
412 
413  await ModifyDme(job, cancellationToken).ConfigureAwait(false);
414 
415  // run compiler
416  var exitCode = await RunDreamMaker(byondLock.DreamMakerPath, job, cancellationToken).ConfigureAwait(false);
417 
418  // verify api
419  try
420  {
421  if (exitCode != 0)
422  throw new JobException(String.Format(CultureInfo.InvariantCulture, "DM exited with a non-zero code: {0}{1}{2}", exitCode, Environment.NewLine, job.Output));
423 
424  await VerifyApi(apiValidateTimeout, dreamMakerSettings.ApiValidationSecurityLevel.Value, job, byondLock, dreamMakerSettings.ApiValidationPort.Value, cancellationToken).ConfigureAwait(false);
425  }
426  catch (JobException)
427  {
428  // DD never validated or compile failed
429  await eventConsumer.HandleEvent(EventType.CompileFailure, new List<string> { resolvedADirectory, exitCode == 0 ? "1" : "0" }, cancellationToken).ConfigureAwait(false);
430  throw;
431  }
432 
433  logger.LogTrace("Running post compile event...");
434  await eventConsumer.HandleEvent(EventType.CompileComplete, new List<string> { resolvedADirectory }, cancellationToken).ConfigureAwait(false);
435 
436  logger.LogTrace("Duplicating compiled game...");
437 
438  // duplicate the dmb et al
439  await ioManager.CopyDirectory(dirA, dirB, null, cancellationToken).ConfigureAwait(false);
440 
441  logger.LogTrace("Applying static game file symlinks...");
442 
443  // symlink in the static data
444  var symATask = configuration.SymlinkStaticFilesTo(resolvedADirectory, cancellationToken);
445  var symBTask = configuration.SymlinkStaticFilesTo(ioManager.ResolvePath(dirB), cancellationToken);
446 
447  await Task.WhenAll(symATask, symBTask).ConfigureAwait(false);
448 
449  await chat.SendUpdateMessage(String.Format(CultureInfo.InvariantCulture, "Deployment complete!{0}", watchdog.Running ? " Changes will be applied on next server reboot." : String.Empty), cancellationToken).ConfigureAwait(false);
450 
451  logger.LogDebug("Compile complete!");
452  }
453  catch (Exception e)
454  {
455  await CleanupFailedCompile(job, e is OperationCanceledException, cancellationToken).ConfigureAwait(false);
456  throw;
457  }
458  }
Task< List< string > > GetFilesWithExtension(string path, string extension, CancellationToken cancellationToken)
Gets a list of files in path with the given extension
+
readonly ILogger< DreamMaker > logger
The ILogger for DreamMaker
Definition: DreamMaker.cs:96
+
readonly StaticFiles.IConfiguration configuration
The StaticFiles.IConfiguration for DreamMaker
Definition: DreamMaker.cs:56
+
Task CopyDirectory(string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)
Copies a directory from src to dest
+
Task SendUpdateMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured update channels
+
const string BDirectoryName
Name of the secondary directory used for compilation
Definition: DreamMaker.cs:31
+
async Task CleanupFailedCompile(Models.CompileJob job, bool cancelled, CancellationToken cancellationToken)
Cleans up a failed compile job
Definition: DreamMaker.cs:312
+
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
const string ADirectoryName
Name of the primary directory used for compilation
Definition: DreamMaker.cs:26
+
readonly IEventConsumer eventConsumer
The IEventConsumer for DreamMaker
Definition: DreamMaker.cs:76
+
string GetFileName(string path)
Gets the file name portion of a path
+
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists
+
async Task VerifyApi(uint timeout, DreamDaemonSecurity securityLevel, Models.CompileJob job, IByondExecutableLock byondLock, ushort portToUse, CancellationToken cancellationToken)
Run a quick DD instance to test the DMAPI is installed on the target code
Definition: DreamMaker.cs:165
+
string Origin
The current origin remote the IRepository is using
Definition: IRepository.cs:46
+
string DreamMakerPath
The path to the dm/DreamMaker executable
+
async Task ModifyDme(Models.CompileJob job, CancellationToken cancellationToken)
Adds server side includes to the .dme being compiled
Definition: DreamMaker.cs:257
+
readonly IChat chat
The IChat for DreamMaker
Definition: DreamMaker.cs:81
+
readonly IWatchdog watchdog
The IWatchdog for DreamMaker
Definition: DreamMaker.cs:91
+
Task CopyTo(string path, CancellationToken cancellationToken)
Copies the current working directory to a given path
+
const string DmeExtension
Extension for .dmes
Definition: DreamMaker.cs:41
+
bool Running
If the watchdog is running
Definition: IWatchdog.cs:17
+
readonly IIOManager ioManager
The IIOManager for DreamMaker
Definition: DreamMaker.cs:51
+
Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+
async Task< int > RunDreamMaker(string dreamMakerPath, Models.CompileJob job, CancellationToken cancellationToken)
Compiles a .dme with DreamMaker
Definition: DreamMaker.cs:235
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+
+

References Tgstation.Server.Host.Components.Compiler.DreamMaker.ADirectoryName, Tgstation.Server.Host.Components.Compiler.DreamMaker.BDirectoryName, Tgstation.Server.Host.Components.Compiler.DreamMaker.chat, Tgstation.Server.Host.Components.Compiler.DreamMaker.CleanupFailedCompile(), Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.Components.Compiler.DreamMaker.configuration, Tgstation.Server.Host.IO.IIOManager.CopyDirectory(), Tgstation.Server.Host.Components.Repository.IRepository.CopyTo(), Tgstation.Server.Host.Components.Compiler.DreamMaker.DmeExtension, Tgstation.Server.Host.Components.Byond.IByondExecutableLock.DreamMakerPath, Tgstation.Server.Host.Components.Compiler.DreamMaker.eventConsumer, Tgstation.Server.Host.IO.IIOManager.FileExists(), Tgstation.Server.Host.IO.IIOManager.GetFileName(), Tgstation.Server.Host.IO.IIOManager.GetFilesWithExtension(), Tgstation.Server.Host.Components.IEventConsumer.HandleEvent(), Tgstation.Server.Host.Components.Compiler.DreamMaker.ioManager, Tgstation.Server.Host.Components.Compiler.DreamMaker.logger, Tgstation.Server.Host.Components.Compiler.DreamMaker.ModifyDme(), Tgstation.Server.Host.Components.Repository.IRepository.Origin, Tgstation.Server.Host.IO.IIOManager.ResolvePath(), Tgstation.Server.Host.Components.Compiler.DreamMaker.RunDreamMaker(), Tgstation.Server.Host.Components.Watchdog.IWatchdog.Running, Tgstation.Server.Host.Components.Chat.IChat.SendUpdateMessage(), Tgstation.Server.Host.Components.Compiler.DreamMaker.VerifyApi(), and Tgstation.Server.Host.Components.Compiler.DreamMaker.watchdog.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DreamMaker.Compile().

+ +
+
+ +

◆ RunDreamMaker()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task<int> Tgstation.Server.Host.Components.Compiler.DreamMaker.RunDreamMaker (string dreamMakerPath,
Models.CompileJob job,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Compiles a .dme with DreamMaker

+
Parameters
+ + + + +
dreamMakerPathThe path to the DreamMaker executable
jobThe Models.CompileJob for the operation
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 235 of file DreamMaker.cs.

+
236  {
237  using (var dm = processExecutor.LaunchProcess(dreamMakerPath, ioManager.ResolvePath(ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName)), String.Format(CultureInfo.InvariantCulture, "-clean {0}.{1}", job.DmeName, DmeExtension), true, true))
238  {
239  int exitCode;
240  using (cancellationToken.Register(() => dm.Terminate()))
241  exitCode = await dm.Lifetime.ConfigureAwait(false);
242  cancellationToken.ThrowIfCancellationRequested();
243 
244  logger.LogDebug("DreamMaker exit code: {0}", exitCode);
245  job.Output = dm.GetCombinedOutput();
246  logger.LogTrace("DreamMaker output: {0}{1}", Environment.NewLine, job.Output);
247  return exitCode;
248  }
249  }
readonly ILogger< DreamMaker > logger
The ILogger for DreamMaker
Definition: DreamMaker.cs:96
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
readonly IProcessExecutor processExecutor
The IProcessExecutor for DreamMaker
Definition: DreamMaker.cs:86
+
const string ADirectoryName
Name of the primary directory used for compilation
Definition: DreamMaker.cs:26
+
IProcess LaunchProcess(string fileName, string workingDirectory, string arguments=null, bool readOutput=false, bool readError=false, bool noShellExecute=false)
Launch a IProcess
+
const string DmeExtension
Extension for .dmes
Definition: DreamMaker.cs:41
+
readonly IIOManager ioManager
The IIOManager for DreamMaker
Definition: DreamMaker.cs:51
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
+

References Tgstation.Server.Host.Components.Compiler.DreamMaker.ADirectoryName, Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.Components.Compiler.DreamMaker.DmeExtension, Tgstation.Server.Host.Components.Compiler.DreamMaker.ioManager, Tgstation.Server.Host.Core.IProcessExecutor.LaunchProcess(), Tgstation.Server.Host.Components.Compiler.DreamMaker.logger, Tgstation.Server.Host.Components.Compiler.DreamMaker.processExecutor, and Tgstation.Server.Host.IO.IIOManager.ResolvePath().

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DreamMaker.RunCompileJob().

+ +
+
+ +

◆ SendDeploymentMessage()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Compiler.DreamMaker.SendDeploymentMessage (Models.RevisionInformation revisionInformation,
IByondExecutableLock byondLock,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Send a message to chat about a deployment

+
Parameters
+ + + + +
revisionInformationThe Models.RevisionInformation for the deployment
byondLockThe IByondExecutableLock for the deployment
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 336 of file DreamMaker.cs.

+
337  {
338  var commitInsert = revisionInformation.CommitSha.Substring(0, 7);
339  string remoteCommitInsert;
340  if (revisionInformation.CommitSha == revisionInformation.OriginCommitSha)
341  {
342  commitInsert = String.Format(CultureInfo.InvariantCulture, "^{0}", commitInsert);
343  remoteCommitInsert = String.Empty;
344  }
345  else
346  remoteCommitInsert = String.Format(CultureInfo.InvariantCulture, ". Remote commit: ^{0}", revisionInformation.OriginCommitSha.Substring(0, 7));
347 
348  var testmergeInsert = revisionInformation.ActiveTestMerges.Count == 0 ? String.Empty : String.Format(CultureInfo.InvariantCulture, " (Test Merges: {0})",
349  String.Join(", ", revisionInformation.ActiveTestMerges.Select(x => x.TestMerge).Select(x =>
350  {
351  var result = String.Format(CultureInfo.InvariantCulture, "#{0} at {1}", x.Number, x.PullRequestRevision.Substring(0, 7));
352  if (x.Comment != null)
353  result += String.Format(CultureInfo.InvariantCulture, " ({0})", x.Comment);
354  return result;
355  })));
356 
357  await chat.SendUpdateMessage(String.Format(CultureInfo.InvariantCulture, "Deploying revision: {0}{1}{2} BYOND Version: {3}", commitInsert, testmergeInsert, remoteCommitInsert, byondLock.Version), cancellationToken).ConfigureAwait(false);
358  }
Task SendUpdateMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured update channels
+
readonly IChat chat
The IChat for DreamMaker
Definition: DreamMaker.cs:81
+
Version Version
The System.Version of the locked executables
+
+

References Tgstation.Server.Host.Components.Compiler.DreamMaker.chat, Tgstation.Server.Host.Components.Chat.IChat.SendUpdateMessage(), and Tgstation.Server.Host.Components.Byond.IByondExecutableLock.Version.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DreamMaker.Compile().

+ +
+
+ +

◆ VerifyApi()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Compiler.DreamMaker.VerifyApi (uint timeout,
DreamDaemonSecurity securityLevel,
Models.CompileJob job,
IByondExecutableLock byondLock,
ushort portToUse,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Run a quick DD instance to test the DMAPI is installed on the target code

+
Parameters
+ + + + + + + +
timeoutThe timeout in seconds for validation
securityLevelThe DreamDaemonSecurity level to use to validate the API
jobThe Models.CompileJob for the operation
byondLockThe current IByondExecutableLock
portToUseThe port to use for API validation
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 165 of file DreamMaker.cs.

+
166  {
167  logger.LogTrace("Verifying DMAPI...");
168  var launchParameters = new DreamDaemonLaunchParameters
169  {
170  AllowWebClient = false,
171  PrimaryPort = portToUse,
172  SecurityLevel = securityLevel,
173  StartupTimeout = timeout
174  };
175 
176  var dirA = ioManager.ConcatPath(job.DirectoryName.ToString(), ADirectoryName);
177 
178  job.MinimumSecurityLevel = securityLevel; // needed for the TempDmbProvider
179  var timeoutAt = DateTimeOffset.Now.AddSeconds(timeout);
180 
181  using (var provider = new TemporaryDmbProvider(ioManager.ResolvePath(dirA), String.Concat(job.DmeName, DmbExtension), job))
182  using (var controller = await sessionControllerFactory.LaunchNew(launchParameters, provider, byondLock, true, true, true, cancellationToken).ConfigureAwait(false))
183  {
184  var launchResult = await controller.LaunchResult.ConfigureAwait(false);
185 
186  var now = DateTimeOffset.Now;
187  if (now < timeoutAt && launchResult.StartupTime.HasValue)
188  {
189  var timeoutTask = Task.Delay(timeoutAt - now, cancellationToken);
190 
191  await Task.WhenAny(controller.Lifetime, timeoutTask).ConfigureAwait(false);
192  cancellationToken.ThrowIfCancellationRequested();
193  }
194 
195  if (controller.Lifetime.IsCompleted)
196  {
197  var validationStatus = controller.ApiValidationStatus;
198  logger.LogTrace("API validation status: {0}", validationStatus);
199  switch (validationStatus)
200  {
201  case ApiValidationStatus.RequiresUltrasafe:
202  job.MinimumSecurityLevel = DreamDaemonSecurity.Ultrasafe;
203  return;
204  case ApiValidationStatus.RequiresSafe:
205  if (securityLevel == DreamDaemonSecurity.Ultrasafe)
206  throw new JobException("This game must be run with at least the 'Safe' DreamDaemon security level!");
207  job.MinimumSecurityLevel = DreamDaemonSecurity.Safe;
208  return;
209  case ApiValidationStatus.RequiresTrusted:
210  if (securityLevel != DreamDaemonSecurity.Trusted)
211  throw new JobException("This game must be run with at least the 'Trusted' DreamDaemon security level!");
212  job.MinimumSecurityLevel = DreamDaemonSecurity.Trusted;
213  return;
214  case ApiValidationStatus.NeverValidated:
215  break;
216  case ApiValidationStatus.BadValidationRequest:
217  throw new JobException("Recieved an unrecognized API validation request from DreamDaemon!");
218  case ApiValidationStatus.UnaskedValidationRequest:
219  default:
220  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Session controller returned unexpected ApiValidationStatus: {0}", validationStatus));
221  }
222  }
223 
224  throw new JobException("DMAPI validation timed out!");
225  }
226  }
readonly ILogger< DreamMaker > logger
The ILogger for DreamMaker
Definition: DreamMaker.cs:96
+ +
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
const string ADirectoryName
Name of the primary directory used for compilation
Definition: DreamMaker.cs:26
+
readonly ISessionControllerFactory sessionControllerFactory
The ISessionControllerFactory for DreamMaker
Definition: DreamMaker.cs:61
+
Task< ISessionController > LaunchNew(DreamDaemonLaunchParameters launchParameters, IDmbProvider dmbProvider, IByondExecutableLock currentByondLock, bool primaryPort, bool primaryDirectory, bool apiValidate, CancellationToken cancellationToken)
Create a ISessionController from a freshly launch DreamDaemon instance
+
const string DmbExtension
Extension for .dmbs
Definition: DreamMaker.cs:36
+
DreamDaemonSecurity
DreamDaemon's security level
+
readonly IIOManager ioManager
The IIOManager for DreamMaker
Definition: DreamMaker.cs:51
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+
ApiValidationStatus
Status of DMAPI validation
+
+

References Tgstation.Server.Host.Components.Compiler.DreamMaker.ADirectoryName, Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.Components.Compiler.DreamMaker.DmbExtension, Tgstation.Server.Host.Components.Compiler.DreamMaker.ioManager, Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory.LaunchNew(), Tgstation.Server.Host.Components.Compiler.DreamMaker.logger, Tgstation.Server.Host.IO.IIOManager.ResolvePath(), and Tgstation.Server.Host.Components.Compiler.DreamMaker.sessionControllerFactory.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DreamMaker.RunCompileJob().

+ +
+
+

Member Data Documentation

+ +

◆ ADirectoryName

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Compiler.DreamMaker.ADirectoryName = "A"
+
+
+ +

◆ application

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Components.Compiler.DreamMaker.application
+
+private
+
+ +

The IApplication for DreamMaker

+ +

Definition at line 71 of file DreamMaker.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DreamMaker.DreamMaker().

+ +
+
+ +

◆ BDirectoryName

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Compiler.DreamMaker.BDirectoryName = "B"
+
+ +

Name of the secondary directory used for compilation

+ +

Definition at line 31 of file DreamMaker.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DreamMaker.RunCompileJob().

+ +
+
+ +

◆ byond

+ +
+
+ + + + + +
+ + + + +
readonly IByondManager Tgstation.Server.Host.Components.Compiler.DreamMaker.byond
+
+private
+
+
+ +

◆ chat

+ + + +

◆ compileJobConsumer

+ +
+
+ + + + + +
+ + + + +
readonly ICompileJobConsumer Tgstation.Server.Host.Components.Compiler.DreamMaker.compileJobConsumer
+
+private
+
+
+ +

◆ compiling

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Compiler.DreamMaker.compiling
+
+private
+
+ +

If a compile job is running

+ +

Definition at line 101 of file DreamMaker.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DreamMaker.Compile().

+ +
+
+ +

◆ configuration

+ +
+
+ + + + + +
+ + + + +
readonly StaticFiles.IConfiguration Tgstation.Server.Host.Components.Compiler.DreamMaker.configuration
+
+private
+
+
+ +

◆ DmbExtension

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Compiler.DreamMaker.DmbExtension = ".dmb"
+
+ +

Extension for .dmbs

+ +

Definition at line 36 of file DreamMaker.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DreamMaker.VerifyApi().

+ +
+
+ +

◆ DmeExtension

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Compiler.DreamMaker.DmeExtension = "dme"
+
+private
+
+
+ +

◆ eventConsumer

+ +
+
+ + + + + +
+ + + + +
readonly IEventConsumer Tgstation.Server.Host.Components.Compiler.DreamMaker.eventConsumer
+
+private
+
+
+ +

◆ ioManager

+ + + +

◆ logger

+ + + +

◆ processExecutor

+ +
+
+ + + + + +
+ + + + +
readonly IProcessExecutor Tgstation.Server.Host.Components.Compiler.DreamMaker.processExecutor
+
+private
+
+
+ +

◆ sessionControllerFactory

+ +
+
+ + + + + +
+ + + + +
readonly ISessionControllerFactory Tgstation.Server.Host.Components.Compiler.DreamMaker.sessionControllerFactory
+
+private
+
+
+ +

◆ watchdog

+ +
+
+ + + + + +
+ + + + +
readonly IWatchdog Tgstation.Server.Host.Components.Compiler.DreamMaker.watchdog
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.png new file mode 100644 index 0000000000000000000000000000000000000000..2d643a4f2ae6ee837bc95f0e84556ba89f29da7c GIT binary patch literal 1255 zcmeAS@N?(olHy`uVBq!ia0y~yUVDskmyx7^{PH z&-beYSAG4M|6;Z5Wfjk;mzFs)cV2zx^(;y)`E}_+mGbt0y3X16-z@B}e&NRR&1%t2qiYch5g^d&j%B=JUo^R^2IHi?f^xwryXS6%i_Ay-M%;?CJ-z#5UfVUNQew ziB0#E63^0axqFJAGwlD(b*<#8%fmNsSHz_?G`9J2w7vRtx8$WWWSI!J{Ta_NQ?tDz` zzv%3VPoBtm|GzVP*+WZ<4yyMl>9gD7QF^;P zS6F^1kENW1Cd|^8Qi{QPouS{O{};I%&~VAUg`q;9mud z-<6Lo`Yag#DF0&cU}Vu+$;9&dvGPWyBVZPz=|-j&AnS)lgiBy8GIrZ)7w4eA_t%f@$L#%?B4CM)ab1sJyi`ycx<38&_44gG&TDT~ z^A-Be%X+)w+TWj7RnKjF9#xkbZ7n;8IWcp^wQc)qdnLkF7F%7twbf|bf~u+v?$)?7 z4CM{HGv+4EeL2rx?e5Dhs`J=y&fU3cZ|aLv+mEvCVr|~rm(dm@uzp3E{O?)HN#eo| zGgDXV73WX;U~tX*U7gtUqWp}fv-x|!UgHfFuHU@THuUhSNjCy*-)^_QIBmOccf?!o zJ^rOu^IW}lE!p+?Z1ubCaR+Cuo24;lBloK5k_ihEg_{=csW2{HpCxtdSEbG|)Hm00hBk;C_&zm+5tzad`0D~lgmzx84`Fnh VbFDS*2(VOQ@O1TaS?83{1OTc{Q;h%s literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider-members.html new file mode 100644 index 0000000000..1ebca123d8 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider-members.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html new file mode 100644 index 0000000000..aa4659b4c0 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html @@ -0,0 +1,343 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider Class Reference
+
+
+ +

Temporary IDmbProvider + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider:
+
+
+ + +Tgstation.Server.Host.Components.IDmbProvider +IDisposable + +
+ + + + + + + + + + +

+Public Member Functions

 TemporaryDmbProvider (string directory, string dmb, CompileJob compileJob)
 Construct a TemporaryDmbProvider More...
 
void Dispose ()
 
void KeepAlive ()
 Disposing the IDmbProvider won't cause a cleanup of the working directory More...
 
+ + + +

+Public Attributes

string SecondaryDirectory => throw new NotSupportedException()
 
+ + + + + + + + + + + + + + + + + + + + +

+Properties

string DmbName [get]
 
string PrimaryDirectory [get]
 
CompileJob CompileJob [get]
 
- Properties inherited from Tgstation.Server.Host.Components.IDmbProvider
string DmbName [get]
 The file name of the .dmb More...
 
string PrimaryDirectory [get]
 The primary game directory with a trailing directory separator More...
 
string SecondaryDirectory [get]
 The secondary game directory with a trailing directory separator More...
 
CompileJob CompileJob [get]
 The CompileJob of the .dmb More...
 
+

Detailed Description

+

Temporary IDmbProvider

+ +

Definition at line 9 of file TemporaryDmbProvider.cs.

+

Constructor & Destructor Documentation

+ +

◆ TemporaryDmbProvider()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.TemporaryDmbProvider (string directory,
string dmb,
CompileJob compileJob 
)
+
+ +

Construct a TemporaryDmbProvider

+
Parameters
+ + + + +
directoryThe value of PrimaryDirectory
dmbThe value of DmbName
compileJobThe value of CompileJob
+
+
+ +

Definition at line 29 of file TemporaryDmbProvider.cs.

+
30  {
31  DmbName = dmb ?? throw new ArgumentNullException(nameof(dmb));
32  PrimaryDirectory = directory ?? throw new ArgumentNullException(nameof(directory));
33  CompileJob = compileJob ?? throw new ArgumentNullException(nameof(compileJob));
34  }
+ + +
+

References Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.DmbName, and Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.PrimaryDirectory.

+ +
+
+

Member Function Documentation

+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.Dispose ()
+
+ +

+ +

Definition at line 37 of file TemporaryDmbProvider.cs.

+
37 { }
+
+
+ +

◆ KeepAlive()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.KeepAlive ()
+
+ +

Disposing the IDmbProvider won't cause a cleanup of the working directory

+ +

Implements Tgstation.Server.Host.Components.IDmbProvider.

+ +
+
+

Member Data Documentation

+ +

◆ SecondaryDirectory

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.SecondaryDirectory => throw new NotSupportedException()
+
+ +

+ +

Definition at line 18 of file TemporaryDmbProvider.cs.

+ +
+
+

Property Documentation

+ +

◆ CompileJob

+ +
+
+ + + + + +
+ + + + +
CompileJob Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.CompileJob
+
+get
+
+ +

+ +

Definition at line 21 of file TemporaryDmbProvider.cs.

+
21 { get; }
+
+
+ +

◆ DmbName

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.DmbName
+
+get
+
+
+ +

◆ PrimaryDirectory

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.PrimaryDirectory
+
+get
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.png new file mode 100644 index 0000000000000000000000000000000000000000..d8443bd5e86130427fac934b90a249cd1a2a4a06 GIT binary patch literal 1669 zcmcJQdoYx19LL{9c9D=>y}&RSbLmqOLbbDBAc$O)-ADG&gQOI z%4Eqp72^`2a@m#3y0%D*Toywr_w#BdbLRZtGxL3ZpWn>ynR)*BJoCi3x!TLiZkGiB zKpt`+cmMz*0p@6wB)qRCx>Uero13%Ok+roo7(Y$UUt+vkpZK2Y>gr7~?{(l772@IQ z3BW_^OVH?L3INh75aF=bWrR5611o2bqI4`Hcw|LqLEoJ&ZSFrb88Y%^uZ5D=+1=+> znZf+SeC!ep1BHWOJLwKgJ$y8X)%^iO!E`pMY>ia3Yb;?t#f;&|RJU<@Yh|>hZtncxDn4{sB&3iN9b8MsXi7g8%>NznjTnAj`}4UTv5asHenW6 z+=7JM!_4KmGW;T^xZU3}9>k8$(Yxn#`HIk@YVZ4Yc7d^zv2E_`x8r6#qZDR~k}f2v z^LHFLW{4&*wUqE+gObi(0&`Vuqul^2G``xT%&`&wVQC{yRT9A*x~j|W#_cy!XD~Dd7JV6aigzic8k8q z3r(i7+CEv$f}MmWI&>-M_^JvXVJ87aq<95yNts@d?77dIEm|_W2~M( zpY_7MF{VI^TYi%v8g!}c60}*nEep|5J5-E9HBS+iCBe&V#YX#L>dAyQgEgzMTiSV|6G)_vDevDZ-bkl^~*T59f6m{VTQE8952insWp^JncQ0L;n$0D(#lM*!B8udfK z;B7^T!Kk95eG-F_>y*ZTDFUWD?+}C0aQ&&V)dO>rZY6olB4l;~Glx)!zX<=0l1KdI z2P~gTUtWEj38LBi4WgF|%O#cEhP>Y08lv0YAenyZ8kM6R;*$wHHOG;+e(GljES05v z_p3Uo;gnXWdF6s#<~DoE{Uw2$G}`LX*Vyvjr~z?H+v2ySQrxw{-11?ic5+0LW-j$f z)#hTG@_0Y{!1L#6AFa&Ak2@%oOS8z^MdDh*3k~Pjz2ncO^&=NdiRcMYFFu=KgQ2)O(RxR*7P;ZD+{j&ojKNN>YEqlEbN>RCz~ia z=miMC@eK6j0e;l`r4&);O1yrtd}0>=h0sMvK=*K`VrJ*3>#W7s_OOW~+~}+L=5F4U z*}8p{iFNx7u%F!=)JZZGX_FLQsuj-zJR7^o(qYZ zoE}NUv2hn%$@Cp&tx^G46S8++P&zsotzWuecav+Lm?q3G&f@Z^pYe^`v-*`yahiGf zUVx{;)njL_4DY*QPT|PxOEM>x_=)os9#nZMWQk|Yv@M$2EEpFs?x__e1FftfXNsjL zqvpj_c|gw&)fI0`ozU?1S!Fqk$pmf* ypfyN*%fNJC{18&W%l|t7`|4=8$uL)RYYk}3&UUM)LHomh1^^v#B^2UM-1--% + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.EventConsumer Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.EventConsumer, including all inherited members.

+ + + + + + +
configurationTgstation.Server.Host.Components.EventConsumerprivate
EventConsumer(IConfiguration configuration)Tgstation.Server.Host.Components.EventConsumer
HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)Tgstation.Server.Host.Components.EventConsumer
SetWatchdog(IWatchdog watchdog)Tgstation.Server.Host.Components.EventConsumer
watchdogTgstation.Server.Host.Components.EventConsumerprivate
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.html new file mode 100644 index 0000000000..29ada80cb4 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.html @@ -0,0 +1,292 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.EventConsumer Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.EventConsumer Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.EventConsumer:
+
+
+ + +Tgstation.Server.Host.Components.IEventConsumer + +
+ + + + + + + + + + + +

+Public Member Functions

 EventConsumer (IConfiguration configuration)
 Construct an IEventConsumer More...
 
async Task< bool > HandleEvent (EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
 Handle a given eventType More...
 
void SetWatchdog (IWatchdog watchdog)
 Set the watchdog for the EventConsumer More...
 
+ + + + + + + +

+Private Attributes

readonly IConfiguration configuration
 The IConfiguration for the EventConsumer More...
 
IWatchdog watchdog
 The IWatchdog for the EventConsumer More...
 
+

Detailed Description

+
+

Definition at line 11 of file EventConsumer.cs.

+

Constructor & Destructor Documentation

+ +

◆ EventConsumer()

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Components.EventConsumer.EventConsumer (IConfiguration configuration)
+
+ +

Construct an IEventConsumer

+
Parameters
+ + +
configurationThe value of configuration
+
+
+ +

Definition at line 27 of file EventConsumer.cs.

+
28  {
29  this.configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
30  }
readonly IConfiguration configuration
The IConfiguration for the EventConsumer
+
+

References Tgstation.Server.Host.Components.EventConsumer.configuration.

+ +
+
+

Member Function Documentation

+ +

◆ HandleEvent()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task<bool> Tgstation.Server.Host.Components.EventConsumer.HandleEvent (EventType eventType,
IEnumerable< string > parameters,
CancellationToken cancellationToken 
)
+
+ +

Handle a given eventType

+ +

Implements Tgstation.Server.Host.Components.IEventConsumer.

+ +

Definition at line 33 of file EventConsumer.cs.

+
34  {
35  if (watchdog == null)
36  throw new InvalidOperationException("EventConsumer used without watchdog set!");
37 
38  if (!await configuration.HandleEvent(eventType, parameters, cancellationToken).ConfigureAwait(false))
39  return false;
40  return await watchdog.HandleEvent(eventType, parameters, cancellationToken).ConfigureAwait(false);
41  }
IWatchdog watchdog
The IWatchdog for the EventConsumer
+
readonly IConfiguration configuration
The IConfiguration for the EventConsumer
+
Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+
+

References Tgstation.Server.Host.Components.EventConsumer.configuration, Tgstation.Server.Host.Components.IEventConsumer.HandleEvent(), and Tgstation.Server.Host.Components.EventConsumer.watchdog.

+ +
+
+ +

◆ SetWatchdog()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.Components.EventConsumer.SetWatchdog (IWatchdog watchdog)
+
+ +

Set the watchdog for the EventConsumer

+
Parameters
+ + +
watchdogThe value of watchdog
+
+
+ +

Definition at line 47 of file EventConsumer.cs.

+
48  {
49 #pragma warning disable IDE0016 // Use 'throw' expression
50  if (watchdog == null)
51  throw new ArgumentNullException(nameof(watchdog));
52 #pragma warning restore IDE0016 // Use 'throw' expression
53  if (this.watchdog != null)
54  throw new InvalidOperationException("watchdog already set!");
55  this.watchdog = watchdog;
56  }
IWatchdog watchdog
The IWatchdog for the EventConsumer
+
+

References Tgstation.Server.Host.Components.EventConsumer.watchdog.

+ +
+
+

Member Data Documentation

+ +

◆ configuration

+ +
+
+ + + + + +
+ + + + +
readonly IConfiguration Tgstation.Server.Host.Components.EventConsumer.configuration
+
+private
+
+
+ +

◆ watchdog

+ +
+
+ + + + + +
+ + + + +
IWatchdog Tgstation.Server.Host.Components.EventConsumer.watchdog
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.png new file mode 100644 index 0000000000000000000000000000000000000000..7892e347a0048ce7a4cefa47f13df9ce6348fd8c GIT binary patch literal 1150 zcmeAS@N?(olHy`uVBq!ia0y~yVAKb)12~w0WIZ#p7m$(&@CkAK|NlRb`Qpvj(*8pe zfGjXRaNq!I=N)+YM!pRMe{mf0e#|veaKDOwaVxh89#gkK1-}BV!3eTXpqu!G~X~j*N z68`+^IeE`zXWzZv|6y%?gqY_gzvo*lD!+VgQ`z}!S}p6YlSlmj?bNT{7be^{T}9XG zuJ;El` z{%(Ca_RF1LPgdWvJ}`B9f3n}bA5tH`xE`)Qqx7lj_cmYO%`-V=*Y}^*lXUL8o^+{D zUhmwQG=p;6bd3+UeEarYF`4~ce$$N)v&>?7v^kyEcyeuuEq9LF(c$?nChqS?@wczi z?JMUNysX#R^&nNF`w4Tdu@h>V`KbywZ%)ic+65Mas*T2Wf_M6zI9gj+*`xVaz zFhApp&MVpfXPKP+y!E%E3ig<_ZQrx)=P{kSlKQummiuQ{?b*G5k>ck4C#&v!h{}_Y z{=Ic(?7!)I-u%vpoASYK*YV@_%GWN*eEQy8+keLT$-I3R4}Fk2UL)_zc{AhDldIEL zzAQZ3?`6JBMt{HVq%RD%n$u+0S4{W5l>h4Go?kyFFHwK-aStduqA{Z5diV808TXeK zeagxW>aX}6I2D#YVx4epzCA0C!fFtUJDic(V^sxXjk_zi!g`=c_(!G_t1B3vgzjMg zMkqt2sD8tqE^&vrqZCUY|CF_MYf$#ur7p}Gj4B~$<~N7$|JQgk?fcjJa&LBVBrGqE znq%{;(zzi!@1`EF{paU>hkiz_y;HkckfG*^?fQHPrkKxr7}kCH`q5q{w{q`;|Hi*d z7u^A-mlDge6LS4|>)lh^5b5O$B)#zdmnb~1WFd7Bm|iM<5)Z$Ad)rJ3oL>0PBc+!o z!1S{B>ID8nXM6fG&ODpjF7j>9vYV35EziGkW~|P+es_YnUeY}4>EZQvR(AS*GrrC_ z{haJ#TYcw+yZ1l(dT&zQp7ucVEtc_@kAAOQ>vN6!5ZlLz;VX{cbK)}JllR*2N#^Ox zExUGK{QGHk)t`!e>#`4iycKcx(=D~#IfwY)uea5IUKQM5{yp3zWt&B0|HSJ>dv6?A zpZjLg{>Q2J-9N8r`F?S){Xf->)1FP(uk>be$~>j-UwXybu3J3&eZ%`in^5|?J|D;a z?7AsC4Mi(i3mEpVS3kPxvFQ7vhWl48SAJFI_`qU2PuzhsVL4iCSAB%UPwE$OuLQd% UbG&@ifQ1Evr>mdKI;Vst0LH97F8}}l literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance-members.html new file mode 100644 index 0000000000..5ad6dc49c3 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance-members.html @@ -0,0 +1,110 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Instance Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Instance, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
ByondManagerTgstation.Server.Host.Components.Instance
ChatTgstation.Server.Host.Components.Instance
compileJobConsumerTgstation.Server.Host.Components.Instanceprivate
CompileProcess(Job job, IDatabaseContext databaseContext, Action< int > progressReporter, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Instance
ConfigurationTgstation.Server.Host.Components.Instance
databaseContextFactoryTgstation.Server.Host.Components.Instanceprivate
Dispose()Tgstation.Server.Host.Components.Instance
dmbFactoryTgstation.Server.Host.Components.Instanceprivate
dreamMakerTgstation.Server.Host.Components.Instanceprivate
eventConsumerTgstation.Server.Host.Components.Instanceprivate
gitHubClientFactoryTgstation.Server.Host.Components.Instanceprivate
Instance(Api.Models.Instance metadata, IRepositoryManager repositoryManager, IByondManager byondManager, IDreamMaker dreamMaker, IWatchdog watchdog, IChat chat, StaticFiles.IConfiguration configuration, ICompileJobConsumer compileJobConsumer, IDatabaseContextFactory databaseContextFactory, IDmbFactory dmbFactory, IJobManager jobManager, IEventConsumer eventConsumer, IGitHubClientFactory gitHubClientFactory, ILogger< Instance > logger)Tgstation.Server.Host.Components.Instance
jobManagerTgstation.Server.Host.Components.Instanceprivate
LatestCompileJob()Tgstation.Server.Host.Components.Instance
loggerTgstation.Server.Host.Components.Instanceprivate
metadataTgstation.Server.Host.Components.Instanceprivate
Rename(string newName)Tgstation.Server.Host.Components.Instance
RepositoryManagerTgstation.Server.Host.Components.Instance
SetAutoUpdateInterval(uint newInterval)Tgstation.Server.Host.Components.Instance
StartAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Instance
StopAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Instance
timerCtsTgstation.Server.Host.Components.Instanceprivate
TimerLoop(uint minutes, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Instanceprivate
timerTaskTgstation.Server.Host.Components.Instanceprivate
WatchdogTgstation.Server.Host.Components.Instance
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html new file mode 100644 index 0000000000..2b08be560b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html @@ -0,0 +1,1134 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Instance Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Instance Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Instance:
+
+
+ + +Tgstation.Server.Host.Components.IInstance +IHostedService +IDisposable + +
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 Instance (Api.Models.Instance metadata, IRepositoryManager repositoryManager, IByondManager byondManager, IDreamMaker dreamMaker, IWatchdog watchdog, IChat chat, StaticFiles.IConfiguration configuration, ICompileJobConsumer compileJobConsumer, IDatabaseContextFactory databaseContextFactory, IDmbFactory dmbFactory, IJobManager jobManager, IEventConsumer eventConsumer, IGitHubClientFactory gitHubClientFactory, ILogger< Instance > logger)
 Construct an Instance More...
 
void Dispose ()
 
async Task CompileProcess (Job job, IDatabaseContext databaseContext, Action< int > progressReporter, CancellationToken cancellationToken)
 Run the compile job and insert it into the database. Meant to be called by a Core.IJobManager More...
 
void Rename (string newName)
 Rename the IInstance More...
 
async Task StartAsync (CancellationToken cancellationToken)
 
Task StopAsync (CancellationToken cancellationToken)
 
async Task SetAutoUpdateInterval (uint newInterval)
 Change the Api.Models.Instance.AutoUpdateInterval for the IInstance More...
 
CompileJob LatestCompileJob ()
 The latest staged CompileJob More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

IRepositoryManager RepositoryManager [get]
 
IByondManager ByondManager [get]
 
IWatchdog Watchdog [get]
 
IChat Chat [get]
 
StaticFiles.IConfiguration Configuration [get]
 
- Properties inherited from Tgstation.Server.Host.Components.IInstance
IRepositoryManager RepositoryManager [get]
 The IRepositoryManager for the IInstance More...
 
IByondManager ByondManager [get]
 The IByondManager for the IInstance More...
 
IWatchdog Watchdog [get]
 The IWatchdog for the IInstance More...
 
IChat Chat [get]
 The IChat for the IInstance More...
 
IConfiguration Configuration [get]
 The IConfiguration for the IInstance More...
 
+ + + + +

+Private Member Functions

async Task TimerLoop (uint minutes, CancellationToken cancellationToken)
 Pull the repository and compile for every set of given minutes More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

readonly IDreamMaker dreamMaker
 The IDreamMaker for the Instance More...
 
readonly ICompileJobConsumer compileJobConsumer
 The ICompileJobConsumer for the Instance More...
 
readonly IDatabaseContextFactory databaseContextFactory
 The IDatabaseContextFactory for the Instance More...
 
readonly IDmbFactory dmbFactory
 The IDmbFactory for the Instance More...
 
readonly IJobManager jobManager
 The IJobManager for the Instance More...
 
readonly IEventConsumer eventConsumer
 The IEventConsumer for the Instance More...
 
readonly IGitHubClientFactory gitHubClientFactory
 The IGitHubClientFactory for the Instance More...
 
readonly ILogger< Instancelogger
 The ILogger for the Instance More...
 
readonly Api.Models.Instance metadata
 The Api.Models.Instance for the Instance More...
 
Task timerTask
 The auto update Task More...
 
CancellationTokenSource timerCts
 CancellationTokenSource for timerTask More...
 
+

Detailed Description

+
+

Definition at line 23 of file Instance.cs.

+

Constructor & Destructor Documentation

+ +

◆ Instance()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Instance.Instance (Api.Models.Instance metadata,
IRepositoryManager repositoryManager,
IByondManager byondManager,
IDreamMaker dreamMaker,
IWatchdog watchdog,
IChat chat,
StaticFiles.IConfiguration configuration,
ICompileJobConsumer compileJobConsumer,
IDatabaseContextFactory databaseContextFactory,
IDmbFactory dmbFactory,
IJobManager jobManager,
IEventConsumer eventConsumer,
IGitHubClientFactory gitHubClientFactory,
ILogger< Instancelogger 
)
+
+ +

Construct an Instance

+
Parameters
+ + + + + + + + + + + + + + + +
metadataThe value of metadata
repositoryManagerThe value of RepositoryManager
byondManagerThe value of ByondManager
dreamMakerThe value of dreamMaker
watchdogThe value of Watchdog
chatThe value of Chat
configurationThe value of Configuration
compileJobConsumerThe value of compileJobConsumer
databaseContextFactoryThe value of databaseContextFactory
dmbFactoryThe value of dmbFactory
jobManagerThe value of jobManager
eventConsumerThe value of eventConsumer
gitHubClientFactoryThe value of gitHubClientFactory
loggerThe value of logger
+
+
+ +

Definition at line 112 of file Instance.cs.

+
113  {
114  this.metadata = metadata ?? throw new ArgumentNullException(nameof(metadata));
115  RepositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
116  ByondManager = byondManager ?? throw new ArgumentNullException(nameof(byondManager));
117  this.dreamMaker = dreamMaker ?? throw new ArgumentNullException(nameof(dreamMaker));
118  Watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
119  Chat = chat ?? throw new ArgumentNullException(nameof(chat));
120  Configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
121  this.compileJobConsumer = compileJobConsumer ?? throw new ArgumentNullException(nameof(compileJobConsumer));
122  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
123  this.dmbFactory = dmbFactory ?? throw new ArgumentNullException(nameof(dmbFactory));
124  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
125  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
126  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
127  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
128  }
+
readonly ICompileJobConsumer compileJobConsumer
The ICompileJobConsumer for the Instance
Definition: Instance.cs:48
+
readonly IGitHubClientFactory gitHubClientFactory
The IGitHubClientFactory for the Instance
Definition: Instance.cs:73
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the Instance
Definition: Instance.cs:68
+
readonly Api.Models.Instance metadata
The Api.Models.Instance for the Instance
Definition: Instance.cs:83
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the Instance
Definition: Instance.cs:53
+
readonly ILogger< Instance > logger
The ILogger for the Instance
Definition: Instance.cs:78
+
StaticFiles.IConfiguration Configuration
Definition: Instance.cs:38
+
readonly IDreamMaker dreamMaker
The IDreamMaker for the Instance
Definition: Instance.cs:43
+ + +
readonly IDmbFactory dmbFactory
The IDmbFactory for the Instance
Definition: Instance.cs:58
+
readonly IJobManager jobManager
The IJobManager for the Instance
Definition: Instance.cs:63
+ +
+

References Tgstation.Server.Host.Components.Instance.compileJobConsumer, Tgstation.Server.Host.Components.Instance.Configuration, Tgstation.Server.Host.Components.Instance.databaseContextFactory, Tgstation.Server.Host.Components.Instance.dmbFactory, Tgstation.Server.Host.Components.Instance.dreamMaker, Tgstation.Server.Host.Components.Instance.eventConsumer, Tgstation.Server.Host.Components.Instance.gitHubClientFactory, Tgstation.Server.Host.Components.Instance.jobManager, Tgstation.Server.Host.Components.Instance.logger, Tgstation.Server.Host.Components.Instance.metadata, and Tgstation.Server.Host.Components.Instance.Watchdog.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StartAsync(), and Tgstation.Server.Host.Components.Instance.TimerLoop().

+ +
+
+

Member Function Documentation

+ +

◆ CompileProcess()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Instance.CompileProcess (Job job,
IDatabaseContext databaseContext,
Action< int > progressReporter,
CancellationToken cancellationToken 
)
+
+ +

Run the compile job and insert it into the database. Meant to be called by a Core.IJobManager

+ +

Implements Tgstation.Server.Host.Components.IInstance.

+ +

Definition at line 142 of file Instance.cs.

+
143  {
144 #pragma warning disable IDE0016 // Use 'throw' expression
145  if (job == null)
146  throw new ArgumentNullException(nameof(job));
147 #pragma warning restore IDE0016 // Use 'throw' expression
148  if (databaseContext == null)
149  throw new ArgumentNullException(nameof(databaseContext));
150  if (progressReporter == null)
151  throw new ArgumentNullException(nameof(progressReporter));
152 
153  var ddSettingsTask = databaseContext.DreamDaemonSettings.Where(x => x.InstanceId == metadata.Id).Select(x => new DreamDaemonSettings
154  {
155  StartupTimeout = x.StartupTimeout,
156  }).FirstOrDefaultAsync(cancellationToken);
157 
158  var compileJobsTask = databaseContext.CompileJobs
159  .Where(x => x.Job.Instance.Id == metadata.Id)
160  .OrderByDescending(x => x.Job.StoppedAt)
161  .Select(x => new Job
162  {
163  StoppedAt = x.Job.StoppedAt,
164  StartedAt = x.Job.StartedAt
165  })
166  .Take(10)
167  .ToListAsync(cancellationToken);
168 
169  var dreamMakerSettings = await databaseContext.DreamMakerSettings.Where(x => x.InstanceId == metadata.Id).FirstAsync(cancellationToken).ConfigureAwait(false);
170  if (dreamMakerSettings == default)
171  throw new JobException("Missing DreamMakerSettings in DB!");
172  var ddSettings = await ddSettingsTask.ConfigureAwait(false);
173  if (ddSettings == default)
174  throw new JobException("Missing DreamDaemonSettings in DB!");
175 
176  Task<RepositorySettings> repositorySettingsTask = null;
177  string repoOwner = null;
178  string repoName = null;
179  CompileJob compileJob;
180  RevisionInformation revInfo;
181  using (var repo = await RepositoryManager.LoadRepository(cancellationToken).ConfigureAwait(false))
182  {
183  if (repo == null)
184  throw new JobException("Missing Repository!");
185 
186  if (repo.IsGitHubRepository)
187  {
188  repoOwner = repo.GitHubOwner;
189  repoName = repo.GitHubRepoName;
190  repositorySettingsTask = databaseContext.RepositorySettings.Where(x => x.InstanceId == metadata.Id).Select(x => new RepositorySettings
191  {
192  AccessToken = x.AccessToken,
193  ShowTestMergeCommitters = x.ShowTestMergeCommitters,
194  PushTestMergeCommits = x.PushTestMergeCommits
195  }).FirstOrDefaultAsync(cancellationToken);
196  }
197 
198  var repoSha = repo.Head;
199  revInfo = await databaseContext.RevisionInformations.Where(x => x.CommitSha == repoSha && x.Instance.Id == metadata.Id).Include(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy).FirstOrDefaultAsync().ConfigureAwait(false);
200 
201  if (revInfo == default)
202  {
203  revInfo = new RevisionInformation
204  {
205  CommitSha = repoSha,
206  OriginCommitSha = repoSha,
207  Instance = new Models.Instance
208  {
209  Id = metadata.Id
210  }
211  };
212  logger.LogWarning(Repository.Repository.OriginTrackingErrorTemplate, repoSha);
213  databaseContext.Instances.Attach(revInfo.Instance);
214  }
215 
216  TimeSpan? averageSpan = null;
217  var previousCompileJobs = await compileJobsTask.ConfigureAwait(false);
218  if(previousCompileJobs.Count != 0)
219  {
220  var totalSpan = TimeSpan.Zero;
221  foreach (var I in previousCompileJobs)
222  totalSpan += I.StoppedAt.Value - I.StartedAt.Value;
223  averageSpan = totalSpan / previousCompileJobs.Count;
224  }
225 
226  compileJob = await dreamMaker.Compile(revInfo, dreamMakerSettings, ddSettings.StartupTimeout.Value, repo, progressReporter, averageSpan, cancellationToken).ConfigureAwait(false);
227  }
228 
229  compileJob.Job = job;
230 
231  databaseContext.CompileJobs.Add(compileJob); // will be saved by job context
232 
233  job.PostComplete = ct => compileJobConsumer.LoadCompileJob(compileJob, ct);
234 
235  if (repositorySettingsTask != null)
236  {
237  var repositorySettings = await repositorySettingsTask.ConfigureAwait(false);
238  if (repositorySettings == default)
239  throw new JobException("Missing repository settings!");
240 
241  if (repositorySettings.AccessToken != null)
242  {
243  // potential for commenting on a test merge change
244  var outgoingCompileJob = LatestCompileJob();
245 
246  if(outgoingCompileJob != null && outgoingCompileJob.RevisionInformation.CommitSha != compileJob.RevisionInformation.CommitSha && repositorySettings.PostTestMergeComment.Value)
247  {
248  var gitHubClient = gitHubClientFactory.CreateClient(repositorySettings.AccessToken);
249 
250  async Task CommentOnPR(int prNumber, string comment)
251  {
252  try
253  {
254  await gitHubClient.Issue.Comment.Create(repoOwner, repoName, prNumber, comment).ConfigureAwait(false);
255  }
256  catch (ApiException e)
257  {
258  logger.LogWarning("Error posting GitHub comment! Exception: {0}", e);
259  }
260  }
261 
262  var tasks = new List<Task>();
263 
264  string FormatTestMerge(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}",
265  Environment.NewLine,
266  repositorySettings.ShowTestMergeCommitters.Value ? String.Format(CultureInfo.InvariantCulture, "{0}{0}##### Merged By{0}{1}", Environment.NewLine, testMerge.MergedBy.Name) : String.Empty,
267  testMerge.PullRequestRevision,
268  testMerge.Comment != null ? String.Format(CultureInfo.InvariantCulture, "{0}{0}##### Comment{0}{1}", Environment.NewLine, testMerge.Comment) : String.Empty,
269  updated ? "Updated" : "Deployed",
270  metadata.Name,
272  compileJob.RevisionInformation.CommitSha);
273 
274  // added prs
275  foreach (var I in compileJob
277  .ActiveTestMerges
278  .Select(x => x.TestMerge)
279  .Where(x => !outgoingCompileJob
281  .ActiveTestMerges
282  .Any(y => y.TestMerge.Number == x.Number)))
283  tasks.Add(CommentOnPR(I.Number.Value, FormatTestMerge(I, false)));
284 
285  // removed prs
286  foreach (var I in outgoingCompileJob
288  .ActiveTestMerges
289  .Select(x => x.TestMerge)
290  .Where(x => !compileJob
293  .Any(y => y.TestMerge.Number == x.Number)))
294  tasks.Add(CommentOnPR(I.Number.Value, "#### Test Merge Removed"));
295 
296  // updated prs
297  foreach(var I in compileJob
299  .ActiveTestMerges
300  .Select(x => x.TestMerge)
301  .Where(x => outgoingCompileJob
302  .RevisionInformation
303  .ActiveTestMerges
304  .Any(y => y.TestMerge.Number == x.Number)))
305  tasks.Add(CommentOnPR(I.Number.Value, FormatTestMerge(I, true)));
306 
307  if (tasks.Any())
308  await Task.WhenAll(tasks).ConfigureAwait(false);
309  }
310  }
311  }
312  }
DbSet< Instance > Instances
The Instances in the IDatabaseContext
+
Task LoadCompileJob(CompileJob job, CancellationToken cancellationToken)
Load a new job into the ICompileJobConsumer
+ +
CompileJob LatestCompileJob()
The latest staged CompileJob
Definition: Instance.cs:597
+ +
readonly ICompileJobConsumer compileJobConsumer
The ICompileJobConsumer for the Instance
Definition: Instance.cs:48
+
Repository(LibGit2Sharp.IRepository repository, IIOManager ioMananger, IEventConsumer eventConsumer, ICredentialsProvider credentialsProvider, ILogger< Repository > logger, Action onDispose)
Construct a Repository
Definition: Repository.cs:103
+
Job Job
See Api.Models.CompileJob.Job
Definition: CompileJob.cs:13
+ +
readonly IGitHubClientFactory gitHubClientFactory
The IGitHubClientFactory for the Instance
Definition: Instance.cs:73
+ +
readonly Api.Models.Instance metadata
The Api.Models.Instance for the Instance
Definition: Instance.cs:83
+
DateTimeOffset? StoppedAt
When the Job stopped
Definition: Job.cs:37
+
Func< CancellationToken, Task > PostComplete
A Task to run after the job completes. This will not affect the Api.Models.Internal....
Definition: Job.cs:34
+
DbSet< RepositorySettings > RepositorySettings
The Models.RepositorySettings in the IDatabaseContext
+
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+ +
readonly ILogger< Instance > logger
The ILogger for the Instance
Definition: Instance.cs:78
+
readonly IDreamMaker dreamMaker
The IDreamMaker for the Instance
Definition: Instance.cs:43
+
IGitHubClient CreateClient()
Create a client with anonymous authentication. Low rate limit
+
DbSet< CompileJob > CompileJobs
The CompileJobs in the IDatabaseContext
+
Task< Models.CompileJob > Compile(Models.RevisionInformation revisionInformation, Api.Models.DreamMaker dreamMakerSettings, uint apiValidateTimeout, IRepository repository, Action< int > progressReporter, TimeSpan? estimatedDuration, CancellationToken cancellationToken)
Starts a compile
+
DbSet< DreamMakerSettings > DreamMakerSettings
The Models.DreamMakerSettings in the IDatabaseContext
+
Instance Instance
The Models.Instance the RevisionInformation belongs to
+ +
DbSet< RevisionInformation > RevisionInformations
The RevisionInformations in the IDatabaseContext
+ + +
RevisionInformation RevisionInformation
See Api.Models.CompileJob.RevisionInformation
Definition: CompileJob.cs:24
+
DbSet< DreamDaemonSettings > DreamDaemonSettings
The Models.DreamDaemonSettings in the IDatabaseContext
+
async Task< IRepository > LoadRepository(CancellationToken cancellationToken)
Attempt to load the IRepository from the default location
+
string AccessToken
The token/password to access the git repository with
+
List< RevInfoTestMerge > ActiveTestMerges
See Api.Models.RevisionInformation.ActiveTestMerges
+
string OriginCommitSha
The sha of the most recent remote commit
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+ + +
+

References Tgstation.Server.Api.Models.Internal.RepositorySettings.AccessToken, Tgstation.Server.Host.Models.RevisionInformation.ActiveTestMerges, Tgstation.Server.Api.Models.TestMergeParameters.Comment, Tgstation.Server.Api.Models.Internal.RevisionInformation.CommitSha, Tgstation.Server.Host.Components.Compiler.IDreamMaker.Compile(), Tgstation.Server.Host.Components.Instance.compileJobConsumer, Tgstation.Server.Host.Models.IDatabaseContext.CompileJobs, Tgstation.Server.Host.Core.IGitHubClientFactory.CreateClient(), Tgstation.Server.Host.Models.IDatabaseContext.DreamDaemonSettings, Tgstation.Server.Host.Components.Instance.dreamMaker, Tgstation.Server.Host.Models.IDatabaseContext.DreamMakerSettings, Tgstation.Server.Host.Components.Instance.gitHubClientFactory, Tgstation.Server.Host.Models.RevisionInformation.Instance, Tgstation.Server.Host.Components.Instance.Instance(), Tgstation.Server.Host.Models.IDatabaseContext.Instances, Tgstation.Server.Host.Models.CompileJob.Job, Tgstation.Server.Host.Components.Instance.LatestCompileJob(), Tgstation.Server.Host.Components.Compiler.ICompileJobConsumer.LoadCompileJob(), Tgstation.Server.Host.Components.Repository.RepositoryManager.LoadRepository(), Tgstation.Server.Host.Components.Instance.logger, Tgstation.Server.Host.Models.TestMerge.MergedBy, Tgstation.Server.Host.Components.Instance.metadata, Tgstation.Server.Api.Models.Internal.User.Name, Tgstation.Server.Api.Models.Internal.RevisionInformation.OriginCommitSha, Tgstation.Server.Host.Models.Job.PostComplete, Tgstation.Server.Api.Models.TestMergeParameters.PullRequestRevision, Tgstation.Server.Host.Components.Repository.Repository.Repository(), Tgstation.Server.Host.Models.IDatabaseContext.RepositorySettings, Tgstation.Server.Host.Models.CompileJob.RevisionInformation, Tgstation.Server.Host.Models.IDatabaseContext.RevisionInformations, Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.StartupTimeout, and Tgstation.Server.Api.Models.Internal.Job.StoppedAt.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.TimerLoop().

+ +
+
+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Instance.Dispose ()
+
+ +

+ +

Definition at line 131 of file Instance.cs.

+
132  {
133  timerCts?.Dispose();
134  compileJobConsumer.Dispose();
135  Configuration.Dispose();
136  Chat.Dispose();
137  Watchdog.Dispose();
139  }
+ +
readonly ICompileJobConsumer compileJobConsumer
The ICompileJobConsumer for the Instance
Definition: Instance.cs:48
+
CancellationTokenSource timerCts
CancellationTokenSource for timerTask
Definition: Instance.cs:93
+
StaticFiles.IConfiguration Configuration
Definition: Instance.cs:38
+ + + +
+

References Tgstation.Server.Host.Components.Instance.compileJobConsumer, Tgstation.Server.Host.Components.Instance.Configuration, Tgstation.Server.Host.Components.Repository.RepositoryManager.Dispose(), Tgstation.Server.Host.Components.Chat.Chat.Dispose(), Tgstation.Server.Host.Components.Instance.timerCts, and Tgstation.Server.Host.Components.Instance.Watchdog.

+ +
+
+ +

◆ LatestCompileJob()

+ +
+
+ + + + + + + +
CompileJob Tgstation.Server.Host.Components.Instance.LatestCompileJob ()
+
+
+ +

◆ Rename()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.Components.Instance.Rename (string newName)
+
+ +

Rename the IInstance

+ +

Implements Tgstation.Server.Host.Components.IInstance.

+ +

Definition at line 541 of file Instance.cs.

+
542  {
543  if (String.IsNullOrWhiteSpace(newName))
544  throw new ArgumentNullException(nameof(newName));
545  metadata.Name = newName;
546  }
readonly Api.Models.Instance metadata
The Api.Models.Instance for the Instance
Definition: Instance.cs:83
+
+

References Tgstation.Server.Host.Components.Instance.metadata.

+ +
+
+ +

◆ SetAutoUpdateInterval()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Instance.SetAutoUpdateInterval (uint newInterval)
+
+ +

Change the Api.Models.Instance.AutoUpdateInterval for the IInstance

+ +

Implements Tgstation.Server.Host.Components.IInstance.

+ +

Definition at line 568 of file Instance.cs.

+
569  {
570  Task toWait;
571  lock (this)
572  {
573  if (timerTask != null)
574  {
575  timerCts.Cancel();
576  toWait = timerTask;
577  }
578  else
579  toWait = Task.CompletedTask;
580  }
581 
582  await toWait.ConfigureAwait(false);
583  if (newInterval == 0)
584  return;
585  lock (this)
586  {
587  // race condition, just quit
588  if (timerTask != null)
589  return;
590  timerCts?.Dispose();
591  timerCts = new CancellationTokenSource();
592  timerTask = TimerLoop(newInterval, timerCts.Token);
593  }
594  }
Task timerTask
The auto update Task
Definition: Instance.cs:88
+
CancellationTokenSource timerCts
CancellationTokenSource for timerTask
Definition: Instance.cs:93
+
async Task TimerLoop(uint minutes, CancellationToken cancellationToken)
Pull the repository and compile for every set of given minutes
Definition: Instance.cs:321
+
+

References Tgstation.Server.Host.Components.Instance.timerCts, Tgstation.Server.Host.Components.Instance.TimerLoop(), and Tgstation.Server.Host.Components.Instance.timerTask.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.StartAsync().

+ +
+
+ +

◆ StartAsync()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Instance.StartAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 549 of file Instance.cs.

+
550  {
551  await Task.WhenAll(SetAutoUpdateInterval(metadata.AutoUpdateInterval.Value), Configuration.StartAsync(cancellationToken), ByondManager.StartAsync(cancellationToken), Chat.StartAsync(cancellationToken), compileJobConsumer.StartAsync(cancellationToken)).ConfigureAwait(false);
552 
553  // dependent on so many things, its just safer this way
554  await Watchdog.StartAsync(cancellationToken).ConfigureAwait(false);
555 
556  CompileJob latestCompileJob = null;
557  await databaseContextFactory.UseContext(async db =>
558  {
559  latestCompileJob = await db.CompileJobs.Where(x => x.Job.Instance.Id == metadata.Id).OrderByDescending(x => x.Job.StoppedAt).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
560  }).ConfigureAwait(false);
561  await dmbFactory.CleanUnusedCompileJobs(latestCompileJob, cancellationToken).ConfigureAwait(false);
562  }
+
async Task SetAutoUpdateInterval(uint newInterval)
Change the Api.Models.Instance.AutoUpdateInterval for the IInstance
Definition: Instance.cs:568
+
async Task StartAsync(CancellationToken cancellationToken)
+
readonly ICompileJobConsumer compileJobConsumer
The ICompileJobConsumer for the Instance
Definition: Instance.cs:48
+
Task CleanUnusedCompileJobs(CompileJob exceptThisOne, CancellationToken cancellationToken)
Deletes all compile jobs that are inactive in the Game folder exceptThisOne
+
readonly Api.Models.Instance metadata
The Api.Models.Instance for the Instance
Definition: Instance.cs:83
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the Instance
Definition: Instance.cs:53
+
StaticFiles.IConfiguration Configuration
Definition: Instance.cs:38
+ +
async Task StartAsync(CancellationToken cancellationToken)
Definition: Chat.cs:534
+
readonly IDmbFactory dmbFactory
The IDmbFactory for the Instance
Definition: Instance.cs:58
+
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+ + +
+

References Tgstation.Server.Host.Components.Compiler.IDmbFactory.CleanUnusedCompileJobs(), Tgstation.Server.Host.Components.Instance.compileJobConsumer, Tgstation.Server.Host.Components.Instance.Configuration, Tgstation.Server.Host.Components.Instance.databaseContextFactory, Tgstation.Server.Host.Components.Instance.dmbFactory, Tgstation.Server.Host.Components.Instance.metadata, Tgstation.Server.Host.Components.Instance.SetAutoUpdateInterval(), Tgstation.Server.Host.Components.Byond.ByondManager.StartAsync(), Tgstation.Server.Host.Components.Chat.Chat.StartAsync(), Tgstation.Server.Host.Core.IDatabaseContextFactory.UseContext(), and Tgstation.Server.Host.Components.Instance.Watchdog.

+ +
+
+ +

◆ StopAsync()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.Instance.StopAsync (CancellationToken cancellationToken)
+
+ +

+ +
+
+ +

◆ TimerLoop()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Instance.TimerLoop (uint minutes,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Pull the repository and compile for every set of given minutes

+
Parameters
+ + + +
minutesHow many minutes the operation should repeat. Does not include running time
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 321 of file Instance.cs.

+
322  {
323  while (true)
324  try
325  {
326  await Task.Delay(TimeSpan.FromMinutes(minutes > Int32.MaxValue ? Int32.MaxValue : (int)minutes), cancellationToken).ConfigureAwait(false);
327  logger.LogDebug("Beginning auto update...");
328  await eventConsumer.HandleEvent(EventType.InstanceAutoUpdateStart, new List<string>(), cancellationToken).ConfigureAwait(false);
329  try
330  {
331  Models.User user = null;
332  await databaseContextFactory.UseContext(async (db) => user = await db.Users.Where(x => x.CanonicalName == Api.Models.User.AdminName.ToUpperInvariant()).FirstAsync(cancellationToken).ConfigureAwait(false)).ConfigureAwait(false);
333  var repositoryUpdateJob = new Job
334  {
335  Instance = new Models.Instance
336  {
337  Id = metadata.Id
338  },
339  Description = "Scheduled repository update",
340  CancelRightsType = RightsType.Repository,
341  CancelRight = (ulong)RepositoryRights.CancelPendingChanges,
342  StartedBy = user
343  };
344 
345  string deploySha = null;
346  await jobManager.RegisterOperation(repositoryUpdateJob, async (paramJob, databaseContext, progressReporter, jobCancellationToken) =>
347  {
348  var repositorySettingsTask = databaseContext.RepositorySettings.Where(x => x.InstanceId == metadata.Id).FirstAsync(jobCancellationToken);
349 
350  // assume 5 steps with synchronize
351  const int ProgressSections = 7;
352  const int ProgressStep = 100 / ProgressSections;
353 
354  const int NumSteps = 3;
355  var doneSteps = 0;
356 
357  Action<int> NextProgressReporter()
358  {
359  var tmpDoneSteps = doneSteps;
360  ++doneSteps;
361  return progress => progressReporter((progress + (100 * tmpDoneSteps)) / NumSteps);
362  }
363 
364  using (var repo = await RepositoryManager.LoadRepository(jobCancellationToken).ConfigureAwait(false))
365  {
366  if (repo == null)
367  {
368  logger.LogTrace("Aborting repo update, no repository!");
369  return;
370  }
371 
372  var startSha = repo.Head;
373  if (!repo.Tracking)
374  {
375  logger.LogTrace("Aborting repo update, active ref not tracking any remote branch!");
376  deploySha = startSha;
377  return;
378  }
379 
380  var repositorySettings = await repositorySettingsTask.ConfigureAwait(false);
381 
382  // the main point of auto update is to pull the remote
383  await repo.FetchOrigin(repositorySettings.AccessUser, repositorySettings.AccessToken, NextProgressReporter(), jobCancellationToken).ConfigureAwait(false);
384 
385  RevisionInformation currentRevInfo = null;
386  bool hasDbChanges = false;
387 
388  Task<RevisionInformation> LoadRevInfo() => databaseContext.RevisionInformations
389  .Where(x => x.CommitSha == startSha && x.Instance.Id == metadata.Id)
390  .Include(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge)
391  .FirstOrDefaultAsync(cancellationToken);
392 
393  async Task UpdateRevInfo(string currentHead, bool onOrigin)
394  {
395  if(currentRevInfo == null)
396  currentRevInfo = await LoadRevInfo().ConfigureAwait(false);
397 
398  if (currentRevInfo == default)
399  {
400  logger.LogWarning(Repository.Repository.OriginTrackingErrorTemplate, currentHead);
401  onOrigin = true;
402  }
403 
404  var attachedInstance = new Models.Instance
405  {
406  Id = metadata.Id
407  };
408  var oldRevInfo = currentRevInfo;
409  currentRevInfo = new RevisionInformation
410  {
411  CommitSha = currentHead,
412  OriginCommitSha = onOrigin ? currentHead : oldRevInfo.OriginCommitSha,
413  Instance = attachedInstance
414  };
415  if (!onOrigin)
416  currentRevInfo.ActiveTestMerges = new List<RevInfoTestMerge>(oldRevInfo.ActiveTestMerges);
417 
418  databaseContext.Instances.Attach(attachedInstance);
419  databaseContext.RevisionInformations.Add(currentRevInfo);
420  hasDbChanges = true;
421  }
422 
423  // take appropriate auto update actions
424  bool shouldSyncTracked;
425  if (repositorySettings.AutoUpdatesKeepTestMerges.Value)
426  {
427  logger.LogTrace("Preserving test merges...");
428 
429  var currentRevInfoTask = LoadRevInfo();
430 
431  var result = await repo.MergeOrigin(repositorySettings.CommitterName, repositorySettings.CommitterEmail, NextProgressReporter(), jobCancellationToken).ConfigureAwait(false);
432 
433  if (!result.HasValue)
434  throw new JobException("Merge conflict while preserving test merges!");
435 
436  currentRevInfo = await currentRevInfoTask.ConfigureAwait(false);
437 
438  var lastRevInfoWasOriginCommit = currentRevInfo == default || currentRevInfo.CommitSha == currentRevInfo.OriginCommitSha;
439  var stillOnOrigin = result.Value && lastRevInfoWasOriginCommit;
440 
441  var currentHead = repo.Head;
442  if (currentHead != startSha)
443  {
444  await UpdateRevInfo(currentHead, stillOnOrigin).ConfigureAwait(false);
445  shouldSyncTracked = stillOnOrigin;
446  }
447  else
448  shouldSyncTracked = false;
449  }
450  else
451  {
452  logger.LogTrace("Not preserving test merges...");
453  await repo.ResetToOrigin(NextProgressReporter(), jobCancellationToken).ConfigureAwait(false);
454 
455  var currentHead = repo.Head;
456 
457  currentRevInfo = await databaseContext.RevisionInformations
458  .Where(x => x.CommitSha == currentHead && x.Instance.Id == metadata.Id)
459  .FirstOrDefaultAsync(jobCancellationToken).ConfigureAwait(false);
460 
461  if (currentHead != startSha && currentRevInfo != default)
462  await UpdateRevInfo(currentHead, true).ConfigureAwait(false);
463 
464  shouldSyncTracked = true;
465  }
466 
467  // synch if necessary
468  if (repositorySettings.AutoUpdatesSynchronize.Value && startSha != repo.Head)
469  {
470  var pushedOrigin = await repo.Sychronize(repositorySettings.AccessUser, repositorySettings.AccessToken, repositorySettings.CommitterName, repositorySettings.CommitterEmail, NextProgressReporter(), shouldSyncTracked, jobCancellationToken).ConfigureAwait(false);
471  var currentHead = repo.Head;
472  if (currentHead != currentRevInfo.CommitSha)
473  await UpdateRevInfo(currentHead, pushedOrigin).ConfigureAwait(false);
474  }
475 
476  if(hasDbChanges)
477  try
478  {
479  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
480  }
481  catch
482  {
483  await repo.ResetToSha(startSha, progressReporter, default).ConfigureAwait(false);
484  throw;
485  }
486 
487  progressReporter(5 * ProgressStep);
488  deploySha = repo.Head;
489  }
490  }, cancellationToken).ConfigureAwait(false);
491 
492  await jobManager.WaitForJobCompletion(repositoryUpdateJob, user, cancellationToken, default).ConfigureAwait(false);
493 
494  if (deploySha == null)
495  {
496  logger.LogTrace("Aborting auto update, repository error!");
497  continue;
498  }
499 
501  {
502  logger.LogTrace("Aborting auto update, same revision as latest CompileJob");
503  continue;
504  }
505 
506  // finally set up the job
507  var compileProcessJob = new Job
508  {
509  StartedBy = user,
510  Instance = repositoryUpdateJob.Instance,
511  Description = "Scheduled code deployment",
512  CancelRightsType = RightsType.DreamMaker,
513  CancelRight = (ulong)DreamMakerRights.CancelCompile
514  };
515 
516  await jobManager.RegisterOperation(compileProcessJob, CompileProcess, cancellationToken).ConfigureAwait(false);
517 
518  await jobManager.WaitForJobCompletion(compileProcessJob, user, cancellationToken, default).ConfigureAwait(false);
519  }
520  catch (OperationCanceledException)
521  {
522  logger.LogDebug("Cancelled auto update job!");
523  throw;
524  }
525  catch (Exception e)
526  {
527  logger.LogWarning("Error in auto update loop! Exception: {0}", e);
528  continue;
529  }
530  }
531  catch (OperationCanceledException)
532  {
533  break;
534  }
535 
536  logger.LogTrace("Leaving auto update loop...");
537  }
async Task CompileProcess(Job job, IDatabaseContext databaseContext, Action< int > progressReporter, CancellationToken cancellationToken)
Run the compile job and insert it into the database. Meant to be called by a Core....
Definition: Instance.cs:142
+
CompileJob LatestCompileJob()
The latest staged CompileJob
Definition: Instance.cs:597
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+
Repository(LibGit2Sharp.IRepository repository, IIOManager ioMananger, IEventConsumer eventConsumer, ICredentialsProvider credentialsProvider, ILogger< Repository > logger, Action onDispose)
Construct a Repository
Definition: Repository.cs:103
+
Task RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
Registers a given Job and begins running it
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the Instance
Definition: Instance.cs:68
+ +
readonly Api.Models.Instance metadata
The Api.Models.Instance for the Instance
Definition: Instance.cs:83
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the Instance
Definition: Instance.cs:53
+
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+ +
DreamMakerRights
Rights for Models.DreamMaker
+
readonly ILogger< Instance > logger
The ILogger for the Instance
Definition: Instance.cs:78
+
RepositoryRights
Rights for a Models.Repository
+ + +
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+ +
readonly IJobManager jobManager
The IJobManager for the Instance
Definition: Instance.cs:63
+
Task WaitForJobCompletion(Job job, User canceller, CancellationToken jobCancellationToken, CancellationToken cancellationToken)
Wait for a given job to complete
+
async Task< IRepository > LoadRepository(CancellationToken cancellationToken)
Attempt to load the IRepository from the default location
+
Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+
List< RevInfoTestMerge > ActiveTestMerges
See Api.Models.RevisionInformation.ActiveTestMerges
+
string OriginCommitSha
The sha of the most recent remote commit
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+
+

References Tgstation.Server.Host.Models.RevisionInformation.ActiveTestMerges, Tgstation.Server.Api.Models.Internal.RevisionInformation.CommitSha, Tgstation.Server.Host.Components.Instance.CompileProcess(), Tgstation.Server.Host.Components.Instance.databaseContextFactory, Tgstation.Server.Host.Components.Instance.eventConsumer, Tgstation.Server.Host.Components.IEventConsumer.HandleEvent(), Tgstation.Server.Host.Components.Instance.Instance(), Tgstation.Server.Host.Components.Instance.jobManager, Tgstation.Server.Host.Components.Instance.LatestCompileJob(), Tgstation.Server.Host.Components.Repository.RepositoryManager.LoadRepository(), Tgstation.Server.Host.Components.Instance.logger, Tgstation.Server.Host.Components.Instance.metadata, Tgstation.Server.Api.Models.Internal.RevisionInformation.OriginCommitSha, Tgstation.Server.Host.Core.IJobManager.RegisterOperation(), Tgstation.Server.Host.Components.Repository.Repository.Repository(), Tgstation.Server.Host.Core.IDatabaseContextFactory.UseContext(), and Tgstation.Server.Host.Core.IJobManager.WaitForJobCompletion().

+ +

Referenced by Tgstation.Server.Host.Components.Instance.SetAutoUpdateInterval().

+ +
+
+

Member Data Documentation

+ +

◆ compileJobConsumer

+ +
+
+ + + + + +
+ + + + +
readonly ICompileJobConsumer Tgstation.Server.Host.Components.Instance.compileJobConsumer
+
+private
+
+
+ +

◆ databaseContextFactory

+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContextFactory Tgstation.Server.Host.Components.Instance.databaseContextFactory
+
+private
+
+
+ +

◆ dmbFactory

+ +
+
+ + + + + +
+ + + + +
readonly IDmbFactory Tgstation.Server.Host.Components.Instance.dmbFactory
+
+private
+
+
+ +

◆ dreamMaker

+ +
+
+ + + + + +
+ + + + +
readonly IDreamMaker Tgstation.Server.Host.Components.Instance.dreamMaker
+
+private
+
+ +

The IDreamMaker for the Instance

+ +

Definition at line 43 of file Instance.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess(), and Tgstation.Server.Host.Components.Instance.Instance().

+ +
+
+ +

◆ eventConsumer

+ +
+
+ + + + + +
+ + + + +
readonly IEventConsumer Tgstation.Server.Host.Components.Instance.eventConsumer
+
+private
+
+
+ +

◆ gitHubClientFactory

+ +
+
+ + + + + +
+ + + + +
readonly IGitHubClientFactory Tgstation.Server.Host.Components.Instance.gitHubClientFactory
+
+private
+
+ +

The IGitHubClientFactory for the Instance

+ +

Definition at line 73 of file Instance.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess(), and Tgstation.Server.Host.Components.Instance.Instance().

+ +
+
+ +

◆ jobManager

+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Components.Instance.jobManager
+
+private
+
+ +

The IJobManager for the Instance

+ +

Definition at line 63 of file Instance.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.Instance(), and Tgstation.Server.Host.Components.Instance.TimerLoop().

+ +
+
+ +

◆ logger

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<Instance> Tgstation.Server.Host.Components.Instance.logger
+
+private
+
+
+ +

◆ metadata

+ + + +

◆ timerCts

+ +
+
+ + + + + +
+ + + + +
CancellationTokenSource Tgstation.Server.Host.Components.Instance.timerCts
+
+private
+
+ +

CancellationTokenSource for timerTask

+ +

Definition at line 93 of file Instance.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.Dispose(), and Tgstation.Server.Host.Components.Instance.SetAutoUpdateInterval().

+ +
+
+ +

◆ timerTask

+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Components.Instance.timerTask
+
+private
+
+ +

The auto update Task

+ +

Definition at line 88 of file Instance.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.SetAutoUpdateInterval().

+ +
+
+

Property Documentation

+ +

◆ ByondManager

+ +
+
+ + + + + +
+ + + + +
IByondManager Tgstation.Server.Host.Components.Instance.ByondManager
+
+get
+
+ +

+ +

Definition at line 29 of file Instance.cs.

+
29 { get; }
+
+
+ +

◆ Chat

+ +
+
+ + + + + +
+ + + + +
IChat Tgstation.Server.Host.Components.Instance.Chat
+
+get
+
+ +

+ +

Definition at line 35 of file Instance.cs.

+
35 { get; }
+
+
+ +

◆ Configuration

+ +
+
+ + + + + +
+ + + + +
StaticFiles.IConfiguration Tgstation.Server.Host.Components.Instance.Configuration
+
+get
+
+
+ +

◆ RepositoryManager

+ +
+
+ + + + + +
+ + + + +
IRepositoryManager Tgstation.Server.Host.Components.Instance.RepositoryManager
+
+get
+
+ +

+ +

Definition at line 26 of file Instance.cs.

+
26 { get; }
+
+
+ +

◆ Watchdog

+ +
+
+ + + + + +
+ + + + +
IWatchdog Tgstation.Server.Host.Components.Instance.Watchdog
+
+get
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.png new file mode 100644 index 0000000000000000000000000000000000000000..d04b4f31d7284a4f4abc2136eaee73d79d058e0a GIT binary patch literal 1816 zcmbW2eOyxa9>)Pi)RmPx+l-Y|IvYJOGp9s`-lYh6#f6?Z$JC;=+#Huk@d-s+^A`9( z=u*qnwxQNBAE-&0Fqnxhbw0c{@>TdyaLHa%G|Q(zV25q@ulvt^?Yv&+cfQ~A`@DX? z@5B3dj_`eYZm;_-IVj#+!zx~;N$ z`R0FL!=mQyc_`mo#q(2X=G24=qfwSuaXcZ(I||em?TtDNF6zTY)We|m93c4?f;Ql{ zMS!3WBU}VQJ|Y!%3$7;oelXQXs^XxU^#Qk;zAdiw}wQCbd9{3>`3u9!y8}xWN!ydg}VP_ zuQ#gR(ag5Xf0%0tJbOQpjqZrPJQ>WhiHwG-UwfmLvlsExy=nDCoHf(!(@?tfDr6=I zJ`iEbr|!+nJ8!KeXpYLp?)Q@qefnEsTer#eM6NjzEPIDutr`YR>`1{V>edFcnGrX42g&9~sza798aLj`(9G72bqs{1f? z6ArIXDwTyMC#0Y@-Nm_B1g!Vp!3a}dr6Q5vZA1V6FVw9p2R*0#X@4-|KJXfT8#-`X zgtWks$uOKC3LA_k+=>CC-wm3~H8xIXLgCFv&>t$3;x3#-SVrJ7J??{ zh>}0bVe196%I1mZ3SPe2PebGgipGsh0~|r3h_6o5)>ERlU-w|=DVMsu+NN9lG>U9WgB|HyVgS9Gi4#z8;h=E<8vi zcZ4w1r36j;8$I3pYN+*KKGQQ}TuJ|NT9wf#Yg+r%RMsx!1>oYN$2)X+xuv?;ARqJd zJrgWDqN&VLQN|Z_pCvUz=EJowcELUm|HMrN{njW1o~38()l|hcL4wOvWX#m<+&EDA zI;@BgQIQTzufT`?&rbH-*wx<;lky5@{g!Zd*S0Cs?hnGw0qY-qmARdT{t8BhF7*7H z{QNEC^rt#LPV#mw2cGGDodzz1l_3K?sR0EP6wPIry5$}MyBtQiwXOkMJ*OHh-=E}s zVvMe(ZrY}hk;qPM}C+`o{9x9KS-0X`~61mcmI5M-oK9B{-!CjF1eEfbREP~x?_jeIVpK& z^!_J5TZR<^@1T)-BIo&tYROZaeDuUoX~EvX`l>rQrk^4iV`m?eA~~;6bi9DrVn17w z=uBeX%d7?Wo4|5o5zsbu8mJ@SItMSum(xUvP8d8nk!&Nz=8~EYWEI|Y@j=fJ5Be&5}JlUap%)0W_~&)z;i`SnO_?OX7vN!-Hzs1WDJP~Uuj35aQWb~oHTE6B}v zW0=orU#Aq`^PeC}oXgf+kvQ5#sO*P78k1@}Lf!Y>{?!j@Bk*qwL5rY=x4d`c%ijUq C4_lc4 literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory-members.html new file mode 100644 index 0000000000..ef472d9206 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory-members.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.InstanceFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.InstanceFactory, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + +
applicationTgstation.Server.Host.Components.InstanceFactoryprivate
byondInstallerTgstation.Server.Host.Components.InstanceFactoryprivate
byondTopicSenderTgstation.Server.Host.Components.InstanceFactoryprivate
chatFactoryTgstation.Server.Host.Components.InstanceFactoryprivate
CreateInstance(Models.Instance metadata)Tgstation.Server.Host.Components.InstanceFactory
credentialsProviderTgstation.Server.Host.Components.InstanceFactoryprivate
cryptographySuiteTgstation.Server.Host.Components.InstanceFactoryprivate
databaseContextFactoryTgstation.Server.Host.Components.InstanceFactoryprivate
gitHubClientFactoryTgstation.Server.Host.Components.InstanceFactoryprivate
InstanceFactory(IIOManager ioManager, IDatabaseContextFactory databaseContextFactory, IApplication application, ILoggerFactory loggerFactory, IByondTopicSender byondTopicSender, ICryptographySuite cryptographySuite, ISynchronousIOManager synchronousIOManager, ISymlinkFactory symlinkFactory, IByondInstaller byondInstaller, IChatFactory chatFactory, IProcessExecutor processExecutor, IPostWriteHandler postWriteHandler, IWatchdogFactory watchdogFactory, IJobManager jobManager, ICredentialsProvider credentialsProvider, INetworkPromptReaper networkPromptReaper, IGitHubClientFactory gitHubClientFactory, IPlatformIdentifier platformIdentifier)Tgstation.Server.Host.Components.InstanceFactory
ioManagerTgstation.Server.Host.Components.InstanceFactoryprivate
jobManagerTgstation.Server.Host.Components.InstanceFactoryprivate
loggerFactoryTgstation.Server.Host.Components.InstanceFactoryprivate
networkPromptReaperTgstation.Server.Host.Components.InstanceFactoryprivate
platformIdentifierTgstation.Server.Host.Components.InstanceFactoryprivate
postWriteHandlerTgstation.Server.Host.Components.InstanceFactoryprivate
processExecutorTgstation.Server.Host.Components.InstanceFactoryprivate
StartAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.InstanceFactory
StopAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.InstanceFactory
symlinkFactoryTgstation.Server.Host.Components.InstanceFactoryprivate
synchronousIOManagerTgstation.Server.Host.Components.InstanceFactoryprivate
watchdogFactoryTgstation.Server.Host.Components.InstanceFactoryprivate
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html new file mode 100644 index 0000000000..9939e80d02 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html @@ -0,0 +1,949 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.InstanceFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.InstanceFactory Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.InstanceFactory:
+
+
+ + +Tgstation.Server.Host.Components.IInstanceFactory +IHostedService + +
+ + + + + + + + + + + + +

+Public Member Functions

 InstanceFactory (IIOManager ioManager, IDatabaseContextFactory databaseContextFactory, IApplication application, ILoggerFactory loggerFactory, IByondTopicSender byondTopicSender, ICryptographySuite cryptographySuite, ISynchronousIOManager synchronousIOManager, ISymlinkFactory symlinkFactory, IByondInstaller byondInstaller, IChatFactory chatFactory, IProcessExecutor processExecutor, IPostWriteHandler postWriteHandler, IWatchdogFactory watchdogFactory, IJobManager jobManager, ICredentialsProvider credentialsProvider, INetworkPromptReaper networkPromptReaper, IGitHubClientFactory gitHubClientFactory, IPlatformIdentifier platformIdentifier)
 Construct an InstanceFactory More...
 
IInstance CreateInstance (Models.Instance metadata)
 Create an IInstance More...
 
Task StartAsync (CancellationToken cancellationToken)
 
Task StopAsync (CancellationToken cancellationToken)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

readonly IIOManager ioManager
 The IIOManager for the InstanceFactory More...
 
readonly IDatabaseContextFactory databaseContextFactory
 The IDatabaseContextFactory for the InstanceFactory More...
 
readonly IApplication application
 The IApplication for the InstanceFactory More...
 
readonly ILoggerFactory loggerFactory
 The ILoggerFactory for the InstanceFactory More...
 
readonly IByondTopicSender byondTopicSender
 The IByondTopicSender for the InstanceFactory More...
 
readonly ICryptographySuite cryptographySuite
 The ICryptographySuite for the InstanceFactory More...
 
readonly ISynchronousIOManager synchronousIOManager
 The ISynchronousIOManager for the InstanceFactory More...
 
readonly ISymlinkFactory symlinkFactory
 The ISymlinkFactory for the InstanceFactory More...
 
readonly IByondInstaller byondInstaller
 The IByondInstaller for the InstanceFactory More...
 
readonly IChatFactory chatFactory
 The IProviderFactory for the InstanceFactory More...
 
readonly IProcessExecutor processExecutor
 The IProcessExecutor for the InstanceFactory More...
 
readonly IPostWriteHandler postWriteHandler
 The IPostWriteHandler for the InstanceFactory More...
 
readonly IWatchdogFactory watchdogFactory
 The IWatchdogFactory for the InstanceFactory More...
 
readonly IJobManager jobManager
 The IJobManager for the InstanceFactory More...
 
readonly ICredentialsProvider credentialsProvider
 The ICredentialsProvider for the InstanceFactory More...
 
readonly INetworkPromptReaper networkPromptReaper
 The INetworkPromptReaper for the InstanceFactory More...
 
readonly IGitHubClientFactory gitHubClientFactory
 The IGitHubClientFactory for the InstanceFactory More...
 
readonly IPlatformIdentifier platformIdentifier
 The IPlatformIdentifier for the InstanceFactory More...
 
+

Detailed Description

+
+

Definition at line 19 of file InstanceFactory.cs.

+

Constructor & Destructor Documentation

+ +

◆ InstanceFactory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.InstanceFactory.InstanceFactory (IIOManager ioManager,
IDatabaseContextFactory databaseContextFactory,
IApplication application,
ILoggerFactory loggerFactory,
IByondTopicSender byondTopicSender,
ICryptographySuite cryptographySuite,
ISynchronousIOManager synchronousIOManager,
ISymlinkFactory symlinkFactory,
IByondInstaller byondInstaller,
IChatFactory chatFactory,
IProcessExecutor processExecutor,
IPostWriteHandler postWriteHandler,
IWatchdogFactory watchdogFactory,
IJobManager jobManager,
ICredentialsProvider credentialsProvider,
INetworkPromptReaper networkPromptReaper,
IGitHubClientFactory gitHubClientFactory,
IPlatformIdentifier platformIdentifier 
)
+
+ +

Construct an InstanceFactory

+
Parameters
+ + + + + + + + + + + + + + + + + + + +
ioManagerThe value of ioManager
databaseContextFactoryThe value of databaseContextFactory
applicationThe value of application
loggerFactoryThe value of loggerFactory
byondTopicSenderThe value of byondTopicSender
cryptographySuiteThe value of cryptographySuite
synchronousIOManagerThe value of synchronousIOManager
symlinkFactoryThe value of symlinkFactory
byondInstallerThe value of byondInstaller
chatFactoryThe value of chatFactory
processExecutorThe value of processExecutor
postWriteHandlerThe value of postWriteHandler
watchdogFactoryThe value of watchdogFactory
jobManagerThe value of jobManager
credentialsProviderThe value of credentialsProvider
networkPromptReaperThe value of networkPromptReaper
gitHubClientFactoryThe value of gitHubClientFactory
platformIdentifierThe value of platformIdentifier
+
+
+ +

Definition at line 132 of file InstanceFactory.cs.

+
133  {
134  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
135  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
136  this.application = application ?? throw new ArgumentNullException(nameof(application));
137  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
138  this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
139  this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
140  this.synchronousIOManager = synchronousIOManager ?? throw new ArgumentNullException(nameof(synchronousIOManager));
141  this.symlinkFactory = symlinkFactory ?? throw new ArgumentNullException(nameof(symlinkFactory));
142  this.byondInstaller = byondInstaller ?? throw new ArgumentNullException(nameof(byondInstaller));
143  this.chatFactory = chatFactory ?? throw new ArgumentNullException(nameof(chatFactory));
144  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
145  this.postWriteHandler = postWriteHandler ?? throw new ArgumentNullException(nameof(postWriteHandler));
146  this.watchdogFactory = watchdogFactory ?? throw new ArgumentNullException(nameof(watchdogFactory));
147  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
148  this.credentialsProvider = credentialsProvider ?? throw new ArgumentNullException(nameof(credentialsProvider));
149  this.networkPromptReaper = networkPromptReaper ?? throw new ArgumentNullException(nameof(networkPromptReaper));
150  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
151  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
152  }
readonly ISynchronousIOManager synchronousIOManager
The ISynchronousIOManager for the InstanceFactory
+
readonly IByondInstaller byondInstaller
The IByondInstaller for the InstanceFactory
+
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the InstanceFactory
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the InstanceFactory
+
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the InstanceFactory
+
readonly IApplication application
The IApplication for the InstanceFactory
+
readonly IProcessExecutor processExecutor
The IProcessExecutor for the InstanceFactory
+
readonly INetworkPromptReaper networkPromptReaper
The INetworkPromptReaper for the InstanceFactory
+
readonly IPostWriteHandler postWriteHandler
The IPostWriteHandler for the InstanceFactory
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the InstanceFactory
+
readonly IWatchdogFactory watchdogFactory
The IWatchdogFactory for the InstanceFactory
+
readonly ICredentialsProvider credentialsProvider
The ICredentialsProvider for the InstanceFactory
+
readonly IIOManager ioManager
The IIOManager for the InstanceFactory
+
readonly IGitHubClientFactory gitHubClientFactory
The IGitHubClientFactory for the InstanceFactory
+
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the InstanceFactory
+
readonly ISymlinkFactory symlinkFactory
The ISymlinkFactory for the InstanceFactory
+
readonly IJobManager jobManager
The IJobManager for the InstanceFactory
+
readonly IChatFactory chatFactory
The IProviderFactory for the InstanceFactory
+
+

References Tgstation.Server.Host.Components.InstanceFactory.application, Tgstation.Server.Host.Components.InstanceFactory.byondInstaller, Tgstation.Server.Host.Components.InstanceFactory.byondTopicSender, Tgstation.Server.Host.Components.InstanceFactory.chatFactory, Tgstation.Server.Host.Components.InstanceFactory.credentialsProvider, Tgstation.Server.Host.Components.InstanceFactory.cryptographySuite, Tgstation.Server.Host.Components.InstanceFactory.databaseContextFactory, Tgstation.Server.Host.Components.InstanceFactory.gitHubClientFactory, Tgstation.Server.Host.Components.InstanceFactory.ioManager, Tgstation.Server.Host.Components.InstanceFactory.jobManager, Tgstation.Server.Host.Components.InstanceFactory.loggerFactory, Tgstation.Server.Host.Components.InstanceFactory.networkPromptReaper, Tgstation.Server.Host.Components.InstanceFactory.platformIdentifier, Tgstation.Server.Host.Components.InstanceFactory.postWriteHandler, Tgstation.Server.Host.Components.InstanceFactory.processExecutor, Tgstation.Server.Host.Components.InstanceFactory.symlinkFactory, Tgstation.Server.Host.Components.InstanceFactory.synchronousIOManager, and Tgstation.Server.Host.Components.InstanceFactory.watchdogFactory.

+ +
+
+

Member Function Documentation

+ +

◆ CreateInstance()

+ +
+
+ + + + + + + + +
IInstance Tgstation.Server.Host.Components.InstanceFactory.CreateInstance (Models.Instance metadata)
+
+ +

Create an IInstance

+ +

Implements Tgstation.Server.Host.Components.IInstanceFactory.

+ +

Definition at line 156 of file InstanceFactory.cs.

+
157  {
158  // Create the ioManager for the instance
159  var instanceIoManager = new ResolvingIOManager(ioManager, metadata.Path);
160 
161  // various other ioManagers
162  var repoIoManager = new ResolvingIOManager(instanceIoManager, "Repository");
163  var byondIOManager = new ResolvingIOManager(instanceIoManager, "Byond");
164  var gameIoManager = new ResolvingIOManager(instanceIoManager, "Game");
165  var configurationIoManager = new ResolvingIOManager(instanceIoManager, "Configuration");
166 
167  var configuration = new StaticFiles.Configuration(configurationIoManager, synchronousIOManager, symlinkFactory, processExecutor, postWriteHandler, platformIdentifier, loggerFactory.CreateLogger<StaticFiles.Configuration>());
168  var eventConsumer = new EventConsumer(configuration);
169 
170  var dmbFactory = new DmbFactory(databaseContextFactory, gameIoManager, loggerFactory.CreateLogger<DmbFactory>(), metadata.CloneMetadata());
171  try
172  {
173  var repoManager = new RepositoryManager(metadata.RepositorySettings, repoIoManager, eventConsumer, credentialsProvider, loggerFactory.CreateLogger<Repository.Repository>(), loggerFactory.CreateLogger<RepositoryManager>());
174  try
175  {
176  var byond = new ByondManager(byondIOManager, byondInstaller, eventConsumer, loggerFactory.CreateLogger<ByondManager>());
177 
178  var commandFactory = new CommandFactory(application, byond, repoManager, databaseContextFactory, metadata);
179 
180  var chat = chatFactory.CreateChat(instanceIoManager, commandFactory, metadata.ChatSettings);
181  try
182  {
183  var sessionControllerFactory = new SessionControllerFactory(processExecutor, byond, byondTopicSender, cryptographySuite, application, gameIoManager, chat, networkPromptReaper, platformIdentifier, loggerFactory, metadata.CloneMetadata());
184  var reattachInfoHandler = new ReattachInfoHandler(databaseContextFactory, dmbFactory, loggerFactory.CreateLogger<ReattachInfoHandler>(), metadata.CloneMetadata());
185  var watchdog = watchdogFactory.CreateWatchdog(chat, dmbFactory, reattachInfoHandler, configuration, sessionControllerFactory, metadata.CloneMetadata(), metadata.DreamDaemonSettings);
186  eventConsumer.SetWatchdog(watchdog);
187  commandFactory.SetWatchdog(watchdog);
188  try
189  {
190  var dreamMaker = new DreamMaker(byond, gameIoManager, configuration, sessionControllerFactory, dmbFactory, application, eventConsumer, chat, processExecutor, watchdog, loggerFactory.CreateLogger<DreamMaker>());
191 
192  return new Instance(metadata.CloneMetadata(), repoManager, byond, dreamMaker, watchdog, chat, configuration, dmbFactory, databaseContextFactory, dmbFactory, jobManager, eventConsumer, gitHubClientFactory, loggerFactory.CreateLogger<Instance>());
193  }
194  catch
195  {
196  watchdog.Dispose();
197  throw;
198  }
199  }
200  catch
201  {
202  chat.Dispose();
203  throw;
204  }
205  }
206  catch
207  {
208  repoManager.Dispose();
209  throw;
210  }
211  }
212  catch
213  {
214  dmbFactory.Dispose();
215  throw;
216  }
217  }
+
readonly ISynchronousIOManager synchronousIOManager
The ISynchronousIOManager for the InstanceFactory
+
readonly IByondInstaller byondInstaller
The IByondInstaller for the InstanceFactory
+
IChat CreateChat(IIOManager ioManager, ICommandFactory commandFactory, IEnumerable< Models.ChatBot > initialChatBots)
Create a IChat
+
An IIOManager that resolve relative paths from another IIOManager to a subdirectory of that
+
IWatchdog CreateWatchdog(IChat chat, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IEventConsumer eventConsumer, ISessionControllerFactory sessionControllerFactory, Api.Models.Instance instance, DreamDaemonSettings settings)
Creates a IWatchdog
+
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the InstanceFactory
+ +
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the InstanceFactory
+
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the InstanceFactory
+
readonly IApplication application
The IApplication for the InstanceFactory
+
Repository(LibGit2Sharp.IRepository repository, IIOManager ioMananger, IEventConsumer eventConsumer, ICredentialsProvider credentialsProvider, ILogger< Repository > logger, Action onDispose)
Construct a Repository
Definition: Repository.cs:103
+
readonly IProcessExecutor processExecutor
The IProcessExecutor for the InstanceFactory
+
readonly INetworkPromptReaper networkPromptReaper
The INetworkPromptReaper for the InstanceFactory
+
readonly IPostWriteHandler postWriteHandler
The IPostWriteHandler for the InstanceFactory
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the InstanceFactory
+
readonly IWatchdogFactory watchdogFactory
The IWatchdogFactory for the InstanceFactory
+ +
readonly ICredentialsProvider credentialsProvider
The ICredentialsProvider for the InstanceFactory
+
readonly IIOManager ioManager
The IIOManager for the InstanceFactory
+
readonly IGitHubClientFactory gitHubClientFactory
The IGitHubClientFactory for the InstanceFactory
+
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the InstanceFactory
+
readonly ISymlinkFactory symlinkFactory
The ISymlinkFactory for the InstanceFactory
+
readonly IJobManager jobManager
The IJobManager for the InstanceFactory
+
readonly IChatFactory chatFactory
The IProviderFactory for the InstanceFactory
+ + + + +
+

References Tgstation.Server.Host.Components.InstanceFactory.application, Tgstation.Server.Host.Components.InstanceFactory.byondInstaller, Tgstation.Server.Host.Components.InstanceFactory.byondTopicSender, Tgstation.Server.Host.Components.InstanceFactory.chatFactory, Tgstation.Server.Host.Components.Chat.IChatFactory.CreateChat(), Tgstation.Server.Host.Components.Watchdog.IWatchdogFactory.CreateWatchdog(), Tgstation.Server.Host.Components.InstanceFactory.credentialsProvider, Tgstation.Server.Host.Components.InstanceFactory.cryptographySuite, Tgstation.Server.Host.Components.InstanceFactory.databaseContextFactory, Tgstation.Server.Host.Components.InstanceFactory.gitHubClientFactory, Tgstation.Server.Host.Components.InstanceFactory.ioManager, Tgstation.Server.Host.Components.InstanceFactory.jobManager, Tgstation.Server.Host.Components.InstanceFactory.loggerFactory, Tgstation.Server.Host.Components.InstanceFactory.networkPromptReaper, Tgstation.Server.Host.Components.InstanceFactory.platformIdentifier, Tgstation.Server.Host.Components.InstanceFactory.postWriteHandler, Tgstation.Server.Host.Components.InstanceFactory.processExecutor, Tgstation.Server.Host.Components.Repository.Repository.Repository(), Tgstation.Server.Host.Components.InstanceFactory.symlinkFactory, Tgstation.Server.Host.Components.InstanceFactory.synchronousIOManager, and Tgstation.Server.Host.Components.InstanceFactory.watchdogFactory.

+ +
+
+ +

◆ StartAsync()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.InstanceFactory.StartAsync (CancellationToken cancellationToken)
+
+ +

+ +
+
+ +

◆ StopAsync()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.InstanceFactory.StopAsync (CancellationToken cancellationToken)
+
+ +

+ +
+
+

Member Data Documentation

+ +

◆ application

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Components.InstanceFactory.application
+
+private
+
+
+ +

◆ byondInstaller

+ +
+
+ + + + + +
+ + + + +
readonly IByondInstaller Tgstation.Server.Host.Components.InstanceFactory.byondInstaller
+
+private
+
+
+ +

◆ byondTopicSender

+ +
+
+ + + + + +
+ + + + +
readonly IByondTopicSender Tgstation.Server.Host.Components.InstanceFactory.byondTopicSender
+
+private
+
+
+ +

◆ chatFactory

+ +
+
+ + + + + +
+ + + + +
readonly IChatFactory Tgstation.Server.Host.Components.InstanceFactory.chatFactory
+
+private
+
+
+ +

◆ credentialsProvider

+ +
+
+ + + + + +
+ + + + +
readonly ICredentialsProvider Tgstation.Server.Host.Components.InstanceFactory.credentialsProvider
+
+private
+
+
+ +

◆ cryptographySuite

+ +
+
+ + + + + +
+ + + + +
readonly ICryptographySuite Tgstation.Server.Host.Components.InstanceFactory.cryptographySuite
+
+private
+
+
+ +

◆ databaseContextFactory

+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContextFactory Tgstation.Server.Host.Components.InstanceFactory.databaseContextFactory
+
+private
+
+
+ +

◆ gitHubClientFactory

+ +
+
+ + + + + +
+ + + + +
readonly IGitHubClientFactory Tgstation.Server.Host.Components.InstanceFactory.gitHubClientFactory
+
+private
+
+
+ +

◆ ioManager

+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.InstanceFactory.ioManager
+
+private
+
+
+ +

◆ jobManager

+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Components.InstanceFactory.jobManager
+
+private
+
+
+ +

◆ loggerFactory

+ +
+
+ + + + + +
+ + + + +
readonly ILoggerFactory Tgstation.Server.Host.Components.InstanceFactory.loggerFactory
+
+private
+
+
+ +

◆ networkPromptReaper

+ +
+
+ + + + + +
+ + + + +
readonly INetworkPromptReaper Tgstation.Server.Host.Components.InstanceFactory.networkPromptReaper
+
+private
+
+
+ +

◆ platformIdentifier

+ +
+
+ + + + + +
+ + + + +
readonly IPlatformIdentifier Tgstation.Server.Host.Components.InstanceFactory.platformIdentifier
+
+private
+
+
+ +

◆ postWriteHandler

+ +
+
+ + + + + +
+ + + + +
readonly IPostWriteHandler Tgstation.Server.Host.Components.InstanceFactory.postWriteHandler
+
+private
+
+
+ +

◆ processExecutor

+ +
+
+ + + + + +
+ + + + +
readonly IProcessExecutor Tgstation.Server.Host.Components.InstanceFactory.processExecutor
+
+private
+
+
+ +

◆ symlinkFactory

+ +
+
+ + + + + +
+ + + + +
readonly ISymlinkFactory Tgstation.Server.Host.Components.InstanceFactory.symlinkFactory
+
+private
+
+
+ +

◆ synchronousIOManager

+ +
+
+ + + + + +
+ + + + +
readonly ISynchronousIOManager Tgstation.Server.Host.Components.InstanceFactory.synchronousIOManager
+
+private
+
+
+ +

◆ watchdogFactory

+ +
+
+ + + + + +
+ + + + +
readonly IWatchdogFactory Tgstation.Server.Host.Components.InstanceFactory.watchdogFactory
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..46b6546ebbdd07ab506d85343dae296326cb119c GIT binary patch literal 1524 zcmb_cdo6eH~iy?FXto(~#{)HJ5O61Bp3x$AqJN zvtgZK{8_eJJy%c^YG;3w5y*g{3QPD9dtY!V1C$sE!F0yo;~~30W#C)l=2gC6v6iklI@MDSQ95pT^|4@c za?@%;L!{6+{#jX*Q-OpITnrTF=JWPAWU^Hm&kSR|K7^6p^8{ zMaoe;k*|0iIm2qbe?q@WTIL6O6zE)gm9z1#<=#Ehmo>Um{>}FCJ00Qf1Pm=zv}HJ1 zJi0H7IOl+P|F-r3iV2K(8UMF_&AF z9L~$A56j@KR38fjthjxmtmybi@Qe?ne!)l}oQ_oll`HbX3Bg>kEf$Bg? z_O{eRG(W;jy))|08|SR~wQ@m32$v$uNOjqDh&rI}YA2{7qrk$$v{cGZduc zB8SM@9-5IKpaj4eM%XbkR8+S~Q!0}hE?(qS2M03NTir6kry@wh7dCju&0oKgd)=}Y zPIc`|`0~-PYT;E^X1VG;Wm`hZl2?b*&I>Su3P}{A^7M2syMI?@hs^k_U$PJS&VZ1< zn81qWEf!bQ6OD#BoT<{=y>YIKEZ`sQV0`q_*V8=G$8Gd|UbIjYs}{JB6Bgh@Ryb+^ zU;HHAy5q-Q@S@*i^6`bfpT=z>?7K!F)qVuQ$Yr%&+z}qEmDo9Ju;;6?=|;{=Wx8Px zToQ+MCg!)w_RUR*$}8vNu+?+|A)qT#RMil3AZ=+aYv~l>Fm^>)Yx!vJ!%dSkbkTA> zww)Q1d3wn9!5-t4a#8JhS){wQ=x|wOb{Lw%wFlz%Xy(KqJ% FKLDvL!;k;~ literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager-members.html new file mode 100644 index 0000000000..5ad538fd53 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager-members.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.InstanceManager Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.InstanceManager, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + +
applicationTgstation.Server.Host.Components.InstanceManagerprivate
databaseContextFactoryTgstation.Server.Host.Components.InstanceManagerprivate
Dispose()Tgstation.Server.Host.Components.InstanceManager
disposedTgstation.Server.Host.Components.InstanceManagerprivate
downgradeVersionTgstation.Server.Host.Components.InstanceManagerprivate
GetInstance(Models.Instance metadata)Tgstation.Server.Host.Components.InstanceManager
HandleRestart(Version updateVersion, CancellationToken cancellationToken)Tgstation.Server.Host.Components.InstanceManager
instanceFactoryTgstation.Server.Host.Components.InstanceManagerprivate
InstanceManager(IInstanceFactory instanceFactory, IIOManager ioManager, IDatabaseContextFactory databaseContextFactory, IApplication application, IJobManager jobManager, IServerControl serverControl, ILogger< InstanceManager > logger)Tgstation.Server.Host.Components.InstanceManager
instancesTgstation.Server.Host.Components.InstanceManagerprivate
ioManagerTgstation.Server.Host.Components.InstanceManagerprivate
jobManagerTgstation.Server.Host.Components.InstanceManagerprivate
loggerTgstation.Server.Host.Components.InstanceManagerprivate
MoveInstance(Models.Instance instance, string newPath, CancellationToken cancellationToken)Tgstation.Server.Host.Components.InstanceManager
OfflineInstance(Models.Instance metadata, Models.User user, CancellationToken cancellationToken)Tgstation.Server.Host.Components.InstanceManager
Tgstation::Server::Host::Components::IInstanceManager.OfflineInstance(Models.Instance metadata, User user, CancellationToken cancellationToken)Tgstation.Server.Host.Components.IInstanceManager
OnlineInstance(Models.Instance metadata, CancellationToken cancellationToken)Tgstation.Server.Host.Components.InstanceManager
serverControlTgstation.Server.Host.Components.InstanceManagerprivate
StartAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.InstanceManager
StopAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.InstanceManager
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html new file mode 100644 index 0000000000..3812f146a0 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html @@ -0,0 +1,813 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.InstanceManager Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.InstanceManager Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.InstanceManager:
+
+
+ + +Tgstation.Server.Host.Components.IInstanceManager +Tgstation.Server.Host.Core.IRestartHandler +IHostedService +IDisposable + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 InstanceManager (IInstanceFactory instanceFactory, IIOManager ioManager, IDatabaseContextFactory databaseContextFactory, IApplication application, IJobManager jobManager, IServerControl serverControl, ILogger< InstanceManager > logger)
 Construct an InstanceManager More...
 
void Dispose ()
 
IInstance GetInstance (Models.Instance metadata)
 Get the IInstance associated with given metadata More...
 
async Task MoveInstance (Models.Instance instance, string newPath, CancellationToken cancellationToken)
 Move an IInstance More...
 
async Task OfflineInstance (Models.Instance metadata, Models.User user, CancellationToken cancellationToken)
 
async Task OnlineInstance (Models.Instance metadata, CancellationToken cancellationToken)
 Online an IInstance More...
 
Task StartAsync (CancellationToken cancellationToken)
 
async Task StopAsync (CancellationToken cancellationToken)
 
Task HandleRestart (Version updateVersion, CancellationToken cancellationToken)
 Handle a restart of the server More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Components.IInstanceManager
Task OfflineInstance (Models.Instance metadata, User user, CancellationToken cancellationToken)
 Offline an IInstance More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

readonly IInstanceFactory instanceFactory
 The IInstanceFactory for the InstanceManager More...
 
readonly IIOManager ioManager
 The IIOManager for the InstanceManager More...
 
readonly IDatabaseContextFactory databaseContextFactory
 The IDatabaseContextFactory for the InstanceManager More...
 
readonly IApplication application
 The IApplication for the InstanceManager More...
 
readonly IJobManager jobManager
 The IJobManager for the InstanceManager More...
 
readonly IServerControl serverControl
 The IServerControl for the InstanceManager More...
 
readonly ILogger< InstanceManagerlogger
 The ILogger for the InstanceManager More...
 
readonly Dictionary< long, IInstanceinstances
 Map of Api.Models.Instance.Ids to respective IInstances More...
 
Version downgradeVersion
 Used in StopAsync(CancellationToken) to determine if database downgrades must be made More...
 
bool disposed
 If the InstanceManager has been Disposed More...
 
+

Detailed Description

+
+

Definition at line 15 of file InstanceManager.cs.

+

Constructor & Destructor Documentation

+ +

◆ InstanceManager()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.InstanceManager.InstanceManager (IInstanceFactory instanceFactory,
IIOManager ioManager,
IDatabaseContextFactory databaseContextFactory,
IApplication application,
IJobManager jobManager,
IServerControl serverControl,
ILogger< InstanceManagerlogger 
)
+
+ +

Construct an InstanceManager

+
Parameters
+ + + + + + + + +
instanceFactoryThe value of instanceFactory
ioManagerThe value of ioManager
databaseContextFactoryThe value of databaseContextFactory
applicationThe value of application
jobManagerThe value of jobManager
serverControlThe value of serverControl
loggerThe value of logger
+
+
+ +

Definition at line 77 of file InstanceManager.cs.

+
78  {
79  this.instanceFactory = instanceFactory ?? throw new ArgumentNullException(nameof(instanceFactory));
80  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
81  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
82  this.application = application ?? throw new ArgumentNullException(nameof(application));
83  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
84  this.serverControl = serverControl ?? throw new ArgumentNullException(nameof(serverControl));
85  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
86 
88 
89  instances = new Dictionary<long, IInstance>();
90  }
readonly IServerControl serverControl
The IServerControl for the InstanceManager
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the InstanceManager
+
readonly IJobManager jobManager
The IJobManager for the InstanceManager
+
readonly ILogger< InstanceManager > logger
The ILogger for the InstanceManager
+
readonly IInstanceFactory instanceFactory
The IInstanceFactory for the InstanceManager
+
readonly Dictionary< long, IInstance > instances
Map of Api.Models.Instance.Ids to respective IInstances
+
readonly IApplication application
The IApplication for the InstanceManager
+
readonly IIOManager ioManager
The IIOManager for the InstanceManager
+
IRestartRegistration RegisterForRestart(IRestartHandler handler)
Register a given handler to run before stopping the server for a restart
+
+

References Tgstation.Server.Host.Components.InstanceManager.application, Tgstation.Server.Host.Components.InstanceManager.databaseContextFactory, Tgstation.Server.Host.Components.InstanceManager.instanceFactory, Tgstation.Server.Host.Components.InstanceManager.instances, Tgstation.Server.Host.Components.InstanceManager.ioManager, Tgstation.Server.Host.Components.InstanceManager.jobManager, Tgstation.Server.Host.Components.InstanceManager.logger, Tgstation.Server.Host.Core.IServerControl.RegisterForRestart(), and Tgstation.Server.Host.Components.InstanceManager.serverControl.

+ +
+
+

Member Function Documentation

+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.InstanceManager.Dispose ()
+
+ +

+ +

Definition at line 93 of file InstanceManager.cs.

+
94  {
95  lock (this)
96  {
97  if (disposed)
98  return;
99  disposed = true;
100  }
101 
102  foreach (var I in instances)
103  I.Value.Dispose();
104  }
bool disposed
If the InstanceManager has been Disposed
+
readonly Dictionary< long, IInstance > instances
Map of Api.Models.Instance.Ids to respective IInstances
+
+

References Tgstation.Server.Host.Components.InstanceManager.disposed, and Tgstation.Server.Host.Components.InstanceManager.instances.

+ +
+
+ +

◆ GetInstance()

+ +
+
+ + + + + + + + +
IInstance Tgstation.Server.Host.Components.InstanceManager.GetInstance (Models.Instance metadata)
+
+ +

Get the IInstance associated with given metadata

+ +

Implements Tgstation.Server.Host.Components.IInstanceManager.

+ +

Definition at line 107 of file InstanceManager.cs.

+
108  {
109  if (metadata == null)
110  throw new ArgumentNullException(nameof(metadata));
111  lock (this)
112  {
113  if (!instances.TryGetValue(metadata.Id, out IInstance instance))
114  throw new InvalidOperationException("Instance not online!");
115  return instance;
116  }
117  }
readonly Dictionary< long, IInstance > instances
Map of Api.Models.Instance.Ids to respective IInstances
+
+

References Tgstation.Server.Host.Components.InstanceManager.instances.

+ +
+
+ +

◆ HandleRestart()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.InstanceManager.HandleRestart (Version updateVersion,
CancellationToken cancellationToken 
)
+
+ +

Handle a restart of the server

+ +

Implements Tgstation.Server.Host.Core.IRestartHandler.

+ +

Definition at line 262 of file InstanceManager.cs.

+
263  {
264  downgradeVersion = updateVersion != null && updateVersion < application.Version ? updateVersion : null;
265  return Task.CompletedTask;
266  }
Version downgradeVersion
Used in StopAsync(CancellationToken) to determine if database downgrades must be made
+
readonly IApplication application
The IApplication for the InstanceManager
+
Version Version
The version of the Application
Definition: IApplication.cs:23
+
+

References Tgstation.Server.Host.Components.InstanceManager.application, Tgstation.Server.Host.Components.InstanceManager.downgradeVersion, and Tgstation.Server.Host.Core.IApplication.Version.

+ +
+
+ +

◆ MoveInstance()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.InstanceManager.MoveInstance (Models.Instance instance,
string newPath,
CancellationToken cancellationToken 
)
+
+ +

Move an IInstance

+ +

Implements Tgstation.Server.Host.Components.IInstanceManager.

+ +

Definition at line 120 of file InstanceManager.cs.

+
121  {
122  if (newPath == null)
123  throw new ArgumentNullException(nameof(newPath));
124  if (instance.Online.Value)
125  throw new InvalidOperationException("Cannot move an online instance!");
126  var oldPath = instance.Path;
127  await ioManager.CopyDirectory(oldPath, newPath, null, cancellationToken).ConfigureAwait(false);
129  {
130  var targetInstance = new Models.Instance
131  {
132  Id = instance.Id
133  };
134  db.Instances.Attach(targetInstance);
135  targetInstance.Path = newPath;
136  return db.Save(cancellationToken);
137  }).ConfigureAwait(false);
138  await ioManager.DeleteDirectory(oldPath, cancellationToken).ConfigureAwait(false);
139  }
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
Task CopyDirectory(string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)
Copies a directory from src to dest
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the InstanceManager
+
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+
readonly IIOManager ioManager
The IIOManager for the InstanceManager
+
+

References Tgstation.Server.Host.IO.IIOManager.CopyDirectory(), Tgstation.Server.Host.Components.InstanceManager.databaseContextFactory, Tgstation.Server.Host.IO.IIOManager.DeleteDirectory(), Tgstation.Server.Host.Components.InstanceManager.ioManager, and Tgstation.Server.Host.Core.IDatabaseContextFactory.UseContext().

+ +
+
+ +

◆ OfflineInstance()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.InstanceManager.OfflineInstance (Models.Instance metadata,
Models.User user,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 142 of file InstanceManager.cs.

+
143  {
144  if (metadata == null)
145  throw new ArgumentNullException(nameof(metadata));
146  logger.LogInformation("Offlining instance ID {0}", metadata.Id);
147  IInstance instance;
148  lock (this)
149  {
150  if (!instances.TryGetValue(metadata.Id, out instance))
151  throw new InvalidOperationException("Instance not online!");
152  instances.Remove(metadata.Id);
153  }
154 
155  try
156  {
157  // we are the one responsible for cancelling his jobs
158  var tasks = new List<Task>();
159  await databaseContextFactory.UseContext(async db =>
160  {
161  var jobs = db.Jobs.Where(x => x.Instance.Id == metadata.Id).Select(x => new Models.Job
162  {
163  Id = x.Id
164  }).ToAsyncEnumerable();
165  await jobs.ForEachAsync(job =>
166  {
167  lock (tasks)
168  tasks.Add(jobManager.CancelJob(job, user, true, cancellationToken));
169  }, cancellationToken).ConfigureAwait(false);
170  }).ConfigureAwait(false);
171 
172  await Task.WhenAll(tasks).ConfigureAwait(false);
173 
174  await instance.StopAsync(cancellationToken).ConfigureAwait(false);
175  }
176  finally
177  {
178  instance.Dispose();
179  }
180  }
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the InstanceManager
+
readonly IJobManager jobManager
The IJobManager for the InstanceManager
+
readonly ILogger< InstanceManager > logger
The ILogger for the InstanceManager
+
Task< bool > CancelJob(Job job, User user, bool blocking, CancellationToken cancellationToken)
Cancels a give job
+
readonly Dictionary< long, IInstance > instances
Map of Api.Models.Instance.Ids to respective IInstances
+
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+
+

References Tgstation.Server.Host.Core.IJobManager.CancelJob(), Tgstation.Server.Host.Components.InstanceManager.databaseContextFactory, Tgstation.Server.Host.Components.InstanceManager.instances, Tgstation.Server.Host.Components.InstanceManager.jobManager, Tgstation.Server.Host.Components.InstanceManager.logger, and Tgstation.Server.Host.Core.IDatabaseContextFactory.UseContext().

+ +
+
+ +

◆ OnlineInstance()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.InstanceManager.OnlineInstance (Models.Instance metadata,
CancellationToken cancellationToken 
)
+
+ +

Online an IInstance

+ +

Implements Tgstation.Server.Host.Components.IInstanceManager.

+ +

Definition at line 183 of file InstanceManager.cs.

+
184  {
185  if (metadata == null)
186  throw new ArgumentNullException(nameof(metadata));
187  logger.LogInformation("Onlining instance ID {0} ({1}) at {2}", metadata.Id, metadata.Name, metadata.Path);
188  var instance = instanceFactory.CreateInstance(metadata);
189  try
190  {
191  lock (this)
192  {
193  if (instances.ContainsKey(metadata.Id))
194  throw new InvalidOperationException("Instance already online!");
195  instances.Add(metadata.Id, instance);
196  }
197  }
198  catch
199  {
200  instance.Dispose();
201  throw;
202  }
203 
204  await instance.StartAsync(cancellationToken).ConfigureAwait(false);
205  }
IInstance CreateInstance(Models.Instance metadata)
Create an IInstance
+
readonly ILogger< InstanceManager > logger
The ILogger for the InstanceManager
+
readonly IInstanceFactory instanceFactory
The IInstanceFactory for the InstanceManager
+
readonly Dictionary< long, IInstance > instances
Map of Api.Models.Instance.Ids to respective IInstances
+
+

References Tgstation.Server.Host.Components.IInstanceFactory.CreateInstance(), Tgstation.Server.Host.Components.InstanceManager.instanceFactory, Tgstation.Server.Host.Components.InstanceManager.instances, and Tgstation.Server.Host.Components.InstanceManager.logger.

+ +
+
+ +

◆ StartAsync()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.InstanceManager.StartAsync (CancellationToken cancellationToken)
+
+ +

+ +
+
+ +

◆ StopAsync()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.InstanceManager.StopAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 250 of file InstanceManager.cs.

+
251  {
252  await jobManager.StopAsync(cancellationToken).ConfigureAwait(false);
253  await Task.WhenAll(instances.Select(x => x.Value.StopAsync(cancellationToken))).ConfigureAwait(false);
254  await instanceFactory.StopAsync(cancellationToken).ConfigureAwait(false);
255 
256  // downgrade the db if necessary
257  if (downgradeVersion != null)
258  await databaseContextFactory.UseContext(db => db.SchemaDowngradeForServerVersion(downgradeVersion, cancellationToken)).ConfigureAwait(false);
259  }
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the InstanceManager
+
readonly IJobManager jobManager
The IJobManager for the InstanceManager
+
Version downgradeVersion
Used in StopAsync(CancellationToken) to determine if database downgrades must be made
+
readonly IInstanceFactory instanceFactory
The IInstanceFactory for the InstanceManager
+
readonly Dictionary< long, IInstance > instances
Map of Api.Models.Instance.Ids to respective IInstances
+
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+
+

References Tgstation.Server.Host.Components.InstanceManager.databaseContextFactory, Tgstation.Server.Host.Components.InstanceManager.downgradeVersion, Tgstation.Server.Host.Components.InstanceManager.instanceFactory, Tgstation.Server.Host.Components.InstanceManager.instances, Tgstation.Server.Host.Components.InstanceManager.jobManager, and Tgstation.Server.Host.Core.IDatabaseContextFactory.UseContext().

+ +
+
+

Member Data Documentation

+ +

◆ application

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Components.InstanceManager.application
+
+private
+
+
+ +

◆ databaseContextFactory

+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContextFactory Tgstation.Server.Host.Components.InstanceManager.databaseContextFactory
+
+private
+
+
+ +

◆ disposed

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.InstanceManager.disposed
+
+private
+
+ +

If the InstanceManager has been Disposed

+ +

Definition at line 65 of file InstanceManager.cs.

+ +

Referenced by Tgstation.Server.Host.Components.InstanceManager.Dispose().

+ +
+
+ +

◆ downgradeVersion

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Host.Components.InstanceManager.downgradeVersion
+
+private
+
+ +

Used in StopAsync(CancellationToken) to determine if database downgrades must be made

+ +

Definition at line 60 of file InstanceManager.cs.

+ +

Referenced by Tgstation.Server.Host.Components.InstanceManager.HandleRestart(), and Tgstation.Server.Host.Components.InstanceManager.StopAsync().

+ +
+
+ +

◆ instanceFactory

+ +
+
+ + + + + +
+ + + + +
readonly IInstanceFactory Tgstation.Server.Host.Components.InstanceManager.instanceFactory
+
+private
+
+
+ +

◆ instances

+ + + +

◆ ioManager

+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.InstanceManager.ioManager
+
+private
+
+
+ +

◆ jobManager

+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Components.InstanceManager.jobManager
+
+private
+
+
+ +

◆ logger

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<InstanceManager> Tgstation.Server.Host.Components.InstanceManager.logger
+
+private
+
+
+ +

◆ serverControl

+ +
+
+ + + + + +
+ + + + +
readonly IServerControl Tgstation.Server.Host.Components.InstanceManager.serverControl
+
+private
+
+ +

The IServerControl for the InstanceManager

+ +

Definition at line 45 of file InstanceManager.cs.

+ +

Referenced by Tgstation.Server.Host.Components.InstanceManager.InstanceManager().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..2f3234b73b7a235d883628cb52bb3a69ba2fbd3d GIT binary patch literal 2385 zcmcguc~Dd57Do|5!qQqro@{DE!37sUmePo8Z4d(mMI}H)HkCkFL9V(?8x!@67#v=R0%m`JHb$ zzquLigu}Yp>$TO?)O7LR9rRFBTY;dqyOugSKA|6>p&*pL#J97JP4j@Xwc%*+i}bqb-ltL+;=Q)nS4+l^^cvauMX1>7Lv>%tJNV(7G1CULFQn9&N{!>&XPGO-IvDGuD~XInZI8= z-UHiilaq|^Ik33^i_3w{+m}@-fC{?DPJFzj#?1oZQHhB6 z8QRRk{BN;>R_F2Ap5Se)5+y zTw=1II_{ak?S8=?-Io&-3-Y)FePYV^_0Z40XX|kAt^k*4Q+pvbo)qSXujNrEC{tat zp7MsP!IPNB^MT6Q9|PGLdB<%$ci{b+dysH1YtVWmQn1|gUL-AwrkIPKdh1m_4;-zO za_ZMg`(9RagUhd5h=rBT7|@q4AjCMo{2X%1s25PZAtHhF;$+y2mJiRO-L0ezxu}P` zbexum$(+4`Rb@pFNWJz=%*ru=kO&#rA@f=|+M{nlDU=SCsK!HLGy9M_js&vd2mg&l zp6*-g4TZM!-F(Y)JWC7tEY=a?ZmQIuQ7RIK30IsO(xrV0zMSI5?k%1hw%TUv0?>Hp zVx9iF`Xu$@E#~c}J2)UtFfhF^X0jUs@X!lueRZ;(Q zB?cnezX_%jqKoVr`o9$>R-Y#(;cl_OAo9(wHUqA(@(M_<`^LW#ZagVrv=VL@k;Yno zcw-j|5l3>d2_-KP1A4(N>a5i^a{@qX!^TY*yB#SgD2PZ z4j@TEu18J6Yo^zcAn|nd7p8TfO**%varFJhLK4UZmAFO*9M+ik&^D99N(#kKXFC+a z55Gp-Usq4N0Qsy3AXD<>W>J!^RDHI4BfceOR2k@JB#5v=gmVb0VC zi{hkT-ov$8UqPd`OgvU5deGt0gA(W@)c8wTlJM1yk98i|x4&gzMKW6@hdMeh9!S7c zd!sx5JY!;Ndyg;gPGpEZ=NjebBS8L6Hh8G|tM+ln!`qEc8Cx~lWE5kWGOVB&OX(QZnVa|DZ%5Cj+WFF9GT3dJ<;($o8)^Kq&ZK#-UBU+jCb#5nVgqX;&;{z z1@8)r%xskRPJRP&&F8)w{oK~M`OKuP0~;)5)v$AxShivy?y2^V)^R@U%k)UeEr}Tp zk(7>^)_d39?}iLc$f(#Ep)b2DDlTDia0`)*%5Ih-LR9OFo`HQ(7){@%@Ki@y%nRL! zrsR3~?n&r(F%=r0QE6eoFga6~=;mFre(}^e0b(Thj@_xgGT4`X&tJG+_^b`dTWLdE zsDNt{6$v$sAMAZ%>z>8dRkKu?vbdT0iocW7Ir7-MoQM5^6_fOmQs;^1olIr)(P(XGrK3 zF$uwLSxehCTd`nRb|-L=->oWp_?(L!x-)<3O!GIq=5LtxD|+)O^ZNa1y6Vp?`5V#y PA2s|T!ohp{PbdEi(rmW_ literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_command-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_command-members.html new file mode 100644 index 0000000000..c3a5256636 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_command-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Interop.ChatCommand Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_command.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_command.html new file mode 100644 index 0000000000..cd3e88f6fe --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_command.html @@ -0,0 +1,187 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Interop.ChatCommand Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Interop.ChatCommand Class Reference
+
+
+ +

Represents a chat command to be handled by DD + More...

+ + + + + + + + + + + +

+Properties

string Command [get, set]
 The command name More...
 
string Params [get, set]
 The command params More...
 
User User [get, set]
 The Chat.User that sent the command More...
 
+

Detailed Description

+

Represents a chat command to be handled by DD

+ +

Definition at line 8 of file ChatCommand.cs.

+

Property Documentation

+ +

◆ Command

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Interop.ChatCommand.Command
+
+getset
+
+ +

The command name

+ +

Definition at line 13 of file ChatCommand.cs.

+
13 { get; set; }
+
+
+ +

◆ Params

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Interop.ChatCommand.Params
+
+getset
+
+ +

The command params

+ +

Definition at line 18 of file ChatCommand.cs.

+
18 { get; set; }
+
+
+ +

◆ User

+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Host.Components.Interop.ChatCommand.User
+
+getset
+
+ +

The Chat.User that sent the command

+ +

Definition at line 23 of file ChatCommand.cs.

+
23 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_command-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_command-members.html new file mode 100644 index 0000000000..afe063213c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_command-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Interop.CommCommand Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_command.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_command.html new file mode 100644 index 0000000000..2265b2dfdb --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_command.html @@ -0,0 +1,162 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Interop.CommCommand Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Interop.CommCommand Class Reference
+
+
+ +

Represents a command from DD + More...

+ + + + + + + + +

+Properties

IReadOnlyDictionary< string, object > Parameters [get, set]
 The dictionary of the CommCommand More...
 
string RawJson [get, set]
 The raw JSON of the CommCommand More...
 
+

Detailed Description

+

Represents a command from DD

+ +

Definition at line 8 of file CommCommand.cs.

+

Property Documentation

+ +

◆ Parameters

+ +
+
+ + + + + +
+ + + + +
IReadOnlyDictionary<string, object> Tgstation.Server.Host.Components.Interop.CommCommand.Parameters
+
+getset
+
+ +

The dictionary of the CommCommand

+ +

Definition at line 13 of file CommCommand.cs.

+
13 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.HandleInterop().

+ +
+
+ +

◆ RawJson

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Interop.CommCommand.RawJson
+
+getset
+
+ +

The raw JSON of the CommCommand

+ +

Definition at line 18 of file CommCommand.cs.

+
18 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.HandleInterop().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context-members.html new file mode 100644 index 0000000000..d6e753560b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context-members.html @@ -0,0 +1,96 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Interop.CommContext Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html new file mode 100644 index 0000000000..fc7283866a --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html @@ -0,0 +1,519 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Interop.CommContext Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Interop.CommContext Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Interop.CommContext:
+
+
+ + +Tgstation.Server.Host.Components.Interop.ICommContext +IDisposable + +
+ + + + + + + + + + +

+Public Member Functions

 CommContext (IIOManager ioManager, ILogger< CommContext > logger, string directory, string filter)
 Construct an CommContext More...
 
void Dispose ()
 
void RegisterHandler (ICommHandler handler)
 Register a handler with the ICommContext More...
 
+ + + + +

+Private Member Functions

async void HandleWrite (object sender, FileSystemEventArgs e)
 Runs when the fileSystemWatcher triggers More...
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

readonly IIOManager ioManager
 The IIOManager for the CommContext More...
 
readonly ILogger< CommContextlogger
 The ILogger for the CommContext More...
 
readonly FileSystemWatcher fileSystemWatcher
 The FileSystemWatcher for the CommContext More...
 
readonly CancellationTokenSource cancellationTokenSource
 The CancellationTokenSource for the CommContext More...
 
readonly CancellationToken cancellationToken
 The CancellationToken for the CommContext More...
 
ICommHandler handler
 The ICommHandler for the CommContext More...
 
bool disposed
 If the CommContext has been disposed More...
 
+

Detailed Description

+
+

Definition at line 14 of file CommContext.cs.

+

Constructor & Destructor Documentation

+ +

◆ CommContext()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Interop.CommContext.CommContext (IIOManager ioManager,
ILogger< CommContextlogger,
string directory,
string filter 
)
+
+ +

Construct an CommContext

+
Parameters
+ + + + + +
ioManagerThe value of ioManager
loggerThe value of logger
directoryThe path to watch
filterThe filter to watch for
+
+
+ +

Definition at line 58 of file CommContext.cs.

+
59  {
60  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
61  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
62 
63  directory = ioManager.ResolvePath(directory) ?? throw new ArgumentNullException(nameof(directory));
64  if (filter == null)
65  throw new ArgumentNullException(nameof(filter));
66 
67  fileSystemWatcher = new FileSystemWatcher(directory, filter)
68  {
69  EnableRaisingEvents = true,
70  IncludeSubdirectories = false,
71  NotifyFilter = NotifyFilters.LastWrite
72  };
73 
74  fileSystemWatcher.Created += HandleWrite;
75  fileSystemWatcher.Changed += HandleWrite;
76 
77  cancellationTokenSource = new CancellationTokenSource();
79  disposed = false;
80  }
readonly CancellationToken cancellationToken
The CancellationToken for the CommContext
Definition: CommContext.cs:39
+
readonly FileSystemWatcher fileSystemWatcher
The FileSystemWatcher for the CommContext
Definition: CommContext.cs:29
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
readonly ILogger< CommContext > logger
The ILogger for the CommContext
Definition: CommContext.cs:24
+
readonly IIOManager ioManager
The IIOManager for the CommContext
Definition: CommContext.cs:19
+
bool disposed
If the CommContext has been disposed
Definition: CommContext.cs:49
+
readonly CancellationTokenSource cancellationTokenSource
The CancellationTokenSource for the CommContext
Definition: CommContext.cs:34
+
async void HandleWrite(object sender, FileSystemEventArgs e)
Runs when the fileSystemWatcher triggers
Definition: CommContext.cs:98
+
+

References Tgstation.Server.Host.Components.Interop.CommContext.cancellationToken, Tgstation.Server.Host.Components.Interop.CommContext.cancellationTokenSource, Tgstation.Server.Host.Components.Interop.CommContext.disposed, Tgstation.Server.Host.Components.Interop.CommContext.fileSystemWatcher, Tgstation.Server.Host.Components.Interop.CommContext.HandleWrite(), Tgstation.Server.Host.Components.Interop.CommContext.ioManager, Tgstation.Server.Host.Components.Interop.CommContext.logger, and Tgstation.Server.Host.IO.IIOManager.ResolvePath().

+ +
+
+

Member Function Documentation

+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Interop.CommContext.Dispose ()
+
+ +

+ +

Definition at line 83 of file CommContext.cs.

+
84  {
85  if (disposed)
86  return;
87  disposed = true;
88  fileSystemWatcher.Dispose();
89  cancellationTokenSource.Cancel();
90  cancellationTokenSource.Dispose();
91  }
readonly FileSystemWatcher fileSystemWatcher
The FileSystemWatcher for the CommContext
Definition: CommContext.cs:29
+
bool disposed
If the CommContext has been disposed
Definition: CommContext.cs:49
+
readonly CancellationTokenSource cancellationTokenSource
The CancellationTokenSource for the CommContext
Definition: CommContext.cs:34
+
+

References Tgstation.Server.Host.Components.Interop.CommContext.cancellationTokenSource, Tgstation.Server.Host.Components.Interop.CommContext.disposed, and Tgstation.Server.Host.Components.Interop.CommContext.fileSystemWatcher.

+ +
+
+ +

◆ HandleWrite()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
async void Tgstation.Server.Host.Components.Interop.CommContext.HandleWrite (object sender,
FileSystemEventArgs e 
)
+
+private
+
+ +

Runs when the fileSystemWatcher triggers

+
Parameters
+ + + +
senderThe sender of the event
eThe FileSystemEventArgs
+
+
+ +

Definition at line 98 of file CommContext.cs.

+
99  {
100  try
101  {
102  var fileBytes = await ioManager.ReadAllBytes(e.FullPath, cancellationToken).ConfigureAwait(false);
103  var file = Encoding.UTF8.GetString(fileBytes);
104 
105  logger.LogTrace("Read interop command json: {0}", file);
106 
107  CommCommand command;
108  try
109  {
110  command = new CommCommand
111  {
112  Parameters = JsonConvert.DeserializeObject<IReadOnlyDictionary<string, object>>(file),
113  RawJson = file
114  };
115  }
116  catch (JsonException ex)
117  {
118  // file not fully written yet
119  logger.LogDebug("Suppressing json convert exception for command file write: {0}", ex);
120  return;
121  }
122 
123  await (handler?.HandleInterop(command, cancellationToken) ?? Task.CompletedTask).ConfigureAwait(false);
124  }
125  catch (OperationCanceledException) { }
126  catch (Exception ex)
127  {
128  logger.LogDebug("Exception while trying to handle command json write: {0}", ex);
129  }
130  }
readonly CancellationToken cancellationToken
The CancellationToken for the CommContext
Definition: CommContext.cs:39
+
readonly ILogger< CommContext > logger
The ILogger for the CommContext
Definition: CommContext.cs:24
+
ICommHandler handler
The ICommHandler for the CommContext
Definition: CommContext.cs:44
+
readonly IIOManager ioManager
The IIOManager for the CommContext
Definition: CommContext.cs:19
+
Task< byte[]> ReadAllBytes(string path, CancellationToken cancellationToken)
Returns all the contents of a file at path as a byte array
+
+

References Tgstation.Server.Host.Components.Interop.CommContext.cancellationToken, Tgstation.Server.Host.Components.Interop.CommContext.handler, Tgstation.Server.Host.Components.Interop.CommContext.ioManager, Tgstation.Server.Host.Components.Interop.CommContext.logger, and Tgstation.Server.Host.IO.IIOManager.ReadAllBytes().

+ +

Referenced by Tgstation.Server.Host.Components.Interop.CommContext.CommContext().

+ +
+
+ +

◆ RegisterHandler()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.Components.Interop.CommContext.RegisterHandler (ICommHandler handler)
+
+ +

Register a handler with the ICommContext

+ +

Implements Tgstation.Server.Host.Components.Interop.ICommContext.

+ +

Definition at line 133 of file CommContext.cs.

+
134  {
135  if (this.handler != null)
136  throw new InvalidOperationException("RegisterHandler already called!");
137  this.handler = handler ?? throw new ArgumentNullException(nameof(handler));
138  }
ICommHandler handler
The ICommHandler for the CommContext
Definition: CommContext.cs:44
+
+

References Tgstation.Server.Host.Components.Interop.CommContext.handler.

+ +
+
+

Member Data Documentation

+ +

◆ cancellationToken

+ +
+
+ + + + + +
+ + + + +
readonly CancellationToken Tgstation.Server.Host.Components.Interop.CommContext.cancellationToken
+
+private
+
+
+ +

◆ cancellationTokenSource

+ +
+
+ + + + + +
+ + + + +
readonly CancellationTokenSource Tgstation.Server.Host.Components.Interop.CommContext.cancellationTokenSource
+
+private
+
+
+ +

◆ disposed

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Interop.CommContext.disposed
+
+private
+
+
+ +

◆ fileSystemWatcher

+ +
+
+ + + + + +
+ + + + +
readonly FileSystemWatcher Tgstation.Server.Host.Components.Interop.CommContext.fileSystemWatcher
+
+private
+
+
+ +

◆ handler

+ +
+
+ + + + + +
+ + + + +
ICommHandler Tgstation.Server.Host.Components.Interop.CommContext.handler
+
+private
+
+
+ +

◆ ioManager

+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.Interop.CommContext.ioManager
+
+private
+
+
+ +

◆ logger

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<CommContext> Tgstation.Server.Host.Components.Interop.CommContext.logger
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.png new file mode 100644 index 0000000000000000000000000000000000000000..9ce36aa2e63e914f62eb2e51cb4359b224f2929c GIT binary patch literal 1528 zcmeAS@N?(olHy`uVBq!ia0y~yVDtsDJ2;quWJrytE0B^1@CkAK|NlRb`Qpvj(*8pe zfGjXRaNq!I=N)+y}Ol^3hzX;xJJ~*;7Ax_M|DTxn4nH+cZ5RZ!A+u z{b*>mJo@L~?J?e$G`(lL&+@wT|FHYb8n^yjuS&zEhsnKiqv z>$3mWom0MgP2MIXAG&hVmo&Q@X|a_L)lIhfdfs}Ru$(>qwO_wk_NPfpzJJ~G zKz!O7mAzB@&%CrVSA8jZOSgLN<@f*RURHfsXqO@EeMuGWlAC6#FK2J?^*nXROjVQn z_LL<$Il+@Q?YOD4R3z9-b3OA1);|mq4JuY`$0R+=?LS?BDk_gY z`?}$`uH4qj*&V+P_OCYlGc)_Sz_puM)34R+H|Ytzm{uE5-7oY?;A?UAUM8?H7Hzi)L=9sh;hfl6!HhG&O|MaO^OU>-9pV@Qfz58;` zY4=Cz+0~V5`|37b*1!JjrQNHLKR0i^$^ZBA&YkU&I&a^6*<8H&eTFuF?vIBCHuqj0 zPI<#GZU5y(Nu*JZ@0R73wZ8FRJ>ot`?T)>zBYn9%Sae#zgBI)^y z9V4#t%)B*^P6;~onxTf#o`Fq)@ivRcqvyx17>j_3MzTqg84GrPCi` zvoD+Yrp;QW$*9J_{K04&=Y-Z=rj*3l43Rg~9K=?ioi(LlZO-=Xt83pr_GYL)bN1J< z*MA?&GA?Yn?sS47J*I!>?MFYP{o42Qy^Z@nqqTUpe+f&=r}Jj(kKf7v*mCxE%%8YF zekW_=uGtsA{rmp!%MDwy>We1_h~{2n-}+r+A>YO=vB$cUx0ic2yjANuc>Nw<@_ot8 zaXh+f^!M%r zC8RAfx9&)p2$t2hWHK+C_|0t28FuF*JHEHu{F3DRaqgMK)uS_-mo1*x+^syjcX8H( z6VHsYOZC^xZCf>WtE5uprDq1Zh0E9Ln=7i^USn&Y_PJzvx!_jm{Tp{qPk;1UefPVf z+b@OHV^R)XH!{ly#`1^hCn=kIidg3cfw&=W*Y6T{u zvk6~A;)0_w6VZK?L^QvD=P~Oo9Jb-Jt1b6l=K4^#Df#E+eCeETl57v=)@(n!%aXya wQGYvU0>ixHs0GWTwBlLIPWoIn*?X?OlBsR730wC(U@^_$>FVdQ&MBb@02>9=1ONa4 literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants-members.html new file mode 100644 index 0000000000..9d2b45a5a5 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants-members.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Interop.Constants Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html new file mode 100644 index 0000000000..b822c62696 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html @@ -0,0 +1,491 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Interop.Constants Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Interop.Constants Class Reference
+
+
+ +

Constants used for communication with the DMAPI + More...

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

const string DMParamHostVersion = "server_service_version"
 Identifies a TGS execution. The server version More...
 
const string DMParamInfoJson = "tgs_json"
 Path to the JsonFile More...
 
const string DMInteropAccessIdentifier = "tgs_tok"
 The JsonFile.AccessIdentifier More...
 
const string DMResponseSuccess = "tgs_succ"
 Generic OK response More...
 
const string DMTopicChangePort = "tgs_port"
 Change port More...
 
const string DMTopicChangeReboot = "tgs_rmode"
 Change reboot mode More...
 
const string DMTopicChatCommand = "tgs_chat_comm"
 Chat command More...
 
const string DMTopicEvent = "tgs_event"
 Notify of an EventType More...
 
const string DMTopicInteropResponse = "tgs_interop"
 Response to an interop export from DM More...
 
const string DMCommandNewPort = "tgs_new_port"
 Set port command More...
 
const string DMCommandApiValidate = "tgs_validate"
 API validation command More...
 
const string DMCommandServerPrimed = "tgs_prime"
 Server primed command More...
 
const string DMCommandWorldReboot = "tgs_reboot"
 World reboot command More...
 
const string DMCommandEndProcess = "tgs_kill"
 Terminate process command More...
 
const string DMCommandChat = "tgs_chat_send"
 Chat send command More...
 
const string DMParameterCommand = "tgs_com"
 Topic command parameter More...
 
const string DMParameterData = "tgs_data"
 Command data More...
 
+

Detailed Description

+

Constants used for communication with the DMAPI

+ +

Definition at line 6 of file Constants.cs.

+

Member Data Documentation

+ +

◆ DMCommandApiValidate

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMCommandApiValidate = "tgs_validate"
+
+ +

API validation command

+ +

Definition at line 61 of file Constants.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.HandleInterop().

+ +
+
+ +

◆ DMCommandChat

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMCommandChat = "tgs_chat_send"
+
+ +

Chat send command

+ +

Definition at line 81 of file Constants.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.HandleInterop().

+ +
+
+ +

◆ DMCommandEndProcess

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMCommandEndProcess = "tgs_kill"
+
+ +

Terminate process command

+ +

Definition at line 76 of file Constants.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.HandleInterop().

+ +
+
+ +

◆ DMCommandNewPort

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMCommandNewPort = "tgs_new_port"
+
+ +

Set port command

+ +

Definition at line 56 of file Constants.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.HandleInterop().

+ +
+
+ +

◆ DMCommandServerPrimed

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMCommandServerPrimed = "tgs_prime"
+
+ +

Server primed command

+ +

Definition at line 66 of file Constants.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.HandleInterop().

+ +
+
+ +

◆ DMCommandWorldReboot

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMCommandWorldReboot = "tgs_reboot"
+
+ +

World reboot command

+ +

Definition at line 71 of file Constants.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.HandleInterop().

+ +
+
+ +

◆ DMInteropAccessIdentifier

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMInteropAccessIdentifier = "tgs_tok"
+
+
+ +

◆ DMParameterCommand

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMParameterCommand = "tgs_com"
+
+
+ +

◆ DMParameterData

+ + + +

◆ DMParamHostVersion

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMParamHostVersion = "server_service_version"
+
+ +

Identifies a TGS execution. The server version

+ +

Definition at line 11 of file Constants.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew().

+ +
+
+ +

◆ DMParamInfoJson

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMParamInfoJson = "tgs_json"
+
+ +

Path to the JsonFile

+ +

Definition at line 16 of file Constants.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew().

+ +
+
+ +

◆ DMResponseSuccess

+ + + +

◆ DMTopicChangePort

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMTopicChangePort = "tgs_port"
+
+ +

Change port

+ +

Definition at line 31 of file Constants.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.SetPort().

+ +
+
+ +

◆ DMTopicChangeReboot

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMTopicChangeReboot = "tgs_rmode"
+
+ +

Change reboot mode

+ +

Definition at line 36 of file Constants.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.SetRebootState().

+ +
+
+ +

◆ DMTopicChatCommand

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMTopicChatCommand = "tgs_chat_comm"
+
+ +

Chat command

+ +

Definition at line 41 of file Constants.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.WatchdogBase.HandleChatCommand().

+ +
+
+ +

◆ DMTopicEvent

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMTopicEvent = "tgs_event"
+
+ +

Notify of an EventType

+ +

Definition at line 46 of file Constants.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.WatchdogBase.HandleEvent().

+ +
+
+ +

◆ DMTopicInteropResponse

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Interop.Constants.DMTopicInteropResponse = "tgs_interop"
+
+ +

Response to an interop export from DM

+ +

Definition at line 51 of file Constants.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.HandleInterop().

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Host/Components/Interop/Constants.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_event_notification-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_event_notification-members.html new file mode 100644 index 0000000000..47c48f410f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_event_notification-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Interop.EventNotification Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_event_notification.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_event_notification.html new file mode 100644 index 0000000000..71f847ee62 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_event_notification.html @@ -0,0 +1,158 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Interop.EventNotification Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Interop.EventNotification Class Reference
+
+
+ +

For notifying DD of EventTypes + More...

+ + + + + + + + +

+Properties

EventType Type [get, set]
 The EventType More...
 
IEnumerable< string > Parameters [get, set]
 The event parameters More...
 
+

Detailed Description

+

For notifying DD of EventTypes

+ +

Definition at line 8 of file EventNotification.cs.

+

Property Documentation

+ +

◆ Parameters

+ +
+
+ + + + + +
+ + + + +
IEnumerable<string> Tgstation.Server.Host.Components.Interop.EventNotification.Parameters
+
+getset
+
+ +

The event parameters

+ +

Definition at line 18 of file EventNotification.cs.

+
18 { get; set; }
+
+
+ +

◆ Type

+ +
+
+ + + + + +
+ + + + +
EventType Tgstation.Server.Host.Components.Interop.EventNotification.Type
+
+getset
+
+ +

The EventType

+ +

Definition at line 13 of file EventNotification.cs.

+
13 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file-members.html new file mode 100644 index 0000000000..e9aabe8353 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file-members.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Interop.JsonFile Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html new file mode 100644 index 0000000000..c11220fcbe --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html @@ -0,0 +1,361 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Interop.JsonFile Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Interop.JsonFile Class Reference
+
+
+ +

Representation of the initial json passed to DreamDaemon + More...

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

string AccessIdentifier [get, set]
 The code used by the server to authenticate command Topics More...
 
bool ApiValidateOnly [get, set]
 If DD should just respond if it's API is working and then exit More...
 
string InstanceName [get, set]
 The Api.Models.Instance.Name of the owner at the time of launch More...
 
string ChatChannelsJson [get, set]
 JSON file name that contains current active chat channel information More...
 
string ChatCommandsJson [get, set]
 JSON file DD should write to with available chat commands More...
 
string ServerCommandsJson [get, set]
 JSON file DD should write to to send commands to the server More...
 
Api.Models.Internal.RevisionInformation Revision [get, set]
 The Api.Models.Internal.RevisionInformation of the launch More...
 
DreamDaemonSecurity SecurityLevel [get, set]
 The DreamDaemonSecurity level of the launch More...
 
List< TestMergeTestMerges = new List<TestMerge>() [get]
 The TestMerges in the launch More...
 
+

Detailed Description

+

Representation of the initial json passed to DreamDaemon

+ +

Definition at line 10 of file JsonFile.cs.

+

Property Documentation

+ +

◆ AccessIdentifier

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Interop.JsonFile.AccessIdentifier
+
+getset
+
+ +

The code used by the server to authenticate command Topics

+ +

Definition at line 15 of file JsonFile.cs.

+
15 { get; set; }
+
+
+ +

◆ ApiValidateOnly

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Interop.JsonFile.ApiValidateOnly
+
+getset
+
+ +

If DD should just respond if it's API is working and then exit

+ +

Definition at line 20 of file JsonFile.cs.

+
20 { get; set; }
+
+
+ +

◆ ChatChannelsJson

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Interop.JsonFile.ChatChannelsJson
+
+getset
+
+ +

JSON file name that contains current active chat channel information

+ +

Definition at line 30 of file JsonFile.cs.

+
30 { get; set; }
+
+
+ +

◆ ChatCommandsJson

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Interop.JsonFile.ChatCommandsJson
+
+getset
+
+ +

JSON file DD should write to with available chat commands

+ +

Definition at line 35 of file JsonFile.cs.

+
35 { get; set; }
+
+
+ +

◆ InstanceName

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Interop.JsonFile.InstanceName
+
+getset
+
+ +

The Api.Models.Instance.Name of the owner at the time of launch

+ +

Definition at line 25 of file JsonFile.cs.

+
25 { get; set; }
+
+
+ +

◆ Revision

+ +
+
+ + + + + +
+ + + + +
Api.Models.Internal.RevisionInformation Tgstation.Server.Host.Components.Interop.JsonFile.Revision
+
+getset
+
+ +

The Api.Models.Internal.RevisionInformation of the launch

+ +

Definition at line 45 of file JsonFile.cs.

+
45 { get; set; }
+
+
+ +

◆ SecurityLevel

+ +
+
+ + + + + +
+ + + + +
DreamDaemonSecurity Tgstation.Server.Host.Components.Interop.JsonFile.SecurityLevel
+
+getset
+
+ +

The DreamDaemonSecurity level of the launch

+ +

Definition at line 50 of file JsonFile.cs.

+
50 { get; set; }
+
+
+ +

◆ ServerCommandsJson

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Interop.JsonFile.ServerCommandsJson
+
+getset
+
+ +

JSON file DD should write to to send commands to the server

+ +

Definition at line 40 of file JsonFile.cs.

+
40 { get; set; }
+
+
+ +

◆ TestMerges

+ +
+
+ + + + + +
+ + + + +
List<TestMerge> Tgstation.Server.Host.Components.Interop.JsonFile.TestMerges = new List<TestMerge>()
+
+get
+
+ +

The TestMerges in the launch

+ +

Definition at line 55 of file JsonFile.cs.

+
55 { get; } = new List<TestMerge>();
+
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Host/Components/Interop/JsonFile.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list-members.html new file mode 100644 index 0000000000..2772f6020e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list-members.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Interop.JsonSubFileList Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list.html new file mode 100644 index 0000000000..98b95d9eeb --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list.html @@ -0,0 +1,281 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Interop.JsonSubFileList Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Interop.JsonSubFileList Class Reference
+
+
+ +

Information used in for reattaching and interop + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Interop.JsonSubFileList:
+
+
+ + +Tgstation.Server.Host.Models.ReattachInformationBase +Tgstation.Server.Host.Components.Watchdog.ReattachInformation +Tgstation.Server.Host.Models.ReattachInformation + +
+ + + + + +

+Public Member Functions

 JsonSubFileList (JsonSubFileList copy)
 Construct an JsonSubFileList from a copy More...
 
+ + + + +

+Protected Member Functions

 JsonSubFileList ()
 Construct an JsonSubFileList More...
 
+ + + + + + + + + + +

+Properties

string ChatCommandsJson [get, set]
 Path to the chat commands json file More...
 
string ChatChannelsJson [get, set]
 Path to the chat channels json file More...
 
string ServerCommandsJson [get, set]
 Path to the server commands json file More...
 
+

Detailed Description

+

Information used in for reattaching and interop

+ +

Definition at line 9 of file JsonSubFileList.cs.

+

Constructor & Destructor Documentation

+ +

◆ JsonSubFileList() [1/2]

+ +
+
+ + + + + +
+ + + + + + + +
Tgstation.Server.Host.Components.Interop.JsonSubFileList.JsonSubFileList ()
+
+protected
+
+ +

Construct an JsonSubFileList

+ +

Definition at line 32 of file JsonSubFileList.cs.

+
32 { }
+
+
+ +

◆ JsonSubFileList() [2/2]

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Components.Interop.JsonSubFileList.JsonSubFileList (JsonSubFileList copy)
+
+ +

Construct an JsonSubFileList from a copy

+
Parameters
+ + +
copyAn JsonSubFileList to copy
+
+
+ +

Definition at line 38 of file JsonSubFileList.cs.

+
39  {
40  if (copy == null)
41  throw new ArgumentNullException(nameof(copy));
42  ChatChannelsJson = copy.ChatChannelsJson;
43  ChatCommandsJson = copy.ChatCommandsJson;
44  ServerCommandsJson = copy.ServerCommandsJson;
45  }
string ServerCommandsJson
Path to the server commands json file
+
string ChatCommandsJson
Path to the chat commands json file
+
string ChatChannelsJson
Path to the chat channels json file
+
+

References Tgstation.Server.Host.Components.Interop.JsonSubFileList.ChatChannelsJson, Tgstation.Server.Host.Components.Interop.JsonSubFileList.ChatCommandsJson, and Tgstation.Server.Host.Components.Interop.JsonSubFileList.ServerCommandsJson.

+ +
+
+

Property Documentation

+ +

◆ ChatChannelsJson

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Interop.JsonSubFileList.ChatChannelsJson
+
+getset
+
+ +

Path to the chat channels json file

+ +

Definition at line 21 of file JsonSubFileList.cs.

+
21 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Interop.JsonSubFileList.JsonSubFileList(), and Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.Reattach().

+ +
+
+ +

◆ ChatCommandsJson

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Interop.JsonSubFileList.ChatCommandsJson
+
+getset
+
+ +

Path to the chat commands json file

+ +

Definition at line 15 of file JsonSubFileList.cs.

+
15 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Interop.JsonSubFileList.JsonSubFileList(), and Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.Reattach().

+ +
+
+ +

◆ ServerCommandsJson

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Interop.JsonSubFileList.ServerCommandsJson
+
+getset
+
+ +

Path to the server commands json file

+ +

Definition at line 27 of file JsonSubFileList.cs.

+
27 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Interop.JsonSubFileList.JsonSubFileList(), and Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.Reattach().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list.png new file mode 100644 index 0000000000000000000000000000000000000000..4cbd24039354b985061582f79b725ccbd6090827 GIT binary patch literal 2691 zcmcguc{o)47r&^XWs1tuv>;nWh?&R_V~snuLbfR(YYN$An;KanGe*W1Bc>=uDrS&g zYgE!=8v8Cp_AP7kyW@R+fA;?I`{TXObMN<@?{mKAo_ju@bIy%BZ)yPFiP#AM030;b zGY0@37$nE?@j%aOnB7ch5jk&csn2G!A@RrLQUIZj2uWLaO-;@AxE@hRi?adN_n8j6a!-rn_IUz|-1(@2=8~t{ z8`6bK`go^z7`&5m_#9GIz2cs3?&YzIhu;F9k?)Qv$ZR|B1P9IyB)~eS*>_;Jwkd=R zLF;u3&)J6Pmw6ccJks6PpISSNKiNhmg-GDIIlj$M<;T(}qKtc2sZbSegxLsG_kony$^Ew-zf5&`fmw43d+a4Xh!B8%! zj&_ioCC3*aN(+?0NZ)pF&}h>lsX0Oz)*uYcWjHyt;Q=S2{$`u;0)hIy%PaD?Y@bv= z*y=ax>M}f{srl)O+pzEpjQKg)hTLCG3{t7ltKnLQWm5{1uENQT zF{JyRTNu3CBYI!8q5*ia1O`aVl3?hRVD^|jkznGpi9&~O^nD1RCA!pCsbpq46CjM^ zJ3=4TE~_0;y6H@7E*t4#3V92R*Au5)ggi^#BD0r#-bYD|^K;^V?mk?;FDCE}t|^rWYn6*A)m$7bcn(ieik^NK{?Ur&blzTKQl* z%dW`@I+84jee&I7FR!S?xVxWc*>_p=g+2w387nWUe;N*H9DG>}bqedbU2xJ+;^Wu( z+EyoxMCa;_@k7Xt=vczuYl<3Hq&;K-5FQ=$3AP8 zBTj{MS+prdmp5h_*pU~7Z03D~vVWbB9&S(_MU(tvIUpw^4rm&ZlBj472L=S;rlQLn zjzH{H&jYV#!B8id`;7l#l#&9Si)%2ff6vcmMhj`S#RYfaOjP5B{ zFGe>_8Gz;RnxeHLtM&lBK5JZS!vVmLXy)E8qR)A>R31j)eg_``DhC&N7Mp$oU*P$o zIcR%coR{h*usNp&_}7o~{vfn-rV6uHib3)xe@D8X3$Z*iw^|{Vhzfor0d_8F!ZW;0 zPqALT`_;!@LjI_5H3|^YugtF<^OFVLo+4M$S$PT50HBi#ny8*=NAdfF@EeOOU%_yb^(`p-tG~6f1EJ0hU z_t73U2MqE{0;R7qTQKS6YPx5L0{at6Xuaz)PP2JzP{xtjh3=I($(GrL} zt~vbx3#u9E;y;!Mn`bFPHY{X)qWB12`bPWo3p5U<(I!Xn z{LiaUe8jQ8v$w8JXL@T6PPaafaXrY~a1TkI0><;MGwsoFx^lGSL{cYbT8qBrrS%FPMSqxX^)vgFcz0)1viW-cTA?Oxr|M(Da~gm2|i4-dKjMj+yI-G8BjNK77oKIgKJ7B;gatS zTV;X?Fiyu{aOOrd)E9pLgRtSwufr!D#ji&EpD?@kq}2Fs*<(KK&>tfJ>YM5n>p0x` EFDYfvWdHyG literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge-members.html new file mode 100644 index 0000000000..a719a0cf37 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge-members.html @@ -0,0 +1,97 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Interop.TestMerge Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge.html new file mode 100644 index 0000000000..a076948b71 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge.html @@ -0,0 +1,256 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Interop.TestMerge Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Interop.TestMerge Class Reference
+
+
+ +

This model mirrors /datum/tgs_revision_information/test_merge + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Interop.TestMerge:
+
+
+ + +Tgstation.Server.Api.Models.Internal.TestMergeBase +Tgstation.Server.Api.Models.TestMergeParameters + +
+ + + + + +

+Public Member Functions

 TestMerge (Models.TestMerge testMerge, RevisionInformation revision)
 Construct a TestMerge More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

string TimeMerged [get, set]
 The unix time of when the test merge was applied More...
 
RevisionInformation Revision [get, set]
 The RevisionInformation of the TestMerge More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.TestMergeBase
string TitleAtMerge [get, set]
 The title of the pull request More...
 
string BodyAtMerge [get, set]
 The body of the pull request More...
 
string Url [get, set]
 The URL of the pull request More...
 
string Author [get, set]
 The author of the pull request More...
 
- Properties inherited from Tgstation.Server.Api.Models.TestMergeParameters
int? Number [get, set]
 The number of the pull request More...
 
string PullRequestRevision [get, set]
 The sha of the pull request revision to merge. If not specified, the latest commit shall be used (semi-unsafe) More...
 
string Comment [get, set]
 Optional comment about the test More...
 
+ + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from Tgstation.Server.Api.Models.Internal.TestMergeBase
 TestMergeBase ()
 Construct a TestMergeBase More...
 
 TestMergeBase (TestMergeBase copy)
 Construct a TestMergeBase from a copy More...
 
+

Detailed Description

+

This model mirrors /datum/tgs_revision_information/test_merge

+ +

Definition at line 10 of file TestMerge.cs.

+

Constructor & Destructor Documentation

+ +

◆ TestMerge()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Interop.TestMerge.TestMerge (Models.TestMerge testMerge,
RevisionInformation revision 
)
+
+ +

Construct a TestMerge

+
Parameters
+ + + +
testMergeThe Models.TestMerge to build from
revisionThe value of Revision
+
+
+ +

Definition at line 27 of file TestMerge.cs.

+
27  : base(testMerge)
28  {
29  TimeMerged = testMerge.MergedAt.Ticks.ToString(CultureInfo.InvariantCulture);
30  Revision = revision ?? throw new ArgumentNullException(nameof(revision));
31  }
string TimeMerged
The unix time of when the test merge was applied
Definition: TestMerge.cs:15
+
RevisionInformation Revision
The RevisionInformation of the TestMerge
Definition: TestMerge.cs:20
+
+

References Tgstation.Server.Host.Components.Interop.TestMerge.Revision, and Tgstation.Server.Host.Components.Interop.TestMerge.TimeMerged.

+ +
+
+

Property Documentation

+ +

◆ Revision

+ +
+
+ + + + + +
+ + + + +
RevisionInformation Tgstation.Server.Host.Components.Interop.TestMerge.Revision
+
+getset
+
+ +

The RevisionInformation of the TestMerge

+ +

Definition at line 20 of file TestMerge.cs.

+
20 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Interop.TestMerge.TestMerge().

+ +
+
+ +

◆ TimeMerged

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Interop.TestMerge.TimeMerged
+
+getset
+
+ +

The unix time of when the test merge was applied

+ +

Definition at line 15 of file TestMerge.cs.

+
15 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Interop.TestMerge.TestMerge().

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Host/Components/Interop/TestMerge.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge.png new file mode 100644 index 0000000000000000000000000000000000000000..60324a93cc447824f61e2b42b8a5754ceca2ab7e GIT binary patch literal 1851 zcmcK5eNdA}9tZFTD22lkIc?#T@X{90$V-oxkt5;F5|jr>sDX+Qsk9!5M_wvPK+Egc zN(u_W2;>k0DrvC11e6jXIS@)GD)N#5A%rBv%8L&qAw?iT6uGp{b#D6a&F#$Yes^|f z_K)9Zc1u3N9Vh>LPgNqX&8 zBXM?73)DlQ;8!uE`OWs>^PVHCX%!SlruLtNDozcr+P0CT{A*n5@f9DTAHJJAo<@Vt z@10W?yP-(m>_r=Y*?#r>o!Rwj10&6_F2A5;w~*Jm2}w`6Z~^UQ_EPM$0;V7Gl^-MT zV2M2r9^=f2?PPUggK$(RzcL|$s{~@$d!3)#cMV~f#7m<>e1}8Jj)E=Xg1nynL5)N) z#ojpQ;d$_<{I|wa+r*vU>5xl7)1?QP9(NheY~c+qBnrTOef_4R`JEhgS#wnO8kD}C zTRH+HmFs1$v#M@2K$_IQTuo?F_)@UQ2!4mI+Dl;2CW3ymaMhXq?5#Wc zvpRtzJ|i*wG$bI7Kc0~h93Bo;Bm~^P?;zrCrT2fPrctQno9C2{g3uwbWTr>MmHjlw zyP9w~#X*aL2y~(oVQlS0NNsTd|B%s{Wsy~>IYaM+CDT=j#w|*EhMItCLaq7e@9p59 z+7G%&=)*C7vmcHuKwPIt=4qku7=_2p8s6^j!GZKG)QgY#Xfzt+wwn#z0^ck3#r zVi()(;%|kt61*uc#w@R`0Kfq`RS@vO<_j_?+ztUW=dD{g1jG<%|B?UTyS=m`^pbIg5@rWs$^Gs7u0Eq z>7Ft`__u9y)zN4QgQ@Mp641u>jaSbDUOnwC^y+9EUEo`G$A+-HW0aK<_eg3i8~nTC zXLgO($fX2vTuV~9829+OK+*3;?)C!`*FOI1L! zqDD*^c$8ot$sX4jBD{f87h57gk+#}t#`UuIn7fM z)J99i`h(ugP7R50GvZUH1`Qt*my&aB=Z@_C_3^t?zVLZ|a>j&h$va;6uKCyINLzu4pRP#SzEtV9B4ihStgUd<8 zFPiVq!W6!h90oM7;ErfQ-L!=^?OnmbmX9KH0#{ci-Wi-J%}Q`bZ5BD6P^hTIxOrF%=LyzmE`LacP+ZwOex{Q|HIdR;awC; zs&LUwmAK_n^9u8>#y^;z785ZR84V$!y~BTI)B@?rTR^sURPSi6{8Dk^AwWkCo~!M? zEV?c@tE0i&UKnwqM{)-2o*cGQ9Tj;FYaD`Z_#CO`k6&>$u(RJ)S~ z8x#doEiW$zI%uY)EF+9l!b|QG_CxZk{&QUVZLPG!W!*fTs^=vI#8ar=cDu2xA5b3Qd(vD~s;nnJHq;7( zHv>-$IthH6W-p(HxG#5#_qgH(N1#cEyV3#DI0l1Fp`3M5{Q}GDU#`ViKY;j=lj|$5 zCzH#?Y1!qYT* z!T5#zSzhf-&>K;U8-}Mp827E(*G>kE?^uM5nET2jq$K;s{u8Y=-V f8mz(%Vz#UlGkI$R%KiSPpAG;cv1s1MsTckY)7^zO literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler-members.html new file mode 100644 index 0000000000..63d7bafec8 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler-members.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.ReattachInfoHandler Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.ReattachInfoHandler, including all inherited members.

+ + + + + + + + +
databaseContextFactoryTgstation.Server.Host.Components.ReattachInfoHandlerprivate
dmbFactoryTgstation.Server.Host.Components.ReattachInfoHandlerprivate
Load(CancellationToken cancellationToken)Tgstation.Server.Host.Components.ReattachInfoHandler
loggerTgstation.Server.Host.Components.ReattachInfoHandlerprivate
metadataTgstation.Server.Host.Components.ReattachInfoHandlerprivate
ReattachInfoHandler(IDatabaseContextFactory databaseContextFactory, IDmbFactory dmbFactory, ILogger< ReattachInfoHandler > logger, Api.Models.Instance metadata)Tgstation.Server.Host.Components.ReattachInfoHandler
Save(WatchdogReattachInformation reattachInformation, CancellationToken cancellationToken)Tgstation.Server.Host.Components.ReattachInfoHandler
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html new file mode 100644 index 0000000000..8ca2d3bbeb --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html @@ -0,0 +1,371 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.ReattachInfoHandler Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.ReattachInfoHandler Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.ReattachInfoHandler:
+
+
+ + +Tgstation.Server.Host.Components.Watchdog.IReattachInfoHandler + +
+ + + + + + + + + + + +

+Public Member Functions

 ReattachInfoHandler (IDatabaseContextFactory databaseContextFactory, IDmbFactory dmbFactory, ILogger< ReattachInfoHandler > logger, Api.Models.Instance metadata)
 Construct a ReattachInfoHandler More...
 
Task Save (WatchdogReattachInformation reattachInformation, CancellationToken cancellationToken)
 Save some reattachInformation More...
 
async Task< WatchdogReattachInformationLoad (CancellationToken cancellationToken)
 Load a saved WatchdogReattachInformation More...
 
+ + + + + + + + + + + + + +

+Private Attributes

readonly IDatabaseContextFactory databaseContextFactory
 The IDatabaseContextFactory for the ReattachInfoHandler More...
 
readonly IDmbFactory dmbFactory
 The IDmbFactory for the ReattachInfoHandler More...
 
readonly ILogger< ReattachInfoHandlerlogger
 The ILogger for the ReattachInfoHandler More...
 
readonly Api.Models.Instance metadata
 The Api.Models.Instance for the ReattachInfoHandler More...
 
+

Detailed Description

+
+

Definition at line 15 of file ReattachInfoHandler.cs.

+

Constructor & Destructor Documentation

+ +

◆ ReattachInfoHandler()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.ReattachInfoHandler.ReattachInfoHandler (IDatabaseContextFactory databaseContextFactory,
IDmbFactory dmbFactory,
ILogger< ReattachInfoHandlerlogger,
Api.Models.Instance metadata 
)
+
+ +

Construct a ReattachInfoHandler

+
Parameters
+ + + + + +
databaseContextFactoryThe value of databaseContextFactory
dmbFactoryThe value of dmbFactory
loggerThe value of logger
metadataThe value of metadata
+
+
+ +

Definition at line 44 of file ReattachInfoHandler.cs.

+
45  {
46  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
47  this.dmbFactory = dmbFactory ?? throw new ArgumentNullException(nameof(dmbFactory));
48  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
49  this.metadata = metadata ?? throw new ArgumentNullException(nameof(metadata));
50  }
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the ReattachInfoHandler
+
readonly ILogger< ReattachInfoHandler > logger
The ILogger for the ReattachInfoHandler
+
readonly Api.Models.Instance metadata
The Api.Models.Instance for the ReattachInfoHandler
+
readonly IDmbFactory dmbFactory
The IDmbFactory for the ReattachInfoHandler
+
+

References Tgstation.Server.Host.Components.ReattachInfoHandler.databaseContextFactory, Tgstation.Server.Host.Components.ReattachInfoHandler.dmbFactory, Tgstation.Server.Host.Components.ReattachInfoHandler.logger, and Tgstation.Server.Host.Components.ReattachInfoHandler.metadata.

+ +
+
+

Member Function Documentation

+ +

◆ Load()

+ +
+
+ + + + + + + + +
async Task<WatchdogReattachInformation> Tgstation.Server.Host.Components.ReattachInfoHandler.Load (CancellationToken cancellationToken)
+
+ +

Load a saved WatchdogReattachInformation

+ +

Implements Tgstation.Server.Host.Components.Watchdog.IReattachInfoHandler.

+ +

Definition at line 95 of file ReattachInfoHandler.cs.

+
96  {
97  Models.WatchdogReattachInformation result = null;
98  await databaseContextFactory.UseContext(async (db) =>
99  {
100  var instance = await db.Instances.Where(x => x.Id == metadata.Id)
101  .Include(x => x.WatchdogReattachInformation).ThenInclude(x => x.Alpha).ThenInclude(x => x.CompileJob)
102  .Include(x => x.WatchdogReattachInformation).ThenInclude(x => x.Bravo).ThenInclude(x => x.CompileJob)
103  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
104  result = instance.WatchdogReattachInformation;
105  if (result == default)
106  return;
107  instance.WatchdogReattachInformation = null;
108  db.WatchdogReattachInformations.Remove(result);
109  await db.Save(cancellationToken).ConfigureAwait(false);
110  }).ConfigureAwait(false);
111 
112  if (result == default)
113  {
114  logger.LogDebug("Reattach information not found!");
115  return null;
116  }
117 
118  var bravoDmbTask = dmbFactory.FromCompileJob(result.Bravo.CompileJob, cancellationToken);
119  var info = new WatchdogReattachInformation(result, await dmbFactory.FromCompileJob(result.Alpha.CompileJob, cancellationToken).ConfigureAwait(false), await bravoDmbTask.ConfigureAwait(false));
120  logger.LogDebug("Reattach information loaded: {0}", info);
121  return info;
122  }
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the ReattachInfoHandler
+
readonly ILogger< ReattachInfoHandler > logger
The ILogger for the ReattachInfoHandler
+
readonly Api.Models.Instance metadata
The Api.Models.Instance for the ReattachInfoHandler
+
readonly IDmbFactory dmbFactory
The IDmbFactory for the ReattachInfoHandler
+ +
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+
Task< IDmbProvider > FromCompileJob(CompileJob compileJob, CancellationToken cancellationToken)
Gets a IDmbProvider for a given CompileJob
+
+

References Tgstation.Server.Host.Components.ReattachInfoHandler.databaseContextFactory, Tgstation.Server.Host.Components.ReattachInfoHandler.dmbFactory, Tgstation.Server.Host.Components.Compiler.IDmbFactory.FromCompileJob(), Tgstation.Server.Host.Components.ReattachInfoHandler.logger, Tgstation.Server.Host.Components.ReattachInfoHandler.metadata, and Tgstation.Server.Host.Core.IDatabaseContextFactory.UseContext().

+ +
+
+ +

◆ Save()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.ReattachInfoHandler.Save (WatchdogReattachInformation reattachInformation,
CancellationToken cancellationToken 
)
+
+ +

Save some reattachInformation

+ +

Implements Tgstation.Server.Host.Components.Watchdog.IReattachInfoHandler.

+ +
+
+

Member Data Documentation

+ +

◆ databaseContextFactory

+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContextFactory Tgstation.Server.Host.Components.ReattachInfoHandler.databaseContextFactory
+
+private
+
+
+ +

◆ dmbFactory

+ +
+
+ + + + + +
+ + + + +
readonly IDmbFactory Tgstation.Server.Host.Components.ReattachInfoHandler.dmbFactory
+
+private
+
+
+ +

◆ logger

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<ReattachInfoHandler> Tgstation.Server.Host.Components.ReattachInfoHandler.logger
+
+private
+
+
+ +

◆ metadata

+ +
+
+ + + + + +
+ + + + +
readonly Api.Models.Instance Tgstation.Server.Host.Components.ReattachInfoHandler.metadata
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.png new file mode 100644 index 0000000000000000000000000000000000000000..c2e447861120215f0334821c4875515bf31d06b7 GIT binary patch literal 1334 zcmeAS@N?(olHy`uVBq!ia0y~yU~C1l12~w0b^5$^0A)MJu7;b z2N+-K7m@6bTG0Q{BPRc4aND7jOBdegWu4GIf7ydQWp4hp+XiV|X6*4@OATLtdUoqo zrQ^XHhMhZqY4N$b%=vTog7x`htxGp}*2XVRTrk)DbP89FpW9bf^Ve*_3+6TDZQ5N? znrkK!k{kWBOk~-M+e?=$7fVmvQ8D*WOK|xyKgagE=}o6@rQ5UlYrc@q^gMVq&Hdpg zx1y_?zdJ79@M?eA@1wn6zUbtfTWe%5J9V~5nf#w~KUrJT)4w+z`n+$$vV`B4YLsKY zwjOQWv&%z&Q^oc`$x=ZOkVEWdD`{WBlu`aBiEiBmdG+z$#85bO*?C9X9e zDwJ`5WznbX$MCVbFhb+leIMy14VuC9U3M9yRCuTkuV?C=p>(JxoAAcTy-u>g(s$b_V ze}A>!C-qm;JpZ|najJ2){;bmI?q`eEt=+dK-F6jY71!O9J5!!K%BlS+seju#JMG8Y z!kbSR)_qZGoi(veqsLwM!t#ocIHbgR4461iNX}~duye=VXI~A<(%-&){Uel1tw-=| zO#IP>41QG^R^Vj0^3J{^>-06w&zn@V(`U83-0sw(jMEGou7B59ackSDw;DYg+IzQM z3@Fg#6<;4bqhOZw$%^oY{Re}&ez`>j6`W*@c{y7|FJC3xw$@RTYxTeE?eTX!{Ldfy zcPG#O$K7|_T<7`jpAW3KCw|TI_BONo9^ti#h4a_Hd)U2b&pk*YWbps0)Ot(gb!p+e zz5ddFr+wsI5I6s=eR8JH&tN+#uj*vpm8W*TwCpqXdVAC&^WpcHJ9*JnwHHl{ALm^E zYZu>;eRuhT0)`{6=O!`!SQfYB!zn}NADMq=i`)uiu3-PWScD;np+3lyQ6UN$^K&ho gGD&Oc6pO!1mH+%t7zFk40Sh?>Pgg&ebxsLQ0I5H9aR2}S literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider-members.html new file mode 100644 index 0000000000..4cd9acfbff --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Repository.CredentialsProvider Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider.html new file mode 100644 index 0000000000..8f1f56a7f4 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider.html @@ -0,0 +1,216 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Repository.CredentialsProvider Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Repository.CredentialsProvider Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Repository.CredentialsProvider:
+
+
+ + +Tgstation.Server.Host.Components.Repository.ICredentialsProvider + +
+ + + + + + + + +

+Public Member Functions

 CredentialsProvider (ILogger< CredentialsProvider > logger)
 Construct a CredentialsProvider More...
 
CredentialsHandler GenerateHandler (string username, string password)
 Generate a CredentialsHandler from a given username and password More...
 
+ + + + +

+Private Attributes

readonly ILogger< CredentialsProviderlogger
 The ILogger for the CredentialsProvider More...
 
+

Detailed Description

+
+

Definition at line 10 of file CredentialsProvider.cs.

+

Constructor & Destructor Documentation

+ +

◆ CredentialsProvider()

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Components.Repository.CredentialsProvider.CredentialsProvider (ILogger< CredentialsProviderlogger)
+
+ +

Construct a CredentialsProvider

+
Parameters
+ + +
loggerThe value of logger
+
+
+ +

Definition at line 21 of file CredentialsProvider.cs.

+
22  {
23  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
24  }
readonly ILogger< CredentialsProvider > logger
The ILogger for the CredentialsProvider
+
+

References Tgstation.Server.Host.Components.Repository.CredentialsProvider.logger.

+ +
+
+

Member Function Documentation

+ +

◆ GenerateHandler()

+ +
+
+ + + + + + + + + + + + + + + + + + +
CredentialsHandler Tgstation.Server.Host.Components.Repository.CredentialsProvider.GenerateHandler (string username,
string password 
)
+
+ +

Generate a CredentialsHandler from a given username and password

+ +

Implements Tgstation.Server.Host.Components.Repository.ICredentialsProvider.

+ +

Referenced by Tgstation.Server.Host.Components.Repository.Repository.FetchOrigin().

+ +
+
+

Member Data Documentation

+ +

◆ logger

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<CredentialsProvider> Tgstation.Server.Host.Components.Repository.CredentialsProvider.logger
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider.png new file mode 100644 index 0000000000000000000000000000000000000000..1424c8d06440529c272cf99dc3a4ecd6c4a37fe5 GIT binary patch literal 1400 zcmeAS@N?(olHy`uVBq!ia0y~yU~C7n12~w0|ze;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|z{>9F;uuoF_;zk$@t-wZ?)@pt?*CW5 zf7iFCVTSMT`H|o3oR7yx_c9fU+~1UYJM7lBTyN3Y9Uh)8DuG8GT~y-Hh`G+U>s?&7 zUabA|eBW38%SwV1J${?m|9o@bTt#Ww%+!N=E=RUJjq^+9mcBe=V@lbkf&w1)_^Y)u z_Oto9xNNu05uCVv*Rv1Y&PqwMo)(-wXWBlsx5K$)(Y>~U_QT9iwWq0Pf6kV_``D)P zweyDW{heheieAX?D)rv8`-SDp$>DpI9p<-W9K2WA$9vuC(a(<6mBnl|VSc~W&lmq( znCv$}_WZ*elk+a6n3yh1zI=Q|y;S`*v1(^x{*}4?3o9f1Y>rp@Yq~`}(`&xZXAII&VtG_3%dcAJizV&?db@FO_#Xmm(7DzuT>iJyBXv-6Wd7uAX*u!>4 zIsZ!bLygW=e&^InA_DcQLSY2_+R4m-KQ_3zsdZO)=`?Y@_fOG`yWf>f7uEN{$#3cIV}FhVwJa& zlB(du^D8YnI-aaXC0-v)yuEGhmfYLZG#mbx|7DoM5ELrIaOvykUE1%^pL z);>p9MuqsJG{*lq`POa?%UZiNoy_c*eFS z^8BuHmKUD|bZ=On-}o@f{Y~GzStj}Smp?JNSDg$_va=cvZ&bgV(X&jgB*Hh9(-rrnVDBwZ>bk0ZT0HhJ9D}WQ+j=+{G;62XW2?$zN($^YM1u%_uNP3-)EoR zrupq>ZAb7UttFe~C3ihCi2L&I8Zfn5=U+Mfa7EXu5NK*m1g6$~XsK1WBUXIp+hnWM zY0m@ozrJ2;EKpS7!0_p7|HeD9^Y%XNY_4x+H2NyZ_tJXad*}UL4Dk#4fyuToVmdI+ t<%0_uPJ|=j>&?#DYo|tK>jwX4?y(FwvN|}s23Sloc)I$ztaD0e0sue5sVD#d literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository-members.html new file mode 100644 index 0000000000..2640c10304 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository-members.html @@ -0,0 +1,118 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Repository.Repository Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Repository.Repository, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddTestMerge(TestMergeParameters testMergeParameters, string committerName, string committerEmail, string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.Repository
CheckoutObject(string committish, Action< int > progressReporter, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.Repository
CheckoutProgressHandler(Action< int > progressReporter)Tgstation.Server.Host.Components.Repository.Repositoryprivatestatic
CopyTo(string path, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.Repository
credentialsProviderTgstation.Server.Host.Components.Repository.Repositoryprivate
Dispose()Tgstation.Server.Host.Components.Repository.Repository
eventConsumerTgstation.Server.Host.Components.Repository.Repositoryprivate
FetchOrigin(string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.Repository
GeneratePushOptions(Action< int > progressReporter, string username, string password, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.Repositoryprivate
GetRepositoryOwnerName(string remote, out string owner, out string name)Tgstation.Server.Host.Components.Repository.Repositoryprivate
GitHubOwnerTgstation.Server.Host.Components.Repository.Repository
GitHubRepoNameTgstation.Server.Host.Components.Repository.Repository
GitHubUrlTgstation.Server.Host.Components.Repository.Repository
HeadTgstation.Server.Host.Components.Repository.Repository
ioManangerTgstation.Server.Host.Components.Repository.Repositoryprivate
IsGitHubRepositoryTgstation.Server.Host.Components.Repository.Repository
IsSha(string committish, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.Repository
loggerTgstation.Server.Host.Components.Repository.Repositoryprivate
MergeOrigin(string committerName, string committerEmail, Action< int > progressReporter, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.Repository
onDisposeTgstation.Server.Host.Components.Repository.Repositoryprivate
OriginTgstation.Server.Host.Components.Repository.Repository
OriginTrackingErrorTemplateTgstation.Server.Host.Components.Repository.Repository
PushHeadToTemporaryBranch(string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.Repositoryprivate
RawCheckout(string committish, Action< int > progressReporter, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.Repositoryprivate
ReferenceTgstation.Server.Host.Components.Repository.Repository
RemoteTemporaryBranchNameTgstation.Server.Host.Components.Repository.Repository
Repository(LibGit2Sharp.IRepository repository, IIOManager ioMananger, IEventConsumer eventConsumer, ICredentialsProvider credentialsProvider, ILogger< Repository > logger, Action onDispose)Tgstation.Server.Host.Components.Repository.Repository
repositoryTgstation.Server.Host.Components.Repository.Repositoryprivate
ResetToOrigin(Action< int > progressReporter, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.Repository
ResetToSha(string sha, Action< int > progressReporter, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.Repository
Sychronize(string username, string password, string committerName, string committerEmail, Action< int > progressReporter, bool synchronizeTrackedBranch, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.Repository
TrackingTgstation.Server.Host.Components.Repository.Repository
UnknownReferenceTgstation.Server.Host.Components.Repository.Repositoryprivate
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html new file mode 100644 index 0000000000..d77081245b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html @@ -0,0 +1,1486 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Repository.Repository Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Repository.Repository Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Repository.Repository:
+
+
+ + +Tgstation.Server.Host.Components.Repository.IRepository +IDisposable + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 Repository (LibGit2Sharp.IRepository repository, IIOManager ioMananger, IEventConsumer eventConsumer, ICredentialsProvider credentialsProvider, ILogger< Repository > logger, Action onDispose)
 Construct a Repository More...
 
void Dispose ()
 
async Task< bool?> AddTestMerge (TestMergeParameters testMergeParameters, string committerName, string committerEmail, string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)
 Attempt to merge a GitHub pull request into HEAD More...
 
async Task CheckoutObject (string committish, Action< int > progressReporter, CancellationToken cancellationToken)
 Checks out a given committish More...
 
async Task FetchOrigin (string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)
 Fetch commits from the origin repository More...
 
async Task ResetToOrigin (Action< int > progressReporter, CancellationToken cancellationToken)
 Requires the current HEAD to be a tracked reference. Hard resets the reference to what it tracks on the origin repository More...
 
Task ResetToSha (string sha, Action< int > progressReporter, CancellationToken cancellationToken)
 Requires the current HEAD to be a reference. Hard resets the reference to the given sha More...
 
async Task CopyTo (string path, CancellationToken cancellationToken)
 Copies the current working directory to a given path More...
 
async Task< bool?> MergeOrigin (string committerName, string committerEmail, Action< int > progressReporter, CancellationToken cancellationToken)
 Requires the current HEAD to be a tracked reference. Merges the reference to what it tracks on the origin repository More...
 
async Task< bool > Sychronize (string username, string password, string committerName, string committerEmail, Action< int > progressReporter, bool synchronizeTrackedBranch, CancellationToken cancellationToken)
 Runs the synchronize event script and attempts to push any changes made to the IRepository if on a tracked branch More...
 
Task< bool > IsSha (string committish, CancellationToken cancellationToken)
 Checks if a given committish is a sha More...
 
+ + + + + + + + + + + + + + + + + + +

+Public Attributes

const string GitHubUrl = "://github.com/"
 Indication of a GitHub repository More...
 
const string OriginTrackingErrorTemplate = "Unable to determine most recent origin commit of {0}. Marking it as an origin commit. This may result in invalid git metadata until the next hard reset to an origin reference."
 Template error message for when tracking of the most recent origin commit fails More...
 
const string RemoteTemporaryBranchName = "___TGSTempBranch"
 The branch name used for publishing testmerge commits More...
 
bool Tracking => Reference != null && repository.Head.IsTracking
 
string Head => repository.Head.Tip.Sha
 
string Reference => repository.Head.FriendlyName
 
string Origin => repository.Network.Remotes.First().Url
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

bool IsGitHubRepository [get]
 
string GitHubOwner [get]
 
string GitHubRepoName [get]
 
- Properties inherited from Tgstation.Server.Host.Components.Repository.IRepository
bool IsGitHubRepository [get]
 If the IRepository was cloned from GitHub.com More...
 
string GitHubOwner [get]
 The Octokit.Repository.Owner if this IsGitHubRepository More...
 
string GitHubRepoName [get]
 The Octokit.Repository.Name if this IsGitHubRepository More...
 
bool Tracking [get]
 If Reference tracks an upstream branch More...
 
string Head [get]
 The SHA of the IRepository HEAD More...
 
string Reference [get]
 The current reference the IRepository HEAD is using. This can be a branch or tag More...
 
string Origin [get]
 The current origin remote the IRepository is using More...
 
+ + + + + + + + + + + + +

+Private Member Functions

void GetRepositoryOwnerName (string remote, out string owner, out string name)
 
PushOptions GeneratePushOptions (Action< int > progressReporter, string username, string password, CancellationToken cancellationToken)
 Generate a standard set of PushOptions More...
 
void RawCheckout (string committish, Action< int > progressReporter, CancellationToken cancellationToken)
 Runs a blocking force checkout to committish More...
 
Task PushHeadToTemporaryBranch (string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)
 Force push the current repository HEAD to RemoteTemporaryBranchName; More...
 
+ + + + +

+Static Private Member Functions

static CheckoutProgressHandler CheckoutProgressHandler (Action< int > progressReporter)
 Converts a given progressReporter to a LibGit2Sharp.Handlers.CheckoutProgressHandler More...
 
+ + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

const string UnknownReference = "<UNKNOWN>"
 
readonly LibGit2Sharp.IRepository repository
 The LibGit2Sharp.IRepository for the Repository More...
 
readonly IIOManager ioMananger
 The IIOManager for the Repository More...
 
readonly IEventConsumer eventConsumer
 The IEventConsumer for the Repository More...
 
readonly ICredentialsProvider credentialsProvider
 The ICredentialsProvider for the Repository More...
 
readonly ILogger< Repositorylogger
 The ILogger for the Repository More...
 
readonly Action onDispose
 Action to be taken when Dispose is called More...
 
+

Detailed Description

+
+

Definition at line 17 of file Repository.cs.

+

Constructor & Destructor Documentation

+ +

◆ Repository()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Repository.Repository.Repository (LibGit2Sharp.IRepository repository,
IIOManager ioMananger,
IEventConsumer eventConsumer,
ICredentialsProvider credentialsProvider,
ILogger< Repositorylogger,
Action onDispose 
)
+
+ +

Construct a Repository

+
Parameters
+ + + + + + + +
repositoryThe value of repository
ioManangerThe value of ioMananger
eventConsumerThe value of eventConsumer
credentialsProviderThe value of credentialsProvider
loggerThe value of logger
onDisposeThe value if onDispose
+
+
+ +

Definition at line 103 of file Repository.cs.

+
104  {
105  this.repository = repository ?? throw new ArgumentNullException(nameof(repository));
106  this.ioMananger = ioMananger ?? throw new ArgumentNullException(nameof(ioMananger));
107  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
108  this.credentialsProvider = credentialsProvider ?? throw new ArgumentNullException(nameof(credentialsProvider));
109  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
110  this.onDispose = onDispose ?? throw new ArgumentNullException(nameof(onDispose));
111  IsGitHubRepository = Origin.Contains(GitHubUrl, StringComparison.InvariantCultureIgnoreCase);
112  if (IsGitHubRepository)
113  {
114  GetRepositoryOwnerName(Origin, out var owner, out var name);
115  GitHubOwner = owner;
116  GitHubRepoName = name;
117  }
118  }
+
readonly IIOManager ioMananger
The IIOManager for the Repository
Definition: Repository.cs:65
+
readonly LibGit2Sharp.IRepository repository
The LibGit2Sharp.IRepository for the Repository
Definition: Repository.cs:60
+
readonly ICredentialsProvider credentialsProvider
The ICredentialsProvider for the Repository
Definition: Repository.cs:75
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the Repository
Definition: Repository.cs:70
+
readonly Action onDispose
Action to be taken when Dispose is called
Definition: Repository.cs:85
+
void GetRepositoryOwnerName(string remote, out string owner, out string name)
Definition: Repository.cs:128
+ + +
const string GitHubUrl
Indication of a GitHub repository
Definition: Repository.cs:22
+ +
readonly ILogger< Repository > logger
The ILogger for the Repository
Definition: Repository.cs:80
+
+

References Tgstation.Server.Host.Components.Repository.Repository.credentialsProvider, Tgstation.Server.Host.Components.Repository.Repository.eventConsumer, Tgstation.Server.Host.Components.Repository.Repository.GetRepositoryOwnerName(), Tgstation.Server.Host.Components.Repository.Repository.GitHubOwner, Tgstation.Server.Host.Components.Repository.Repository.GitHubRepoName, Tgstation.Server.Host.Components.Repository.Repository.GitHubUrl, Tgstation.Server.Host.Components.Repository.Repository.ioMananger, Tgstation.Server.Host.Components.Repository.Repository.IsGitHubRepository, Tgstation.Server.Host.Components.Repository.Repository.logger, Tgstation.Server.Host.Components.Repository.Repository.onDispose, Tgstation.Server.Host.Components.Repository.Repository.Origin, and Tgstation.Server.Host.Components.Repository.Repository.repository.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess(), Tgstation.Server.Host.Components.InstanceFactory.CreateInstance(), and Tgstation.Server.Host.Components.Instance.TimerLoop().

+ +
+
+

Member Function Documentation

+ +

◆ AddTestMerge()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task<bool?> Tgstation.Server.Host.Components.Repository.Repository.AddTestMerge (TestMergeParameters testMergeParameters,
string committerName,
string committerEmail,
string username,
string password,
Action< int > progressReporter,
CancellationToken cancellationToken 
)
+
+ +

Attempt to merge a GitHub pull request into HEAD

+ +

Implements Tgstation.Server.Host.Components.Repository.IRepository.

+ +

Definition at line 194 of file Repository.cs.

+
195  {
196  if (testMergeParameters == null)
197  throw new ArgumentNullException(nameof(testMergeParameters));
198  if (committerName == null)
199  throw new ArgumentNullException(nameof(committerName));
200  if (committerEmail == null)
201  throw new ArgumentNullException(nameof(committerEmail));
202  if (progressReporter == null)
203  throw new ArgumentNullException(nameof(progressReporter));
204 
205  logger.LogDebug("Begin AddTestMerge: #{0} at {1} ({4}) by <{2} ({3})>", testMergeParameters.Number, testMergeParameters.PullRequestRevision?.Substring(0, 7), committerName, committerEmail, testMergeParameters.Comment);
206 
207  if (!IsGitHubRepository)
208  throw new InvalidOperationException("Test merging is only available on GitHub hosted origin repositories!");
209 
210  var commitMessage = String.Format(CultureInfo.InvariantCulture, "Test merge of pull request #{0}{1}{2}", testMergeParameters.Number.Value, testMergeParameters.Comment != null ? Environment.NewLine : String.Empty, testMergeParameters.Comment ?? String.Empty);
211 
212  var prBranchName = String.Format(CultureInfo.InvariantCulture, "pr-{0}", testMergeParameters.Number);
213  var localBranchName = String.Format(CultureInfo.InvariantCulture, "pull/{0}/headrefs/heads/{1}", testMergeParameters.Number, prBranchName);
214 
215  var refSpec = String.Format(CultureInfo.InvariantCulture, "pull/{0}/head:{1}", testMergeParameters.Number, prBranchName);
216  var refSpecList = new List<string> { refSpec };
217  var logMessage = String.Format(CultureInfo.InvariantCulture, "Merge remote pull request #{0}", testMergeParameters.Number);
218 
219  var originalCommit = repository.Head;
220 
221  MergeResult result = null;
222 
223  var sig = new Signature(new Identity(committerName, committerEmail), DateTimeOffset.Now);
224  await Task.Factory.StartNew(() =>
225  {
226  try
227  {
228  try
229  {
230  logger.LogTrace("Fetching refspec {0}...", refSpec);
231 
232  var remote = repository.Network.Remotes.First();
233  progressReporter(0);
234  Commands.Fetch((LibGit2Sharp.Repository)repository, remote.Name, refSpecList, new FetchOptions
235  {
236  Prune = true,
237  OnProgress = (a) => !cancellationToken.IsCancellationRequested,
238  OnTransferProgress = (a) =>
239  {
240  var percentage = 50 * (((float)a.IndexedObjects + a.ReceivedObjects) / (a.TotalObjects * 2));
241  progressReporter((int)percentage);
242  return !cancellationToken.IsCancellationRequested;
243  },
244  OnUpdateTips = (a, b, c) => !cancellationToken.IsCancellationRequested,
245  CredentialsProvider = credentialsProvider.GenerateHandler(username, password)
246  }, logMessage);
247  }
248  catch (UserCancelledException) { }
249 
250  cancellationToken.ThrowIfCancellationRequested();
251 
252  repository.RemoveUntrackedFiles();
253 
254  cancellationToken.ThrowIfCancellationRequested();
255 
256  testMergeParameters.PullRequestRevision = repository.Lookup(testMergeParameters.PullRequestRevision ?? localBranchName).Sha;
257 
258  cancellationToken.ThrowIfCancellationRequested();
259 
260  logger.LogTrace("Merging {0} into {1}...", testMergeParameters.PullRequestRevision.Substring(0, 7), Reference);
261 
262  result = repository.Merge(testMergeParameters.PullRequestRevision, sig, new MergeOptions
263  {
264  CommitOnSuccess = commitMessage == null,
265  FailOnConflict = true,
266  FastForwardStrategy = FastForwardStrategy.NoFastForward,
267  SkipReuc = true,
268  OnCheckoutProgress = (a, completedSteps, totalSteps) => progressReporter(50 + ((int)(((float)completedSteps) / totalSteps * 50)))
269  });
270  }
271  finally
272  {
273  repository.Branches.Remove(localBranchName);
274  }
275 
276  cancellationToken.ThrowIfCancellationRequested();
277 
278  if (result.Status == MergeStatus.Conflicts)
279  {
280  var revertTo = originalCommit.CanonicalName ?? originalCommit.Tip.Sha;
281  logger.LogDebug("Merge conflict, aborting and reverting to {0}", revertTo);
282  RawCheckout(revertTo, progressReporter, cancellationToken);
283  cancellationToken.ThrowIfCancellationRequested();
284  }
285 
286  repository.RemoveUntrackedFiles();
287  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
288 
289  if (result.Status == MergeStatus.Conflicts)
290  {
291  await eventConsumer.HandleEvent(EventType.RepoMergeConflict, new List<string> { originalCommit.Tip.Sha, testMergeParameters.PullRequestRevision, originalCommit.FriendlyName ?? UnknownReference, prBranchName }, cancellationToken).ConfigureAwait(false);
292  return null;
293  }
294 
295  if (commitMessage != null && result.Status != MergeStatus.UpToDate)
296  {
297  logger.LogTrace("Committing merge: \"{0}\"...", commitMessage);
298  await Task.Factory.StartNew(() => repository.Commit(commitMessage, sig, sig, new CommitOptions
299  {
300  PrettifyMessage = true
301  }), cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
302  }
303 
304  await eventConsumer.HandleEvent(EventType.RepoMergePullRequest, new List<string> { testMergeParameters.Number.ToString(), testMergeParameters.PullRequestRevision, testMergeParameters.Comment }, cancellationToken).ConfigureAwait(false);
305 
306  return result.Status != MergeStatus.NonFastForward;
307  }
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+
readonly LibGit2Sharp.IRepository repository
The LibGit2Sharp.IRepository for the Repository
Definition: Repository.cs:60
+
readonly ICredentialsProvider credentialsProvider
The ICredentialsProvider for the Repository
Definition: Repository.cs:75
+ +
readonly IEventConsumer eventConsumer
The IEventConsumer for the Repository
Definition: Repository.cs:70
+
int? Number
The number of the pull request
+
CredentialsHandler GenerateHandler(string username, string password)
Generate a CredentialsHandler from a given username and password
+ +
string Head
The SHA of the IRepository HEAD
Definition: IRepository.cs:36
+
void RawCheckout(string committish, Action< int > progressReporter, CancellationToken cancellationToken)
Runs a blocking force checkout to committish
Definition: Repository.cs:174
+
Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+
string PullRequestRevision
The sha of the pull request revision to merge. If not specified, the latest commit shall be used (sem...
+
string Comment
Optional comment about the test
+
readonly ILogger< Repository > logger
The ILogger for the Repository
Definition: Repository.cs:80
+
+

References Tgstation.Server.Api.Models.TestMergeParameters.Comment, Tgstation.Server.Host.Components.Repository.Repository.credentialsProvider, Tgstation.Server.Host.Components.Repository.ICredentialsProvider.GenerateHandler(), Tgstation.Server.Host.Components.Repository.IRepository.Head, Tgstation.Server.Host.Components.Repository.Repository.IsGitHubRepository, Tgstation.Server.Host.Components.Repository.Repository.logger, Tgstation.Server.Api.Models.TestMergeParameters.Number, Tgstation.Server.Api.Models.TestMergeParameters.PullRequestRevision, Tgstation.Server.Host.Components.Repository.Repository.RawCheckout(), Tgstation.Server.Host.Components.Repository.Repository.Reference, and Tgstation.Server.Host.Components.Repository.Repository.repository.

+ +
+
+ +

◆ CheckoutObject()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Repository.Repository.CheckoutObject (string committish,
Action< int > progressReporter,
CancellationToken cancellationToken 
)
+
+ +

Checks out a given committish

+ +

Implements Tgstation.Server.Host.Components.Repository.IRepository.

+ +

Definition at line 311 of file Repository.cs.

+
312  {
313  if (committish == null)
314  throw new ArgumentNullException(nameof(committish));
315  if (progressReporter == null)
316  throw new ArgumentNullException(nameof(progressReporter));
317  logger.LogDebug("Checkout object: {0}...", committish);
318  await eventConsumer.HandleEvent(EventType.RepoCheckout, new List<string> { committish }, cancellationToken).ConfigureAwait(false);
319  await Task.Factory.StartNew(() =>
320  {
321  repository.RemoveUntrackedFiles();
322  RawCheckout(committish, progressReporter, cancellationToken);
323  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
324  }
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+
readonly LibGit2Sharp.IRepository repository
The LibGit2Sharp.IRepository for the Repository
Definition: Repository.cs:60
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the Repository
Definition: Repository.cs:70
+
void RawCheckout(string committish, Action< int > progressReporter, CancellationToken cancellationToken)
Runs a blocking force checkout to committish
Definition: Repository.cs:174
+
Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+
readonly ILogger< Repository > logger
The ILogger for the Repository
Definition: Repository.cs:80
+
+
+
+ +

◆ CheckoutProgressHandler()

+ +
+
+ + + + + +
+ + + + + + + + +
static CheckoutProgressHandler Tgstation.Server.Host.Components.Repository.Repository.CheckoutProgressHandler (Action< int > progressReporter)
+
+staticprivate
+
+ +

Converts a given progressReporter to a LibGit2Sharp.Handlers.CheckoutProgressHandler

+
Parameters
+ + +
progressReporterAction<T1> to report 0-100 int progress of the operation
+
+
+
Returns
A LibGit2Sharp.Handlers.CheckoutProgressHandler based on progressReporter
+ +

Referenced by Tgstation.Server.Host.Components.Repository.Repository.RawCheckout().

+ +
+
+ +

◆ CopyTo()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Repository.Repository.CopyTo (string path,
CancellationToken cancellationToken 
)
+
+ +

Copies the current working directory to a given path

+ +

Implements Tgstation.Server.Host.Components.Repository.IRepository.

+ +

Definition at line 436 of file Repository.cs.

+
437  {
438  if (path == null)
439  throw new ArgumentNullException(nameof(path));
440  logger.LogTrace("Copying to {0}...", path);
441  await ioMananger.CopyDirectory(".", path, new List<string> { ".git" }, cancellationToken).ConfigureAwait(false);
442  }
Task CopyDirectory(string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)
Copies a directory from src to dest
+
readonly IIOManager ioMananger
The IIOManager for the Repository
Definition: Repository.cs:65
+
readonly ILogger< Repository > logger
The ILogger for the Repository
Definition: Repository.cs:80
+
+
+
+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Repository.Repository.Dispose ()
+
+ +

+ +

Definition at line 121 of file Repository.cs.

+
122  {
123  logger.LogTrace("Disposing...");
124  repository.Dispose();
125  onDispose.Invoke();
126  }
readonly LibGit2Sharp.IRepository repository
The LibGit2Sharp.IRepository for the Repository
Definition: Repository.cs:60
+
readonly Action onDispose
Action to be taken when Dispose is called
Definition: Repository.cs:85
+
readonly ILogger< Repository > logger
The ILogger for the Repository
Definition: Repository.cs:80
+
+

References Tgstation.Server.Host.Components.Repository.Repository.logger, Tgstation.Server.Host.Components.Repository.Repository.onDispose, and Tgstation.Server.Host.Components.Repository.Repository.repository.

+ +
+
+ +

◆ FetchOrigin()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Repository.Repository.FetchOrigin (string username,
string password,
Action< int > progressReporter,
CancellationToken cancellationToken 
)
+
+ +

Fetch commits from the origin repository

+ +

Implements Tgstation.Server.Host.Components.Repository.IRepository.

+ +

Definition at line 327 of file Repository.cs.

+
328  {
329  if (progressReporter == null)
330  throw new ArgumentNullException(nameof(progressReporter));
331  logger.LogDebug("Fetch origin...");
332  await eventConsumer.HandleEvent(EventType.RepoFetch, Array.Empty<string>(), cancellationToken).ConfigureAwait(false);
333  await Task.Factory.StartNew(() =>
334  {
335  var remote = repository.Network.Remotes.First();
336  try
337  {
338  Commands.Fetch((LibGit2Sharp.Repository)repository, remote.Name, remote.FetchRefSpecs.Select(x => x.Specification), new FetchOptions
339  {
340  Prune = true,
341  OnProgress = (a) => !cancellationToken.IsCancellationRequested,
342  OnTransferProgress = (a) =>
343  {
344  var percentage = 100 * (((float)a.IndexedObjects + a.ReceivedObjects) / (a.TotalObjects * 2));
345  progressReporter((int)percentage);
346  return !cancellationToken.IsCancellationRequested;
347  },
348  OnUpdateTips = (a, b, c) => !cancellationToken.IsCancellationRequested,
349  CredentialsProvider = credentialsProvider.GenerateHandler(username, password)
350  }, "Fetch origin commits");
351  }
352  catch (UserCancelledException)
353  {
354  cancellationToken.ThrowIfCancellationRequested();
355  }
356  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
357  }
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+
readonly LibGit2Sharp.IRepository repository
The LibGit2Sharp.IRepository for the Repository
Definition: Repository.cs:60
+
readonly ICredentialsProvider credentialsProvider
The ICredentialsProvider for the Repository
Definition: Repository.cs:75
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the Repository
Definition: Repository.cs:70
+
CredentialsHandler GenerateHandler(string username, string password)
Generate a CredentialsHandler from a given username and password
+
Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+
readonly ILogger< Repository > logger
The ILogger for the Repository
Definition: Repository.cs:80
+
+

References Tgstation.Server.Host.Components.Repository.CredentialsProvider.GenerateHandler().

+ +
+
+ +

◆ GeneratePushOptions()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PushOptions Tgstation.Server.Host.Components.Repository.Repository.GeneratePushOptions (Action< int > progressReporter,
string username,
string password,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Generate a standard set of PushOptions

+
Parameters
+ + + + + +
progressReporterAction<T1> to report 0-100 int progress of the operation
usernameThe username for the credentialsProvider
passwordThe password for the credentialsProvider
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A new set of PushOptions
+ +
+
+ +

◆ GetRepositoryOwnerName()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void Tgstation.Server.Host.Components.Repository.Repository.GetRepositoryOwnerName (string remote,
out string owner,
out string name 
)
+
+private
+
+ +

Definition at line 128 of file Repository.cs.

+
129  {
130  // Assume standard gh format: [(git)|(https)]://github.com/owner/repo(.git)[0-1]
131  // Yes use .git twice in case it was weird
132  var toRemove = new string[] { ".git", "/", ".git" };
133  foreach (string item in toRemove)
134  if (remote.EndsWith(item, StringComparison.OrdinalIgnoreCase))
135  remote = remote.Substring(0, remote.LastIndexOf(item, StringComparison.OrdinalIgnoreCase));
136  var splits = remote.Split('/');
137  name = splits[splits.Length - 1];
138  owner = splits[splits.Length - 2].Split('.')[0];
139 
140  logger.LogTrace("GetRepositoryOwnerName({0}) => {1} / {2}", remote, owner, name);
141  }
readonly ILogger< Repository > logger
The ILogger for the Repository
Definition: Repository.cs:80
+
+

References Tgstation.Server.Host.Components.Repository.Repository.logger.

+ +

Referenced by Tgstation.Server.Host.Components.Repository.Repository.Repository().

+ +
+
+ +

◆ IsSha()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<bool> Tgstation.Server.Host.Components.Repository.Repository.IsSha (string committish,
CancellationToken cancellationToken 
)
+
+ +

Checks if a given committish is a sha

+ +

Implements Tgstation.Server.Host.Components.Repository.IRepository.

+ +
+
+ +

◆ MergeOrigin()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task<bool?> Tgstation.Server.Host.Components.Repository.Repository.MergeOrigin (string committerName,
string committerEmail,
Action< int > progressReporter,
CancellationToken cancellationToken 
)
+
+ +

Requires the current HEAD to be a tracked reference. Merges the reference to what it tracks on the origin repository

+ +

Implements Tgstation.Server.Host.Components.Repository.IRepository.

+ +

Definition at line 445 of file Repository.cs.

+
446  {
447  if (progressReporter == null)
448  throw new ArgumentNullException(nameof(progressReporter));
449 
450  MergeResult result = null;
451  Branch trackedBranch = null;
452 
453  var oldHead = repository.Head;
454  var oldTip = oldHead.Tip;
455 
456  await Task.Factory.StartNew(() =>
457  {
458  if (!Tracking)
459  throw new JobException("Cannot reset to origin while not on a tracked reference!");
460 
461  repository.RemoveUntrackedFiles();
462 
463  cancellationToken.ThrowIfCancellationRequested();
464 
465  trackedBranch = repository.Head.TrackedBranch;
466  logger.LogDebug("Merge origin/{2}: <{0} ({1})>", committerName, committerEmail, trackedBranch.FriendlyName);
467  result = repository.Merge(trackedBranch, new Signature(new Identity(committerName, committerEmail), DateTimeOffset.Now), new MergeOptions
468  {
469  CommitOnSuccess = true,
470  FailOnConflict = true,
471  FastForwardStrategy = FastForwardStrategy.Default,
472  SkipReuc = true,
473  OnCheckoutProgress = CheckoutProgressHandler(progressReporter)
474  });
475 
476  cancellationToken.ThrowIfCancellationRequested();
477 
478  if (result.Status == MergeStatus.Conflicts)
479  {
480  logger.LogDebug("Merge conflict, aborting and reverting to {0}", oldHead.FriendlyName);
481  repository.Reset(ResetMode.Hard, oldTip, new CheckoutOptions
482  {
483  OnCheckoutProgress = CheckoutProgressHandler(progressReporter)
484  });
485  cancellationToken.ThrowIfCancellationRequested();
486  }
487 
488  repository.RemoveUntrackedFiles();
489  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
490 
491  if (result.Status == MergeStatus.Conflicts)
492  {
493  await eventConsumer.HandleEvent(EventType.RepoMergeConflict, new List<string> { oldTip.Sha, trackedBranch.Tip.Sha, oldHead.FriendlyName ?? UnknownReference, trackedBranch.FriendlyName }, cancellationToken).ConfigureAwait(false);
494  return null;
495  }
496 
497  return result.Status == MergeStatus.FastForward;
498  }
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+
readonly LibGit2Sharp.IRepository repository
The LibGit2Sharp.IRepository for the Repository
Definition: Repository.cs:60
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the Repository
Definition: Repository.cs:70
+ +
string Head
The SHA of the IRepository HEAD
Definition: IRepository.cs:36
+
Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+
readonly ILogger< Repository > logger
The ILogger for the Repository
Definition: Repository.cs:80
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+
+
+
+ +

◆ PushHeadToTemporaryBranch()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Repository.Repository.PushHeadToTemporaryBranch (string username,
string password,
Action< int > progressReporter,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Force push the current repository HEAD to RemoteTemporaryBranchName;

+
Parameters
+ + + + + +
usernameThe username to fetch from the origin repository
passwordThe password to fetch from the origin repository
progressReporterAction<T1> to report 0-100 int progress of the operation
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +
+
+ +

◆ RawCheckout()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void Tgstation.Server.Host.Components.Repository.Repository.RawCheckout (string committish,
Action< int > progressReporter,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Runs a blocking force checkout to committish

+
Parameters
+ + + + +
committishThe committish to checkout
progressReporterProgress reporter Action<T>
cancellationTokenThe CancellationToken for the operation
+
+
+ +

Definition at line 174 of file Repository.cs.

+
175  {
176  logger.LogTrace("Checkout: {0}", committish);
177 
178  progressReporter(0);
179  cancellationToken.ThrowIfCancellationRequested();
180 
181  Commands.Checkout(repository, committish, new CheckoutOptions
182  {
183  CheckoutModifiers = CheckoutModifiers.Force,
184  OnCheckoutProgress = CheckoutProgressHandler(progressReporter)
185  });
186 
187  cancellationToken.ThrowIfCancellationRequested();
188 
189  repository.RemoveUntrackedFiles();
190  }
static CheckoutProgressHandler CheckoutProgressHandler(Action< int > progressReporter)
Converts a given progressReporter to a LibGit2Sharp.Handlers.CheckoutProgressHandler
+
readonly LibGit2Sharp.IRepository repository
The LibGit2Sharp.IRepository for the Repository
Definition: Repository.cs:60
+
readonly ILogger< Repository > logger
The ILogger for the Repository
Definition: Repository.cs:80
+
+

References Tgstation.Server.Host.Components.Repository.Repository.CheckoutProgressHandler(), Tgstation.Server.Host.Components.Repository.Repository.logger, and Tgstation.Server.Host.Components.Repository.Repository.repository.

+ +

Referenced by Tgstation.Server.Host.Components.Repository.Repository.AddTestMerge().

+ +
+
+ +

◆ ResetToOrigin()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Repository.Repository.ResetToOrigin (Action< int > progressReporter,
CancellationToken cancellationToken 
)
+
+ +

Requires the current HEAD to be a tracked reference. Hard resets the reference to what it tracks on the origin repository

+ +

Implements Tgstation.Server.Host.Components.Repository.IRepository.

+ +

Definition at line 398 of file Repository.cs.

+
399  {
400  if (progressReporter == null)
401  throw new ArgumentNullException(nameof(progressReporter));
402  if (!Tracking)
403  throw new JobException("Cannot reset to origin while not on a tracked reference!");
404  logger.LogTrace("Reset to origin...");
405  var trackedBranch = repository.Head.TrackedBranch;
406  await eventConsumer.HandleEvent(EventType.RepoResetOrigin, new List<string> { trackedBranch.FriendlyName, trackedBranch.Tip.Sha }, cancellationToken).ConfigureAwait(false);
407  await ResetToSha(trackedBranch.Tip.Sha, progressReporter, cancellationToken).ConfigureAwait(false);
408  }
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+
readonly LibGit2Sharp.IRepository repository
The LibGit2Sharp.IRepository for the Repository
Definition: Repository.cs:60
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the Repository
Definition: Repository.cs:70
+ +
Task ResetToSha(string sha, Action< int > progressReporter, CancellationToken cancellationToken)
Requires the current HEAD to be a reference. Hard resets the reference to the given sha
+
string Head
The SHA of the IRepository HEAD
Definition: IRepository.cs:36
+
Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+
readonly ILogger< Repository > logger
The ILogger for the Repository
Definition: Repository.cs:80
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+
+
+
+ +

◆ ResetToSha()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Repository.Repository.ResetToSha (string sha,
Action< int > progressReporter,
CancellationToken cancellationToken 
)
+
+ +

Requires the current HEAD to be a reference. Hard resets the reference to the given sha

+ +

Implements Tgstation.Server.Host.Components.Repository.IRepository.

+ +
+
+ +

◆ Sychronize()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task<bool> Tgstation.Server.Host.Components.Repository.Repository.Sychronize (string username,
string password,
string committerName,
string committerEmail,
Action< int > progressReporter,
bool synchronizeTrackedBranch,
CancellationToken cancellationToken 
)
+
+ +

Runs the synchronize event script and attempts to push any changes made to the IRepository if on a tracked branch

+ +

Implements Tgstation.Server.Host.Components.Repository.IRepository.

+ +

Definition at line 501 of file Repository.cs.

+
502  {
503  if (committerName == null)
504  throw new ArgumentNullException(nameof(committerName));
505  if (committerEmail == null)
506  throw new ArgumentNullException(nameof(committerEmail));
507  if (progressReporter == null)
508  throw new ArgumentNullException(nameof(progressReporter));
509 
510  if (username == null && password == null)
511  {
512  logger.LogTrace("Not synchronizing due to lack of credentials!");
513  return false;
514  }
515 
516  logger.LogTrace("Begin Synchronize...");
517 
518  if (username == null)
519  throw new ArgumentNullException(nameof(username));
520  if (password == null)
521  throw new ArgumentNullException(nameof(password));
522 
523  var startHead = Head;
524 
525  logger.LogTrace("Configuring <{0} ({1})> as author/committer", committerName, committerEmail);
526  await Task.Factory.StartNew(() =>
527  {
528  repository.Config.Set("user.name", committerName);
529  cancellationToken.ThrowIfCancellationRequested();
530  repository.Config.Set("user.email", committerEmail);
531  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
532 
533  cancellationToken.ThrowIfCancellationRequested();
534  try
535  {
536  if (!await eventConsumer.HandleEvent(EventType.RepoPreSynchronize, new List<string> { ioMananger.ResolvePath(".") }, cancellationToken).ConfigureAwait(false))
537  {
538  logger.LogDebug("Aborted synchronize due to event handler response!");
539  return false;
540  }
541  }
542  finally
543  {
544  logger.LogTrace("Resetting and cleaning untracked files...");
545  await Task.Factory.StartNew(() =>
546  {
547  repository.RemoveUntrackedFiles();
548  cancellationToken.ThrowIfCancellationRequested();
549  repository.Reset(ResetMode.Hard, repository.Head.Tip, new CheckoutOptions
550  {
551  OnCheckoutProgress = CheckoutProgressHandler(progress => progressReporter(progress / 10))
552  });
553  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
554  }
555 
556  void FinalReporter(int progress) => progressReporter((int)(((float)progress) / 100 * 90));
557 
558  if (!synchronizeTrackedBranch)
559  {
560  await PushHeadToTemporaryBranch(username, password, FinalReporter, cancellationToken).ConfigureAwait(false);
561  return false;
562  }
563 
564  var sameHead = Head == startHead;
565  if (sameHead || !Tracking)
566  {
567  logger.LogTrace("Aborted synchronize due to {0}!", sameHead ? "lack of changes" : "not being on tracked reference");
568  return false;
569  }
570 
571  logger.LogInformation("Synchronizing with origin...");
572 
573  return await Task.Factory.StartNew(() =>
574  {
575  var remote = repository.Network.Remotes.First();
576  try
577  {
578  repository.Network.Push(repository.Head, GeneratePushOptions(FinalReporter, username, password, cancellationToken));
579  return true;
580  }
581  catch (NonFastForwardException)
582  {
583  logger.LogInformation("Synchronize aborted, non-fast forward!");
584  return false;
585  }
586  catch (UserCancelledException e)
587  {
588  cancellationToken.ThrowIfCancellationRequested();
589  throw new InvalidOperationException("Caught UserCancelledException without cancellationToken triggering", e);
590  }
591  catch (LibGit2SharpException e)
592  {
593  logger.LogWarning("Unable to make synchronization push! Exception: {0}", e);
594  return false;
595  }
596  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
597  }
Task PushHeadToTemporaryBranch(string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)
Force push the current repository HEAD to RemoteTemporaryBranchName;
+
EventType
Types of events. Mirror in tgs.dm
Definition: EventType.cs:6
+
readonly LibGit2Sharp.IRepository repository
The LibGit2Sharp.IRepository for the Repository
Definition: Repository.cs:60
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the Repository
Definition: Repository.cs:70
+ + +
string Head
The SHA of the IRepository HEAD
Definition: IRepository.cs:36
+
Task< bool > HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
Handle a given eventType
+
readonly ILogger< Repository > logger
The ILogger for the Repository
Definition: Repository.cs:80
+
PushOptions GeneratePushOptions(Action< int > progressReporter, string username, string password, CancellationToken cancellationToken)
Generate a standard set of PushOptions
+
+
+
+

Member Data Documentation

+ +

◆ credentialsProvider

+ +
+
+ + + + + +
+ + + + +
readonly ICredentialsProvider Tgstation.Server.Host.Components.Repository.Repository.credentialsProvider
+
+private
+
+
+ +

◆ eventConsumer

+ +
+
+ + + + + +
+ + + + +
readonly IEventConsumer Tgstation.Server.Host.Components.Repository.Repository.eventConsumer
+
+private
+
+ +

The IEventConsumer for the Repository

+ +

Definition at line 70 of file Repository.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Repository.Repository.Repository().

+ +
+
+ +

◆ GitHubUrl

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Repository.Repository.GitHubUrl = "://github.com/"
+
+ +

Indication of a GitHub repository

+ +

Definition at line 22 of file Repository.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Repository.Repository.Repository().

+ +
+
+ +

◆ Head

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Repository.Repository.Head => repository.Head.Tip.Sha
+
+ +

+ +

Definition at line 49 of file Repository.cs.

+ +
+
+ +

◆ ioMananger

+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.Repository.Repository.ioMananger
+
+private
+
+ +

The IIOManager for the Repository

+ +

Definition at line 65 of file Repository.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Repository.Repository.Repository().

+ +
+
+ +

◆ logger

+ + + +

◆ onDispose

+ +
+
+ + + + + +
+ + + + +
readonly Action Tgstation.Server.Host.Components.Repository.Repository.onDispose
+
+private
+
+
+ +

◆ Origin

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Repository.Repository.Origin => repository.Network.Remotes.First().Url
+
+ +

+ +

Definition at line 55 of file Repository.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Repository.Repository.Repository().

+ +
+
+ +

◆ OriginTrackingErrorTemplate

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Repository.Repository.OriginTrackingErrorTemplate = "Unable to determine most recent origin commit of {0}. Marking it as an origin commit. This may result in invalid git metadata until the next hard reset to an origin reference."
+
+ +

Template error message for when tracking of the most recent origin commit fails

+ +

Definition at line 27 of file Repository.cs.

+ +
+
+ +

◆ Reference

+ +
+
+ + + + +
string Tgstation.Server.Host.Components.Repository.Repository.Reference => repository.Head.FriendlyName
+
+ +

+ +

Definition at line 52 of file Repository.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Repository.Repository.AddTestMerge().

+ +
+
+ +

◆ RemoteTemporaryBranchName

+ +
+
+ + + + +
const string Tgstation.Server.Host.Components.Repository.Repository.RemoteTemporaryBranchName = "___TGSTempBranch"
+
+ +

The branch name used for publishing testmerge commits

+ +

Definition at line 32 of file Repository.cs.

+ +
+
+ +

◆ repository

+ +
+
+ + + + + +
+ + + + +
readonly LibGit2Sharp.IRepository Tgstation.Server.Host.Components.Repository.Repository.repository
+
+private
+
+
+ +

◆ Tracking

+ +
+
+ + + + +
bool Tgstation.Server.Host.Components.Repository.Repository.Tracking => Reference != null && repository.Head.IsTracking
+
+ +

+ +

Definition at line 46 of file Repository.cs.

+ +
+
+ +

◆ UnknownReference

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.Repository.Repository.UnknownReference = "<UNKNOWN>"
+
+private
+
+ +

Definition at line 34 of file Repository.cs.

+ +
+
+

Property Documentation

+ +

◆ GitHubOwner

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Repository.Repository.GitHubOwner
+
+get
+
+ +

+ +

Definition at line 40 of file Repository.cs.

+
40 { get; }
+

Referenced by Tgstation.Server.Host.Components.Repository.Repository.Repository().

+ +
+
+ +

◆ GitHubRepoName

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Repository.Repository.GitHubRepoName
+
+get
+
+ +

+ +

Definition at line 43 of file Repository.cs.

+
43 { get; }
+

Referenced by Tgstation.Server.Host.Components.Repository.Repository.Repository().

+ +
+
+ +

◆ IsGitHubRepository

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Repository.Repository.IsGitHubRepository
+
+get
+
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Host/Components/Repository/Repository.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.png new file mode 100644 index 0000000000000000000000000000000000000000..2bff1ed243190bc1ccd301826437a33d685de3b0 GIT binary patch literal 1531 zcmb`HX;70_6o$WmvC05JQ4}ErhOh-3K`aa+L=XlN_7EsS6`?_lYzi@!U6Hay3xs^2 zAO;~H7{~$|q_Rm%pcT}SuvOWrP?eT|fk+~nq_H!0+Wz*=oO|E*oilUJk7sUiaG;Nl z)*dYY0CaG^UIYMusS7CDqN%>~o>rKupWVU!L~oT!rIxRk-kvM{sZ6c@uD-rLc=0q! zZMRSefuVr9>Ejt6BJKwOcnQwSgZM2>TsuN;q$6T*9cMV^& z_8c`ie4O1L9-6>C8f@{vm!KPt!LcLQXebtS(`#R#^$C!HR_dw%TICKdT*@3yDnNHcmv|sl(IDS;n818~C(swP?Sh zVhnt{PHj)0Fww3>lS|o8?@Cft8K$_K`N^&+W;Tre^JD~8dxR@$3kk;HG)p%oiPvqj z&C6K9^`fd5*KHN{!aAvwhm7|Akeg+~JI8T%rTYzCT4E>DXt4Q~!0pt?{6f3g%e!k4 zXBU*ofoEDM{C-LrKdNxqan`zLcWetKkiQQT={H&TsE_V3DmXdOoF_6PU9FBQA{$JS z9xppx)OGcRY^N?e4kc?{4zt`Ubfwk^Gzm)X-SUCLteyZxkeU?wsQNb zuez9mOjlv};`-}y*4%>1+AU$7S`-65rX8jCUR2df1>;j@>rTCBLtJP6N8105|4;y# z+g=@+5TNl}${WoS!0lGT1^=9!r5&c*Y~jBwoE!^;t*RrE-44^8ws7A8JWP%01tRCO zTJU~@fI;xLfk+-|wq5>5t{r}g4Clo4^c)j+pDei{r4L$E7 zNlRNOiRafjEx7>$_e9Pbu$x}cz5$nzjTn_1)Zx+@J>B$&L-a6{y)KbSC=sN+vtwwY zHzf9;nOO0496D-$E-{y#Ps@w4$V4{QWX>FBu zjr1JMf2KET$9r&nCP@QHy&wXU1`QQ5khhiBpJ-kf2WONkowB%yf+D=E@X*FqT6fT? z4~7ik0jxNeBhVi|U~E$xpZ16)&hI@P5Au$5^C?$rS|wd0GU`JfoujnE2RSR1?u*Ml zpzB9D8kW)Bpj(|di{bFX`kNH|96tosP4TCWk!mUGU{-(Ssz|9?h|1td@hU4TWoq5s zJFzaC=QnS)%0ZF2S~MGDrWmI^7T3!*S&InzU@=jlpPAm4G>BS9F_Nb>KDeV^uAY`P zP + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Repository.RepositoryManager Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Repository.RepositoryManager, including all inherited members.

+ + + + + + + + + + + + + + + +
CloneInProgressTgstation.Server.Host.Components.Repository.RepositoryManager
CloneRepository(Uri url, string initialBranch, string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.RepositoryManager
credentialsProviderTgstation.Server.Host.Components.Repository.RepositoryManagerprivate
DeleteRepository(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.RepositoryManager
Dispose()Tgstation.Server.Host.Components.Repository.RepositoryManager
eventConsumerTgstation.Server.Host.Components.Repository.RepositoryManagerprivate
InUseTgstation.Server.Host.Components.Repository.RepositoryManager
ioManagerTgstation.Server.Host.Components.Repository.RepositoryManagerprivate
LoadRepository(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.RepositoryManager
loggerTgstation.Server.Host.Components.Repository.RepositoryManagerprivate
repositoryLoggerTgstation.Server.Host.Components.Repository.RepositoryManagerprivate
RepositoryManager(RepositorySettings repositorySettings, IIOManager ioManager, IEventConsumer eventConsumer, ICredentialsProvider credentialsProvider, ILogger< Repository > repositoryLogger, ILogger< RepositoryManager > logger)Tgstation.Server.Host.Components.Repository.RepositoryManager
repositorySettingsTgstation.Server.Host.Components.Repository.RepositoryManagerprivate
semaphoreTgstation.Server.Host.Components.Repository.RepositoryManagerprivate
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html new file mode 100644 index 0000000000..dd9ab00f9d --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html @@ -0,0 +1,656 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Repository.RepositoryManager Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Repository.RepositoryManager Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Repository.RepositoryManager:
+
+
+ + +Tgstation.Server.Host.Components.Repository.IRepositoryManager +IDisposable + +
+ + + + + + + + + + + + + + + + +

+Public Member Functions

 RepositoryManager (RepositorySettings repositorySettings, IIOManager ioManager, IEventConsumer eventConsumer, ICredentialsProvider credentialsProvider, ILogger< Repository > repositoryLogger, ILogger< RepositoryManager > logger)
 Construct a RepositoryManager More...
 
void Dispose ()
 
async Task< IRepositoryCloneRepository (Uri url, string initialBranch, string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)
 Clone the repository at url More...
 
async Task< IRepositoryLoadRepository (CancellationToken cancellationToken)
 Attempt to load the IRepository from the default location More...
 
async Task DeleteRepository (CancellationToken cancellationToken)
 Delete the current repository More...
 
+ + + +

+Public Attributes

bool InUse => semaphore.CurrentCount == 0
 
+ + + + + + + + + + +

+Properties

bool CloneInProgress [get, private set]
 
- Properties inherited from Tgstation.Server.Host.Components.Repository.IRepositoryManager
bool InUse [get]
 If something is holding a lock on the repository More...
 
bool CloneInProgress [get]
 If a CloneRepository(Uri, string, string, string, Action<int>, CancellationToken) operation is in progress More...
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

readonly IIOManager ioManager
 The IIOManager for the RepositoryManager More...
 
readonly IEventConsumer eventConsumer
 The IEventConsumer for the RepositoryManager More...
 
readonly ICredentialsProvider credentialsProvider
 The ICredentialsProvider for the RepositoryManager More...
 
readonly ILogger< RepositoryrepositoryLogger
 The ILogger created Repositorys More...
 
readonly ILogger< RepositoryManagerlogger
 The ILogger for the RepositoryManager More...
 
readonly RepositorySettings repositorySettings
 The RepositorySettings for the RepositoryManager More...
 
readonly SemaphoreSlim semaphore
 Used for controlling single access to the IRepository More...
 
+

Detailed Description

+
+

Definition at line 13 of file RepositoryManager.cs.

+

Constructor & Destructor Documentation

+ +

◆ RepositoryManager()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Repository.RepositoryManager.RepositoryManager (RepositorySettings repositorySettings,
IIOManager ioManager,
IEventConsumer eventConsumer,
ICredentialsProvider credentialsProvider,
ILogger< RepositoryrepositoryLogger,
ILogger< RepositoryManagerlogger 
)
+
+ +

Construct a RepositoryManager

+
Parameters
+ + + + + + + +
repositorySettingsThe value of repositorySettings
ioManagerThe value of ioManager
eventConsumerThe value of eventConsumer
credentialsProviderThe value of credentialsProvider
repositoryLoggerThe value of repositoryLogger
loggerThe value of logger
+
+
+ +

Definition at line 65 of file RepositoryManager.cs.

+
66  {
67  this.repositorySettings = repositorySettings ?? throw new ArgumentNullException(nameof(repositorySettings));
68  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
69  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
70  this.credentialsProvider = credentialsProvider ?? throw new ArgumentNullException(nameof(credentialsProvider));
71  this.repositoryLogger = repositoryLogger ?? throw new ArgumentNullException(nameof(repositoryLogger));
72  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
73  semaphore = new SemaphoreSlim(1);
74  }
readonly ILogger< RepositoryManager > logger
The ILogger for the RepositoryManager
+
readonly ILogger< Repository > repositoryLogger
The ILogger created Repositorys
+
readonly SemaphoreSlim semaphore
Used for controlling single access to the IRepository
+
readonly ICredentialsProvider credentialsProvider
The ICredentialsProvider for the RepositoryManager
+
readonly IIOManager ioManager
The IIOManager for the RepositoryManager
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the RepositoryManager
+
readonly RepositorySettings repositorySettings
The RepositorySettings for the RepositoryManager
+
+

References Tgstation.Server.Host.Components.Repository.RepositoryManager.credentialsProvider, Tgstation.Server.Host.Components.Repository.RepositoryManager.eventConsumer, Tgstation.Server.Host.Components.Repository.RepositoryManager.ioManager, Tgstation.Server.Host.Components.Repository.RepositoryManager.logger, Tgstation.Server.Host.Components.Repository.RepositoryManager.repositoryLogger, Tgstation.Server.Host.Components.Repository.RepositoryManager.repositorySettings, and Tgstation.Server.Host.Components.Repository.RepositoryManager.semaphore.

+ +
+
+

Member Function Documentation

+ +

◆ CloneRepository()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task<IRepository> Tgstation.Server.Host.Components.Repository.RepositoryManager.CloneRepository (Uri url,
string initialBranch,
string username,
string password,
Action< int > progressReporter,
CancellationToken cancellationToken 
)
+
+ +

Clone the repository at url

+ +

Implements Tgstation.Server.Host.Components.Repository.IRepositoryManager.

+ +

Definition at line 84 of file RepositoryManager.cs.

+
85  {
86  if (url == null)
87  throw new ArgumentNullException(nameof(url));
88  if (progressReporter == null)
89  throw new ArgumentNullException(nameof(progressReporter));
90 
91  logger.LogInformation("Begin clone {0} (Branch: {1})", url, initialBranch);
92  lock (this)
93  {
94  if (CloneInProgress)
95  throw new InvalidOperationException("The repository is already being cloned!");
96  CloneInProgress = true;
97  }
98 
99  try
100  {
101  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
102  {
103  logger.LogTrace("Semaphore acquired");
104  if (!await ioManager.DirectoryExists(".", cancellationToken).ConfigureAwait(false))
105  try
106  {
107  await Task.Factory.StartNew(() =>
108  {
109  string path = null;
110  try
111  {
112  path = LibGit2Sharp.Repository.Clone(url.ToString(), ioManager.ResolvePath("."), new CloneOptions
113  {
114  OnProgress = (a) => !cancellationToken.IsCancellationRequested,
115  OnTransferProgress = (a) =>
116  {
117  var percentage = 100 * (((float)a.IndexedObjects + a.ReceivedObjects) / (a.TotalObjects * 2));
118  progressReporter((int)percentage);
119  return !cancellationToken.IsCancellationRequested;
120  },
121  RecurseSubmodules = true,
122  OnUpdateTips = (a, b, c) => !cancellationToken.IsCancellationRequested,
123  RepositoryOperationStarting = (a) => !cancellationToken.IsCancellationRequested,
124  BranchName = initialBranch,
125  CredentialsProvider = credentialsProvider.GenerateHandler(username, password)
126  });
127  }
128  catch (UserCancelledException) { }
129  cancellationToken.ThrowIfCancellationRequested();
130  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
131  }
132  catch
133  {
134  try
135  {
136  logger.LogTrace("Deleting partially cloned repository...");
137  await ioManager.DeleteDirectory(".", default).ConfigureAwait(false);
138  }
139  catch (Exception e)
140  {
141  logger.LogDebug("Error deleting partially cloned repository! Exception: {0}", e);
142  }
143 
144  throw;
145  }
146  else
147  {
148  logger.LogDebug("Repository exists, clone aborted!");
149  return null;
150  }
151  }
152 
153  logger.LogInformation("Clone complete!");
154  }
155  finally
156  {
157  CloneInProgress = false;
158  }
159 
160  return await LoadRepository(cancellationToken).ConfigureAwait(false);
161  }
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
readonly ILogger< RepositoryManager > logger
The ILogger for the RepositoryManager
+
readonly SemaphoreSlim semaphore
Used for controlling single access to the IRepository
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
CredentialsHandler GenerateHandler(string username, string password)
Generate a CredentialsHandler from a given username and password
+
readonly ICredentialsProvider credentialsProvider
The ICredentialsProvider for the RepositoryManager
+
readonly IIOManager ioManager
The IIOManager for the RepositoryManager
+ +
async Task< IRepository > LoadRepository(CancellationToken cancellationToken)
Attempt to load the IRepository from the default location
+
Task< bool > DirectoryExists(string path, CancellationToken cancellationToken)
Check that the directory at path exists
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+

References Tgstation.Server.Host.Components.Repository.RepositoryManager.CloneInProgress, Tgstation.Server.Host.Components.Repository.RepositoryManager.credentialsProvider, Tgstation.Server.Host.IO.IIOManager.DeleteDirectory(), Tgstation.Server.Host.IO.IIOManager.DirectoryExists(), Tgstation.Server.Host.Components.Repository.ICredentialsProvider.GenerateHandler(), Tgstation.Server.Host.Components.Repository.RepositoryManager.ioManager, Tgstation.Server.Host.Components.Repository.RepositoryManager.LoadRepository(), Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), Tgstation.Server.Host.Components.Repository.RepositoryManager.logger, Tgstation.Server.Host.IO.IIOManager.ResolvePath(), and Tgstation.Server.Host.Components.Repository.RepositoryManager.semaphore.

+ +
+
+ +

◆ DeleteRepository()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Repository.RepositoryManager.DeleteRepository (CancellationToken cancellationToken)
+
+ +

Delete the current repository

+ +

Implements Tgstation.Server.Host.Components.Repository.IRepositoryManager.

+ +

Definition at line 204 of file RepositoryManager.cs.

+
205  {
206  logger.LogInformation("Deleting repository...");
207  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
208  {
209  logger.LogTrace("Semaphore acquired, deleting Repository directory...");
210  await ioManager.DeleteDirectory(".", cancellationToken).ConfigureAwait(false);
211  }
212  }
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
readonly ILogger< RepositoryManager > logger
The ILogger for the RepositoryManager
+
readonly SemaphoreSlim semaphore
Used for controlling single access to the IRepository
+
readonly IIOManager ioManager
The IIOManager for the RepositoryManager
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+

References Tgstation.Server.Host.IO.IIOManager.DeleteDirectory(), Tgstation.Server.Host.Components.Repository.RepositoryManager.ioManager, Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), Tgstation.Server.Host.Components.Repository.RepositoryManager.logger, and Tgstation.Server.Host.Components.Repository.RepositoryManager.semaphore.

+ +
+
+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Repository.RepositoryManager.Dispose ()
+
+ +

+ +

Definition at line 77 of file RepositoryManager.cs.

+
78  {
79  logger.LogTrace("Disposing...");
80  semaphore.Dispose();
81  }
readonly ILogger< RepositoryManager > logger
The ILogger for the RepositoryManager
+
readonly SemaphoreSlim semaphore
Used for controlling single access to the IRepository
+
+

References Tgstation.Server.Host.Components.Repository.RepositoryManager.logger, and Tgstation.Server.Host.Components.Repository.RepositoryManager.semaphore.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.Dispose().

+ +
+
+ +

◆ LoadRepository()

+ +
+
+ + + + + + + + +
async Task<IRepository> Tgstation.Server.Host.Components.Repository.RepositoryManager.LoadRepository (CancellationToken cancellationToken)
+
+ +

Attempt to load the IRepository from the default location

+ +

Implements Tgstation.Server.Host.Components.Repository.IRepositoryManager.

+ +

Definition at line 164 of file RepositoryManager.cs.

+
165  {
166  logger.LogTrace("Begin LoadRepository...");
167  lock (this)
168  if (CloneInProgress)
169  throw new InvalidOperationException("The repository is being cloned!");
170  await semaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
171  LibGit2Sharp.Repository repo = null;
172  await Task.Factory.StartNew(() =>
173  {
174  try
175  {
176  logger.LogTrace("Creating LibGit2Sharp.Repository...");
177  repo = new LibGit2Sharp.Repository(ioManager.ResolvePath("."));
178  }
179  catch (RepositoryNotFoundException e)
180  {
181  logger.LogDebug("Repository not found!");
182  logger.LogTrace("Exception: {0}", e);
183  }
184  catch
185  {
186  semaphore.Release();
187  throw;
188  }
189  }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
190  if (repo == null)
191  {
192  semaphore.Release();
193  return null;
194  }
195 
197  {
198  logger.LogTrace("Releasing semaphore due to Repository disposal...");
199  semaphore.Release();
200  });
201  }
readonly ILogger< RepositoryManager > logger
The ILogger for the RepositoryManager
+
readonly ILogger< Repository > repositoryLogger
The ILogger created Repositorys
+
readonly SemaphoreSlim semaphore
Used for controlling single access to the IRepository
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
readonly ICredentialsProvider credentialsProvider
The ICredentialsProvider for the RepositoryManager
+
readonly IIOManager ioManager
The IIOManager for the RepositoryManager
+ + +
readonly IEventConsumer eventConsumer
The IEventConsumer for the RepositoryManager
+
+

References Tgstation.Server.Host.Components.Repository.RepositoryManager.CloneInProgress, Tgstation.Server.Host.Components.Repository.RepositoryManager.credentialsProvider, Tgstation.Server.Host.Components.Repository.RepositoryManager.eventConsumer, Tgstation.Server.Host.Components.Repository.RepositoryManager.ioManager, Tgstation.Server.Host.Components.Repository.RepositoryManager.logger, Tgstation.Server.Host.Components.Repository.RepositoryManager.repositoryLogger, Tgstation.Server.Host.IO.IIOManager.ResolvePath(), and Tgstation.Server.Host.Components.Repository.RepositoryManager.semaphore.

+ +

Referenced by Tgstation.Server.Host.Components.Repository.RepositoryManager.CloneRepository(), Tgstation.Server.Host.Components.Instance.CompileProcess(), and Tgstation.Server.Host.Components.Instance.TimerLoop().

+ +
+
+

Member Data Documentation

+ +

◆ credentialsProvider

+ +
+
+ + + + + +
+ + + + +
readonly ICredentialsProvider Tgstation.Server.Host.Components.Repository.RepositoryManager.credentialsProvider
+
+private
+
+
+ +

◆ eventConsumer

+ +
+
+ + + + + +
+ + + + +
readonly IEventConsumer Tgstation.Server.Host.Components.Repository.RepositoryManager.eventConsumer
+
+private
+
+
+ +

◆ InUse

+ +
+
+ + + + +
bool Tgstation.Server.Host.Components.Repository.RepositoryManager.InUse => semaphore.CurrentCount == 0
+
+ +

+ +

Definition at line 16 of file RepositoryManager.cs.

+ +
+
+ +

◆ ioManager

+ + + +

◆ logger

+ + + +

◆ repositoryLogger

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<Repository> Tgstation.Server.Host.Components.Repository.RepositoryManager.repositoryLogger
+
+private
+
+
+ +

◆ repositorySettings

+ +
+
+ + + + + +
+ + + + +
readonly RepositorySettings Tgstation.Server.Host.Components.Repository.RepositoryManager.repositorySettings
+
+private
+
+ +

The RepositorySettings for the RepositoryManager

+ +

Definition at line 49 of file RepositoryManager.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Repository.RepositoryManager.RepositoryManager().

+ +
+
+ +

◆ semaphore

+ + +

Property Documentation

+ +

◆ CloneInProgress

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Repository.RepositoryManager.CloneInProgress
+
+getprivate set
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..13087c830b9171a66c786720d1526af3540ba501 GIT binary patch literal 1694 zcmb`Ie>Br;9LK+Ml6X8PWPVs&%Mt%pXYf$=kxjF`Fx(&=XrAW zdpPUstNt44ys0)7ld8yE~2jj=~ zX>wuUSvST#eD7pn=eE5dXeOU8?^MUWG9PuWj>2E{zdkUOi)yG#eNqXJc~Y~nbHO%8 zF)i7Wq`TP-&`eIC2h93nF8f_F0n{A&wI>OftP@!FkIfQ|m^;H7jX ztOvWaFHJkE)HVR@jZi?@%*;R)mG-FpcdjB}$%!5M0)x!iz9o43!t#&w8R11*M0tlGZ?;ofPE=(74&kJCr$SO`8_%I7 zSK?yKO#8w9U|CsZmnSD*LEi%^vh8v0Ix0~cf#0U&DUaCt+zM`)RXt@9tJ(#1vjrnz zkqf*%C0kXa6rUHI7{wu0c=jhNN7G9G!*9aeD@d;&5RxCc_OJ(D`v#b%JXV+xh&3I* zg+x{~Cz`hxDJb?M(;%k&a-$TK1{88yT7953(`veb=aU`V3z3fEMF0KX?Lf;aV-Ayn z229>AS_{NrA;4a#T($~0g+Ta7hRxCed=L!rgTViQ;lD9He_K=sxz<9RL%QHDU|`>O z?J$O#4Ap1CHI30B{&Q>73?myGlmV$b4T5r4ZcET>WxnT@nX>&}rQ{`T{FIrW@`og_ zbn3Zibvod6h0YpUL$TkK@2P={xx1AL&YWJ; zuYTkemE6c5dl-MrFR1ixcN*_Rw3Sz%m7{~O!FIJH@nNe7b;Sl^!tu5m6|Zm4v_(h- z7!mc+>x!$*S%;b*(=TfWRlD38;>x*smj*N2&RH|VH&{hpDq)#WlKz27ND^AUGLTwp zbF1&V`(PWPSX#y}p^Iawrvlvjw>}3$b5+)~?cyA=*ipi|18MGkhD4mJ*LgV(wJ`~1 z=j~#=6n&es!((1b4XW zaO|OqZmof?cAjASsb0lc0&u4`Bpe}83pbNTk7(q|)8Whf4=PcEKcHCIHMkh0qB(`tZRr`QDtwLgX_6NP9h;t`UMV{sgcj8TtSK literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration-members.html new file mode 100644 index 0000000000..e12ec7c572 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration-members.html @@ -0,0 +1,115 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.StaticFiles.Configuration Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.StaticFiles.Configuration, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeModificationsHeadFileTgstation.Server.Host.Components.StaticFiles.Configurationprivate
CodeModificationsSubdirectoryTgstation.Server.Host.Components.StaticFiles.Configurationprivate
CodeModificationsTailFileTgstation.Server.Host.Components.StaticFiles.Configurationprivate
Configuration(IIOManager ioManager, ISynchronousIOManager synchronousIOManager, ISymlinkFactory symlinkFactory, IProcessExecutor processExecutor, IPostWriteHandler postWriteHandler, IPlatformIdentifier platformIdentifier, ILogger< Configuration > logger)Tgstation.Server.Host.Components.StaticFiles.Configuration
CopyDMFilesTo(string dmeFile, string destination, CancellationToken cancellationToken)Tgstation.Server.Host.Components.StaticFiles.Configuration
CreateDirectory(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)Tgstation.Server.Host.Components.StaticFiles.Configuration
DeleteDirectory(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)Tgstation.Server.Host.Components.StaticFiles.Configuration
Dispose()Tgstation.Server.Host.Components.StaticFiles.Configuration
EnsureDirectories(CancellationToken cancellationToken)Tgstation.Server.Host.Components.StaticFiles.Configurationprivate
EventScriptsSubdirectoryTgstation.Server.Host.Components.StaticFiles.Configurationprivate
EventTypeScriptFileNameMapTgstation.Server.Host.Components.StaticFiles.Configurationprivatestatic
GameStaticFilesSubdirectoryTgstation.Server.Host.Components.StaticFiles.Configurationprivate
HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)Tgstation.Server.Host.Components.StaticFiles.Configuration
ioManagerTgstation.Server.Host.Components.StaticFiles.Configurationprivate
ListDirectory(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)Tgstation.Server.Host.Components.StaticFiles.Configuration
loggerTgstation.Server.Host.Components.StaticFiles.Configurationprivate
platformIdentifierTgstation.Server.Host.Components.StaticFiles.Configurationprivate
postWriteHandlerTgstation.Server.Host.Components.StaticFiles.Configurationprivate
processExecutorTgstation.Server.Host.Components.StaticFiles.Configurationprivate
Read(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)Tgstation.Server.Host.Components.StaticFiles.Configuration
semaphoreTgstation.Server.Host.Components.StaticFiles.Configurationprivate
StartAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.StaticFiles.Configuration
StaticIgnoreFileTgstation.Server.Host.Components.StaticFiles.Configurationprivate
StaticIgnorePath()Tgstation.Server.Host.Components.StaticFiles.Configurationprivate
StopAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.StaticFiles.Configuration
symlinkFactoryTgstation.Server.Host.Components.StaticFiles.Configurationprivate
SymlinkStaticFilesTo(string destination, CancellationToken cancellationToken)Tgstation.Server.Host.Components.StaticFiles.Configuration
synchronousIOManagerTgstation.Server.Host.Components.StaticFiles.Configurationprivate
ValidateConfigRelativePath(string configurationRelativePath)Tgstation.Server.Host.Components.StaticFiles.Configurationprivate
Write(string configurationRelativePath, ISystemIdentity systemIdentity, byte[] data, string previousHash, CancellationToken cancellationToken)Tgstation.Server.Host.Components.StaticFiles.Configuration
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html new file mode 100644 index 0000000000..f694b98ee4 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html @@ -0,0 +1,1308 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.StaticFiles.Configuration Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.StaticFiles.Configuration Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.StaticFiles.Configuration:
+
+
+ + +Tgstation.Server.Host.Components.StaticFiles.IConfiguration +IHostedService +Tgstation.Server.Host.Components.IEventConsumer +IDisposable + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 Configuration (IIOManager ioManager, ISynchronousIOManager synchronousIOManager, ISymlinkFactory symlinkFactory, IProcessExecutor processExecutor, IPostWriteHandler postWriteHandler, IPlatformIdentifier platformIdentifier, ILogger< Configuration > logger)
 Construct Configuration More...
 
void Dispose ()
 
async Task< ServerSideModificationsCopyDMFilesTo (string dmeFile, string destination, CancellationToken cancellationToken)
 Copies all files in the CodeModifications directory to destination More...
 
async Task< IReadOnlyList< ConfigurationFile > > ListDirectory (string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
 Get ConfigurationFile for all items in a given configurationRelativePath More...
 
async Task< ConfigurationFileRead (string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
 Reads a given configurationRelativePath More...
 
async Task SymlinkStaticFilesTo (string destination, CancellationToken cancellationToken)
 Symlinks all directories in the GameData directory to destination More...
 
async Task< ConfigurationFileWrite (string configurationRelativePath, ISystemIdentity systemIdentity, byte[] data, string previousHash, CancellationToken cancellationToken)
 Writes to a given configurationRelativePath More...
 
async Task< bool > CreateDirectory (string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
 Create an empty directory at configurationRelativePath More...
 
Task StartAsync (CancellationToken cancellationToken)
 
Task StopAsync (CancellationToken cancellationToken)
 
async Task< bool > HandleEvent (EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
 Handle a given eventType More...
 
async Task< bool > DeleteDirectory (string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
 Attempt to delete an empty directory at configurationRelativePath More...
 
+ + + + + + + + + +

+Private Member Functions

string StaticIgnorePath ()
 Get the proper path to StaticIgnoreFile More...
 
async Task EnsureDirectories (CancellationToken cancellationToken)
 Ensures standard configuration directories exist More...
 
string ValidateConfigRelativePath (string configurationRelativePath)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

const string CodeModificationsSubdirectory = "CodeModifications"
 
const string EventScriptsSubdirectory = "EventScripts"
 
const string GameStaticFilesSubdirectory = "GameStaticFiles"
 
const string StaticIgnoreFile = ".tgsignore"
 Name of the ignore file in GameStaticFilesSubdirectory More...
 
const string CodeModificationsHeadFile = "HeadInclude.dm"
 
const string CodeModificationsTailFile = "TailInclude.dm"
 
readonly IIOManager ioManager
 The IIOManager for Configuration More...
 
readonly ISynchronousIOManager synchronousIOManager
 The ISynchronousIOManager for Configuration More...
 
readonly ISymlinkFactory symlinkFactory
 The ISymlinkFactory for Configuration More...
 
readonly IProcessExecutor processExecutor
 The IProcessExecutor for Configuration More...
 
readonly IPostWriteHandler postWriteHandler
 The IPostWriteHandler for Configuration More...
 
readonly IPlatformIdentifier platformIdentifier
 The IPlatformIdentifier for Configuration More...
 
readonly ILogger< Configurationlogger
 The ILogger for Configuration More...
 
readonly SemaphoreSlim semaphore
 The SemaphoreSlim for Configuration More...
 
+ + + +

+Static Private Attributes

static readonly IReadOnlyDictionary< EventType, string > EventTypeScriptFileNameMap
 
+

Detailed Description

+
+

Definition at line 19 of file Configuration.cs.

+

Constructor & Destructor Documentation

+ +

◆ Configuration()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.StaticFiles.Configuration.Configuration (IIOManager ioManager,
ISynchronousIOManager synchronousIOManager,
ISymlinkFactory symlinkFactory,
IProcessExecutor processExecutor,
IPostWriteHandler postWriteHandler,
IPlatformIdentifier platformIdentifier,
ILogger< Configurationlogger 
)
+
+ +

Construct Configuration

+
Parameters
+ + + + + + + + +
ioManagerThe value of ioManager
synchronousIOManagerThe value of synchronousIOManager
symlinkFactoryThe value of symlinkFactory
processExecutorThe value of processExecutor
postWriteHandlerThe value of postWriteHandler
platformIdentifierThe value of platformIdentifier
loggerThe value of logger
+
+
+ +

Definition at line 90 of file Configuration.cs.

+
91  {
92  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
93  this.synchronousIOManager = synchronousIOManager ?? throw new ArgumentNullException(nameof(synchronousIOManager));
94  this.symlinkFactory = symlinkFactory ?? throw new ArgumentNullException(nameof(symlinkFactory));
95  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
96  this.postWriteHandler = postWriteHandler ?? throw new ArgumentNullException(nameof(postWriteHandler));
97  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
98  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
99 
100  semaphore = new SemaphoreSlim(1);
101  }
readonly ISynchronousIOManager synchronousIOManager
The ISynchronousIOManager for Configuration
+
readonly IProcessExecutor processExecutor
The IProcessExecutor for Configuration
+
readonly ILogger< Configuration > logger
The ILogger for Configuration
+
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for Configuration
+
readonly ISymlinkFactory symlinkFactory
The ISymlinkFactory for Configuration
+
readonly IIOManager ioManager
The IIOManager for Configuration
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for Configuration
+
readonly IPostWriteHandler postWriteHandler
The IPostWriteHandler for Configuration
+
+

References Tgstation.Server.Host.Components.StaticFiles.Configuration.ioManager, Tgstation.Server.Host.Components.StaticFiles.Configuration.logger, Tgstation.Server.Host.Components.StaticFiles.Configuration.platformIdentifier, Tgstation.Server.Host.Components.StaticFiles.Configuration.postWriteHandler, Tgstation.Server.Host.Components.StaticFiles.Configuration.processExecutor, Tgstation.Server.Host.Components.StaticFiles.Configuration.semaphore, Tgstation.Server.Host.Components.StaticFiles.Configuration.symlinkFactory, and Tgstation.Server.Host.Components.StaticFiles.Configuration.synchronousIOManager.

+ +
+
+

Member Function Documentation

+ +

◆ CopyDMFilesTo()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task<ServerSideModifications> Tgstation.Server.Host.Components.StaticFiles.Configuration.CopyDMFilesTo (string dmeFile,
string destination,
CancellationToken cancellationToken 
)
+
+ +

Copies all files in the CodeModifications directory to destination

+ +

Implements Tgstation.Server.Host.Components.StaticFiles.IConfiguration.

+ +

Definition at line 131 of file Configuration.cs.

+
132  {
133  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
134  {
135  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
136 
137  // just assume no other fs race conditions here
138  var dmeExistsTask = ioManager.FileExists(ioManager.ConcatPath(CodeModificationsSubdirectory, dmeFile), cancellationToken);
141  var copyTask = ioManager.CopyDirectory(CodeModificationsSubdirectory, destination, null, cancellationToken);
142 
143  await Task.WhenAll(dmeExistsTask, headFileExistsTask, tailFileExistsTask, copyTask).ConfigureAwait(false);
144 
145  if (!dmeExistsTask.Result && !headFileExistsTask.Result && !tailFileExistsTask.Result)
146  return null;
147 
148  if (dmeExistsTask.Result)
149  return new ServerSideModifications(null, null, true);
150 
151  if (!headFileExistsTask.Result && !tailFileExistsTask.Result)
152  return null;
153 
154  string IncludeLine(string filePath) => String.Format(CultureInfo.InvariantCulture, "#include \"{0}\"", filePath);
155 
156  return new ServerSideModifications(headFileExistsTask.Result ? IncludeLine(CodeModificationsHeadFile) : null, tailFileExistsTask.Result ? IncludeLine(CodeModificationsTailFile) : null, false);
157  }
158  }
+
async Task EnsureDirectories(CancellationToken cancellationToken)
Ensures standard configuration directories exist
+
Task CopyDirectory(string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)
Copies a directory from src to dest
+
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists
+
readonly IIOManager ioManager
The IIOManager for Configuration
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for Configuration
+ +
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+ + +
+

References Tgstation.Server.Host.Components.StaticFiles.Configuration.CodeModificationsHeadFile, Tgstation.Server.Host.Components.StaticFiles.Configuration.CodeModificationsSubdirectory, Tgstation.Server.Host.Components.StaticFiles.Configuration.CodeModificationsTailFile, Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.IO.IIOManager.CopyDirectory(), Tgstation.Server.Host.Components.StaticFiles.Configuration.EnsureDirectories(), Tgstation.Server.Host.IO.IIOManager.FileExists(), Tgstation.Server.Host.Components.StaticFiles.Configuration.ioManager, Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), and Tgstation.Server.Host.Components.StaticFiles.Configuration.semaphore.

+ +
+
+ +

◆ CreateDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task<bool> Tgstation.Server.Host.Components.StaticFiles.Configuration.CreateDirectory (string configurationRelativePath,
ISystemIdentity systemIdentity,
CancellationToken cancellationToken 
)
+
+ +

Create an empty directory at configurationRelativePath

+ +

Implements Tgstation.Server.Host.Components.StaticFiles.IConfiguration.

+ +

Definition at line 413 of file Configuration.cs.

+
414  {
415  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
416  var path = ValidateConfigRelativePath(configurationRelativePath);
417 
418  bool? result = null;
419  void DoCreate() => result = synchronousIOManager.CreateDirectory(path, cancellationToken);
420 
421  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
422  if (systemIdentity == null)
423  await Task.Factory.StartNew(DoCreate, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
424  else
425  await systemIdentity.RunImpersonated(DoCreate, cancellationToken).ConfigureAwait(false);
426 
427  return result.Value;
428  }
readonly ISynchronousIOManager synchronousIOManager
The ISynchronousIOManager for Configuration
+
async Task EnsureDirectories(CancellationToken cancellationToken)
Ensures standard configuration directories exist
+
string ValidateConfigRelativePath(string configurationRelativePath)
+
Task RunImpersonated(Action action, CancellationToken cancellationToken)
Runs a given action in the context of the ISystemIdentity
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for Configuration
+
bool CreateDirectory(string path, CancellationToken cancellationToken)
Create an empty directory at path
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+

References Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), and Tgstation.Server.Host.Security.ISystemIdentity.RunImpersonated().

+ +
+
+ +

◆ DeleteDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task<bool> Tgstation.Server.Host.Components.StaticFiles.Configuration.DeleteDirectory (string configurationRelativePath,
ISystemIdentity systemIdentity,
CancellationToken cancellationToken 
)
+
+ +

Attempt to delete an empty directory at configurationRelativePath

+ +

Implements Tgstation.Server.Host.Components.StaticFiles.IConfiguration.

+ +

Definition at line 465 of file Configuration.cs.

+
466  {
467  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
468  var path = ValidateConfigRelativePath(configurationRelativePath);
469 
470  var result = false;
471  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
472  {
473  void CheckDeleteImpl() => result = synchronousIOManager.DeleteDirectory(path);
474 
475  if (systemIdentity != null)
476  await systemIdentity.RunImpersonated(CheckDeleteImpl, cancellationToken).ConfigureAwait(false);
477  else
478  CheckDeleteImpl();
479  }
480 
481  return result;
482  }
bool DeleteDirectory(string path)
Deletes a directory at path if it's empty
+
readonly ISynchronousIOManager synchronousIOManager
The ISynchronousIOManager for Configuration
+
async Task EnsureDirectories(CancellationToken cancellationToken)
Ensures standard configuration directories exist
+
string ValidateConfigRelativePath(string configurationRelativePath)
+
Task RunImpersonated(Action action, CancellationToken cancellationToken)
Runs a given action in the context of the ISystemIdentity
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for Configuration
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+

References Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), and Tgstation.Server.Host.Security.ISystemIdentity.RunImpersonated().

+ +
+
+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.StaticFiles.Configuration.Dispose ()
+
+ +

+ +
+
+ +

◆ EnsureDirectories()

+ +
+
+ + + + + +
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.StaticFiles.Configuration.EnsureDirectories (CancellationToken cancellationToken)
+
+private
+
+ +

Ensures standard configuration directories exist

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 117 of file Configuration.cs.

+
118  {
119  async Task ValidateStaticFolder()
120  {
121  await ioManager.CreateDirectory(GameStaticFilesSubdirectory, cancellationToken).ConfigureAwait(false);
122  var staticIgnorePath = StaticIgnorePath();
123  if(!await ioManager.FileExists(staticIgnorePath, cancellationToken).ConfigureAwait(false))
124  await ioManager.WriteAllBytes(staticIgnorePath, Array.Empty<byte>(), cancellationToken).ConfigureAwait(false);
125  }
126 
127  await Task.WhenAll(ioManager.CreateDirectory(CodeModificationsSubdirectory, cancellationToken), ioManager.CreateDirectory(EventScriptsSubdirectory, cancellationToken), ValidateStaticFolder()).ConfigureAwait(false);
128  }
string StaticIgnorePath()
Get the proper path to StaticIgnoreFile
+
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+
Task CreateDirectory(string path, CancellationToken cancellationToken)
Create a directory at path
+
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists
+ +
readonly IIOManager ioManager
The IIOManager for Configuration
+ + +
+

References Tgstation.Server.Host.Components.StaticFiles.Configuration.CodeModificationsSubdirectory, Tgstation.Server.Host.IO.IIOManager.CreateDirectory(), Tgstation.Server.Host.Components.StaticFiles.Configuration.EventScriptsSubdirectory, Tgstation.Server.Host.IO.IIOManager.FileExists(), Tgstation.Server.Host.Components.StaticFiles.Configuration.GameStaticFilesSubdirectory, Tgstation.Server.Host.Components.StaticFiles.Configuration.ioManager, Tgstation.Server.Host.Components.StaticFiles.Configuration.StaticIgnorePath(), and Tgstation.Server.Host.IO.IIOManager.WriteAllBytes().

+ +

Referenced by Tgstation.Server.Host.Components.StaticFiles.Configuration.CopyDMFilesTo(), Tgstation.Server.Host.Components.StaticFiles.Configuration.ListDirectory(), and Tgstation.Server.Host.Components.StaticFiles.Configuration.Read().

+ +
+
+ +

◆ HandleEvent()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task<bool> Tgstation.Server.Host.Components.StaticFiles.Configuration.HandleEvent (EventType eventType,
IEnumerable< string > parameters,
CancellationToken cancellationToken 
)
+
+ +

Handle a given eventType

+ +

Implements Tgstation.Server.Host.Components.IEventConsumer.

+ +

Definition at line 437 of file Configuration.cs.

+
438  {
439  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
440 
441  if (!EventTypeScriptFileNameMap.TryGetValue(eventType, out var scriptName))
442  return true;
443 
444  // always execute in serial
445  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
446  {
447  var files = await ioManager.GetFilesWithExtension(EventScriptsSubdirectory, platformIdentifier.ScriptFileExtension, cancellationToken).ConfigureAwait(false);
448  var resolvedScriptsDir = ioManager.ResolvePath(EventScriptsSubdirectory);
449 
450  foreach (var I in files.Select(x => ioManager.GetFileName(x)).Where(x => x.StartsWith(scriptName, StringComparison.Ordinal)))
451  using (var script = processExecutor.LaunchProcess(ioManager.ConcatPath(resolvedScriptsDir, I), resolvedScriptsDir, String.Join(' ', parameters), noShellExecute: true))
452  using (cancellationToken.Register(() => script.Terminate()))
453  {
454  var exitCode = await script.Lifetime.ConfigureAwait(false);
455  cancellationToken.ThrowIfCancellationRequested();
456  if (exitCode != 0)
457  return false;
458  }
459  }
460 
461  return true;
462  }
Task< List< string > > GetFilesWithExtension(string path, string extension, CancellationToken cancellationToken)
Gets a list of files in path with the given extension
+
async Task EnsureDirectories(CancellationToken cancellationToken)
Ensures standard configuration directories exist
+
static readonly IReadOnlyDictionary< EventType, string > EventTypeScriptFileNameMap
+
readonly IProcessExecutor processExecutor
The IProcessExecutor for Configuration
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for Configuration
+
string GetFileName(string path)
Gets the file name portion of a path
+
IProcess LaunchProcess(string fileName, string workingDirectory, string arguments=null, bool readOutput=false, bool readError=false, bool noShellExecute=false)
Launch a IProcess
+
readonly IIOManager ioManager
The IIOManager for Configuration
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for Configuration
+
string ScriptFileExtension
The extension of executable script files for the system
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+ +
+

References Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock().

+ +
+
+ +

◆ ListDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task<IReadOnlyList<ConfigurationFile> > Tgstation.Server.Host.Components.StaticFiles.Configuration.ListDirectory (string configurationRelativePath,
ISystemIdentity systemIdentity,
CancellationToken cancellationToken 
)
+
+ +

Get ConfigurationFile for all items in a given configurationRelativePath

+ +

Implements Tgstation.Server.Host.Components.StaticFiles.IConfiguration.

+ +

Definition at line 175 of file Configuration.cs.

+
176  {
177  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
178  var path = ValidateConfigRelativePath(configurationRelativePath);
179 
180  if (configurationRelativePath == null)
181  configurationRelativePath = "/";
182 
183  List<ConfigurationFile> result = new List<ConfigurationFile>();
184 
185  void ListImpl()
186  {
187  var enumerator = synchronousIOManager.GetDirectories(path, cancellationToken);
188  try
189  {
190  result.AddRange(enumerator.Select(x => new ConfigurationFile
191  {
192  IsDirectory = true,
193  Path = ioManager.ConcatPath(configurationRelativePath, x),
194  }));
195  }
196  catch (IOException e)
197  {
198  logger.LogDebug("IOException while writing {0}: {1}", path, e);
199  result = null;
200  return;
201  }
202 
203  enumerator = synchronousIOManager.GetFiles(path, cancellationToken);
204  result.AddRange(enumerator.Select(x => new ConfigurationFile
205  {
206  IsDirectory = false,
207  Path = ioManager.ConcatPath(configurationRelativePath, x),
208  }));
209  }
210 
211  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
212  if (systemIdentity == null)
213  ListImpl();
214  else
215  await systemIdentity.RunImpersonated(ListImpl, cancellationToken).ConfigureAwait(false);
216 
217  return result;
218  }
readonly ISynchronousIOManager synchronousIOManager
The ISynchronousIOManager for Configuration
+
async Task EnsureDirectories(CancellationToken cancellationToken)
Ensures standard configuration directories exist
+
readonly ILogger< Configuration > logger
The ILogger for Configuration
+
string ValidateConfigRelativePath(string configurationRelativePath)
+
Task RunImpersonated(Action action, CancellationToken cancellationToken)
Runs a given action in the context of the ISystemIdentity
+
IEnumerable< string > GetDirectories(string path, CancellationToken cancellationToken)
Enumerate directories in a given path
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for Configuration
+
Represents a game configuration file. Create and delete actions uncerimonuously overwrite/delete file...
+
IEnumerable< string > GetFiles(string path, CancellationToken cancellationToken)
Enumerate files in a given path
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+

References Tgstation.Server.Host.Components.StaticFiles.Configuration.EnsureDirectories(), Tgstation.Server.Host.IO.ISynchronousIOManager.GetDirectories(), Tgstation.Server.Host.IO.ISynchronousIOManager.GetFiles(), Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), Tgstation.Server.Host.Components.StaticFiles.Configuration.logger, Tgstation.Server.Host.Security.ISystemIdentity.RunImpersonated(), Tgstation.Server.Host.Components.StaticFiles.Configuration.semaphore, Tgstation.Server.Host.Components.StaticFiles.Configuration.synchronousIOManager, and Tgstation.Server.Host.Components.StaticFiles.Configuration.ValidateConfigRelativePath().

+ +
+
+ +

◆ Read()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task<ConfigurationFile> Tgstation.Server.Host.Components.StaticFiles.Configuration.Read (string configurationRelativePath,
ISystemIdentity systemIdentity,
CancellationToken cancellationToken 
)
+
+ +

Reads a given configurationRelativePath

+ +

Implements Tgstation.Server.Host.Components.StaticFiles.IConfiguration.

+ +

Definition at line 221 of file Configuration.cs.

+
222  {
223  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
224  var path = ValidateConfigRelativePath(configurationRelativePath);
225 
226  ConfigurationFile result = null;
227 
228  void ReadImpl()
229  {
230  lock (this)
231  try
232  {
233  var content = synchronousIOManager.ReadFile(path);
234  string sha1String;
235 #pragma warning disable CA5350 // Do not use insecure cryptographic algorithm SHA1.
236  using (var sha1 = new SHA1Managed())
237 #pragma warning restore CA5350 // Do not use insecure cryptographic algorithm SHA1.
238  sha1String = String.Join(String.Empty, sha1.ComputeHash(content).Select(b => b.ToString("x2", CultureInfo.InvariantCulture)));
239  result = new ConfigurationFile
240  {
241  Content = content,
242  IsDirectory = false,
243  LastReadHash = sha1String,
244  AccessDenied = false,
245  Path = configurationRelativePath
246  };
247  }
248  catch (UnauthorizedAccessException)
249  {
250  // this happens on windows, dunno about linux
251  bool isDirectory;
252  try
253  {
254  isDirectory = synchronousIOManager.IsDirectory(path);
255  }
256  catch
257  {
258  isDirectory = false;
259  }
260 
261  result = new ConfigurationFile
262  {
263  Path = configurationRelativePath
264  };
265  if (!isDirectory)
266  result.AccessDenied = true;
267  else
268  result.IsDirectory = true;
269  }
270  }
271 
272  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
273  if (systemIdentity == null)
274  await Task.Factory.StartNew(ReadImpl, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
275  else
276  await systemIdentity.RunImpersonated(ReadImpl, cancellationToken).ConfigureAwait(false);
277 
278  return result;
279  }
readonly ISynchronousIOManager synchronousIOManager
The ISynchronousIOManager for Configuration
+
async Task EnsureDirectories(CancellationToken cancellationToken)
Ensures standard configuration directories exist
+
bool? IsDirectory
If Path represents a directory
+
byte [] ReadFile(string path)
Read the bytes of a file at a given path
+
string ValidateConfigRelativePath(string configurationRelativePath)
+
Task RunImpersonated(Action action, CancellationToken cancellationToken)
Runs a given action in the context of the ISystemIdentity
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for Configuration
+
Represents a game configuration file. Create and delete actions uncerimonuously overwrite/delete file...
+
bool IsDirectory(string path)
Checks if a given path is a directory
+
bool? AccessDenied
If access to the ConfigurationFile file was denied for the operation
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+

References Tgstation.Server.Api.Models.ConfigurationFile.AccessDenied, Tgstation.Server.Host.Components.StaticFiles.Configuration.EnsureDirectories(), Tgstation.Server.Api.Models.ConfigurationFile.IsDirectory, Tgstation.Server.Host.IO.ISynchronousIOManager.IsDirectory(), Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), Tgstation.Server.Host.IO.ISynchronousIOManager.ReadFile(), Tgstation.Server.Host.Security.ISystemIdentity.RunImpersonated(), Tgstation.Server.Host.Components.StaticFiles.Configuration.semaphore, Tgstation.Server.Host.Components.StaticFiles.Configuration.synchronousIOManager, and Tgstation.Server.Host.Components.StaticFiles.Configuration.ValidateConfigRelativePath().

+ +
+
+ +

◆ StartAsync()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.StaticFiles.Configuration.StartAsync (CancellationToken cancellationToken)
+
+ +

+ +
+
+ +

◆ StaticIgnorePath()

+ +
+
+ + + + + +
+ + + + + + + +
string Tgstation.Server.Host.Components.StaticFiles.Configuration.StaticIgnorePath ()
+
+private
+
+
+ +

◆ StopAsync()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.StaticFiles.Configuration.StopAsync (CancellationToken cancellationToken)
+
+ +

+ +
+
+ +

◆ SymlinkStaticFilesTo()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.StaticFiles.Configuration.SymlinkStaticFilesTo (string destination,
CancellationToken cancellationToken 
)
+
+ +

Symlinks all directories in the GameData directory to destination

+ +

Implements Tgstation.Server.Host.Components.StaticFiles.IConfiguration.

+ +

Definition at line 282 of file Configuration.cs.

+
283  {
284  async Task<IReadOnlyList<string>> GetIgnoreFiles()
285  {
286  var ignoreFileBytes = await ioManager.ReadAllBytes(StaticIgnorePath(), cancellationToken).ConfigureAwait(false);
287  var ignoreFileText = Encoding.UTF8.GetString(ignoreFileBytes);
288 
289  var results = new List<string> { StaticIgnoreFile };
290 
291  // we don't want to lose trailing whitespace on linux
292  using (var reader = new StringReader(ignoreFileText))
293  {
294  cancellationToken.ThrowIfCancellationRequested();
295  var line = await reader.ReadLineAsync().ConfigureAwait(false);
296  if (!String.IsNullOrEmpty(line))
297  results.Add(line);
298  }
299 
300  return results;
301  }
302 
303  IReadOnlyList<string> ignoreFiles;
304 
305  async Task SymlinkBase(bool files)
306  {
307  Task<IReadOnlyList<string>> task;
308  if (files)
309  task = ioManager.GetFiles(GameStaticFilesSubdirectory, cancellationToken);
310  else
311  task = ioManager.GetDirectories(GameStaticFilesSubdirectory, cancellationToken);
312  var entries = await task.ConfigureAwait(false);
313 
314  await Task.WhenAll(entries.Select(async x =>
315  {
316  var fileName = ioManager.GetFileName(x);
317 
318  // need to normalize
319  bool ignored;
320  if (platformIdentifier.IsWindows)
321  ignored = ignoreFiles.Any(y => fileName.ToUpperInvariant() == y.ToUpperInvariant());
322  else
323  ignored = ignoreFiles.Any(y => fileName == y);
324 
325  if (ignored)
326  {
327  logger.LogTrace("Ignoring static file {0}...", fileName);
328  return;
329  }
330 
331  var destPath = ioManager.ConcatPath(destination, fileName);
332  logger.LogTrace("Symlinking {0} to {1}...", x, destPath);
333  var fileExistsTask = ioManager.FileExists(destPath, cancellationToken);
334  if (await ioManager.DirectoryExists(destPath, cancellationToken).ConfigureAwait(false))
335  await ioManager.DeleteDirectory(destPath, cancellationToken).ConfigureAwait(false);
336  var fileExists = await fileExistsTask.ConfigureAwait(false);
337  if (fileExists)
338  await ioManager.DeleteFile(destPath, cancellationToken).ConfigureAwait(false);
339  await symlinkFactory.CreateSymbolicLink(ioManager.ResolvePath(x), ioManager.ResolvePath(destPath), cancellationToken).ConfigureAwait(false);
340  })).ConfigureAwait(false);
341  }
342 
343  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
344  {
345  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
346  ignoreFiles = await GetIgnoreFiles().ConfigureAwait(false);
347  await Task.WhenAll(SymlinkBase(true), SymlinkBase(false)).ConfigureAwait(false);
348  }
349  }
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
string StaticIgnorePath()
Get the proper path to StaticIgnoreFile
+
async Task EnsureDirectories(CancellationToken cancellationToken)
Ensures standard configuration directories exist
+
Task< IReadOnlyList< string > > GetDirectories(string path, CancellationToken cancellationToken)
Returns directory names in a given path
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
readonly ILogger< Configuration > logger
The ILogger for Configuration
+
const string StaticIgnoreFile
Name of the ignore file in GameStaticFilesSubdirectory
+
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists
+
readonly ISymlinkFactory symlinkFactory
The ISymlinkFactory for Configuration
+ +
readonly IIOManager ioManager
The IIOManager for Configuration
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for Configuration
+ +
Task< IReadOnlyList< string > > GetFiles(string path, CancellationToken cancellationToken)
Returns file names in a given path
+
Task< byte[]> ReadAllBytes(string path, CancellationToken cancellationToken)
Returns all the contents of a file at path as a byte array
+
Task DeleteFile(string path, CancellationToken cancellationToken)
Deletes a file at path
+
Task< bool > DirectoryExists(string path, CancellationToken cancellationToken)
Check that the directory at path exists
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+ +
+

References Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.IO.ISymlinkFactory.CreateSymbolicLink(), Tgstation.Server.Host.IO.IIOManager.DeleteDirectory(), Tgstation.Server.Host.IO.IIOManager.DeleteFile(), Tgstation.Server.Host.IO.IIOManager.DirectoryExists(), Tgstation.Server.Host.IO.IIOManager.FileExists(), Tgstation.Server.Host.Components.StaticFiles.Configuration.GameStaticFilesSubdirectory, Tgstation.Server.Host.IO.IIOManager.GetDirectories(), Tgstation.Server.Host.IO.IIOManager.GetFiles(), Tgstation.Server.Host.Components.StaticFiles.Configuration.ioManager, Tgstation.Server.Host.Components.StaticFiles.Configuration.logger, Tgstation.Server.Host.IO.IIOManager.ReadAllBytes(), Tgstation.Server.Host.IO.IIOManager.ResolvePath(), Tgstation.Server.Host.Components.StaticFiles.Configuration.StaticIgnoreFile, Tgstation.Server.Host.Components.StaticFiles.Configuration.StaticIgnorePath(), and Tgstation.Server.Host.Components.StaticFiles.Configuration.symlinkFactory.

+ +
+
+ +

◆ ValidateConfigRelativePath()

+ +
+
+ + + + + +
+ + + + + + + + +
string Tgstation.Server.Host.Components.StaticFiles.Configuration.ValidateConfigRelativePath (string configurationRelativePath)
+
+private
+
+ +

Definition at line 160 of file Configuration.cs.

+
161  {
162  var nullOrEmptyCheck = String.IsNullOrEmpty(configurationRelativePath);
163  if (nullOrEmptyCheck)
164  configurationRelativePath = ".";
165  if (configurationRelativePath[0] == Path.DirectorySeparatorChar || configurationRelativePath[0] == Path.AltDirectorySeparatorChar)
166  configurationRelativePath = '.' + configurationRelativePath;
167  var resolved = ioManager.ResolvePath(configurationRelativePath);
168  var local = !nullOrEmptyCheck ? ioManager.ResolvePath(".") : null;
169  if (!nullOrEmptyCheck && resolved.Length < local.Length) // .. fuccbois
170  throw new InvalidOperationException("Attempted to access file outside of configuration manager!");
171  return resolved;
172  }
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
readonly IIOManager ioManager
The IIOManager for Configuration
+
+

References Tgstation.Server.Host.Components.StaticFiles.Configuration.ioManager, and Tgstation.Server.Host.IO.IIOManager.ResolvePath().

+ +

Referenced by Tgstation.Server.Host.Components.StaticFiles.Configuration.ListDirectory(), and Tgstation.Server.Host.Components.StaticFiles.Configuration.Read().

+ +
+
+ +

◆ Write()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task<ConfigurationFile> Tgstation.Server.Host.Components.StaticFiles.Configuration.Write (string configurationRelativePath,
ISystemIdentity systemIdentity,
byte [] data,
string previousHash,
CancellationToken cancellationToken 
)
+
+ +

Writes to a given configurationRelativePath

+ +

Implements Tgstation.Server.Host.Components.StaticFiles.IConfiguration.

+ +

Definition at line 352 of file Configuration.cs.

+
353  {
354  await EnsureDirectories(cancellationToken).ConfigureAwait(false);
355  var path = ValidateConfigRelativePath(configurationRelativePath);
356 
357  ConfigurationFile result = null;
358 
359  void WriteImpl()
360  {
361  lock (this)
362  try
363  {
364  var fileHash = previousHash;
365  var success = synchronousIOManager.WriteFileChecked(path, data, ref fileHash, cancellationToken);
366  if (!success)
367  return;
368  if (data != null)
370  result = new ConfigurationFile
371  {
372  Content = data,
373  IsDirectory = false,
374  LastReadHash = fileHash,
375  AccessDenied = false,
376  Path = configurationRelativePath
377  };
378  }
379  catch (UnauthorizedAccessException)
380  {
381  // this happens on windows, dunno about linux
382  bool isDirectory;
383  try
384  {
385  isDirectory = synchronousIOManager.IsDirectory(path);
386  }
387  catch
388  {
389  isDirectory = false;
390  }
391 
392  result = new ConfigurationFile
393  {
394  Path = configurationRelativePath
395  };
396  if (!isDirectory)
397  result.AccessDenied = true;
398  else
399  result.IsDirectory = true;
400  }
401  }
402 
403  using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
404  if (systemIdentity == null)
405  await Task.Factory.StartNew(WriteImpl, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
406  else
407  await systemIdentity.RunImpersonated(WriteImpl, cancellationToken).ConfigureAwait(false);
408 
409  return result;
410  }
readonly ISynchronousIOManager synchronousIOManager
The ISynchronousIOManager for Configuration
+
async Task EnsureDirectories(CancellationToken cancellationToken)
Ensures standard configuration directories exist
+
bool WriteFileChecked(string path, byte[] data, ref string sha1InOut, CancellationToken cancellationToken)
Write data to a file at a given path
+
void HandleWrite(string filePath)
For handling system specific necessities after a write
+
bool? IsDirectory
If Path represents a directory
+
string ValidateConfigRelativePath(string configurationRelativePath)
+
Task RunImpersonated(Action action, CancellationToken cancellationToken)
Runs a given action in the context of the ISystemIdentity
+
readonly SemaphoreSlim semaphore
The SemaphoreSlim for Configuration
+
Represents a game configuration file. Create and delete actions uncerimonuously overwrite/delete file...
+
readonly IPostWriteHandler postWriteHandler
The IPostWriteHandler for Configuration
+
bool IsDirectory(string path)
Checks if a given path is a directory
+
bool? AccessDenied
If access to the ConfigurationFile file was denied for the operation
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+

References Tgstation.Server.Api.Models.ConfigurationFile.AccessDenied, Tgstation.Server.Api.Models.ConfigurationFile.IsDirectory, Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), and Tgstation.Server.Host.Security.ISystemIdentity.RunImpersonated().

+ +
+
+

Member Data Documentation

+ +

◆ CodeModificationsHeadFile

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.StaticFiles.Configuration.CodeModificationsHeadFile = "HeadInclude.dm"
+
+private
+
+
+ +

◆ CodeModificationsSubdirectory

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.StaticFiles.Configuration.CodeModificationsSubdirectory = "CodeModifications"
+
+private
+
+
+ +

◆ CodeModificationsTailFile

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.StaticFiles.Configuration.CodeModificationsTailFile = "TailInclude.dm"
+
+private
+
+
+ +

◆ EventScriptsSubdirectory

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.StaticFiles.Configuration.EventScriptsSubdirectory = "EventScripts"
+
+private
+
+
+ +

◆ EventTypeScriptFileNameMap

+ +
+
+ + + + + +
+ + + + +
readonly IReadOnlyDictionary<EventType, string> Tgstation.Server.Host.Components.StaticFiles.Configuration.EventTypeScriptFileNameMap
+
+staticprivate
+
+Initial value:
= new Dictionary<EventType, string>
{
{ EventType.CompileStart, "PreCompile" },
{ EventType.CompileComplete, "PostCompile" },
{ EventType.RepoPreSynchronize, "PreSynchronize" }
}
+

Definition at line 33 of file Configuration.cs.

+ +
+
+ +

◆ GameStaticFilesSubdirectory

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.StaticFiles.Configuration.GameStaticFilesSubdirectory = "GameStaticFiles"
+
+private
+
+
+ +

◆ ioManager

+ + + +

◆ logger

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<Configuration> Tgstation.Server.Host.Components.StaticFiles.Configuration.logger
+
+private
+
+
+ +

◆ platformIdentifier

+ +
+
+ + + + + +
+ + + + +
readonly IPlatformIdentifier Tgstation.Server.Host.Components.StaticFiles.Configuration.platformIdentifier
+
+private
+
+ +

The IPlatformIdentifier for Configuration

+ +

Definition at line 68 of file Configuration.cs.

+ +

Referenced by Tgstation.Server.Host.Components.StaticFiles.Configuration.Configuration().

+ +
+
+ +

◆ postWriteHandler

+ +
+
+ + + + + +
+ + + + +
readonly IPostWriteHandler Tgstation.Server.Host.Components.StaticFiles.Configuration.postWriteHandler
+
+private
+
+ +

The IPostWriteHandler for Configuration

+ +

Definition at line 63 of file Configuration.cs.

+ +

Referenced by Tgstation.Server.Host.Components.StaticFiles.Configuration.Configuration().

+ +
+
+ +

◆ processExecutor

+ +
+
+ + + + + +
+ + + + +
readonly IProcessExecutor Tgstation.Server.Host.Components.StaticFiles.Configuration.processExecutor
+
+private
+
+ +

The IProcessExecutor for Configuration

+ +

Definition at line 58 of file Configuration.cs.

+ +

Referenced by Tgstation.Server.Host.Components.StaticFiles.Configuration.Configuration().

+ +
+
+ +

◆ semaphore

+ +
+
+ + + + + +
+ + + + +
readonly SemaphoreSlim Tgstation.Server.Host.Components.StaticFiles.Configuration.semaphore
+
+private
+
+
+ +

◆ StaticIgnoreFile

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Components.StaticFiles.Configuration.StaticIgnoreFile = ".tgsignore"
+
+private
+
+ +

Name of the ignore file in GameStaticFilesSubdirectory

+ +

Definition at line 28 of file Configuration.cs.

+ +

Referenced by Tgstation.Server.Host.Components.StaticFiles.Configuration.SymlinkStaticFilesTo().

+ +
+
+ +

◆ symlinkFactory

+ +
+
+ + + + + +
+ + + + +
readonly ISymlinkFactory Tgstation.Server.Host.Components.StaticFiles.Configuration.symlinkFactory
+
+private
+
+
+ +

◆ synchronousIOManager

+ +
+
+ + + + + +
+ + + + +
readonly ISynchronousIOManager Tgstation.Server.Host.Components.StaticFiles.Configuration.synchronousIOManager
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..c1a5992b9650628934d01adcd696d8e9e2861457 GIT binary patch literal 3006 zcmb`J3s4g17J#)fTUT>7T^A{1CW%Z}EyL1kwY!=KzR-M-qDEv!npTU?Rj{_z9-=Gw zUQtWYT3>CZn4*|&Fq&ymN?LBVWX7r)2>3#{KXmWToxO8s_TIVw3~)IAIp=?!@BIH2 ztS`#Q0BWG4qho~jbPv$cS%(DjFI2N-GEaDSkKj?Sk(X!pMbChN|QPbZFfv)x~32_Ri+uU}i8#h127 z&+IH_U#_|0{xmdPR=OMm$-HjZyKCmV7yp#p7+W(5PHWug`S8*2B*DIPI{e$m)r>bA ztZDGkytqlY^F;&`j>3}QeK};C9etl6#XyCzL?>2yTgv3+2KBhMo|Cg9^P>WJUy!^BYCQ6fBC~Fy6eH9|(?UJiUzuKl;Ia%L`q# z@jbihJb3P+Lba9q`kI%hWP1n{EwwZu;hAY>vc)uxW&B%JSK8{ky^6z|s1eYqsKH>h ze5#8xr1ncq|0+kqx`lkJ>nA67K4`hmztYGIH^5_vq5Sj@{he|0m(+)0wLT$v@H*uh z(#w6~ZT&6zDAyo5$FRwY*0CmzFQ>A9;U74!pgjqrD~aWWyr`0xI&MYwfp2VbR?IBC zh`T4KbOZ#yI!U9g@5OOhibc^c=qR?%{&gohl3s6q-;SJ`gB;+W}Og( zgNBRt)juoI9>TW*TuE{ev~HT&v<)4+bXb5>+X@3H&IC>yGPreixW~lJJ~evMzYMO< z?~-?ErzG)X>hmz(jG$}NT%3S_}aHH|3$TU2Eahs zp-KNr5WqqVK(ag~07Mjc&}Tf^=jmJi#sI3DNcss>djY_!lnhj?Joo`YLm3>UCC-Jl z+prg#Nq{60?iOSbApN@xd+m^70wmKiBl3a1>GKkV5wIknpu0e{Oc4Jz38ci26IV<4GNr? zk!TP8s%)OxJk$vLvMV1RQrL^&wIsDR;eg^kTF~>b^?Z;-@NW zDu402!m6vKe^RV;oEb~0@;XAoyS5Fw3_q2d3C+4TQpkxr&xSr03F3QC7G&EGS>N+X zxHi@L%N*m;CG7&dS?5UIk~~mgPIV9O7NKMf?3yBk0O#$TH#BQjq`-H~{}$U)IV{+b zSe#w#MO-apY#%J_D8+&;|26A-a+cb;_1EKLKTWgKWQk2D z@sCT(2DjJ$cp@CSIo?a(*5oJ6PTsbr^CS?eo``!d6JJ;KeEDXOrwn;eWJ#aRU=Wb>rz{R|E&F9@{5E_K$ zcjfbNd#E-v*rtzT{J?v2Z|M>e;ZPhIiXo1%o3Fg*8^6c3^dyRnJ-qYpB{Z#sfkmjo zyjhZA!&hOdqL3}iJm3FB%|*LHBCHHv~bje-Il%82l;!?=wy_|lr@T>#xCOw zsxWbmcGe|0iP=#2u3YW1!p<>xvk9~H@FgK9z?K>mpxvTdNM5c;qbf$0=hkZ15eRi= zM*QR#=?xv?AJOC(0YQWBL`&6fS`W=dS*0;_1FU!W|EDAbxoQP+b_FnE>QrnDs5o>1 z^$`+V7njpoOxAzIe?0MH#K~cr0uh?_f{ek5+?;NqvZvLRvYJ2|<;XEL+E$gXKS4qITo{JuMZ9GWkfoxaQGnHquP7R2~!X7$bh@!7X%ZkeHK{ zrheKq)feFQ_M8sEbN7hbuOUzF!+8=LO4L~BwZRCRQ~t{V(0NnvzA@I0!Ng&R(syZJ zLru&F>}^@QXJ3rEFNpM$>O%<~GJVUf`MWnKQR_fypwgC}Dw<(kNvrZ9@k-C^@1K|q z7THyJmoJOF*x(W7(EdPkZ~I#g+SyM#g*cZgvjqGINRYHL`^u*H(U)(>E^8Qz=k+&I zSTxmXpM}`3wB`9^N2;{=5_O<%SaUt7?dHSN_jf*Xp*9>ZAF9#9mgG3&A^ILr_ZNg- mkckCP#pE%4tK0k3`g0o)lbG7vGVs{eK_B*YZ~Xe$#lHi;-ouOl literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_server_side_modifications-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_server_side_modifications-members.html new file mode 100644 index 0000000000..03395ed378 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_server_side_modifications-members.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.StaticFiles.ServerSideModifications Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_server_side_modifications.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_server_side_modifications.html new file mode 100644 index 0000000000..2b8a005a27 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_server_side_modifications.html @@ -0,0 +1,252 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.StaticFiles.ServerSideModifications Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.StaticFiles.ServerSideModifications Class Reference
+
+
+ +

Represents code modifications via configuration + More...

+ + + + + +

+Public Member Functions

 ServerSideModifications (string headIncludeLine, string tailIncludeLine, bool totalDmeOverwrite)
 Construct ServerSideModifications More...
 
+ + + + + + + + + + +

+Properties

bool TotalDmeOverwrite [get]
 If the target dme was completely overwitten More...
 
string HeadIncludeLine [get]
 The #include line which should be added to the beginning of the .dme if any More...
 
string TailIncludeLine [get]
 The #include line which should be added to the end of the .dme if any More...
 
+

Detailed Description

+

Represents code modifications via configuration

+ +

Definition at line 6 of file ServerSideModifications.cs.

+

Constructor & Destructor Documentation

+ +

◆ ServerSideModifications()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.StaticFiles.ServerSideModifications.ServerSideModifications (string headIncludeLine,
string tailIncludeLine,
bool totalDmeOverwrite 
)
+
+ +

Construct ServerSideModifications

+
Parameters
+ + + + +
headIncludeLineThe value of HeadIncludeLine
tailIncludeLineThe value of TailIncludeLine
totalDmeOverwriteThe value of TotalDmeOverwrite
+
+
+ +

Definition at line 29 of file ServerSideModifications.cs.

+
30  {
31  HeadIncludeLine = headIncludeLine;
32  TailIncludeLine = tailIncludeLine;
33  TotalDmeOverwrite = totalDmeOverwrite;
34  }
bool TotalDmeOverwrite
If the target dme was completely overwitten
+
string TailIncludeLine
The #include line which should be added to the end of the .dme if any
+
string HeadIncludeLine
The #include line which should be added to the beginning of the .dme if any
+
+

References Tgstation.Server.Host.Components.StaticFiles.ServerSideModifications.HeadIncludeLine, Tgstation.Server.Host.Components.StaticFiles.ServerSideModifications.TailIncludeLine, and Tgstation.Server.Host.Components.StaticFiles.ServerSideModifications.TotalDmeOverwrite.

+ +
+
+

Property Documentation

+ +

◆ HeadIncludeLine

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.StaticFiles.ServerSideModifications.HeadIncludeLine
+
+get
+
+ +

The #include line which should be added to the beginning of the .dme if any

+ +

Definition at line 16 of file ServerSideModifications.cs.

+
16 { get; }
+

Referenced by Tgstation.Server.Host.Components.StaticFiles.ServerSideModifications.ServerSideModifications().

+ +
+
+ +

◆ TailIncludeLine

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.StaticFiles.ServerSideModifications.TailIncludeLine
+
+get
+
+ +

The #include line which should be added to the end of the .dme if any

+ +

Definition at line 21 of file ServerSideModifications.cs.

+
21 { get; }
+

Referenced by Tgstation.Server.Host.Components.StaticFiles.ServerSideModifications.ServerSideModifications().

+ +
+
+ +

◆ TotalDmeOverwrite

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.StaticFiles.ServerSideModifications.TotalDmeOverwrite
+
+get
+
+ +

If the target dme was completely overwitten

+ +

Definition at line 11 of file ServerSideModifications.cs.

+
11 { get; }
+

Referenced by Tgstation.Server.Host.Components.StaticFiles.ServerSideModifications.ServerSideModifications().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog-members.html new file mode 100644 index 0000000000..38fbbeda54 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog-members.html @@ -0,0 +1,124 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.BasicWatchdog Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Watchdog.BasicWatchdog, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActiveCompileJobTgstation.Server.Host.Components.Watchdog.BasicWatchdog
ActiveLaunchParametersTgstation.Server.Host.Components.Watchdog.WatchdogBase
ActiveParametersUpdatedTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
AlphaIsActiveTgstation.Server.Host.Components.Watchdog.BasicWatchdog
AsyncDelayerTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
BasicWatchdog(IChat chat, ISessionControllerFactory sessionControllerFactory, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IEventConsumer eventConsumer, IJobManager jobManager, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILogger< BasicWatchdog > logger, DreamDaemonLaunchParameters initialLaunchParameters, Api.Models.Instance instance, bool autoStart)Tgstation.Server.Host.Components.Watchdog.BasicWatchdog
ChangeSettings(DreamDaemonLaunchParameters launchParameters, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
ChatTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
CheckLaunchResult(ISessionController controller, string serverName, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
CreateReattachInformation()Tgstation.Server.Host.Components.Watchdog.BasicWatchdogprotectedvirtual
Dispose()Tgstation.Server.Host.Components.Watchdog.WatchdogBase
DisposeAndNullControllers()Tgstation.Server.Host.Components.Watchdog.BasicWatchdogprotectedvirtual
DmbFactoryTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
GetActiveController()Tgstation.Server.Host.Components.Watchdog.BasicWatchdogprotectedvirtual
HandleChatCommand(string commandName, string arguments, Chat.User sender, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
Tgstation::Server::Host::Components::Chat::ICustomCommandHandler.HandleChatCommand(string commandName, string arguments, User sender, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.ICustomCommandHandler
HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
HandleMonitorWakeup(MonitorActivationReason reason, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.BasicWatchdogprivate
HandleRestart(Version updateVersion, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
InitControllers(Action callBeforeRecurse, Task chatTask, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.BasicWatchdogprotectedvirtual
LastLaunchParametersTgstation.Server.Host.Components.Watchdog.WatchdogBase
Launch(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
LoggerTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
MonitorLifetimes(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.BasicWatchdogprotectedvirtual
NotifyOfFailedReattach(bool inactiveReattachSuccess, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
RebootStateTgstation.Server.Host.Components.Watchdog.BasicWatchdog
ResetRebootState(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
Restart(bool graceful, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
RunningTgstation.Server.Host.Components.Watchdog.WatchdogBase
SemaphoreTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
serverTgstation.Server.Host.Components.Watchdog.BasicWatchdogprivate
SessionControllerFactoryTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
StartAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
StartMonitor()Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
StopAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
StopMonitor()Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
Terminate(bool graceful, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
WatchdogBase(IChat chat, ISessionControllerFactory sessionControllerFactory, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IEventConsumer eventConsumer, IJobManager jobManager, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILogger logger, DreamDaemonLaunchParameters initialLaunchParameters, Api.Models.Instance instance, bool autoStart)Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html new file mode 100644 index 0000000000..3c23723538 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html @@ -0,0 +1,760 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.BasicWatchdog Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.BasicWatchdog Class Reference
+
+
+ +

A IWatchdog that manages one server. + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Watchdog.BasicWatchdog:
+
+
+ + +Tgstation.Server.Host.Components.Watchdog.WatchdogBase +Tgstation.Server.Host.Components.Watchdog.IWatchdog +Tgstation.Server.Host.Components.Chat.ICustomCommandHandler +Tgstation.Server.Host.Core.IRestartHandler +IHostedService +IDisposable +Tgstation.Server.Host.Components.IEventConsumer + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 BasicWatchdog (IChat chat, ISessionControllerFactory sessionControllerFactory, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IEventConsumer eventConsumer, IJobManager jobManager, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILogger< BasicWatchdog > logger, DreamDaemonLaunchParameters initialLaunchParameters, Api.Models.Instance instance, bool autoStart)
 Initializes a new instance of the ExperimentalWatchdog class. More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Components.Watchdog.WatchdogBase
void Dispose ()
 
async Task ChangeSettings (DreamDaemonLaunchParameters launchParameters, CancellationToken cancellationToken)
 Changes the ActiveLaunchParameters. If currently Running triggers a graceful restart More...
 
async Task< bool > HandleEvent (EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
 Handle a given eventType More...
 
async Task< string > HandleChatCommand (string commandName, string arguments, Chat.User sender, CancellationToken cancellationToken)
 
async Task Launch (CancellationToken cancellationToken)
 Start the IWatchdog More...
 
async Task ResetRebootState (CancellationToken cancellationToken)
 Cancels pending graceful actions More...
 
async Task Restart (bool graceful, CancellationToken cancellationToken)
 Restarts the watchdog More...
 
async Task StartAsync (CancellationToken cancellationToken)
 
async Task StopAsync (CancellationToken cancellationToken)
 
async Task Terminate (bool graceful, CancellationToken cancellationToken)
 Stops the watchdog More...
 
async Task HandleRestart (Version updateVersion, CancellationToken cancellationToken)
 Handle a restart of the server More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Components.Chat.ICustomCommandHandler
Task< string > HandleChatCommand (string commandName, string arguments, User sender, CancellationToken cancellationToken)
 Handle a chat command More...
 
+ + + + + + + +

+Public Attributes

override bool AlphaIsActive => true
 
override Models.CompileJob ActiveCompileJob => server?.Dmb.CompileJob
 
override? RebootState RebootState => server?.RebootState
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Protected Member Functions

override WatchdogReattachInformation CreateReattachInformation ()
 Create the WatchdogReattachInformation for the ISessionControllers. More...
 
override void DisposeAndNullControllers ()
 Call IDisposable.Dispose and null the fields for all ISessionControllers and set Running to false. More...
 
override ISessionController GetActiveController ()
 Get the active ISessionController. More...
 
override async Task InitControllers (Action callBeforeRecurse, Task chatTask, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
 Starts all ISessionControllers. More...
 
override async Task MonitorLifetimes (CancellationToken cancellationToken)
 The loop that watches the watchdog More...
 
- Protected Member Functions inherited from Tgstation.Server.Host.Components.Watchdog.WatchdogBase
 WatchdogBase (IChat chat, ISessionControllerFactory sessionControllerFactory, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IEventConsumer eventConsumer, IJobManager jobManager, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILogger logger, DreamDaemonLaunchParameters initialLaunchParameters, Api.Models.Instance instance, bool autoStart)
 Initializes a new instance of the WatchdogBase class. More...
 
async Task LaunchImplNoLock (bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
 Launches the watchdog. More...
 
void StartMonitor ()
 Call MonitorLifetimes(CancellationToken) and setup monitorCts and monitorTask. More...
 
async Task< bool > StopMonitor ()
 Stops MonitorLifetimes(CancellationToken). Doesn't kill the servers More...
 
async Task NotifyOfFailedReattach (bool inactiveReattachSuccess, CancellationToken cancellationToken)
 Send a chat message and log about a failed reattach operation and attempts another call to LaunchImplNoLock(bool, bool, WatchdogReattachInformation, CancellationToken). More...
 
async Task CheckLaunchResult (ISessionController controller, string serverName, CancellationToken cancellationToken)
 Check the LaunchResult of a given controller for errors and throw a JobException if any are detected. More...
 
+ + + +

+Private Member Functions

async Task< MonitorActionHandleMonitorWakeup (MonitorActivationReason reason, CancellationToken cancellationToken)
 
+ + + + +

+Private Attributes

ISessionController server
 The single ISessionController. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Properties inherited from Tgstation.Server.Host.Components.Watchdog.WatchdogBase
bool Running [get, protected set]
 
abstract bool AlphaIsActive [get]
 
abstract Models.CompileJob ActiveCompileJob [get]
 
DreamDaemonLaunchParameters ActiveLaunchParameters [get, protected set]
 
DreamDaemonLaunchParameters LastLaunchParameters [get, protected set]
 
abstract ? RebootState RebootState [get]
 
TaskCompletionSource< object > ActiveParametersUpdated [get, set]
 TaskCompletionSource<TResult> that completes when ActiveLaunchParameters are changed and we are Running. More...
 
SemaphoreSlim Semaphore [get]
 The SemaphoreSlim for the WatchdogBase. More...
 
ILogger Logger [get]
 The ILogger for the WatchdogBase. More...
 
IChat Chat [get]
 The IChat for the WatchdogBase More...
 
ISessionControllerFactory SessionControllerFactory [get]
 The ISessionControllerFactory for the WatchdogBase More...
 
IDmbFactory DmbFactory [get]
 The IDmbFactory for the WatchdogBase More...
 
IAsyncDelayer AsyncDelayer [get]
 The IAsyncDelayer for the WatchdogBase. More...
 
- Properties inherited from Tgstation.Server.Host.Components.Watchdog.IWatchdog
bool Running [get]
 If the watchdog is running More...
 
bool AlphaIsActive [get]
 If the alpha server is the active server More...
 
Models.CompileJob ActiveCompileJob [get]
 The CompileJob currently running on the server More...
 
DreamDaemonLaunchParameters ActiveLaunchParameters [get]
 The DreamDaemonLaunchParameters the active server is using More...
 
DreamDaemonLaunchParameters LastLaunchParameters [get]
 The DreamDaemonLaunchParameters to be applied More...
 
RebootStateRebootState [get]
 The Components.Watchdog.RebootState of the active server More...
 
+

Detailed Description

+

A IWatchdog that manages one server.

+ +

Definition at line 17 of file BasicWatchdog.cs.

+

Constructor & Destructor Documentation

+ +

◆ BasicWatchdog()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.BasicWatchdog (IChat chat,
ISessionControllerFactory sessionControllerFactory,
IDmbFactory dmbFactory,
IReattachInfoHandler reattachInfoHandler,
IDatabaseContextFactory databaseContextFactory,
IByondTopicSender byondTopicSender,
IEventConsumer eventConsumer,
IJobManager jobManager,
IServerControl serverControl,
IAsyncDelayer asyncDelayer,
ILogger< BasicWatchdoglogger,
DreamDaemonLaunchParameters initialLaunchParameters,
Api.Models.Instance instance,
bool autoStart 
)
+
+ +

Initializes a new instance of the ExperimentalWatchdog class.

+
Parameters
+ + + + + + + + + + + + + + + +
chatThe IChat for the WatchdogBase.
sessionControllerFactoryThe ISessionControllerFactory for the WatchdogBase.
dmbFactoryThe IDmbFactory for the WatchdogBase.
reattachInfoHandlerThe IReattachInfoHandler for the WatchdogBase.
databaseContextFactoryThe IDatabaseContextFactory for the WatchdogBase.
byondTopicSenderThe IByondTopicSender for the WatchdogBase.
eventConsumerThe IEventConsumer for the WatchdogBase.
jobManagerThe IJobManager for the WatchdogBase.
serverControlThe IServerControl for the WatchdogBase.
asyncDelayerThe IAsyncDelayer for the WatchdogBase.
loggerThe ILogger for the WatchdogBase.
initialLaunchParametersThe DreamDaemonLaunchParameters for the WatchdogBase.
instanceThe Api.Models.Instance for the WatchdogBase.
autoStartThe autostart value for the WatchdogBase.
+
+
+ +

Definition at line 50 of file BasicWatchdog.cs.

+
65  : base(
66  chat,
67  sessionControllerFactory,
68  dmbFactory,
73  jobManager,
74  serverControl,
75  asyncDelayer,
76  logger,
77  initialLaunchParameters,
78  instance,
79  autoStart)
80  { }
readonly bool autoStart
If the WatchdogBase should LaunchImplNoLock(bool, bool, WatchdogReattachInformation,...
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the ExperimentalWatchdog
+
readonly IJobManager jobManager
The IJobManager for the ExperimentalWatchdog
+
readonly IReattachInfoHandler reattachInfoHandler
The IReattachInfoHandler for the WatchdogBase
Definition: WatchdogBase.cs:90
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the ExperimentalWatchdog
Definition: WatchdogBase.cs:95
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the ExperimentalWatchdog
+
readonly Api.Models.Instance instance
The Api.Models.Instance for the WatchdogBase.
Definition: WatchdogBase.cs:85
+
+
+
+

Member Function Documentation

+ +

◆ CreateReattachInformation()

+ +
+
+ + + + + +
+ + + + + + + +
override WatchdogReattachInformation Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.CreateReattachInformation ()
+
+protectedvirtual
+
+
+ +

◆ DisposeAndNullControllers()

+ +
+
+ + + + + +
+ + + + + + + +
override void Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.DisposeAndNullControllers ()
+
+protectedvirtual
+
+
+ +

◆ GetActiveController()

+ +
+
+ + + + + +
+ + + + + + + +
override ISessionController Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.GetActiveController ()
+
+protectedvirtual
+
+
+ +

◆ HandleMonitorWakeup()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
async Task<MonitorAction> Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.HandleMonitorWakeup (MonitorActivationReason reason,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Definition at line 82 of file BasicWatchdog.cs.

+
83  {
84  switch (reason)
85  {
86  case MonitorActivationReason.ActiveServerCrashed:
87  string exitWord = server.TerminationWasRequested ? "exited" : "crashed";
88  if (server.RebootState == Watchdog.RebootState.Shutdown)
89  {
90  // the time for graceful shutdown is now
91  await Chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Server {0}! Exiting due to graceful termination request...", exitWord), cancellationToken).ConfigureAwait(false);
93  return MonitorAction.Exit;
94  }
95 
96  await Chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Server {0}! Rebooting...", exitWord), cancellationToken).ConfigureAwait(false);
97  return MonitorAction.Restart;
98  case MonitorActivationReason.ActiveServerRebooted:
99  var rebootState = server.RebootState;
101 
102  switch (rebootState)
103  {
104  case Watchdog.RebootState.Normal:
105  bool dmbUpdatePending = ActiveLaunchParameters != LastLaunchParameters;
106  return dmbUpdatePending ? MonitorAction.Restart : MonitorAction.Continue;
107  case Watchdog.RebootState.Restart:
108  return MonitorAction.Restart;
109  case Watchdog.RebootState.Shutdown:
110  // graceful shutdown time
111  await Chat.SendWatchdogMessage("Active server rebooted! Exiting due to graceful termination request...", cancellationToken).ConfigureAwait(false);
113  return MonitorAction.Exit;
114  default:
115  throw new InvalidOperationException($"Invalid reboot state: {rebootState}");
116  }
117 
118  case MonitorActivationReason.ActiveLaunchParametersUpdated:
119  case MonitorActivationReason.NewDmbAvailable:
120  await server.SetRebootState(Watchdog.RebootState.Restart, cancellationToken).ConfigureAwait(false);
121  return MonitorAction.Continue;
122  case MonitorActivationReason.InactiveServerCrashed:
123  case MonitorActivationReason.InactiveServerRebooted:
124  case MonitorActivationReason.InactiveServerStartupComplete:
125  throw new NotSupportedException($"Unsupported activation reason: {reason}");
126  default:
127  throw new InvalidOperationException($"Invalid activation reason: {reason}");
128  }
129  }
+ +
Task< bool > SetRebootState(RebootState newRebootState, CancellationToken cancellationToken)
Attempts to change the current RebootState to newRebootState
+
Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured watchdog channels
Definition: Chat.cs:514
+
ISessionController server
The single ISessionController.
+ + +
bool TerminationWasRequested
If the DreamDaemon instance sent a
+
MonitorActivationReason
Reasons for the monitor to wake up
+
MonitorAction
The action for the monitor loop to take when control is returned to it
Definition: MonitorAction.cs:6
+
void ResetRebootState()
Changes RebootState to Components.Watchdog.RebootState.Normal without telling the DMAPI
+
override void DisposeAndNullControllers()
Call IDisposable.Dispose and null the fields for all ISessionControllers and set Running to false.
+
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ActiveLaunchParameters, Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.DisposeAndNullControllers(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.LastLaunchParameters, Tgstation.Server.Host.Components.Watchdog.ISessionController.RebootState, Tgstation.Server.Host.Components.Watchdog.ISessionController.ResetRebootState(), Tgstation.Server.Host.Components.Chat.Chat.SendWatchdogMessage(), Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.server, Tgstation.Server.Host.Components.Watchdog.ISessionController.SetRebootState(), and Tgstation.Server.Host.Components.Watchdog.ISessionController.TerminationWasRequested.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.MonitorLifetimes().

+ +
+
+ +

◆ InitControllers()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
override async Task Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.InitControllers (Action callBeforeRecurse,
Task chatTask,
WatchdogReattachInformation reattachInfo,
CancellationToken cancellationToken 
)
+
+protectedvirtual
+
+ +

Starts all ISessionControllers.

+ +

Implements Tgstation.Server.Host.Components.Watchdog.WatchdogBase.

+ +

Definition at line 151 of file BasicWatchdog.cs.

+
152  {
153  // good ole sanity, should never fucking trigger but i don't trust myself even though I should
154  // TODO: Unit test this instead?
155  if (server != null)
156  throw new InvalidOperationException("Entered LaunchNoLock with server not being null!");
157 
158  // don't need a new dmb if reattaching
159  var doesntNeedNewDmb = reattachInfo?.Alpha != null && reattachInfo?.Bravo != null;
160  var dmbToUse = doesntNeedNewDmb ? null : DmbFactory.LockNextDmb(1);
161 
162  var serverToReattach = reattachInfo?.Alpha ?? reattachInfo?.Bravo;
163  var serverToKill = reattachInfo?.Bravo ?? reattachInfo?.Alpha;
164 
165  // vice versa
166  if (reattachInfo?.AlphaIsActive == false)
167  {
168  var temp = serverToReattach;
169  serverToReattach = serverToKill;
170  serverToKill = temp;
171  }
172 
173  // if this try catches something, both servers are killed
174  bool inactiveServerWasKilled = false;
175  try
176  {
177  // start the alpha server task, either by launch a new process or attaching to an existing one
178  // The tasks returned are mainly for writing interop files to the directories among other things and should generally never fail
179  // The tasks pertaining to server startup times are in the ISessionControllers
180  Task<ISessionController> serverLaunchTask, inactiveReattachTask;
181  if (!doesntNeedNewDmb)
182  serverLaunchTask = SessionControllerFactory.LaunchNew(ActiveLaunchParameters, dmbToUse, null, true, true, false, cancellationToken);
183  else
184  serverLaunchTask = SessionControllerFactory.Reattach(serverToReattach, cancellationToken);
185 
186  bool thereIsAnInactiveServerToKill = serverToKill != null;
187  if (thereIsAnInactiveServerToKill)
188  inactiveReattachTask = SessionControllerFactory.Reattach(serverToKill, cancellationToken);
189  else
190  inactiveReattachTask = Task.FromResult<ISessionController>(null);
191 
192  // retrieve the session controller
193  server = await serverLaunchTask.ConfigureAwait(false);
194 
195  // failed reattaches will return null
197 
198  var inactiveServerController = await inactiveReattachTask.ConfigureAwait(false);
199  inactiveServerController?.Dispose();
200  inactiveServerWasKilled = inactiveServerController != null;
201 
202  // possiblity of null servers due to failed reattaches
203  if (server == null)
204  {
205  callBeforeRecurse();
206  await NotifyOfFailedReattach(thereIsAnInactiveServerToKill && !inactiveServerWasKilled, cancellationToken).ConfigureAwait(false);
207  return;
208  }
209 
210  await CheckLaunchResult(server, "Server", cancellationToken).ConfigureAwait(false);
211 
213  }
214  catch
215  {
216  // kill the controllers
217  bool serverWasActive = server != null;
219 
220  // server didn't get control of this dmb
221  if (dmbToUse != null && !serverWasActive)
222  dmbToUse.Dispose();
223 
224  if (serverToKill != null && !inactiveServerWasKilled)
225  serverToKill.Dmb.Dispose();
226  throw;
227  }
228  }
+ +
Task< ISessionController > Reattach(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Create a ISessionController from an existing DreamDaemon instance
+
ISessionControllerFactory SessionControllerFactory
The ISessionControllerFactory for the WatchdogBase
Definition: WatchdogBase.cs:70
+
void EnableCustomChatCommands()
Enables the reading of custom chat commands from the ISessionController
+
ISessionController server
The single ISessionController.
+
void SetHighPriority()
Set's the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass....
+ +
Task< ISessionController > LaunchNew(DreamDaemonLaunchParameters launchParameters, IDmbProvider dmbProvider, IByondExecutableLock currentByondLock, bool primaryPort, bool primaryDirectory, bool apiValidate, CancellationToken cancellationToken)
Create a ISessionController from a freshly launch DreamDaemon instance
+
IDmbProvider LockNextDmb(int lockCount)
Gets the next IDmbProvider
Definition: DmbFactory.cs:149
+
async Task NotifyOfFailedReattach(bool inactiveReattachSuccess, CancellationToken cancellationToken)
Send a chat message and log about a failed reattach operation and attempts another call to LaunchImpl...
+
async Task CheckLaunchResult(ISessionController controller, string serverName, CancellationToken cancellationToken)
Check the LaunchResult of a given controller for errors and throw a JobException if any are detected...
+
override void DisposeAndNullControllers()
Call IDisposable.Dispose and null the fields for all ISessionControllers and set Running to false.
+
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ActiveLaunchParameters, Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.Alpha, Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.AlphaIsActive, Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.Bravo, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.CheckLaunchResult(), Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.DisposeAndNullControllers(), Tgstation.Server.Host.Components.Watchdog.ISessionController.EnableCustomChatCommands(), Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew(), Tgstation.Server.Host.Components.Compiler.DmbFactory.LockNextDmb(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.NotifyOfFailedReattach(), Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.Reattach(), Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.server, and Tgstation.Server.Host.Core.IProcessBase.SetHighPriority().

+ +
+
+ +

◆ MonitorLifetimes()

+ +
+
+ + + + + +
+ + + + + + + + +
override async Task Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.MonitorLifetimes (CancellationToken cancellationToken)
+
+protectedvirtual
+
+ +

The loop that watches the watchdog

+ +

Implements Tgstation.Server.Host.Components.Watchdog.WatchdogBase.

+ +

Definition at line 231 of file BasicWatchdog.cs.

+
232  {
233  Logger.LogTrace("Entered MonitorLifetimes");
234 
235  // this function is responsible for calling HandlerMonitorWakeup when necessary and manitaining the MonitorState
236  var iteration = 1;
237  for (MonitorAction nextAction = MonitorAction.Continue; nextAction != MonitorAction.Exit; ++iteration)
238  {
239  // always start out with continue
240  nextAction = MonitorAction.Continue;
241 
242  // dump some info to the logs
243  Logger.LogDebug("Iteration {0} of monitor loop", iteration);
244  try
245  {
246  Logger.LogDebug("Server Compile Job ID: {0}", server.Dmb.CompileJob.Id);
247 
248  // load the activation tasks into local variables
249  Task activeServerLifetime = server.Lifetime;
250  var activeServerReboot = server.OnReboot;
251  Task activeLaunchParametersChanged = ActiveParametersUpdated.Task;
252  var newDmbAvailable = DmbFactory.OnNewerDmb;
253 
254  // cancel waiting if requested
255  var cancelTcs = new TaskCompletionSource<object>();
256  using (cancellationToken.Register(() => cancelTcs.SetCanceled()))
257  {
258  var toWaitOn = Task.WhenAny(activeServerLifetime, activeServerReboot, newDmbAvailable, cancelTcs.Task, activeLaunchParametersChanged);
259 
260  // wait for something to happen
261  await toWaitOn.ConfigureAwait(false);
262  cancellationToken.ThrowIfCancellationRequested();
263  }
264 
265  var chatTask = Task.CompletedTask;
266  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
267  {
268  // always run HandleMonitorWakeup from the context of the semaphore lock
269  // multiple things may have happened, handle them one at a time
270  for (var moreActivationsToProcess = true; moreActivationsToProcess && (nextAction == MonitorAction.Continue || nextAction == MonitorAction.Skip);)
271  {
272  MonitorActivationReason activationReason = default; // this will always be assigned before being used
273 
274  // process the tasks in this order and call HandlerMonitorWakup for each
275  bool CheckActivationReason(ref Task task, MonitorActivationReason testActivationReason)
276  {
277  var taskCompleted = task?.IsCompleted == true;
278  task = null;
279  if (nextAction == MonitorAction.Skip)
280  nextAction = MonitorAction.Continue;
281  else if (taskCompleted)
282  {
283  activationReason = testActivationReason;
284  return true;
285  }
286 
287  return false;
288  }
289 
290  if (CheckActivationReason(ref activeServerLifetime, MonitorActivationReason.ActiveServerCrashed)
291  || CheckActivationReason(ref activeServerReboot, MonitorActivationReason.ActiveServerRebooted)
292  || CheckActivationReason(ref newDmbAvailable, MonitorActivationReason.NewDmbAvailable)
293  || CheckActivationReason(ref activeLaunchParametersChanged, MonitorActivationReason.ActiveLaunchParametersUpdated))
294  nextAction = await HandleMonitorWakeup(activationReason, cancellationToken).ConfigureAwait(false);
295  else
296  moreActivationsToProcess = false;
297  }
298  }
299 
300  // full reboot required
301  if (nextAction == MonitorAction.Restart)
302  {
303  Logger.LogDebug("Next state action is to restart");
305 
306  for (var retryAttempts = 1; nextAction == MonitorAction.Restart; ++retryAttempts)
307  {
308  Exception launchException = null;
309  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
310  try
311  {
312  // use LaunchImplNoLock without announcements or restarting the monitor
313  await LaunchImplNoLock(false, false, null, cancellationToken).ConfigureAwait(false);
314  if (Running)
315  {
316  Logger.LogDebug("Relaunch successful, resetting monitor state...");
317  break; // continue on main loop
318  }
319  }
320  catch (OperationCanceledException)
321  {
322  throw;
323  }
324  catch (Exception e)
325  {
326  launchException = e;
327  }
328 
329  await chatTask.ConfigureAwait(false);
330  if (!Running)
331  {
332  if (launchException == null)
333  Logger.LogWarning("Failed to automatically restart the watchdog! Attempt: {0}", retryAttempts);
334  else
335  Logger.LogWarning("Failed to automatically restart the watchdog! Attempt: {0}, Exception: {1}", retryAttempts, launchException);
336  var retryDelay = Math.Min(Math.Pow(2, retryAttempts), 3600); // max of one hour, increasing by a power of 2 each time
337  chatTask = Chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Failed to restart watchdog (Attempt: {0}), retrying in {1} seconds...", retryAttempts, retryDelay), cancellationToken);
338  await Task.WhenAll(AsyncDelayer.Delay(TimeSpan.FromSeconds(retryDelay), cancellationToken), chatTask).ConfigureAwait(false);
339  }
340  }
341  }
342  }
343  catch (OperationCanceledException)
344  {
345  Logger.LogDebug("Monitor cancelled");
346  break;
347  }
348  catch (Exception e)
349  {
350  // really, this should NEVER happen
351  Logger.LogError("Monitor crashed! Iteration: {0}, NextAction: {1}, Exception: {2}", iteration, nextAction, e);
352  await Chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Monitor crashed, this should NEVER happen! Please report this, full details in logs! Restarting monitor... Error: {0}", e.Message), cancellationToken).ConfigureAwait(false);
353  }
354  }
355 
356  Logger.LogTrace("Monitor exiting...");
357  }
+ +
CompileJob CompileJob
The CompileJob of the .dmb
Definition: IDmbProvider.cs:29
+
Task< int > Lifetime
The Task<TResult> resulting in the exit code of the process
Definition: IProcessBase.cs:14
+
async Task LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
Launches the watchdog.
+ + + +
SemaphoreSlim Semaphore
The SemaphoreSlim for the WatchdogBase.
Definition: WatchdogBase.cs:55
+ +
async Task< MonitorAction > HandleMonitorWakeup(MonitorActivationReason reason, CancellationToken cancellationToken)
+
Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured watchdog channels
Definition: Chat.cs:514
+
ISessionController server
The single ISessionController.
+ +
TaskCompletionSource< object > ActiveParametersUpdated
TaskCompletionSource<TResult> that completes when ActiveLaunchParameters are changed and we are Runni...
Definition: WatchdogBase.cs:50
+
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+
MonitorActivationReason
Reasons for the monitor to wake up
+
ILogger Logger
The ILogger for the WatchdogBase.
Definition: WatchdogBase.cs:60
+
Task OnReboot
A Task that completes when the server calls /world/Reboot()
+
MonitorAction
The action for the monitor loop to take when control is returned to it
Definition: MonitorAction.cs:6
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
override void DisposeAndNullControllers()
Call IDisposable.Dispose and null the fields for all ISessionControllers and set Running to false.
+
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ActiveParametersUpdated, Tgstation.Server.Host.Components.IDmbProvider.CompileJob, Tgstation.Server.Host.Core.AsyncDelayer.Delay(), Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.DisposeAndNullControllers(), Tgstation.Server.Host.Components.Watchdog.ISessionController.Dmb, Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.HandleMonitorWakeup(), Tgstation.Server.Api.Models.Internal.CompileJob.Id, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.LaunchImplNoLock(), Tgstation.Server.Host.Core.IProcessBase.Lifetime, Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Logger, Tgstation.Server.Host.Components.Compiler.DmbFactory.OnNewerDmb, Tgstation.Server.Host.Components.Watchdog.ISessionController.OnReboot, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Running, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Semaphore, Tgstation.Server.Host.Components.Chat.Chat.SendWatchdogMessage(), and Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.server.

+ +
+
+

Member Data Documentation

+ +

◆ ActiveCompileJob

+ +
+
+ + + + +
override Models.CompileJob Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.ActiveCompileJob => server?.Dmb.CompileJob
+
+ +

+ +

Definition at line 23 of file BasicWatchdog.cs.

+ +
+
+ +

◆ AlphaIsActive

+ +
+
+ + + + +
override bool Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.AlphaIsActive => true
+
+
+ +

◆ RebootState

+ +
+
+ + + + +
override? RebootState Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.RebootState => server?.RebootState
+
+ +

+ +

Definition at line 26 of file BasicWatchdog.cs.

+ +
+
+ +

◆ server

+ + +
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.png new file mode 100644 index 0000000000000000000000000000000000000000..b01dca1125f6dc841abdc36164122c5916feb5c6 GIT binary patch literal 4870 zcmcgw3pmtS|7TTtb=zOtBDvJhRN4)Z+?h6mCZg>ocWH$ZQ4D6xlntXPdPhtV%7)r< zOBoqv)Qq(fQ^}=VMlLhS-Czb|<~@UY>)D?7dH4DMpZEJbKfm+)J?EV7`JMCqTt@sp z2ip}2Dhe_(GAq!#QTt_NmcXE0xl|7PrQal(f}8R_`-9dJi3Bv?4@`t6KD`23b5~_$ z<>L4@4e+@1?0$y>GN6+*8lN51myubWj7I%*FkE)9z3*`AbHzn324A_9OEfv>Ht#iD zLhk3Dfld*9R^(ZJI6&CjV9;o=w;`!iWWUgQxTe8iuhqF|UK;r}xn~PEY76=YbVgS8 zZt?~L*y~&O<>)c<0Q( zgq7bG@-Is-FI7eOl*P?p z{i0~1v1&p=?@WDdK_Z*)G+i#}=JYC1j@b?#VCcd5N!S}BQ)}4B8}!u14d~bjCAdrI zknhnb@N70QW;d6=4CJ&=<@=!SJ2CYy)l-eB{Pd8mmg!4MFB5x>^W}%z`dtLIPt832 zCf1sq!5Rz zt;0h*Vt7!|;~w~g4%OI@f9O=85-;-BA=JR(kkA6vkoFXTr-e1y{5B-}tFjTCfFw~u z8G{;0aLrNw$FV99dQ7vG*fL3;cv7GU)yBUe5vvZiMPQU{JKR>#pdv!8DPOSjNlUONF#WNK_eLnxF>`*sDNg60LK&#(Z6TGnwS1+7o!C_}Xu+xlYr)zJF+jMWgySG)@qz-dpv(?aVJ_v3#v zq>f=X!%f*9mu4q@CNmgdElombl$U2lPpOu$k(qRhsPgg#elvE|hrFB%ipHl*_j?nu z^TEDuW;MeuNx4LZupQ1H?in~Vdo8A4bu0K*CE8FyY{SdqWpys&Cj?=t)jxX-kNw;^ z<<}%1G#nb$(~wj@b`*aX5wQ;}S`X*Bhb$@Ntbx!E^zi+TWLr`C{!0cLj1ogBG&Es! zMlPsND`CWz4qg^$Azynu^;WhV=eeY3N% zq9SxhrHqS$^vz=30+KA4z4BWZ1+DN$*HJi`|&`62}t#62pA zNNFQcLkmQB*5pR%{f^C|H6RXZexm^5cSv?Ih(_YMXb?|vCs8|p0h-KZv`lHwgBH9GO60_y3AqJG4VznGMmVYNoWhfpdJnrs6VmZ{3x8_rTnh{nc%FS}KL01Rc9N zX5h)6af7|1rYA1(w=oQo(PQ69Rf7oyyNLPPacd=nF!jKWenFhU$^F>SQrGN> za#1l+`Sw-*vOKuU<{#Yc6WMp|$(d5f(g9IXeO`t-1&s{sMIxN96U@~Gqi6Vvf^{{s z$YQ6-it9LotB1S-mXt(Y>n1RwBFSwbx-fnM7o_r94hp7uwyV72UgTSbMLwSmqVmUd zHN7wF&u3e*Uk*Ze><>vjo23vhuwe}hS}@Y6tz92Bnm=l(%CF^2kxD+)d-^%2Ek1)U zQnJ8Xjt8MwPL5y?ElEUAGfwN0P?NJrScfTP;W)ivj1k?PUCT%y`cguIV4>wIqsBRFg%5&pMcW@xOP0_#REeNtZ(*K-3dRGs1uY^Zv#=7$FDeZt9NZ{ zSzGukwq{p-%Mgy1K_RF^jyk>5$>tg+nO(g%=@uUk#0l;?y_@U0@^K)hgI_g6i*m(y zR1SXgW-`vPj9Is`82^Y;9b_4$2(7x2fuOdLh#U(}>#|c;KG@N9j*&l_S>9!~2Q`1% z84qjLhU-Cz)~w4Pm#&^b6j0xFYa2^UaRa3T76@nKA=9Ys1hx{5tJ~R2s?~O|W$PGV zNlr9sw{b#9Yj=Sa=SGFfAGmlNAAD2yag<1&i^ab8Z!*NZwd~7kZ&!VlZJ}0Bafdmk zC!o9AHzF?)f7%oA#)!mC%Vqoa^&hy7K)wXrj`P8-$;~~;M6KvS~;r>lEEz$$7R${)}_WGoF zSf0<6#}ACRM)mb_&CnTrnbs`7Y2=iYPS!QuTSVQ)&av=hRC1&p?!F z0up_^b)q{{l1EQVryw%T)JrUdV^gEcHaZ888aj|S2F+PRCP)j6FPGc{Y7xld@?VVL zuvTthoP9{URgHuBUluoj5HVM2b-Nq zM*O(&t-et3snTX~MLo$`FymJkhxn17Slw-j5A5(>3(Zi=Cw!YooL_r2-45?1Y%ffY zo8mss<)zws&FvsQ-WK+560%Rt9!6~~>*-VBeMgzaH0@HN3L{Yg54f+gc&7k;0+MyA zuW)GVi{~X~BJ372TR}yqUeeqraP_df15`weO(!0~bn2p5Ij4dO3d>$wL8EnNcu9r$ zLWJ|eAp!nn0**52DQk}>TF1E!zqMgy$rb3HZMQ^UtcwYJG}Swr=7=;AG_?e=faC&~ zvLwU^?!b1~V$8lIu|#53zTGN@hff%3&ZU|T&b!pWEPuoCI-r~Plirbd^i{L^fA)Lj z*ChQ?GFO6L>#4AJ^7rU5oP<&&>e=Lpq|VtOxyS3EVYT6GxNGw&QN@{cQunj%3Jv-v z^XTmhLL{rvQC;ZDGn9HGuk`|8Xn#P9ljl$HHt@6ThX1-yKU&Z^m(`iuF@JAd0EigD za^3#9Jqxub9{=36eNbL4^=11;K77rgeQE7trkdu>-Twl=3jDk;4CU8yjx?*SjI#n4 zGfC<-pD4f0>Wnaz%-Os@N{q-@w57KQCE;nhiBBrd^TPKUpLxO27bA zpWd*wgrNips==>(z%!EDSSZ+7b*3}ZGp?$jyW?1*NLXC@Y7X6bdKkPKY+1t@5Xh(Fjox|Oe(NtZ91uw z7u8YCvm$80I`Zi@^rgib?kdIeCn*=P9{g&Z4s>$wsoVk|Hflw&%Bt`iV8f^gY)oS| zaCq1=BTTzvACV={>^kj5Hz^IwJlp6@^B4l)elVM_^AX$=qf&5Vstaq_x}KkMJpK+E z-aGgkGo7Gj8Rj;rUU<4Kbo#hDL~^I7<13yGDCYj=tCaeP*Elq2obX#4sv+QgTCo$e z)XmQ@mT&EAix<2qoIkzuxK~*=AH1ZvW~Ld;A@wZA<@Jn{?)Q*nT`7U{0`ggX{f$y&zB_#fT;Z#=!pkJG{={wLjlb7Q|Gy=Jwst_}@A8WN E7epugG5`Po literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller-members.html new file mode 100644 index 0000000000..dbfecc74fd --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller-members.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.DeadSessionController Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Watchdog.DeadSessionController, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + +
ApiValidationStatusTgstation.Server.Host.Components.Watchdog.DeadSessionController
ClosePortOnRebootTgstation.Server.Host.Components.Watchdog.DeadSessionController
DeadSessionController(IDmbProvider dmbProvider)Tgstation.Server.Host.Components.Watchdog.DeadSessionController
Dispose()Tgstation.Server.Host.Components.Watchdog.DeadSessionController
disposedTgstation.Server.Host.Components.Watchdog.DeadSessionControllerprivate
DmbTgstation.Server.Host.Components.Watchdog.DeadSessionController
EnableCustomChatCommands()Tgstation.Server.Host.Components.Watchdog.DeadSessionController
IsPrimaryTgstation.Server.Host.Components.Watchdog.DeadSessionController
LaunchResultTgstation.Server.Host.Components.Watchdog.DeadSessionController
LifetimeTgstation.Server.Host.Components.Watchdog.DeadSessionController
OnRebootTgstation.Server.Host.Components.Watchdog.DeadSessionController
PortTgstation.Server.Host.Components.Watchdog.DeadSessionController
RebootStateTgstation.Server.Host.Components.Watchdog.DeadSessionController
Release()Tgstation.Server.Host.Components.Watchdog.DeadSessionController
ResetRebootState()Tgstation.Server.Host.Components.Watchdog.DeadSessionController
SendCommand(string command, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.DeadSessionController
SetHighPriority()Tgstation.Server.Host.Components.Watchdog.DeadSessionController
SetPort(ushort newPort, CancellationToken cancellatonToken)Tgstation.Server.Host.Components.Watchdog.DeadSessionController
SetRebootState(RebootState newRebootState, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.DeadSessionController
TerminationWasRequestedTgstation.Server.Host.Components.Watchdog.DeadSessionController
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html new file mode 100644 index 0000000000..76b1901f8c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html @@ -0,0 +1,700 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.DeadSessionController Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.DeadSessionController Class Reference
+
+
+ +

Implements a fake "dead" ISessionController + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Watchdog.DeadSessionController:
+
+
+ + +Tgstation.Server.Host.Components.Watchdog.ISessionController +Tgstation.Server.Host.Core.IProcessBase +IDisposable + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 DeadSessionController (IDmbProvider dmbProvider)
 Construct a DeadSessionController More...
 
void Dispose ()
 
void EnableCustomChatCommands ()
 Enables the reading of custom chat commands from the ISessionController More...
 
ReattachInformation Release ()
 Releases the IProcess without terminating it. Also calls System.IDisposable.Dispose More...
 
void ResetRebootState ()
 Changes RebootState to Components.Watchdog.RebootState.Normal without telling the DMAPI More...
 
Task< string > SendCommand (string command, CancellationToken cancellationToken)
 Sends a command to DreamDaemon through /world/Topic() More...
 
void SetHighPriority ()
 Set's the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass.AboveNormal More...
 
Task< bool > SetPort (ushort newPort, CancellationToken cancellatonToken)
 Causes the world to start listening on a newPort More...
 
Task< bool > SetRebootState (RebootState newRebootState, CancellationToken cancellationToken)
 Attempts to change the current RebootState to newRebootState More...
 
+ + + + + + + + + + + +

+Public Attributes

bool IsPrimary => false
 
bool TerminationWasRequested => false
 
ApiValidationStatus ApiValidationStatus => throw new NotSupportedException()
 
ushort? Port => null
 
RebootState RebootState => throw new NotSupportedException()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

Task< LaunchResultLaunchResult [get]
 
IDmbProvider Dmb [get]
 
bool ClosePortOnReboot [get, set]
 
Task OnReboot [get]
 
Task< int > Lifetime [get]
 
- Properties inherited from Tgstation.Server.Host.Components.Watchdog.ISessionController
Task< LaunchResultLaunchResult [get]
 A Task that completes when DreamDaemon starts pumping the windows message queue after loading a .dmb or when it crashes More...
 
bool IsPrimary [get]
 If the IDmbProvider.PrimaryDirectory of Dmb is being used More...
 
bool TerminationWasRequested [get]
 If the DreamDaemon instance sent a More...
 
ApiValidationStatus ApiValidationStatus [get]
 The DMAPI Components.Watchdog.ApiValidationStatus More...
 
IDmbProvider Dmb [get]
 The IDmbProvider being used More...
 
ushort? Port [get]
 The current port DreamDaemon is listening on More...
 
bool ClosePortOnReboot [get, set]
 If the port should be rotated off when the world reboots More...
 
RebootState RebootState [get]
 The current RebootState More...
 
Task OnReboot [get]
 A Task that completes when the server calls /world/Reboot() More...
 
- Properties inherited from Tgstation.Server.Host.Core.IProcessBase
Task< int > Lifetime [get]
 The Task<TResult> resulting in the exit code of the process More...
 
+ + + + +

+Private Attributes

bool disposed
 If the DeadSessionController was Disposed More...
 
+

Detailed Description

+

Implements a fake "dead" ISessionController

+ +

Definition at line 10 of file DeadSessionController.cs.

+

Constructor & Destructor Documentation

+ +

◆ DeadSessionController()

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Components.Watchdog.DeadSessionController.DeadSessionController (IDmbProvider dmbProvider)
+
+ +

Construct a DeadSessionController

+
Parameters
+ + +
dmbProviderThe value of Dmb
+
+
+ +

Definition at line 55 of file DeadSessionController.cs.

+
56  {
57  Dmb = dmbProvider ?? throw new ArgumentNullException(nameof(dmbProvider));
58  LaunchResult = Task.FromResult(new LaunchResult
59  {
60  StartupTime = TimeSpan.FromSeconds(0)
61  });
62  Lifetime = Task.FromResult(-1);
63  OnReboot = new TaskCompletionSource<object>().Task;
64  }
+ + + +
+

References Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Dmb, Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Lifetime, and Tgstation.Server.Host.Components.Watchdog.DeadSessionController.OnReboot.

+ +
+
+

Member Function Documentation

+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Dispose ()
+
+ +

+ +

Definition at line 67 of file DeadSessionController.cs.

+
68  {
69  lock (this)
70  {
71  if (disposed)
72  return;
73  disposed = true;
74  }
75 
76  Dmb.Dispose();
77  }
+
bool disposed
If the DeadSessionController was Disposed
+
+

References Tgstation.Server.Host.Components.Watchdog.DeadSessionController.disposed, and Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Dmb.

+ +
+
+ +

◆ EnableCustomChatCommands()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.DeadSessionController.EnableCustomChatCommands ()
+
+ +

Enables the reading of custom chat commands from the ISessionController

+ +

Implements Tgstation.Server.Host.Components.Watchdog.ISessionController.

+ +
+
+ +

◆ Release()

+ +
+
+ + + + + + + +
ReattachInformation Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Release ()
+
+ +

Releases the IProcess without terminating it. Also calls System.IDisposable.Dispose

+ +

Implements Tgstation.Server.Host.Components.Watchdog.ISessionController.

+ +
+
+ +

◆ ResetRebootState()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.DeadSessionController.ResetRebootState ()
+
+
+ +

◆ SendCommand()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<string> Tgstation.Server.Host.Components.Watchdog.DeadSessionController.SendCommand (string command,
CancellationToken cancellationToken 
)
+
+ +

Sends a command to DreamDaemon through /world/Topic()

+ +

Implements Tgstation.Server.Host.Components.Watchdog.ISessionController.

+ +
+
+ +

◆ SetHighPriority()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.DeadSessionController.SetHighPriority ()
+
+ +

Set's the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass.AboveNormal

+ +

Implements Tgstation.Server.Host.Core.IProcessBase.

+ +
+
+ +

◆ SetPort()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<bool> Tgstation.Server.Host.Components.Watchdog.DeadSessionController.SetPort (ushort newPort,
CancellationToken cancellatonToken 
)
+
+ +

Causes the world to start listening on a newPort

+ +

Implements Tgstation.Server.Host.Components.Watchdog.ISessionController.

+ +
+
+ +

◆ SetRebootState()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<bool> Tgstation.Server.Host.Components.Watchdog.DeadSessionController.SetRebootState (RebootState newRebootState,
CancellationToken cancellationToken 
)
+
+ +

Attempts to change the current RebootState to newRebootState

+ +

Implements Tgstation.Server.Host.Components.Watchdog.ISessionController.

+ +
+
+

Member Data Documentation

+ +

◆ ApiValidationStatus

+ +
+
+ + + + +
ApiValidationStatus Tgstation.Server.Host.Components.Watchdog.DeadSessionController.ApiValidationStatus => throw new NotSupportedException()
+
+ +

+ +

Definition at line 22 of file DeadSessionController.cs.

+ +
+
+ +

◆ disposed

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.DeadSessionController.disposed
+
+private
+
+
+ +

◆ IsPrimary

+ +
+
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.DeadSessionController.IsPrimary => false
+
+ +

+ +

Definition at line 16 of file DeadSessionController.cs.

+ +
+
+ +

◆ Port

+ +
+
+ + + + +
ushort? Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Port => null
+
+ +

+ +

Definition at line 28 of file DeadSessionController.cs.

+ +
+
+ +

◆ RebootState

+ +
+
+ + + + +
RebootState Tgstation.Server.Host.Components.Watchdog.DeadSessionController.RebootState => throw new NotSupportedException()
+
+ +

+ +

Definition at line 38 of file DeadSessionController.cs.

+ +
+
+ +

◆ TerminationWasRequested

+ +
+
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.DeadSessionController.TerminationWasRequested => false
+
+ +

+ +

Definition at line 19 of file DeadSessionController.cs.

+ +
+
+

Property Documentation

+ +

◆ ClosePortOnReboot

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.DeadSessionController.ClosePortOnReboot
+
+getset
+
+ +

+ +

Definition at line 32 of file DeadSessionController.cs.

+
32  {
33  get => false;
34  set => throw new NotSupportedException();
35  }
+
+
+ +

◆ Dmb

+ +
+
+ + + + + +
+ + + + +
IDmbProvider Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Dmb
+
+get
+
+
+ +

◆ LaunchResult

+ +
+
+ + + + + +
+ + + + +
Task<LaunchResult> Tgstation.Server.Host.Components.Watchdog.DeadSessionController.LaunchResult
+
+get
+
+ +

+ +

Definition at line 13 of file DeadSessionController.cs.

+
13 { get; }
+
+
+ +

◆ Lifetime

+ +
+
+ + + + + +
+ + + + +
Task<int> Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Lifetime
+
+get
+
+
+ +

◆ OnReboot

+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Components.Watchdog.DeadSessionController.OnReboot
+
+get
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..aa17614b2b552dc50db4afa01584ae661e7119df GIT binary patch literal 2311 zcmdUxc~sL^7RLix5Cs%bfgsS~7i2)HP!<7!C`*!`RmuQXWGPf4$|eN~1X93?fM`Pa zrIf`HtQtgu$RZ(Zng|LB2$U@m2(pAl)~JLC1W1E3({nn1^q-l3`p$Xp-S^%-_uPBV z=X~!=cXLInY=>`$!C)#N#@QVPlY?Y7Yugst`oa5gvTW0IJL%~nl}csi+qoqixiM2_ zeVQy5>$7yep6s|S+TGOyCUe>xeXX8f%C53O=i{Dux%vG0m?tK?To`Hecxlesq*Ioh z1!vJ}9^_RmAdJUMwNsf{?kC(&7#(m!7(s{~-PaK|5DLLbx6lV&scK-}%JBFXt|2a}>28>W^e&3`LardtN;xO!u%p2}4m2cBb6M0F-fOID{}f zggRklU{ttgCv0P@KTPS0Qt(#R^|CTg`4K0$oavZ8;%C_FOcbmEqX(1K2Q%#6c12z0 zl5QbC;tZGjUY`WBhEOnBy#MuiO$R8P}&2YKya@9C-L7?#@~b{HVlhx#64|g z3*Ro@M%Yijc@)u*e3wMQlIuEh2J5};%C30 zya^e%@(K=C{bGRp;P~E}3n5H;Qnc6VUV)UJFdqcgy9vgub0*RLE zRt#=%HT@^5aNG}NYe~t%bUVq4^xNS>*)S3M0TJG>DWVH;ggy$@nNooG3j>o2Kf91b zxfO_fx;C?5*$H+BF0`*U53VfgfZNgdxp?kb1T0A9Jf$ zZ`|r1SbiI(^8GnP^RUBEN`(XeKv{a^`u=8QdK_W6v}_=Rq71f2hG2F42p78&EmUZ% z%-{n}@{BDhF_qQ)Jj~@BTp;2I5_b|Y-7Irdqoe(i z$_{ckiCd_3=v4FG?2Vf!1-gVEO02qzj6h@~{zEPawd6+SFmCYNvlpsB-b2(8*= z-MUgSCZu`Krq&(mmBiO?^0=hkyxtvexbMxRdv5C>(60L$*Q;DuZ`T}2j;d}AecROI zr+Ihn<@;;2z9sW!{(vfwz5?yZ0DycrxSEiN$R5^xR}2XX4M1e)U|^)?yA}A^oE(JB zyNv*4g|+e!&|M!yeiF1lD6%i{UuvxjTT^-l+YM8f$(NeHfALmUnuUD83m1&BT>0Nf zFg)b&|B$dh(Z}VZsOePvE#pF^d7ueVppywnV#VB`OCXl#3lPB78GyXRyVEva3u)NOH@;6m zWduIt5Ud*G1WD#m{~+Aib)>Vs#rD)f=QZcYm+!?e49+wE1X;WE@?bM%oOHjtxmL%% z)=g+{6LRI;%tLf@{^Z@WO}6S0rta-YUohivJ#Iwo270UJ~V;AVIkB*+r~deZ+kdWF_Jedw(6|5s&zQ(k6Ch zQ7zO%>r>I^65H8f!i7n`)C*9Yt({Kvay(oL1xsplr{Y#~EO#%8c1qZM3|katSuh7A zpc7su`Oz6 zUl|^suc%SM`vSO8c}*F&uN3S`yy?O O3k-B|b$;v^aP>DoZ%Q@* literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog-members.html new file mode 100644 index 0000000000..4358389d2e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog-members.html @@ -0,0 +1,127 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActiveCompileJobTgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog
ActiveLaunchParametersTgstation.Server.Host.Components.Watchdog.WatchdogBase
ActiveParametersUpdatedTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
AlphaBravoStartupSeperationIntervalTgstation.Server.Host.Components.Watchdog.ExperimentalWatchdogprivate
AlphaIsActiveTgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog
alphaIsActiveTgstation.Server.Host.Components.Watchdog.ExperimentalWatchdogprivate
alphaServerTgstation.Server.Host.Components.Watchdog.ExperimentalWatchdogprivate
AsyncDelayerTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
bravoServerTgstation.Server.Host.Components.Watchdog.ExperimentalWatchdogprivate
ChangeSettings(DreamDaemonLaunchParameters launchParameters, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
ChatTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
CheckLaunchResult(ISessionController controller, string serverName, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
CreateReattachInformation()Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdogprotectedvirtual
Dispose()Tgstation.Server.Host.Components.Watchdog.WatchdogBase
DisposeAndNullControllers()Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdogprotectedvirtual
DmbFactoryTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
ExperimentalWatchdog(IChat chat, ISessionControllerFactory sessionControllerFactory, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IEventConsumer eventConsumer, IJobManager jobManager, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILogger< ExperimentalWatchdog > logger, DreamDaemonLaunchParameters initialLaunchParameters, Api.Models.Instance instance, bool autoStart)Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog
GetActiveController()Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdogprotectedvirtual
HandleChatCommand(string commandName, string arguments, Chat.User sender, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
Tgstation::Server::Host::Components::Chat::ICustomCommandHandler.HandleChatCommand(string commandName, string arguments, User sender, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.ICustomCommandHandler
HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
HandleRestart(Version updateVersion, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
HandlerMonitorWakeup(MonitorActivationReason activationReason, MonitorState monitorState, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdogprivate
InitControllers(Action callBeforeRecurse, Task chatTask, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdogprotectedvirtual
LastLaunchParametersTgstation.Server.Host.Components.Watchdog.WatchdogBase
Launch(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
LoggerTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
MonitorLifetimes(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdogprotectedvirtual
NotifyOfFailedReattach(bool inactiveReattachSuccess, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
RebootStateTgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog
ResetRebootState(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
Restart(bool graceful, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
RunningTgstation.Server.Host.Components.Watchdog.WatchdogBase
SemaphoreTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
SessionControllerFactoryTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
StartAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
StartMonitor()Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
StopAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
StopMonitor()Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
Terminate(bool graceful, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
WatchdogBase(IChat chat, ISessionControllerFactory sessionControllerFactory, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IEventConsumer eventConsumer, IJobManager jobManager, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILogger logger, DreamDaemonLaunchParameters initialLaunchParameters, Api.Models.Instance instance, bool autoStart)Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html new file mode 100644 index 0000000000..c979afa95c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html @@ -0,0 +1,888 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog Class Reference
+
+
+ +

A IWatchdog that tries to manage 2 servers at once for maximum uptime. + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog:
+
+
+ + +Tgstation.Server.Host.Components.Watchdog.WatchdogBase +Tgstation.Server.Host.Components.Watchdog.IWatchdog +Tgstation.Server.Host.Components.Chat.ICustomCommandHandler +Tgstation.Server.Host.Core.IRestartHandler +IHostedService +IDisposable +Tgstation.Server.Host.Components.IEventConsumer + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ExperimentalWatchdog (IChat chat, ISessionControllerFactory sessionControllerFactory, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IEventConsumer eventConsumer, IJobManager jobManager, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILogger< ExperimentalWatchdog > logger, DreamDaemonLaunchParameters initialLaunchParameters, Api.Models.Instance instance, bool autoStart)
 Initializes a new instance of the ExperimentalWatchdog class. More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Components.Watchdog.WatchdogBase
void Dispose ()
 
async Task ChangeSettings (DreamDaemonLaunchParameters launchParameters, CancellationToken cancellationToken)
 Changes the ActiveLaunchParameters. If currently Running triggers a graceful restart More...
 
async Task< bool > HandleEvent (EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
 Handle a given eventType More...
 
async Task< string > HandleChatCommand (string commandName, string arguments, Chat.User sender, CancellationToken cancellationToken)
 
async Task Launch (CancellationToken cancellationToken)
 Start the IWatchdog More...
 
async Task ResetRebootState (CancellationToken cancellationToken)
 Cancels pending graceful actions More...
 
async Task Restart (bool graceful, CancellationToken cancellationToken)
 Restarts the watchdog More...
 
async Task StartAsync (CancellationToken cancellationToken)
 
async Task StopAsync (CancellationToken cancellationToken)
 
async Task Terminate (bool graceful, CancellationToken cancellationToken)
 Stops the watchdog More...
 
async Task HandleRestart (Version updateVersion, CancellationToken cancellationToken)
 Handle a restart of the server More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Components.Chat.ICustomCommandHandler
Task< string > HandleChatCommand (string commandName, string arguments, User sender, CancellationToken cancellationToken)
 Handle a chat command More...
 
+ + + + + + + +

+Public Attributes

override bool AlphaIsActive => alphaIsActive
 
override Models.CompileJob ActiveCompileJob => (AlphaIsActive ? alphaServer : bravoServer)?.Dmb.CompileJob
 
override? RebootState RebootState => Running ? (AlphaIsActive ? alphaServer?.RebootState : bravoServer?.RebootState) : null
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Protected Member Functions

override void DisposeAndNullControllers ()
 Call IDisposable.Dispose on alphaServer and bravoServer and set them to null More...
 
override async Task MonitorLifetimes (CancellationToken cancellationToken)
 The loop that watches the watchdog More...
 
override async Task InitControllers (Action callBeforeRecurse, Task chatTask, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
 Starts all ISessionControllers. More...
 
override ISessionController GetActiveController ()
 Get the active ISessionController. More...
 
override WatchdogReattachInformation CreateReattachInformation ()
 Create the WatchdogReattachInformation for the ISessionControllers. More...
 
- Protected Member Functions inherited from Tgstation.Server.Host.Components.Watchdog.WatchdogBase
 WatchdogBase (IChat chat, ISessionControllerFactory sessionControllerFactory, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IEventConsumer eventConsumer, IJobManager jobManager, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILogger logger, DreamDaemonLaunchParameters initialLaunchParameters, Api.Models.Instance instance, bool autoStart)
 Initializes a new instance of the WatchdogBase class. More...
 
async Task LaunchImplNoLock (bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
 Launches the watchdog. More...
 
void StartMonitor ()
 Call MonitorLifetimes(CancellationToken) and setup monitorCts and monitorTask. More...
 
async Task< bool > StopMonitor ()
 Stops MonitorLifetimes(CancellationToken). Doesn't kill the servers More...
 
async Task NotifyOfFailedReattach (bool inactiveReattachSuccess, CancellationToken cancellationToken)
 Send a chat message and log about a failed reattach operation and attempts another call to LaunchImplNoLock(bool, bool, WatchdogReattachInformation, CancellationToken). More...
 
async Task CheckLaunchResult (ISessionController controller, string serverName, CancellationToken cancellationToken)
 Check the LaunchResult of a given controller for errors and throw a JobException if any are detected. More...
 
+ + + + +

+Private Member Functions

async Task HandlerMonitorWakeup (MonitorActivationReason activationReason, MonitorState monitorState, CancellationToken cancellationToken)
 Handles the actions to take when the monitor has to "wake up" More...
 
+ + + + + + + + + + + + + +

+Private Attributes

const int AlphaBravoStartupSeperationInterval = 10
 The time in seconds to wait from starting alphaServer to start bravoServer. Does not take responsiveness into account More...
 
ISessionController alphaServer
 Server designation alpha More...
 
ISessionController bravoServer
 Server designation bravo More...
 
bool alphaIsActive
 Backing field for AlphaIsActive. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Properties inherited from Tgstation.Server.Host.Components.Watchdog.WatchdogBase
bool Running [get, protected set]
 
abstract bool AlphaIsActive [get]
 
abstract Models.CompileJob ActiveCompileJob [get]
 
DreamDaemonLaunchParameters ActiveLaunchParameters [get, protected set]
 
DreamDaemonLaunchParameters LastLaunchParameters [get, protected set]
 
abstract ? RebootState RebootState [get]
 
TaskCompletionSource< object > ActiveParametersUpdated [get, set]
 TaskCompletionSource<TResult> that completes when ActiveLaunchParameters are changed and we are Running. More...
 
SemaphoreSlim Semaphore [get]
 The SemaphoreSlim for the WatchdogBase. More...
 
ILogger Logger [get]
 The ILogger for the WatchdogBase. More...
 
IChat Chat [get]
 The IChat for the WatchdogBase More...
 
ISessionControllerFactory SessionControllerFactory [get]
 The ISessionControllerFactory for the WatchdogBase More...
 
IDmbFactory DmbFactory [get]
 The IDmbFactory for the WatchdogBase More...
 
IAsyncDelayer AsyncDelayer [get]
 The IAsyncDelayer for the WatchdogBase. More...
 
- Properties inherited from Tgstation.Server.Host.Components.Watchdog.IWatchdog
bool Running [get]
 If the watchdog is running More...
 
bool AlphaIsActive [get]
 If the alpha server is the active server More...
 
Models.CompileJob ActiveCompileJob [get]
 The CompileJob currently running on the server More...
 
DreamDaemonLaunchParameters ActiveLaunchParameters [get]
 The DreamDaemonLaunchParameters the active server is using More...
 
DreamDaemonLaunchParameters LastLaunchParameters [get]
 The DreamDaemonLaunchParameters to be applied More...
 
RebootStateRebootState [get]
 The Components.Watchdog.RebootState of the active server More...
 
+

Detailed Description

+

A IWatchdog that tries to manage 2 servers at once for maximum uptime.

+ +

Definition at line 19 of file ExperimentalWatchdog.cs.

+

Constructor & Destructor Documentation

+ +

◆ ExperimentalWatchdog()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.ExperimentalWatchdog (IChat chat,
ISessionControllerFactory sessionControllerFactory,
IDmbFactory dmbFactory,
IReattachInfoHandler reattachInfoHandler,
IDatabaseContextFactory databaseContextFactory,
IByondTopicSender byondTopicSender,
IEventConsumer eventConsumer,
IJobManager jobManager,
IServerControl serverControl,
IAsyncDelayer asyncDelayer,
ILogger< ExperimentalWatchdoglogger,
DreamDaemonLaunchParameters initialLaunchParameters,
Api.Models.Instance instance,
bool autoStart 
)
+
+ +

Initializes a new instance of the ExperimentalWatchdog class.

+
Parameters
+ + + + + + + + + + + + + + + +
chatThe IChat for the WatchdogBase.
sessionControllerFactoryThe ISessionControllerFactory for the WatchdogBase.
dmbFactoryThe IDmbFactory for the WatchdogBase.
reattachInfoHandlerThe IReattachInfoHandler for the WatchdogBase.
databaseContextFactoryThe IDatabaseContextFactory for the WatchdogBase.
byondTopicSenderThe IByondTopicSender for the WatchdogBase.
eventConsumerThe IEventConsumer for the WatchdogBase.
jobManagerThe IJobManager for the WatchdogBase.
serverControlThe IServerControl for the WatchdogBase.
asyncDelayerThe IAsyncDelayer for the WatchdogBase.
loggerThe ILogger for the WatchdogBase.
initialLaunchParametersThe DreamDaemonLaunchParameters for the WatchdogBase.
instanceThe Api.Models.Instance for the WatchdogBase.
autoStartThe autostart value for the WatchdogBase.
+
+
+ +

Definition at line 67 of file ExperimentalWatchdog.cs.

+
68  : base(
69  chat,
70  sessionControllerFactory,
71  dmbFactory,
76  jobManager,
77  serverControl,
78  asyncDelayer,
79  logger,
80  initialLaunchParameters,
81  instance,
82  autoStart)
83  {
84  alphaIsActive = true;
85  }
readonly bool autoStart
If the WatchdogBase should LaunchImplNoLock(bool, bool, WatchdogReattachInformation,...
+ +
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the ExperimentalWatchdog
+
readonly IJobManager jobManager
The IJobManager for the ExperimentalWatchdog
+
readonly IReattachInfoHandler reattachInfoHandler
The IReattachInfoHandler for the WatchdogBase
Definition: WatchdogBase.cs:90
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the ExperimentalWatchdog
Definition: WatchdogBase.cs:95
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the ExperimentalWatchdog
+
readonly Api.Models.Instance instance
The Api.Models.Instance for the WatchdogBase.
Definition: WatchdogBase.cs:85
+
+

References Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.alphaIsActive.

+ +
+
+

Member Function Documentation

+ +

◆ CreateReattachInformation()

+ +
+
+ + + + + +
+ + + + + + + +
override WatchdogReattachInformation Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.CreateReattachInformation ()
+
+protectedvirtual
+
+
+ +

◆ DisposeAndNullControllers()

+ + + +

◆ GetActiveController()

+ +
+
+ + + + + +
+ + + + + + + +
override ISessionController Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.GetActiveController ()
+
+protectedvirtual
+
+
+ +

◆ HandlerMonitorWakeup()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.HandlerMonitorWakeup (MonitorActivationReason activationReason,
MonitorState monitorState,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Handles the actions to take when the monitor has to "wake up"

+
Parameters
+ + + + +
activationReasonThe MonitorActivationReason that caused the invocation
monitorStateThe current MonitorState. Will be modified upon retrn
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 95 of file ExperimentalWatchdog.cs.

+
96  {
97  Logger.LogDebug("Monitor activation. Reason: {0}", activationReason);
98 
99  // this is where the bulk of the watchdog handling code lives and is fraught with lambdas, sorry not sorry
100  // I'll do my best to walk you through it
101 
102  // returns true if the inactive server can't be used immediately
103  // also sets monitor to restart if the above holds
104  bool FullRestartDeadInactive()
105  {
106  if (monitorState.RebootingInactiveServer || monitorState.InactiveServerCritFail)
107  {
108  Logger.LogInformation("Inactive server is {0}! Restarting monitor...", monitorState.InactiveServerCritFail ? "critically failed" : "still rebooting");
109  monitorState.NextAction = MonitorAction.Restart; // will dispose server
110  return true;
111  }
112 
113  return false;
114  }
115 
116  // trys to set inactive server's port to the public game port
117  // doesn't handle closing active server's port
118  // returns true on success and swaps inactiveserver and activeserver also sets LastLaunchParameters to ActiveLaunchParameters
119  // on failure, sets monitor to restart
120  async Task<bool> MakeInactiveActive()
121  {
122  Logger.LogDebug("Setting inactive server to port {0}...", ActiveLaunchParameters.PrimaryPort.Value);
123  var result = await monitorState.InactiveServer.SetPort(ActiveLaunchParameters.PrimaryPort.Value, cancellationToken).ConfigureAwait(false);
124 
125  if (!result)
126  {
127  Logger.LogWarning("Failed to activate inactive server! Restarting monitor...");
128  monitorState.NextAction = MonitorAction.Restart; // will dispose server
129  return false;
130  }
131 
132  // inactive server should always be using active launch parameters
134 
135  var tmp = monitorState.ActiveServer;
136  monitorState.ActiveServer = monitorState.InactiveServer;
137  monitorState.InactiveServer = tmp;
139  monitorState.ActiveServer.EnableCustomChatCommands();
140  return true;
141  }
142 
143  // Kills and tries to launch inactive server with the latest dmb
144  // falls back to current dmb on failure
145  // Sets critfail on inactive server failing that
146  // returns false if the backup dmb was used successfully, true otherwise
147  async Task UpdateAndRestartInactiveServer(bool breakAfter)
148  {
149  ActiveParametersUpdated = new TaskCompletionSource<object>();
150  monitorState.InactiveServer.Dispose(); // kill or recycle it
151  var desiredNextAction = breakAfter ? MonitorAction.Break : MonitorAction.Continue;
152  monitorState.NextAction = desiredNextAction;
153 
154  Logger.LogInformation("Rebooting inactive server...");
155  var newDmb = DmbFactory.LockNextDmb(1);
156  try
157  {
158  monitorState.InactiveServer = await SessionControllerFactory.LaunchNew(ActiveLaunchParameters, newDmb, null, false, !monitorState.ActiveServer.IsPrimary, false, cancellationToken).ConfigureAwait(false);
159  monitorState.InactiveServer.SetHighPriority();
160  }
161  catch (OperationCanceledException)
162  {
163  throw;
164  }
165  catch (Exception e)
166  {
167  Logger.LogError("Error occurred while recreating server! Attempting backup strategy of running DMB of running server! Exception: {0}", e.ToString());
168 
169  // ahh jeez, what do we do here?
170  // this is our fault, so it should never happen but
171  // idk maybe a database error while handling the newest dmb?
172  // either way try to start it using the active server's dmb as a backup
173  try
174  {
175  var dmbBackup = await DmbFactory.FromCompileJob(monitorState.ActiveServer.Dmb.CompileJob, cancellationToken).ConfigureAwait(false);
176 
177  if (dmbBackup == null) // NANI!?
178  throw new JobException("Creating backup DMB provider failed!"); // just give up, if THAT compile job is failing then the ActiveServer is gonna crash soon too or already has
179 
180  monitorState.InactiveServer = await SessionControllerFactory.LaunchNew(ActiveLaunchParameters, dmbBackup, null, false, !monitorState.ActiveServer.IsPrimary, false, cancellationToken).ConfigureAwait(false);
181  monitorState.InactiveServer.SetHighPriority();
182  await Chat.SendWatchdogMessage("Staging newest DMB on inactive server failed: {0} Falling back to previous dmb...", cancellationToken).ConfigureAwait(false);
183  }
184  catch (OperationCanceledException)
185  {
186  throw;
187  }
188  catch (Exception e2)
189  {
190  // fuuuuucckkk
191  Logger.LogError("Backup strategy failed! Monitor will restart when active server reboots! Exception: {0}", e2.ToString());
192  monitorState.InactiveServerCritFail = true;
193  await Chat.SendWatchdogMessage("Attempted reboot of inactive server failed. Watchdog will reset when active server fails or exits", cancellationToken).ConfigureAwait(false);
194  return;
195  }
196  }
197 
198  Logger.LogInformation("Successfully relaunched inactive server!");
199  monitorState.RebootingInactiveServer = true;
200  }
201 
202  string ExitWord(ISessionController controller) => controller.TerminationWasRequested ? "exited" : "crashed";
203 
204  // reason handling
205  switch (activationReason)
206  {
207  case MonitorActivationReason.ActiveServerCrashed:
208  if (monitorState.ActiveServer.RebootState == Watchdog.RebootState.Shutdown)
209  {
210  // the time for graceful shutdown is now
211  await Chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Active server {0}! Exiting due to graceful termination request...", ExitWord(monitorState.ActiveServer)), cancellationToken).ConfigureAwait(false);
213  monitorState.NextAction = MonitorAction.Exit;
214  break;
215  }
216 
217  if (FullRestartDeadInactive())
218  {
219  // tell chat about it and go ahead
220  await Chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Active server {0}! Inactive server unable to online!", ExitWord(monitorState.ActiveServer)), cancellationToken).ConfigureAwait(false);
221 
222  // we've already been set to restart
223  break;
224  }
225 
226  // tell chat about it
227  await Chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Active server {0}! Onlining inactive server...", ExitWord(monitorState.ActiveServer)), cancellationToken).ConfigureAwait(false);
228 
229  // try to activate the inactive server
230  if (!await MakeInactiveActive().ConfigureAwait(false))
231  break; // failing that, we've already been set to restart
232 
233  // bring up another inactive server
234  await UpdateAndRestartInactiveServer(true).ConfigureAwait(false);
235  break;
236  case MonitorActivationReason.InactiveServerCrashed:
237  // just announce and try to bring it back
238  await Chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Inactive server {0}! Rebooting...", ExitWord(monitorState.InactiveServer)), cancellationToken).ConfigureAwait(false);
239  await UpdateAndRestartInactiveServer(false).ConfigureAwait(false);
240  break;
241  case MonitorActivationReason.ActiveServerRebooted:
242  // ideal goal: active server just closed its port
243  // tell inactive server to open it's port and that's now the active server
244  var rebootState = monitorState.ActiveServer.RebootState;
245  monitorState.ActiveServer.ResetRebootState(); // the DMAPI has already done this internally
246 
247  if (FullRestartDeadInactive() && rebootState != Watchdog.RebootState.Shutdown)
248  break; // full restart if the inactive server is being fucky
249 
250  // what matters here is the RebootState
251  var restartOnceSwapped = false;
252 
253  switch (rebootState)
254  {
255  case Watchdog.RebootState.Normal:
256  // life as normal
257  break;
258  case Watchdog.RebootState.Restart:
259  // reboot the current active server once the inactive one activates
260  restartOnceSwapped = true;
261  break;
262  case Watchdog.RebootState.Shutdown:
263  // graceful shutdown time
264  await Chat.SendWatchdogMessage("Active server rebooted! Exiting due to graceful termination request...", cancellationToken).ConfigureAwait(false);
266  monitorState.NextAction = MonitorAction.Exit;
267  return;
268  default:
269  throw new InvalidOperationException($"Invalid reboot state: {rebootState}");
270  }
271 
272  // are both servers now running the same CompileJob?
273  var sameCompileJob = monitorState.InactiveServer.Dmb.CompileJob.Id == monitorState.ActiveServer.Dmb.CompileJob.Id;
274 
275  if (!sameCompileJob || ActiveLaunchParameters != LastLaunchParameters)
276  restartOnceSwapped = true; // need a new launch to update either settings or compile job
277 
278  if (restartOnceSwapped)
279  /*
280  * we need to manually restart active server
281  * just kill it here, easier that way
282  */
283  monitorState.ActiveServer.Dispose();
284 
285  var activeServerStillHasPortOpen = !restartOnceSwapped && !monitorState.ActiveServer.ClosePortOnReboot;
286 
287  if (activeServerStillHasPortOpen)
288  /* we didn't want active server to swap for some reason and it still has it's port open
289  * just continue as normal
290  */
291  break;
292 
293  if (!await MakeInactiveActive().ConfigureAwait(false))
294  break; // monitor will restart
295 
296  // servers now swapped
297  // enable this now if inactive server is not still valid
298  monitorState.ActiveServer.ClosePortOnReboot = restartOnceSwapped;
299 
300  if (!restartOnceSwapped)
301  /*
302  * now try to reopen it on the private port
303  * failing that, just reboot it
304  */
305  restartOnceSwapped = !await monitorState.InactiveServer.SetPort(ActiveLaunchParameters.SecondaryPort.Value, cancellationToken).ConfigureAwait(false);
306 
307  // break either way because any issues past this point would be solved by the reboot
308  if (restartOnceSwapped) // for one reason or another
309  await UpdateAndRestartInactiveServer(true).ConfigureAwait(false); // update and reboot
310  else
311  monitorState.NextAction = MonitorAction.Skip; // only skip checking inactive server rebooted, it's guaranteed InactiveServerStartup complete wouldn't fire this iteration
312  break;
313  case MonitorActivationReason.InactiveServerRebooted:
314  // just don't let the active server close it's port if the inactive server isn't ready
315  monitorState.RebootingInactiveServer = true;
316  monitorState.InactiveServer.ResetRebootState();
317  monitorState.ActiveServer.ClosePortOnReboot = false;
318  monitorState.NextAction = MonitorAction.Continue;
319  break;
320  case MonitorActivationReason.InactiveServerStartupComplete:
321  // opposite of above case
322  monitorState.RebootingInactiveServer = false;
323  monitorState.ActiveServer.ClosePortOnReboot = true;
324  monitorState.NextAction = MonitorAction.Continue;
325  break;
326  case MonitorActivationReason.NewDmbAvailable:
327  case MonitorActivationReason.ActiveLaunchParametersUpdated:
328  // just reload the inactive server and wait for a swap to apply the changes
329  await UpdateAndRestartInactiveServer(true).ConfigureAwait(false);
330  break;
331  default:
332  Trace.Assert(false, String.Format(CultureInfo.InvariantCulture, "Invalid monitor activation reason: {0}!", activationReason));
333  break;
334  }
335  }
+ + + +
ushort? PrimaryPort
The first port DreamDaemon uses. This should be the publically advertised port
+
ISessionControllerFactory SessionControllerFactory
The ISessionControllerFactory for the WatchdogBase
Definition: WatchdogBase.cs:70
+
Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured watchdog channels
Definition: Chat.cs:514
+ + + +
TaskCompletionSource< object > ActiveParametersUpdated
TaskCompletionSource<TResult> that completes when ActiveLaunchParameters are changed and we are Runni...
Definition: WatchdogBase.cs:50
+
Task< ISessionController > LaunchNew(DreamDaemonLaunchParameters launchParameters, IDmbProvider dmbProvider, IByondExecutableLock currentByondLock, bool primaryPort, bool primaryDirectory, bool apiValidate, CancellationToken cancellationToken)
Create a ISessionController from a freshly launch DreamDaemon instance
+
async Task< IDmbProvider > FromCompileJob(CompileJob compileJob, CancellationToken cancellationToken)
Gets a IDmbProvider for a given CompileJob
Definition: DmbFactory.cs:186
+
MonitorActivationReason
Reasons for the monitor to wake up
+
IDmbProvider LockNextDmb(int lockCount)
Gets the next IDmbProvider
Definition: DmbFactory.cs:149
+
ILogger Logger
The ILogger for the WatchdogBase.
Definition: WatchdogBase.cs:60
+
MonitorAction
The action for the monitor loop to take when control is returned to it
Definition: MonitorAction.cs:6
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+
override void DisposeAndNullControllers()
Call IDisposable.Dispose on alphaServer and bravoServer and set them to null
+
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ActiveLaunchParameters, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ActiveParametersUpdated, Tgstation.Server.Host.Components.Watchdog.MonitorState.ActiveServer, Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.AlphaIsActive, Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.alphaIsActive, Tgstation.Server.Host.Components.Watchdog.ISessionController.ClosePortOnReboot, Tgstation.Server.Host.Components.IDmbProvider.CompileJob, Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.DisposeAndNullControllers(), Tgstation.Server.Host.Components.Watchdog.ISessionController.Dmb, Tgstation.Server.Host.Components.Watchdog.ISessionController.EnableCustomChatCommands(), Tgstation.Server.Host.Components.Compiler.DmbFactory.FromCompileJob(), Tgstation.Server.Api.Models.Internal.CompileJob.Id, Tgstation.Server.Host.Components.Watchdog.MonitorState.InactiveServer, Tgstation.Server.Host.Components.Watchdog.MonitorState.InactiveServerCritFail, Tgstation.Server.Host.Components.Watchdog.ISessionController.IsPrimary, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.LastLaunchParameters, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew(), Tgstation.Server.Host.Components.Compiler.DmbFactory.LockNextDmb(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Logger, Tgstation.Server.Host.Components.Watchdog.MonitorState.NextAction, Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.PrimaryPort, Tgstation.Server.Host.Components.Watchdog.MonitorState.RebootingInactiveServer, Tgstation.Server.Host.Components.Watchdog.ISessionController.RebootState, Tgstation.Server.Host.Components.Watchdog.ISessionController.ResetRebootState(), Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.SecondaryPort, Tgstation.Server.Host.Components.Chat.Chat.SendWatchdogMessage(), Tgstation.Server.Host.Core.IProcessBase.SetHighPriority(), Tgstation.Server.Host.Components.Watchdog.ISessionController.SetPort(), and Tgstation.Server.Host.Components.Watchdog.ISessionController.TerminationWasRequested.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.MonitorLifetimes().

+ +
+
+ +

◆ InitControllers()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
override async Task Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.InitControllers (Action callBeforeRecurse,
Task chatTask,
WatchdogReattachInformation reattachInfo,
CancellationToken cancellationToken 
)
+
+protectedvirtual
+
+ +

Starts all ISessionControllers.

+ +

Implements Tgstation.Server.Host.Components.Watchdog.WatchdogBase.

+ +

Definition at line 514 of file ExperimentalWatchdog.cs.

+
515  {
516  // good ole sanity, should never fucking trigger but i don't trust myself even though I should
517  // TODO: Unit test this instead?
518  if (alphaServer != null || bravoServer != null)
519  throw new InvalidOperationException("Entered LaunchNoLock with one or more of the servers not being null!");
520 
521  // don't need a new dmb if reattaching
522  var doesntNeedNewDmb = reattachInfo?.Alpha != null && reattachInfo?.Bravo != null;
523  var dmbToUse = doesntNeedNewDmb ? null : DmbFactory.LockNextDmb(2);
524 
525  // if this try catches something, both servers are killed
526  try
527  {
528  // start the alpha server task, either by launch a new process or attaching to an existing one
529  // The tasks returned are mainly for writing interop files to the directories among other things and should generally never fail
530  // The tasks pertaining to server startup times are in the ISessionControllers
531  Task<ISessionController> alphaServerTask;
532  if (!doesntNeedNewDmb)
533  alphaServerTask = SessionControllerFactory.LaunchNew(ActiveLaunchParameters, dmbToUse, null, true, true, false, cancellationToken);
534  else
535  alphaServerTask = SessionControllerFactory.Reattach(reattachInfo.Alpha, cancellationToken);
536 
537  // retrieve the session controller
538  var startTime = DateTimeOffset.Now;
539  alphaServer = await alphaServerTask.ConfigureAwait(false);
540 
541  // failed reattaches will return null
543 
544  // extra delay for total ordering
545  var now = DateTimeOffset.Now;
546  var delay = now - startTime;
547 
548  // definitely not if reattaching though
549  if (reattachInfo == null && delay.TotalSeconds < AlphaBravoStartupSeperationInterval)
550  await AsyncDelayer.Delay(startTime.AddSeconds(AlphaBravoStartupSeperationInterval) - now, cancellationToken).ConfigureAwait(false);
551 
552  // now bring bravo up
553  if (!doesntNeedNewDmb)
554  bravoServer = await SessionControllerFactory.LaunchNew(ActiveLaunchParameters, dmbToUse, null, false, false, false, cancellationToken).ConfigureAwait(false);
555  else
556  bravoServer = await SessionControllerFactory.Reattach(reattachInfo.Bravo, cancellationToken).ConfigureAwait(false);
557 
558  // failed reattaches will return null
560 
561  // possiblity of null servers due to failed reattaches
562  if (alphaServer == null || bravoServer == null)
563  {
564  await chatTask.ConfigureAwait(false);
565  var bothServersDead = alphaServer == null && bravoServer == null;
566  if (bothServersDead
567  || (alphaServer == null && reattachInfo.AlphaIsActive)
568  || (bravoServer == null && !reattachInfo.AlphaIsActive))
569  {
570  // we lost the active server, just restart entirely
572  const string FailReattachMessage = "Unable to properly reattach to active server! Restarting...";
573  Logger.LogWarning(FailReattachMessage);
574  Logger.LogDebug(bothServersDead ? "Also could not reattach to inactive server!" : "Inactive server was reattached successfully!");
575  chatTask = Chat.SendWatchdogMessage(FailReattachMessage, cancellationToken);
576  callBeforeRecurse();
577  await LaunchImplNoLock(true, false, null, cancellationToken).ConfigureAwait(false);
578  await chatTask.ConfigureAwait(false);
579  return;
580  }
581 
582  // we still have the active server but the other one is dead to us, hand it off to the monitor to restart
583  const string InactiveReattachFailureMessage = "Unable to reattach to inactive server. Leaving for monitor to reboot...";
584  chatTask = Chat.SendWatchdogMessage(InactiveReattachFailureMessage, cancellationToken);
585  Logger.LogWarning(InactiveReattachFailureMessage);
586 
587  if (reattachInfo.AlphaIsActive)
588  bravoServer = SessionControllerFactory.CreateDeadSession(reattachInfo.Bravo.Dmb);
589  else
590  alphaServer = SessionControllerFactory.CreateDeadSession(reattachInfo.Alpha.Dmb);
591  }
592 
593  var alphaLrt = CheckLaunchResult(alphaServer, "Alpha", cancellationToken);
594  var bravoLrt = CheckLaunchResult(bravoServer, "Bravo", cancellationToken);
595 
596  // this task completes when both serers have finished booting
597  var allTask = Task.WhenAll(alphaLrt, bravoLrt);
598 
599  await allTask.ConfigureAwait(false);
600 
601  // both servers are now running, alpha is the active server(unless reattach), huzzah
602  alphaIsActive = reattachInfo?.AlphaIsActive ?? true;
603 
604  var activeServer = AlphaIsActive ? alphaServer : bravoServer;
605  activeServer.EnableCustomChatCommands();
606  activeServer.ClosePortOnReboot = true;
607  }
608  catch
609  {
610  if (dmbToUse != null)
611  {
612  // we locked 2 dmbs
613  if (bravoServer == null)
614  {
615  // bravo didn't get control of his
616  dmbToUse.Dispose();
617  if (alphaServer == null)
618  dmbToUse.Dispose(); // alpha didn't get control of his
619  }
620  }
621  else if (doesntNeedNewDmb) // we have reattachInfo
622  if (bravoServer == null)
623  {
624  // bravo didn't get control of his
625  reattachInfo.Bravo?.Dmb.Dispose();
626  if (alphaServer == null)
627  reattachInfo.Alpha?.Dmb.Dispose(); // alpha didn't get control of his
628  }
629 
630  // kill the controllers
632  throw;
633  }
634  }
+
const int AlphaBravoStartupSeperationInterval
The time in seconds to wait from starting alphaServer to start bravoServer. Does not take responsiven...
+ + + +
Task< ISessionController > Reattach(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Create a ISessionController from an existing DreamDaemon instance
+
async Task LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
Launches the watchdog.
+
ISessionController CreateDeadSession(IDmbProvider dmbProvider)
Creates a ISessionController that appears to have started and died with exit code -1
+
ISessionControllerFactory SessionControllerFactory
The ISessionControllerFactory for the WatchdogBase
Definition: WatchdogBase.cs:70
+ +
void EnableCustomChatCommands()
Enables the reading of custom chat commands from the ISessionController
+
Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured watchdog channels
Definition: Chat.cs:514
+ +
void SetHighPriority()
Set's the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass....
+
Task< ISessionController > LaunchNew(DreamDaemonLaunchParameters launchParameters, IDmbProvider dmbProvider, IByondExecutableLock currentByondLock, bool primaryPort, bool primaryDirectory, bool apiValidate, CancellationToken cancellationToken)
Create a ISessionController from a freshly launch DreamDaemon instance
+
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+
IDmbProvider LockNextDmb(int lockCount)
Gets the next IDmbProvider
Definition: DmbFactory.cs:149
+ +
async Task CheckLaunchResult(ISessionController controller, string serverName, CancellationToken cancellationToken)
Check the LaunchResult of a given controller for errors and throw a JobException if any are detected...
+
ILogger Logger
The ILogger for the WatchdogBase.
Definition: WatchdogBase.cs:60
+ +
override void DisposeAndNullControllers()
Call IDisposable.Dispose on alphaServer and bravoServer and set them to null
+
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ActiveLaunchParameters, Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.Alpha, Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.AlphaBravoStartupSeperationInterval, Tgstation.Server.Host.Models.WatchdogReattachInformationBase.AlphaIsActive, Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.AlphaIsActive, Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.alphaIsActive, Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.alphaServer, Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.Bravo, Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.bravoServer, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.CheckLaunchResult(), Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.CreateDeadSession(), Tgstation.Server.Host.Core.AsyncDelayer.Delay(), Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.DisposeAndNullControllers(), Tgstation.Server.Host.Components.Watchdog.ReattachInformation.Dmb, Tgstation.Server.Host.Components.Watchdog.ISessionController.EnableCustomChatCommands(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.LaunchImplNoLock(), Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew(), Tgstation.Server.Host.Components.Compiler.DmbFactory.LockNextDmb(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Logger, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.Reattach(), Tgstation.Server.Host.Components.Chat.Chat.SendWatchdogMessage(), and Tgstation.Server.Host.Core.IProcessBase.SetHighPriority().

+ +
+
+ +

◆ MonitorLifetimes()

+ +
+
+ + + + + +
+ + + + + + + + +
override async Task Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.MonitorLifetimes (CancellationToken cancellationToken)
+
+protectedvirtual
+
+ +

The loop that watches the watchdog

+ +

Implements Tgstation.Server.Host.Components.Watchdog.WatchdogBase.

+ +

Definition at line 352 of file ExperimentalWatchdog.cs.

+
353  {
354  Logger.LogTrace("Entered MonitorLifetimes");
355 
356  // this function is responsible for calling HandlerMonitorWakeup when necessary and manitaining the MonitorState
357  var iteration = 1;
358  for (var monitorState = new MonitorState(); monitorState.NextAction != MonitorAction.Exit; ++iteration)
359  {
360  // always start out with continue
361  monitorState.NextAction = MonitorAction.Continue;
362 
363  // dump some info to the logs
364  Logger.LogDebug("Iteration {0} of monitor loop", iteration);
365  try
366  {
367  if (AlphaIsActive)
368  Logger.LogDebug("Alpha is the active server");
369  else
370  Logger.LogDebug("Bravo is the active server");
371 
372  if (monitorState.RebootingInactiveServer)
373  Logger.LogDebug("Inactive server is rebooting");
374 
375  // update the monitor state with the inactive/active servers
376  monitorState.ActiveServer = AlphaIsActive ? alphaServer : bravoServer;
377  monitorState.InactiveServer = AlphaIsActive ? bravoServer : alphaServer;
378 
379  if (monitorState.ActiveServer.ClosePortOnReboot)
380  Logger.LogDebug("Active server will close port on reboot");
381  if (monitorState.InactiveServer.ClosePortOnReboot)
382  Logger.LogDebug("Inactive server will close port on reboot");
383 
384  Logger.LogDebug("Active server Compile Job ID: {0}", monitorState.ActiveServer.Dmb.CompileJob.Id);
385  Logger.LogDebug("Inactive server Compile Job ID: {0}", monitorState.InactiveServer.Dmb.CompileJob.Id);
386 
387  // load the activation tasks into local variables
388  Task activeServerLifetime = monitorState.ActiveServer.Lifetime;
389  Task inactiveServerLifetime = monitorState.InactiveServer.Lifetime;
390  var activeServerReboot = monitorState.ActiveServer.OnReboot;
391  var inactiveServerReboot = monitorState.InactiveServer.OnReboot;
392  Task inactiveServerStartup = monitorState.RebootingInactiveServer ? monitorState.InactiveServer.LaunchResult : null;
393  Task activeLaunchParametersChanged = ActiveParametersUpdated.Task;
394  var newDmbAvailable = DmbFactory.OnNewerDmb;
395 
396  // cancel waiting if requested
397  var cancelTcs = new TaskCompletionSource<object>();
398  using (cancellationToken.Register(() => cancelTcs.SetCanceled()))
399  {
400  var toWaitOn = Task.WhenAny(activeServerLifetime, inactiveServerLifetime, activeServerReboot, inactiveServerReboot, newDmbAvailable, cancelTcs.Task, activeLaunchParametersChanged);
401  if (monitorState.RebootingInactiveServer)
402  toWaitOn = Task.WhenAny(toWaitOn, inactiveServerStartup);
403 
404  // wait for something to happen
405  await toWaitOn.ConfigureAwait(false);
406  cancellationToken.ThrowIfCancellationRequested();
407  }
408 
409  var chatTask = Task.CompletedTask;
410  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
411  {
412  // always run HandleMonitorWakeup from the context of the semaphore lock
413  // multiple things may have happened, handle them one at a time
414  for (var moreActivationsToProcess = true; moreActivationsToProcess && (monitorState.NextAction == MonitorAction.Continue || monitorState.NextAction == MonitorAction.Skip);)
415  {
416  MonitorActivationReason activationReason = default; // this will always be assigned before being used
417 
418  // process the tasks in this order and call HandlerMonitorWakup for each
419  bool CheckActivationReason(ref Task task, MonitorActivationReason testActivationReason)
420  {
421  var taskCompleted = task?.IsCompleted == true;
422  task = null;
423  if (monitorState.NextAction == MonitorAction.Skip)
424  monitorState.NextAction = MonitorAction.Continue;
425  else if (taskCompleted)
426  {
427  activationReason = testActivationReason;
428  return true;
429  }
430 
431  return false;
432  }
433 
434  if (CheckActivationReason(ref activeServerLifetime, MonitorActivationReason.ActiveServerCrashed)
435  || CheckActivationReason(ref inactiveServerLifetime, MonitorActivationReason.InactiveServerCrashed)
436  || CheckActivationReason(ref activeServerReboot, MonitorActivationReason.ActiveServerRebooted)
437  || CheckActivationReason(ref inactiveServerReboot, MonitorActivationReason.InactiveServerRebooted)
438  || CheckActivationReason(ref inactiveServerStartup, MonitorActivationReason.InactiveServerStartupComplete)
439  || CheckActivationReason(ref newDmbAvailable, MonitorActivationReason.NewDmbAvailable)
440  || CheckActivationReason(ref activeLaunchParametersChanged, MonitorActivationReason.ActiveLaunchParametersUpdated))
441  await HandlerMonitorWakeup(activationReason, monitorState, cancellationToken).ConfigureAwait(false);
442  else
443  moreActivationsToProcess = false;
444  }
445 
446  // writeback alphaServer and bravoServer from monitor state in case they changesd
447  alphaServer = AlphaIsActive ? monitorState.ActiveServer : monitorState.InactiveServer;
448  bravoServer = !AlphaIsActive ? monitorState.ActiveServer : monitorState.InactiveServer;
449  }
450 
451  // full reboot required
452  if (monitorState.NextAction == MonitorAction.Restart)
453  {
454  Logger.LogDebug("Next state action is to restart");
456  chatTask = Chat.SendWatchdogMessage("Restarting entirely due to complications...", cancellationToken);
457 
458  for (var retryAttempts = 1; monitorState.NextAction == MonitorAction.Restart; ++retryAttempts)
459  {
460  Exception launchException = null;
461  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
462  try
463  {
464  // use LaunchImplNoLock without announcements or restarting the monitor
465  await LaunchImplNoLock(false, false, null, cancellationToken).ConfigureAwait(false);
466  if (Running)
467  {
468  Logger.LogDebug("Relaunch successful, resetting monitor state...");
469  monitorState = new MonitorState(); // clean the slate and continue
470  }
471  }
472  catch (OperationCanceledException)
473  {
474  throw;
475  }
476  catch (Exception e)
477  {
478  launchException = e;
479  }
480 
481  await chatTask.ConfigureAwait(false);
482  if (!Running)
483  {
484  if (launchException == null)
485  Logger.LogWarning("Failed to automatically restart the watchdog! Attempt: {0}", retryAttempts);
486  else
487  Logger.LogWarning("Failed to automatically restart the watchdog! Attempt: {0}, Exception: {1}", retryAttempts, launchException);
488  var retryDelay = Math.Min(Math.Pow(2, retryAttempts), 3600); // max of one hour, increasing by a power of 2 each time
489  chatTask = Chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Failed to restart watchdog (Attempt: {0}), retrying in {1} seconds...", retryAttempts, retryDelay), cancellationToken);
490  await Task.WhenAll(AsyncDelayer.Delay(TimeSpan.FromSeconds(retryDelay), cancellationToken), chatTask).ConfigureAwait(false);
491  }
492  }
493  }
494  }
495  catch (OperationCanceledException)
496  {
497  Logger.LogDebug("Monitor cancelled");
498  break;
499  }
500  catch (Exception e)
501  {
502  // really, this should NEVER happen
503  Logger.LogError("Monitor crashed! Iteration: {0}, State: {1}, Exception: {2}", iteration, JsonConvert.SerializeObject(monitorState), e);
504  await Chat.SendWatchdogMessage(String.Format(CultureInfo.InvariantCulture, "Monitor crashed, this should NEVER happen! Please report this, full details in logs! Restarting monitor... Error: {0}", e.Message), cancellationToken).ConfigureAwait(false);
505  }
506  }
507 
508  Logger.LogTrace("Monitor exiting...");
509  }
+ + +
async Task LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
Launches the watchdog.
+ +
SemaphoreSlim Semaphore
The SemaphoreSlim for the WatchdogBase.
Definition: WatchdogBase.cs:55
+ +
Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured watchdog channels
Definition: Chat.cs:514
+ +
TaskCompletionSource< object > ActiveParametersUpdated
TaskCompletionSource<TResult> that completes when ActiveLaunchParameters are changed and we are Runni...
Definition: WatchdogBase.cs:50
+
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+
MonitorActivationReason
Reasons for the monitor to wake up
+ +
ILogger Logger
The ILogger for the WatchdogBase.
Definition: WatchdogBase.cs:60
+ +
async Task HandlerMonitorWakeup(MonitorActivationReason activationReason, MonitorState monitorState, CancellationToken cancellationToken)
Handles the actions to take when the monitor has to "wake up"
+
MonitorAction
The action for the monitor loop to take when control is returned to it
Definition: MonitorAction.cs:6
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
override void DisposeAndNullControllers()
Call IDisposable.Dispose on alphaServer and bravoServer and set them to null
+
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ActiveParametersUpdated, Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.AlphaIsActive, Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.alphaServer, Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.bravoServer, Tgstation.Server.Host.Core.AsyncDelayer.Delay(), Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.DisposeAndNullControllers(), Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.HandlerMonitorWakeup(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.LaunchImplNoLock(), Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Logger, Tgstation.Server.Host.Components.Watchdog.MonitorState.NextAction, Tgstation.Server.Host.Components.Compiler.DmbFactory.OnNewerDmb, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Running, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Semaphore, and Tgstation.Server.Host.Components.Chat.Chat.SendWatchdogMessage().

+ +
+
+

Member Data Documentation

+ +

◆ ActiveCompileJob

+ +
+
+ + + + +
override Models.CompileJob Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.ActiveCompileJob => (AlphaIsActive ? alphaServer : bravoServer)?.Dmb.CompileJob
+
+ +

+ +

Definition at line 30 of file ExperimentalWatchdog.cs.

+ +
+
+ +

◆ AlphaBravoStartupSeperationInterval

+ +
+
+ + + + + +
+ + + + +
const int Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.AlphaBravoStartupSeperationInterval = 10
+
+private
+
+ +

The time in seconds to wait from starting alphaServer to start bravoServer. Does not take responsiveness into account

+ +

Definition at line 24 of file ExperimentalWatchdog.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.InitControllers().

+ +
+
+ +

◆ AlphaIsActive

+ + + +

◆ alphaIsActive

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.alphaIsActive
+
+private
+
+
+ +

◆ alphaServer

+ +
+
+ + + + + +
+ + + + +
ISessionController Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.alphaServer
+
+private
+
+
+ +

◆ bravoServer

+ +
+
+ + + + + +
+ + + + +
ISessionController Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.bravoServer
+
+private
+
+
+ +

◆ RebootState

+ +
+
+ + + + +
override? RebootState Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.RebootState => Running ? (AlphaIsActive ? alphaServer?.RebootState : bravoServer?.RebootState) : null
+
+ +

+ +

Definition at line 33 of file ExperimentalWatchdog.cs.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.png new file mode 100644 index 0000000000000000000000000000000000000000..1bd440b280520bf2d0013d3f6cd15ab76f1e27e9 GIT binary patch literal 5019 zcmchbd05if{>N>cvPUhatGTssy-_+hQ8Tke(-xN@OKiX4g5`##xsrm9 zE?&!nyobDiW`nf7=cc3kSZ6KLjkA;j*F1Tg9Ju3}q45EuJ>;toR#_q!wY-M2&Y2=? z9$MXmo47jsi>&)o3X;5F6WaefUkjvdD((f`#7id~+)AtZ;i8{K23_-~%M(|mIF9}5lDv9^u zY2i^F&pX}QUR7%4OMZk4KVZ+BDb{jEMU51Acftp(ys<}>%PE@vISq>>UyIl)u3InC z(h1Z@AftPvZ09oL72s+6u29&bsdtq_6{>`3$0U9PUZ~_3Mmpn$uTQ+;jNbZXV7$pZ zQTbW%^w?o?;8~^>xgDqk5 z)=AOi5>8R}dA&zpC@ysp=^Az)r>Lyw9}kA;r5CH79H`4n@WC!el*jn;*Jn7Eh!jUr zH{e1JSo;zfqAjO3tpaA$_B}HC7`mX)&4WC%i-+anvZU229L+L6)EaH5KUR%rY#EKr z8+2nU5hSJM`cg)dvKk*zU9CVd7lTdxFw7}BiIn|VlE^eFR0Nn<<9T8>+@yKTo&7-H z>g0sIB28eMxRr>Z)j#UDU+>O|p7d*q<*SCC-PGq4HC&gQ;(bopUq|HzDS|CA$!ip+UYU&LN^aoy4IVooqPwt5iY0Dru-LBWPCnn7KL{!>37-DQ zDLV6+kL3~s(t~hTtQ|N=O@;`EQ(Z-=l-j3>F9Op8cc4}x*i(t`H@7*E1LK&sXv2-e z*Rb5mHiu=@Se7C$((5tbIjuClCG7BIZ9B=DDx0}xI9cwvk2WK7^TTilRDC%@CP5XK zBqL5-LqK-GX9)cw-7yf@n9WV9*5 zYdB3Eo#X*>h{^lo`g-LB#uWR5sx@2(N)yZyb05yK=%@x&i`WZFlk?T?Uv?qM`)L=} zvd*Dzfzr%fc+qZ74zR}`h28-Ly|>wJ$zpA7VwsVJv4@T(DEfQ%KJ75l299E=U1b{8Zq8EWYu?NEz6kh>6y(Dpn@+p!b0YUDLT z3#e^*%=u~|)XX=b??LU;LpPnjI*1Ae1Q_VD-S>vUcOHfAK-7a>Id{+B?jZRPS=V1s zO@2rY)cE5)Y)K)*bFo0SL3;j#Xct=DWJ}FiVfe%uNzzkEaNk;1U%{p4dX-7asT8th zNo{B$>@;rm3EAD&-Pzl>Bb}mJs+ANj6N4?2DVljX3=&Mb9`~{wAL@YE-YBP71!%czUD5C;L0n zl@UdRjSsz@J0HKB+CUc;^omffY~vI{4ns~D;uJY4qTYtz3i%Qx9hl?S^WNNFG-B4`M@!wOEj~Ij2_>?fzzHgnhhz(a447^d9{jS2ndt`D|^$ zY1}sm2ffWrmlb9W9bCV|PS3areo8Nz?tylB$`MYq*AMcFtlRBy`4z||Txgbphpu!# z2A_I35?N%cirYRU?i)6Q(eIK}^?rSAC1W2Gj_jnGv`-u_P;Dn9kQ2LfIHN68W@r%R zGNro_XZNsSdEY9DVuOsyZ)E4BQI=_!J5AdM)UBE6f3uE-f&|q(H)tYQDByMDUM1`l zdXJrGQ%Gjk`ou^h?C1?AUNOeg!fxp)Txf|hD1}D3qR@~e-n*eoL+)&XG0F$FGOrMn+(YnseIa{0|^e%PM_I36=zSR z_n1Sfs?UiogO4GA2kL#S>f#G3Sq|2HxREdimN}v4h0$}&v}hy~1=4Tii6WyC&CuES z3A$0oMb1Q*7AoQ9)|^A4nuyq`0a&U!Gx+6*jKE3)0_~JNzX#=<(Wyrj3^O_=gT6|} z$bjp#`AUTKZB-}QW<(W9QOw$D4ppZ?Fg$AkoxwE$UoxpjYi?QRq=QBEIi*pU{uA^| zl}(>}J$dH7c5iFU_$#>5jSh$Flk z@O;IMmovlbm~ga`&qa|{bfGaqB?w%{DuiH%5PQF(Ql&a{X8N;cl4QJTTf6h-X{2qk za1|nVxjiy_7tr)^aY}TVZt>Sdl|ON^O1MqYymX?efk@W<6zk5$rtBl zgc{=ka63d!M9qWRUo(>b6d}NtkAbONe6Kc@pHcvCnto$oFcWR*qQCfwG)=RAk@dj@dn)!u*m%pV)TuWjr%ga5|F{*upRfR+#+AOCp1BL^!r zFmO!4+5GqY;!l{4(i!Z)Nnk3AAwL@qdjx+BH`$?fwd@1A5ZS9OFTVwF%6>b@%07KN z3n!4z#qEI@#dS9P17N-~CH!_ciKJ3QNcn>maCxWng|u4MgkgG-YfH9>r8NzWy9cw! zn$N@rTOpn1#vb2K8!X}R8}IbIWQbL0Z^agLWfVYpu?mLBe=C@Mfbl$RnNNXO%EV;U z77hqb4G^ZO*q_vTfA&jVK@hF8vecKrt%;zQ7R!0n?l}UjQhh!4NK=#Fl5Ry0wNC(K z&7b7%LEf&m=(s(YD-@aic40ItAahlu#{<`+es`mV#g{1!YmJu0Fl+HVLHSs3bK(wm zCTt~hFINu{{P5}0qrZ-Ru`#e!Ny zB@B^y^%Z?0-m(6Yk`G>3%1Br6NnP@8b5_CJ%n~&mullGdQ@ z#YB8cYhI-R!n`R9^?C}R9cFHGfKEpvd%dmV!(cA#2h@Vt@Z2CyS({NpSPs0tcbEIf z3rFHuzj@#4Yl`l;P>5!#4^Hi&RZP627sO4+#Pgzrcw|u|U#e_yL>rb5F;r1MauEVj zwlDVM{iEgd?$Ybg`k~bO5siLJ0x#k90x|WhvHotAD6mUl6 z4Qd1%zBx<85L!9r0WiJ_r~*(I>M;jGp4n+n0x-6i3;*?L_ZqHasHtsdwQQc!?q*~J z&v6=1Q#I_JQF>73|2BJKlarfGEunh(Ujg8sDCqwRiYlG0GT3?G3YwFJj(UHC=Zn-y zw%=&%`gDOh#|^q}oRjL4a&qH^{WMecX8tPl)W&k3Bpcppm}*)`Z02QujTcBR$Z@I} zsm}422v58sk~;Pc3^&a9wkp6ud3xi){5lPYnVWh!oyU*U*L11%z+nc`12fAKj1eNz zQ+=G3;ZGqo2p=hSwIce;{JeX4IU-h@Z{a1r!$3frE&4R3v!HU2LHF+L7!!ZWMM*R} zuTVsjeIbPxM~I^{O}q>BLoxWG>8gph!^Cck%_2yI<5sh=@e$2q4YhNM;EtJBgtiN% zg07C!unY1pKoJIpD)BSX#!q)zUO%>-8{qE{(C)~WZ-CBHb#uE5BnusUKiS<&?1k&c zNNwE$;?jthS1C0Y3GKBKqf(`}Rzt8q?^4;4$dT`O`P)p}6YJ*grgE=Qj>R%+tM}7< zV)=JQpO+Wn_^QTCsh_(7O$)RAMT{Q6-qurihZB||sCA{o?YOtY?IUBeb5q+%l<-r| zL*J9$mR+W_N;h+ghDwE(Df==7e#c`TOK8%DEYhNqGFG^%X*ScS0DVM;4z%LwzoQLr zyc85)qqx@jV!pg2kZm$`RuxMjUZUPEt?lmWY}zORG%1~(YwTZc>{BHCskk{1GP3lE zWh8ARQEChDk|duXT$=h-IA)%MTsp$k98`+=68;Sxd#p3wJb)e$=g_YeFk7b74twg2 z4j#;eJ+x0bY&q*Sw-K4#f&8R@qL;!Z^%`G?>CTD3(_mbgZYv)E%=OiiD9@UJ`7gqQ zZBmbDLN9FxGEJ^NXgvo?IKL%$Q7(3q+PjKxS6iT$sIBYYp&vxiWi8;+U7)>a%=ueQ X*YWo)D|UhZq-h{sJzWZR`6vG$pA3y1 literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_launch_result-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_launch_result-members.html new file mode 100644 index 0000000000..5782eac8f5 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_launch_result-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.LaunchResult Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_launch_result.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_launch_result.html new file mode 100644 index 0000000000..7ccb43d09e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_launch_result.html @@ -0,0 +1,184 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.LaunchResult Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.LaunchResult Class Reference
+
+
+ +

Represents the result of trying to start a DD process + More...

+ + + + +

+Public Member Functions

override string ToString ()
 
+ + + + + + + +

+Properties

TimeSpan? StartupTime [get, set]
 The time it took for System.Diagnostics.Process.WaitForInputIdle() to return. If null the startup timed out More...
 
int? ExitCode [get, set]
 The System.Diagnostics.Process.ExitCode if it exited More...
 
+

Detailed Description

+

Represents the result of trying to start a DD process

+ +

Definition at line 9 of file LaunchResult.cs.

+

Member Function Documentation

+ +

◆ ToString()

+ +
+
+ + + + + + + +
override string Tgstation.Server.Host.Components.Watchdog.LaunchResult.ToString ()
+
+ +

+ +
+
+

Property Documentation

+ +

◆ ExitCode

+ +
+
+ + + + + +
+ + + + +
int? Tgstation.Server.Host.Components.Watchdog.LaunchResult.ExitCode
+
+getset
+
+ +

The System.Diagnostics.Process.ExitCode if it exited

+ +

Definition at line 19 of file LaunchResult.cs.

+
19 { get; set; }
+
+
+ +

◆ StartupTime

+ +
+
+ + + + + +
+ + + + +
TimeSpan? Tgstation.Server.Host.Components.Watchdog.LaunchResult.StartupTime
+
+getset
+
+ +

The time it took for System.Diagnostics.Process.WaitForInputIdle() to return. If null the startup timed out

+ +

Definition at line 14 of file LaunchResult.cs.

+
14 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_monitor_state-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_monitor_state-members.html new file mode 100644 index 0000000000..868619030b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_monitor_state-members.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.MonitorState Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_monitor_state.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_monitor_state.html new file mode 100644 index 0000000000..ddb21b9231 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_monitor_state.html @@ -0,0 +1,255 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.MonitorState Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.MonitorState Class Reference
+
+
+ +

The (absolute) state of the ExperimentalWatchdog + More...

+ + + + + + + + + + + + + + + + + +

+Properties

bool RebootingInactiveServer [get, set]
 If the inactive server is being rebooted More...
 
bool InactiveServerCritFail [get, set]
 If the inactive server is in an unrecoverable state More...
 
MonitorAction NextAction [get, set]
 The next MonitorAction to take in ExperimentalWatchdog.MonitorLifetimes(System.Threading.CancellationToken) More...
 
ISessionController ActiveServer [get, set]
 The active ISessionController More...
 
ISessionController InactiveServer [get, set]
 The inactive ISessionController More...
 
+

Detailed Description

+

The (absolute) state of the ExperimentalWatchdog

+ +

Definition at line 8 of file MonitorState.cs.

+

Property Documentation

+ +

◆ ActiveServer

+ +
+
+ + + + + +
+ + + + +
ISessionController Tgstation.Server.Host.Components.Watchdog.MonitorState.ActiveServer
+
+getset
+
+ +

The active ISessionController

+ +

Definition at line 29 of file MonitorState.cs.

+
29 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.HandlerMonitorWakeup().

+ +
+
+ +

◆ InactiveServer

+ +
+
+ + + + + +
+ + + + +
ISessionController Tgstation.Server.Host.Components.Watchdog.MonitorState.InactiveServer
+
+getset
+
+ +

The inactive ISessionController

+ +

Definition at line 35 of file MonitorState.cs.

+
35 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.HandlerMonitorWakeup().

+ +
+
+ +

◆ InactiveServerCritFail

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.MonitorState.InactiveServerCritFail
+
+getset
+
+ +

If the inactive server is in an unrecoverable state

+ +

Definition at line 18 of file MonitorState.cs.

+
18 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.HandlerMonitorWakeup().

+ +
+
+ +

◆ NextAction

+ +
+
+ + + + + +
+ + + + +
MonitorAction Tgstation.Server.Host.Components.Watchdog.MonitorState.NextAction
+
+getset
+
+ +

The next MonitorAction to take in ExperimentalWatchdog.MonitorLifetimes(System.Threading.CancellationToken)

+ +

Definition at line 23 of file MonitorState.cs.

+
23 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.HandlerMonitorWakeup(), and Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.MonitorLifetimes().

+ +
+
+ +

◆ RebootingInactiveServer

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.MonitorState.RebootingInactiveServer
+
+getset
+
+ +

If the inactive server is being rebooted

+ +

Definition at line 13 of file MonitorState.cs.

+
13 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.HandlerMonitorWakeup().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_posix_network_prompt_reaper-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_posix_network_prompt_reaper-members.html new file mode 100644 index 0000000000..984a491518 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_posix_network_prompt_reaper-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.PosixNetworkPromptReaper Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Watchdog.PosixNetworkPromptReaper, including all inherited members.

+ + +
RegisterProcess(IProcess process)Tgstation.Server.Host.Components.Watchdog.PosixNetworkPromptReaper
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_posix_network_prompt_reaper.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_posix_network_prompt_reaper.html new file mode 100644 index 0000000000..6929b6040d --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_posix_network_prompt_reaper.html @@ -0,0 +1,135 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.PosixNetworkPromptReaper Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.PosixNetworkPromptReaper Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Watchdog.PosixNetworkPromptReaper:
+
+
+ + +Tgstation.Server.Host.Components.Watchdog.INetworkPromptReaper + +
+ + + + + +

+Public Member Functions

void RegisterProcess (IProcess process)
 Register a given process for network prompt reaping More...
 
+

Detailed Description

+
+

Definition at line 6 of file PosixNetworkPromptReaper.cs.

+

Member Function Documentation

+ +

◆ RegisterProcess()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.PosixNetworkPromptReaper.RegisterProcess (IProcess process)
+
+ +

Register a given process for network prompt reaping

+ +

Implements Tgstation.Server.Host.Components.Watchdog.INetworkPromptReaper.

+ +

Definition at line 9 of file PosixNetworkPromptReaper.cs.

+
10  {
11  // POSIX BYOND doesn't prompt you when you change the port
12  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_posix_network_prompt_reaper.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_posix_network_prompt_reaper.png new file mode 100644 index 0000000000000000000000000000000000000000..a6f2f64376192ebe6b005500c55c187be8b24984 GIT binary patch literal 1488 zcmcJPeKgYx7{`BJuZZfn!f=U6tVr@Q%85u*EoU?@d0DNJmkk?sXKbO%aoHq>4k|Y- zY*^lQ*)T78e@o^iQ7S@>lX-t>ckcb`p8NNG&Uv2ad%n+e&hyXbJSlE)7iC3|A^-r& zu!~Lz0FYuzw3~vAq&^UqnoF97+hq@Du~;mTbKh2@(pw(v&GwSd=gXzM)0IetNCey+ zkSy(mpxfgV0LTTvoE$uUl@b;RabNZJ%jJA})F?K1Uu~uLecGmgVM!RCK5cHU7nHG* zgPEuuti?g=@>L6lYdx_Y+X=EU_k9C}`s$a^J~b#^pkTM+-rpe#!U(TtL!$GmVs03~usg?? z?KC5nsYZbre?8VNaFxB*GrDV^OWFSROET_CsL!{7j#P3tH;2;6-Jbhwfa?|YRJ~~B zOF_b#{3dfFj{mT&^b56GvG-BfZtGmuhEi@WUD}rkwt#!(FDtM(21k6AR^>t?Oq`Jpzvx7Db=VI6*Dug8KZz=b>Qhk_=BTO=)PO1+oCT zIW%74;4d)n4-`05aE92GjDWyviavR@GRQ_SL9;*Jrw0#CH4`CtKc`(bymS!Mh1G969R!c$6Q=s#md` z_snEKjEU6#%LpB_H3)1WvU}lfnoIm!{EFx>y?z8#0I4lgB)+hnDW`bf{5TYPYbTUJ zvWtee(2wLzm0^4DJ`1C>slhyWJ)|8{2O>)nd%}EUVZ7oJgg3_cPAbw&G zI076`wzQX{uCA04N=^=P&v50O8XGw5CNZ5I6j90&%kpOyFtTTyZ~niG-4`r`t8o^> zm7~5-Pc|I?pR2c#L1LNS;`H<|G-Fr)UIq;h*ma9msetvn%7J87ylSiE$o<9S;199Z zPgPW}-cyZ}UsdB=@m~!w1w{+lc%)gV?4RH9EI4Ki9rH*aN5M(^Msd-rC+B-cb?P@c z1B(&I2+a)Vsq*_wI8k@`0Fj`Z5bH!El8I}P8aAjIA&04DL3?Ew-p&ste;La-n9SQg z++uHzGxT0)Fx+n5VU3mSaiT+yEH*Q~P zYAY>!wyRFr(quZw=)75L#?hh + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.ReattachInformation Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_reattach_information.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_reattach_information.html new file mode 100644 index 0000000000..43988d4456 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_reattach_information.html @@ -0,0 +1,262 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.ReattachInformation Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.ReattachInformation Class Reference
+
+
+ +

Parameters necessary for duplicating a ISessionController session + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Watchdog.ReattachInformation:
+
+
+ + +Tgstation.Server.Host.Models.ReattachInformationBase +Tgstation.Server.Host.Components.Interop.JsonSubFileList + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

 ReattachInformation ()
 Construct a ReattachInformation More...
 
 ReattachInformation (Models.ReattachInformation copy, IDmbProvider dmb)
 Construct a ReattachInformation from a given copy and dmb More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Models.ReattachInformationBase
override string ToString ()
 
- Public Member Functions inherited from Tgstation.Server.Host.Components.Interop.JsonSubFileList
 JsonSubFileList (JsonSubFileList copy)
 Construct an JsonSubFileList from a copy More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

IDmbProvider Dmb [get, set]
 The IDmbProvider used by DreamDaemon More...
 
- Properties inherited from Tgstation.Server.Host.Models.ReattachInformationBase
string AccessIdentifier [get, set]
 Used to identify and authenticate the DreamDaemon instance More...
 
int ProcessId [get, set]
 The system process ID More...
 
bool IsPrimary [get, set]
 If the Components.IDmbProvider.PrimaryDirectory of the associated dmb is being used More...
 
ushort Port [get, set]
 The port DreamDaemon was last listening on More...
 
RebootState RebootState [get, set]
 The current DreamDaemon reboot state More...
 
- Properties inherited from Tgstation.Server.Host.Components.Interop.JsonSubFileList
string ChatCommandsJson [get, set]
 Path to the chat commands json file More...
 
string ChatChannelsJson [get, set]
 Path to the chat channels json file More...
 
string ServerCommandsJson [get, set]
 Path to the server commands json file More...
 
+ + + + + + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from Tgstation.Server.Host.Models.ReattachInformationBase
 ReattachInformationBase ()
 Construct a ReattachInformationBase More...
 
 ReattachInformationBase (ReattachInformationBase copy)
 Construct a ReattachInformationBase from a given copy More...
 
- Protected Member Functions inherited from Tgstation.Server.Host.Components.Interop.JsonSubFileList
 JsonSubFileList ()
 Construct an JsonSubFileList More...
 
+

Detailed Description

+

Parameters necessary for duplicating a ISessionController session

+ +

Definition at line 9 of file ReattachInformation.cs.

+

Constructor & Destructor Documentation

+ +

◆ ReattachInformation() [1/2]

+ +
+
+ + + + + + + +
Tgstation.Server.Host.Components.Watchdog.ReattachInformation.ReattachInformation ()
+
+ +

Construct a ReattachInformation

+ +

Definition at line 19 of file ReattachInformation.cs.

+
19 { }
+
+
+ +

◆ ReattachInformation() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Watchdog.ReattachInformation.ReattachInformation (Models.ReattachInformation copy,
IDmbProvider dmb 
)
+
+ +

Construct a ReattachInformation from a given copy and dmb

+
Parameters
+ + + +
copyThe Models.ReattachInformation to copy values from
dmbThe value of Dmb
+
+
+ +

Definition at line 26 of file ReattachInformation.cs.

+
26  : base(copy)
27  {
28  Dmb = dmb ?? throw new ArgumentNullException(nameof(dmb));
29  }
IDmbProvider Dmb
The IDmbProvider used by DreamDaemon
+
+

References Tgstation.Server.Host.Components.Watchdog.ReattachInformation.Dmb.

+ +
+
+

Property Documentation

+ +

◆ Dmb

+ + +
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_reattach_information.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_reattach_information.png new file mode 100644 index 0000000000000000000000000000000000000000..725d767c669ef4a5b09b33b9dd42d76441b01fda GIT binary patch literal 1958 zcmcJQeN@u-9>+mjR-3a`u38ywL#k_0tq_?Bddmz8O|nS5?pJf>EFW_CkfCCE&Bz^b zs8@>=SEj2JZ%gwrA+e0iEFbUz0Tmx2Q2|kY3O^WmJ3IH@|MxxT{r$W?=Y0S9oX`8b zzs#dPUbZW~SOJ59^skYO-*vW2fMv$otlHRsy94r_cWW$7JRFkjb$}uS!huL zf#4(N0K(EPiy`|QgIONEKix0s^+!7 z%r5TfPoGU~pEg`U*0zvn=))aUN@@eP<(%ipsjkKitvp||izaq^`y9Pj49a&QMQ(%? z{!EEi19dC|L`V$t+JO-L!)iQ(`&c+6<+Cm|iWC(N-F0@Q=;)u_#9Ajwh0udedOXuj zou<=5PYSNYQ!C3qzp|&YPKZ?_e(m+*^an5Pl75q17&IwgKZQHLt4}UXVkWh;g#d}T z{k#PAi_$muUniandZrY8as?T7iw<&rxgNGUw=ac6-eOSRYkj&(n!rIP%tmb`JDA?w zZ!EEuI+xMbzOrUqGPjCa3i=e+$~F4J?ij@lRH;1ZEmmV^c$?jh>#I4>WGub77lVV^ zm_&DW*MzOHb)@t3Okn{S`n1aRG~fcYa{7a=;p9(Pk(VgomXLW@cKgHtp=G-1I+A;Q zio4_=?Y(Uyv@|{edMFJXsz`(4e=_@NGBaXwv{W0?1AVQs44gyuqqxBnYmV8w?nm9= zCFpKj-8k+y(X_i16F_+O(OH0YtKHiRw&Sz9y<3Ujoij@DhsX_$lDy}=k%J6BH>8p> z%NnY{lG&yu&^gd?n0g*7f_@m0c1ruxQ6XKzN+BGqFHbdLKRGhyv5|>wgF@ z(@TP#&%UeE(;Q0MpjXpeVN}tHA1Gi!21;5}B2r?p^(E;Oz3C&06T8rlSXd3v5|-^d zV~BJ!F~B@gsnc2KwSBi$t-=(B%Z0oLtZI$+Dyws92nhLinw(uJwi_|wmXFJj^JO&i zc4?xU-V8G#+8{5-d)V*_brs%WRMt}geJWqY&p!l7+$UDfea(y<-Qk5HW zEG9g{1lSe}eE^*RSj?T}D+Tg0yOcHV|6E0I&%xu_1oy1>v`LpuaR1ptMXT`c`Ih>Z z$`ogmJc_s*A$hdy0lXNN3@{O!kNmgn89SQY>HXu1h(?kEnQ}cd7G}69*W1FUqC4?~ zdnk`1<0scX%M5tym5Ql}GhO52pw3*%l=wpmE~yzesD0^?LyXaR4F6Me@CNP_gZD0Z zPV81mtC$=rAM>#)|B!>lXusX!Clnw(b+u8(aIL2aJ7U}n{=rRw7Z-k11ul*4`A#zf zvW}{R2k9?ibS1Sp?nU2-+72akEGb5jeUBET5=WbFvJtB`qAV$H-If%=S%h1EAIBvYG{D#>k9T2MqWJ zC&#S-hWXzPQ=IrsX13h?9HOxt#6)etsEH^m7!`YJ6Ve#Z=YSUwA8F7?a z$kXlP1_JYu$f1LF?QVC$mx}0~eGAb!bt0&oXZO$*t9ldXhS6p3ul}8Hk2;l?$O99M z&Ux0x&lc=~VXG;PKE!@AnJ{%YTp&~uB3BByMcjDQ-oXGZ{1Dt&^Z#Dj1Xf2#$d>iP b7wkw*`A64t_C;7eRT$CJ=K$~Tr!M~iZE*v( literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller-members.html new file mode 100644 index 0000000000..e7a3025668 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller-members.html @@ -0,0 +1,125 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.SessionController Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Watchdog.SessionController, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ApiValidationStatusTgstation.Server.Host.Components.Watchdog.SessionController
apiValidationStatusTgstation.Server.Host.Components.Watchdog.SessionControllerprivate
byondLockTgstation.Server.Host.Components.Watchdog.SessionControllerprivate
byondTopicSenderTgstation.Server.Host.Components.Watchdog.SessionControllerprivate
chatTgstation.Server.Host.Components.Watchdog.SessionControllerprivate
chatJsonTrackingContextTgstation.Server.Host.Components.Watchdog.SessionControllerprivate
CheckDisposed()Tgstation.Server.Host.Components.Watchdog.SessionControllerprivate
ClosePortOnRebootTgstation.Server.Host.Components.Watchdog.SessionController
Dispose()Tgstation.Server.Host.Components.Watchdog.SessionController
Dispose(bool disposing)Tgstation.Server.Host.Components.Watchdog.SessionControllerprivate
disposedTgstation.Server.Host.Components.Watchdog.SessionControllerprivate
DmbTgstation.Server.Host.Components.Watchdog.SessionController
EnableCustomChatCommands()Tgstation.Server.Host.Components.Watchdog.SessionController
HandleInterop(CommCommand command, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.SessionController
interopContextTgstation.Server.Host.Components.Watchdog.SessionControllerprivate
IsPrimaryTgstation.Server.Host.Components.Watchdog.SessionController
LaunchResultTgstation.Server.Host.Components.Watchdog.SessionController
launchSecurityLevelTgstation.Server.Host.Components.Watchdog.SessionControllerprivate
LifetimeTgstation.Server.Host.Components.Watchdog.SessionController
loggerTgstation.Server.Host.Components.Watchdog.SessionControllerprivate
nextPortTgstation.Server.Host.Components.Watchdog.SessionControllerprivate
OnRebootTgstation.Server.Host.Components.Watchdog.SessionController
PortTgstation.Server.Host.Components.Watchdog.SessionController
portAssignmentTcsTgstation.Server.Host.Components.Watchdog.SessionControllerprivate
portClosedForRebootTgstation.Server.Host.Components.Watchdog.SessionControllerprivate
processTgstation.Server.Host.Components.Watchdog.SessionControllerprivate
reattachInformationTgstation.Server.Host.Components.Watchdog.SessionControllerprivate
RebootStateTgstation.Server.Host.Components.Watchdog.SessionController
rebootTcsTgstation.Server.Host.Components.Watchdog.SessionControllerprivate
Release()Tgstation.Server.Host.Components.Watchdog.SessionController
releasedTgstation.Server.Host.Components.Watchdog.SessionControllerprivate
ResetRebootState()Tgstation.Server.Host.Components.Watchdog.SessionController
SendCommand(string command, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.SessionController
SendCommand(string command, ushort? overridePort, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.SessionControllerprivate
SessionController(ReattachInformation reattachInformation, IProcess process, IByondExecutableLock byondLock, IByondTopicSender byondTopicSender, IJsonTrackingContext chatJsonTrackingContext, ICommContext interopContext, IChat chat, ILogger< SessionController > logger, DreamDaemonSecurity? launchSecurityLevel, uint? startupTimeout)Tgstation.Server.Host.Components.Watchdog.SessionController
SetHighPriority()Tgstation.Server.Host.Components.Watchdog.SessionController
SetPort(ushort port, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.SessionController
SetRebootState(RebootState newRebootState, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.SessionController
TerminationWasRequestedTgstation.Server.Host.Components.Watchdog.SessionController
~SessionController()Tgstation.Server.Host.Components.Watchdog.SessionControllerprivate
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html new file mode 100644 index 0000000000..e2a069ec09 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html @@ -0,0 +1,1598 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.SessionController Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.SessionController Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Watchdog.SessionController:
+
+
+ + +Tgstation.Server.Host.Components.Watchdog.ISessionController +Tgstation.Server.Host.Components.Interop.ICommHandler +Tgstation.Server.Host.Core.IProcessBase +IDisposable + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 SessionController (ReattachInformation reattachInformation, IProcess process, IByondExecutableLock byondLock, IByondTopicSender byondTopicSender, IJsonTrackingContext chatJsonTrackingContext, ICommContext interopContext, IChat chat, ILogger< SessionController > logger, DreamDaemonSecurity? launchSecurityLevel, uint? startupTimeout)
 Construct a SessionController More...
 
void Dispose ()
 
async Task HandleInterop (CommCommand command, CancellationToken cancellationToken)
 Handle a command More...
 
void EnableCustomChatCommands ()
 Enables the reading of custom chat commands from the ISessionController More...
 
ReattachInformation Release ()
 Releases the IProcess without terminating it. Also calls System.IDisposable.Dispose More...
 
Task< string > SendCommand (string command, CancellationToken cancellationToken)
 Sends a command to DreamDaemon through /world/Topic() More...
 
Task< bool > SetPort (ushort port, CancellationToken cancellationToken)
 Causes the world to start listening on a newPort More...
 
async Task< bool > SetRebootState (RebootState newRebootState, CancellationToken cancellationToken)
 Attempts to change the current RebootState to newRebootState More...
 
void ResetRebootState ()
 Changes RebootState to Components.Watchdog.RebootState.Normal without telling the DMAPI More...
 
void SetHighPriority ()
 Set's the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass.AboveNormal More...
 
+ + + + + +

+Public Attributes

Task< int > Lifetime => process.Lifetime
 
Task OnReboot => rebootTcs.Task
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

bool IsPrimary [get]
 
ApiValidationStatus ApiValidationStatus [get]
 
IDmbProvider Dmb [get]
 
ushort? Port [get]
 
RebootState RebootState [get]
 
bool ClosePortOnReboot [get, set]
 
bool TerminationWasRequested [get, private set]
 
Task< LaunchResultLaunchResult [get]
 
- Properties inherited from Tgstation.Server.Host.Components.Watchdog.ISessionController
Task< LaunchResultLaunchResult [get]
 A Task that completes when DreamDaemon starts pumping the windows message queue after loading a .dmb or when it crashes More...
 
bool IsPrimary [get]
 If the IDmbProvider.PrimaryDirectory of Dmb is being used More...
 
bool TerminationWasRequested [get]
 If the DreamDaemon instance sent a More...
 
ApiValidationStatus ApiValidationStatus [get]
 The DMAPI Components.Watchdog.ApiValidationStatus More...
 
IDmbProvider Dmb [get]
 The IDmbProvider being used More...
 
ushort? Port [get]
 The current port DreamDaemon is listening on More...
 
bool ClosePortOnReboot [get, set]
 If the port should be rotated off when the world reboots More...
 
RebootState RebootState [get]
 The current RebootState More...
 
Task OnReboot [get]
 A Task that completes when the server calls /world/Reboot() More...
 
- Properties inherited from Tgstation.Server.Host.Core.IProcessBase
Task< int > Lifetime [get]
 The Task<TResult> resulting in the exit code of the process More...
 
+ + + + + + + + + + + + +

+Private Member Functions

 ~SessionController ()
 Finalizes an instance of the SessionController class. More...
 
void Dispose (bool disposing)
 Implements the IDisposable pattern More...
 
void CheckDisposed ()
 Throws an ObjectDisposedException if Dispose(bool) has been called More...
 
async Task< string > SendCommand (string command, ushort? overridePort, CancellationToken cancellationToken)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

readonly ReattachInformation reattachInformation
 The up to date ReattachInformation More...
 
readonly IByondTopicSender byondTopicSender
 The IByondTopicSender for the SessionController More...
 
readonly ICommContext interopContext
 The ICommContext for the SessionController More...
 
readonly IProcess process
 The IProcess for the SessionController More...
 
readonly IByondExecutableLock byondLock
 The IByondExecutableLock for the SessionController More...
 
readonly IJsonTrackingContext chatJsonTrackingContext
 The IJsonTrackingContext for the SessionController More...
 
readonly IChat chat
 The IChat for the SessionController More...
 
readonly ILogger< SessionControllerlogger
 The ILogger for the SessionController More...
 
readonly? DreamDaemonSecurity launchSecurityLevel
 The DreamDaemonSecurity level the process was launched with More...
 
TaskCompletionSource< bool > portAssignmentTcs
 The TaskCompletionSource<TResult> SetPort(ushort, CancellationToken) waits on when DreamDaemon currently has it's ports closed More...
 
ushort? nextPort
 The port to assign DreamDaemon when it queries for it More...
 
TaskCompletionSource< object > rebootTcs
 The TaskCompletionSource<TResult> that completes when DD tells us about a reboot More...
 
bool portClosedForReboot
 If we know DreamDaemon currently has it's port closed More...
 
bool disposed
 If the SessionController has been disposed More...
 
ApiValidationStatus apiValidationStatus
 The ApiValidationStatus for the SessionController More...
 
bool released
 If process should be kept alive instead More...
 
+

Detailed Description

+
+

Definition at line 20 of file SessionController.cs.

+

Constructor & Destructor Documentation

+ +

◆ SessionController()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Watchdog.SessionController.SessionController (ReattachInformation reattachInformation,
IProcess process,
IByondExecutableLock byondLock,
IByondTopicSender byondTopicSender,
IJsonTrackingContext chatJsonTrackingContext,
ICommContext interopContext,
IChat chat,
ILogger< SessionControllerlogger,
DreamDaemonSecuritylaunchSecurityLevel,
uint? startupTimeout 
)
+
+ +

Construct a SessionController

+
Parameters
+ + + + + + + + + + + +
reattachInformationThe value of reattachInformation
processThe value of process
byondLockThe value of byondLock
byondTopicSenderThe value of byondTopicSender
interopContextThe value of interopContext
chatThe value of chat
chatJsonTrackingContextThe value of chatJsonTrackingContext
loggerThe value of logger
launchSecurityLevelThe value of launchSecurityLevel
startupTimeoutThe optional time to wait before failing the LaunchResult
+
+
+ +

Definition at line 183 of file SessionController.cs.

+
184  {
185  this.chatJsonTrackingContext = chatJsonTrackingContext; // null valid
186  this.reattachInformation = reattachInformation ?? throw new ArgumentNullException(nameof(reattachInformation));
187  this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
188  this.process = process ?? throw new ArgumentNullException(nameof(process));
189  this.byondLock = byondLock ?? throw new ArgumentNullException(nameof(byondLock));
190  this.interopContext = interopContext ?? throw new ArgumentNullException(nameof(interopContext));
191  this.chat = chat ?? throw new ArgumentNullException(nameof(chat));
192  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
193 
195 
196  interopContext.RegisterHandler(this);
197 
198  portClosedForReboot = false;
199  disposed = false;
200  apiValidationStatus = ApiValidationStatus.NeverValidated;
201  released = false;
202 
203  rebootTcs = new TaskCompletionSource<object>();
204 
205  process.Lifetime.ContinueWith(x => chatJsonTrackingContext.Active = false, TaskScheduler.Current);
206 
207  async Task<LaunchResult> GetLaunchResult()
208  {
209  var startTime = DateTimeOffset.Now;
210  Task toAwait = process.Startup;
211 
212  if (startupTimeout.HasValue)
213  toAwait = Task.WhenAny(process.Startup, Task.Delay(startTime.AddSeconds(startupTimeout.Value) - startTime));
214 
215  await toAwait.ConfigureAwait(false);
216 
217  var result = new LaunchResult
218  {
219  ExitCode = process.Lifetime.IsCompleted ? (int?)await process.Lifetime.ConfigureAwait(false) : null,
220  StartupTime = process.Startup.IsCompleted ? (TimeSpan?)(DateTimeOffset.Now - startTime) : null
221  };
222  return result;
223  }
224 
225  LaunchResult = GetLaunchResult();
226 
227  logger.LogDebug("Created session controller. Primary: {0}, CommsKey: {1}, Port: {2}", IsPrimary, reattachInformation.AccessIdentifier, Port);
228  }
bool disposed
If the SessionController has been disposed
+
readonly ICommContext interopContext
The ICommContext for the SessionController
+
Task< int > Lifetime
The Task<TResult> resulting in the exit code of the process
Definition: IProcessBase.cs:14
+
readonly ReattachInformation reattachInformation
The up to date ReattachInformation
+ +
readonly IProcess process
The IProcess for the SessionController
+ +
readonly IJsonTrackingContext chatJsonTrackingContext
The IJsonTrackingContext for the SessionController
+
bool Active
If the IJsonTrackingContext should be used for GetCustomCommands(CancellationToken)
+
readonly IByondExecutableLock byondLock
The IByondExecutableLock for the SessionController
+
readonly IChat chat
The IChat for the SessionController
+
Task Startup
The Task representing the time until the IProcess becomes "idle"
Definition: IProcess.cs:19
+
void RegisterHandler(ICommHandler handler)
Register a handler with the ICommContext
+ +
readonly ILogger< SessionController > logger
The ILogger for the SessionController
+
TaskCompletionSource< object > rebootTcs
The TaskCompletionSource<TResult> that completes when DD tells us about a reboot
+
readonly? DreamDaemonSecurity launchSecurityLevel
The DreamDaemonSecurity level the process was launched with
+
ApiValidationStatus apiValidationStatus
The ApiValidationStatus for the SessionController
+
bool portClosedForReboot
If we know DreamDaemon currently has it's port closed
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the SessionController
+ +
string AccessIdentifier
Used to identify and authenticate the DreamDaemon instance
+
bool released
If process should be kept alive instead
+
+

References Tgstation.Server.Host.Models.ReattachInformationBase.AccessIdentifier, Tgstation.Server.Host.Components.Chat.IJsonTrackingContext.Active, Tgstation.Server.Host.Components.Watchdog.SessionController.apiValidationStatus, Tgstation.Server.Host.Components.Watchdog.SessionController.byondLock, Tgstation.Server.Host.Components.Watchdog.SessionController.byondTopicSender, Tgstation.Server.Host.Components.Watchdog.SessionController.chat, Tgstation.Server.Host.Components.Watchdog.SessionController.chatJsonTrackingContext, Tgstation.Server.Host.Components.Watchdog.SessionController.disposed, Tgstation.Server.Host.Components.Watchdog.SessionController.interopContext, Tgstation.Server.Host.Components.Watchdog.SessionController.IsPrimary, Tgstation.Server.Host.Components.Watchdog.SessionController.launchSecurityLevel, Tgstation.Server.Host.Core.IProcessBase.Lifetime, Tgstation.Server.Host.Components.Watchdog.SessionController.logger, Tgstation.Server.Host.Components.Watchdog.SessionController.Port, Tgstation.Server.Host.Components.Watchdog.SessionController.portClosedForReboot, Tgstation.Server.Host.Components.Watchdog.SessionController.process, Tgstation.Server.Host.Components.Watchdog.SessionController.reattachInformation, Tgstation.Server.Host.Components.Watchdog.SessionController.rebootTcs, Tgstation.Server.Host.Components.Interop.ICommContext.RegisterHandler(), Tgstation.Server.Host.Components.Watchdog.SessionController.released, and Tgstation.Server.Host.Core.IProcess.Startup.

+ +
+
+ +

◆ ~SessionController()

+ +
+
+ + + + + +
+ + + + + + + +
Tgstation.Server.Host.Components.Watchdog.SessionController.~SessionController ()
+
+private
+
+ +

Finalizes an instance of the SessionController class.

+

The finalizer dispose pattern is necessary so we don't accidentally leak the executable

+ +
+
+

Member Function Documentation

+ +

◆ CheckDisposed()

+ +
+
+ + + + + +
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.SessionController.CheckDisposed ()
+
+private
+
+ +

Throws an ObjectDisposedException if Dispose(bool) has been called

+ +

Definition at line 420 of file SessionController.cs.

+
421  {
422  if (disposed)
423  throw new ObjectDisposedException(nameof(SessionController));
424  }
bool disposed
If the SessionController has been disposed
+
SessionController(ReattachInformation reattachInformation, IProcess process, IByondExecutableLock byondLock, IByondTopicSender byondTopicSender, IJsonTrackingContext chatJsonTrackingContext, ICommContext interopContext, IChat chat, ILogger< SessionController > logger, DreamDaemonSecurity? launchSecurityLevel, uint? startupTimeout)
Construct a SessionController
+
+

References Tgstation.Server.Host.Components.Watchdog.SessionController.disposed.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.Release(), Tgstation.Server.Host.Components.Watchdog.SessionController.ResetRebootState(), and Tgstation.Server.Host.Components.Watchdog.SessionController.SetPort().

+ +
+
+ +

◆ Dispose() [1/2]

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.SessionController.Dispose ()
+
+ +

+ +

Definition at line 239 of file SessionController.cs.

+
240  {
241  Dispose(true);
242  GC.SuppressFinalize(this);
243  }
+
+

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.Release().

+ +
+
+ +

◆ Dispose() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.SessionController.Dispose (bool disposing)
+
+private
+
+ +

Implements the IDisposable pattern

+
Parameters
+ + +
disposingIf this function was NOT called by the finalizer
+
+
+ +

Definition at line 249 of file SessionController.cs.

+
250  {
251  lock (this)
252  {
253  if (disposed)
254  return;
255  if (disposing)
256  {
257  if (!released)
258  {
259  process.Terminate();
260  byondLock.Dispose();
261  }
262 
263  process.Dispose();
264  interopContext.Dispose();
265  Dmb?.Dispose(); // will be null when released
266  chatJsonTrackingContext.Dispose();
267  disposed = true;
268  }
269  else
270  {
271  if (logger != null)
272  logger.LogError("Being disposed via finalizer!");
273  if (!released)
274  if (process != null)
275  process.Terminate();
276  else if (logger != null)
277  logger.LogCritical("Unable to terminate active DreamDaemon session due to finalizer ordering!");
278  }
279  }
280  }
bool disposed
If the SessionController has been disposed
+
readonly ICommContext interopContext
The ICommContext for the SessionController
+
readonly IProcess process
The IProcess for the SessionController
+
readonly IJsonTrackingContext chatJsonTrackingContext
The IJsonTrackingContext for the SessionController
+
readonly IByondExecutableLock byondLock
The IByondExecutableLock for the SessionController
+
void Terminate()
Terminates the process
+
readonly ILogger< SessionController > logger
The ILogger for the SessionController
+ +
bool released
If process should be kept alive instead
+
+

References Tgstation.Server.Host.Components.Watchdog.SessionController.byondLock, Tgstation.Server.Host.Components.Watchdog.SessionController.chatJsonTrackingContext, Tgstation.Server.Host.Components.Watchdog.SessionController.disposed, Tgstation.Server.Host.Components.Watchdog.SessionController.Dmb, Tgstation.Server.Host.Components.Watchdog.SessionController.interopContext, Tgstation.Server.Host.Components.Watchdog.SessionController.logger, Tgstation.Server.Host.Components.Watchdog.SessionController.process, Tgstation.Server.Host.Components.Watchdog.SessionController.released, and Tgstation.Server.Host.Core.IProcess.Terminate().

+ +
+
+ +

◆ EnableCustomChatCommands()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.SessionController.EnableCustomChatCommands ()
+
+ +

Enables the reading of custom chat commands from the ISessionController

+ +

Implements Tgstation.Server.Host.Components.Watchdog.ISessionController.

+ +
+
+ +

◆ HandleInterop()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.SessionController.HandleInterop (CommCommand command,
CancellationToken cancellationToken 
)
+
+ +

Handle a command

+ +

Implements Tgstation.Server.Host.Components.Interop.ICommHandler.

+ +

Definition at line 284 of file SessionController.cs.

+
285  {
286  if (command == null)
287  throw new ArgumentNullException(nameof(command));
288 
289  var query = command.Parameters;
290 
291  object content;
292  Action postRespond = null;
293  ushort? overrideResponsePort = null;
294  if (query.TryGetValue(Constants.DMParameterCommand, out var method))
295  {
296  content = new object();
297  switch (method)
298  {
300  try
301  {
302  var message = JsonConvert.DeserializeObject<Response>(command.RawJson, new JsonSerializerSettings
303  {
304  ContractResolver = new CamelCasePropertyNamesContractResolver()
305  });
306  if (message.ChannelIds == null)
307  throw new InvalidOperationException("Missing ChannelIds field!");
308  if (message.Message == null)
309  throw new InvalidOperationException("Missing Message field!");
310  await chat.SendMessage(message.Message, message.ChannelIds, cancellationToken).ConfigureAwait(false);
311  }
312  catch (Exception e)
313  {
314  logger.LogDebug("Exception while decoding chat message! Exception: {0}", e);
315  goto default;
316  }
317 
318  break;
320  // currently unused, maybe in the future
321  break;
324  process.Terminate();
325  return;
327  lock (this)
328  {
329  if (!query.TryGetValue(Constants.DMParameterData, out var stringPortObject) || !UInt16.TryParse(stringPortObject as string, out var currentPort))
330  {
332  logger.LogWarning("DreamDaemon sent new port command without providing it's own!");
333  content = new ErrorMessage { Message = "Missing stringified port as data parameter!" };
334  break;
335  }
336 
337  if (!nextPort.HasValue)
338  reattachInformation.Port = currentPort; // not ready yet, so what we'll do is accept the random port DD opened on for now and change it later when we decide to
339  else
340  {
341  // nextPort is ready, tell DD to switch to that
342  // if it fails it'll kill itself
343  content = new Dictionary<string, ushort> { { Constants.DMParameterData, nextPort.Value } };
345  overrideResponsePort = currentPort;
346  nextPort = null;
347 
348  // we'll also get here from SetPort so complete that task
349  var tmpTcs = portAssignmentTcs;
350  portAssignmentTcs = null;
351  if (tmpTcs != null)
352  postRespond = () => tmpTcs.SetResult(true);
353  }
354 
355  portClosedForReboot = false;
356  }
357 
358  break;
360  if (!launchSecurityLevel.HasValue)
361  {
362  logger.LogWarning("DreamDaemon requested API validation but no intial security level was passed to the session controller!");
363  apiValidationStatus = ApiValidationStatus.UnaskedValidationRequest;
364  content = new ErrorMessage { Message = "Invalid API validation request!" };
365  break;
366  }
367 
368  if (!query.TryGetValue(Constants.DMParameterData, out var stringMinimumSecurityLevelObject) || !Enum.TryParse<DreamDaemonSecurity>(stringMinimumSecurityLevelObject as string, out var minimumSecurityLevel))
369  apiValidationStatus = ApiValidationStatus.BadValidationRequest;
370  else
371  switch (minimumSecurityLevel)
372  {
373  case DreamDaemonSecurity.Safe:
375  break;
376  case DreamDaemonSecurity.Ultrasafe:
377  apiValidationStatus = ApiValidationStatus.RequiresUltrasafe;
378  break;
379  case DreamDaemonSecurity.Trusted:
380  apiValidationStatus = ApiValidationStatus.RequiresTrusted;
381  break;
382  default:
383  throw new InvalidOperationException("Enum.TryParse failed to validate the DreamDaemonSecurity range!");
384  }
385 
386  break;
388  if (ClosePortOnReboot)
389  {
391  content = new Dictionary<string, int> { { Constants.DMParameterData, 0 } };
392  portClosedForReboot = true;
393  }
394 
395  var oldTcs = rebootTcs;
396  rebootTcs = new TaskCompletionSource<object>();
397  postRespond = () => oldTcs.SetResult(null);
398  break;
399  default:
400  content = new ErrorMessage { Message = "Requested command not supported!" };
401  break;
402  }
403  }
404  else
405  content = new ErrorMessage { Message = "Missing command parameter!" };
406 
407  var json = JsonConvert.SerializeObject(content);
408  var response = await SendCommand(String.Format(CultureInfo.InvariantCulture, "{0}&{1}={2}", byondTopicSender.SanitizeString(Constants.DMTopicInteropResponse), byondTopicSender.SanitizeString(Constants.DMParameterData), byondTopicSender.SanitizeString(json)), overrideResponsePort, cancellationToken).ConfigureAwait(false);
409 
410  if (response != Constants.DMResponseSuccess)
411  logger.LogWarning("Received error response while responding to interop: {0}", response);
412 
413  postRespond?.Invoke();
414  }
const string DMCommandWorldReboot
World reboot command
Definition: Constants.cs:71
+
IReadOnlyDictionary< string, object > Parameters
The dictionary of the CommCommand
Definition: CommCommand.cs:13
+
readonly ReattachInformation reattachInformation
The up to date ReattachInformation
+
ushort? nextPort
The port to assign DreamDaemon when it queries for it
+ +
readonly IProcess process
The IProcess for the SessionController
+ +
readonly IJsonTrackingContext chatJsonTrackingContext
The IJsonTrackingContext for the SessionController
+
bool Active
If the IJsonTrackingContext should be used for GetCustomCommands(CancellationToken)
+
readonly IChat chat
The IChat for the SessionController
+
string RawJson
The raw JSON of the CommCommand
Definition: CommCommand.cs:18
+ +
TaskCompletionSource< bool > portAssignmentTcs
The TaskCompletionSource<TResult> SetPort(ushort, CancellationToken) waits on when DreamDaemon curren...
+
const string DMCommandEndProcess
Terminate process command
Definition: Constants.cs:76
+
const string DMCommandApiValidate
API validation command
Definition: Constants.cs:61
+
ushort Port
The port DreamDaemon was last listening on
+
void Terminate()
Terminates the process
+
const string DMTopicInteropResponse
Response to an interop export from DM
Definition: Constants.cs:51
+
readonly ILogger< SessionController > logger
The ILogger for the SessionController
+
TaskCompletionSource< object > rebootTcs
The TaskCompletionSource<TResult> that completes when DD tells us about a reboot
+
const string DMCommandServerPrimed
Server primed command
Definition: Constants.cs:66
+ +
Task SendMessage(string message, IEnumerable< ulong > channelIds, CancellationToken cancellationToken)
Send a chat message to a given set of channelIds
+
Constants used for communication with the DMAPI
Definition: Constants.cs:6
+
readonly? DreamDaemonSecurity launchSecurityLevel
The DreamDaemonSecurity level the process was launched with
+
const string DMResponseSuccess
Generic OK response
Definition: Constants.cs:26
+
const string DMParameterCommand
Topic command parameter
Definition: Constants.cs:86
+
ApiValidationStatus apiValidationStatus
The ApiValidationStatus for the SessionController
+
const string DMCommandNewPort
Set port command
Definition: Constants.cs:56
+
Task< string > SendCommand(string command, CancellationToken cancellationToken)
Sends a command to DreamDaemon through /world/Topic()
+
DreamDaemonSecurity
DreamDaemon's security level
+
bool portClosedForReboot
If we know DreamDaemon currently has it's port closed
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the SessionController
+
const string DMCommandChat
Chat send command
Definition: Constants.cs:81
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
Represents a chat message requested by DD
Definition: Response.cs:8
+
+

References Tgstation.Server.Host.Components.Chat.IJsonTrackingContext.Active, Tgstation.Server.Host.Components.Watchdog.SessionController.apiValidationStatus, Tgstation.Server.Host.Components.Watchdog.SessionController.byondTopicSender, Tgstation.Server.Host.Components.Watchdog.SessionController.chat, Tgstation.Server.Host.Components.Watchdog.SessionController.chatJsonTrackingContext, Tgstation.Server.Host.Components.Watchdog.SessionController.ClosePortOnReboot, Tgstation.Server.Host.Components.Interop.Constants.DMCommandApiValidate, Tgstation.Server.Host.Components.Interop.Constants.DMCommandChat, Tgstation.Server.Host.Components.Interop.Constants.DMCommandEndProcess, Tgstation.Server.Host.Components.Interop.Constants.DMCommandNewPort, Tgstation.Server.Host.Components.Interop.Constants.DMCommandServerPrimed, Tgstation.Server.Host.Components.Interop.Constants.DMCommandWorldReboot, Tgstation.Server.Host.Components.Interop.Constants.DMParameterCommand, Tgstation.Server.Host.Components.Interop.Constants.DMParameterData, Tgstation.Server.Host.Components.Interop.Constants.DMResponseSuccess, Tgstation.Server.Host.Components.Interop.Constants.DMTopicInteropResponse, Tgstation.Server.Host.Components.Watchdog.SessionController.launchSecurityLevel, Tgstation.Server.Host.Components.Watchdog.SessionController.logger, Tgstation.Server.Host.Components.Watchdog.SessionController.nextPort, Tgstation.Server.Host.Components.Interop.CommCommand.Parameters, Tgstation.Server.Host.Models.ReattachInformationBase.Port, Tgstation.Server.Host.Components.Watchdog.SessionController.portAssignmentTcs, Tgstation.Server.Host.Components.Watchdog.SessionController.portClosedForReboot, Tgstation.Server.Host.Components.Watchdog.SessionController.process, Tgstation.Server.Host.Components.Interop.CommCommand.RawJson, Tgstation.Server.Host.Components.Watchdog.SessionController.reattachInformation, Tgstation.Server.Host.Components.Watchdog.SessionController.rebootTcs, Tgstation.Server.Host.Components.Watchdog.SessionController.SendCommand(), Tgstation.Server.Host.Components.Chat.IChat.SendMessage(), Tgstation.Server.Host.Core.IProcess.Terminate(), and Tgstation.Server.Host.Components.Watchdog.SessionController.TerminationWasRequested.

+ +
+
+ +

◆ Release()

+ +
+
+ + + + + + + +
ReattachInformation Tgstation.Server.Host.Components.Watchdog.SessionController.Release ()
+
+ +

Releases the IProcess without terminating it. Also calls System.IDisposable.Dispose

+ +

Implements Tgstation.Server.Host.Components.Watchdog.ISessionController.

+ +

Definition at line 430 of file SessionController.cs.

+
431  {
432  CheckDisposed();
433 
434  // we still don't want to dispose the dmb yet, even though we're keeping it alive
435  var tmpProvider = reattachInformation.Dmb;
436  reattachInformation.Dmb = null;
437  released = true;
438  Dispose();
440  tmpProvider.KeepAlive();
441  reattachInformation.Dmb = tmpProvider;
442  return reattachInformation;
443  }
readonly ReattachInformation reattachInformation
The up to date ReattachInformation
+ +
readonly IByondExecutableLock byondLock
The IByondExecutableLock for the SessionController
+
void CheckDisposed()
Throws an ObjectDisposedException if Dispose(bool) has been called
+
IDmbProvider Dmb
The IDmbProvider used by DreamDaemon
+
void DoNotDeleteThisSession()
Call if, during a detach, this version should not be deleted
+
bool released
If process should be kept alive instead
+
+

References Tgstation.Server.Host.Components.Watchdog.SessionController.byondLock, Tgstation.Server.Host.Components.Watchdog.SessionController.CheckDisposed(), Tgstation.Server.Host.Components.Watchdog.SessionController.Dispose(), Tgstation.Server.Host.Components.Watchdog.ReattachInformation.Dmb, Tgstation.Server.Host.Components.Byond.IByondExecutableLock.DoNotDeleteThisSession(), Tgstation.Server.Host.Components.Watchdog.SessionController.reattachInformation, and Tgstation.Server.Host.Components.Watchdog.SessionController.released.

+ +
+
+ +

◆ ResetRebootState()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.SessionController.ResetRebootState ()
+
+
+ +

◆ SendCommand() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<string> Tgstation.Server.Host.Components.Watchdog.SessionController.SendCommand (string command,
CancellationToken cancellationToken 
)
+
+
+ +

◆ SendCommand() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task<string> Tgstation.Server.Host.Components.Watchdog.SessionController.SendCommand (string command,
ushort? overridePort,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Definition at line 448 of file SessionController.cs.

+
449  {
450  try
451  {
452  var commandString = String.Format(CultureInfo.InvariantCulture,
453  "?{0}={1}&{2}={3}",
457  command); // intentionally don't sanitize command, that's up to the caller
458 
459  var targetPort = overridePort ?? reattachInformation.Port;
460  logger.LogTrace("Export to :{0}. Query: {1}", targetPort, commandString);
461 
462  return await byondTopicSender.SendTopic(
463  new IPEndPoint(IPAddress.Loopback, targetPort),
464  commandString,
465  cancellationToken).ConfigureAwait(false);
466  }
467  catch (OperationCanceledException)
468  {
469  throw;
470  }
471  catch (Exception e)
472  {
473  logger.LogInformation("Send command exception:{0}{1}", Environment.NewLine, e.Message);
474  return null;
475  }
476  }
readonly ReattachInformation reattachInformation
The up to date ReattachInformation
+
ushort Port
The port DreamDaemon was last listening on
+
readonly ILogger< SessionController > logger
The ILogger for the SessionController
+
Constants used for communication with the DMAPI
Definition: Constants.cs:6
+
const string DMParameterCommand
Topic command parameter
Definition: Constants.cs:86
+
const string DMInteropAccessIdentifier
The JsonFile.AccessIdentifier
Definition: Constants.cs:21
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the SessionController
+
string AccessIdentifier
Used to identify and authenticate the DreamDaemon instance
+
+

References Tgstation.Server.Host.Models.ReattachInformationBase.AccessIdentifier, Tgstation.Server.Host.Components.Watchdog.SessionController.byondTopicSender, Tgstation.Server.Host.Components.Interop.Constants.DMInteropAccessIdentifier, Tgstation.Server.Host.Components.Interop.Constants.DMParameterCommand, Tgstation.Server.Host.Components.Watchdog.SessionController.logger, Tgstation.Server.Host.Models.ReattachInformationBase.Port, and Tgstation.Server.Host.Components.Watchdog.SessionController.reattachInformation.

+ +
+
+ +

◆ SetHighPriority()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.SessionController.SetHighPriority ()
+
+ +

Set's the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass.AboveNormal

+ +

Implements Tgstation.Server.Host.Core.IProcessBase.

+ +
+
+ +

◆ SetPort()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<bool> Tgstation.Server.Host.Components.Watchdog.SessionController.SetPort (ushort port,
CancellationToken cancellationToken 
)
+
+ +

Causes the world to start listening on a newPort

+ +

Implements Tgstation.Server.Host.Components.Watchdog.ISessionController.

+ +

Definition at line 479 of file SessionController.cs.

+
480  {
481  CheckDisposed();
482 
483  if (port == 0)
484  throw new ArgumentOutOfRangeException(nameof(port), port, "port must not be zero!");
485 
486  async Task<bool> ImmediateTopicPortChange()
487  {
488  var commandResult = await SendCommand(String.Format(CultureInfo.InvariantCulture, "{0}&{1}={2}", byondTopicSender.SanitizeString(Constants.DMTopicChangePort), byondTopicSender.SanitizeString(Constants.DMParameterData), byondTopicSender.SanitizeString(port.ToString(CultureInfo.InvariantCulture))), cancellationToken).ConfigureAwait(false);
489 
490  if (commandResult != Constants.DMResponseSuccess)
491  {
492  logger.LogWarning("Failed port change! DD says: {0}", commandResult);
493  return false;
494  }
495 
496  reattachInformation.Port = port;
497  return true;
498  }
499 
500  lock (this)
502  {
503  if (portAssignmentTcs != null)
504  throw new InvalidOperationException("A port change operation is already in progress!");
505  nextPort = port;
506  portAssignmentTcs = new TaskCompletionSource<bool>();
507  return portAssignmentTcs.Task;
508  }
509  else
510  return ImmediateTopicPortChange();
511  }
readonly ReattachInformation reattachInformation
The up to date ReattachInformation
+
ushort? nextPort
The port to assign DreamDaemon when it queries for it
+
TaskCompletionSource< bool > portAssignmentTcs
The TaskCompletionSource<TResult> SetPort(ushort, CancellationToken) waits on when DreamDaemon curren...
+
void CheckDisposed()
Throws an ObjectDisposedException if Dispose(bool) has been called
+
ushort Port
The port DreamDaemon was last listening on
+ +
readonly ILogger< SessionController > logger
The ILogger for the SessionController
+ +
Constants used for communication with the DMAPI
Definition: Constants.cs:6
+
const string DMResponseSuccess
Generic OK response
Definition: Constants.cs:26
+
Task< string > SendCommand(string command, CancellationToken cancellationToken)
Sends a command to DreamDaemon through /world/Topic()
+
bool portClosedForReboot
If we know DreamDaemon currently has it's port closed
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the SessionController
+
+

References Tgstation.Server.Host.Components.Watchdog.SessionController.byondTopicSender, Tgstation.Server.Host.Components.Watchdog.SessionController.CheckDisposed(), Tgstation.Server.Host.Components.Interop.Constants.DMParameterData, Tgstation.Server.Host.Components.Interop.Constants.DMResponseSuccess, Tgstation.Server.Host.Components.Interop.Constants.DMTopicChangePort, Tgstation.Server.Host.Components.Watchdog.SessionController.logger, Tgstation.Server.Host.Components.Watchdog.SessionController.nextPort, Tgstation.Server.Host.Models.ReattachInformationBase.Port, Tgstation.Server.Host.Components.Watchdog.SessionController.portAssignmentTcs, Tgstation.Server.Host.Components.Watchdog.SessionController.portClosedForReboot, Tgstation.Server.Host.Components.Watchdog.SessionController.reattachInformation, and Tgstation.Server.Host.Components.Watchdog.SessionController.SendCommand().

+ +
+
+ +

◆ SetRebootState()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task<bool> Tgstation.Server.Host.Components.Watchdog.SessionController.SetRebootState (RebootState newRebootState,
CancellationToken cancellationToken 
)
+
+ +

Attempts to change the current RebootState to newRebootState

+ +

Implements Tgstation.Server.Host.Components.Watchdog.ISessionController.

+ +

Definition at line 514 of file SessionController.cs.

+
515  {
516  if (RebootState == newRebootState)
517  return true;
518  reattachInformation.RebootState = newRebootState;
519  return await SendCommand(String.Format(CultureInfo.InvariantCulture, "{0}&{1}={2}", byondTopicSender.SanitizeString(Constants.DMTopicChangeReboot), byondTopicSender.SanitizeString(Constants.DMParameterData), (int)newRebootState), cancellationToken).ConfigureAwait(false) == Constants.DMResponseSuccess;
520  }
readonly ReattachInformation reattachInformation
The up to date ReattachInformation
+ +
Constants used for communication with the DMAPI
Definition: Constants.cs:6
+
const string DMResponseSuccess
Generic OK response
Definition: Constants.cs:26
+
Task< string > SendCommand(string command, CancellationToken cancellationToken)
Sends a command to DreamDaemon through /world/Topic()
+
const string DMTopicChangeReboot
Change reboot mode
Definition: Constants.cs:36
+ +
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the SessionController
+
RebootState RebootState
The current DreamDaemon reboot state
+
+

References Tgstation.Server.Host.Components.Watchdog.SessionController.byondTopicSender, Tgstation.Server.Host.Components.Interop.Constants.DMParameterData, Tgstation.Server.Host.Components.Interop.Constants.DMResponseSuccess, Tgstation.Server.Host.Components.Interop.Constants.DMTopicChangeReboot, Tgstation.Server.Host.Components.Watchdog.SessionController.reattachInformation, Tgstation.Server.Host.Models.ReattachInformationBase.RebootState, and Tgstation.Server.Host.Components.Watchdog.SessionController.SendCommand().

+ +
+
+

Member Data Documentation

+ +

◆ apiValidationStatus

+ +
+
+ + + + + +
+ + + + +
ApiValidationStatus Tgstation.Server.Host.Components.Watchdog.SessionController.apiValidationStatus
+
+private
+
+
+ +

◆ byondLock

+ +
+
+ + + + + +
+ + + + +
readonly IByondExecutableLock Tgstation.Server.Host.Components.Watchdog.SessionController.byondLock
+
+private
+
+
+ +

◆ byondTopicSender

+ + + +

◆ chat

+ +
+
+ + + + + +
+ + + + +
readonly IChat Tgstation.Server.Host.Components.Watchdog.SessionController.chat
+
+private
+
+
+ +

◆ chatJsonTrackingContext

+ +
+
+ + + + + +
+ + + + +
readonly IJsonTrackingContext Tgstation.Server.Host.Components.Watchdog.SessionController.chatJsonTrackingContext
+
+private
+
+
+ +

◆ disposed

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.SessionController.disposed
+
+private
+
+
+ +

◆ interopContext

+ +
+
+ + + + + +
+ + + + +
readonly ICommContext Tgstation.Server.Host.Components.Watchdog.SessionController.interopContext
+
+private
+
+
+ +

◆ launchSecurityLevel

+ +
+
+ + + + + +
+ + + + +
readonly? DreamDaemonSecurity Tgstation.Server.Host.Components.Watchdog.SessionController.launchSecurityLevel
+
+private
+
+
+ +

◆ Lifetime

+ +
+
+ + + + +
Task<int> Tgstation.Server.Host.Components.Watchdog.SessionController.Lifetime => process.Lifetime
+
+ +

+ +

Definition at line 85 of file SessionController.cs.

+ +
+
+ +

◆ logger

+ + + +

◆ nextPort

+ +
+
+ + + + + +
+ + + + +
ushort? Tgstation.Server.Host.Components.Watchdog.SessionController.nextPort
+
+private
+
+ +

The port to assign DreamDaemon when it queries for it

+ +

Definition at line 143 of file SessionController.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.HandleInterop(), and Tgstation.Server.Host.Components.Watchdog.SessionController.SetPort().

+ +
+
+ +

◆ OnReboot

+ +
+
+ + + + +
Task Tgstation.Server.Host.Components.Watchdog.SessionController.OnReboot => rebootTcs.Task
+
+ +

+ +

Definition at line 88 of file SessionController.cs.

+ +
+
+ +

◆ portAssignmentTcs

+ +
+
+ + + + + +
+ + + + +
TaskCompletionSource<bool> Tgstation.Server.Host.Components.Watchdog.SessionController.portAssignmentTcs
+
+private
+
+ +

The TaskCompletionSource<TResult> SetPort(ushort, CancellationToken) waits on when DreamDaemon currently has it's ports closed

+ +

Definition at line 138 of file SessionController.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.HandleInterop(), and Tgstation.Server.Host.Components.Watchdog.SessionController.SetPort().

+ +
+
+ +

◆ portClosedForReboot

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.SessionController.portClosedForReboot
+
+private
+
+
+ +

◆ process

+ +
+
+ + + + + +
+ + + + +
readonly IProcess Tgstation.Server.Host.Components.Watchdog.SessionController.process
+
+private
+
+
+ +

◆ reattachInformation

+ + + +

◆ rebootTcs

+ +
+
+ + + + + +
+ + + + +
TaskCompletionSource<object> Tgstation.Server.Host.Components.Watchdog.SessionController.rebootTcs
+
+private
+
+ +

The TaskCompletionSource<TResult> that completes when DD tells us about a reboot

+ +

Definition at line 148 of file SessionController.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.HandleInterop(), and Tgstation.Server.Host.Components.Watchdog.SessionController.SessionController().

+ +
+
+ +

◆ released

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.SessionController.released
+
+private
+
+
+

Property Documentation

+ +

◆ ApiValidationStatus

+ +
+
+ + + + + +
+ + + + +
ApiValidationStatus Tgstation.Server.Host.Components.Watchdog.SessionController.ApiValidationStatus
+
+get
+
+ +

+ +

Definition at line 34 of file SessionController.cs.

+
34  {
35  get
36  {
37  if (!Lifetime.IsCompleted)
38  throw new InvalidOperationException("ApiValidated cannot be checked while Lifetime is incomplete!");
39  return apiValidationStatus;
40  }
41  }
+
ApiValidationStatus apiValidationStatus
The ApiValidationStatus for the SessionController
+
+
+
+ +

◆ ClosePortOnReboot

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.SessionController.ClosePortOnReboot
+
+getset
+
+ +

+ +

Definition at line 76 of file SessionController.cs.

+
76 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.HandleInterop().

+ +
+
+ +

◆ Dmb

+ +
+
+ + + + + +
+ + + + +
IDmbProvider Tgstation.Server.Host.Components.Watchdog.SessionController.Dmb
+
+get
+
+ +

+ +

Definition at line 45 of file SessionController.cs.

+
45  {
46  get
47  {
48  CheckDisposed();
49  return reattachInformation.Dmb;
50  }
51  }
readonly ReattachInformation reattachInformation
The up to date ReattachInformation
+
void CheckDisposed()
Throws an ObjectDisposedException if Dispose(bool) has been called
+
IDmbProvider Dmb
The IDmbProvider used by DreamDaemon
+
+

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.Dispose().

+ +
+
+ +

◆ IsPrimary

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.SessionController.IsPrimary
+
+get
+
+ +

+ +

Definition at line 24 of file SessionController.cs.

+
24  {
25  get
26  {
27  CheckDisposed();
29  }
30  }
readonly ReattachInformation reattachInformation
The up to date ReattachInformation
+
void CheckDisposed()
Throws an ObjectDisposedException if Dispose(bool) has been called
+
bool IsPrimary
If the Components.IDmbProvider.PrimaryDirectory of the associated dmb is being used
+
+

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.SessionController().

+ +
+
+ +

◆ LaunchResult

+ +
+
+ + + + + +
+ + + + +
Task<LaunchResult> Tgstation.Server.Host.Components.Watchdog.SessionController.LaunchResult
+
+get
+
+ +

+ +

Definition at line 82 of file SessionController.cs.

+
82 { get; }
+
+
+ +

◆ Port

+ +
+
+ + + + + +
+ + + + +
ushort? Tgstation.Server.Host.Components.Watchdog.SessionController.Port
+
+get
+
+ +

+ +

Definition at line 55 of file SessionController.cs.

+
55  {
56  get
57  {
58  CheckDisposed();
60  return null;
62  }
63  }
readonly ReattachInformation reattachInformation
The up to date ReattachInformation
+
void CheckDisposed()
Throws an ObjectDisposedException if Dispose(bool) has been called
+
ushort Port
The port DreamDaemon was last listening on
+
bool portClosedForReboot
If we know DreamDaemon currently has it's port closed
+
+

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.SessionController().

+ +
+
+ +

◆ RebootState

+ +
+
+ + + + + +
+ + + + +
RebootState Tgstation.Server.Host.Components.Watchdog.SessionController.RebootState
+
+get
+
+ +

+ +

Definition at line 67 of file SessionController.cs.

+
67  {
68  get
69  {
70  CheckDisposed();
72  }
73  }
readonly ReattachInformation reattachInformation
The up to date ReattachInformation
+
void CheckDisposed()
Throws an ObjectDisposedException if Dispose(bool) has been called
+
RebootState RebootState
The current DreamDaemon reboot state
+
+
+
+ +

◆ TerminationWasRequested

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.SessionController.TerminationWasRequested
+
+getprivate set
+
+ +

+ +

Definition at line 79 of file SessionController.cs.

+
79 { get; private set; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.HandleInterop().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..a122b87ceb1fc6ddf377eeb2ef44215b7bf16575 GIT binary patch literal 3103 zcmc&$X;f3!76zDA!3*;Tp~k)AtZS>ukGu4YjyS4d+VLG?!D*U^PO|g-sju< z+nE>K9QUdpQddz?*^54Je^Et6O$_zBc5Z|2emBOlpoh){7cU2eLIHIbmPGM6Kiq+O z|GK)my0&Ld7(%Z*uU~ZYRDnRsHrnfTN=0Qi18x7YSCT3?3HsEX)%tXrTwvC&a6T7a zdE}$I$#K`E;A2fE4jUR9=gu(W^td5<+?Dg+rMcZgUxe}E^2CF=!{^W%G#0r$PmI2H zvc_(`n&nQpaSW`4*AOUrE?7-FNe`eY9OLrWZO{g%MkQ{euvh1mpJxH2AP%d!J+)_d z7*g?OVuRc_#JeYLJG4&>~x1hyl;#n1pMdqH?OCa^R945J~{A0l|ajLI`NxKG3 zwtX4TQcU#w0+`+@WNn!|1(vD}<1wqD4Yl79FGk7T{Bb*BJRw#2Ax(Vy$w>3mx2~3p zU&18$%C#^I8JF)Z%j);+-a5lil@D~dyXVeWUIb9?#0D|CaoTsW6vnUoEBlx<0;S#d zuPiD2@rAB?Mz1Q<_Ip4Ocoho**ed~F4;!dky;EbS75jk`1hiKIGmXIi8F1iK zw!rU}z{+5k)?lU?`X|+vlzGT9II>PAHIS?b zuGDQ!Aee>)!vg~YwI%(V*O1S!Am?zt9I50eBcckUj+Us`q#o~KD<6#Ffl@`<vKtNXWrrGsx&%tMom!tj{04`e|Rq(!PMV7)EL{9)f%3VO9b zIkRGzI7^~vp&K2QCVPPMmu#WKeO?Pud}}Ehx#uc@lKQc7$REtDK2IV4?P32B;|IBM zCJ@PU-cmPuad7IpG_@zt5)i35oK=XmdzGv;n4%+um1#{%=GRtL|G#McXGGcdS!G`_ z%N8WT@)b~U5_Od33jD$=U=9>LM<{g3o&X$;bdtiXOQ9sU=>buH8p?9RIm(n*3#B>Y z&wyq@CoF3*K`M_BMH1_=c`*EE-_wmT!cM*iWiGs!F!A$}O9;nxL>#SS)6SZ<4HyZRr9htG z?FUHKOUNO)%(ZPPrGh#6@(QpUX&i*%&OV84tvKH75XD-%(Yj%AW^Ett-MQY4WtvJN zD@K564oWvW6Ld7{9l?5Qk;3igv6XYu;s_8XI0j-!=;D`wJMj(3LkX?asCgp#rzhsQ zp*;c8V^g#FhdB`*!9kSA%`_hSE^md__c@(`a%uWSHyOv-b60=MO=fY+VIP>95gJdg z^6N?MlM?3`C_AdG4#9hnwBI{W)Ln1cU}(CSQjBg4ag@>)A6I*ewfzk!_x+~a5JE10 z@-V<#)=U;gn05BeH4}DOd=Ul5O$H`jnTSg6(#B)5|JOU_V|t>8 z-u~{V(LNJH9oA!p^KZ0!={c>zxdQJ(&f)TbmCqZZ5#mpzR~PtW9c2TeC51ES%X_m8 z#3Z17;EN}|LXHyS%wuvI%R=G2n|J_e>*3q#Z&075XW2T*TY0o!)JLCvV$rfdY+6f2 zNkys4M+EK((yMu-Dp{Q=Z~5?R=oI1yZEFcl`L^E(jwaf`e~s4g$!aQF;%Gc8yAGD7 z^vNz0I8@o4NM?Viu)`5wB=rO_DQF8P#%We^gaM+P0FM7uJ|w5U0$bWjbqw)6qP)+@ zgk#0!=1fUr7{S8z!xM8839LfF_er|kBfSs%<1`2(DF;5qnRC|s?H^=@=;E4g_7$-t z$!=0#3?;p2tS0O<>;C5DU)W;Y2gO$>(Fu@)!#bT3DC_fg{IV-vTe6Wol=Z^#04YL) z471K788}z$LQ-W40-AV3yr%jMtn&+!p-aIoBzs&jP%z^grVN2C=W>YWH(?U9zl#8+ z>RUlsU|n!Y`g?iskv5Pcu+kP-W$#d9_UdX4ruQQC+-meUJtSmmGQO@Ig*dK=waQOe zaGW*Fp0iubPh7B{HPomb){x!ZLhU&IYB1-|8ISI=zoQ;adjXY(`6R1SC!2NZ zswUYJOD1~Br(=(U|1mikkH;HNLG7&ScCFWTPP+d!;Y|8ASSKSyCu3S!4Lw!w>h>D0 zgtOIRPv&1=K+{$9T#o3cTr^hM;fW@f|1mtGzNY|b!WajoOj!+J@ul5w!pIly>>o9k zwiG=t`tgcznOpDK9++IxHL2kYi2>sPKdISBG4;W@XY$PK!OxI1nWx#3uPHda-7j#Z zBb^Yw))3Oqty!;n8eb6@{j5NGFC_43I1*WikD(Tl3q@td{I(J`C|+)po~ImmocfXu z$4Mt#i0~JSmn#|u*a@egLIdLixT~K)+!$xyJ=uBWc9d&wga=hd>wDa?xbHpvm~Pt# zfp0(6Al4FfAIn4E_8B|=m3NmVZ(}4u7t#$zB)gOTYd=q9Gq{wX(`*t`duc@=T;4}_ zkfNrf0b$pzW111&N9z&rrnA+}{mY3dj?%Jflq$E8Nx-p?&xpVhqjod3(9*$1K9P|W zB<+_rO`K-}2$X^*2198<@&Kv#QAip4^g&4Ai%)T|6Xh(--ufY8)C{goR+ft$lFglb z<0KV@E?<2K1#FoYN>%@t@ZV%~q1_G`1B6BmYq1R&Wr+Q`0jgGoPG|o;d@v)}C?i-W f`>miNh05+o#JdE^1y!h;S3x_t*)u-5{N+CZThvlN literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory-members.html new file mode 100644 index 0000000000..66644ae8c3 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory-members.html @@ -0,0 +1,101 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory, including all inherited members.

+ + + + + + + + + + + + + + + + + +
applicationTgstation.Server.Host.Components.Watchdog.SessionControllerFactoryprivate
byondTgstation.Server.Host.Components.Watchdog.SessionControllerFactoryprivate
byondTopicSenderTgstation.Server.Host.Components.Watchdog.SessionControllerFactoryprivate
chatTgstation.Server.Host.Components.Watchdog.SessionControllerFactoryprivate
CreateDeadSession(IDmbProvider dmbProvider)Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory
cryptographySuiteTgstation.Server.Host.Components.Watchdog.SessionControllerFactoryprivate
instanceTgstation.Server.Host.Components.Watchdog.SessionControllerFactoryprivate
ioManagerTgstation.Server.Host.Components.Watchdog.SessionControllerFactoryprivate
LaunchNew(DreamDaemonLaunchParameters launchParameters, IDmbProvider dmbProvider, IByondExecutableLock currentByondLock, bool primaryPort, bool primaryDirectory, bool apiValidate, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory
loggerFactoryTgstation.Server.Host.Components.Watchdog.SessionControllerFactoryprivate
networkPromptReaperTgstation.Server.Host.Components.Watchdog.SessionControllerFactoryprivate
platformIdentifierTgstation.Server.Host.Components.Watchdog.SessionControllerFactoryprivate
processExecutorTgstation.Server.Host.Components.Watchdog.SessionControllerFactoryprivate
Reattach(ReattachInformation reattachInformation, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory
SecurityWord(DreamDaemonSecurity securityLevel)Tgstation.Server.Host.Components.Watchdog.SessionControllerFactoryprivatestatic
SessionControllerFactory(IProcessExecutor processExecutor, IByondManager byond, IByondTopicSender byondTopicSender, ICryptographySuite cryptographySuite, IApplication application, IIOManager ioManager, IChat chat, INetworkPromptReaper networkPromptReaper, IPlatformIdentifier platformIdentifier, ILoggerFactory loggerFactory, Api.Models.Instance instance)Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html new file mode 100644 index 0000000000..c84922fdc9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html @@ -0,0 +1,805 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory:
+
+
+ + +Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory + +
+ + + + + + + + + + + + + + +

+Public Member Functions

 SessionControllerFactory (IProcessExecutor processExecutor, IByondManager byond, IByondTopicSender byondTopicSender, ICryptographySuite cryptographySuite, IApplication application, IIOManager ioManager, IChat chat, INetworkPromptReaper networkPromptReaper, IPlatformIdentifier platformIdentifier, ILoggerFactory loggerFactory, Api.Models.Instance instance)
 Construct a SessionControllerFactory More...
 
async Task< ISessionControllerLaunchNew (DreamDaemonLaunchParameters launchParameters, IDmbProvider dmbProvider, IByondExecutableLock currentByondLock, bool primaryPort, bool primaryDirectory, bool apiValidate, CancellationToken cancellationToken)
 Create a ISessionController from a freshly launch DreamDaemon instance More...
 
async Task< ISessionControllerReattach (ReattachInformation reattachInformation, CancellationToken cancellationToken)
 Create a ISessionController from an existing DreamDaemon instance More...
 
ISessionController CreateDeadSession (IDmbProvider dmbProvider)
 Creates a ISessionController that appears to have started and died with exit code -1 More...
 
+ + + + +

+Static Private Member Functions

static string SecurityWord (DreamDaemonSecurity securityLevel)
 Change a given securityLevel into the appropriate DreamDaemon command line word More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

readonly IProcessExecutor processExecutor
 The IProcessExecutor for the SessionControllerFactory More...
 
readonly IByondManager byond
 The IByondManager for the SessionControllerFactory More...
 
readonly IByondTopicSender byondTopicSender
 The IByondTopicSender for the SessionControllerFactory More...
 
readonly ICryptographySuite cryptographySuite
 The ICryptographySuite for the SessionControllerFactory More...
 
readonly IApplication application
 The IApplication for the SessionControllerFactory More...
 
readonly IIOManager ioManager
 The IIOManager for the SessionControllerFactory More...
 
readonly IChat chat
 The IChat for the SessionControllerFactory More...
 
readonly INetworkPromptReaper networkPromptReaper
 The INetworkPromptReaper for the SessionControllerFactory More...
 
readonly IPlatformIdentifier platformIdentifier
 The IPlatformIdentifier for the SessionControllerFactory More...
 
readonly ILoggerFactory loggerFactory
 The ILoggerFactory for the SessionControllerFactory More...
 
readonly Api.Models.Instance instance
 The Api.Models.Instance for the SessionControllerFactory More...
 
+

Detailed Description

+
+

Definition at line 23 of file SessionControllerFactory.cs.

+

Constructor & Destructor Documentation

+ +

◆ SessionControllerFactory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.SessionControllerFactory (IProcessExecutor processExecutor,
IByondManager byond,
IByondTopicSender byondTopicSender,
ICryptographySuite cryptographySuite,
IApplication application,
IIOManager ioManager,
IChat chat,
INetworkPromptReaper networkPromptReaper,
IPlatformIdentifier platformIdentifier,
ILoggerFactory loggerFactory,
Api.Models.Instance instance 
)
+
+ +

Construct a SessionControllerFactory

+
Parameters
+ + + + + + + + + + + + +
processExecutorThe value of processExecutor
byondThe value of byond
byondTopicSenderThe value of byondTopicSender
cryptographySuiteThe value of cryptographySuite
applicationThe value of application
instanceThe value of instance
ioManagerThe value of ioManager
chatThe value of chat
networkPromptReaperThe value of networkPromptReaper
platformIdentifierThe value of platformIdentifier
loggerFactoryThe value of loggerFactory
+
+
+ +

Definition at line 114 of file SessionControllerFactory.cs.

+
115  {
116  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
117  this.byond = byond ?? throw new ArgumentNullException(nameof(byond));
118  this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
119  this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
120  this.application = application ?? throw new ArgumentNullException(nameof(application));
121  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
122  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
123  this.chat = chat ?? throw new ArgumentNullException(nameof(chat));
124  this.networkPromptReaper = networkPromptReaper ?? throw new ArgumentNullException(nameof(networkPromptReaper));
125  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
126  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
127  }
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the SessionControllerFactory
+
readonly IIOManager ioManager
The IIOManager for the SessionControllerFactory
+
readonly IProcessExecutor processExecutor
The IProcessExecutor for the SessionControllerFactory
+
readonly Api.Models.Instance instance
The Api.Models.Instance for the SessionControllerFactory
+
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the SessionControllerFactory
+
readonly INetworkPromptReaper networkPromptReaper
The INetworkPromptReaper for the SessionControllerFactory
+
readonly IApplication application
The IApplication for the SessionControllerFactory
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the SessionControllerFactory
+
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the SessionControllerFactory
+
readonly IChat chat
The IChat for the SessionControllerFactory
+
readonly IByondManager byond
The IByondManager for the SessionControllerFactory
+
+

References Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.application, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.byond, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.byondTopicSender, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.chat, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.cryptographySuite, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.instance, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.ioManager, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.loggerFactory, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.networkPromptReaper, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.platformIdentifier, and Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.processExecutor.

+ +
+
+

Member Function Documentation

+ +

◆ CreateDeadSession()

+ +
+
+ + + + + + + + +
ISessionController Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.CreateDeadSession (IDmbProvider dmbProvider)
+
+
+ +

◆ LaunchNew()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task<ISessionController> Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew (DreamDaemonLaunchParameters launchParameters,
IDmbProvider dmbProvider,
IByondExecutableLock currentByondLock,
bool primaryPort,
bool primaryDirectory,
bool apiValidate,
CancellationToken cancellationToken 
)
+
+ +

Create a ISessionController from a freshly launch DreamDaemon instance

+ +

Implements Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory.

+ +

Definition at line 131 of file SessionControllerFactory.cs.

+
132  {
133  var portToUse = primaryPort ? launchParameters.PrimaryPort : launchParameters.SecondaryPort;
134  if (!portToUse.HasValue)
135  throw new InvalidOperationException("Given port is null!");
136  var accessIdentifier = cryptographySuite.GetSecureString();
137 
138  const string JsonPostfix = "tgs.json";
139 
140  var basePath = primaryDirectory ? dmbProvider.PrimaryDirectory : dmbProvider.SecondaryDirectory;
141 
142  // delete all previous tgs json files
143  var files = await ioManager.GetFilesWithExtension(basePath, JsonPostfix, cancellationToken).ConfigureAwait(false);
144  await Task.WhenAll(files.Select(x => ioManager.DeleteFile(x, cancellationToken))).ConfigureAwait(false);
145 
146  // i changed this back from guids, hopefully i don't regret that
147  string JsonFile(string name) => String.Format(CultureInfo.InvariantCulture, "{0}.{1}", name, JsonPostfix);
148 
149  var securityLevelToUse = launchParameters.SecurityLevel.Value;
150  switch (dmbProvider.CompileJob.MinimumSecurityLevel)
151  {
152  case DreamDaemonSecurity.Ultrasafe:
153  break;
154  case DreamDaemonSecurity.Safe:
155  if (securityLevelToUse == DreamDaemonSecurity.Ultrasafe)
156  securityLevelToUse = DreamDaemonSecurity.Safe;
157  break;
158  case DreamDaemonSecurity.Trusted:
159  securityLevelToUse = DreamDaemonSecurity.Trusted;
160  break;
161  default:
162  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid DreamDaemonSecurity value: {0}", dmbProvider.CompileJob.MinimumSecurityLevel));
163  }
164 
165  // setup interop files
166  var interopInfo = new JsonFile
167  {
168  AccessIdentifier = accessIdentifier,
169  ApiValidateOnly = apiValidate,
170  ChatChannelsJson = JsonFile("chat_channels"),
171  ChatCommandsJson = JsonFile("chat_commands"),
172  ServerCommandsJson = JsonFile("server_commands"),
173  InstanceName = instance.Name,
174  SecurityLevel = securityLevelToUse,
175  Revision = new Api.Models.Internal.RevisionInformation
176  {
177  CommitSha = dmbProvider.CompileJob.RevisionInformation.CommitSha,
178  OriginCommitSha = dmbProvider.CompileJob.RevisionInformation.OriginCommitSha
179  }
180  };
181 
182  interopInfo.TestMerges.AddRange(dmbProvider.CompileJob.RevisionInformation.ActiveTestMerges.Select(x => x.TestMerge).Select(x => new Interop.TestMerge(x, interopInfo.Revision)));
183 
184  var interopJsonFile = JsonFile("interop");
185 
186  var interopJson = JsonConvert.SerializeObject(interopInfo, new JsonSerializerSettings
187  {
188  ContractResolver = new CamelCasePropertyNamesContractResolver(),
189  ReferenceLoopHandling = ReferenceLoopHandling.Ignore
190  });
191 
192  var chatJsonTrackingTask = chat.TrackJsons(basePath, interopInfo.ChatChannelsJson, interopInfo.ChatCommandsJson, cancellationToken);
193 
194  await ioManager.WriteAllBytes(ioManager.ConcatPath(basePath, interopJsonFile), Encoding.UTF8.GetBytes(interopJson), cancellationToken).ConfigureAwait(false);
195  var chatJsonTrackingContext = await chatJsonTrackingTask.ConfigureAwait(false);
196  try
197  {
198  // get the byond lock
199  var byondLock = currentByondLock ?? await byond.UseExecutables(Version.Parse(dmbProvider.CompileJob.ByondVersion), cancellationToken).ConfigureAwait(false);
200  try
201  {
202  // create interop context
203  var context = new CommContext(ioManager, loggerFactory.CreateLogger<CommContext>(), basePath, interopInfo.ServerCommandsJson);
204  try
205  {
206  // set command line options
207  // more sanitization here cause it uses the same scheme
208  var parameters = String.Format(CultureInfo.InvariantCulture, "{2}={0}&{3}={1}", byondTopicSender.SanitizeString(application.Version.ToString()), byondTopicSender.SanitizeString(interopJsonFile), byondTopicSender.SanitizeString(Constants.DMParamHostVersion), byondTopicSender.SanitizeString(Constants.DMParamInfoJson));
209 
210  var visibility = apiValidate ? "invisible" : "public";
211 
212  // important to run on all ports to allow port changing
213  var arguments = String.Format(CultureInfo.InvariantCulture, "{0} -port {1} -ports 1-65535 {2}-close -{3} -{5} -public -params \"{4}\"",
214  dmbProvider.DmbName,
215  primaryPort ? launchParameters.PrimaryPort : launchParameters.SecondaryPort,
216  launchParameters.AllowWebClient.Value ? "-webclient " : String.Empty,
217  SecurityWord(securityLevelToUse),
218  parameters,
219  visibility);
220 
221  // See https://github.com/tgstation/tgstation-server/issues/719
222  var noShellExecute = !platformIdentifier.IsWindows;
223 
224  // launch dd
225  var process = processExecutor.LaunchProcess(byondLock.DreamDaemonPath, basePath, arguments, noShellExecute: noShellExecute);
226  try
227  {
229 
230  // return the session controller for it
231  var result = new SessionController(new ReattachInformation
232  {
233  AccessIdentifier = accessIdentifier,
234  Dmb = dmbProvider,
235  IsPrimary = primaryDirectory,
236  Port = portToUse.Value,
237  ProcessId = process.Id,
238  ChatChannelsJson = interopInfo.ChatChannelsJson,
239  ChatCommandsJson = interopInfo.ChatCommandsJson,
240  ServerCommandsJson = interopInfo.ServerCommandsJson,
241  }, process, byondLock, byondTopicSender, chatJsonTrackingContext, context, chat, loggerFactory.CreateLogger<SessionController>(), launchParameters.SecurityLevel, launchParameters.StartupTimeout);
242 
243  // writeback launch parameter's fixed security level
244  launchParameters.SecurityLevel = securityLevelToUse;
245 
246  return result;
247  }
248  catch
249  {
250  process.Dispose();
251  throw;
252  }
253  }
254  catch
255  {
256  context.Dispose();
257  throw;
258  }
259  }
260  catch
261  {
262  if (currentByondLock == null)
263  byondLock.Dispose();
264  throw;
265  }
266  }
267  catch
268  {
269  chatJsonTrackingContext.Dispose();
270  throw;
271  }
272  }
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the SessionControllerFactory
+
readonly IIOManager ioManager
The IIOManager for the SessionControllerFactory
+
Task< List< string > > GetFilesWithExtension(string path, string extension, CancellationToken cancellationToken)
Gets a list of files in path with the given extension
+
ushort? PrimaryPort
The first port DreamDaemon uses. This should be the publically advertised port
+
const string DMParamInfoJson
Path to the JsonFile
Definition: Constants.cs:16
+
readonly IProcessExecutor processExecutor
The IProcessExecutor for the SessionControllerFactory
+
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+
readonly Api.Models.Instance instance
The Api.Models.Instance for the SessionControllerFactory
+
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the SessionControllerFactory
+
readonly INetworkPromptReaper networkPromptReaper
The INetworkPromptReaper for the SessionControllerFactory
+
Representation of the initial json passed to DreamDaemon
Definition: JsonFile.cs:10
+ + +
readonly IApplication application
The IApplication for the SessionControllerFactory
+
Task< IJsonTrackingContext > TrackJsons(string basePath, string channelsJsonName, string commandsJsonName, CancellationToken cancellationToken)
Start tracking json files for commands and channels
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the SessionControllerFactory
+
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the SessionControllerFactory
+
IProcess LaunchProcess(string fileName, string workingDirectory, string arguments=null, bool readOutput=false, bool readError=false, bool noShellExecute=false)
Launch a IProcess
+
bool IsWindows
If the current platform is a Windows platform
+ +
const string DMParamHostVersion
Identifies a TGS execution. The server version
Definition: Constants.cs:11
+
Constants used for communication with the DMAPI
Definition: Constants.cs:6
+
readonly IChat chat
The IChat for the SessionControllerFactory
+
string GetSecureString()
Generates a 40-length secure ascii string
+
DreamDaemonSecurity
DreamDaemon's security level
+
void RegisterProcess(IProcess process)
Register a given process for network prompt reaping
+
Task< IByondExecutableLock > UseExecutables(Version requiredVersion, CancellationToken cancellationToken)
Lock the current installation's location and return a IByondExecutableLock
+
readonly IByondManager byond
The IByondManager for the SessionControllerFactory
+
bool? AllowWebClient
If the BYOND web client can be used to connect to the game server
+
static string SecurityWord(DreamDaemonSecurity securityLevel)
Change a given securityLevel into the appropriate DreamDaemon command line word
+
Task DeleteFile(string path, CancellationToken cancellationToken)
Deletes a file at path
+
Version Version
The version of the Application
Definition: IApplication.cs:23
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
DreamDaemonSecurity? SecurityLevel
The DreamDaemonSecurity level of DreamDaemon
+
+

References Tgstation.Server.Api.Models.RevisionInformation.ActiveTestMerges, Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.AllowWebClient, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.application, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.byond, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.byondTopicSender, Tgstation.Server.Api.Models.CompileJob.ByondVersion, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.chat, Tgstation.Server.Api.Models.Internal.RevisionInformation.CommitSha, Tgstation.Server.Host.Components.IDmbProvider.CompileJob, Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.cryptographySuite, Tgstation.Server.Host.IO.IIOManager.DeleteFile(), Tgstation.Server.Host.Components.IDmbProvider.DmbName, Tgstation.Server.Host.Components.Interop.Constants.DMParamHostVersion, Tgstation.Server.Host.Components.Interop.Constants.DMParamInfoJson, Tgstation.Server.Host.IO.IIOManager.GetFilesWithExtension(), Tgstation.Server.Host.Security.ICryptographySuite.GetSecureString(), Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.instance, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.ioManager, Tgstation.Server.Host.Core.IPlatformIdentifier.IsWindows, Tgstation.Server.Host.Core.IProcessExecutor.LaunchProcess(), Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.loggerFactory, Tgstation.Server.Api.Models.Internal.CompileJob.MinimumSecurityLevel, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.networkPromptReaper, Tgstation.Server.Api.Models.Internal.RevisionInformation.OriginCommitSha, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.platformIdentifier, Tgstation.Server.Host.Components.IDmbProvider.PrimaryDirectory, Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.PrimaryPort, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.processExecutor, Tgstation.Server.Host.Components.Watchdog.INetworkPromptReaper.RegisterProcess(), Tgstation.Server.Api.Models.CompileJob.RevisionInformation, Tgstation.Server.Host.Components.IDmbProvider.SecondaryDirectory, Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.SecondaryPort, Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.SecurityLevel, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.SecurityWord(), Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.StartupTimeout, Tgstation.Server.Host.Components.Chat.IChat.TrackJsons(), Tgstation.Server.Host.Components.Byond.IByondManager.UseExecutables(), Tgstation.Server.Host.Core.IApplication.Version, and Tgstation.Server.Host.IO.IIOManager.WriteAllBytes().

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.HandlerMonitorWakeup(), Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.InitControllers(), and Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.InitControllers().

+ +
+
+ +

◆ Reattach()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task<ISessionController> Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.Reattach (ReattachInformation reattachInformation,
CancellationToken cancellationToken 
)
+
+ +

Create a ISessionController from an existing DreamDaemon instance

+ +

Implements Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory.

+ +

Definition at line 276 of file SessionControllerFactory.cs.

+
277  {
278  if (reattachInformation == null)
279  throw new ArgumentNullException(nameof(reattachInformation));
280 
281  SessionController result = null;
282  var basePath = reattachInformation.IsPrimary ? reattachInformation.Dmb.PrimaryDirectory : reattachInformation.Dmb.SecondaryDirectory;
283  var chatJsonTrackingContext = await chat.TrackJsons(basePath, reattachInformation.ChatChannelsJson, reattachInformation.ChatCommandsJson, cancellationToken).ConfigureAwait(false);
284  try
285  {
286  var byondLock = await byond.UseExecutables(Version.Parse(reattachInformation.Dmb.CompileJob.ByondVersion), cancellationToken).ConfigureAwait(false);
287  try
288  {
289  var context = new CommContext(ioManager, loggerFactory.CreateLogger<CommContext>(), basePath, reattachInformation.ServerCommandsJson);
290  try
291  {
292  var process = processExecutor.GetProcess(reattachInformation.ProcessId);
293 
294  if (process != null)
295  try
296  {
298  result = new SessionController(reattachInformation, process, byondLock, byondTopicSender, chatJsonTrackingContext, context, chat, loggerFactory.CreateLogger<SessionController>(), null, null);
299 
300  process = null;
301  context = null;
302  byondLock = null;
303  chatJsonTrackingContext = null;
304  }
305  finally
306  {
307  process?.Dispose();
308  }
309  }
310  finally
311  {
312  context?.Dispose();
313  }
314  }
315  finally
316  {
317  byondLock?.Dispose();
318  }
319  }
320  finally
321  {
322  chatJsonTrackingContext?.Dispose();
323  }
324 
325  return result;
326  }
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the SessionControllerFactory
+
readonly IIOManager ioManager
The IIOManager for the SessionControllerFactory
+
readonly IProcessExecutor processExecutor
The IProcessExecutor for the SessionControllerFactory
+
readonly INetworkPromptReaper networkPromptReaper
The INetworkPromptReaper for the SessionControllerFactory
+
Task< IJsonTrackingContext > TrackJsons(string basePath, string channelsJsonName, string commandsJsonName, CancellationToken cancellationToken)
Start tracking json files for commands and channels
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the SessionControllerFactory
+ +
IProcess GetProcess(int id)
Get a IProcess by id
+
readonly IChat chat
The IChat for the SessionControllerFactory
+
void RegisterProcess(IProcess process)
Register a given process for network prompt reaping
+
Task< IByondExecutableLock > UseExecutables(Version requiredVersion, CancellationToken cancellationToken)
Lock the current installation's location and return a IByondExecutableLock
+
readonly IByondManager byond
The IByondManager for the SessionControllerFactory
+
+

References Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.byond, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.byondTopicSender, Tgstation.Server.Api.Models.CompileJob.ByondVersion, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.chat, Tgstation.Server.Host.Components.Interop.JsonSubFileList.ChatChannelsJson, Tgstation.Server.Host.Components.Interop.JsonSubFileList.ChatCommandsJson, Tgstation.Server.Host.Components.IDmbProvider.CompileJob, Tgstation.Server.Host.Components.Watchdog.ReattachInformation.Dmb, Tgstation.Server.Host.Core.IProcessExecutor.GetProcess(), Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.ioManager, Tgstation.Server.Host.Models.ReattachInformationBase.IsPrimary, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.loggerFactory, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.networkPromptReaper, Tgstation.Server.Host.Components.IDmbProvider.PrimaryDirectory, Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.processExecutor, Tgstation.Server.Host.Models.ReattachInformationBase.ProcessId, Tgstation.Server.Host.Components.Watchdog.INetworkPromptReaper.RegisterProcess(), Tgstation.Server.Host.Components.IDmbProvider.SecondaryDirectory, Tgstation.Server.Host.Components.Interop.JsonSubFileList.ServerCommandsJson, Tgstation.Server.Host.Components.Chat.IChat.TrackJsons(), and Tgstation.Server.Host.Components.Byond.IByondManager.UseExecutables().

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.InitControllers(), and Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.InitControllers().

+ +
+
+ +

◆ SecurityWord()

+ +
+
+ + + + + +
+ + + + + + + + +
static string Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.SecurityWord (DreamDaemonSecurity securityLevel)
+
+staticprivate
+
+ +

Change a given securityLevel into the appropriate DreamDaemon command line word

+
Parameters
+ + +
securityLevelThe DreamDaemonSecurity level to change
+
+
+
Returns
A string representation of the command line parameter
+ +

Definition at line 85 of file SessionControllerFactory.cs.

+
86  {
87  switch (securityLevel)
88  {
89  case DreamDaemonSecurity.Safe:
90  return "safe";
91  case DreamDaemonSecurity.Trusted:
92  return "trusted";
93  case DreamDaemonSecurity.Ultrasafe:
94  return "ultrasafe";
95  default:
96  throw new ArgumentOutOfRangeException(nameof(securityLevel), securityLevel, String.Format(CultureInfo.InvariantCulture, "Bad DreamDaemon security level: {0}", securityLevel));
97  }
98  }
DreamDaemonSecurity
DreamDaemon's security level
+
+

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew().

+ +
+
+

Member Data Documentation

+ +

◆ application

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.application
+
+private
+
+
+ +

◆ byond

+ +
+
+ + + + + +
+ + + + +
readonly IByondManager Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.byond
+
+private
+
+
+ +

◆ byondTopicSender

+ +
+
+ + + + + +
+ + + + +
readonly IByondTopicSender Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.byondTopicSender
+
+private
+
+
+ +

◆ chat

+ +
+
+ + + + + +
+ + + + +
readonly IChat Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.chat
+
+private
+
+
+ +

◆ cryptographySuite

+ +
+
+ + + + + +
+ + + + +
readonly ICryptographySuite Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.cryptographySuite
+
+private
+
+
+ +

◆ instance

+ +
+
+ + + + + +
+ + + + +
readonly Api.Models.Instance Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.instance
+
+private
+
+
+ +

◆ ioManager

+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.ioManager
+
+private
+
+
+ +

◆ loggerFactory

+ +
+
+ + + + + +
+ + + + +
readonly ILoggerFactory Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.loggerFactory
+
+private
+
+
+ +

◆ networkPromptReaper

+ + + +

◆ platformIdentifier

+ +
+
+ + + + + +
+ + + + +
readonly IPlatformIdentifier Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.platformIdentifier
+
+private
+
+
+ +

◆ processExecutor

+ +
+
+ + + + + +
+ + + + +
readonly IProcessExecutor Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.processExecutor
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..06d07c5bbae6e3560c019484e342740ad7915946 GIT binary patch literal 1433 zcmeAS@N?(olHy`uVBq!ia0y~yU|a-b2XHV0$($dJzk!rQfKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+1FMFoi(^Oy8%jxE_&ZY`BQ zSYUDU`Gr1~nQ=?6hg`gxr_Fr+_Z+@F*gb!l z`n#8l=Wl#|cUE~QOWE_hw(3vrp7_eJ^6NEO9)ZmN&#xZq-B)q$*^}h| zB_G-CS*=m73-qn>e5{`pVU2kU3zj(TjuRPDt7IC z#_6lmvl2ghmOf8Nb=f-c!tsKqx85;b^k~U$u6xR>6ngu5$1hH+Q&n5cOhs5$?K(QU zL+178UvmY{uG`<|aeT4VU2_57lQX36iY_wDZ+)@p;>;C3A7A;kG15-elM6-6y0rZ9i7Kc(?PDy!jvWqIPX; z+K{#{uVj1qMbkxf-rsNC^Zru&>*AiA{cmbZYc#!|Pq2D(eA3TmPY9YuFnsHt~>- z(x=nE3gb7izF{s8z0&RLqS9P5;nucXZD0aY z6+Q5ODSv~ILzt*i!186$St07hQ|e-g+%6>>`5~gC&Ly?2ESjXS`gz&+cD$*n**0Rk>Np0y@4JuKMdzd)Ar(w?H@;TNyAX-mV?aYNNVsYTms zI@IqgGZj?vUu6Dhe8m6tt7Q4RhwaZDjA1!^Z{pHooT>PtXO6-1<=l1!KW@Bv`FlpH z(ZlZ->{js{>!{lC+4(VQ8ZOH~OT!(_nF(@_n+kuh2rc)0u6v?2cCTAWRl&3KpMsWi zWW;TIDzp7=68Gz>El*#0Z{6^7!>-~DMnWvfUHA2)rDGMOA`5aatl#6lbwbEuW4AqrjjKhE&FS2E@vEAJ>aCOuibiV~>f-+&neM}A-7lk5 zUCs1oS>2uKIgGnk)QWzsVm`58ez{uY0lgO+E;3GGFj|40zT`Thve#aT%J%%q9&k3y V!E=qcAg~-|@O1TaS?83{1OVarp_Bjs literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests_1_1_test_experimental_watchdog-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests_1_1_test_experimental_watchdog-members.html new file mode 100644 index 0000000000..257e40e36d --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests_1_1_test_experimental_watchdog-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.Tests.TestExperimentalWatchdog Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests_1_1_test_experimental_watchdog.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests_1_1_test_experimental_watchdog.html new file mode 100644 index 0000000000..e4e6a82984 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests_1_1_test_experimental_watchdog.html @@ -0,0 +1,146 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.Tests.TestExperimentalWatchdog Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.Tests.TestExperimentalWatchdog Class Reference
+
+
+ + + + + + +

+Public Member Functions

void TestConstruction ()
 
async Task TestSuccessfulLaunchAndShutdown ()
 
+

Detailed Description

+
+

Definition at line 17 of file TestExperimentalWatchdog.cs.

+

Member Function Documentation

+ +

◆ TestConstruction()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.Tests.TestExperimentalWatchdog.TestConstruction ()
+
+ +

Definition at line 20 of file TestExperimentalWatchdog.cs.

+
21  {
22  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(null, null, null, null, null, null, null, null, null, null, null, null, null, default));
23 
24  var mockChat = new Mock<IChat>();
25  mockChat.Setup(x => x.RegisterCommandHandler(It.IsNotNull<ICustomCommandHandler>())).Verifiable();
26  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, null, null, null, null, null, null, null, null, null, null, null, null, default));
27 
28  var mockSessionControllerFactory = new Mock<ISessionControllerFactory>();
29  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, null, null, null, null, null, null, null, null, null, null, null, default));
30 
31  var mockDmbFactory = new Mock<IDmbFactory>();
32  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, null, null, null, null, null, null, null, null, null, null, default));
33 
34  var mockReattachInfoHandler = new Mock<IReattachInfoHandler>();
35  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, null, null, null, null, null, null, null, null, null, default));
36 
37  var mockDatabaseContextFactory = new Mock<IDatabaseContextFactory>();
38  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, null, null, null, null, null, null, null, null, default));
39 
40  var mockByondTopicSender = new Mock<IByondTopicSender>();
41  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, mockByondTopicSender.Object, null, null, null, null, null, null, null, default));
42 
43  var mockEventConsumer = new Mock<IEventConsumer>();
44  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, mockByondTopicSender.Object, mockEventConsumer.Object, null, null, null, null, null, null, default));
45 
46  var mockJobManager = new Mock<IJobManager>();
47  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, mockByondTopicSender.Object, mockEventConsumer.Object, mockJobManager.Object, null, null, null, null, null, default));
48 
49  var mockRestartRegistration = new Mock<IRestartRegistration>();
50  mockRestartRegistration.Setup(x => x.Dispose()).Verifiable();
51  var mockServerControl = new Mock<IServerControl>();
52  mockServerControl.Setup(x => x.RegisterForRestart(It.IsNotNull<IRestartHandler>())).Returns(mockRestartRegistration.Object).Verifiable();
53  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, mockByondTopicSender.Object, mockEventConsumer.Object, mockJobManager.Object, mockServerControl.Object, null, null, null, null, default));
54 
55  var mockAsyncDelayer = new Mock<IAsyncDelayer>();
56  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, mockByondTopicSender.Object, mockEventConsumer.Object, mockJobManager.Object, mockServerControl.Object, mockAsyncDelayer.Object, null, null, null, default));
57 
58  var mockLogger = new Mock<ILogger<ExperimentalWatchdog>>();
59  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, mockByondTopicSender.Object, mockEventConsumer.Object, mockJobManager.Object, mockServerControl.Object, mockAsyncDelayer.Object, mockLogger.Object, null, null, default));
60 
61  var mockLaunchParameters = new DreamDaemonLaunchParameters();
62  Assert.ThrowsException<ArgumentNullException>(() => new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, mockByondTopicSender.Object, mockEventConsumer.Object, mockJobManager.Object, mockServerControl.Object, mockAsyncDelayer.Object, mockLogger.Object, mockLaunchParameters, null, default));
63 
64  var mockInstance = new Models.Instance();
65  new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, mockByondTopicSender.Object, mockEventConsumer.Object, mockJobManager.Object, mockServerControl.Object, mockAsyncDelayer.Object, mockLogger.Object, mockLaunchParameters, mockInstance, default).Dispose();
66 
67  mockRestartRegistration.VerifyAll();
68  mockServerControl.VerifyAll();
69  mockChat.VerifyAll();
70  }
+ +
Handles Commands.ICommands that map to those defined in a IJsonTrackingContext
+
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Dispose().

+ +
+
+ +

◆ TestSuccessfulLaunchAndShutdown()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.Tests.TestExperimentalWatchdog.TestSuccessfulLaunchAndShutdown ()
+
+ +

Definition at line 73 of file TestExperimentalWatchdog.cs.

+
74  {
75  var mockChat = new Mock<IChat>();
76  mockChat.Setup(x => x.RegisterCommandHandler(It.IsNotNull<ICustomCommandHandler>())).Verifiable();
77  var mockSessionControllerFactory = new Mock<ISessionControllerFactory>();
78  var mockDmbFactory = new Mock<IDmbFactory>();
79  var mockLogger = new Mock<ILogger<ExperimentalWatchdog>>();
80  var mockReattachInfoHandler = new Mock<IReattachInfoHandler>();
81  var mockDatabaseContextFactory = new Mock<IDatabaseContextFactory>();
82  var mockByondTopicSender = new Mock<IByondTopicSender>();
83  var mockEventConsumer = new Mock<IEventConsumer>();
84  var mockJobManager = new Mock<IJobManager>();
85  var mockRestartRegistration = new Mock<IRestartRegistration>();
86  mockRestartRegistration.Setup(x => x.Dispose()).Verifiable();
87  var mockServerControl = new Mock<IServerControl>();
88  mockServerControl.Setup(x => x.RegisterForRestart(It.IsNotNull<IRestartHandler>())).Returns(mockRestartRegistration.Object).Verifiable();
89  var mockLaunchParameters = new DreamDaemonLaunchParameters();
90  var mockInstance = new Models.Instance();
91  var mockAsyncDelayer = new Mock<IAsyncDelayer>();
92 
93  using (var wd = new ExperimentalWatchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, mockByondTopicSender.Object, mockEventConsumer.Object, mockJobManager.Object, mockServerControl.Object, mockAsyncDelayer.Object, mockLogger.Object, mockLaunchParameters, mockInstance, default))
94  using (var cts = new CancellationTokenSource())
95  {
96  var mockCompileJob = new Models.CompileJob();
97  var mockDmbProvider = new Mock<IDmbProvider>();
98  mockDmbProvider.SetupGet(x => x.CompileJob).Returns(mockCompileJob).Verifiable();
99  var mDmbP = mockDmbProvider.Object;
100 
101  var infiniteTask = new TaskCompletionSource<int>().Task;
102 
103  mockDmbFactory.SetupGet(x => x.OnNewerDmb).Returns(infiniteTask);
104  mockDmbFactory.Setup(x => x.LockNextDmb(2)).Returns(mDmbP).Verifiable();
105 
106  var sessionsToVerify = new List<Mock<ISessionController>>();
107 
108  var cancellationToken = cts.Token;
109  mockSessionControllerFactory.Setup(x => x.LaunchNew(mockLaunchParameters, mDmbP, null, It.IsAny<bool>(), It.IsAny<bool>(), false, cancellationToken)).Returns(() =>
110  {
111  var mockSession = new Mock<ISessionController>();
112  mockSession.SetupGet(x => x.Lifetime).Returns(infiniteTask).Verifiable();
113  mockSession.SetupGet(x => x.OnReboot).Returns(infiniteTask).Verifiable();
114  mockSession.SetupGet(x => x.Dmb).Returns(mDmbP).Verifiable();
115  mockSession.SetupGet(x => x.LaunchResult).Returns(Task.FromResult(new LaunchResult
116  {
117  StartupTime = TimeSpan.FromSeconds(1)
118  })).Verifiable();
119  sessionsToVerify.Add(mockSession);
120  return Task.FromResult(mockSession.Object);
121  }).Verifiable();
122  mockAsyncDelayer.Setup(x => x.Delay(It.IsAny<TimeSpan>(), cancellationToken)).Returns(Task.CompletedTask).Verifiable();
123 
124  cts.CancelAfter(TimeSpan.FromSeconds(15));
125 
126  try
127  {
128  await wd.Launch(cancellationToken).ConfigureAwait(false);
129  await wd.Terminate(false, cancellationToken).ConfigureAwait(false);
130  }
131  finally
132  {
133  cts.Cancel();
134  }
135  Assert.AreEqual(2, sessionsToVerify.Count);
136  foreach (var I in sessionsToVerify)
137  I.VerifyAll();
138  mockDmbProvider.VerifyAll();
139  }
140 
141  mockSessionControllerFactory.VerifyAll();
142  mockDmbFactory.VerifyAll();
143  mockRestartRegistration.VerifyAll();
144  mockServerControl.VerifyAll();
145  mockChat.VerifyAll();
146  mockAsyncDelayer.VerifyAll();
147  }
+ +
Handles Commands.ICommands that map to those defined in a IJsonTrackingContext
+
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base-members.html new file mode 100644 index 0000000000..6f45becfe2 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base-members.html @@ -0,0 +1,133 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.WatchdogBase Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Watchdog.WatchdogBase, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActiveCompileJobTgstation.Server.Host.Components.Watchdog.WatchdogBase
ActiveLaunchParametersTgstation.Server.Host.Components.Watchdog.WatchdogBase
ActiveParametersUpdatedTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
AlphaIsActiveTgstation.Server.Host.Components.Watchdog.WatchdogBase
AsyncDelayerTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
autoStartTgstation.Server.Host.Components.Watchdog.WatchdogBaseprivate
byondTopicSenderTgstation.Server.Host.Components.Watchdog.WatchdogBaseprivate
ChangeSettings(DreamDaemonLaunchParameters launchParameters, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
ChatTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
CheckLaunchResult(ISessionController controller, string serverName, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
CreateReattachInformation()Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotectedpure virtual
databaseContextFactoryTgstation.Server.Host.Components.Watchdog.WatchdogBaseprivate
Dispose()Tgstation.Server.Host.Components.Watchdog.WatchdogBase
DisposeAndNullControllers()Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotectedpure virtual
DmbFactoryTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
eventConsumerTgstation.Server.Host.Components.Watchdog.WatchdogBaseprivate
GetActiveController()Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotectedpure virtual
HandleChatCommand(string commandName, string arguments, Chat.User sender, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
Tgstation::Server::Host::Components::Chat::ICustomCommandHandler.HandleChatCommand(string commandName, string arguments, User sender, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.ICustomCommandHandler
HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
HandleRestart(Version updateVersion, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
InitControllers(Action callBeforeRecurse, Task chatTask, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotectedpure virtual
instanceTgstation.Server.Host.Components.Watchdog.WatchdogBaseprivate
jobManagerTgstation.Server.Host.Components.Watchdog.WatchdogBaseprivate
LastLaunchParametersTgstation.Server.Host.Components.Watchdog.WatchdogBase
Launch(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
LoggerTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
monitorCtsTgstation.Server.Host.Components.Watchdog.WatchdogBaseprivate
MonitorLifetimes(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotectedpure virtual
monitorTaskTgstation.Server.Host.Components.Watchdog.WatchdogBaseprivate
NotifyOfFailedReattach(bool inactiveReattachSuccess, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
reattachInfoHandlerTgstation.Server.Host.Components.Watchdog.WatchdogBaseprivate
RebootStateTgstation.Server.Host.Components.Watchdog.WatchdogBase
releaseServersTgstation.Server.Host.Components.Watchdog.WatchdogBaseprivate
ResetRebootState(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
Restart(bool graceful, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
restartRegistrationTgstation.Server.Host.Components.Watchdog.WatchdogBaseprivate
RunningTgstation.Server.Host.Components.Watchdog.WatchdogBase
SemaphoreTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
SessionControllerFactoryTgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
StartAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
StartMonitor()Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
StopAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
StopMonitor()Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
Terminate(bool graceful, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBase
TerminateNoLock(bool graceful, bool announce, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprivate
WatchdogBase(IChat chat, ISessionControllerFactory sessionControllerFactory, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IEventConsumer eventConsumer, IJobManager jobManager, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILogger logger, DreamDaemonLaunchParameters initialLaunchParameters, Api.Models.Instance instance, bool autoStart)Tgstation.Server.Host.Components.Watchdog.WatchdogBaseprotected
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html new file mode 100644 index 0000000000..54b3c75399 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html @@ -0,0 +1,2075 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.WatchdogBase Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.WatchdogBase Class Referenceabstract
+
+
+ +

Base class for IWatchdogs. + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Watchdog.WatchdogBase:
+
+
+ + +Tgstation.Server.Host.Components.Watchdog.IWatchdog +Tgstation.Server.Host.Components.Chat.ICustomCommandHandler +Tgstation.Server.Host.Core.IRestartHandler +IHostedService +IDisposable +Tgstation.Server.Host.Components.IEventConsumer +Tgstation.Server.Host.Components.Watchdog.BasicWatchdog +Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

void Dispose ()
 
async Task ChangeSettings (DreamDaemonLaunchParameters launchParameters, CancellationToken cancellationToken)
 Changes the ActiveLaunchParameters. If currently Running triggers a graceful restart More...
 
async Task< bool > HandleEvent (EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
 Handle a given eventType More...
 
async Task< string > HandleChatCommand (string commandName, string arguments, Chat.User sender, CancellationToken cancellationToken)
 
async Task Launch (CancellationToken cancellationToken)
 Start the IWatchdog More...
 
async Task ResetRebootState (CancellationToken cancellationToken)
 Cancels pending graceful actions More...
 
async Task Restart (bool graceful, CancellationToken cancellationToken)
 Restarts the watchdog More...
 
async Task StartAsync (CancellationToken cancellationToken)
 
async Task StopAsync (CancellationToken cancellationToken)
 
async Task Terminate (bool graceful, CancellationToken cancellationToken)
 Stops the watchdog More...
 
async Task HandleRestart (Version updateVersion, CancellationToken cancellationToken)
 Handle a restart of the server More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Components.Chat.ICustomCommandHandler
Task< string > HandleChatCommand (string commandName, string arguments, User sender, CancellationToken cancellationToken)
 Handle a chat command More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Protected Member Functions

 WatchdogBase (IChat chat, ISessionControllerFactory sessionControllerFactory, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IEventConsumer eventConsumer, IJobManager jobManager, IServerControl serverControl, IAsyncDelayer asyncDelayer, ILogger logger, DreamDaemonLaunchParameters initialLaunchParameters, Api.Models.Instance instance, bool autoStart)
 Initializes a new instance of the WatchdogBase class. More...
 
async Task LaunchImplNoLock (bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
 Launches the watchdog. More...
 
void StartMonitor ()
 Call MonitorLifetimes(CancellationToken) and setup monitorCts and monitorTask. More...
 
async Task< bool > StopMonitor ()
 Stops MonitorLifetimes(CancellationToken). Doesn't kill the servers More...
 
async Task NotifyOfFailedReattach (bool inactiveReattachSuccess, CancellationToken cancellationToken)
 Send a chat message and log about a failed reattach operation and attempts another call to LaunchImplNoLock(bool, bool, WatchdogReattachInformation, CancellationToken). More...
 
async Task CheckLaunchResult (ISessionController controller, string serverName, CancellationToken cancellationToken)
 Check the LaunchResult of a given controller for errors and throw a JobException if any are detected. More...
 
abstract void DisposeAndNullControllers ()
 Call IDisposable.Dispose and null the fields for all ISessionControllers and set Running to false. More...
 
abstract ISessionController GetActiveController ()
 Get the active ISessionController. More...
 
abstract WatchdogReattachInformation CreateReattachInformation ()
 Create the WatchdogReattachInformation for the ISessionControllers. More...
 
abstract Task MonitorLifetimes (CancellationToken cancellationToken)
 The loop that watches the watchdog More...
 
abstract Task InitControllers (Action callBeforeRecurse, Task chatTask, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
 Starts all ISessionControllers. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

bool Running [get, protected set]
 
abstract bool AlphaIsActive [get]
 
abstract Models.CompileJob ActiveCompileJob [get]
 
DreamDaemonLaunchParameters ActiveLaunchParameters [get, protected set]
 
DreamDaemonLaunchParameters LastLaunchParameters [get, protected set]
 
abstract ? RebootState RebootState [get]
 
TaskCompletionSource< object > ActiveParametersUpdated [get, set]
 TaskCompletionSource<TResult> that completes when ActiveLaunchParameters are changed and we are Running. More...
 
SemaphoreSlim Semaphore [get]
 The SemaphoreSlim for the WatchdogBase. More...
 
ILogger Logger [get]
 The ILogger for the WatchdogBase. More...
 
IChat Chat [get]
 The IChat for the WatchdogBase More...
 
ISessionControllerFactory SessionControllerFactory [get]
 The ISessionControllerFactory for the WatchdogBase More...
 
IDmbFactory DmbFactory [get]
 The IDmbFactory for the WatchdogBase More...
 
IAsyncDelayer AsyncDelayer [get]
 The IAsyncDelayer for the WatchdogBase. More...
 
- Properties inherited from Tgstation.Server.Host.Components.Watchdog.IWatchdog
bool Running [get]
 If the watchdog is running More...
 
bool AlphaIsActive [get]
 If the alpha server is the active server More...
 
Models.CompileJob ActiveCompileJob [get]
 The CompileJob currently running on the server More...
 
DreamDaemonLaunchParameters ActiveLaunchParameters [get]
 The DreamDaemonLaunchParameters the active server is using More...
 
DreamDaemonLaunchParameters LastLaunchParameters [get]
 The DreamDaemonLaunchParameters to be applied More...
 
RebootStateRebootState [get]
 The Components.Watchdog.RebootState of the active server More...
 
+ + + + +

+Private Member Functions

async Task TerminateNoLock (bool graceful, bool announce, CancellationToken cancellationToken)
 Implementation of Terminate(bool, CancellationToken). Does not lock Semaphore More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

readonly Api.Models.Instance instance
 The Api.Models.Instance for the WatchdogBase. More...
 
readonly IReattachInfoHandler reattachInfoHandler
 The IReattachInfoHandler for the WatchdogBase More...
 
readonly IDatabaseContextFactory databaseContextFactory
 The IDatabaseContextFactory for the ExperimentalWatchdog More...
 
readonly IByondTopicSender byondTopicSender
 The IByondTopicSender for the ExperimentalWatchdog More...
 
readonly IEventConsumer eventConsumer
 The IEventConsumer for the ExperimentalWatchdog More...
 
readonly IJobManager jobManager
 The IJobManager for the ExperimentalWatchdog More...
 
readonly IRestartRegistration restartRegistration
 The IRestartRegistration for the ExperimentalWatchdog More...
 
readonly bool autoStart
 If the WatchdogBase should LaunchImplNoLock(bool, bool, WatchdogReattachInformation, CancellationToken) in StartAsync(CancellationToken) More...
 
CancellationTokenSource monitorCts
 The CancellationTokenSource for the monitor loop More...
 
Task monitorTask
 The Task running the monitor loop More...
 
bool releaseServers
 If the servers should be released instead of shutdown More...
 
+

Detailed Description

+

Base class for IWatchdogs.

+ +

Definition at line 27 of file WatchdogBase.cs.

+

Constructor & Destructor Documentation

+ +

◆ WatchdogBase()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Watchdog.WatchdogBase.WatchdogBase (IChat chat,
ISessionControllerFactory sessionControllerFactory,
IDmbFactory dmbFactory,
IReattachInfoHandler reattachInfoHandler,
IDatabaseContextFactory databaseContextFactory,
IByondTopicSender byondTopicSender,
IEventConsumer eventConsumer,
IJobManager jobManager,
IServerControl serverControl,
IAsyncDelayer asyncDelayer,
ILogger logger,
DreamDaemonLaunchParameters initialLaunchParameters,
Api.Models.Instance instance,
bool autoStart 
)
+
+protected
+
+ +

Initializes a new instance of the WatchdogBase class.

+
Parameters
+ + + + + + + + + + + + + + + +
chatThe value of Chat
sessionControllerFactoryThe value of SessionControllerFactory
dmbFactoryThe value of DmbFactory
reattachInfoHandlerThe value of reattachInfoHandler
databaseContextFactoryThe value of databaseContextFactory
byondTopicSenderThe value of byondTopicSender
eventConsumerThe value of eventConsumer
jobManagerThe value of jobManager
serverControlThe IServerControl to populate restartRegistration with
asyncDelayerThe value of AsyncDelayer.
loggerThe value of Logger
initialLaunchParametersThe initial value of ActiveLaunchParameters. May be modified
instanceThe value of instance
autoStartThe value of autoStart
+
+
+ +

Definition at line 154 of file WatchdogBase.cs.

+
169  {
170  Chat = chat ?? throw new ArgumentNullException(nameof(chat));
171  SessionControllerFactory = sessionControllerFactory ?? throw new ArgumentNullException(nameof(sessionControllerFactory));
172  DmbFactory = dmbFactory ?? throw new ArgumentNullException(nameof(dmbFactory));
173  AsyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
174  this.reattachInfoHandler = reattachInfoHandler ?? throw new ArgumentNullException(nameof(reattachInfoHandler));
175  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
176  this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
177  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
178  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
179  Logger = logger ?? throw new ArgumentNullException(nameof(logger));
180  ActiveLaunchParameters = initialLaunchParameters ?? throw new ArgumentNullException(nameof(initialLaunchParameters));
181  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
182  this.autoStart = autoStart;
183 
184  if (serverControl == null)
185  throw new ArgumentNullException(nameof(serverControl));
186 
187  chat.RegisterCommandHandler(this);
188 
189  ActiveLaunchParameters = initialLaunchParameters;
190  releaseServers = false;
191  ActiveParametersUpdated = new TaskCompletionSource<object>();
192 
193  restartRegistration = serverControl.RegisterForRestart(this);
194  try
195  {
196  Semaphore = new SemaphoreSlim(1);
197  }
198  catch
199  {
200  restartRegistration.Dispose();
201  throw;
202  }
203  }
+
readonly bool autoStart
If the WatchdogBase should LaunchImplNoLock(bool, bool, WatchdogReattachInformation,...
+ + +
void RegisterCommandHandler(ICustomCommandHandler customCommandHandler)
Registers a customCommandHandler to use
+
ISessionControllerFactory SessionControllerFactory
The ISessionControllerFactory for the WatchdogBase
Definition: WatchdogBase.cs:70
+
SemaphoreSlim Semaphore
The SemaphoreSlim for the WatchdogBase.
Definition: WatchdogBase.cs:55
+ +
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the ExperimentalWatchdog
+
readonly IJobManager jobManager
The IJobManager for the ExperimentalWatchdog
+
readonly IReattachInfoHandler reattachInfoHandler
The IReattachInfoHandler for the WatchdogBase
Definition: WatchdogBase.cs:90
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the ExperimentalWatchdog
Definition: WatchdogBase.cs:95
+
TaskCompletionSource< object > ActiveParametersUpdated
TaskCompletionSource<TResult> that completes when ActiveLaunchParameters are changed and we are Runni...
Definition: WatchdogBase.cs:50
+
bool releaseServers
If the servers should be released instead of shutdown
+
readonly IEventConsumer eventConsumer
The IEventConsumer for the ExperimentalWatchdog
+
ILogger Logger
The ILogger for the WatchdogBase.
Definition: WatchdogBase.cs:60
+
readonly Api.Models.Instance instance
The Api.Models.Instance for the WatchdogBase.
Definition: WatchdogBase.cs:85
+
IRestartRegistration RegisterForRestart(IRestartHandler handler)
Register a given handler to run before stopping the server for a restart
+
readonly IRestartRegistration restartRegistration
The IRestartRegistration for the ExperimentalWatchdog
+
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ActiveLaunchParameters, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ActiveParametersUpdated, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.autoStart, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.byondTopicSender, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.databaseContextFactory, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.eventConsumer, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.instance, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.jobManager, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Logger, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.reattachInfoHandler, Tgstation.Server.Host.Components.Chat.IChat.RegisterCommandHandler(), Tgstation.Server.Host.Core.IServerControl.RegisterForRestart(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.releaseServers, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.restartRegistration, and Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Semaphore.

+ +
+
+

Member Function Documentation

+ +

◆ ChangeSettings()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ChangeSettings (DreamDaemonLaunchParameters launchParameters,
CancellationToken cancellationToken 
)
+
+ +

Changes the ActiveLaunchParameters. If currently Running triggers a graceful restart

+ +

Implements Tgstation.Server.Host.Components.Watchdog.IWatchdog.

+ +

Definition at line 411 of file WatchdogBase.cs.

+
412  {
413  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
414  {
415  if (launchParameters.Match(ActiveLaunchParameters))
416  return;
417  ActiveLaunchParameters = launchParameters;
418  if (Running)
419  ActiveParametersUpdated.TrySetResult(null); // queue an update
420  }
421  }
+ +
SemaphoreSlim Semaphore
The SemaphoreSlim for the WatchdogBase.
Definition: WatchdogBase.cs:55
+
TaskCompletionSource< object > ActiveParametersUpdated
TaskCompletionSource<TResult> that completes when ActiveLaunchParameters are changed and we are Runni...
Definition: WatchdogBase.cs:50
+
bool Match(DreamDaemonLaunchParameters otherParameters)
Check if we match a given set of otherParameters
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ActiveLaunchParameters, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ActiveParametersUpdated, Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.Match(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Running, and Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Semaphore.

+ +
+
+ +

◆ CheckLaunchResult()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.WatchdogBase.CheckLaunchResult (ISessionController controller,
string serverName,
CancellationToken cancellationToken 
)
+
+protected
+
+ +

Check the LaunchResult of a given controller for errors and throw a JobException if any are detected.

+
Parameters
+ + + + +
controllerThe ISessionController to checkou.
serverNameThe name of the server being checked.
cancellationTokenThe CancellationToken for the operation.
+
+
+
Returns
A Task representing the running operation.
+ +

Definition at line 365 of file WatchdogBase.cs.

+
366  {
367  var launchResult = await controller.LaunchResult.WithToken(cancellationToken).ConfigureAwait(false);
368 
369  // Dead sessions won't trigger this
370  if (launchResult.ExitCode.HasValue) // you killed us ray...
371  throw new JobException(String.Format(CultureInfo.InvariantCulture, "{0} failed to start: {1}", serverName, launchResult));
372  if (!launchResult.StartupTime.HasValue)
373  throw new JobException(String.Format(CultureInfo.InvariantCulture, "{0} timed out on startup: {1}s", serverName, ActiveLaunchParameters.StartupTimeout.Value));
374  }
+ +
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ActiveLaunchParameters, Tgstation.Server.Host.Components.Watchdog.ISessionController.LaunchResult, and Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.StartupTimeout.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.InitControllers(), and Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.InitControllers().

+ +
+
+ +

◆ CreateReattachInformation()

+ +
+
+ + + + + +
+ + + + + + + +
abstract WatchdogReattachInformation Tgstation.Server.Host.Components.Watchdog.WatchdogBase.CreateReattachInformation ()
+
+protectedpure virtual
+
+
+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Dispose ()
+
+ +

+ +

Definition at line 206 of file WatchdogBase.cs.

+
207  {
208  Semaphore.Dispose();
209  restartRegistration.Dispose();
211 
212  Debug.Assert(monitorCts == null, "Expected monitorCts to be null!");
213  monitorCts?.Dispose();
214  }
SemaphoreSlim Semaphore
The SemaphoreSlim for the WatchdogBase.
Definition: WatchdogBase.cs:55
+
abstract void DisposeAndNullControllers()
Call IDisposable.Dispose and null the fields for all ISessionControllers and set Running to false.
+
CancellationTokenSource monitorCts
The CancellationTokenSource for the monitor loop
+
readonly IRestartRegistration restartRegistration
The IRestartRegistration for the ExperimentalWatchdog
+
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.DisposeAndNullControllers(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.monitorCts, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.restartRegistration, and Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Semaphore.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.Tests.TestExperimentalWatchdog.TestConstruction().

+ +
+
+ +

◆ DisposeAndNullControllers()

+ +
+
+ + + + + +
+ + + + + + + +
abstract void Tgstation.Server.Host.Components.Watchdog.WatchdogBase.DisposeAndNullControllers ()
+
+protectedpure virtual
+
+
+ +

◆ GetActiveController()

+ + + +

◆ HandleChatCommand()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task<string> Tgstation.Server.Host.Components.Watchdog.WatchdogBase.HandleChatCommand (string commandName,
string arguments,
Chat.User sender,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 468 of file WatchdogBase.cs.

+
469  {
470  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
471  {
472  if (!Running)
473  return "ERROR: Server offline!";
474 
475  var commandObject = new ChatCommand
476  {
477  Command = commandName,
478  Params = arguments,
479  User = sender
480  };
481 
482  var json = JsonConvert.SerializeObject(commandObject, new JsonSerializerSettings
483  {
484  ContractResolver = new CamelCasePropertyNamesContractResolver()
485  });
486 
487  var command = String.Format(CultureInfo.InvariantCulture, "{0}&{1}={2}", byondTopicSender.SanitizeString(Constants.DMTopicChatCommand), byondTopicSender.SanitizeString(Constants.DMParameterData), byondTopicSender.SanitizeString(json));
488 
489  var activeServer = GetActiveController();
490  return await activeServer.SendCommand(command, cancellationToken).ConfigureAwait(false) ?? "ERROR: Bad topic exchange!";
491  }
492  }
Represents a chat command to be handled by DD
Definition: ChatCommand.cs:8
+ +
SemaphoreSlim Semaphore
The SemaphoreSlim for the WatchdogBase.
Definition: WatchdogBase.cs:55
+ +
Represents a server User
Definition: User.cs:10
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the ExperimentalWatchdog
+
abstract ISessionController GetActiveController()
Get the active ISessionController.
+ +
Constants used for communication with the DMAPI
Definition: Constants.cs:6
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.byondTopicSender, Tgstation.Server.Host.Components.Interop.Constants.DMParameterData, Tgstation.Server.Host.Components.Interop.Constants.DMTopicChatCommand, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.GetActiveController(), Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Running, and Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Semaphore.

+ +
+
+ +

◆ HandleEvent()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task<bool> Tgstation.Server.Host.Components.Watchdog.WatchdogBase.HandleEvent (EventType eventType,
IEnumerable< string > parameters,
CancellationToken cancellationToken 
)
+
+ +

Handle a given eventType

+ +

Implements Tgstation.Server.Host.Components.IEventConsumer.

+ +

Definition at line 424 of file WatchdogBase.cs.

+
425  {
426  string results;
427  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
428  {
429  if (!Running)
430  return true;
431 
432  var builder = new StringBuilder(Constants.DMTopicEvent);
433  builder.Append('&');
434  var notification = new EventNotification
435  {
436  Type = eventType,
437  Parameters = parameters
438  };
439  var json = JsonConvert.SerializeObject(notification);
440  builder.Append(byondTopicSender.SanitizeString(Constants.DMParameterData));
441  builder.Append('=');
442  builder.Append(byondTopicSender.SanitizeString(json));
443 
444  var activeServer = GetActiveController();
445  results = await activeServer.SendCommand(builder.ToString(), cancellationToken).ConfigureAwait(false);
446  }
447 
448  if (results == Constants.DMResponseSuccess)
449  return true;
450 
451  List<Response> responses;
452  try
453  {
454  responses = JsonConvert.DeserializeObject<List<Response>>(results);
455  }
456  catch
457  {
458  Logger.LogInformation("Recieved invalid response from DD when parsing event {0}:{1}{2}", eventType, Environment.NewLine, results);
459  return true;
460  }
461 
462  await Task.WhenAll(responses.Select(x => Chat.SendMessage(x.Message, x.ChannelIds, cancellationToken))).ConfigureAwait(false);
463 
464  return true;
465  }
+ +
SemaphoreSlim Semaphore
The SemaphoreSlim for the WatchdogBase.
Definition: WatchdogBase.cs:55
+
const string DMTopicEvent
Notify of an EventType
Definition: Constants.cs:46
+
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the ExperimentalWatchdog
+
abstract ISessionController GetActiveController()
Get the active ISessionController.
+ +
Constants used for communication with the DMAPI
Definition: Constants.cs:6
+ +
const string DMResponseSuccess
Generic OK response
Definition: Constants.cs:26
+
ILogger Logger
The ILogger for the WatchdogBase.
Definition: WatchdogBase.cs:60
+
Task SendMessage(string message, IEnumerable< ulong > channelIds, CancellationToken cancellationToken)
Send a chat message to a given set of channelIds
Definition: Chat.cs:492
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.byondTopicSender, Tgstation.Server.Host.Components.Interop.Constants.DMParameterData, Tgstation.Server.Host.Components.Interop.Constants.DMResponseSuccess, Tgstation.Server.Host.Components.Interop.Constants.DMTopicEvent, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.GetActiveController(), Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Logger, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Running, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Semaphore, and Tgstation.Server.Host.Components.Chat.Chat.SendMessage().

+ +
+
+ +

◆ HandleRestart()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.WatchdogBase.HandleRestart (Version updateVersion,
CancellationToken cancellationToken 
)
+
+ +

Handle a restart of the server

+ +

Implements Tgstation.Server.Host.Core.IRestartHandler.

+ +

Definition at line 607 of file WatchdogBase.cs.

+
608  {
609  releaseServers = true;
610  if (Running)
611  await Chat.SendWatchdogMessage("Detaching...", cancellationToken).ConfigureAwait(false);
612  }
+ +
Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured watchdog channels
Definition: Chat.cs:514
+
bool releaseServers
If the servers should be released instead of shutdown
+
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.releaseServers, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Running, and Tgstation.Server.Host.Components.Chat.Chat.SendWatchdogMessage().

+ +
+
+ +

◆ InitControllers()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
abstract Task Tgstation.Server.Host.Components.Watchdog.WatchdogBase.InitControllers (Action callBeforeRecurse,
Task chatTask,
WatchdogReattachInformation reattachInfo,
CancellationToken cancellationToken 
)
+
+protectedpure virtual
+
+ +

Starts all ISessionControllers.

+
Parameters
+ + + + + +
callBeforeRecurseAn Action that must be run before making a recursive call to LaunchImplNoLock(bool, bool, WatchdogReattachInformation, CancellationToken).
chatTaskA, possibly active, Task for an outgoing chat message.
reattachInfoWatchdogReattachInformation to use, if any
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog, and Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.WatchdogBase.LaunchImplNoLock().

+ +
+
+ +

◆ Launch()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Launch (CancellationToken cancellationToken)
+
+ +

Start the IWatchdog

+ +

Implements Tgstation.Server.Host.Components.Watchdog.IWatchdog.

+ +

Definition at line 495 of file WatchdogBase.cs.

+
496  {
497  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
498  await LaunchImplNoLock(true, true, null, cancellationToken).ConfigureAwait(false);
499  }
async Task LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
Launches the watchdog.
+
SemaphoreSlim Semaphore
The SemaphoreSlim for the WatchdogBase.
Definition: WatchdogBase.cs:55
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.LaunchImplNoLock(), Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), and Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Semaphore.

+ +
+
+ +

◆ LaunchImplNoLock()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.WatchdogBase.LaunchImplNoLock (bool startMonitor,
bool announce,
WatchdogReattachInformation reattachInfo,
CancellationToken cancellationToken 
)
+
+protected
+
+ +

Launches the watchdog.

+
Parameters
+ + + + + +
startMonitorIf MonitorLifetimes(CancellationToken) should be started by this function
announceIf the launch should be announced to chat by this function
reattachInfoWatchdogReattachInformation to use, if any
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 251 of file WatchdogBase.cs.

+
252  {
253  Logger.LogTrace("Begin LaunchNoLock");
254 
255  if (Running)
256  throw new JobException("Watchdog already running!");
257 
258  // this is necessary, the monitor could be in it's sleep loop trying to restart, if so cancel THAT monitor and start our own with blackjack and hookers
259  Task chatTask;
260  if (startMonitor && await StopMonitor().ConfigureAwait(false))
261  chatTask = Chat.SendWatchdogMessage("Automatic retry sequence cancelled by manual launch. Restarting...", cancellationToken);
262  else if (announce)
263  chatTask = Chat.SendWatchdogMessage(reattachInfo == null ? "Starting..." : "Reattaching...", cancellationToken); // simple announce
264  else
265  chatTask = Task.CompletedTask; // no announce
266 
267  // since neither server is running, this is safe to do
269 
270  // for when we call ourself and want to not catch thrown exceptions
271  var ignoreNestedException = false;
272  try
273  {
274  await InitControllers(() => ignoreNestedException = true, chatTask, reattachInfo, cancellationToken).ConfigureAwait(false);
275  await chatTask.ConfigureAwait(false);
276 
277  Logger.LogInformation("Launched servers successfully");
278  Running = true;
279 
280  if (startMonitor)
281  {
282  StartMonitor();
283  }
284  }
285  catch (Exception e)
286  {
287  // don't try to send chat tasks or warning logs if were suppressing exceptions or cancelled
288  if (!ignoreNestedException && !cancellationToken.IsCancellationRequested)
289  {
290  var originalChatTask = chatTask;
291  async Task ChainChatTaskWithErrorMessage()
292  {
293  await originalChatTask.ConfigureAwait(false);
294  await Chat.SendWatchdogMessage("Startup failed!", cancellationToken).ConfigureAwait(false);
295  }
296 
297  chatTask = ChainChatTaskWithErrorMessage();
298  Logger.LogWarning("Failed to start watchdog: {0}", e.ToString());
299  }
300 
301  throw;
302  }
303  finally
304  {
305  // finish the chat task that's in flight
306  try
307  {
308  await chatTask.ConfigureAwait(false);
309  }
310  catch (OperationCanceledException) { }
311  }
312  }
+ + +
Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured watchdog channels
Definition: Chat.cs:514
+ +
void StartMonitor()
Call MonitorLifetimes(CancellationToken) and setup monitorCts and monitorTask.
+
ILogger Logger
The ILogger for the WatchdogBase.
Definition: WatchdogBase.cs:60
+
abstract Task InitControllers(Action callBeforeRecurse, Task chatTask, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
Starts all ISessionControllers.
+
async Task< bool > StopMonitor()
Stops MonitorLifetimes(CancellationToken). Doesn't kill the servers
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ActiveLaunchParameters, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.InitControllers(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.LastLaunchParameters, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Logger, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Running, Tgstation.Server.Host.Components.Chat.Chat.SendWatchdogMessage(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StartMonitor(), and Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StopMonitor().

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.InitControllers(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Launch(), Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.MonitorLifetimes(), Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.MonitorLifetimes(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.NotifyOfFailedReattach(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Restart(), and Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StartAsync().

+ +
+
+ +

◆ MonitorLifetimes()

+ +
+
+ + + + + +
+ + + + + + + + +
abstract Task Tgstation.Server.Host.Components.Watchdog.WatchdogBase.MonitorLifetimes (CancellationToken cancellationToken)
+
+protectedpure virtual
+
+ +

The loop that watches the watchdog

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog, and Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StartMonitor().

+ +
+
+ +

◆ NotifyOfFailedReattach()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.WatchdogBase.NotifyOfFailedReattach (bool inactiveReattachSuccess,
CancellationToken cancellationToken 
)
+
+protected
+
+ +

Send a chat message and log about a failed reattach operation and attempts another call to LaunchImplNoLock(bool, bool, WatchdogReattachInformation, CancellationToken).

+
Parameters
+ + + +
inactiveReattachSuccessIf the inactive server was reattached successfully.
cancellationTokenThe CancellationToken for the operation/
+
+
+
Returns
A Task representing the running operation.
+ +

Definition at line 346 of file WatchdogBase.cs.

+
347  {
348  // we lost the server, just restart entirely
350  const string FailReattachMessage = "Unable to properly reattach to server! Restarting...";
351  Logger.LogWarning(FailReattachMessage);
352  Logger.LogDebug(inactiveReattachSuccess ? "Also could not reattach to inactive server!" : "Inactive server was reattached successfully!");
353  Task chatTask = Chat.SendWatchdogMessage(FailReattachMessage, cancellationToken);
354  await LaunchImplNoLock(true, false, null, cancellationToken).ConfigureAwait(false);
355  await chatTask.ConfigureAwait(false);
356  }
+
async Task LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
Launches the watchdog.
+
Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured watchdog channels
Definition: Chat.cs:514
+
abstract void DisposeAndNullControllers()
Call IDisposable.Dispose and null the fields for all ISessionControllers and set Running to false.
+
ILogger Logger
The ILogger for the WatchdogBase.
Definition: WatchdogBase.cs:60
+
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.DisposeAndNullControllers(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.LaunchImplNoLock(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Logger, and Tgstation.Server.Host.Components.Chat.Chat.SendWatchdogMessage().

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.InitControllers().

+ +
+
+ +

◆ ResetRebootState()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ResetRebootState (CancellationToken cancellationToken)
+
+ +

Cancels pending graceful actions

+ +

Implements Tgstation.Server.Host.Components.Watchdog.IWatchdog.

+ +

Definition at line 502 of file WatchdogBase.cs.

+
503  {
504  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
505  {
506  if (!Running)
507  return;
508  var toClear = GetActiveController();
509  if (toClear != null)
510  toClear.ResetRebootState();
511  }
512  }
+
SemaphoreSlim Semaphore
The SemaphoreSlim for the WatchdogBase.
Definition: WatchdogBase.cs:55
+
abstract ISessionController GetActiveController()
Get the active ISessionController.
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.GetActiveController(), Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Running, and Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Semaphore.

+ +
+
+ +

◆ Restart()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Restart (bool graceful,
CancellationToken cancellationToken 
)
+
+ +

Restarts the watchdog

+ +

Implements Tgstation.Server.Host.Components.Watchdog.IWatchdog.

+ +

Definition at line 515 of file WatchdogBase.cs.

+
516  {
517  Logger.LogTrace("Begin Restart. Graceful: {0}", graceful);
518  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
519  {
520  if (!graceful || !Running)
521  {
522  Task chatTask;
523  if (Running)
524  {
525  chatTask = Chat.SendWatchdogMessage("Manual restart triggered...", cancellationToken);
526  await TerminateNoLock(false, false, cancellationToken).ConfigureAwait(false);
527  }
528  else
529  chatTask = Task.CompletedTask;
530  await LaunchImplNoLock(true, !Running, null, cancellationToken).ConfigureAwait(false);
531  await chatTask.ConfigureAwait(false);
532  }
533 
534  var toReboot = GetActiveController();
535  if (toReboot != null)
536  {
537  if (!await toReboot.SetRebootState(Watchdog.RebootState.Restart, cancellationToken).ConfigureAwait(false))
538  Logger.LogWarning("Unable to send reboot state change event!");
539  }
540  }
541  }
+
async Task LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
Launches the watchdog.
+ +
SemaphoreSlim Semaphore
The SemaphoreSlim for the WatchdogBase.
Definition: WatchdogBase.cs:55
+
Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured watchdog channels
Definition: Chat.cs:514
+
async Task TerminateNoLock(bool graceful, bool announce, CancellationToken cancellationToken)
Implementation of Terminate(bool, CancellationToken). Does not lock Semaphore
+
abstract ISessionController GetActiveController()
Get the active ISessionController.
+
ILogger Logger
The ILogger for the WatchdogBase.
Definition: WatchdogBase.cs:60
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.GetActiveController(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.LaunchImplNoLock(), Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Logger, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Running, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Semaphore, Tgstation.Server.Host.Components.Chat.Chat.SendWatchdogMessage(), and Tgstation.Server.Host.Components.Watchdog.WatchdogBase.TerminateNoLock().

+ +
+
+ +

◆ StartAsync()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StartAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 544 of file WatchdogBase.cs.

+
545  {
546  var reattachInfo = await reattachInfoHandler.Load(cancellationToken).ConfigureAwait(false);
547  if (!autoStart && reattachInfo == null)
548  return;
549 
550  long? adminUserId = null;
551 
552  await databaseContextFactory.UseContext(async db => adminUserId = await db.Users
553  .Where(x => x.CanonicalName == Api.Models.User.AdminName.ToUpperInvariant())
554  .Select(x => x.Id)
555  .FirstAsync(cancellationToken).ConfigureAwait(false)).ConfigureAwait(false);
556  var job = new Models.Job
557  {
558  StartedBy = new Models.User
559  {
560  Id = adminUserId.Value
561  },
562  Instance = new Models.Instance
563  {
564  Id = instance.Id
565  },
566  Description = "Instance startup watchdog launch",
567  CancelRight = (ulong)DreamDaemonRights.Shutdown,
568  CancelRightsType = RightsType.DreamDaemon
569  };
570  await jobManager.RegisterOperation(job, async (j, databaseContext, progressFunction, ct) =>
571  {
572  using (await SemaphoreSlimContext.Lock(Semaphore, ct).ConfigureAwait(false))
573  await LaunchImplNoLock(true, true, reattachInfo, ct).ConfigureAwait(false);
574  }, cancellationToken).ConfigureAwait(false);
575  }
readonly bool autoStart
If the WatchdogBase should LaunchImplNoLock(bool, bool, WatchdogReattachInformation,...
+
async Task LaunchImplNoLock(bool startMonitor, bool announce, WatchdogReattachInformation reattachInfo, CancellationToken cancellationToken)
Launches the watchdog.
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
SemaphoreSlim Semaphore
The SemaphoreSlim for the WatchdogBase.
Definition: WatchdogBase.cs:55
+
readonly IJobManager jobManager
The IJobManager for the ExperimentalWatchdog
+
readonly IReattachInfoHandler reattachInfoHandler
The IReattachInfoHandler for the WatchdogBase
Definition: WatchdogBase.cs:90
+
Task RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
Registers a given Job and begins running it
+
DreamDaemonRights
Rights for Models.DreamDaemon
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the ExperimentalWatchdog
Definition: WatchdogBase.cs:95
+
Task< WatchdogReattachInformation > Load(CancellationToken cancellationToken)
Load a saved WatchdogReattachInformation
+
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+
readonly Api.Models.Instance instance
The Api.Models.Instance for the WatchdogBase.
Definition: WatchdogBase.cs:85
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.autoStart, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.databaseContextFactory, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.instance, Tgstation.Server.Host.Components.Instance.Instance(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.jobManager, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.LaunchImplNoLock(), Tgstation.Server.Host.Components.Watchdog.IReattachInfoHandler.Load(), Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.reattachInfoHandler, Tgstation.Server.Host.Core.IJobManager.RegisterOperation(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Semaphore, and Tgstation.Server.Host.Core.IDatabaseContextFactory.UseContext().

+ +
+
+ +

◆ StartMonitor()

+ +
+
+ + + + + +
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StartMonitor ()
+
+protected
+
+ +

Call MonitorLifetimes(CancellationToken) and setup monitorCts and monitorTask.

+ +

Definition at line 317 of file WatchdogBase.cs.

+
318  {
319  monitorCts = new CancellationTokenSource();
321  }
Task monitorTask
The Task running the monitor loop
+
CancellationTokenSource monitorCts
The CancellationTokenSource for the monitor loop
+
abstract Task MonitorLifetimes(CancellationToken cancellationToken)
The loop that watches the watchdog
+
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.monitorCts, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.MonitorLifetimes(), and Tgstation.Server.Host.Components.Watchdog.WatchdogBase.monitorTask.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.WatchdogBase.LaunchImplNoLock().

+ +
+
+ +

◆ StopAsync()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StopAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 578 of file WatchdogBase.cs.

+
579  {
580  try
581  {
582  if (releaseServers && Running)
583  {
584  await StopMonitor().ConfigureAwait(false);
585 
586  var reattachInformation = CreateReattachInformation();
587  await reattachInfoHandler.Save(reattachInformation, cancellationToken).ConfigureAwait(false);
588  }
589 
590  await Terminate(false, cancellationToken).ConfigureAwait(false);
591  }
592  catch
593  {
594  releaseServers = false;
595  throw;
596  }
597  }
+
Task Save(WatchdogReattachInformation reattachInformation, CancellationToken cancellationToken)
Save some reattachInformation
+
readonly IReattachInfoHandler reattachInfoHandler
The IReattachInfoHandler for the WatchdogBase
Definition: WatchdogBase.cs:90
+
bool releaseServers
If the servers should be released instead of shutdown
+
async Task Terminate(bool graceful, CancellationToken cancellationToken)
Stops the watchdog
+
async Task< bool > StopMonitor()
Stops MonitorLifetimes(CancellationToken). Doesn't kill the servers
+
abstract WatchdogReattachInformation CreateReattachInformation()
Create the WatchdogReattachInformation for the ISessionControllers.
+
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.CreateReattachInformation(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.reattachInfoHandler, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.releaseServers, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Running, Tgstation.Server.Host.Components.Watchdog.IReattachInfoHandler.Save(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StopMonitor(), and Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Terminate().

+ +
+
+ +

◆ StopMonitor()

+ +
+
+ + + + + +
+ + + + + + + +
async Task<bool> Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StopMonitor ()
+
+protected
+
+ +

Stops MonitorLifetimes(CancellationToken). Doesn't kill the servers

+
Returns
true if the monitor was running, false otherwise
+ +

Definition at line 327 of file WatchdogBase.cs.

+
328  {
329  Logger.LogTrace("StopMonitor");
330  if (monitorTask == null)
331  return false;
332  monitorCts.Cancel();
333  await monitorTask.ConfigureAwait(false);
334  monitorCts.Dispose();
335  monitorTask = null;
336  monitorCts = null;
337  return true;
338  }
Task monitorTask
The Task running the monitor loop
+
CancellationTokenSource monitorCts
The CancellationTokenSource for the monitor loop
+
ILogger Logger
The ILogger for the WatchdogBase.
Definition: WatchdogBase.cs:60
+
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Logger, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.monitorCts, and Tgstation.Server.Host.Components.Watchdog.WatchdogBase.monitorTask.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.WatchdogBase.LaunchImplNoLock(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StopAsync(), and Tgstation.Server.Host.Components.Watchdog.WatchdogBase.TerminateNoLock().

+ +
+
+ +

◆ Terminate()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Terminate (bool graceful,
CancellationToken cancellationToken 
)
+
+ +

Stops the watchdog

+ +

Implements Tgstation.Server.Host.Components.Watchdog.IWatchdog.

+ +

Definition at line 600 of file WatchdogBase.cs.

+
601  {
602  using (await SemaphoreSlimContext.Lock(Semaphore, cancellationToken).ConfigureAwait(false))
603  await TerminateNoLock(graceful, !releaseServers, cancellationToken).ConfigureAwait(false);
604  }
SemaphoreSlim Semaphore
The SemaphoreSlim for the WatchdogBase.
Definition: WatchdogBase.cs:55
+
async Task TerminateNoLock(bool graceful, bool announce, CancellationToken cancellationToken)
Implementation of Terminate(bool, CancellationToken). Does not lock Semaphore
+
bool releaseServers
If the servers should be released instead of shutdown
+
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
+ +
+

References Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.releaseServers, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Semaphore, and Tgstation.Server.Host.Components.Watchdog.WatchdogBase.TerminateNoLock().

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StopAsync().

+ +
+
+ +

◆ TerminateNoLock()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.WatchdogBase.TerminateNoLock (bool graceful,
bool announce,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Implementation of Terminate(bool, CancellationToken). Does not lock Semaphore

+
Parameters
+ + + + +
gracefulIf true the termination will be delayed until a reboot is detected in the active server's DMAPI and this function will return immediately
announceIf true the termination will be announced using Chat
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation.
+ +

Definition at line 223 of file WatchdogBase.cs.

+
224  {
225  if (!Running)
226  return;
227  if (!graceful)
228  {
229  var chatTask = announce ? Chat.SendWatchdogMessage("Terminating...", cancellationToken) : Task.CompletedTask;
230  await StopMonitor().ConfigureAwait(false);
232  LastLaunchParameters = null;
233  await chatTask.ConfigureAwait(false);
234  return;
235  }
236 
237  // merely set the reboot state
238  var toKill = GetActiveController();
239  if (toKill != null)
240  await toKill.SetRebootState(Watchdog.RebootState.Shutdown, cancellationToken).ConfigureAwait(false);
241  }
+ +
Task SendWatchdogMessage(string message, CancellationToken cancellationToken)
Send a chat message to configured watchdog channels
Definition: Chat.cs:514
+ +
abstract void DisposeAndNullControllers()
Call IDisposable.Dispose and null the fields for all ISessionControllers and set Running to false.
+
abstract ISessionController GetActiveController()
Get the active ISessionController.
+
async Task< bool > StopMonitor()
Stops MonitorLifetimes(CancellationToken). Doesn't kill the servers
+
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.DisposeAndNullControllers(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.GetActiveController(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.LastLaunchParameters, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Running, Tgstation.Server.Host.Components.Chat.Chat.SendWatchdogMessage(), and Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StopMonitor().

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Restart(), and Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Terminate().

+ +
+
+

Member Data Documentation

+ +

◆ autoStart

+ +
+
+ + + + + +
+ + + + +
readonly bool Tgstation.Server.Host.Components.Watchdog.WatchdogBase.autoStart
+
+private
+
+
+ +

◆ byondTopicSender

+ +
+
+ + + + + +
+ + + + +
readonly IByondTopicSender Tgstation.Server.Host.Components.Watchdog.WatchdogBase.byondTopicSender
+
+private
+
+
+ +

◆ databaseContextFactory

+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContextFactory Tgstation.Server.Host.Components.Watchdog.WatchdogBase.databaseContextFactory
+
+private
+
+
+ +

◆ eventConsumer

+ +
+
+ + + + + +
+ + + + +
readonly IEventConsumer Tgstation.Server.Host.Components.Watchdog.WatchdogBase.eventConsumer
+
+private
+
+
+ +

◆ instance

+ +
+
+ + + + + +
+ + + + +
readonly Api.Models.Instance Tgstation.Server.Host.Components.Watchdog.WatchdogBase.instance
+
+private
+
+
+ +

◆ jobManager

+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Components.Watchdog.WatchdogBase.jobManager
+
+private
+
+
+ +

◆ monitorCts

+ +
+
+ + + + + +
+ + + + +
CancellationTokenSource Tgstation.Server.Host.Components.Watchdog.WatchdogBase.monitorCts
+
+private
+
+
+ +

◆ monitorTask

+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Components.Watchdog.WatchdogBase.monitorTask
+
+private
+
+
+ +

◆ reattachInfoHandler

+ +
+
+ + + + + +
+ + + + +
readonly IReattachInfoHandler Tgstation.Server.Host.Components.Watchdog.WatchdogBase.reattachInfoHandler
+
+private
+
+
+ +

◆ releaseServers

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.WatchdogBase.releaseServers
+
+private
+
+
+ +

◆ restartRegistration

+ +
+
+ + + + + +
+ + + + +
readonly IRestartRegistration Tgstation.Server.Host.Components.Watchdog.WatchdogBase.restartRegistration
+
+private
+
+
+

Property Documentation

+ +

◆ ActiveCompileJob

+ +
+
+ + + + + +
+ + + + +
abstract Models.CompileJob Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ActiveCompileJob
+
+get
+
+ +

+ +

Definition at line 36 of file WatchdogBase.cs.

+
36 { get; }
+
+
+ +

◆ ActiveLaunchParameters

+ + + +

◆ ActiveParametersUpdated

+ +
+
+ + + + + +
+ + + + +
TaskCompletionSource<object> Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ActiveParametersUpdated
+
+getsetprotected
+
+
+ +

◆ AlphaIsActive

+ +
+
+ + + + + +
+ + + + +
abstract bool Tgstation.Server.Host.Components.Watchdog.WatchdogBase.AlphaIsActive
+
+get
+
+ +

+ +

Definition at line 33 of file WatchdogBase.cs.

+
33 { get; }
+
+
+ +

◆ AsyncDelayer

+ +
+
+ + + + + +
+ + + + +
IAsyncDelayer Tgstation.Server.Host.Components.Watchdog.WatchdogBase.AsyncDelayer
+
+getprotected
+
+ +

The IAsyncDelayer for the WatchdogBase.

+ +

Definition at line 80 of file WatchdogBase.cs.

+
80 { get; }
+
+
+ +

◆ Chat

+ +
+
+ + + + + +
+ + + + +
IChat Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Chat
+
+getprotected
+
+ +

The IChat for the WatchdogBase

+ +

Definition at line 65 of file WatchdogBase.cs.

+
65 { get; }
+
+
+ +

◆ DmbFactory

+ +
+
+ + + + + +
+ + + + +
IDmbFactory Tgstation.Server.Host.Components.Watchdog.WatchdogBase.DmbFactory
+
+getprotected
+
+ +

The IDmbFactory for the WatchdogBase

+ +

Definition at line 75 of file WatchdogBase.cs.

+
75 { get; }
+
+
+ +

◆ LastLaunchParameters

+ + + +

◆ Logger

+ + + +

◆ RebootState

+ +
+
+ + + + + +
+ + + + +
abstract ? RebootState Tgstation.Server.Host.Components.Watchdog.WatchdogBase.RebootState
+
+get
+
+ +

+ +

Definition at line 45 of file WatchdogBase.cs.

+
45 { get; }
+
+
+ +

◆ Running

+ + + +

◆ Semaphore

+ + + +

◆ SessionControllerFactory

+ +
+
+ + + + + +
+ + + + +
ISessionControllerFactory Tgstation.Server.Host.Components.Watchdog.WatchdogBase.SessionControllerFactory
+
+getprotected
+
+ +

The ISessionControllerFactory for the WatchdogBase

+ +

Definition at line 70 of file WatchdogBase.cs.

+
70 { get; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.png new file mode 100644 index 0000000000000000000000000000000000000000..86f00ecca3d9b0fe3fde5a00e96a82bcd50d1a0a GIT binary patch literal 5264 zcmc&&2~?BUw#HJx0!me6P%*YQ3atbL5mXRF8JbcCM>LGeV3>>|a}wfEZ~&wY5@c4Q zQmf2?2q8f5BBfyphztROA|i%>5J*Tul6U^7uf6N_t@Ylzuj`$)PV)b2?f;y8_SyT} z-`>|f+?-dbZ%|iKQd))l&f&077A&Dz?q5Qw| zF+!T(h$)BbduU|9l|v~_Kh=2<1GRbnNb@^7+rX#jOJA*`d$`TAC+v_j?0G)BxK~af z26FvliJFrt)&pK?r5WB#|YpL)X@qJ?dZL_2ZpNtE@2HY+*t}m_CA=S*cmUMU^r*jj_eexY%pGxH5G>nt=- zSnH0akwzwc>^`1wA(T~Fwax7j`egm@YA%*Y)rDqO<>M|x`~~_ykjcXBDHC9P}Db35qjMpjWztbn9nVXl+l zqDPb+Af%i$G#_d}k|0!-L;t-%1+gER^B`m;qTRx^_af?cNX~;5_Vx_Z*yPIEY;R?(@+LG-?=lkUsoOAz@-({J3KtfXXV^`+f|%; zn;~%{qut#}p8+ZV{RmBM?M?5@A*sJuQLWAc5`mVvd|BDY2oeEkv)`U^$wV94^uO+O z?v92E5c#WZ-X8exw&|SY*ZygWj(C9ae(ezB4m8G)X*x#Gh&v374vhi;TbH3>xC`}n zipVws7~bXDYw@E_Fu02SAFkq#zr_*aQKF{*C_{nEh#vspvOYWb?f{Z_h;n6X8@Mb0 zxWLz*ClTRfw3-VMnD>9-9c3oBdM6Cq!fAwMx%@b%qtk`hYI3zis{t<)ClQTnT0$_e z(wNPsg?W7kZLtYNn{&?@GSXn954u)3-YY4jTk|}}*$3-fd(ZT_5=%Ji5m$5tJei-- zZ(7?dk%>h>SMjq0gAFiR#I80xEh+^b|CYb&eVWGBli>t=$}*ygKWUjR;uU>4u405=-l` zxC9Ov8DpM9I01jzdW`8j~_cksTWUopcgRlJfn~>k(=y*vG|CERZ1gtwE$%g|JFI zF~acmdBn%962j*51_EsS0*8zy>$zYjdtIB41=dFF{ zcVH#)6#&F#YfJ0IRypioGao;(qh4iKn1Q1aZ`aLjLnyo_Dtaa1a1zLQz&W5afvzmvX6P_!7PpZ#4G1U{%Gv5pnz!X9fQa1^ixjp;b-v$Ej%5VbC-z)_Ngb0I{qXzGIy2mE~e9WRX_u- zzy{n0RvSTJOk=d9x1V<8*SOcAQ?DMZ+f~V|);)I8_RT0Y<)Ju$W&YhMj3jskAx@0z zEGQU&i>?DepUO^}PvP8z#}C2unOc~6m!b(yz7#GhlRiU>gxhu^6Eh(xn#KfADlg7q zYr&SV#dh!f<-^m4Z7UOFDXGT?;PGETH%!(2eahnb+9l}~(Mx3lcj2nRbYZR(uHQ6! zlf+Wbg`3`mLUSL;Am1VzCaJOI@P}|w!6%*;eHY$lG{gYx@83h59t+na0Ml08P0D@{ zvcW?G&`paiMn+2$ogO<#e+BUV9MN#*XHP>u<%>T9xj;(DkGkK4{*;9NC1o7++4gs( zjQ?3?Y7*gW`~NfviuB=oz*1q}p&fPxfeO}&Ay^FbDiU?pLMB>- z?&Wv1;d2enxfVHk`sPKltFMtdw(72lrnNY;M``>wy}13%T-c_@P0zHt=&r+^-i!vt zCDh+Dbz;&FaU`<6XM+0^FztqaAh0<~fQer?BM8J?TG;&kqw)dG@X1pJHp21RH>^R$ z-i>`$ML{}x{kwPHAUVcLpFCUqXAq~Ldb9=607K-a)>RAQZ2+u}phcav!t0W_SEBK! zr62d5bzs(1&&G^%_oOT@T_g4RSg|T+h5@N{rEz>uML#rkWM)iu8lIB+mzOC#$#g1( z6}i`plQ&FtFA8Fv?5EYRD&G!sHAbjvUsTn0AF?q{=itO`wax)@T=PcA*WMEw)*>+U zdHQzWkI+_rZg6p~!v>{8J4=@*W)323Zx;BVU)=qOZ0ka*J|J7Z5ywUt@s?^os&>KM zcmNH#FvCS0x^v^hDe2D@%dfY&7qUOuKUfgcZnqv`7e5AbJ+7cpzCBqvgHskqyCeXP z+LYyQy%ij5S48lR8^@JFp!gon)lV(zy9jtz*7IOhGI|$8#w$}T=Z!h<=R;wxq?VYh`$`yu!C>zBY{6C0}6`HyB zF6i!d@3oMsd}99gjN%6%ALuvPpcJ$dvSQq0P|SR&OCTmZRsogzj-Xb73j52KTcK>B zokmiyQFZmrVStJrvOp>N2jJuBCszP`AcNV`ak-o-J{#jpw29dhj(^YN_nY1dtU$P7 zCFiR7U(zOx-)w0+?NuO~zMl~ounvJ}j$TcC-82`Qo1GA&sZeBkH!8++aOU(6k(^N> zp=2X|w6Ed(U3dzwKf1a#pDT27NqIlbgFOCyG5#y4%)f#2%1`mjqG$DqWoIhPO*!@W zXusz|A7*Kc^i{&*L}laXt0DbTH5gv3H|FN)^$A@#d%58kQ(6;cJ;=)Qn-KDZHD{|& zjB>?+)Jwdym*dau^bbNlw;8($0WPO?-p9rG9fkND zE%eBVm~_9@0qYUm6*Iom*eo|<+EcV>GNpWgmXO-g6!WY+zHT-hq-GVBbo@7{nSHMs zhJ-pZ^=0{gqJou=3oD*Fe8p)UY`x#z(@au6P_XBI}g=v;How>`}zfIAZM^gCN@l)97lp zJ@ZY?Is}IvMGUvOK_XCBaw&Os&%UX}SO+}$V?i#flJ{+4%(x?0{5CY@Y)x<9ixlZb zpNQVCYCKQ)yt8IiTB+I9Lu;gx2sJCM-4l10ces{H3Sl1%Cpr9|WX|5IAo})1X@sX& z4X-b0hJEEt4FECclbahw3sZWQ2ss5S|D+j znzT&tdcd&>Um~i^EEKV1>fi#(yyciy&<@Ci%K;YzJH7ywJsAzUR-oYqeE9_EwteUq zKn#Kr05#TbfUW>k5CV6p2GyVuX#7B(0r0Wqzc%&=Y4R29q3qY06LUX;_MsBe(aoXs IfdA$H0EhAW5&!@I literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory-members.html new file mode 100644 index 0000000000..ead65d7656 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory-members.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.WatchdogFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Watchdog.WatchdogFactory, including all inherited members.

+ + + + + + + + + + +
asyncDelayerTgstation.Server.Host.Components.Watchdog.WatchdogFactoryprivate
byondTopicSenderTgstation.Server.Host.Components.Watchdog.WatchdogFactoryprivate
CreateWatchdog(IChat chat, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IEventConsumer eventConsumer, ISessionControllerFactory sessionControllerFactory, Api.Models.Instance instance, DreamDaemonSettings settings)Tgstation.Server.Host.Components.Watchdog.WatchdogFactory
databaseContextFactoryTgstation.Server.Host.Components.Watchdog.WatchdogFactoryprivate
generalConfigurationTgstation.Server.Host.Components.Watchdog.WatchdogFactoryprivate
jobManagerTgstation.Server.Host.Components.Watchdog.WatchdogFactoryprivate
loggerFactoryTgstation.Server.Host.Components.Watchdog.WatchdogFactoryprivate
serverControlTgstation.Server.Host.Components.Watchdog.WatchdogFactoryprivate
WatchdogFactory(IServerControl serverControl, ILoggerFactory loggerFactory, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IJobManager jobManager, IAsyncDelayer asyncDelayer, IOptions< GeneralConfiguration > generalConfigurationOptions)Tgstation.Server.Host.Components.Watchdog.WatchdogFactory
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html new file mode 100644 index 0000000000..e58bb317d0 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html @@ -0,0 +1,495 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.WatchdogFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.WatchdogFactory Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Watchdog.WatchdogFactory:
+
+
+ + +Tgstation.Server.Host.Components.Watchdog.IWatchdogFactory + +
+ + + + + + + + +

+Public Member Functions

 WatchdogFactory (IServerControl serverControl, ILoggerFactory loggerFactory, IDatabaseContextFactory databaseContextFactory, IByondTopicSender byondTopicSender, IJobManager jobManager, IAsyncDelayer asyncDelayer, IOptions< GeneralConfiguration > generalConfigurationOptions)
 Construct a WatchdogFactory More...
 
IWatchdog CreateWatchdog (IChat chat, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IEventConsumer eventConsumer, ISessionControllerFactory sessionControllerFactory, Api.Models.Instance instance, DreamDaemonSettings settings)
 Creates a IWatchdog More...
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

readonly IServerControl serverControl
 The IServerControl for the WatchdogFactory More...
 
readonly ILoggerFactory loggerFactory
 The ILoggerFactory for the WatchdogFactory More...
 
readonly IDatabaseContextFactory databaseContextFactory
 The IDatabaseContextFactory for the WatchdogFactory More...
 
readonly IByondTopicSender byondTopicSender
 The IByondTopicSender for the WatchdogFactory More...
 
readonly IJobManager jobManager
 The IJobManager for the WatchdogFactory More...
 
readonly IAsyncDelayer asyncDelayer
 The IAsyncDelayer for the WatchdogFactory More...
 
readonly GeneralConfiguration generalConfiguration
 The GeneralConfiguration for the WatchdogFactory More...
 
+

Detailed Description

+
+

Definition at line 14 of file WatchdogFactory.cs.

+

Constructor & Destructor Documentation

+ +

◆ WatchdogFactory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.WatchdogFactory (IServerControl serverControl,
ILoggerFactory loggerFactory,
IDatabaseContextFactory databaseContextFactory,
IByondTopicSender byondTopicSender,
IJobManager jobManager,
IAsyncDelayer asyncDelayer,
IOptions< GeneralConfigurationgeneralConfigurationOptions 
)
+
+ +

Construct a WatchdogFactory

+
Parameters
+ + + + + + + + +
serverControlThe value of serverControl
loggerFactoryThe value of loggerFactory
databaseContextFactoryThe value of databaseContextFactory
byondTopicSenderThe value of byondTopicSender
jobManagerThe value of jobManager
asyncDelayerThe value of asyncDelayer
generalConfigurationOptionsThe IOptions<TOptions> containing the value of generalConfiguration
+
+
+ +

Definition at line 61 of file WatchdogFactory.cs.

+
62  {
63  this.serverControl = serverControl ?? throw new ArgumentNullException(nameof(serverControl));
64  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
65  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
66  this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
67  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
68  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
69  generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
70  }
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the WatchdogFactory
+
readonly IJobManager jobManager
The IJobManager for the WatchdogFactory
+
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the WatchdogFactory
+
readonly IServerControl serverControl
The IServerControl for the WatchdogFactory
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the WatchdogFactory
+
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the WatchdogFactory
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the WatchdogFactory
+
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.asyncDelayer, Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.byondTopicSender, Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.databaseContextFactory, Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.generalConfiguration, Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.jobManager, Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.loggerFactory, and Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.serverControl.

+ +
+
+

Member Function Documentation

+ +

◆ CreateWatchdog()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IWatchdog Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.CreateWatchdog (IChat chat,
IDmbFactory dmbFactory,
IReattachInfoHandler reattachInfoHandler,
IEventConsumer eventConsumer,
ISessionControllerFactory sessionControllerFactory,
Api.Models.Instance instance,
DreamDaemonSettings settings 
)
+
+ +

Creates a IWatchdog

+ +

Implements Tgstation.Server.Host.Components.Watchdog.IWatchdogFactory.

+ +

Definition at line 73 of file WatchdogFactory.cs.

+
74  {
76  return new ExperimentalWatchdog(chat, sessionControllerFactory, dmbFactory, reattachInfoHandler, databaseContextFactory, byondTopicSender, eventConsumer, jobManager, serverControl, asyncDelayer, loggerFactory.CreateLogger<ExperimentalWatchdog>(), settings, instance, settings.AutoStart.Value);
77 
78  return new BasicWatchdog(chat, sessionControllerFactory, dmbFactory, reattachInfoHandler, databaseContextFactory, byondTopicSender, eventConsumer, jobManager, serverControl, asyncDelayer, loggerFactory.CreateLogger<BasicWatchdog>(), settings, instance, settings.AutoStart.Value);
79  }
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the WatchdogFactory
+
readonly IJobManager jobManager
The IJobManager for the WatchdogFactory
+
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the WatchdogFactory
+
bool? AutoStart
If DreamDaemon starts when it's Instance starts
+
readonly IServerControl serverControl
The IServerControl for the WatchdogFactory
+
bool UseExperimentalWatchdog
If the Components.Watchdog.ExperimentalWatchdog should be used.
+
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the WatchdogFactory
+
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the WatchdogFactory
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the WatchdogFactory
+
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.asyncDelayer, Tgstation.Server.Api.Models.Internal.DreamDaemonSettings.AutoStart, Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.byondTopicSender, Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.databaseContextFactory, Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.generalConfiguration, Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.jobManager, Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.loggerFactory, Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.serverControl, and Tgstation.Server.Host.Configuration.GeneralConfiguration.UseExperimentalWatchdog.

+ +
+
+

Member Data Documentation

+ +

◆ asyncDelayer

+ +
+
+ + + + + +
+ + + + +
readonly IAsyncDelayer Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.asyncDelayer
+
+private
+
+
+ +

◆ byondTopicSender

+ +
+
+ + + + + +
+ + + + +
readonly IByondTopicSender Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.byondTopicSender
+
+private
+
+
+ +

◆ databaseContextFactory

+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContextFactory Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.databaseContextFactory
+
+private
+
+
+ +

◆ generalConfiguration

+ +
+
+ + + + + +
+ + + + +
readonly GeneralConfiguration Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.generalConfiguration
+
+private
+
+
+ +

◆ jobManager

+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.jobManager
+
+private
+
+
+ +

◆ loggerFactory

+ +
+
+ + + + + +
+ + + + +
readonly ILoggerFactory Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.loggerFactory
+
+private
+
+
+ +

◆ serverControl

+ +
+
+ + + + + +
+ + + + +
readonly IServerControl Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.serverControl
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..a5c018287f869e8eeab95aa040edc8b0e48afa46 GIT binary patch literal 1278 zcmeAS@N?(olHy`uVBq!ia0y~yU@QZ&12~w0q!rV;6F^ELz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opt(yLS$>+C z+V*ePKeRelm!#mi?hogiNhU8?zTKYp_snnE=HI3Hdyj9)TVuQC`>(}|^FQ7A-EOxl zK4$)+_4~{3t+r*FlkojxbUDZ4M7|s6Z?N+ne0{)YgZ;FG?pfQCtiHq+tuCFm^<<)a zTgmP1ejg*w=R8}O#@zK|+22|TwT|v@8(vSIc;{TegP?YMbCKfykEyXP~G>i65*{~DZRiFr8br_Q#1Ak)V7t+n}O9{ZTK@D1@>{3o4x zaxVY+i=e#u$>kR6p3gM4A8$;Os-2fIFLC~|$A;VEx7eS5d;G@s@?HCx?RnpQ9g-FjM06zl9O3-*22o3$8t~K?E7|sy`1Clyo=dovs2_UFMQxmuqm6pTJ@#B zhUzqP^~$^Zx^3;IPx>jG-1hEZegYKx z)5K-vu#3x@w)kKAo3&fRves_(xyazfP^tBX;UzMT+W1{u?8d3Ey?@Q`&%elGaCvX^ zn?2X!uBlf7@$`-<^#N;dS!X2No3H$iMx~ z`0MwdW&7W){l4Ma-mUFh`?tI8H?4g0*IEAV`t|-71;3oD-s;{UTw+)EnlJH-bp1tZ z2aY)R)V{wPS)wy?j+VUG{Y0q@lIXrLe$|xoo^{sdN{&O_r@8;^dd&AGo@QUa^-c19 zv5khE)erjAFSs4m-n~!GI{3(i^x$`Y3pE$a*X1v2Q`LL6==!p<=NS%H6w8=5FTQp7 zU7A_uQBz;P-)2WE-yHszt3S&z-PykTZ_jnLnaXd(zVdxLtRh^{S}i7YQxC}e{AJ7g zJ3hvL3MA(x?SC;>W#-A&?<>|n`DR(xUOXwKuc%r^Bkj_2&u5amGTr!g{$2FFGOxa? zwtCg?;18D{$bIa=pT%DdGqz{JL|e`WviPv@HaD|3&3++zQZ^+5cE=gpPr2i5ni zdu(!&VG4uY(nEX`)*)l*Z`Y!gTe~DWM4f($ap` literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information-members.html new file mode 100644 index 0000000000..a9e7e085eb --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information-members.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information.html new file mode 100644 index 0000000000..fd15ac86fd --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information.html @@ -0,0 +1,291 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation Class Reference
+
+
+ +

Reattach information for a IWatchdog + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation:
+
+
+ + +Tgstation.Server.Host.Models.WatchdogReattachInformationBase + +
+ + + + + + + + + + + + + + +

+Public Member Functions

 WatchdogReattachInformation ()
 Construct a WatchdogReattachInformation More...
 
 WatchdogReattachInformation (Models.WatchdogReattachInformation copy, IDmbProvider dmbAlpha, IDmbProvider dmbBravo)
 Construct a WatchdogReattachInformation from a given copy with a given dmbAlpha and dmbBravo More...
 
override string ToString ()
 
- Public Member Functions inherited from Tgstation.Server.Host.Models.WatchdogReattachInformationBase
 WatchdogReattachInformationBase ()
 Construct a WatchdogReattachInformationBase More...
 
+ + + + + + + + + + + +

+Properties

ReattachInformation Alpha [get, set]
 ReattachInformation for the Alpha session More...
 
ReattachInformation Bravo [get, set]
 ReattachInformation for the Bravo session More...
 
- Properties inherited from Tgstation.Server.Host.Models.WatchdogReattachInformationBase
bool AlphaIsActive [get, set]
 If the Alpha session is the active session More...
 
+ + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from Tgstation.Server.Host.Models.WatchdogReattachInformationBase
 WatchdogReattachInformationBase (WatchdogReattachInformationBase copy)
 Construct a WatchdogReattachInformation from a given copy More...
 
+

Detailed Description

+

Reattach information for a IWatchdog

+ +

Definition at line 10 of file WatchdogReattachInformation.cs.

+

Constructor & Destructor Documentation

+ +

◆ WatchdogReattachInformation() [1/2]

+ +
+
+ + + + + + + +
Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.WatchdogReattachInformation ()
+
+ +

Construct a WatchdogReattachInformation

+ +

Definition at line 25 of file WatchdogReattachInformation.cs.

+
25 { }
+
+
+ +

◆ WatchdogReattachInformation() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.WatchdogReattachInformation (Models.WatchdogReattachInformation copy,
IDmbProvider dmbAlpha,
IDmbProvider dmbBravo 
)
+
+ +

Construct a WatchdogReattachInformation from a given copy with a given dmbAlpha and dmbBravo

+
Parameters
+ + + + +
copyThe WatchdogReattachInformationBase to copy information from
dmbAlphaThe IDmbProvider used to build Alpha
dmbBravoThe IDmbProvider used to build Bravo
+
+
+ +

Definition at line 33 of file WatchdogReattachInformation.cs.

+
33  : base(copy)
34  {
35  if (copy.Alpha != null)
36  Alpha = new ReattachInformation(copy.Alpha, dmbAlpha);
37  if (copy.Bravo != null)
38  Bravo = new ReattachInformation(copy.Bravo, dmbBravo);
39  }
Database representation of Components.Watchdog.ReattachInformation
+
ReattachInformation Alpha
ReattachInformation for the Alpha session
+
ReattachInformation Bravo
ReattachInformation for the Bravo session
+
+

References Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.Alpha, and Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.Bravo.

+ +
+
+

Member Function Documentation

+ +

◆ ToString()

+ +
+
+ + + + + + + +
override string Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.ToString ()
+
+ +

+ +
+
+

Property Documentation

+ +

◆ Alpha

+ +
+
+ + + + + +
+ + + + +
ReattachInformation Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.Alpha
+
+getset
+
+
+ +

◆ Bravo

+ +
+
+ + + + + +
+ + + + +
ReattachInformation Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.Bravo
+
+getset
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information.png new file mode 100644 index 0000000000000000000000000000000000000000..019af5b28fbc030ef70163041394dc399dfe7d51 GIT binary patch literal 1407 zcmb`HX;4#V6oxM-i&U`H76qh~8iEYQRM~`xw1CPLf)o&nAd4swNlwVBcKH&3zrZ^kYXePVxX+))#BOpvE` zytk(hfS5kj&~xAY0HC1kK|=@Cf5J3o~BcIFh4_HKfpV|67dcjw?=0$mK- zd#Jp^E2MqnWGK0_FQOdYL1I4Gw2+4uz2*rX;X%Mf(7T3R zR5TdJezFnvitDqUk?X%^CU4;pr76=t^i-CbR++6lY%M1{W%qHP`86?hub>)G@EEu^>YK1x+U_WtU|Kba1OX$j!B$3gU za?~kFDLS${uj!>~cz)@)m5=dx3Pn%gzS+k%#~Pn7waK1!$j&HLDrp>gB6NTQ$Qx}g zSA%<3E!LPGB=pV7hS6@}TtQ{J+vv52*$M@I4;VbrTubj#ND&!5!K_`ud()h0AE`P- z+Jt8&o;G5^1ZlX>NN7Rh2d@7Svom{_+G_pshA-7;E4i9u`1JLSb^t+#2#kKbqdx*% zvS6wm@cnVa#TsPjnW@WVs2gP<0YDOBL68EFM70i|(Er7dZV-6P;)?e%L4g}!3ON1e zhg=N9DWg-a80XlJ?$Zvfjxy#3zgb_)$(TIu1MKI{>mW{8W44wKk~n#0>!AEeXJ z+vi>T=l`N4&NNF)wa+!m_>f_0p5nyQC>f5pW%cDNjvpzFagPx2#;BQYcHFrrIZ0#dk56KwTJ*c?X@7wo8XT@vkB5a+uBQQ7cReM?0nm18Ok(rC@HVq91 z=;;TkJ18+Vw<@S+CyCS+(YkoyXR0APZwTd-(?_6})#V#Ul$BZ+w$7zy{)1}SpNAr| z(OnIDV@zN!r((LBOkX}lOgi0gf^}9oiH2A+mY*1vNTJ%S1{{JYj9!Xu$2eRrOIuLB zZ%(y>tisMpFhp#ss#{{q7mk%$3#1ZTdy@zPw;E)(q>;Z*Ai#Fv7jBVmKTc%)>aT?} z8W6cx%_-mAauF3w_O!e7Rqr-U$r&!{-MS>d%0Jk6@6rG^R_+pCa^(2C2%>I7XGQTh zs)xB yYUNmnRg@5=<_x4a{F}75nV70VXN#%{HFz)3wn#H0y6Bfy15v literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper-members.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper-members.html new file mode 100644 index 0000000000..dc60c9d996 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper-members.html @@ -0,0 +1,100 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper, including all inherited members.

+ + + + + + + + + + + + + + + + +
asyncDelayerTgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaperprivate
cancellationTokenSourceTgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaperprivate
Dispose()Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper
EnumWindow(IntPtr hWnd, IntPtr lParam)Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaperprivatestatic
GetAllChildHandles(IntPtr main)Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaperprivatestatic
loggerTgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaperprivate
RecheckDelayMsTgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaperprivate
registeredProcessesTgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaperprivate
RegisterProcess(IProcess process)Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper
Run(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaperprivate
runTaskTgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaperprivate
SendMessageCountTgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaperprivate
StartAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper
StopAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper
WindowsNetworkPromptReaper(IAsyncDelayer asyncDelayer, ILogger< WindowsNetworkPromptReaper > logger)Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html new file mode 100644 index 0000000000..143ed9f40a --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html @@ -0,0 +1,620 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper:
+
+
+ + +IHostedService +Tgstation.Server.Host.Components.Watchdog.INetworkPromptReaper +IDisposable + +
+ + + + + + + + + + + + + + +

+Public Member Functions

 WindowsNetworkPromptReaper (IAsyncDelayer asyncDelayer, ILogger< WindowsNetworkPromptReaper > logger)
 Construct a WindowsNetworkPromptReaper More...
 
void Dispose ()
 
Task StartAsync (CancellationToken cancellationToken)
 
async Task StopAsync (CancellationToken cancellationToken)
 
void RegisterProcess (IProcess process)
 Register a given process for network prompt reaping More...
 
+ + + +

+Private Member Functions

async Task Run (CancellationToken cancellationToken)
 
+ + + + + +

+Static Private Member Functions

static bool EnumWindow (IntPtr hWnd, IntPtr lParam)
 
static List< IntPtr > GetAllChildHandles (IntPtr main)
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

const int SendMessageCount = 5
 Number of times to send the button click message. Should be at least 2 or it may fail to focus the window More...
 
const int RecheckDelayMs = 250
 Check for prompts each time this amount of milliseconds pass More...
 
readonly IAsyncDelayer asyncDelayer
 The IAsyncDelayer for the WindowsNetworkPromptReaper More...
 
readonly ILogger< WindowsNetworkPromptReaperlogger
 The ILogger for the WindowsNetworkPromptReaper More...
 
readonly CancellationTokenSource cancellationTokenSource
 The CancellationTokenSource for the WindowsNetworkPromptReaper More...
 
readonly List< IProcessregisteredProcesses
 The list of IProcesss registered More...
 
Task runTask
 The Task representing the lifetime of the WindowsNetworkPromptReaper More...
 
+

Detailed Description

+
+

Definition at line 16 of file WindowsNetworkPromptReaper.cs.

+

Constructor & Destructor Documentation

+ +

◆ WindowsNetworkPromptReaper()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.WindowsNetworkPromptReaper (IAsyncDelayer asyncDelayer,
ILogger< WindowsNetworkPromptReaperlogger 
)
+
+ +

Construct a WindowsNetworkPromptReaper

+
Parameters
+ + + +
asyncDelayerThe value of asyncDelayer
loggerThe value of logger
+
+
+ +

Definition at line 89 of file WindowsNetworkPromptReaper.cs.

+
90  {
91  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
92  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
93 
94  registeredProcesses = new List<IProcess>();
95  cancellationTokenSource = new CancellationTokenSource();
96  }
readonly List< IProcess > registeredProcesses
The list of IProcesss registered
+
readonly CancellationTokenSource cancellationTokenSource
The CancellationTokenSource for the WindowsNetworkPromptReaper
+
readonly ILogger< WindowsNetworkPromptReaper > logger
The ILogger for the WindowsNetworkPromptReaper
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the WindowsNetworkPromptReaper
+
+

References Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.asyncDelayer, Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.cancellationTokenSource, Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.logger, and Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.registeredProcesses.

+ +
+
+

Member Function Documentation

+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.Dispose ()
+
+ +

+ +
+
+ +

◆ EnumWindow()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static bool Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.EnumWindow (IntPtr hWnd,
IntPtr lParam 
)
+
+staticprivate
+
+ +

Definition at line 53 of file WindowsNetworkPromptReaper.cs.

+
54  {
55  var gcChildhandlesList = GCHandle.FromIntPtr(lParam);
56 
57  if (gcChildhandlesList.Target == null)
58  return false;
59 
60  var childHandles = (List<IntPtr>)gcChildhandlesList.Target;
61  childHandles.Add(hWnd);
62 
63  return true;
64  }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.GetAllChildHandles().

+ +
+
+ +

◆ GetAllChildHandles()

+ +
+
+ + + + + +
+ + + + + + + + +
static List<IntPtr> Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.GetAllChildHandles (IntPtr main)
+
+staticprivate
+
+ +

Definition at line 66 of file WindowsNetworkPromptReaper.cs.

+
67  {
68  var childHandles = new List<IntPtr>();
69  var gcChildhandlesList = GCHandle.Alloc(childHandles);
70  try
71  {
72  var pointerChildHandlesList = GCHandle.ToIntPtr(gcChildhandlesList);
73  NativeMethods.EnumWindowProc childProc = new NativeMethods.EnumWindowProc(EnumWindow);
74  NativeMethods.EnumChildWindows(main, childProc, pointerChildHandlesList);
75  }
76  finally
77  {
78  gcChildhandlesList.Free();
79  }
80 
81  return childHandles;
82  }
+
+

References Tgstation.Server.Host.NativeMethods.EnumChildWindows(), Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.EnumWindow(), and Tgstation.Server.Host.NativeMethods.EnumWindowProc().

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.Run().

+ +
+
+ +

◆ RegisterProcess()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.RegisterProcess (IProcess process)
+
+ +

Register a given process for network prompt reaping

+ +

Implements Tgstation.Server.Host.Components.Watchdog.INetworkPromptReaper.

+ +

Definition at line 188 of file WindowsNetworkPromptReaper.cs.

+
189  {
190  if (process == null)
191  throw new ArgumentNullException(nameof(process));
192 
193  lock (registeredProcesses)
194  {
195  if (registeredProcesses.Contains(process))
196  throw new InvalidOperationException("This process has already been registered for network prompt reaping!");
197  logger.LogTrace("Registering process {0}...", process.Id);
198  registeredProcesses.Add(process);
199  }
200 
201  process.Lifetime.ContinueWith(x =>
202  {
203  logger.LogTrace("Unregistering process {0}...", process.Id);
204  lock (registeredProcesses)
205  registeredProcesses.Remove(process);
206  }, TaskScheduler.Current);
207  }
Task< int > Lifetime
The Task<TResult> resulting in the exit code of the process
Definition: IProcessBase.cs:14
+
readonly List< IProcess > registeredProcesses
The list of IProcesss registered
+
readonly ILogger< WindowsNetworkPromptReaper > logger
The ILogger for the WindowsNetworkPromptReaper
+ +
+

References Tgstation.Server.Host.Core.IProcess.Id, Tgstation.Server.Host.Core.IProcessBase.Lifetime, Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.logger, and Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.registeredProcesses.

+ +
+
+ +

◆ Run()

+ +
+
+ + + + + +
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.Run (CancellationToken cancellationToken)
+
+private
+
+ +

Definition at line 101 of file WindowsNetworkPromptReaper.cs.

+
102  {
103  logger.LogDebug("Starting network prompt reaper...");
104  try
105  {
106  while (!cancellationToken.IsCancellationRequested)
107  {
108  await asyncDelayer.Delay(TimeSpan.FromMilliseconds(RecheckDelayMs), cancellationToken).ConfigureAwait(false);
109 
110  IntPtr window;
111  int processId;
112  lock (registeredProcesses)
113  {
114  if (registeredProcesses.Count == 0)
115  continue;
116 
117  window = NativeMethods.FindWindow(null, "Network Accessibility");
118  if (window == IntPtr.Zero)
119  continue;
120 
121  // found a bitch
122  var threadId = NativeMethods.GetWindowThreadProcessId(window, out processId);
123  if (!registeredProcesses.Any(x => x.Id == processId))
124  continue; // not our bitch
125  }
126 
127  logger.LogTrace("Identified \"Network Accessibility\" window in owned process {0}", processId);
128 
129  var found = false;
130  foreach (var I in GetAllChildHandles(window))
131  {
132  const int MaxLength = 10;
133  var stringBuilder = new StringBuilder(MaxLength + 1);
134 
135  if (NativeMethods.GetWindowText(I, stringBuilder, MaxLength) == 0)
136  {
137  logger.LogWarning("Error calling GetWindowText! Exception: {0}", new Win32Exception());
138  continue;
139  }
140 
141  var windowText = stringBuilder.ToString();
142  if (windowText == "Yes")
143  {
144  // smash_button_meme.jpg
145  logger.LogTrace("Sending \"Yes\" button clicks...");
146  for (var J = 0; J < SendMessageCount; ++J)
147  {
148  const int BM_CLICK = 0x00F5;
149  var result = NativeMethods.SendMessage(I, BM_CLICK, IntPtr.Zero, IntPtr.Zero);
150  }
151 
152  found = true;
153  break;
154  }
155  }
156 
157  if (!found)
158  logger.LogDebug("Unable to find \"Yes\" button for \"Network Accessibility\" window in owned process {0}!", processId);
159  }
160  }
161  catch (OperationCanceledException)
162  {
163  logger.LogTrace("Cancelled!");
164  }
165  finally
166  {
167  logger.LogDebug("Exiting network prompt reaper...");
168  }
169  }
const int SendMessageCount
Number of times to send the button click message. Should be at least 2 or it may fail to focus the wi...
+
readonly List< IProcess > registeredProcesses
The list of IProcesss registered
+
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+
const int RecheckDelayMs
Check for prompts each time this amount of milliseconds pass
+
readonly ILogger< WindowsNetworkPromptReaper > logger
The ILogger for the WindowsNetworkPromptReaper
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the WindowsNetworkPromptReaper
+ +
+

References Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.asyncDelayer, Tgstation.Server.Host.Core.IAsyncDelayer.Delay(), Tgstation.Server.Host.NativeMethods.FindWindow(), Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.GetAllChildHandles(), Tgstation.Server.Host.NativeMethods.GetWindowText(), Tgstation.Server.Host.NativeMethods.GetWindowThreadProcessId(), Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.logger, Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.RecheckDelayMs, Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.registeredProcesses, Tgstation.Server.Host.NativeMethods.SendMessage(), and Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.SendMessageCount.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.StartAsync().

+ +
+
+ +

◆ StartAsync()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.StartAsync (CancellationToken cancellationToken)
+
+
+ +

◆ StopAsync()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.StopAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 179 of file WindowsNetworkPromptReaper.cs.

+
180  {
181  logger.LogTrace("Stopping network prompt reaper...");
182  cancellationTokenSource.Cancel();
183  await runTask.ConfigureAwait(false);
184  registeredProcesses.Clear();
185  }
readonly List< IProcess > registeredProcesses
The list of IProcesss registered
+
readonly CancellationTokenSource cancellationTokenSource
The CancellationTokenSource for the WindowsNetworkPromptReaper
+
Task runTask
The Task representing the lifetime of the WindowsNetworkPromptReaper
+
readonly ILogger< WindowsNetworkPromptReaper > logger
The ILogger for the WindowsNetworkPromptReaper
+
+

References Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.cancellationTokenSource, Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.logger, Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.registeredProcesses, and Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.runTask.

+ +
+
+

Member Data Documentation

+ +

◆ asyncDelayer

+ +
+
+ + + + + +
+ + + + +
readonly IAsyncDelayer Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.asyncDelayer
+
+private
+
+
+ +

◆ cancellationTokenSource

+ +
+
+ + + + + +
+ + + + +
readonly CancellationTokenSource Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.cancellationTokenSource
+
+private
+
+
+ +

◆ logger

+ + + +

◆ RecheckDelayMs

+ +
+
+ + + + + +
+ + + + +
const int Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.RecheckDelayMs = 250
+
+private
+
+ +

Check for prompts each time this amount of milliseconds pass

+ +

Definition at line 26 of file WindowsNetworkPromptReaper.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.Run().

+ +
+
+ +

◆ registeredProcesses

+ + + +

◆ runTask

+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.runTask
+
+private
+
+
+ +

◆ SendMessageCount

+ +
+
+ + + + + +
+ + + + +
const int Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.SendMessageCount = 5
+
+private
+
+ +

Number of times to send the button click message. Should be at least 2 or it may fail to focus the window

+ +

Definition at line 21 of file WindowsNetworkPromptReaper.cs.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.Run().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.png b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.png new file mode 100644 index 0000000000000000000000000000000000000000..7a64558ca8fb965647d21f154bef52d1d9c54707 GIT binary patch literal 2408 zcmbVOeK^x=A15cubCoM{38yJ7^>D&7Y=?+c>x{f_Rv|ALdNE-PV|sKdX{__3goB(_ z=DqT07)=z9cd>;fX zZqqc-R8djchWg>Sw~ESUFHrW}q6WSXoP9k74!b;0p-(6j3Q+tglEqP5?|{+y|GS2^#JT5+T~%{r3H_|LB+6LoxqOEE1>%xdX;1^@owKpnnHKoyzZ^ zVpO{5D401X9hCn1RNY26Z_}rMHe{|ZNh4O4P{1Lg`+-hNdtQ3+nGxvw`1)xp6habi zfkM0}>yRQ`1~VnkYBH*iO}LK*TojZv=ndldI!9Ca^RnjMgY-z3qRwty-wy6vprvpq z&JCDbI=T;^{pI1AqHg|F(wY%&iG~b#J(uZKyk*71Aw8;m%Rv_3)?R8|7AWx>5ns^ahtNqCI|$2B5=$`2miUmbS&Z%>GXtyene zDQjX*g(dzFGh=?M(NM{CfprmgH=nM!C)dBZ$Q_l`XZx3P@ z7)7OAS&k|T=iR6<%cny1Da8gd;BIrMO;`hNDtG}eA2f)I?e6R8*3Q-A^ScUY@CW3% z!%_zIWf#4>L+mbxVA zd{I!mn4wihYvNe>9@2OZQ#N8FTn849c zByz*bnyvSDLT{T2CNk0$@zgtvekCUH_1|$z|lu>KjBVrYZ9F^!=~l7g|$TF-`OBzT8&mcr+0e$1+z1s@u`)I38%;j(;R zAcSp}MTxJrUuMf=M3{?&0!TNVL|qX^f9^^w6$7Drz_9&hj&LEIbU19BIYVw`YC8av z<)e~aaf~kv+Cs@Jt2amVl<^^F3~9uLQ_P>IzM-eIL+qnI>7ZcWX;=zRp16m!#fICy zNG93(ca8Zrt-?_4?@N)*xJRhB9iM@Uy0en7n!~bsNbYEFWA-_F3E9U%Hllfk- zDc)vXz8Ar(A05c+qZ5r;V`RByz&<~mIcmZ7zE^IHg;uNSZr&*y{ZoLKKAVp6ZW>8v z&6dbLLYB>LCliN^%#-%eOge8&y5&LpJ;C}%FJIV4J~E=n@ltSabkk8^t#NGdE>2^m zQ^=nm2g)uh4pvFK1pxye~ySM%V5 ztDDZ1P&7e{lWL78^7|tg3W2%ke6?3aZ}ecF~nFJHKe+(8?IigzGTV|2xgv ziN_c6GcM#m-uq8w@+!1PD;+HZ)ABuJP>Ksi3slPgMA_ePpj4`rAANXjDT+m8=)HvG z#tmf6EG-+B7>?tLHL&sUInU$0b@D}`n&0PH{wtG?FIW5PQh^NR##>e!Y`57JpLfHY&eil+18)od%rP|?)v9v@2Tb*q| z4ksJ6OX^6qQH+2}Cf5f+Lv_j`vLA_&xpwnL6`55!8p_l18`&lMQ0g~aE#nftVxv4x zzkw79QsiR+zaTcq(V!+-IQ!ib{!axh@$gvY!ra-&`BjS|&U*hkQ@!~DUDBCFfQVxgv5Ib`(kx&=IwnB=lo2^K5 zGVx_bD~x6(T!-n1BWNi*W$@qPGrdZ0#or%mSEI#0_Alld)Mbxnb(l{XKE>k+{dD9c`X!-sZ5H=Cu6eL zTw0S#hrFkpso8ZXFwlu{!fY)i!=TDSF)^4w@-G=Tssa}&h0%!KTH!*e| R27ilGP$%4vS33u#{RgfnroI3G literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_control_panel_configuration-members.html b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_control_panel_configuration-members.html new file mode 100644 index 0000000000..51d815be09 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_control_panel_configuration-members.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Configuration.ControlPanelConfiguration Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_control_panel_configuration.html b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_control_panel_configuration.html new file mode 100644 index 0000000000..fae8746919 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_control_panel_configuration.html @@ -0,0 +1,217 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Configuration.ControlPanelConfiguration Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Configuration.ControlPanelConfiguration Class Reference
+
+
+ +

Configuration options for the web control panel + More...

+ + + + + +

+Public Attributes

const string Section = "ControlPanel"
 The key for the Microsoft.Extensions.Configuration.IConfigurationSection the ControlPanelConfiguration resides in More...
 
+ + + + + + + + + + +

+Properties

bool Enable [get, set]
 If the control panel is enabled More...
 
bool AllowAnyOrigin [get, set]
 If any origin is allowed for CORS requests. This overrides AllowedOrigins More...
 
List< string > AllowedOrigins [get, set]
 Origins allowed for CORS requests More...
 
+

Detailed Description

+

Configuration options for the web control panel

+ +

Definition at line 8 of file ControlPanelConfiguration.cs.

+

Member Data Documentation

+ +

◆ Section

+ +
+
+ + + + +
const string Tgstation.Server.Host.Configuration.ControlPanelConfiguration.Section = "ControlPanel"
+
+ +

The key for the Microsoft.Extensions.Configuration.IConfigurationSection the ControlPanelConfiguration resides in

+ +

Definition at line 13 of file ControlPanelConfiguration.cs.

+ +

Referenced by Tgstation.Server.Host.Core.SetupWizard.SaveConfiguration().

+ +
+
+

Property Documentation

+ +

◆ AllowAnyOrigin

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Configuration.ControlPanelConfiguration.AllowAnyOrigin
+
+getset
+
+ +

If any origin is allowed for CORS requests. This overrides AllowedOrigins

+ +

Definition at line 23 of file ControlPanelConfiguration.cs.

+
23 { get; set; }
+
+
+ +

◆ AllowedOrigins

+ +
+
+ + + + + +
+ + + + +
List<string> Tgstation.Server.Host.Configuration.ControlPanelConfiguration.AllowedOrigins
+
+getset
+
+ +

Origins allowed for CORS requests

+ +

Definition at line 28 of file ControlPanelConfiguration.cs.

+
28 { get; set; }
+
+
+ +

◆ Enable

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Configuration.ControlPanelConfiguration.Enable
+
+getset
+
+ +

If the control panel is enabled

+ +

Definition at line 18 of file ControlPanelConfiguration.cs.

+
18 { get; set; }
+

Referenced by Tgstation.Server.Host.Controllers.HomeController.Home().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration-members.html b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration-members.html new file mode 100644 index 0000000000..474e6e90a6 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration-members.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Configuration.DatabaseConfiguration Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html new file mode 100644 index 0000000000..493cacf336 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html @@ -0,0 +1,283 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Configuration.DatabaseConfiguration Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Configuration.DatabaseConfiguration Class Reference
+
+
+ +

Configuration options for the Models.DatabaseContext<TParentContext> + More...

+ + + + + +

+Public Attributes

const string Section = "Database"
 The key for the Microsoft.Extensions.Configuration.IConfigurationSection the DatabaseConfiguration resides in More...
 
+ + + + + + + + + + + + + + + + +

+Properties

DatabaseType DatabaseType [get, set]
 The Configuration.DatabaseType to create More...
 
bool ResetAdminPassword [get, set]
 If the admin user should be enabled and have it's password reset More...
 
string ConnectionString [get, set]
 The connection string for the database More...
 
bool DropDatabase [get, set]
 If the database should be deleted on application startup. Should not be used in production! More...
 
string MySqlServerVersion [get, set]
 The string form of the System.Version of a target MySQL/MariaDB server More...
 
+

Detailed Description

+

Configuration options for the Models.DatabaseContext<TParentContext>

+ +

Definition at line 9 of file DatabaseConfiguration.cs.

+

Member Data Documentation

+ +

◆ Section

+ +
+
+ + + + +
const string Tgstation.Server.Host.Configuration.DatabaseConfiguration.Section = "Database"
+
+ +

The key for the Microsoft.Extensions.Configuration.IConfigurationSection the DatabaseConfiguration resides in

+ +

Definition at line 14 of file DatabaseConfiguration.cs.

+ +

Referenced by Tgstation.Server.Host.Models.Migrations.DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), and Tgstation.Server.Host.Core.SetupWizard.SaveConfiguration().

+ +
+
+

Property Documentation

+ +

◆ ConnectionString

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Configuration.DatabaseConfiguration.ConnectionString
+
+getset
+
+ +

The connection string for the database

+ +

Definition at line 30 of file DatabaseConfiguration.cs.

+
30 { get; set; }
+

Referenced by Tgstation.Server.Host.Models.SqlServerDatabaseContext.OnConfiguring(), and Tgstation.Server.Host.Models.MySqlDatabaseContext.OnConfiguring().

+ +
+
+ +

◆ DatabaseType

+ +
+
+ + + + + +
+ + + + +
DatabaseType Tgstation.Server.Host.Configuration.DatabaseConfiguration.DatabaseType
+
+getset
+
+
+ +

◆ DropDatabase

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Configuration.DatabaseConfiguration.DropDatabase
+
+getset
+
+ +

If the database should be deleted on application startup. Should not be used in production!

+ +

Definition at line 35 of file DatabaseConfiguration.cs.

+
35 { get; set; }
+

Referenced by Tgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >.Initialize().

+ +
+
+ +

◆ MySqlServerVersion

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Configuration.DatabaseConfiguration.MySqlServerVersion
+
+getset
+
+ +

The string form of the System.Version of a target MySQL/MariaDB server

+ +

Definition at line 40 of file DatabaseConfiguration.cs.

+
40 { get; set; }
+

Referenced by Tgstation.Server.Host.Models.MySqlDatabaseContext.OnConfiguring().

+ +
+
+ +

◆ ResetAdminPassword

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Configuration.DatabaseConfiguration.ResetAdminPassword
+
+getset
+
+ +

If the admin user should be enabled and have it's password reset

+ +

Definition at line 25 of file DatabaseConfiguration.cs.

+
25 { get; set; }
+

Referenced by Tgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >.Initialize().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration-members.html b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration-members.html new file mode 100644 index 0000000000..866509b035 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration-members.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Configuration.FileLoggingConfiguration Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html new file mode 100644 index 0000000000..93a0b07bdf --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html @@ -0,0 +1,316 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Configuration.FileLoggingConfiguration Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Configuration.FileLoggingConfiguration Class Reference
+
+
+ +

File logging configuration options + More...

+ + + + + +

+Public Attributes

const string Section = "FileLogging"
 The key for the Microsoft.Extensions.Configuration.IConfigurationSection the FileLoggingConfiguration resides in More...
 
+ + + + + + + + + + + + + +

+Properties

string Directory [get, set]
 Where log files are stored More...
 
bool Disable [get, set]
 If file logging is disabled More...
 
LogLevel LogLevel = DefaultLogLevel [get, set]
 The minimum Microsoft.Extensions.Logging.LogLevel to display in logs More...
 
LogLevel MicrosoftLogLevel = DefaultMicrosoftLogLevel [get, set]
 The minimum Microsoft.Extensions.Logging.LogLevel to display in logs for Microsoft library sources More...
 
+ + + + + + + +

+Private Attributes

const LogLevel DefaultLogLevel = LogLevel.Debug
 Default value for LogLevel More...
 
const LogLevel DefaultMicrosoftLogLevel = LogLevel.Warning
 Default value for MicrosoftLogLevel More...
 
+

Detailed Description

+

File logging configuration options

+ +

Definition at line 10 of file FileLoggingConfiguration.cs.

+

Member Data Documentation

+ +

◆ DefaultLogLevel

+ +
+
+ + + + + +
+ + + + +
const LogLevel Tgstation.Server.Host.Configuration.FileLoggingConfiguration.DefaultLogLevel = LogLevel.Debug
+
+private
+
+ +

Default value for LogLevel

+ +

Definition at line 20 of file FileLoggingConfiguration.cs.

+ +
+
+ +

◆ DefaultMicrosoftLogLevel

+ +
+
+ + + + + +
+ + + + +
const LogLevel Tgstation.Server.Host.Configuration.FileLoggingConfiguration.DefaultMicrosoftLogLevel = LogLevel.Warning
+
+private
+
+ +

Default value for MicrosoftLogLevel

+ +

Definition at line 25 of file FileLoggingConfiguration.cs.

+ +
+
+ +

◆ Section

+ +
+
+ + + + +
const string Tgstation.Server.Host.Configuration.FileLoggingConfiguration.Section = "FileLogging"
+
+ +

The key for the Microsoft.Extensions.Configuration.IConfigurationSection the FileLoggingConfiguration resides in

+ +

Definition at line 15 of file FileLoggingConfiguration.cs.

+ +

Referenced by Tgstation.Server.Host.Core.SetupWizard.SaveConfiguration().

+ +
+
+

Property Documentation

+ +

◆ Directory

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Configuration.FileLoggingConfiguration.Directory
+
+getset
+
+ +

Where log files are stored

+ +

Definition at line 30 of file FileLoggingConfiguration.cs.

+
30 { get; set; }
+

Referenced by Tgstation.Server.Host.Core.Application.ConfigureServices().

+ +
+
+ +

◆ Disable

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Configuration.FileLoggingConfiguration.Disable
+
+getset
+
+ +

If file logging is disabled

+ +

Definition at line 35 of file FileLoggingConfiguration.cs.

+
35 { get; set; }
+

Referenced by Tgstation.Server.Host.Core.Application.ConfigureServices().

+ +
+
+ +

◆ LogLevel

+ +
+
+ + + + + +
+ + + + +
LogLevel Tgstation.Server.Host.Configuration.FileLoggingConfiguration.LogLevel = DefaultLogLevel
+
+getset
+
+ +

The minimum Microsoft.Extensions.Logging.LogLevel to display in logs

+ +

Definition at line 41 of file FileLoggingConfiguration.cs.

+
41 { get; set; } = DefaultLogLevel;
+
+

Referenced by Tgstation.Server.Host.Core.Application.ConfigureServices().

+ +
+
+ +

◆ MicrosoftLogLevel

+ +
+
+ + + + + +
+ + + + +
LogLevel Tgstation.Server.Host.Configuration.FileLoggingConfiguration.MicrosoftLogLevel = DefaultMicrosoftLogLevel
+
+getset
+
+ +

The minimum Microsoft.Extensions.Logging.LogLevel to display in logs for Microsoft library sources

+ +

Definition at line 47 of file FileLoggingConfiguration.cs.

+
47 { get; set; } = DefaultMicrosoftLogLevel;
const LogLevel DefaultMicrosoftLogLevel
Default value for MicrosoftLogLevel
+
+

Referenced by Tgstation.Server.Host.Core.Application.ConfigureServices().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration-members.html b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration-members.html new file mode 100644 index 0000000000..8a90ae2af1 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration-members.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Configuration.GeneralConfiguration Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html new file mode 100644 index 0000000000..7c81bcd211 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html @@ -0,0 +1,406 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Configuration.GeneralConfiguration Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Configuration.GeneralConfiguration Class Reference
+
+
+ +

General configuration options + More...

+ + + + + +

+Public Attributes

const string Section = "General"
 The key for the Microsoft.Extensions.Configuration.IConfigurationSection the GeneralConfiguration resides in More...
 
+ + + + + + + + + + + + + + + + + + + +

+Properties

uint MinimumPasswordLength = DefaultMinimumPasswordLength [get, set]
 Minimum length of database user passwords More...
 
string GitHubAccessToken [get, set]
 A GitHub personal access token to use for bypassing rate limits on requests. Requires no scopes More...
 
SetupWizardMode SetupWizardMode [get, set]
 The SetupWizardMode More...
 
int ByondTopicTimeout = DefaultByondTopicTimeout [get, set]
 The timeout in milliseconds for sending and receiving topics to/from DreamDaemon. Note that a single topic exchange can take up to twice this value More...
 
int RestartTimeout = DefaultRestartTimeout [get, set]
 The timeout milliseconds for restarting the server More...
 
bool UseExperimentalWatchdog [get, set]
 If the Components.Watchdog.ExperimentalWatchdog should be used. More...
 
+ + + + + + + + + + +

+Private Attributes

const uint DefaultMinimumPasswordLength = 15
 The default value for MinimumPasswordLength More...
 
const int DefaultByondTopicTimeout = 5000
 The default value for ByondTopicTimeout More...
 
const int DefaultRestartTimeout = 10000
 The default value for RestartTimeout More...
 
+

Detailed Description

+

General configuration options

+ +

Definition at line 9 of file GeneralConfiguration.cs.

+

Member Data Documentation

+ +

◆ DefaultByondTopicTimeout

+ +
+
+ + + + + +
+ + + + +
const int Tgstation.Server.Host.Configuration.GeneralConfiguration.DefaultByondTopicTimeout = 5000
+
+private
+
+ +

The default value for ByondTopicTimeout

+ +

Definition at line 24 of file GeneralConfiguration.cs.

+ +
+
+ +

◆ DefaultMinimumPasswordLength

+ +
+
+ + + + + +
+ + + + +
const uint Tgstation.Server.Host.Configuration.GeneralConfiguration.DefaultMinimumPasswordLength = 15
+
+private
+
+ +

The default value for MinimumPasswordLength

+ +

Definition at line 19 of file GeneralConfiguration.cs.

+ +
+
+ +

◆ DefaultRestartTimeout

+ +
+
+ + + + + +
+ + + + +
const int Tgstation.Server.Host.Configuration.GeneralConfiguration.DefaultRestartTimeout = 10000
+
+private
+
+ +

The default value for RestartTimeout

+ +

Definition at line 29 of file GeneralConfiguration.cs.

+ +
+
+ +

◆ Section

+ +
+
+ + + + +
const string Tgstation.Server.Host.Configuration.GeneralConfiguration.Section = "General"
+
+ +

The key for the Microsoft.Extensions.Configuration.IConfigurationSection the GeneralConfiguration resides in

+ +

Definition at line 14 of file GeneralConfiguration.cs.

+ +

Referenced by Tgstation.Server.Host.Core.SetupWizard.SaveConfiguration(), and Tgstation.Server.Host.Core.ServiceCollectionExtensions.UseStandardConfig< TConfig >().

+ +
+
+

Property Documentation

+ +

◆ ByondTopicTimeout

+ +
+
+ + + + + +
+ + + + +
int Tgstation.Server.Host.Configuration.GeneralConfiguration.ByondTopicTimeout = DefaultByondTopicTimeout
+
+getset
+
+ +

The timeout in milliseconds for sending and receiving topics to/from DreamDaemon. Note that a single topic exchange can take up to twice this value

+ +

Definition at line 50 of file GeneralConfiguration.cs.

+
50 { get; set; } = DefaultByondTopicTimeout;
const int DefaultByondTopicTimeout
The default value for ByondTopicTimeout
+
+
+
+ +

◆ GitHubAccessToken

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Configuration.GeneralConfiguration.GitHubAccessToken
+
+getset
+
+ +

A GitHub personal access token to use for bypassing rate limits on requests. Requires no scopes

+ +

Definition at line 39 of file GeneralConfiguration.cs.

+
39 { get; set; }
+

Referenced by Tgstation.Server.Host.Controllers.RepositoryController.Update().

+ +
+
+ +

◆ MinimumPasswordLength

+ +
+
+ + + + + +
+ + + + +
uint Tgstation.Server.Host.Configuration.GeneralConfiguration.MinimumPasswordLength = DefaultMinimumPasswordLength
+
+getset
+
+ +

Minimum length of database user passwords

+ +

Definition at line 34 of file GeneralConfiguration.cs.

+
34 { get; set; } = DefaultMinimumPasswordLength;
const uint DefaultMinimumPasswordLength
The default value for MinimumPasswordLength
+
+

Referenced by Tgstation.Server.Host.Controllers.UserController.Create().

+ +
+
+ +

◆ RestartTimeout

+ +
+
+ + + + + +
+ + + + +
int Tgstation.Server.Host.Configuration.GeneralConfiguration.RestartTimeout = DefaultRestartTimeout
+
+getset
+
+ +

The timeout milliseconds for restarting the server

+ +

Definition at line 55 of file GeneralConfiguration.cs.

+
55 { get; set; } = DefaultRestartTimeout;
const int DefaultRestartTimeout
The default value for RestartTimeout
+
+

Referenced by Tgstation.Server.Host.Server.Restart().

+ +
+
+ +

◆ SetupWizardMode

+ +
+
+ + + + + +
+ + + + +
SetupWizardMode Tgstation.Server.Host.Configuration.GeneralConfiguration.SetupWizardMode
+
+getset
+
+ +

The SetupWizardMode

+ +

Definition at line 45 of file GeneralConfiguration.cs.

+
45 { get; set; }
+

Referenced by Tgstation.Server.Host.Core.SetupWizard.CheckRunWizard().

+ +
+
+ +

◆ UseExperimentalWatchdog

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Configuration.GeneralConfiguration.UseExperimentalWatchdog
+
+getset
+
+ +

If the Components.Watchdog.ExperimentalWatchdog should be used.

+ +

Definition at line 60 of file GeneralConfiguration.cs.

+
60 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.CreateWatchdog().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration-members.html b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration-members.html new file mode 100644 index 0000000000..a65f2b5b95 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration-members.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Configuration.UpdatesConfiguration Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html new file mode 100644 index 0000000000..062fead09f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html @@ -0,0 +1,313 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Configuration.UpdatesConfiguration Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Configuration.UpdatesConfiguration Class Reference
+
+
+ +

Configuration for the automatic update system + More...

+ + + + + +

+Public Attributes

const string Section = "Updates"
 The key for the Microsoft.Extensions.Configuration.IConfigurationSection the UpdatesConfiguration resides in More...
 
+ + + + + + + + + + +

+Properties

long GitHubRepositoryId = DefaultGitHubRepositoryId [get, set]
 The Octokit.Repository.Id of the tgstation-server fork to recieve updates from More...
 
string GitTagPrefix = DefaultGitTagPrefix [get, set]
 Prefix before the System.Version of TGS published in git tags More...
 
string UpdatePackageAssetName = DefaultUpdatePackageAssetName [get, set]
 Asset package containing the new Host assembly in zip form More...
 
+ + + + + + + + + + +

+Private Attributes

const long DefaultGitHubRepositoryId = 92952846
 The tgstation/tgstation-server Octokit.Repository.Id More...
 
const string DefaultGitTagPrefix = "tgstation-server-v"
 The default value of GitTagPrefix More...
 
const string DefaultUpdatePackageAssetName = "ServerUpdatePackage.zip"
 The default value of UpdatePackageAssetName More...
 
+

Detailed Description

+

Configuration for the automatic update system

+ +

Definition at line 6 of file UpdatesConfiguration.cs.

+

Member Data Documentation

+ +

◆ DefaultGitHubRepositoryId

+ +
+
+ + + + + +
+ + + + +
const long Tgstation.Server.Host.Configuration.UpdatesConfiguration.DefaultGitHubRepositoryId = 92952846
+
+private
+
+ +

The tgstation/tgstation-server Octokit.Repository.Id

+ +

Definition at line 16 of file UpdatesConfiguration.cs.

+ +
+
+ +

◆ DefaultGitTagPrefix

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Configuration.UpdatesConfiguration.DefaultGitTagPrefix = "tgstation-server-v"
+
+private
+
+ +

The default value of GitTagPrefix

+ +

Definition at line 21 of file UpdatesConfiguration.cs.

+ +
+
+ +

◆ DefaultUpdatePackageAssetName

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Configuration.UpdatesConfiguration.DefaultUpdatePackageAssetName = "ServerUpdatePackage.zip"
+
+private
+
+ +

The default value of UpdatePackageAssetName

+ +

Definition at line 26 of file UpdatesConfiguration.cs.

+ +
+
+ +

◆ Section

+ +
+
+ + + + +
const string Tgstation.Server.Host.Configuration.UpdatesConfiguration.Section = "Updates"
+
+ +

The key for the Microsoft.Extensions.Configuration.IConfigurationSection the UpdatesConfiguration resides in

+ +

Definition at line 11 of file UpdatesConfiguration.cs.

+ +
+
+

Property Documentation

+ +

◆ GitHubRepositoryId

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Configuration.UpdatesConfiguration.GitHubRepositoryId = DefaultGitHubRepositoryId
+
+getset
+
+ +

The Octokit.Repository.Id of the tgstation-server fork to recieve updates from

+ +

Definition at line 31 of file UpdatesConfiguration.cs.

+
31 { get; set; } = DefaultGitHubRepositoryId;
const long DefaultGitHubRepositoryId
The tgstation/tgstation-server Octokit.Repository.Id
+
+

Referenced by Tgstation.Server.Host.Controllers.AdministrationController.CheckReleasesAndApplyUpdate(), and Tgstation.Server.Host.Controllers.AdministrationController.Read().

+ +
+
+ +

◆ GitTagPrefix

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Configuration.UpdatesConfiguration.GitTagPrefix = DefaultGitTagPrefix
+
+getset
+
+ +

Prefix before the System.Version of TGS published in git tags

+ +

Definition at line 36 of file UpdatesConfiguration.cs.

+
36 { get; set; } = DefaultGitTagPrefix;
const string DefaultGitTagPrefix
The default value of GitTagPrefix
+
+

Referenced by Tgstation.Server.Host.Controllers.AdministrationController.CheckReleasesAndApplyUpdate(), and Tgstation.Server.Host.Controllers.AdministrationController.Read().

+ +
+
+ +

◆ UpdatePackageAssetName

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Configuration.UpdatesConfiguration.UpdatePackageAssetName = DefaultUpdatePackageAssetName
+
+getset
+
+ +

Asset package containing the new Host assembly in zip form

+ +

Definition at line 41 of file UpdatesConfiguration.cs.

+
41 { get; set; } = DefaultUpdatePackageAssetName;
const string DefaultUpdatePackageAssetName
The default value of UpdatePackageAssetName
+
+

Referenced by Tgstation.Server.Host.Controllers.AdministrationController.CheckReleasesAndApplyUpdate().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_console_1_1_program-members.html b/class_tgstation_1_1_server_1_1_host_1_1_console_1_1_program-members.html new file mode 100644 index 0000000000..984852235e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_console_1_1_program-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Console.Program Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Console.Program, including all inherited members.

+ + + +
Main(string[] args)Tgstation.Server.Host.Console.Programprivatestatic
WatchdogFactoryTgstation.Server.Host.Console.Programprivatestatic
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_console_1_1_program.html b/class_tgstation_1_1_server_1_1_host_1_1_console_1_1_program.html new file mode 100644 index 0000000000..2403bc67b1 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_console_1_1_program.html @@ -0,0 +1,184 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Console.Program Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Console.Program Class Reference
+
+
+ +

Contains the entrypoint for the application + More...

+ + + + + +

+Properties

static internal IWatchdogFactory WatchdogFactory = new WatchdogFactory() [get, set]
 The IWatchdogFactory for the Program More...
 
+ + + + +

+Static Private Member Functions

static internal async Task Main (string[] args)
 Entrypoint for the application More...
 
+

Detailed Description

+

Contains the entrypoint for the application

+ +

Definition at line 13 of file Program.cs.

+

Member Function Documentation

+ +

◆ Main()

+ +
+
+ + + + + +
+ + + + + + + + +
static internal async Task Tgstation.Server.Host.Console.Program.Main (string [] args)
+
+staticprivate
+
+ +

Entrypoint for the application

+
Parameters
+ + +
argsThe arguments for the Program
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 25 of file Program.cs.

+
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  }
IWatchdog CreateWatchdog(ILoggerFactory loggerFactory)
Create a IWatchdog
+
Task RunAsync(bool runConfigure, string[] args, CancellationToken cancellationToken)
Run the IWatchdog
+ +
+

References Tgstation.Server.Host.Watchdog.WatchdogFactory.CreateWatchdog(), and Tgstation.Server.Host.Watchdog.IWatchdog.RunAsync().

+ +

Referenced by Tgstation.Server.Host.Console.Tests.TestProgram.TestProgramRuns().

+ +
+
+

Property Documentation

+ +

◆ WatchdogFactory

+ +
+
+ + + + + +
+ + + + +
internal IWatchdogFactory Tgstation.Server.Host.Console.Program.WatchdogFactory = new WatchdogFactory()
+
+staticgetsetprivate
+
+ +

The IWatchdogFactory for the Program

+ +

Definition at line 18 of file Program.cs.

+
18 { get; set; } = new WatchdogFactory();
static internal IWatchdogFactory WatchdogFactory
The IWatchdogFactory for the Program
Definition: Program.cs:18
+
+

Referenced by Tgstation.Server.Host.Console.Tests.TestProgram.TestProgramRuns().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests_1_1_test_program-members.html b/class_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests_1_1_test_program-members.html new file mode 100644 index 0000000000..7045e7b6c9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests_1_1_test_program-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Console.Tests.TestProgram Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Console.Tests.TestProgram, including all inherited members.

+ + +
TestProgramRuns()Tgstation.Server.Host.Console.Tests.TestProgram
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests_1_1_test_program.html b/class_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests_1_1_test_program.html new file mode 100644 index 0000000000..b0e013088d --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests_1_1_test_program.html @@ -0,0 +1,119 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Console.Tests.TestProgram Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Console.Tests.TestProgram Class Reference
+
+
+ + + + +

+Public Member Functions

async Task TestProgramRuns ()
 
+

Detailed Description

+
+

Definition at line 12 of file TestProgram.cs.

+

Member Function Documentation

+ +

◆ TestProgramRuns()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.Console.Tests.TestProgram.TestProgramRuns ()
+
+ +

Definition at line 15 of file TestProgram.cs.

+
16  {
17  var mockServer = new Mock<IWatchdog>();
18  var args = Array.Empty<string>();
19  mockServer.Setup(x => x.RunAsync(false, args, It.IsAny<CancellationToken>())).Returns(Task.CompletedTask).Verifiable();
20  var mockServerFactory = new Mock<IWatchdogFactory>();
21  mockServerFactory.Setup(x => x.CreateWatchdog(It.IsAny<ILoggerFactory>())).Returns(mockServer.Object).Verifiable();
22  Program.WatchdogFactory = mockServerFactory.Object;
23  await Program.Main(args).ConfigureAwait(false);
24  mockServer.VerifyAll();
25  mockServerFactory.VerifyAll();
26  }
+

References Tgstation.Server.Host.Console.Program.Main(), and Tgstation.Server.Host.Console.Program.WatchdogFactory.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller-members.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller-members.html new file mode 100644 index 0000000000..09481e4c13 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller-members.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Controllers.AdministrationController Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Controllers.AdministrationController, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + +
AdministrationController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IGitHubClientFactory gitHubClientFactory, IServerControl serverUpdater, IApplication application, IIOManager ioManager, IPlatformIdentifier platformIdentifier, ILogger< AdministrationController > logger, IOptions< UpdatesConfiguration > updatesConfigurationOptions, IOptions< GeneralConfiguration > generalConfigurationOptions)Tgstation.Server.Host.Controllers.AdministrationController
applicationTgstation.Server.Host.Controllers.AdministrationControllerprivate
CheckReleasesAndApplyUpdate(Version newVersion, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.AdministrationControllerprivate
Create([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Administration >virtual
Delete()Tgstation.Server.Host.Controllers.AdministrationController
ModelController< Administration >.Delete(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Administration >virtual
generalConfigurationTgstation.Server.Host.Controllers.AdministrationControllerprivate
GetGitHubClient()Tgstation.Server.Host.Controllers.AdministrationControllerprivate
GetId(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Administration >virtual
gitHubClientFactoryTgstation.Server.Host.Controllers.AdministrationControllerprivate
ioManagerTgstation.Server.Host.Controllers.AdministrationControllerprivate
List(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Administration >virtual
ModelController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)Tgstation.Server.Host.Controllers.ModelController< Administration >
OctokitExceptionTgstation.Server.Host.Controllers.AdministrationControllerprivate
platformIdentifierTgstation.Server.Host.Controllers.AdministrationControllerprivate
RateLimit(RateLimitExceededException exception)Tgstation.Server.Host.Controllers.AdministrationControllerprivate
Read(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.AdministrationControllervirtual
RestartNotSupportedExceptionTgstation.Server.Host.Controllers.AdministrationControllerprivate
serverUpdaterTgstation.Server.Host.Controllers.AdministrationControllerprivate
Update([FromBody] Administration model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.AdministrationController
ModelController< Administration >.Update([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Administration >virtual
updatesConfigurationTgstation.Server.Host.Controllers.AdministrationControllerprivate
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html new file mode 100644 index 0000000000..1defb1d09b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html @@ -0,0 +1,769 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Controllers.AdministrationController Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Controllers.AdministrationController Class Reference
+
+
+ +

ModelController<TModel> for Administration + More...

+
+Inheritance diagram for Tgstation.Server.Host.Controllers.AdministrationController:
+
+
+ + +Tgstation.Server.Host.Controllers.ModelController< Administration > + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 AdministrationController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IGitHubClientFactory gitHubClientFactory, IServerControl serverUpdater, IApplication application, IIOManager ioManager, IPlatformIdentifier platformIdentifier, ILogger< AdministrationController > logger, IOptions< UpdatesConfiguration > updatesConfigurationOptions, IOptions< GeneralConfiguration > generalConfigurationOptions)
 Construct an AdministrationController More...
 
override async Task< IActionResult > Read (CancellationToken cancellationToken)
 Attempt to read a TModel More...
 
override async Task< IActionResult > Update ([FromBody] Administration model, CancellationToken cancellationToken)
 
async Task< IActionResult > Delete ()
 Attempts to restart the server More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Controllers.ModelController< Administration >
 ModelController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)
 Construct a ModelController<TModel> More...
 
virtual Task< IActionResult > Create ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to create a model More...
 
virtual Task< IActionResult > GetId (long id, CancellationToken cancellationToken)
 Attempt to get a specific a TModel More...
 
virtual Task< IActionResult > Update ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to update a model More...
 
virtual Task< IActionResult > Delete (long id, CancellationToken cancellationToken)
 Attempt to delete a model with a particular id More...
 
virtual Task< IActionResult > List (CancellationToken cancellationToken)
 Attempt to list entries of the TModel More...
 
+ + + + + + + + +

+Private Member Functions

StatusCodeResult RateLimit (RateLimitExceededException exception)
 
async Task< IActionResult > CheckReleasesAndApplyUpdate (Version newVersion, CancellationToken cancellationToken)
 Try to download and apply an update with a given newVersion . More...
 
IGitHubClient GetGitHubClient ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

const string RestartNotSupportedException = "This deployment of tgstation-server is lacking the Tgstation.Server.Host.Watchdog component. Restarts and version changes cannot be completed!"
 
const string OctokitException = "Bad GitHub API response, check configuration! Exception: {0}"
 
readonly IGitHubClientFactory gitHubClientFactory
 The IGitHubClientFactory for the AdministrationController More...
 
readonly IServerControl serverUpdater
 The IServerControl for the AdministrationController More...
 
readonly IApplication application
 The IApplication for the AdministrationController More...
 
readonly IIOManager ioManager
 The IIOManager for the AdministrationController More...
 
readonly IPlatformIdentifier platformIdentifier
 The IPlatformIdentifier for the AdministrationController More...
 
readonly UpdatesConfiguration updatesConfiguration
 The UpdatesConfiguration for the AdministrationController More...
 
readonly GeneralConfiguration generalConfiguration
 The GeneralConfiguration for the AdministrationController More...
 
+

Detailed Description

+

ModelController<TModel> for Administration

+ +

Definition at line 28 of file AdministrationController.cs.

+

Constructor & Destructor Documentation

+ +

◆ AdministrationController()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Controllers.AdministrationController.AdministrationController (IDatabaseContext databaseContext,
IAuthenticationContextFactory authenticationContextFactory,
IGitHubClientFactory gitHubClientFactory,
IServerControl serverUpdater,
IApplication application,
IIOManager ioManager,
IPlatformIdentifier platformIdentifier,
ILogger< AdministrationControllerlogger,
IOptions< UpdatesConfigurationupdatesConfigurationOptions,
IOptions< GeneralConfigurationgeneralConfigurationOptions 
)
+
+ +

Construct an AdministrationController

+
Parameters
+ + + + + + + + + + + +
databaseContextThe IDatabaseContext for the ApiController
authenticationContextFactoryThe IAuthenticationContextFactory for the ApiController
gitHubClientFactoryThe value of gitHubClientFactory
serverUpdaterThe value of serverUpdater
applicationThe value of application
ioManagerThe value of ioManager
platformIdentifierThe value of platformIdentifier
loggerThe ILogger for the ApiController
updatesConfigurationOptionsThe IOptions<TOptions> containing value of updatesConfiguration
generalConfigurationOptionsThe IOptions<TOptions> containing value of generalConfiguration
+
+
+ +

Definition at line 82 of file AdministrationController.cs.

+
82  : base(databaseContext, authenticationContextFactory, logger, false)
83  {
84  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
85  this.serverUpdater = serverUpdater ?? throw new ArgumentNullException(nameof(serverUpdater));
86  this.application = application ?? throw new ArgumentNullException(nameof(application));
87  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
88  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
89  updatesConfiguration = updatesConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(updatesConfigurationOptions));
90  generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
91  }
readonly IIOManager ioManager
The IIOManager for the AdministrationController
+
readonly IGitHubClientFactory gitHubClientFactory
The IGitHubClientFactory for the AdministrationController
+
readonly UpdatesConfiguration updatesConfiguration
The UpdatesConfiguration for the AdministrationController
+
readonly IApplication application
The IApplication for the AdministrationController
+
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the AdministrationController
+
readonly IServerControl serverUpdater
The IServerControl for the AdministrationController
+
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the AdministrationController
+
+

References Tgstation.Server.Host.Controllers.AdministrationController.application, Tgstation.Server.Host.Controllers.AdministrationController.generalConfiguration, Tgstation.Server.Host.Controllers.AdministrationController.gitHubClientFactory, Tgstation.Server.Host.Controllers.AdministrationController.ioManager, Tgstation.Server.Host.Controllers.AdministrationController.platformIdentifier, Tgstation.Server.Host.Controllers.AdministrationController.serverUpdater, and Tgstation.Server.Host.Controllers.AdministrationController.updatesConfiguration.

+ +
+
+

Member Function Documentation

+ +

◆ CheckReleasesAndApplyUpdate()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
async Task<IActionResult> Tgstation.Server.Host.Controllers.AdministrationController.CheckReleasesAndApplyUpdate (Version newVersion,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Try to download and apply an update with a given newVersion .

+
Parameters
+ + + +
newVersionThe version of the server to update to.
cancellationTokenThe CancellationToken for the operation.
+
+
+
Returns
A Task<TResult> resulting in the IActionResult of the operation.
+ +

Definition at line 107 of file AdministrationController.cs.

+
108  {
109  Logger.LogDebug("Looking for GitHub releases version {0}...", newVersion);
110  IEnumerable<Release> releases;
111  try
112  {
113  var gitHubClient = GetGitHubClient();
114  releases = await gitHubClient
115  .Repository
116  .Release
118  .WithToken(cancellationToken)
119  .ConfigureAwait(false);
120  }
121  catch (RateLimitExceededException e)
122  {
123  return RateLimit(e);
124  }
125  catch (ApiException e)
126  {
127  Logger.LogWarning(OctokitException, e);
128  return StatusCode((int)HttpStatusCode.FailedDependency);
129  }
130 
131  releases = releases.Where(x => x.TagName.StartsWith(updatesConfiguration.GitTagPrefix, StringComparison.InvariantCulture));
132 
133  Logger.LogTrace("Release query complete!");
134 
135  foreach (var release in releases)
136  if (Version.TryParse(release.TagName.Replace(updatesConfiguration.GitTagPrefix, String.Empty, StringComparison.Ordinal), out var version) && version == newVersion)
137  {
138  var asset = release.Assets.Where(x => x.Name.Equals(updatesConfiguration.UpdatePackageAssetName, StringComparison.Ordinal)).FirstOrDefault();
139  if (asset == default)
140  continue;
141 
142  if (!serverUpdater.ApplyUpdate(version, new Uri(asset.BrowserDownloadUrl), ioManager))
143  return Conflict(new ErrorMessage
144  {
145  Message = "An update operation is already in progress!"
146  });
147  return Accepted(); // gtfo of here before all the cancellation tokens fire
148  }
149 
150  return StatusCode((int)HttpStatusCode.Gone);
151  }
bool ApplyUpdate(Version version, Uri updateZipUrl, IIOManager ioManager)
Run a new Host assembly and stop the current one. This will likely trigger all active CancellationTok...
+
string GitTagPrefix
Prefix before the System.Version of TGS published in git tags
+
readonly IIOManager ioManager
The IIOManager for the AdministrationController
+
long GitHubRepositoryId
The Octokit.Repository.Id of the tgstation-server fork to recieve updates from
+
string UpdatePackageAssetName
Asset package containing the new Host assembly in zip form
+
readonly UpdatesConfiguration updatesConfiguration
The UpdatesConfiguration for the AdministrationController
+
StatusCodeResult RateLimit(RateLimitExceededException exception)
+ + +
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
readonly IServerControl serverUpdater
The IServerControl for the AdministrationController
+
+

References Tgstation.Server.Host.Core.IServerControl.ApplyUpdate(), Tgstation.Server.Host.Controllers.AdministrationController.GetGitHubClient(), Tgstation.Server.Host.Configuration.UpdatesConfiguration.GitHubRepositoryId, Tgstation.Server.Host.Configuration.UpdatesConfiguration.GitTagPrefix, Tgstation.Server.Host.Controllers.AdministrationController.ioManager, Tgstation.Server.Host.Controllers.AdministrationController.OctokitException, Tgstation.Server.Host.Controllers.AdministrationController.RateLimit(), Tgstation.Server.Host.Controllers.AdministrationController.serverUpdater, Tgstation.Server.Host.Configuration.UpdatesConfiguration.UpdatePackageAssetName, and Tgstation.Server.Host.Controllers.AdministrationController.updatesConfiguration.

+ +

Referenced by Tgstation.Server.Host.Controllers.AdministrationController.Update().

+ +
+
+ +

◆ Delete()

+ +
+
+ + + + + + + +
async Task<IActionResult> Tgstation.Server.Host.Controllers.AdministrationController.Delete ()
+
+ +

Attempts to restart the server

+
Returns
A Task<TResult> resulting in the IActionResult of the request
+ +

Definition at line 227 of file AdministrationController.cs.

+
228  {
229  try
230  {
232  {
233  Logger.LogDebug("Restart request failed due to lack of host watchdog!");
234  return UnprocessableEntity(new ErrorMessage
235  {
237  });
238  }
239 
240  await serverUpdater.Restart().ConfigureAwait(false);
241  return Ok();
242  }
243  catch (InvalidOperationException)
244  {
245  return StatusCode((int)HttpStatusCode.ServiceUnavailable);
246  }
247  }
bool WatchdogPresent
true if live updates are supported, false. ApplyUpdate(Version, Uri, IIOManager) and Restart will fai...
+ + +
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
readonly IServerControl serverUpdater
The IServerControl for the AdministrationController
+
+

References Tgstation.Server.Host.Core.IServerControl.Restart(), Tgstation.Server.Host.Controllers.AdministrationController.RestartNotSupportedException, Tgstation.Server.Host.Controllers.AdministrationController.serverUpdater, and Tgstation.Server.Host.Core.IServerControl.WatchdogPresent.

+ +
+
+ +

◆ GetGitHubClient()

+ +
+
+ + + + + +
+ + + + + + + +
IGitHubClient Tgstation.Server.Host.Controllers.AdministrationController.GetGitHubClient ()
+
+private
+
+
+ +

◆ RateLimit()

+ +
+
+ + + + + +
+ + + + + + + + +
StatusCodeResult Tgstation.Server.Host.Controllers.AdministrationController.RateLimit (RateLimitExceededException exception)
+
+private
+
+ +

Definition at line 93 of file AdministrationController.cs.

+
94  {
95  Logger.LogWarning("Exceeded GitHub rate limit! Exception {0}", exception);
96  var secondsString = Math.Ceiling((exception.Reset - DateTimeOffset.Now).TotalSeconds).ToString(CultureInfo.InvariantCulture);
97  Response.Headers.Add("Retry-After", new StringValues(secondsString));
98  return StatusCode(429);
99  }
+

Referenced by Tgstation.Server.Host.Controllers.AdministrationController.CheckReleasesAndApplyUpdate(), and Tgstation.Server.Host.Controllers.AdministrationController.Read().

+ +
+
+ +

◆ Read()

+ +
+
+ + + + + +
+ + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.AdministrationController.Read (CancellationToken cancellationToken)
+
+virtual
+
+ +

Attempt to read a TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< Administration >.

+ +

Definition at line 157 of file AdministrationController.cs.

+
158  {
159  try
160  {
161  Version greatestVersion = null;
162  Uri repoUrl = null;
163  try
164  {
165  var gitHubClient = GetGitHubClient();
166  var repositoryTask = gitHubClient.Repository.Get(updatesConfiguration.GitHubRepositoryId);
167  var releases = (await gitHubClient.Repository.Release.GetAll(updatesConfiguration.GitHubRepositoryId).ConfigureAwait(false)).Where(x => x.TagName.StartsWith(updatesConfiguration.GitTagPrefix, StringComparison.InvariantCulture));
168 
169  foreach (var I in releases)
170  if (Version.TryParse(I.TagName.Replace(updatesConfiguration.GitTagPrefix, String.Empty, StringComparison.Ordinal), out var version)
171  && version.Major == application.Version.Major
172  && (greatestVersion == null || version > greatestVersion))
173  greatestVersion = version;
174  repoUrl = new Uri((await repositoryTask.ConfigureAwait(false)).HtmlUrl);
175  }
176  catch (NotFoundException e)
177  {
178  Logger.LogWarning("Not found exception while retrieving upstream repository info: {0}", e);
179  }
180 
181  return Json(new Administration
182  {
183  LatestVersion = greatestVersion,
184  TrackedRepositoryUrl = repoUrl,
185  WindowsHost = platformIdentifier.IsWindows
186  });
187  }
188  catch (RateLimitExceededException e)
189  {
190  return RateLimit(e);
191  }
192  catch (ApiException e)
193  {
194  Logger.LogWarning(OctokitException, e);
195  return StatusCode((int)HttpStatusCode.FailedDependency);
196  }
197  }
string GitTagPrefix
Prefix before the System.Version of TGS published in git tags
+
long GitHubRepositoryId
The Octokit.Repository.Id of the tgstation-server fork to recieve updates from
+
readonly UpdatesConfiguration updatesConfiguration
The UpdatesConfiguration for the AdministrationController
+
readonly IApplication application
The IApplication for the AdministrationController
+
StatusCodeResult RateLimit(RateLimitExceededException exception)
+
Represents administrative server information
+
bool IsWindows
If the current platform is a Windows platform
+ + +
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the AdministrationController
+
Version Version
The version of the Application
Definition: IApplication.cs:23
+
+

References Tgstation.Server.Host.Controllers.AdministrationController.application, Tgstation.Server.Host.Controllers.AdministrationController.GetGitHubClient(), Tgstation.Server.Host.Configuration.UpdatesConfiguration.GitHubRepositoryId, Tgstation.Server.Host.Configuration.UpdatesConfiguration.GitTagPrefix, Tgstation.Server.Host.Core.IPlatformIdentifier.IsWindows, Tgstation.Server.Host.Controllers.AdministrationController.OctokitException, Tgstation.Server.Host.Controllers.AdministrationController.platformIdentifier, Tgstation.Server.Host.Controllers.AdministrationController.RateLimit(), Tgstation.Server.Host.Controllers.AdministrationController.updatesConfiguration, and Tgstation.Server.Host.Core.IApplication.Version.

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.AdministrationController.Update ([FromBody] Administration model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 201 of file AdministrationController.cs.

+
202  {
203  if (model == null)
204  throw new ArgumentNullException(nameof(model));
205 
206  if (model.NewVersion == null)
207  return BadRequest(new ErrorMessage { Message = "Missing new version!" });
208 
209  if (model.NewVersion.Major != application.Version.Major)
210  return BadRequest(new ErrorMessage { Message = "Cannot update to a different suite version!" });
211 
213  return UnprocessableEntity(new ErrorMessage
214  {
216  });
217 
218  return await CheckReleasesAndApplyUpdate(model.NewVersion, cancellationToken).ConfigureAwait(false);
219  }
bool WatchdogPresent
true if live updates are supported, false. ApplyUpdate(Version, Uri, IIOManager) and Restart will fai...
+
readonly IApplication application
The IApplication for the AdministrationController
+ +
async Task< IActionResult > CheckReleasesAndApplyUpdate(Version newVersion, CancellationToken cancellationToken)
Try to download and apply an update with a given newVersion .
+
Version NewVersion
Changes the version of Tgstation.Server.Host to the given version from the upstream repository
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
readonly IServerControl serverUpdater
The IServerControl for the AdministrationController
+
Version Version
The version of the Application
Definition: IApplication.cs:23
+
+

References Tgstation.Server.Host.Controllers.AdministrationController.application, Tgstation.Server.Host.Controllers.AdministrationController.CheckReleasesAndApplyUpdate(), Tgstation.Server.Host.Controllers.AdministrationController.RestartNotSupportedException, Tgstation.Server.Host.Controllers.AdministrationController.serverUpdater, Tgstation.Server.Host.Core.IApplication.Version, and Tgstation.Server.Host.Core.IServerControl.WatchdogPresent.

+ +
+
+

Member Data Documentation

+ +

◆ application

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Controllers.AdministrationController.application
+
+private
+
+
+ +

◆ generalConfiguration

+ +
+
+ + + + + +
+ + + + +
readonly GeneralConfiguration Tgstation.Server.Host.Controllers.AdministrationController.generalConfiguration
+
+private
+
+ +

The GeneralConfiguration for the AdministrationController

+ +

Definition at line 67 of file AdministrationController.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.AdministrationController.AdministrationController().

+ +
+
+ +

◆ gitHubClientFactory

+ +
+
+ + + + + +
+ + + + +
readonly IGitHubClientFactory Tgstation.Server.Host.Controllers.AdministrationController.gitHubClientFactory
+
+private
+
+ +

The IGitHubClientFactory for the AdministrationController

+ +

Definition at line 37 of file AdministrationController.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.AdministrationController.AdministrationController().

+ +
+
+ +

◆ ioManager

+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Controllers.AdministrationController.ioManager
+
+private
+
+
+ +

◆ OctokitException

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Controllers.AdministrationController.OctokitException = "Bad GitHub API response, check configuration! Exception: {0}"
+
+private
+
+
+ +

◆ platformIdentifier

+ +
+
+ + + + + +
+ + + + +
readonly IPlatformIdentifier Tgstation.Server.Host.Controllers.AdministrationController.platformIdentifier
+
+private
+
+
+ +

◆ RestartNotSupportedException

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Controllers.AdministrationController.RestartNotSupportedException = "This deployment of tgstation-server is lacking the Tgstation.Server.Host.Watchdog component. Restarts and version changes cannot be completed!"
+
+private
+
+
+ +

◆ serverUpdater

+ + + +

◆ updatesConfiguration

+ +
+
+ + + + + +
+ + + + +
readonly UpdatesConfiguration Tgstation.Server.Host.Controllers.AdministrationController.updatesConfiguration
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.png b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..f38f48bc16fd963f7c66a4a8fa000f3d2bef995c GIT binary patch literal 1309 zcmeAS@N?(olHy`uVBq!ia0y~yVC)0312~w0q~*+{r9es|z$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-op5xXDN05Xn zpC{L1S@+2QDl-f1?CL__e-l6JKIzKkU2EcMY|44Je&m_^R{syv^n>5$e#z-eUoZ9T zsv&ntO1f{*qUHSgVj>z?d=_;A{ieNr<0HE|Q|7Z?4%cGGmV za%T08?-AdRoSkxf)q)ZK14|ReR)vvV(1jMMlrRM%x8uTe!viOQ<^Ai49N7PSu5#%@05Rd-vl0 z!@0%FBhS9;yLF*8EmbM=cCh-3*M6&%)~x0K{wi2z^6uo_Gqz<#ul`o~rjIRT`}xwW z>c@I4)=z)G{MWhjm6r3@*7CBxTLteO=J3^AD4+Y|Sk1RvN}-3%wX-WWv`>0tV4*dA z(v(R{;zN3q9egJRP5M%PHRO2M60lh4`bf_puSs>WsIh!R(KGSOfsHz+Cq+$5r@+tCXGS{my6AApBOq89$^&l;AB?l5n^`$CXogMprXVn77V~N z!_X4=h=F4^iAfK`#Li!UfoOk z_S!zi-tm43<0oFKPR`gVN%w--lnios)cH&V$1j ze?5w*WqI@2>P*?>-Le7)LZ%nwNZxXMD3f+@-tUd4tGB70D?Zw}*f8?Dpty7DCZinX zmHX;)A8cFVVA__Zy*iwkX~t`$A+>ePLKSwYFsY6^;;H$-P#*^+~B%Ste_P0ZoWzQJw%)x!F*`Rc{hADK;l{X|QAR}Ws?tG!^x zN512C8yKGLYDwPxf7_xs?T?ucGaO2%$1UGx{?2Jb@V?yl^Ji3VGRV4S_*es*Z; zJSW?l&70ELPu}I_NLb}x7!tz}#9+VL+rm!YszKy{Y3%C0wI4u2Yfqo$QegdHj*&k2 ep%KgQi`mR6@R({$>vCXO#^CAd=d#Wzp$Py~2Wu<< literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller-members.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller-members.html new file mode 100644 index 0000000000..2fb71373d2 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller-members.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Controllers.ApiController Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html new file mode 100644 index 0000000000..db4063599f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html @@ -0,0 +1,458 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Controllers.ApiController Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Controllers.ApiController Class Reference
+
+
+ +

A Controller for API functions + More...

+
+Inheritance diagram for Tgstation.Server.Host.Controllers.ApiController:
+
+
+ + +Controller +Tgstation.Server.Host.Controllers.HomeController +Tgstation.Server.Host.Controllers.ModelController< TModel > + +
+ + + + + + + +

+Public Member Functions

 ApiController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance, bool requireHeaders)
 Construct an ApiController More...
 
override async Task OnActionExecutionAsync (ActionExecutingContext context, ActionExecutionDelegate next)
 
+ + + + + + + + + + + + + + + + +

+Properties

ApiHeaders ApiHeaders [get, private set]
 The ApiHeaders for the operation More...
 
IDatabaseContext DatabaseContext [get]
 The IDatabaseContext for the operation More...
 
IAuthenticationContext AuthenticationContext [get]
 The IAuthenticationContext for the operation More...
 
ILogger Logger [get]
 The ILogger for the ApiController More...
 
Models.Instance Instance [get]
 The Instance for the operation More...
 
+ + + + + + + +

+Private Attributes

readonly bool requireInstance
 If IAuthenticationContext.InstanceUser permissions are required to access the ApiController More...
 
readonly bool requireHeaders
 If ApiHeaders are required More...
 
+

Detailed Description

+

A Controller for API functions

+ +

Definition at line 21 of file ApiController.cs.

+

Constructor & Destructor Documentation

+ +

◆ ApiController()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Controllers.ApiController.ApiController (IDatabaseContext databaseContext,
IAuthenticationContextFactory authenticationContextFactory,
ILogger logger,
bool requireInstance,
bool requireHeaders 
)
+
+ +

Construct an ApiController

+
Parameters
+ + + + + + +
databaseContextThe value of DatabaseContext
authenticationContextFactoryThe IAuthenticationContextFactory for the ApiController
loggerThe value of Logger
requireInstanceThe value of requireInstance
requireHeadersThe value of requireHeaders
+
+
+ +

Definition at line 66 of file ApiController.cs.

+
67  {
68  DatabaseContext = databaseContext ?? throw new ArgumentNullException(nameof(databaseContext));
69  if (authenticationContextFactory == null)
70  throw new ArgumentNullException(nameof(authenticationContextFactory));
71  Logger = logger ?? throw new ArgumentNullException(nameof(logger));
72  AuthenticationContext = authenticationContextFactory.CurrentAuthenticationContext;
76  }
+ + +
readonly bool requireHeaders
If ApiHeaders are required
+
ILogger Logger
The ILogger for the ApiController
+
readonly bool requireInstance
If IAuthenticationContext.InstanceUser permissions are required to access the ApiController
+
Metadata about a server instance
Definition: Instance.cs:9
+
IAuthenticationContext CurrentAuthenticationContext
The IAuthenticationContext the IAuthenticationContextFactory created
+
+

References Tgstation.Server.Host.Security.IAuthenticationContextFactory.CurrentAuthenticationContext, Tgstation.Server.Host.Security.AuthenticationContext.InstanceUser, Tgstation.Server.Host.Controllers.ApiController.Logger, Tgstation.Server.Host.Controllers.ApiController.requireHeaders, and Tgstation.Server.Host.Controllers.ApiController.requireInstance.

+ +
+
+

Member Function Documentation

+ +

◆ OnActionExecutionAsync()

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task Tgstation.Server.Host.Controllers.ApiController.OnActionExecutionAsync (ActionExecutingContext context,
ActionExecutionDelegate next 
)
+
+ +

+ +

Definition at line 80 of file ApiController.cs.

+
81  {
82  // ALL valid token and login requests that match a route go through this function
83  // 404 is returned before
84  if (AuthenticationContext != null && AuthenticationContext.User == null)
85  {
86  // valid token, expired password
87  await Unauthorized().ExecuteResultAsync(context).ConfigureAwait(false);
88  return;
89  }
90 
91  // validate the headers
92  try
93  {
94  ApiHeaders = new ApiHeaders(Request.GetTypedHeaders());
95 
96  if (!ApiHeaders.Compatible())
97  {
98  await StatusCode((int)HttpStatusCode.UpgradeRequired, new ErrorMessage
99  {
100  Message = "Provided API version is incompatible with server version!"
101  }).ExecuteResultAsync(context).ConfigureAwait(false);
102  return;
103  }
104 
105  if (requireInstance)
106  {
107  if (!ApiHeaders.InstanceId.HasValue)
108  {
109  await BadRequest(new ErrorMessage { Message = "Missing Instance header!" }).ExecuteResultAsync(context).ConfigureAwait(false);
110  return;
111  }
112 
114  {
115  // accessing an instance they don't have access to or one that's disabled
116  await Forbid().ExecuteResultAsync(context).ConfigureAwait(false);
117  return;
118  }
119  }
120  }
121  catch (InvalidOperationException e)
122  {
123  if (requireHeaders)
124  {
125  await BadRequest(new ErrorMessage { Message = e.Message }).ExecuteResultAsync(context).ConfigureAwait(false);
126  return;
127  }
128  }
129 
130  if (ModelState?.IsValid == false)
131  {
132  var errorMessages = ModelState.SelectMany(x => x.Value.Errors).Select(x => x.ErrorMessage).ToList();
133 
134  // HACK
135  // do some fuckery to remove RequiredAttribute errors
136  for (var I = 0; I < errorMessages.Count; ++I)
137  {
138  var message = errorMessages[I];
139  if (message.StartsWith("The ", StringComparison.Ordinal) && message.EndsWith(" field is required.", StringComparison.Ordinal))
140  {
141  errorMessages.RemoveAt(I);
142  --I;
143  }
144  }
145 
146  if (errorMessages.Count > 0)
147  {
148  await BadRequest(new ErrorMessage { Message = String.Join(Environment.NewLine, errorMessages) }).ExecuteResultAsync(context).ConfigureAwait(false);
149  return;
150  }
151  }
152 
153  if (ApiHeaders != null)
154  Logger.LogDebug("Request made by User ID {0}. Api version: {1}. User-Agent: {2}. Type: {3}. Route {4}{5} to Instance {6}", AuthenticationContext?.User.Id.ToString(CultureInfo.InvariantCulture), ApiHeaders.ApiVersion, ApiHeaders.RawUserAgent, Request.Method, Request.Path, Request.QueryString, ApiHeaders.InstanceId);
155 
156  try
157  {
158  await base.OnActionExecutionAsync(context, next).ConfigureAwait(false);
159  }
160  catch (OperationCanceledException e)
161  {
162  Logger.LogDebug("Request cancelled! Exception: {0}", e);
163  throw;
164  }
165  }
+
Version ApiVersion
The client's API version
Definition: ApiHeaders.cs:76
+
bool Compatible()
Checks if the ApiVersion is compatible with Version
+
ApiHeaders ApiHeaders
The ApiHeaders for the operation
+
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+ +
string Message
A human readable description of the error
Definition: ErrorMessage.cs:13
+
string RawUserAgent
The client's raw user agent
Definition: ApiHeaders.cs:71
+ +
readonly bool requireHeaders
If ApiHeaders are required
+
long? InstanceId
The Models.Instance.Id being accessed
Definition: ApiHeaders.cs:61
+
long Id
The ID of the User
Definition: User.cs:15
+
ILogger Logger
The ILogger for the ApiController
+
readonly bool requireInstance
If IAuthenticationContext.InstanceUser permissions are required to access the ApiController
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
+

References Tgstation.Server.Host.Controllers.ApiController.ApiHeaders, Tgstation.Server.Api.ApiHeaders.ApiVersion, Tgstation.Server.Api.ApiHeaders.Compatible(), Tgstation.Server.Api.Models.Internal.User.Id, Tgstation.Server.Api.ApiHeaders.InstanceId, Tgstation.Server.Host.Security.AuthenticationContext.InstanceUser, Tgstation.Server.Host.Controllers.ApiController.Logger, Tgstation.Server.Api.Models.ErrorMessage.Message, Tgstation.Server.Api.ApiHeaders.RawUserAgent, Tgstation.Server.Host.Controllers.ApiController.requireHeaders, Tgstation.Server.Host.Controllers.ApiController.requireInstance, and Tgstation.Server.Host.Security.AuthenticationContext.User.

+ +
+
+

Member Data Documentation

+ +

◆ requireHeaders

+ +
+
+ + + + + +
+ + + + +
readonly bool Tgstation.Server.Host.Controllers.ApiController.requireHeaders
+
+private
+
+
+ +

◆ requireInstance

+ +
+
+ + + + + +
+ + + + +
readonly bool Tgstation.Server.Host.Controllers.ApiController.requireInstance
+
+private
+
+ +

If IAuthenticationContext.InstanceUser permissions are required to access the ApiController

+ +

Definition at line 51 of file ApiController.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.ApiController.ApiController(), and Tgstation.Server.Host.Controllers.ApiController.OnActionExecutionAsync().

+ +
+
+

Property Documentation

+ +

◆ ApiHeaders

+ +
+
+ + + + + +
+ + + + +
ApiHeaders Tgstation.Server.Host.Controllers.ApiController.ApiHeaders
+
+getprivate setprotected
+
+ +

The ApiHeaders for the operation

+ +

Definition at line 26 of file ApiController.cs.

+
26 { get; private set; }
+

Referenced by Tgstation.Server.Host.Controllers.ApiController.OnActionExecutionAsync().

+ +
+
+ +

◆ AuthenticationContext

+ +
+
+ + + + + +
+ + + + +
IAuthenticationContext Tgstation.Server.Host.Controllers.ApiController.AuthenticationContext
+
+getprotected
+
+ +

The IAuthenticationContext for the operation

+ +

Definition at line 36 of file ApiController.cs.

+
36 { get; }
+
+
+ +

◆ DatabaseContext

+ +
+
+ + + + + +
+ + + + +
IDatabaseContext Tgstation.Server.Host.Controllers.ApiController.DatabaseContext
+
+getprotected
+
+ +

The IDatabaseContext for the operation

+ +

Definition at line 31 of file ApiController.cs.

+
31 { get; }
+
+
+ +

◆ Instance

+ +
+
+ + + + + +
+ + + + +
Models.Instance Tgstation.Server.Host.Controllers.ApiController.Instance
+
+getprotected
+
+ +

The Instance for the operation

+ +

Definition at line 46 of file ApiController.cs.

+
46 { get; }
+
+
+ +

◆ Logger

+ +
+
+ + + + + +
+ + + + +
ILogger Tgstation.Server.Host.Controllers.ApiController.Logger
+
+getprotected
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.png b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..8ee56cb5e30fb557b0ffa04e46732d32c5df07bd GIT binary patch literal 2111 zcmcIlYgCfi8s_BklH+BaRe8zE);bhvj%YaEi6(O#CQ%C<^M*NPsN<*+h6(6c2RU7o z2FF32gv=S7Da{H6@q(7A0V>X+@`jQrrKzZh5~6TEn)B!UnRWj3uJ!Hxd~3aXzqjYz z@71V?Fk9=L)*ukb7Ww6|lOWI*Ie`CVWd^KM+P+d?bBYSbgc^-T0M5*>=Fp$q1ki`C zv$NCus@xU$wIZC1K!X4!le`dP4uL?H1IS~aV{-qtFh2S9-6Oj~m)W$YJY$%!tn&M~ z+2Yvlz#d=cSBS1;*vbyWewhy{rIM3&=60t)2keG?Nk1RX(A@`z=I%nzwN`jO@~Uv zz>zROt+fV7%tuhG-DO7$2>_Pj!Yxy&GY{bX&K9!4WKt!}hEv_O=7Vzz51}oj4S1Co z*^S9=C41Qy<@@J*jd`{(AJ1#?Y392#b9`#ao>wDu4YNV+`IAwm-yNUd^{@g{`MDNhU)lL28%!{WahxuIb zoisPCu2ZnC{;V?R{JcJ~13ec#InqadH{;Vn<=Q(?7fqFl6jRhG!hq%s?zVx&Cp0cD z8P}6A(EN-NjbCQe^*(SHxCgt6qF1<~lVc`^tl*Q{n#=jV6z_wtv-`DIn{ATy10F24zH}!Z571SP_s-y z8r`%_Qa|P4B(B$cur_^f3|U~j1n;tu;YH#S#H6u|rMvinG+g<}B`O91h|-Pz-l=JeG+Xn+5> zn^ZKNevW0&?CJ!QhoGp_R^Nv3n-ow-rNGqSx5_lt9uUj4dhLxoLqcPVZW}l;!056Ib zMNj5XyZ6#(>s+5+0dDbYKB#rIBY211DyeUv_{w4%VQ&!&-%-ZV_@wm2%W;VE?&CjC zn|eos?=bbwjoFr-obb7=>4}E)L8;~@Sn&!bFs9z-6I%0_ED6E;TfncEQ>_X5MmhJN zQr$Sop_Z7z%OiV0uA8U8|43-b)x>(Nx5VUA)@7zJ$osTx8_oRa-JT6Q*6i7)z4;#5 zNgCcu{Ure+F*L?`Af{Ls-+V*&E|%PKE#KQRL3%=~G%W66Odk~fsE1nQh4FRjl>`X? zoC-?P|4>2lei*#u;oz(|6}mV=yfMyj1RwLD)u|=Civ-Xzv!B+9n-LfM2EilWL#87b46yzABo#1M)m^}BasC__q}6`` t+Qe{_48uvQIj92)(pfVp)d*I(y^2c|s;85(iy{?XHy{{!UOFn$04 literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller-members.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller-members.html new file mode 100644 index 0000000000..dd29d2239f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller-members.html @@ -0,0 +1,96 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Controllers.ByondController Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Controllers.ByondController, including all inherited members.

+ + + + + + + + + + + + +
ByondController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IJobManager jobManager, ILogger< ByondController > logger)Tgstation.Server.Host.Controllers.ByondController
Create([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Api.Models.Byond >virtual
Delete(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Api.Models.Byond >virtual
GetId(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Api.Models.Byond >virtual
instanceManagerTgstation.Server.Host.Controllers.ByondControllerprivate
jobManagerTgstation.Server.Host.Controllers.ByondControllerprivate
List(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ByondControllervirtual
ModelController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)Tgstation.Server.Host.Controllers.ModelController< Api.Models.Byond >
Read(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ByondControllervirtual
Update([FromBody] Api.Models.Byond model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ByondController
ModelController< Api.Models.Byond >.Update([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Api.Models.Byond >virtual
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html new file mode 100644 index 0000000000..860f484a1b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html @@ -0,0 +1,376 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Controllers.ByondController Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Controllers.ByondController Class Reference
+
+
+ +

Controller for managing Api.Models.Byond.Versions + More...

+
+Inheritance diagram for Tgstation.Server.Host.Controllers.ByondController:
+
+
+ + +Tgstation.Server.Host.Controllers.ModelController< Api.Models.Byond > + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ByondController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IJobManager jobManager, ILogger< ByondController > logger)
 Construct a ByondController More...
 
override Task< IActionResult > Read (CancellationToken cancellationToken)
 Attempt to read a TModel More...
 
override Task< IActionResult > List (CancellationToken cancellationToken)
 Attempt to list entries of the TModel More...
 
override async Task< IActionResult > Update ([FromBody] Api.Models.Byond model, CancellationToken cancellationToken)
 
- Public Member Functions inherited from Tgstation.Server.Host.Controllers.ModelController< Api.Models.Byond >
 ModelController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)
 Construct a ModelController<TModel> More...
 
virtual Task< IActionResult > Create ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to create a model More...
 
virtual Task< IActionResult > GetId (long id, CancellationToken cancellationToken)
 Attempt to get a specific a TModel More...
 
virtual Task< IActionResult > Update ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to update a model More...
 
virtual Task< IActionResult > Delete (long id, CancellationToken cancellationToken)
 Attempt to delete a model with a particular id More...
 
+ + + + + + + +

+Private Attributes

readonly IInstanceManager instanceManager
 The IInstanceManager for the ByondController More...
 
readonly IJobManager jobManager
 The IJobManager for the ByondController More...
 
+

Detailed Description

+

Controller for managing Api.Models.Byond.Versions

+ +

Definition at line 22 of file ByondController.cs.

+

Constructor & Destructor Documentation

+ +

◆ ByondController()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Controllers.ByondController.ByondController (IDatabaseContext databaseContext,
IAuthenticationContextFactory authenticationContextFactory,
IInstanceManager instanceManager,
IJobManager jobManager,
ILogger< ByondControllerlogger 
)
+
+ +

Construct a ByondController

+
Parameters
+ + + + + + +
databaseContextThe IDatabaseContext for the ApiController
authenticationContextFactoryThe IAuthenticationContextFactory for the ApiController
instanceManagerThe value of instanceManager
jobManagerThe value of jobManager
loggerThe ILogger for the ApiController
+
+
+ +

Definition at line 42 of file ByondController.cs.

+
42  : base(databaseContext, authenticationContextFactory, logger, true)
43  {
44  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
45  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
46  }
readonly IJobManager jobManager
The IJobManager for the ByondController
+
readonly IInstanceManager instanceManager
The IInstanceManager for the ByondController
+
+

References Tgstation.Server.Host.Controllers.ByondController.instanceManager, and Tgstation.Server.Host.Controllers.ByondController.jobManager.

+ +
+
+

Member Function Documentation

+ +

◆ List()

+ +
+
+ + + + + +
+ + + + + + + + +
override Task<IActionResult> Tgstation.Server.Host.Controllers.ByondController.List (CancellationToken cancellationToken)
+
+virtual
+
+ +

Attempt to list entries of the TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< Api.Models.Byond >.

+ +
+
+ +

◆ Read()

+ +
+
+ + + + + +
+ + + + + + + + +
override Task<IActionResult> Tgstation.Server.Host.Controllers.ByondController.Read (CancellationToken cancellationToken)
+
+virtual
+
+ +

Attempt to read a TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< Api.Models.Byond >.

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.ByondController.Update ([FromBody] Api.Models.Byond model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 66 of file ByondController.cs.

+
67  {
68  if (model == null)
69  throw new ArgumentNullException(nameof(model));
70 
71  if (model.Version == null)
72  return BadRequest(new ErrorMessage { Message = "Missing version!" });
73 
75 
76  // remove cruff fields
77  var installingVersion = new Version(model.Version.Major, model.Version.Minor);
78 
79  var result = new Api.Models.Byond();
80 
81  if (byondManager.InstalledVersions.Any(x => x == model.Version))
82  {
83  Logger.LogInformation("User ID {0} changing instance ID {1} BYOND version to {2}", AuthenticationContext.User.Id, Instance.Id, installingVersion);
84  await byondManager.ChangeVersion(model.Version, cancellationToken).ConfigureAwait(false);
85  }
86  else
87  {
88  Logger.LogInformation("User ID {0} installing BYOND version to {2} on instance ID {1}", AuthenticationContext.User.Id, Instance.Id, installingVersion);
89 
90  // run the install through the job manager
91  var job = new Models.Job
92  {
93  Description = String.Format(CultureInfo.InvariantCulture, "Install BYOND version {0}", installingVersion),
94  StartedBy = AuthenticationContext.User,
95  CancelRightsType = RightsType.Byond,
96  CancelRight = (ulong)ByondRights.CancelInstall,
98  };
99  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressHandler, ct) => byondManager.ChangeVersion(installingVersion, ct), cancellationToken).ConfigureAwait(false);
100  result.InstallJob = job.ToApi();
101  }
102 
103  if ((AuthenticationContext.GetRight(RightsType.Byond) & (ulong)ByondRights.ReadActive) != 0)
104  result.Version = byondManager.ActiveVersion;
105  return result.InstallJob != null ? (IActionResult)Accepted(result) : Json(result);
106  }
+
ByondRights
Rights for Models.Byond
Definition: ByondRights.cs:9
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+
Task RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
Registers a given Job and begins running it
+
readonly IJobManager jobManager
The IJobManager for the ByondController
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
readonly IInstanceManager instanceManager
The IInstanceManager for the ByondController
+
long Id
The ID of the User
Definition: User.cs:15
+
Metadata about a server instance
Definition: Instance.cs:9
+
IByondManager ByondManager
The IByondManager for the IInstance
Definition: IInstance.cs:27
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
+

References Tgstation.Server.Host.Components.IInstance.ByondManager, Tgstation.Server.Host.Components.IInstanceManager.GetInstance(), Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Api.Models.Internal.User.Id, Tgstation.Server.Host.Controllers.ByondController.instanceManager, Tgstation.Server.Host.Controllers.ByondController.jobManager, Tgstation.Server.Host.Core.IJobManager.RegisterOperation(), and Tgstation.Server.Host.Security.AuthenticationContext.User.

+ +
+
+

Member Data Documentation

+ +

◆ instanceManager

+ +
+
+ + + + + +
+ + + + +
readonly IInstanceManager Tgstation.Server.Host.Controllers.ByondController.instanceManager
+
+private
+
+
+ +

◆ jobManager

+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Controllers.ByondController.jobManager
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.png b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..44a5f5c49a45dcaea06c142f6d0f425ccf8d565d GIT binary patch literal 1295 zcmeAS@N?(olHy`uVBq!ia0y~yU|bGl2XHV0$*zlD`+<~1fKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+1Is*57srqa#qQPJEtX|l@E z@S;geeyo~v>W}hCo7=A+?@wFjS0e9u$>Z~;vX8&)Os*W?{CbVw57s>P>vO-no<2SJ z-rF$#SRS>rwN|$d&bwLpebSep<8zL+-Fvv@hW)84sp_BqB>d|6{@K&|@XLpO_6UD29ukN}(vC#1MzjJqtZb{x#GMsr!=Eeg1a;41bX%kgB zzuN8nc28yPu9us3)u^Ae(_NnW`di?|Z!=i+9E7{?uHnp&y)m<7&us~*$-Rl$i8t3o z->v&SQMf#CUB&j0e?_(0q)ftoZlL{I#jMo%7nKNtWlmnef{EwfeF~^R}9N)5YI@=W6F}3um``;Xn6> z)c&~nbJO-bujSs__E0Ew+Ezc?IbmCQBLo4)jQ2Hu^#WQxksKv2|s`ArguKj}H?k+!90P>rpH?`4yv!1SWT{b2n| zZUt6>sFR!ud-m-U5^*R|Rd4uEmEaY?aB%7zhPviSLJl=RA)pBiz~saLG=T9)co9>_ z`X?*`@jzYsCJ9qR!Cz0mrBfzpEuC^<5yKJ&CJbBh9)&!UKLAd<8)yGhZkYHi_3fjt zwHYh=)34uDs5xMBe{%R--1&(?>A+wnp2P3{-Toc9ZRQ@)>9k7HQ(D&1n{o9lPp6-N0zo3=FS*P9Cu>~i() zJ$+Kc`|6(Jy8b;3F<1Cu>CR-%EU{}Kj=o=2y{PY(?*&=b1_xOG%KyzgbMk3@!1umi zm*c7}1HbzfZMy!K|H|Iyb=wx1-2cD4f9tfZy%};*X)%{KIhx}(H&qLXNeCLw-d-wawF#d-7D^^_m?{Jsd pgYnJ^^r)^X07g`Z=2Dky^|O1zY_@SVMFLAN22WQ%mvv4FO#s9Jjf?;Q literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller-members.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller-members.html new file mode 100644 index 0000000000..e902975006 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller-members.html @@ -0,0 +1,97 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Controllers.ChatController Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Controllers.ChatController, including all inherited members.

+ + + + + + + + + + + + + +
ChatController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, ILogger< ChatController > logger)Tgstation.Server.Host.Controllers.ChatController
ConvertApiChatChannel(Api.Models.ChatChannel api)Tgstation.Server.Host.Controllers.ChatControllerprivatestatic
Create([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ChatController
ModelController< Api.Models.ChatBot >.Create([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Api.Models.ChatBot >virtual
Delete(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ChatControllervirtual
GetId(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ChatControllervirtual
instanceManagerTgstation.Server.Host.Controllers.ChatControllerprivate
List(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ChatControllervirtual
ModelController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)Tgstation.Server.Host.Controllers.ModelController< Api.Models.ChatBot >
Read(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Api.Models.ChatBot >virtual
Update([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ChatController
ModelController< Api.Models.ChatBot >.Update([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Api.Models.ChatBot >virtual
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html new file mode 100644 index 0000000000..caa4d9453a --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html @@ -0,0 +1,514 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Controllers.ChatController Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Controllers.ChatController Class Reference
+
+
+ +

ModelController<TModel> for managing Api.Models.ChatBots + More...

+
+Inheritance diagram for Tgstation.Server.Host.Controllers.ChatController:
+
+
+ + +Tgstation.Server.Host.Controllers.ModelController< Api.Models.ChatBot > + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ChatController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, ILogger< ChatController > logger)
 Construct a ChatController More...
 
override async Task< IActionResult > Create ([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)
 
override async Task< IActionResult > Delete (long id, CancellationToken cancellationToken)
 Attempt to delete a model with a particular id More...
 
override async Task< IActionResult > List (CancellationToken cancellationToken)
 Attempt to list entries of the TModel More...
 
override async Task< IActionResult > GetId (long id, CancellationToken cancellationToken)
 Attempt to get a specific a TModel More...
 
override async Task< IActionResult > Update ([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)
 
- Public Member Functions inherited from Tgstation.Server.Host.Controllers.ModelController< Api.Models.ChatBot >
 ModelController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)
 Construct a ModelController<TModel> More...
 
virtual Task< IActionResult > Create ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to create a model More...
 
virtual Task< IActionResult > Read (CancellationToken cancellationToken)
 Attempt to read a TModel More...
 
virtual Task< IActionResult > Update ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to update a model More...
 
+ + + + +

+Static Private Member Functions

static Models.ChatChannel ConvertApiChatChannel (Api.Models.ChatChannel api)
 Converts api to a ChatChannel More...
 
+ + + + +

+Private Attributes

readonly IInstanceManager instanceManager
 The IInstanceManager for the ChatController More...
 
+

Detailed Description

+

ModelController<TModel> for managing Api.Models.ChatBots

+ +

Definition at line 26 of file ChatController.cs.

+

Constructor & Destructor Documentation

+ +

◆ ChatController()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Controllers.ChatController.ChatController (IDatabaseContext databaseContext,
IAuthenticationContextFactory authenticationContextFactory,
IInstanceManager instanceManager,
ILogger< ChatControllerlogger 
)
+
+ +

Construct a ChatController

+
Parameters
+ + + + + +
databaseContextThe IDatabaseContext for the ApiController
authenticationContextFactoryThe IAuthenticationContextFactory for the ApiController
instanceManagerThe value of instanceManager
loggerThe ILogger for the ApiController
+
+
+ +

Definition at line 40 of file ChatController.cs.

+
40  : base(databaseContext, authenticationContextFactory, logger, true)
41  {
42  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
43  }
readonly IInstanceManager instanceManager
The IInstanceManager for the ChatController
+
+

References Tgstation.Server.Host.Controllers.ChatController.instanceManager.

+ +
+
+

Member Function Documentation

+ +

◆ ConvertApiChatChannel()

+ +
+
+ + + + + +
+ + + + + + + + +
static Models.ChatChannel Tgstation.Server.Host.Controllers.ChatController.ConvertApiChatChannel (Api.Models.ChatChannel api)
+
+staticprivate
+
+ +

Converts api to a ChatChannel

+
Parameters
+ + +
apiThe Api.Models.ChatChannel
+
+
+
Returns
A ChatChannel based on api
+ +

Referenced by Tgstation.Server.Host.Controllers.ChatController.Create(), and Tgstation.Server.Host.Controllers.ChatController.Update().

+ +
+
+ +

◆ Create()

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.ChatController.Create ([FromBody] Api.Models.ChatBot model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 62 of file ChatController.cs.

+
63  {
64  if (model == null)
65  throw new ArgumentNullException(nameof(model));
66 
67  if (String.IsNullOrWhiteSpace(model.Name))
68  return BadRequest(new ErrorMessage { Message = "name cannot be null or whitespace!" });
69 
70  if (String.IsNullOrWhiteSpace(model.ConnectionString))
71  return BadRequest(new ErrorMessage { Message = "connection_string cannot be null or whitespace!" });
72 
73  if (!model.Provider.HasValue)
74  return BadRequest(new ErrorMessage { Message = "provider cannot be null!" });
75 
76  switch (model.Provider)
77  {
78  case ChatProvider.Discord:
79  case ChatProvider.Irc:
80  break;
81  default:
82  return BadRequest(new ErrorMessage { Message = "Invalid provider!" });
83  }
84 
85  if (!model.ValidateProviderChannelTypes())
86  return BadRequest(new ErrorMessage { Message = "One or more of channels aren't formatted correctly for the given provider!" });
87 
88  model.Enabled = model.Enabled ?? false;
89 
90  // try to update das db first
91  var dbModel = new Models.ChatBot
92  {
93  Name = model.Name,
94  ConnectionString = model.ConnectionString,
95  Enabled = model.Enabled,
96  Channels = model.Channels?.Select(x => ConvertApiChatChannel(x)).ToList() ?? new List<Models.ChatChannel>(), // important that this isn't null
97  InstanceId = Instance.Id,
98  Provider = model.Provider,
99  };
100 
101  DatabaseContext.ChatBots.Add(dbModel);
102 
103  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
104 
105  try
106  {
107  try
108  {
109  // try to create it
110  var instance = instanceManager.GetInstance(Instance);
111  await instance.Chat.ChangeSettings(dbModel, cancellationToken).ConfigureAwait(false);
112 
113  if (dbModel.Channels.Count > 0)
114  await instance.Chat.ChangeChannels(dbModel.Id, dbModel.Channels, cancellationToken).ConfigureAwait(false);
115  }
116  catch
117  {
118  // undo the add
119  DatabaseContext.ChatBots.Remove(dbModel);
120  await DatabaseContext.Save(default).ConfigureAwait(false);
121  throw;
122  }
123  }
124  catch (InvalidOperationException e)
125  {
126  return BadRequest(new ErrorMessage { Message = e.Message });
127  }
128 
129  return StatusCode((int)HttpStatusCode.Created, dbModel.ToApi());
130  }
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+ +
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
IChat Chat
The IChat for the IInstance
Definition: IInstance.cs:37
+
string Message
A human readable description of the error
Definition: ErrorMessage.cs:13
+ +
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
override async Task< IActionResult > List(CancellationToken cancellationToken)
Attempt to list entries of the TModel
+
Metadata about a server instance
Definition: Instance.cs:9
+
static Models.ChatChannel ConvertApiChatChannel(Api.Models.ChatChannel api)
Converts api to a ChatChannel
+
readonly IInstanceManager instanceManager
The IInstanceManager for the ChatController
+
ChatProvider
Represents a chat service provider
Definition: ChatProvider.cs:6
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+

References Tgstation.Server.Host.Components.IInstance.Chat, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.ChatBots, Tgstation.Server.Host.Controllers.ChatController.ConvertApiChatChannel(), Tgstation.Server.Host.Components.IInstanceManager.GetInstance(), Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Host.Controllers.ChatController.instanceManager, Tgstation.Server.Host.Controllers.ChatController.List(), Tgstation.Server.Api.Models.ErrorMessage.Message, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save().

+ +
+
+ +

◆ Delete()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.ChatController.Delete (long id,
CancellationToken cancellationToken 
)
+
+virtual
+
+ +

Attempt to delete a model with a particular id

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< Api.Models.ChatBot >.

+ +

Definition at line 134 of file ChatController.cs.

+
135  {
136  var instance = instanceManager.GetInstance(Instance);
137  await Task.WhenAll(instance.Chat.DeleteConnection(id, cancellationToken), DatabaseContext.ChatBots.Where(x => x.Id == id).DeleteAsync(cancellationToken)).ConfigureAwait(false);
138 
139  return Ok();
140  }
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+ + +
Metadata about a server instance
Definition: Instance.cs:9
+
readonly IInstanceManager instanceManager
The IInstanceManager for the ChatController
+
+

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.ChatBots, Tgstation.Server.Host.Components.IInstanceManager.GetInstance(), and Tgstation.Server.Host.Controllers.ChatController.instanceManager.

+ +
+
+ +

◆ GetId()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.ChatController.GetId (long id,
CancellationToken cancellationToken 
)
+
+virtual
+
+ +

Attempt to get a specific a TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< Api.Models.ChatBot >.

+ +

Definition at line 161 of file ChatController.cs.

+
162  {
163  var query = DatabaseContext.ChatBots.Where(x => x.Id == id).Include(x => x.Channels);
164 
165  var results = await query.FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
166  if (results == default)
167  return StatusCode((int)HttpStatusCode.Gone);
168 
169  var connectionStrings = (AuthenticationContext.GetRight(RightsType.ChatBots) & (ulong)ChatBotRights.ReadConnectionString) != 0;
170 
171  if (!connectionStrings)
172  results.ConnectionString = null;
173 
174  return Json(results.ToApi());
175  }
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+ +
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+ +
ChatBotRights
Rights for Models.ChatBot
Definition: ChatBotRights.cs:9
+
+

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.ChatBots, and Tgstation.Server.Host.Security.AuthenticationContext.GetRight().

+ +
+
+ +

◆ List()

+ +
+
+ + + + + +
+ + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.ChatController.List (CancellationToken cancellationToken)
+
+virtual
+
+ +

Attempt to list entries of the TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< Api.Models.ChatBot >.

+ +

Definition at line 144 of file ChatController.cs.

+
145  {
146  var query = DatabaseContext.ChatBots.Where(x => x.InstanceId == Instance.Id).Include(x => x.Channels);
147 
148  var results = await query.ToListAsync(cancellationToken).ConfigureAwait(false);
149 
150  var connectionStrings = (AuthenticationContext.GetRight(RightsType.ChatBots) & (ulong)ChatBotRights.ReadConnectionString) != 0;
151 
152  if (!connectionStrings)
153  foreach (var I in results)
154  I.ConnectionString = null;
155 
156  return Json(results.Select(x => x.ToApi()));
157  }
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+ +
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+ +
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Metadata about a server instance
Definition: Instance.cs:9
+
ChatBotRights
Rights for Models.ChatBot
Definition: ChatBotRights.cs:9
+
+

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.ChatBots, Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), and Tgstation.Server.Api.Models.Instance.Id.

+ +

Referenced by Tgstation.Server.Host.Controllers.ChatController.Create().

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.ChatController.Update ([FromBody] Api.Models.ChatBot model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 180 of file ChatController.cs.

+
181  {
182  if (model == null)
183  throw new ArgumentNullException(nameof(model));
184 
185  if (model.Provider.HasValue && !model.ValidateProviderChannelTypes())
186  return BadRequest(new ErrorMessage { Message = "One or more of channels aren't formatted correctly for the given provider!" });
187 
188  var query = DatabaseContext.ChatBots.Where(x => x.InstanceId == Instance.Id && x.Id == model.Id).Include(x => x.Channels);
189 
190  var current = await query.FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
191 
192  if (current == default)
193  return StatusCode((int)HttpStatusCode.Gone);
194 
195  var userRights = (ChatBotRights)AuthenticationContext.GetRight(RightsType.ChatBots);
196 
197  bool anySettingsModified = false;
198 
199  bool CheckModified<T>(Expression<Func<Api.Models.Internal.ChatBot, T>> expression, ChatBotRights requiredRight)
200  {
201  var memberSelectorExpression = (MemberExpression)expression.Body;
202  var property = (PropertyInfo)memberSelectorExpression.Member;
203 
204  var newVal = property.GetValue(model);
205  if (newVal == null)
206  return false;
207  if (!userRights.HasFlag(requiredRight) && property.GetValue(current) != newVal)
208  return true;
209 
210  property.SetValue(current, newVal);
211  anySettingsModified = true;
212  return false;
213  }
214 
215  var oldProvider = current.Provider;
216 
217  if (CheckModified(x => x.ConnectionString, ChatBotRights.WriteConnectionString)
218  || CheckModified(x => x.Enabled, ChatBotRights.WriteEnabled)
219  || CheckModified(x => x.Name, ChatBotRights.WriteName)
220  || CheckModified(x => x.Provider, ChatBotRights.WriteProvider)
221  || (model.Channels != null && !userRights.HasFlag(ChatBotRights.WriteChannels)))
222  return Forbid();
223 
224  var hasChannels = model.Channels != null;
225  if (hasChannels || (model.Provider.HasValue && model.Provider != oldProvider))
226  {
227  DatabaseContext.ChatChannels.RemoveRange(current.Channels);
228  if (hasChannels)
229  {
230  var dbChannels = model.Channels.Select(x => ConvertApiChatChannel(x)).ToList();
231  DatabaseContext.ChatChannels.AddRange(dbChannels);
232  current.Channels = dbChannels;
233  }
234  else
235  current.Channels.Clear();
236  }
237 
238  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
239 
241 
242  if (anySettingsModified)
243  await chat.ChangeSettings(current, cancellationToken).ConfigureAwait(false); // have to rebuild the thing first
244 
245  if (model.Channels != null || anySettingsModified)
246  await chat.ChangeChannels(current.Id, current.Channels, cancellationToken).ConfigureAwait(false);
247 
248  if (userRights.HasFlag(ChatBotRights.Read))
249  {
250  if (!userRights.HasFlag(ChatBotRights.ReadConnectionString))
251  current.ConnectionString = null;
252  return Json(current.ToApi());
253  }
254 
255  return Ok();
256  }
+ +
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+ +
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+
IChat Chat
The IChat for the IInstance
Definition: IInstance.cs:37
+ +
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Metadata about a server instance
Definition: Instance.cs:9
+
static Models.ChatChannel ConvertApiChatChannel(Api.Models.ChatChannel api)
Converts api to a ChatChannel
+
readonly IInstanceManager instanceManager
The IInstanceManager for the ChatController
+
ChatBotRights
Rights for Models.ChatBot
Definition: ChatBotRights.cs:9
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+

References Tgstation.Server.Host.Components.IInstance.Chat, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.ChatBots, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.ChatChannels, Tgstation.Server.Host.Controllers.ChatController.ConvertApiChatChannel(), Tgstation.Server.Host.Components.IInstanceManager.GetInstance(), Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Host.Controllers.ChatController.instanceManager, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save().

+ +
+
+

Member Data Documentation

+ +

◆ instanceManager

+ +
+
+ + + + + +
+ + + + +
readonly IInstanceManager Tgstation.Server.Host.Controllers.ChatController.instanceManager
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.png b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..e44a0acb8669b40b939170beee1e1f246cfaae47 GIT binary patch literal 1282 zcmeAS@N?(olHy`uVBq!ia0y~yU|bJm2XHV0$(d|i-atwsz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-op{} zM^}gA&Z}>?z5VVS{duH%`%TBb*%QCr;;YEjHvhdgu{=z5YTUQ0r6**??WXSSwVUeu zRw5;5LNB*p%uMMwpM2lP%BUS*w$YUJ;f(1E1B&+?UtJv1oIfk8dVh^=rTWx!(+%S< zU%j!xddH(9;Y$m>{43~=3! z`_;USUw_$e^S#gS7JciCDZayUqpEz*uR0A+P0v?f+b3Q5v`N%wQqUxm3-O0m-%IoK z^1RgdPb?0U2KEP`#{Uyl&%!ScfN5mPtYw*93Jvvv_6(X00$y=t6P`mZMKwU&@Vlco%3SuoG@#KNWOm?siLt)(!eIQq=S+fJ%OU&0FuDbE$ z<}~-it36Y|>1+oxFr97x(3sos{zd<{^@jS#69f4Be}!ki=&h + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Controllers.ConfigurationController Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Controllers.ConfigurationController, including all inherited members.

+ + + + + + + + + + + + + + + + + +
ConfigurationController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IIOManager ioManager, ILogger< ConfigurationController > logger)Tgstation.Server.Host.Controllers.ConfigurationController
Create([FromBody] ConfigurationFile model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ConfigurationController
ModelController< ConfigurationFile >.Create([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< ConfigurationFile >virtual
Delete([FromBody] ConfigurationFile directory, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ConfigurationController
ModelController< ConfigurationFile >.Delete(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< ConfigurationFile >virtual
Directory(string directoryPath, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ConfigurationController
File(string filePath, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ConfigurationController
ForbidDueToModeConflicts(string path, out ISystemIdentity systemIdentityToUse)Tgstation.Server.Host.Controllers.ConfigurationControllerprivate
GetId(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< ConfigurationFile >virtual
instanceManagerTgstation.Server.Host.Controllers.ConfigurationControllerprivate
ioManagerTgstation.Server.Host.Controllers.ConfigurationControllerprivate
List(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ConfigurationControllervirtual
ModelController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)Tgstation.Server.Host.Controllers.ModelController< ConfigurationFile >
Read(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< ConfigurationFile >virtual
Update([FromBody] ConfigurationFile model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ConfigurationController
ModelController< ConfigurationFile >.Update([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< ConfigurationFile >virtual
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html new file mode 100644 index 0000000000..4c3bd5c920 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html @@ -0,0 +1,605 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Controllers.ConfigurationController Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Controllers.ConfigurationController Class Reference
+
+
+ +

The ModelController<TModel> for ConfigurationFiles + More...

+
+Inheritance diagram for Tgstation.Server.Host.Controllers.ConfigurationController:
+
+
+ + +Tgstation.Server.Host.Controllers.ModelController< ConfigurationFile > + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ConfigurationController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IIOManager ioManager, ILogger< ConfigurationController > logger)
 Construct a UserController More...
 
override async Task< IActionResult > Update ([FromBody] ConfigurationFile model, CancellationToken cancellationToken)
 
async Task< IActionResult > File (string filePath, CancellationToken cancellationToken)
 Get the contents of a file at a filePath More...
 
async Task< IActionResult > Directory (string directoryPath, CancellationToken cancellationToken)
 Get the contents of a directory at a directoryPath More...
 
override Task< IActionResult > List (CancellationToken cancellationToken)
 Attempt to list entries of the TModel More...
 
override async Task< IActionResult > Create ([FromBody] ConfigurationFile model, CancellationToken cancellationToken)
 
async Task< IActionResult > Delete ([FromBody] ConfigurationFile directory, CancellationToken cancellationToken)
 Deletes an empty directory More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Controllers.ModelController< ConfigurationFile >
 ModelController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)
 Construct a ModelController<TModel> More...
 
virtual Task< IActionResult > Create ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to create a model More...
 
virtual Task< IActionResult > Read (CancellationToken cancellationToken)
 Attempt to read a TModel More...
 
virtual Task< IActionResult > GetId (long id, CancellationToken cancellationToken)
 Attempt to get a specific a TModel More...
 
virtual Task< IActionResult > Update ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to update a model More...
 
virtual Task< IActionResult > Delete (long id, CancellationToken cancellationToken)
 Attempt to delete a model with a particular id More...
 
+ + + + +

+Private Member Functions

bool ForbidDueToModeConflicts (string path, out ISystemIdentity systemIdentityToUse)
 If a ForbidResult should be returned from actions due to conflicts with one or both of the Api.Models.Instance.ConfigurationType or the IAuthenticationContext.SystemIdentity or a given path tries to access parent directories More...
 
+ + + + + + + +

+Private Attributes

readonly IInstanceManager instanceManager
 The IInstanceManager for the ConfigurationController More...
 
readonly IIOManager ioManager
 The IIOManager for the ConfigurationController More...
 
+

Detailed Description

+

The ModelController<TModel> for ConfigurationFiles

+ +

Definition at line 22 of file ConfigurationController.cs.

+

Constructor & Destructor Documentation

+ +

◆ ConfigurationController()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Controllers.ConfigurationController.ConfigurationController (IDatabaseContext databaseContext,
IAuthenticationContextFactory authenticationContextFactory,
IInstanceManager instanceManager,
IIOManager ioManager,
ILogger< ConfigurationControllerlogger 
)
+
+ +

Construct a UserController

+
Parameters
+ + + + + + +
databaseContextThe IDatabaseContext for the ApiController
authenticationContextFactoryThe IAuthenticationContextFactory for the ApiController
instanceManagerThe value of instanceManager
ioManagerThe value of ioManager
loggerThe ILogger for the ApiController
+
+
+ +

Definition at line 42 of file ConfigurationController.cs.

+
42  : base(databaseContext, authenticationContextFactory, logger, true)
43  {
44  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
45  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
46  }
readonly IInstanceManager instanceManager
The IInstanceManager for the ConfigurationController
+
readonly IIOManager ioManager
The IIOManager for the ConfigurationController
+
+

References Tgstation.Server.Host.Controllers.ConfigurationController.instanceManager, and Tgstation.Server.Host.Controllers.ConfigurationController.ioManager.

+ +
+
+

Member Function Documentation

+ +

◆ Create()

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.ConfigurationController.Create ([FromBody] ConfigurationFile model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 175 of file ConfigurationController.cs.

+
176  {
177  if (model == null)
178  throw new ArgumentNullException(nameof(model));
179 
180  if (ForbidDueToModeConflicts(model.Path, out var systemIdentity))
181  return Forbid();
182 
183  try
184  {
185  model.IsDirectory = true;
186  return await instanceManager.GetInstance(Instance).Configuration.CreateDirectory(model.Path, systemIdentity, cancellationToken).ConfigureAwait(false) ? (IActionResult)Json(model) : StatusCode((int)HttpStatusCode.Created, model);
187  }
188  catch (NotImplementedException)
189  {
190  return StatusCode((int)HttpStatusCode.NotImplemented);
191  }
192  catch (UnauthorizedAccessException)
193  {
194  return Forbid();
195  }
196  }
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+
bool ForbidDueToModeConflicts(string path, out ISystemIdentity systemIdentityToUse)
If a ForbidResult should be returned from actions due to conflicts with one or both of the Api....
+
readonly IInstanceManager instanceManager
The IInstanceManager for the ConfigurationController
+
bool? IsDirectory
If Path represents a directory
+
string Path
The path to the ConfigurationFile file
+
IConfiguration Configuration
The IConfiguration for the IInstance
Definition: IInstance.cs:42
+
Metadata about a server instance
Definition: Instance.cs:9
+
+

References Tgstation.Server.Host.Components.IInstance.Configuration, Tgstation.Server.Host.Controllers.ConfigurationController.ForbidDueToModeConflicts(), Tgstation.Server.Host.Components.IInstanceManager.GetInstance(), and Tgstation.Server.Host.Controllers.ConfigurationController.instanceManager.

+ +
+
+ +

◆ Delete()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task<IActionResult> Tgstation.Server.Host.Controllers.ConfigurationController.Delete ([FromBody] ConfigurationFile directory,
CancellationToken cancellationToken 
)
+
+ +

Deletes an empty directory

+
Parameters
+ + + +
directoryA ConfigurationFile representing the path to the directory to delete
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the IActionResult of the operation
+ +

Definition at line 206 of file ConfigurationController.cs.

+
207  {
208  if (directory == null)
209  throw new ArgumentNullException(nameof(directory));
210 
211  if (ForbidDueToModeConflicts(directory.Path, out var systemIdentity))
212  return Forbid();
213 
214  try
215  {
216  return await instanceManager.GetInstance(Instance).Configuration.DeleteDirectory(directory.Path, systemIdentity, cancellationToken).ConfigureAwait(false) ? (IActionResult)Ok() : Conflict(new ErrorMessage
217  {
218  Message = "Directory not empty!"
219  });
220  }
221  catch (NotImplementedException)
222  {
223  return StatusCode((int)HttpStatusCode.NotImplemented);
224  }
225  catch (UnauthorizedAccessException)
226  {
227  return Forbid();
228  }
229  }
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+
bool ForbidDueToModeConflicts(string path, out ISystemIdentity systemIdentityToUse)
If a ForbidResult should be returned from actions due to conflicts with one or both of the Api....
+
readonly IInstanceManager instanceManager
The IInstanceManager for the ConfigurationController
+
string Path
The path to the ConfigurationFile file
+
IConfiguration Configuration
The IConfiguration for the IInstance
Definition: IInstance.cs:42
+
Metadata about a server instance
Definition: Instance.cs:9
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+

References Tgstation.Server.Host.Components.IInstance.Configuration, Tgstation.Server.Host.Controllers.ConfigurationController.ForbidDueToModeConflicts(), Tgstation.Server.Host.Components.IInstanceManager.GetInstance(), and Tgstation.Server.Host.Controllers.ConfigurationController.instanceManager.

+ +
+
+ +

◆ Directory()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task<IActionResult> Tgstation.Server.Host.Controllers.ConfigurationController.Directory (string directoryPath,
CancellationToken cancellationToken 
)
+
+ +

Get the contents of a directory at a directoryPath

+
Parameters
+ + + +
directoryPathThe path of the directory to get
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the IActionResult for the operation
+ +

Definition at line 146 of file ConfigurationController.cs.

+
147  {
148  if (ForbidDueToModeConflicts(directoryPath, out var systemIdentity))
149  return Forbid();
150 
151  try
152  {
153  var result = await instanceManager.GetInstance(Instance).Configuration.ListDirectory(directoryPath, systemIdentity, cancellationToken).ConfigureAwait(false);
154  if (result == null)
155  return StatusCode((int)HttpStatusCode.Gone);
156 
157  return Json(result);
158  }
159  catch (NotImplementedException)
160  {
161  return StatusCode((int)HttpStatusCode.NotImplemented);
162  }
163  catch (UnauthorizedAccessException)
164  {
165  return Forbid();
166  }
167  }
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+
bool ForbidDueToModeConflicts(string path, out ISystemIdentity systemIdentityToUse)
If a ForbidResult should be returned from actions due to conflicts with one or both of the Api....
+
readonly IInstanceManager instanceManager
The IInstanceManager for the ConfigurationController
+
IConfiguration Configuration
The IConfiguration for the IInstance
Definition: IInstance.cs:42
+
Metadata about a server instance
Definition: Instance.cs:9
+
+

References Tgstation.Server.Host.Components.IInstance.Configuration, Tgstation.Server.Host.Controllers.ConfigurationController.ForbidDueToModeConflicts(), Tgstation.Server.Host.Components.IInstanceManager.GetInstance(), and Tgstation.Server.Host.Controllers.ConfigurationController.instanceManager.

+ +
+
+ +

◆ File()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task<IActionResult> Tgstation.Server.Host.Controllers.ConfigurationController.File (string filePath,
CancellationToken cancellationToken 
)
+
+ +

Get the contents of a file at a filePath

+
Parameters
+ + + +
filePathThe path of the file to get
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the IActionResult for the operation
+ +

Definition at line 111 of file ConfigurationController.cs.

+
112  {
113  if (ForbidDueToModeConflicts(filePath, out var systemIdentity))
114  return Forbid();
115 
116  try
117  {
118  var result = await instanceManager.GetInstance(Instance).Configuration.Read(filePath, systemIdentity, cancellationToken).ConfigureAwait(false);
119  if (result == null)
120  return StatusCode((int)HttpStatusCode.Gone);
121 
122  return Json(result);
123  }
124  catch (IOException e)
125  {
126  Logger.LogInformation("IOException while reading file {0}: {1}", filePath, e);
127  return Conflict(new ErrorMessage
128  {
129  Message = e.Message
130  });
131  }
132  catch (NotImplementedException)
133  {
134  return StatusCode((int)HttpStatusCode.NotImplemented);
135  }
136  }
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+
bool ForbidDueToModeConflicts(string path, out ISystemIdentity systemIdentityToUse)
If a ForbidResult should be returned from actions due to conflicts with one or both of the Api....
+
readonly IInstanceManager instanceManager
The IInstanceManager for the ConfigurationController
+
string Message
A human readable description of the error
Definition: ErrorMessage.cs:13
+
IConfiguration Configuration
The IConfiguration for the IInstance
Definition: IInstance.cs:42
+
Metadata about a server instance
Definition: Instance.cs:9
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+

References Tgstation.Server.Host.Components.IInstance.Configuration, Tgstation.Server.Host.Controllers.ConfigurationController.ForbidDueToModeConflicts(), Tgstation.Server.Host.Components.IInstanceManager.GetInstance(), Tgstation.Server.Host.Controllers.ConfigurationController.instanceManager, and Tgstation.Server.Api.Models.ErrorMessage.Message.

+ +
+
+ +

◆ ForbidDueToModeConflicts()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool Tgstation.Server.Host.Controllers.ConfigurationController.ForbidDueToModeConflicts (string path,
out ISystemIdentity systemIdentityToUse 
)
+
+private
+
+ +

If a ForbidResult should be returned from actions due to conflicts with one or both of the Api.Models.Instance.ConfigurationType or the IAuthenticationContext.SystemIdentity or a given path tries to access parent directories

+
Parameters
+ + + +
pathThe path to validate if any
systemIdentityToUseThe ISystemIdentity to use when calling into Components.StaticFiles.IConfiguration
+
+
+
Returns
true if a ForbidResult should be returned, false otherwise
+ +

Definition at line 54 of file ConfigurationController.cs.

+
55  {
57  {
58  systemIdentityToUse = null;
59  return true;
60  }
61 
62  systemIdentityToUse = Instance.ConfigurationType == ConfigurationType.SystemIdentityWrite ? AuthenticationContext.SystemIdentity : null;
63  return false;
64  }
+
ConfigurationType
The type of configuration allowed on an Instance
+
readonly IIOManager ioManager
The IIOManager for the ConfigurationController
+ +
ConfigurationType? ConfigurationType
If ConfigurationFile can be used on the Instance
Definition: Instance.cs:38
+
Metadata about a server instance
Definition: Instance.cs:9
+
bool PathContainsParentAccess(string path)
Check if a path contains the '..' parent directory accessor
+
+

References Tgstation.Server.Api.Models.Instance.ConfigurationType, Tgstation.Server.Host.Controllers.ConfigurationController.ioManager, Tgstation.Server.Host.IO.IIOManager.PathContainsParentAccess(), and Tgstation.Server.Host.Security.AuthenticationContext.SystemIdentity.

+ +

Referenced by Tgstation.Server.Host.Controllers.ConfigurationController.Create(), Tgstation.Server.Host.Controllers.ConfigurationController.Delete(), Tgstation.Server.Host.Controllers.ConfigurationController.Directory(), Tgstation.Server.Host.Controllers.ConfigurationController.File(), and Tgstation.Server.Host.Controllers.ConfigurationController.Update().

+ +
+
+ +

◆ List()

+ +
+
+ + + + + +
+ + + + + + + + +
override Task<IActionResult> Tgstation.Server.Host.Controllers.ConfigurationController.List (CancellationToken cancellationToken)
+
+virtual
+
+ +

Attempt to list entries of the TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< ConfigurationFile >.

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.ConfigurationController.Update ([FromBody] ConfigurationFile model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 68 of file ConfigurationController.cs.

+
69  {
70  if (model == null)
71  throw new ArgumentNullException(nameof(model));
72  if (ForbidDueToModeConflicts(model.Path, out var systemIdentity))
73  return Forbid();
74 
76  try
77  {
78  var newFile = await config.Write(model.Path, systemIdentity, model.Content, model.LastReadHash, cancellationToken).ConfigureAwait(false);
79  if (newFile == null)
80  return Conflict(new ErrorMessage
81  {
82  Message = "This file has been updated since you last viewed it!"
83  });
84 
85  newFile.Content = null;
86 
87  return model.LastReadHash == null ? (IActionResult)StatusCode((int)HttpStatusCode.Created, newFile) : Json(newFile);
88  }
89  catch(IOException e)
90  {
91  Logger.LogInformation("IOException while updating file {0}: {1}", model.Path, e);
92  return Conflict(new ErrorMessage
93  {
94  Message = e.Message
95  });
96  }
97  catch (NotImplementedException)
98  {
99  return StatusCode((int)HttpStatusCode.NotImplemented);
100  }
101  }
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+
string LastReadHash
The MD5 hash of the file when last read by the user. If this doesn't match during update actions,...
+
bool ForbidDueToModeConflicts(string path, out ISystemIdentity systemIdentityToUse)
If a ForbidResult should be returned from actions due to conflicts with one or both of the Api....
+
readonly IInstanceManager instanceManager
The IInstanceManager for the ConfigurationController
+
string Path
The path to the ConfigurationFile file
+
string Message
A human readable description of the error
Definition: ErrorMessage.cs:13
+
IConfiguration Configuration
The IConfiguration for the IInstance
Definition: IInstance.cs:42
+
byte [] Content
The content of the ConfigurationFile. Will be null if AccessDenied is true or during listing and writ...
+
Metadata about a server instance
Definition: Instance.cs:9
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+

References Tgstation.Server.Host.Components.IInstance.Configuration, Tgstation.Server.Host.Controllers.ConfigurationController.ForbidDueToModeConflicts(), Tgstation.Server.Host.Components.IInstanceManager.GetInstance(), Tgstation.Server.Host.Controllers.ConfigurationController.instanceManager, and Tgstation.Server.Api.Models.ErrorMessage.Message.

+ +
+
+

Member Data Documentation

+ +

◆ instanceManager

+ + + +

◆ ioManager

+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Controllers.ConfigurationController.ioManager
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.png b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..c87f001834c2455e17678b85cc41e5b2bfa413ab GIT binary patch literal 1294 zcmb`Hdo+}J7{`CF8F!Y0CE0Cek10v)kxRMNxJ-;y#$ZDZHewQn%xJabO=p#rr5VXu z!^BiBxil`3#bB3J;@uT9OpHY;nQ1FCIwoe{_RsC#{hjmtp6_$c=bYz{@Ao|Ul%u}- zI@@&s0QzJ(-QmIs^e7-7Y77Y}m>faIw1nT)uaOkMT zpdJkdDD>e?J_y+d0G31c@eKJEl5)f;t9U(&X5&|hijl~oA6Imu<+I}oG8;DGek-`r)EJxhsa(VRIWEEn|;$59O zC0$y~rqvcbdpy0>ADC*MC0lY|6pFGY1uIc+>U`64<8M@%hfS37a88ZBFTD%BSS6i zl&`1>_fF$n?rNsT*Dx~^+h3fXi=EKafLCTBdYtv{u?g3r6qB=Otn9MpdJ20pj_6u| z6~&;XRYz31MM7PXZl`3!1HbqNTWsCkHJk@WMEf?bBJd2WWm+l;1$;% zf9%~~E{FOqMtJX!sL1Eh6EAXKxuspc41( zulJUXxs;ZD*Ji&&4|Yft3PWc0;XcVi0y%#5WNm(G0P z3tharVX(FqzNxpDWk?L$iHAGSy(W8spldMjvUv@#U#qEU-N9lF!%(Qj$dDL=B4~)f z1r$It1pN=dR23$~-@1k_96Q3a>gu{yDgL$WlzcU>{u!lyQwDXnz+8k-P znYp&9+-!FP-D2hs7H?pMK{vDS(<=p&>)l3TT0&=0T--N-FSVpCE~Beyj=)TAf|Ryq z?|wWSAj;gqloX`oHaqO$j`1+FLr7VYUUchxb>;NhF1jx!H53QxznFR=PMY0?@&8h} zlG0^t)=NNRNLbwE-j-@QaiI0~A0Tq_5*#qSUR?>zC`4(iXC*1L)ZEDZU7<$L8t5Iz zAWnkfz;?J`!vtyj&FTC0&&NUH9wAijT#HjA<-AM5l*cJN9l`arhO@}FVw?9ZoC=9& z;|&X28B3i#rA`d2fjaAN!@b6}Xw(KILqB#*%KDi!<$|55+mfszHouEu;k}jNT$7QV zoMx=sUNv(_`3rlr@-QYf$N + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Controllers.DreamDaemonController Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Controllers.DreamDaemonController, including all inherited members.

+ + + + + + + + + + + + + + + + +
Create([FromBody] DreamDaemon model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.DreamDaemonController
ModelController< DreamDaemon >.Create([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< DreamDaemon >virtual
Delete(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.DreamDaemonController
ModelController< DreamDaemon >.Delete(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< DreamDaemon >virtual
DreamDaemonController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger< DreamDaemonController > logger)Tgstation.Server.Host.Controllers.DreamDaemonController
GetId(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< DreamDaemon >virtual
instanceManagerTgstation.Server.Host.Controllers.DreamDaemonControllerprivate
jobManagerTgstation.Server.Host.Controllers.DreamDaemonControllerprivate
List(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< DreamDaemon >virtual
ModelController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)Tgstation.Server.Host.Controllers.ModelController< DreamDaemon >
Read(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.DreamDaemonControllervirtual
ReadImpl(DreamDaemonSettings settings, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.DreamDaemonControllerprivate
Restart(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.DreamDaemonController
Update([FromBody] DreamDaemon model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.DreamDaemonController
ModelController< DreamDaemon >.Update([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< DreamDaemon >virtual
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html new file mode 100644 index 0000000000..b03d060e25 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html @@ -0,0 +1,555 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Controllers.DreamDaemonController Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Controllers.DreamDaemonController Class Reference
+
+
+ +

ModelController<TModel> for managing the DreamDaemon + More...

+
+Inheritance diagram for Tgstation.Server.Host.Controllers.DreamDaemonController:
+
+
+ + +Tgstation.Server.Host.Controllers.ModelController< DreamDaemon > + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 DreamDaemonController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger< DreamDaemonController > logger)
 Construct a DreamDaemonController More...
 
override async Task< IActionResult > Create ([FromBody] DreamDaemon model, CancellationToken cancellationToken)
 
override Task< IActionResult > Read (CancellationToken cancellationToken)
 Attempt to read a TModel More...
 
async Task< IActionResult > Delete (CancellationToken cancellationToken)
 Stops DreamDaemon if it's running More...
 
override async Task< IActionResult > Update ([FromBody] DreamDaemon model, CancellationToken cancellationToken)
 
async Task< IActionResult > Restart (CancellationToken cancellationToken)
 Handle a HTTP PATCH to the DreamDaemonController More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Controllers.ModelController< DreamDaemon >
 ModelController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)
 Construct a ModelController<TModel> More...
 
virtual Task< IActionResult > Create ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to create a model More...
 
virtual Task< IActionResult > GetId (long id, CancellationToken cancellationToken)
 Attempt to get a specific a TModel More...
 
virtual Task< IActionResult > Update ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to update a model More...
 
virtual Task< IActionResult > Delete (long id, CancellationToken cancellationToken)
 Attempt to delete a model with a particular id More...
 
virtual Task< IActionResult > List (CancellationToken cancellationToken)
 Attempt to list entries of the TModel More...
 
+ + + + +

+Private Member Functions

async Task< IActionResult > ReadImpl (DreamDaemonSettings settings, CancellationToken cancellationToken)
 Implementation of Read(CancellationToken) More...
 
+ + + + + + + +

+Private Attributes

readonly IJobManager jobManager
 The IJobManager for the DreamMakerController More...
 
readonly IInstanceManager instanceManager
 The IInstanceManager for the DreamMakerController More...
 
+

Detailed Description

+

ModelController<TModel> for managing the DreamDaemon

+ +

Definition at line 26 of file DreamDaemonController.cs.

+

Constructor & Destructor Documentation

+ +

◆ DreamDaemonController()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Controllers.DreamDaemonController.DreamDaemonController (IDatabaseContext databaseContext,
IAuthenticationContextFactory authenticationContextFactory,
IJobManager jobManager,
IInstanceManager instanceManager,
ILogger< DreamDaemonControllerlogger 
)
+
+ +

Construct a DreamDaemonController

+
Parameters
+ + + + + + +
databaseContextThe IDatabaseContext for the ApiController
authenticationContextFactoryThe IAuthenticationContextFactory for the ApiController
jobManagerThe value of jobManager
instanceManagerThe value of instanceManager
loggerThe ILogger for the ApiController
+
+
+ +

Definition at line 46 of file DreamDaemonController.cs.

+
46  : base(databaseContext, authenticationContextFactory, logger, true)
47  {
48  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
49  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
50  }
readonly IInstanceManager instanceManager
The IInstanceManager for the DreamMakerController
+
readonly IJobManager jobManager
The IJobManager for the DreamMakerController
+
+

References Tgstation.Server.Host.Controllers.DreamDaemonController.instanceManager, and Tgstation.Server.Host.Controllers.DreamDaemonController.jobManager.

+ +
+
+

Member Function Documentation

+ +

◆ Create()

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.DreamDaemonController.Create ([FromBody] DreamDaemon model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 54 of file DreamDaemonController.cs.

+
55  {
56  // alias for launching DD
57  var instance = instanceManager.GetInstance(Instance);
58 
59  if (instance.Watchdog.Running)
60  return StatusCode((int)HttpStatusCode.Gone);
61 
62  var job = new Models.Job
63  {
64  Description = "Launch DreamDaemon",
65  CancelRight = (ulong)DreamDaemonRights.Shutdown,
66  CancelRightsType = RightsType.DreamDaemon,
68  StartedBy = AuthenticationContext.User
69  };
70  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressHandler, innerCt) => instance.Watchdog.Launch(innerCt), cancellationToken).ConfigureAwait(false);
71  return Accepted(job.ToApi());
72  }
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+
Task RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
Registers a given Job and begins running it
+
DreamDaemonRights
Rights for Models.DreamDaemon
+
readonly IInstanceManager instanceManager
The IInstanceManager for the DreamMakerController
+
readonly IJobManager jobManager
The IJobManager for the DreamMakerController
+
Metadata about a server instance
Definition: Instance.cs:9
+ +
+

References Tgstation.Server.Host.Components.IInstanceManager.GetInstance(), Tgstation.Server.Host.Controllers.DreamDaemonController.instanceManager, Tgstation.Server.Host.Controllers.DreamDaemonController.jobManager, Tgstation.Server.Host.Core.IJobManager.RegisterOperation(), and Tgstation.Server.Host.Security.AuthenticationContext.User.

+ +
+
+ +

◆ Delete()

+ +
+
+ + + + + + + + +
async Task<IActionResult> Tgstation.Server.Host.Controllers.DreamDaemonController.Delete (CancellationToken cancellationToken)
+
+ +

Stops DreamDaemon if it's running

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the IActionResult of the operation
+ +

Definition at line 137 of file DreamDaemonController.cs.

+
138  {
139  var instance = instanceManager.GetInstance(Instance);
140  await instance.Watchdog.Terminate(false, cancellationToken).ConfigureAwait(false);
141  return Ok();
142  }
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+
readonly IInstanceManager instanceManager
The IInstanceManager for the DreamMakerController
+
IWatchdog Watchdog
The IWatchdog for the IInstance
Definition: IInstance.cs:32
+
Metadata about a server instance
Definition: Instance.cs:9
+
Task Terminate(bool graceful, CancellationToken cancellationToken)
Stops the watchdog
+
+

References Tgstation.Server.Host.Components.IInstanceManager.GetInstance(), Tgstation.Server.Host.Controllers.DreamDaemonController.instanceManager, Tgstation.Server.Host.Components.Watchdog.IWatchdog.Terminate(), and Tgstation.Server.Host.Components.IInstance.Watchdog.

+ +
+
+ +

◆ Read()

+ +
+
+ + + + + +
+ + + + + + + + +
override Task<IActionResult> Tgstation.Server.Host.Controllers.DreamDaemonController.Read (CancellationToken cancellationToken)
+
+virtual
+
+ +

Attempt to read a TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< DreamDaemon >.

+ +
+
+ +

◆ ReadImpl()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
async Task<IActionResult> Tgstation.Server.Host.Controllers.DreamDaemonController.ReadImpl (DreamDaemonSettings settings,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Implementation of Read(CancellationToken)

+
Parameters
+ + + +
settingsThe DreamDaemonSettings to operate on if any
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the IActionResult of the operation
+ +

Definition at line 84 of file DreamDaemonController.cs.

+
85  {
86  var instance = instanceManager.GetInstance(Instance);
87  var dd = instance.Watchdog;
88 
89  var metadata = (AuthenticationContext.GetRight(RightsType.DreamDaemon) & (ulong)DreamDaemonRights.ReadMetadata) != 0;
90  var revision = (AuthenticationContext.GetRight(RightsType.DreamDaemon) & (ulong)DreamDaemonRights.ReadRevision) != 0;
91 
92  if (settings == null)
93  {
94  settings = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).Select(x => x.DreamDaemonSettings).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
95  if (settings == default)
96  return StatusCode((int)HttpStatusCode.Gone);
97  }
98 
99  var result = new DreamDaemon();
100  if (metadata)
101  {
102  var alphaActive = dd.AlphaIsActive;
103  var llp = dd.LastLaunchParameters;
104  var rstate = dd.RebootState;
105  result.AutoStart = settings.AutoStart;
106  result.CurrentPort = alphaActive ? llp?.PrimaryPort : llp?.SecondaryPort;
107  result.CurrentSecurity = llp?.SecurityLevel;
108  result.CurrentAllowWebclient = llp?.AllowWebClient;
109  result.PrimaryPort = settings.PrimaryPort;
110  result.AllowWebClient = settings.AllowWebClient;
111  result.Running = dd.Running;
112  result.SecondaryPort = settings.SecondaryPort;
113  result.SecurityLevel = settings.SecurityLevel;
114  result.SoftRestart = rstate == RebootState.Restart;
115  result.SoftShutdown = rstate == RebootState.Shutdown;
116  result.StartupTimeout = settings.StartupTimeout;
117  }
118 
119  if (revision)
120  {
121  var latestCompileJob = instance.LatestCompileJob();
122  result.ActiveCompileJob = (dd.ActiveCompileJob ?? latestCompileJob)?.ToApi();
123  if (latestCompileJob?.Id != result.ActiveCompileJob?.Id)
124  result.StagedCompileJob = latestCompileJob?.ToApi();
125  }
126 
127  return Json(result);
128  }
+
ushort? PrimaryPort
The first port DreamDaemon uses. This should be the publically advertised port
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+ +
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+
bool? AutoStart
If DreamDaemon starts when it's Instance starts
+ + +
DreamDaemonRights
Rights for Models.DreamDaemon
+ +
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
readonly IInstanceManager instanceManager
The IInstanceManager for the DreamMakerController
+
IWatchdog Watchdog
The IWatchdog for the IInstance
Definition: IInstance.cs:32
+
Metadata about a server instance
Definition: Instance.cs:9
+
Represents an instance of BYOND's DreamDaemon game server. Create action starts the server....
Definition: DreamDaemon.cs:8
+
bool? AllowWebClient
If the BYOND web client can be used to connect to the game server
+
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
+
DreamDaemonSecurity? SecurityLevel
The DreamDaemonSecurity level of DreamDaemon
+
+

References Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.AllowWebClient, Tgstation.Server.Api.Models.Internal.DreamDaemonSettings.AutoStart, Tgstation.Server.Host.Components.IInstanceManager.GetInstance(), Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Host.Controllers.DreamDaemonController.instanceManager, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Instances, Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.PrimaryPort, Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.SecondaryPort, Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.SecurityLevel, Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.StartupTimeout, and Tgstation.Server.Host.Components.IInstance.Watchdog.

+ +

Referenced by Tgstation.Server.Host.Controllers.DreamDaemonController.Update().

+ +
+
+ +

◆ Restart()

+ +
+
+ + + + + + + + +
async Task<IActionResult> Tgstation.Server.Host.Controllers.DreamDaemonController.Restart (CancellationToken cancellationToken)
+
+ +

Handle a HTTP PATCH to the DreamDaemonController

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the IActionResult of the request
+ +

Definition at line 222 of file DreamDaemonController.cs.

+
223  {
224  var job = new Models.Job
225  {
226  Instance = Instance,
227  CancelRightsType = RightsType.DreamDaemon,
228  CancelRight = (ulong)DreamDaemonRights.Shutdown,
229  StartedBy = AuthenticationContext.User,
230  Description = "Restart Watchdog"
231  };
232 
234 
235  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressReporter, ct) => watchdog.Restart(false, ct), cancellationToken).ConfigureAwait(false);
236  return Accepted(job.ToApi());
237  }
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+
Task RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
Registers a given Job and begins running it
+
DreamDaemonRights
Rights for Models.DreamDaemon
+
readonly IInstanceManager instanceManager
The IInstanceManager for the DreamMakerController
+
readonly IJobManager jobManager
The IJobManager for the DreamMakerController
+
IWatchdog Watchdog
The IWatchdog for the IInstance
Definition: IInstance.cs:32
+
Metadata about a server instance
Definition: Instance.cs:9
+ +
+

References Tgstation.Server.Host.Components.IInstanceManager.GetInstance(), Tgstation.Server.Host.Controllers.DreamDaemonController.instanceManager, Tgstation.Server.Host.Controllers.DreamDaemonController.jobManager, Tgstation.Server.Host.Core.IJobManager.RegisterOperation(), Tgstation.Server.Host.Security.AuthenticationContext.User, and Tgstation.Server.Host.Components.IInstance.Watchdog.

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.DreamDaemonController.Update ([FromBody] DreamDaemon model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 147 of file DreamDaemonController.cs.

+
148  {
149  if (model == null)
150  throw new ArgumentNullException(nameof(model));
151 
152  if (model.PrimaryPort == 0)
153  return BadRequest(new ErrorMessage { Message = "Primary port cannot be 0!" });
154 
155  if (model.SecurityLevel == DreamDaemonSecurity.Ultrasafe)
156  return BadRequest(new ErrorMessage { Message = "This version of TGS does not support the ultrasafe DreamDaemon configuration!" });
157 
158  // alias for changing DD settings
159  var current = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).Select(x => x.DreamDaemonSettings).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
160 
161  if (current == default)
162  return StatusCode((int)HttpStatusCode.Gone);
163 
164  var userRights = (DreamDaemonRights)AuthenticationContext.GetRight(RightsType.DreamDaemon);
165 
166  bool CheckModified<T>(Expression<Func<Api.Models.Internal.DreamDaemonSettings, T>> expression, DreamDaemonRights requiredRight)
167  {
168  var memberSelectorExpression = (MemberExpression)expression.Body;
169  var property = (PropertyInfo)memberSelectorExpression.Member;
170 
171  var newVal = property.GetValue(model);
172  if (newVal == null)
173  return false;
174  if (!userRights.HasFlag(requiredRight) && property.GetValue(current) != newVal)
175  return true;
176 
177  property.SetValue(current, newVal);
178  return false;
179  }
180 
181  var oldSoftRestart = current.SoftRestart;
182  var oldSoftShutdown = current.SoftShutdown;
183 
184  if (CheckModified(x => x.AllowWebClient, DreamDaemonRights.SetWebClient)
185  || CheckModified(x => x.AutoStart, DreamDaemonRights.SetAutoStart)
186  || CheckModified(x => x.PrimaryPort, DreamDaemonRights.SetPorts)
187  || CheckModified(x => x.SecondaryPort, DreamDaemonRights.SetPorts)
188  || CheckModified(x => x.SecurityLevel, DreamDaemonRights.SetSecurity)
189  || CheckModified(x => x.SoftRestart, DreamDaemonRights.SoftRestart)
190  || CheckModified(x => x.SoftShutdown, DreamDaemonRights.SoftShutdown)
191  || CheckModified(x => x.StartupTimeout, DreamDaemonRights.SetStartupTimeout))
192  return Forbid();
193 
194  if (current.PrimaryPort == current.SecondaryPort)
195  return BadRequest(new ErrorMessage { Message = "Primary port and secondary port cannot be the same!" });
196 
198 
199  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
200 
201  // run this second because current may be modified by it
202  await wd.ChangeSettings(current, cancellationToken).ConfigureAwait(false);
203 
204  if (!oldSoftRestart.Value && current.SoftRestart.Value)
205  await wd.Restart(true, cancellationToken).ConfigureAwait(false);
206  else if (!oldSoftShutdown.Value && current.SoftShutdown.Value)
207  await wd.Terminate(true, cancellationToken).ConfigureAwait(false);
208  else if ((oldSoftRestart.Value && !current.SoftRestart.Value) || (oldSoftShutdown.Value && !current.SoftShutdown.Value))
209  await wd.ResetRebootState(cancellationToken).ConfigureAwait(false);
210 
211  return await ReadImpl(current, cancellationToken).ConfigureAwait(false);
212  }
+
ushort? PrimaryPort
The first port DreamDaemon uses. This should be the publically advertised port
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+ +
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+
async Task< IActionResult > ReadImpl(DreamDaemonSettings settings, CancellationToken cancellationToken)
Implementation of Read(CancellationToken)
+
DreamDaemonRights
Rights for Models.DreamDaemon
+ +
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
readonly IInstanceManager instanceManager
The IInstanceManager for the DreamMakerController
+
IWatchdog Watchdog
The IWatchdog for the IInstance
Definition: IInstance.cs:32
+
Metadata about a server instance
Definition: Instance.cs:9
+
DreamDaemonSecurity
DreamDaemon's security level
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
DreamDaemonSecurity? SecurityLevel
The DreamDaemonSecurity level of DreamDaemon
+
+

References Tgstation.Server.Host.Components.IInstanceManager.GetInstance(), Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Host.Controllers.DreamDaemonController.instanceManager, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Instances, Tgstation.Server.Host.Controllers.DreamDaemonController.ReadImpl(), Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save(), and Tgstation.Server.Host.Components.IInstance.Watchdog.

+ +
+
+

Member Data Documentation

+ +

◆ instanceManager

+ + + +

◆ jobManager

+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Controllers.DreamDaemonController.jobManager
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.png b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..a305adf08e156c36ccaf2420fe00c74af6e0b47d GIT binary patch literal 1313 zcmeAS@N?(olHy`uVBq!ia0y~yV4MVG2XHV0NfvJA!$3+Rz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opuOL0Y0h zo?c5uJ!k*-G&=w9*AMM8YlZK+Pcpf*M@R48z4o?W6?}8o3fDEBe(>9Gnw96JnRZbs zp3XCai^SecY_<&atXf^HlI$ElLFe1~2{pG*wsXd>=u%-V^^mjNyQtpnS>3aXmYa18 zcb|OzJ$0e{Cy#5LS9j^pEj0XHCz>hwmgoIM36Vm8?~B^oyDw^?A@76|>j%?>qt|a>KJF?N;_v&; za>Zj#q2L!=d)$|aJ-EH{{;K45w&f}1g`%CGQ_rlod34W2@=oESUEVodr?ui$uJ1_V zP%oVm-#1~7*}4F)>VI$AWMdx0Zr@w!^^3WzXUYDp>#ZzpRh#wQdtYzPEB>t~sr*qq z`u>h{?FDOw5)D?>aOfGLGxNsuC=$5JPz30^=Y zQ@J=DfGMXTL`#Jl3ckEo$XvTMD0^+HAnyW}3C`#?d=Z>v_MiF8=KXg6q@-WkGf8B| ziHYaGcXqC|X+OvIkh!9E%Zu1D@g^pTmzRT!p8Yv-DEm*>Pi1hztPwidT2QZ|(J*nH zVr5SEbNTakKi*QhectBRuiCR^vunPZ>K8i8owV8*_5DL{_s#FxFH^S|%P2+eGqw9R zv5+V4o_d9~MniC{)25V6d8yyYVry8w2fYbi#*%$;TkBlUcC%vwK5U0C9%*bW7n(swzt>rw_~>K8Pg5^a~3?D_u>BB z1q|m(**i7AL>*IBIn8#<@8hcryu5y$*?iMCmG5)wJ-z1R#ofoY&i=)zq8QzfeAlVy z)($7lTzO*;H}Q(=SMujg`q%JvdCG^oD+*=RfAlV3@cZ(){G>$Ze*53YO3S9ZIEzb# zccfgg*}L8Rv*GO5Aa@B(dO9z9*Qpw%`C`C?C;bhS@X~VIlP=%TU${2l+=TrBXIK2K z%a2)Byo3MRi{$D^^*ML#4(;6-3s?$buLD!uCPpuY{R>X_ saxY-{5RH)_*e6|!(%yP4O6V_p(yO3pu@5H10?RW7Pgg&ebxsLQ0DL`DwEzGB literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller-members.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller-members.html new file mode 100644 index 0000000000..686d2e1af2 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller-members.html @@ -0,0 +1,97 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Controllers.DreamMakerController Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Controllers.DreamMakerController, including all inherited members.

+ + + + + + + + + + + + + +
Create([FromBody] DreamMaker model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.DreamMakerController
ModelController< DreamMaker >.Create([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< DreamMaker >virtual
Delete(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< DreamMaker >virtual
DreamMakerController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger< DreamMakerController > logger)Tgstation.Server.Host.Controllers.DreamMakerController
GetId(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.DreamMakerControllervirtual
instanceManagerTgstation.Server.Host.Controllers.DreamMakerControllerprivate
jobManagerTgstation.Server.Host.Controllers.DreamMakerControllerprivate
List(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.DreamMakerControllervirtual
ModelController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)Tgstation.Server.Host.Controllers.ModelController< DreamMaker >
Read(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.DreamMakerControllervirtual
Update([FromBody] DreamMaker model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.DreamMakerController
ModelController< DreamMaker >.Update([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< DreamMaker >virtual
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html new file mode 100644 index 0000000000..a9f975dec5 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html @@ -0,0 +1,493 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Controllers.DreamMakerController Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Controllers.DreamMakerController Class Reference
+
+
+ +

Controller for managing the compiler + More...

+
+Inheritance diagram for Tgstation.Server.Host.Controllers.DreamMakerController:
+
+
+ + +Tgstation.Server.Host.Controllers.ModelController< DreamMaker > + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 DreamMakerController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger< DreamMakerController > logger)
 Construct a DreamMakerController More...
 
override async Task< IActionResult > Read (CancellationToken cancellationToken)
 Attempt to read a TModel More...
 
override async Task< IActionResult > GetId (long id, CancellationToken cancellationToken)
 Attempt to get a specific a TModel More...
 
override async Task< IActionResult > List (CancellationToken cancellationToken)
 Attempt to list entries of the TModel More...
 
override async Task< IActionResult > Create ([FromBody] DreamMaker model, CancellationToken cancellationToken)
 
override async Task< IActionResult > Update ([FromBody] DreamMaker model, CancellationToken cancellationToken)
 
- Public Member Functions inherited from Tgstation.Server.Host.Controllers.ModelController< DreamMaker >
 ModelController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)
 Construct a ModelController<TModel> More...
 
virtual Task< IActionResult > Create ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to create a model More...
 
virtual Task< IActionResult > Update ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to update a model More...
 
virtual Task< IActionResult > Delete (long id, CancellationToken cancellationToken)
 Attempt to delete a model with a particular id More...
 
+ + + + + + + +

+Private Attributes

readonly IJobManager jobManager
 The IJobManager for the DreamMakerController More...
 
readonly IInstanceManager instanceManager
 The IInstanceManager for the DreamMakerController More...
 
+

Detailed Description

+

Controller for managing the compiler

+ +

Definition at line 24 of file DreamMakerController.cs.

+

Constructor & Destructor Documentation

+ +

◆ DreamMakerController()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Controllers.DreamMakerController.DreamMakerController (IDatabaseContext databaseContext,
IAuthenticationContextFactory authenticationContextFactory,
IJobManager jobManager,
IInstanceManager instanceManager,
ILogger< DreamMakerControllerlogger 
)
+
+ +

Construct a DreamMakerController

+
Parameters
+ + + + + + +
databaseContextThe IDatabaseContext for the ApiController
authenticationContextFactoryThe IAuthenticationContextFactory for the ApiController
jobManagerThe value of jobManager
instanceManagerThe value of instanceManager
loggerThe ILogger for the ApiController
+
+
+ +

Definition at line 44 of file DreamMakerController.cs.

+
44  : base(databaseContext, authenticationContextFactory, logger, true)
45  {
46  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
47  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
48  }
readonly IInstanceManager instanceManager
The IInstanceManager for the DreamMakerController
+
readonly IJobManager jobManager
The IJobManager for the DreamMakerController
+
+

References Tgstation.Server.Host.Controllers.DreamMakerController.instanceManager, and Tgstation.Server.Host.Controllers.DreamMakerController.jobManager.

+ +
+
+

Member Function Documentation

+ +

◆ Create()

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.DreamMakerController.Create ([FromBody] DreamMaker model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 87 of file DreamMakerController.cs.

+
88  {
89  var job = new Models.Job
90  {
91  Description = "Compile active repository code",
92  StartedBy = AuthenticationContext.User,
93  CancelRightsType = RightsType.DreamMaker,
94  CancelRight = (ulong)DreamMakerRights.CancelCompile,
96  };
97  await jobManager.RegisterOperation(job, instanceManager.GetInstance(Instance).CompileProcess, cancellationToken).ConfigureAwait(false);
98  return Accepted(job.ToApi());
99  }
readonly IInstanceManager instanceManager
The IInstanceManager for the DreamMakerController
+ +
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+
Task CompileProcess(Job job, IDatabaseContext databaseContext, Action< int > progressReporter, CancellationToken cancellationToken)
Run the compile job and insert it into the database. Meant to be called by a Core....
+
Task RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
Registers a given Job and begins running it
+
DreamMakerRights
Rights for Models.DreamMaker
+
readonly IJobManager jobManager
The IJobManager for the DreamMakerController
+
Metadata about a server instance
Definition: Instance.cs:9
+ +
+

References Tgstation.Server.Host.Components.IInstance.CompileProcess(), Tgstation.Server.Host.Components.IInstanceManager.GetInstance(), Tgstation.Server.Host.Controllers.DreamMakerController.instanceManager, Tgstation.Server.Host.Controllers.DreamMakerController.jobManager, Tgstation.Server.Host.Core.IJobManager.RegisterOperation(), and Tgstation.Server.Host.Security.AuthenticationContext.User.

+ +
+
+ +

◆ GetId()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.DreamMakerController.GetId (long id,
CancellationToken cancellationToken 
)
+
+virtual
+
+ +

Attempt to get a specific a TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< DreamMaker >.

+ +

Definition at line 61 of file DreamMakerController.cs.

+
62  {
63  var compileJob = await DatabaseContext.CompileJobs
64  .Where(x => x.Id == id && x.Job.Instance.Id == Instance.Id)
65  .Include(x => x.Job).ThenInclude(x => x.StartedBy)
66  .Include(x => x.RevisionInformation).ThenInclude(x => x.PrimaryTestMerge).ThenInclude(x => x.MergedBy)
67  .Include(x => x.RevisionInformation).ThenInclude(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy)
68  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
69  if (compileJob == default)
70  return NotFound();
71  return Json(compileJob.ToApi());
72  }
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Metadata about a server instance
Definition: Instance.cs:9
+ +
+

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.CompileJobs, and Tgstation.Server.Api.Models.Instance.Id.

+ +
+
+ +

◆ List()

+ +
+
+ + + + + +
+ + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.DreamMakerController.List (CancellationToken cancellationToken)
+
+virtual
+
+ +

Attempt to list entries of the TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< DreamMaker >.

+ +

Definition at line 76 of file DreamMakerController.cs.

+
77  {
78  var compileJobs = await DatabaseContext.CompileJobs.Where(x => x.Job.Instance.Id == Instance.Id).OrderByDescending(x => x.Job.StoppedAt).Select(x => new Api.Models.CompileJob
79  {
80  Id = x.Id
81  }).ToListAsync(cancellationToken).ConfigureAwait(false);
82  return Json(compileJobs);
83  }
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Metadata about a server instance
Definition: Instance.cs:9
+ +
+

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.CompileJobs, and Tgstation.Server.Api.Models.Instance.Id.

+ +
+
+ +

◆ Read()

+ +
+
+ + + + + +
+ + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.DreamMakerController.Read (CancellationToken cancellationToken)
+
+virtual
+
+ +

Attempt to read a TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< DreamMaker >.

+ +

Definition at line 52 of file DreamMakerController.cs.

+
53  {
54  var instance = instanceManager.GetInstance(Instance);
55  var dreamMakerSettings = await DatabaseContext.DreamMakerSettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
56  return Json(dreamMakerSettings.ToApi());
57  }
readonly IInstanceManager instanceManager
The IInstanceManager for the DreamMakerController
+
DbSet< DreamMakerSettings > DreamMakerSettings
+
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+ +
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Metadata about a server instance
Definition: Instance.cs:9
+
+

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.DreamMakerSettings, Tgstation.Server.Host.Components.IInstanceManager.GetInstance(), Tgstation.Server.Api.Models.Instance.Id, and Tgstation.Server.Host.Controllers.DreamMakerController.instanceManager.

+ +

Referenced by Tgstation.Server.Host.Controllers.DreamMakerController.Update().

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.DreamMakerController.Update ([FromBody] DreamMaker model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 103 of file DreamMakerController.cs.

+
104  {
105  if (model.ApiValidationPort == 0)
106  return BadRequest(new ErrorMessage { Message = "API Validation port cannot be 0!" });
107 
108  if (model.ApiValidationSecurityLevel == DreamDaemonSecurity.Ultrasafe)
109  return BadRequest(new ErrorMessage { Message = "This version of TGS does not support the ultrasafe DreamDaemon configuration!" });
110 
111  var hostModel = await DatabaseContext.DreamMakerSettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
112  if (hostModel == null)
113  return StatusCode((int)HttpStatusCode.Gone);
114 
115  if (model.ProjectName != null)
116  {
118  return Forbid();
119  if (model.ProjectName.Length == 0)
120  hostModel.ProjectName = null;
121  else
122  hostModel.ProjectName = model.ProjectName;
123  }
124 
125  if (model.ApiValidationPort.HasValue)
126  {
127  if (!AuthenticationContext.InstanceUser.DreamMakerRights.Value.HasFlag(DreamMakerRights.SetApiValidationPort))
128  return Forbid();
129  hostModel.ApiValidationPort = model.ApiValidationPort;
130  }
131 
132  if (model.ApiValidationSecurityLevel.HasValue)
133  {
134  if (!AuthenticationContext.InstanceUser.DreamMakerRights.Value.HasFlag(DreamMakerRights.SetSecurityLevel))
135  return Forbid();
136  hostModel.ApiValidationSecurityLevel = model.ApiValidationSecurityLevel;
137  }
138 
139  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
140 
141  if ((AuthenticationContext.GetRight(RightsType.DreamMaker) & (ulong)DreamMakerRights.Read) == 0)
142  return Ok();
143 
144  return await Read(cancellationToken).ConfigureAwait(false);
145  }
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
DbSet< DreamMakerSettings > DreamMakerSettings
+
ushort? ApiValidationPort
The port used during compilation to validate the DMAPI
Definition: DreamMaker.cs:19
+
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+ +
string ProjectName
The .dme file DreamMaker tries to compile with without the extension
Definition: DreamMaker.cs:13
+
DreamMakerRights? DreamMakerRights
The Rights.DreamMakerRights of the InstanceUser
Definition: InstanceUser.cs:39
+
DreamDaemonSecurity? ApiValidationSecurityLevel
The DreamDaemonSecurity level used to validate the DMAPI
Definition: DreamMaker.cs:25
+
DreamMakerRights
Rights for Models.DreamMaker
+ +
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
override async Task< IActionResult > Read(CancellationToken cancellationToken)
Attempt to read a TModel
+
Metadata about a server instance
Definition: Instance.cs:9
+
DreamDaemonSecurity
DreamDaemon's security level
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+

References Tgstation.Server.Api.Models.InstanceUser.DreamMakerRights, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.DreamMakerSettings, Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Host.Security.AuthenticationContext.InstanceUser, Tgstation.Server.Host.Controllers.DreamMakerController.Read(), and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save().

+ +
+
+

Member Data Documentation

+ +

◆ instanceManager

+ +
+
+ + + + + +
+ + + + +
readonly IInstanceManager Tgstation.Server.Host.Controllers.DreamMakerController.instanceManager
+
+private
+
+
+ +

◆ jobManager

+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Controllers.DreamMakerController.jobManager
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.png b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..8a8a5bb4756f4084a754e21621981c96fa4e7375 GIT binary patch literal 1321 zcmeAS@N?(olHy`uVBq!ia0y~yVC(?012~w0q)EHbBOoOa;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|z_P>B#WAFU@$KA;MTa$bT=}mX|NZZO zZwZ?+quR#Xxi@4>Ype|=JYO_?Ikhb}I^*`Xx0{nDFPWfH8^q`|Ni3jY!V*>y1(i%j zRu0c72UeF`|5au#-)C26TAaElTE$cO?fk9s^6#CUYi*XFJJs_4z}pAU{fg$PWG=It zcHPp*JW1@)%!ReplfDEM3nV*-JEZ(J7O*e-^sMc7L|#M1nty#iCHsGG?|=8(GUf*J z-u=({|4v{JRO>38Z}2$j``@{gcaIJ?=4-+pb!PwK4vcIuYdw4E0PJNB6W z)>vuxjCuQi<>O_Yy{qyT8ozAVW@w@&efV0_`PS|$wUswJZSQ=u*cx5ibe{3cMj5ub zTe(sg79ES(d?l!Gxp&a3)c9C&tHOuHS8l&3zA|MVV@Ka_UG>^t$(9K!pJg`AIBeUs zYnB~j;-%3H=>i{ts}8Tul(inGcJj(28T=Q5s%|EV%F;#A1W z1U*%;qmmt&nOQ;^+EZ=kG?%@Z?(cQE`|z#!WyJ!u{QF*|R4KD*yKn3X`t-st#>DvSrV)3Hi&@uB=-hoq4&^;)CP;(nnmL^EP;UO=@#r>hrY8+~`(A#=7|` zttv15uQa`=>IAXwhn6d!Itz;8zrAitJtsL$`qIuNFlkEzQ;Ul30tQ7-ZVd;IOH5S_ zH@4++=ic5{8^Z9vvX-%h!EQAJk8#KBk-#K@EYOq&hBM9Kh6tqc(k`HdR2vMc;+ zYyU_|zZ7Te*;0S4u4WHE@7IrWtfX7`AB5T!NHZ7w%G6*`-dnAlcJ91RO@F*$JzG-F z3$BiGrIVaym2zu-6auAVnLl!T`uSM$_4k7o|K2XX|Nph$n?}8T-~8`D5^4XP9XD$0 z^R4>J+Gcxvih8`b&qU#z&pkfYgjL=OpYFYJUIa{@<;VJDZmX7kHVvNZ$-bp`q2W!5 zJl&q;3c1BRhl^J#*S(w@!0>Dr*P?gp-fdj^=p65as+-~0Tm52w-2HC$>n?xS^8~%d zNLm-9^-E@?Z&qkyg%JC z-QNC+n&mUKfZOYfb6cv``m)CRoWL+BcQkQfaAMfM)LY@+{tO1ihVs(4Zd17V1eku9 x#_IV31@4D}A`CeOFEG1!X|@J=y?)gK^6c2 literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller-members.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller-members.html new file mode 100644 index 0000000000..1956f553ea --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller-members.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Controllers.HomeController Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Controllers.HomeController, including all inherited members.

+ + + + + + + + + + + + + + + + + + +
ApiController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance, bool requireHeaders)Tgstation.Server.Host.Controllers.ApiController
ApiHeadersTgstation.Server.Host.Controllers.ApiControllerprotected
applicationTgstation.Server.Host.Controllers.HomeControllerprivate
AuthenticationContextTgstation.Server.Host.Controllers.ApiControllerprotected
browserResolverTgstation.Server.Host.Controllers.HomeControllerprivate
controlPanelConfigurationTgstation.Server.Host.Controllers.HomeControllerprivate
CreateToken(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.HomeController
cryptographySuiteTgstation.Server.Host.Controllers.HomeControllerprivate
DatabaseContextTgstation.Server.Host.Controllers.ApiControllerprotected
Home()Tgstation.Server.Host.Controllers.HomeController
HomeController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ITokenFactory tokenFactory, ISystemIdentityFactory systemIdentityFactory, ICryptographySuite cryptographySuite, IApplication application, IIdentityCache identityCache, IBrowserResolver browserResolver, IOptions< ControlPanelConfiguration > controlPanelConfigurationOptions, ILogger< HomeController > logger)Tgstation.Server.Host.Controllers.HomeController
identityCacheTgstation.Server.Host.Controllers.HomeControllerprivate
InstanceTgstation.Server.Host.Controllers.ApiControllerprotected
LoggerTgstation.Server.Host.Controllers.ApiControllerprotected
OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)Tgstation.Server.Host.Controllers.ApiController
systemIdentityFactoryTgstation.Server.Host.Controllers.HomeControllerprivate
tokenFactoryTgstation.Server.Host.Controllers.HomeControllerprivate
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html new file mode 100644 index 0000000000..ea4c366077 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html @@ -0,0 +1,553 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Controllers.HomeController Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Controllers.HomeController Class Reference
+
+
+ +

Main ApiController for the Application + More...

+
+Inheritance diagram for Tgstation.Server.Host.Controllers.HomeController:
+
+
+ + +Tgstation.Server.Host.Controllers.ApiController +Controller + +
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

 HomeController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ITokenFactory tokenFactory, ISystemIdentityFactory systemIdentityFactory, ICryptographySuite cryptographySuite, IApplication application, IIdentityCache identityCache, IBrowserResolver browserResolver, IOptions< ControlPanelConfiguration > controlPanelConfigurationOptions, ILogger< HomeController > logger)
 Construct a HomeController More...
 
IActionResult Home ()
 Main page of the Application More...
 
async Task< IActionResult > CreateToken (CancellationToken cancellationToken)
 Attempt to authenticate a User using ApiController.ApiHeaders More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Controllers.ApiController
 ApiController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance, bool requireHeaders)
 Construct an ApiController More...
 
override async Task OnActionExecutionAsync (ActionExecutingContext context, ActionExecutionDelegate next)
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

readonly ITokenFactory tokenFactory
 The ITokenFactory for the HomeController More...
 
readonly ISystemIdentityFactory systemIdentityFactory
 The ISystemIdentityFactory for the HomeController More...
 
readonly ICryptographySuite cryptographySuite
 The ICryptographySuite for the HomeController More...
 
readonly IApplication application
 The IApplication for the HomeController More...
 
readonly IIdentityCache identityCache
 The IIdentityCache for the HomeController More...
 
readonly IBrowserResolver browserResolver
 The IBrowserResolver for the HomeController More...
 
readonly ControlPanelConfiguration controlPanelConfiguration
 The ControlPanelConfiguration for the HomeController More...
 
+ + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Properties inherited from Tgstation.Server.Host.Controllers.ApiController
ApiHeaders ApiHeaders [get, private set]
 The ApiHeaders for the operation More...
 
IDatabaseContext DatabaseContext [get]
 The IDatabaseContext for the operation More...
 
IAuthenticationContext AuthenticationContext [get]
 The IAuthenticationContext for the operation More...
 
ILogger Logger [get]
 The ILogger for the ApiController More...
 
Models.Instance Instance [get]
 The Instance for the operation More...
 
+

Detailed Description

+

Main ApiController for the Application

+ +

Definition at line 24 of file HomeController.cs.

+

Constructor & Destructor Documentation

+ +

◆ HomeController()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Controllers.HomeController.HomeController (IDatabaseContext databaseContext,
IAuthenticationContextFactory authenticationContextFactory,
ITokenFactory tokenFactory,
ISystemIdentityFactory systemIdentityFactory,
ICryptographySuite cryptographySuite,
IApplication application,
IIdentityCache identityCache,
IBrowserResolver browserResolver,
IOptions< ControlPanelConfigurationcontrolPanelConfigurationOptions,
ILogger< HomeControllerlogger 
)
+
+ +

Construct a HomeController

+
Parameters
+ + + + + + + + + + + +
databaseContextThe IDatabaseContext for the ApiController
authenticationContextFactoryThe IAuthenticationContextFactory for the ApiController
tokenFactoryThe value of tokenFactory
systemIdentityFactoryThe value of systemIdentityFactory
cryptographySuiteThe value of cryptographySuite
applicationThe value of application
identityCacheThe value of identityCache
browserResolverThe value of browserResolver
controlPanelConfigurationOptionsThe IOptions<TOptions> containing the value of controlPanelConfiguration
loggerThe ILogger for the ApiController
+
+
+ +

Definition at line 74 of file HomeController.cs.

+
74  : base(databaseContext, authenticationContextFactory, logger, false, false)
75  {
76  this.tokenFactory = tokenFactory ?? throw new ArgumentNullException(nameof(tokenFactory));
77  this.systemIdentityFactory = systemIdentityFactory ?? throw new ArgumentNullException(nameof(systemIdentityFactory));
78  this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
79  this.application = application ?? throw new ArgumentNullException(nameof(application));
80  this.identityCache = identityCache ?? throw new ArgumentNullException(nameof(identityCache));
81  this.browserResolver = browserResolver ?? throw new ArgumentNullException(nameof(browserResolver));
82  controlPanelConfiguration = controlPanelConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(controlPanelConfigurationOptions));
83  }
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the HomeController
+
readonly ControlPanelConfiguration controlPanelConfiguration
The ControlPanelConfiguration for the HomeController
+
readonly IApplication application
The IApplication for the HomeController
+
readonly IIdentityCache identityCache
The IIdentityCache for the HomeController
+
readonly IBrowserResolver browserResolver
The IBrowserResolver for the HomeController
+
readonly ISystemIdentityFactory systemIdentityFactory
The ISystemIdentityFactory for the HomeController
+
readonly ITokenFactory tokenFactory
The ITokenFactory for the HomeController
+
+

References Tgstation.Server.Host.Controllers.HomeController.application, Tgstation.Server.Host.Controllers.HomeController.browserResolver, Tgstation.Server.Host.Controllers.HomeController.controlPanelConfiguration, Tgstation.Server.Host.Controllers.HomeController.cryptographySuite, Tgstation.Server.Host.Controllers.HomeController.identityCache, Tgstation.Server.Host.Controllers.HomeController.systemIdentityFactory, and Tgstation.Server.Host.Controllers.HomeController.tokenFactory.

+ +
+
+

Member Function Documentation

+ +

◆ CreateToken()

+ +
+
+ + + + + + + + +
async Task<IActionResult> Tgstation.Server.Host.Controllers.HomeController.CreateToken (CancellationToken cancellationToken)
+
+ +

Attempt to authenticate a User using ApiController.ApiHeaders

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the IActionResult of the operation
+ +

Definition at line 118 of file HomeController.cs.

+
119  {
120  if (ApiHeaders == null)
121  return BadRequest(new Api.Models.ErrorMessage { Message = "Missing API headers!" });
122 
124  return BadRequest(new Api.Models.ErrorMessage { Message = "Cannot create a token using another token!" });
125 
126  ISystemIdentity systemIdentity;
127  try
128  {
129  // trust the system over the database because a user's name can change while still having the same SID
130  systemIdentity = await systemIdentityFactory.CreateSystemIdentity(ApiHeaders.Username, ApiHeaders.Password, cancellationToken).ConfigureAwait(false);
131  }
132  catch (NotImplementedException)
133  {
134  systemIdentity = null;
135  }
136 
137  using (systemIdentity)
138  {
139  IQueryable<User> query;
140  if (systemIdentity == null)
141  query = DatabaseContext.Users.Where(x => x.CanonicalName == ApiHeaders.Username.ToUpperInvariant());
142  else
143  query = DatabaseContext.Users.Where(x => x.SystemIdentifier == systemIdentity.Uid);
144  var user = await query.Select(x => new User
145  {
146  Id = x.Id,
147  PasswordHash = x.PasswordHash,
148  Enabled = x.Enabled,
149  Name = x.Name
150  }).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
151 
152  if (user == null)
153  return Unauthorized();
154 
155  if (systemIdentity == null)
156  {
157  var originalHash = user.PasswordHash;
159  return Unauthorized();
160  if (user.PasswordHash != originalHash)
161  {
162  Logger.LogDebug("User ID {0}'s password hash needs a refresh, updating database.", user.Id);
163  var updatedUser = new User
164  {
165  Id = user.Id
166  };
167  DatabaseContext.Users.Attach(updatedUser);
168  updatedUser.PasswordHash = user.PasswordHash;
169  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
170  }
171  }
172 
173  // check if the name changed and updoot accordingly
174  else if (systemIdentity.Username != user.Name)
175  {
176  Logger.LogDebug("User ID {0}'s system identity needs a refresh, updating database.", user.Id);
177  DatabaseContext.Users.Attach(user);
178  user.Name = systemIdentity.Username;
179  user.CanonicalName = user.Name.ToUpperInvariant();
180  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
181  }
182 
183  // Now that the bookeeping is done, tell them to fuck off if necessary
184  if (!user.Enabled.Value)
185  return Forbid();
186 
187  var token = await tokenFactory.CreateToken(user, cancellationToken).ConfigureAwait(false);
188  if (systemIdentity != null)
189  {
190  // expire the identity slightly after the auth token in case of lag
191  var identExpiry = token.ExpiresAt.Value;
192  identExpiry += tokenFactory.ValidationParameters.ClockSkew;
193  identExpiry += TimeSpan.FromSeconds(15);
194  identityCache.CacheSystemIdentity(user, systemIdentity, identExpiry);
195  }
196 
197  Logger.LogDebug("Successfully logged in user {0}!", user.Id);
198 
199  return Json(token);
200  }
201  }
bool CheckUserPassword(User user, string password)
Checks a given password matches a given user 's User.PasswordHash. This may result in User....
+
Task< ISystemIdentity > CreateSystemIdentity(User user, CancellationToken cancellationToken)
Create a ISystemIdentity for a given user
+
Task< Token > CreateToken(Models.User user, CancellationToken cancellationToken)
Create a Token for a given user
+ +
Represents a user on the current System.Runtime.InteropServices.OSPlatform
+
string Username
The client's username
Definition: ApiHeaders.cs:86
+
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the HomeController
+
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
string Password
The client's password
Definition: ApiHeaders.cs:91
+ +
readonly IIdentityCache identityCache
The IIdentityCache for the HomeController
+
bool IsTokenAuthentication
If the header uses password or JWT authentication
Definition: ApiHeaders.cs:96
+ + +
TokenValidationParameters ValidationParameters
The TokenValidationParameters for the ITokenFactory
+
long Id
The ID of the User
Definition: User.cs:15
+
ILogger Logger
The ILogger for the ApiController
+
void CacheSystemIdentity(User user, ISystemIdentity systemIdentity, DateTimeOffset expiry)
Keep a user 's systemIdentity alive until an expiry time
+
readonly ISystemIdentityFactory systemIdentityFactory
The ISystemIdentityFactory for the HomeController
+
readonly ITokenFactory tokenFactory
The ITokenFactory for the HomeController
+
string Uid
A unique identifier for the user
+
+

References Tgstation.Server.Host.Security.IIdentityCache.CacheSystemIdentity(), Tgstation.Server.Host.Security.ICryptographySuite.CheckUserPassword(), Tgstation.Server.Host.Security.ISystemIdentityFactory.CreateSystemIdentity(), Tgstation.Server.Host.Security.ITokenFactory.CreateToken(), Tgstation.Server.Host.Controllers.HomeController.cryptographySuite, Tgstation.Server.Api.Models.Internal.User.Id, Tgstation.Server.Host.Controllers.HomeController.identityCache, Tgstation.Server.Api.ApiHeaders.IsTokenAuthentication, Tgstation.Server.Host.Controllers.ApiController.Logger, Tgstation.Server.Api.ApiHeaders.Password, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save(), Tgstation.Server.Host.Controllers.HomeController.systemIdentityFactory, Tgstation.Server.Host.Controllers.HomeController.tokenFactory, Tgstation.Server.Host.Security.ISystemIdentity.Uid, Tgstation.Server.Host.Security.ISystemIdentity.Username, Tgstation.Server.Api.ApiHeaders.Username, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Users, and Tgstation.Server.Host.Security.ITokenFactory.ValidationParameters.

+ +
+
+ +

◆ Home()

+ +
+
+ + + + + + + +
IActionResult Tgstation.Server.Host.Controllers.HomeController.Home ()
+
+ +

Main page of the Application

+
Returns
The Api.Models.ServerInformation of the Application if a properly authenticated API request, the web control panel if on a browser and enabled, UnauthorizedResult otherwise
+ +

Definition at line 92 of file HomeController.cs.

+
93  {
94  if (AuthenticationContext != null)
95  return Json(new Api.Models.ServerInformation
96  {
97  Version = application.Version,
98  ApiVersion = ApiHeaders.Version
99  });
100 
101  // if we are using a browser and the control panel, soft redirect to the app page
102  if (controlPanelConfiguration.Enable && browserResolver.Browser.Type != BrowserType.Generic)
103  {
104  Logger.LogDebug("Unauthorized browser request (User-Agent: \"{0}\"), loading control panel...", browserResolver.UserAgent);
105  return File("~/index.html", MediaTypeNames.Text.Html);
106  }
107 
108  return Unauthorized();
109  }
+ +
readonly ControlPanelConfiguration controlPanelConfiguration
The ControlPanelConfiguration for the HomeController
+
ILogger Logger
The ILogger for the ApiController
+
readonly IBrowserResolver browserResolver
The IBrowserResolver for the HomeController
+
+

References Tgstation.Server.Host.Controllers.HomeController.browserResolver, Tgstation.Server.Host.Controllers.HomeController.controlPanelConfiguration, Tgstation.Server.Host.Configuration.ControlPanelConfiguration.Enable, and Tgstation.Server.Host.Controllers.ApiController.Logger.

+ +
+
+

Member Data Documentation

+ +

◆ application

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Controllers.HomeController.application
+
+private
+
+ +

The IApplication for the HomeController

+ +

Definition at line 44 of file HomeController.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.HomeController.HomeController().

+ +
+
+ +

◆ browserResolver

+ +
+
+ + + + + +
+ + + + +
readonly IBrowserResolver Tgstation.Server.Host.Controllers.HomeController.browserResolver
+
+private
+
+
+ +

◆ controlPanelConfiguration

+ +
+
+ + + + + +
+ + + + +
readonly ControlPanelConfiguration Tgstation.Server.Host.Controllers.HomeController.controlPanelConfiguration
+
+private
+
+ +

The ControlPanelConfiguration for the HomeController

+ +

Definition at line 59 of file HomeController.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.HomeController.Home(), and Tgstation.Server.Host.Controllers.HomeController.HomeController().

+ +
+
+ +

◆ cryptographySuite

+ +
+
+ + + + + +
+ + + + +
readonly ICryptographySuite Tgstation.Server.Host.Controllers.HomeController.cryptographySuite
+
+private
+
+
+ +

◆ identityCache

+ +
+
+ + + + + +
+ + + + +
readonly IIdentityCache Tgstation.Server.Host.Controllers.HomeController.identityCache
+
+private
+
+
+ +

◆ systemIdentityFactory

+ +
+
+ + + + + +
+ + + + +
readonly ISystemIdentityFactory Tgstation.Server.Host.Controllers.HomeController.systemIdentityFactory
+
+private
+
+
+ +

◆ tokenFactory

+ +
+
+ + + + + +
+ + + + +
readonly ITokenFactory Tgstation.Server.Host.Controllers.HomeController.tokenFactory
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.png b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..796ebd770fce71003bf5059d0dd806dbfac2b045 GIT binary patch literal 1356 zcmeAS@N?(olHy`uVBq!ia0y~yU{nFJJ2;quWMyC4e;_3h;1lBd|38TN;?396{zDUh zEHFNB-~emq9eE&^qa?^Lm;tB=1g@S6F=Aj~x$WuV7*fIbcJ9r*H3kB#r;i8y`#)Jf z@pIeDnVu$|CH^kH2WI5$-m`a7@j12UbDmF7J?U|Y$9vKe1|-}dKV`}^d(W&FUek_m z>{Ho0b^hcnWpxG#p4ZK`aZa7~|M%abXs_#Czvo29dt93Rv(mG@`|R;$OQuXa^tV-I z@9g`^D}S0#RPnSwaDT#<_aCQ;oLO=@H*V6s1Lx=G#pO*hNsf1ZDzp0A`_OMN@#dx%)4FXSIZ}fYz}>`J^%dl#$(^^sAk_=%OB5Y zb!N%#g3Sie!77?h;x3ggSgx}4^@DgWtBG4y{NM9armGApTBj4bj`9|VRiSE;sv%>{T;8HU&Q2<{wUhDSLTabP`dY|e@gdn{mS+f5B8h% zPauCniI27Cui1N?C#gsRQzQFE6;G}WP#mH1bk63Jmd`aA_V@5JFdH17#PIItj}58~ z(K?(D<{h1=%XlZzlR+_zMIgbGfpHp@sSn($OQ%fo)Ld$*0<`<^BnBoOPK5&y>cNDP zoW~A3PdzRw*De0T@u16=KOp}3=hOuoZ7-)>e|UJA-IRs1Jj(^sPG0|XT<5O$F1{~w zC+(Y%IAP0;e|vsT**D9+e%qz5<+av6Ey{O5v0q)d$70d;!+}e06s_02@7;bN)_azl zTvA_t{OJP4%=6LlDyKq2E#}PYwYG{=)i(9gZ=2BjW*=|t3B3aOg_%#xHiZ_)oivyj z;xz3KFa;zum;~9I?Y^htdb`!|*p1e@x-Spg-S$s<=oWPKtMX@H641N4#BO?;@%i5i z^)%;Az4ByM>-*LF=R9<~^tR}=RrvaSUYD+3yHi)U`A$=zochCe0onfm4o$({`TKn#n;?j=)#j5L>;Je5Dl XUe@{Q;oAMcqL0DT)z4*}Q$iB}@NHv| literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller-members.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller-members.html new file mode 100644 index 0000000000..de0260b8a8 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller-members.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Controllers.InstanceController Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Controllers.InstanceController, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + +
applicationTgstation.Server.Host.Controllers.InstanceControllerprivate
Create([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.InstanceController
ModelController< Api.Models.Instance >.Create([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Api.Models.Instance >virtual
Delete(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.InstanceControllervirtual
GetId(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.InstanceControllervirtual
InstanceAdminUser()Tgstation.Server.Host.Controllers.InstanceControllerprivate
InstanceAttachFileNameTgstation.Server.Host.Controllers.InstanceControllerprivate
InstanceController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, IIOManager ioManager, IApplication application, IPlatformIdentifier platformIdentifier, ILogger< InstanceController > logger)Tgstation.Server.Host.Controllers.InstanceController
instanceManagerTgstation.Server.Host.Controllers.InstanceControllerprivate
ioManagerTgstation.Server.Host.Controllers.InstanceControllerprivate
jobManagerTgstation.Server.Host.Controllers.InstanceControllerprivate
List(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.InstanceControllervirtual
ModelController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)Tgstation.Server.Host.Controllers.ModelController< Api.Models.Instance >
MoveInstanceJobPrefixTgstation.Server.Host.Controllers.InstanceControllerprivate
NormalizeModelPath(Api.Models.Instance model, out string absolutePath)Tgstation.Server.Host.Controllers.InstanceControllerprivate
platformIdentifierTgstation.Server.Host.Controllers.InstanceControllerprivate
Read(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Api.Models.Instance >virtual
Update([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.InstanceController
ModelController< Api.Models.Instance >.Update([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Api.Models.Instance >virtual
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html new file mode 100644 index 0000000000..c582cfd11d --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html @@ -0,0 +1,803 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Controllers.InstanceController Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Controllers.InstanceController Class Reference
+
+
+ +

Controller for managing Components.Instances + More...

+
+Inheritance diagram for Tgstation.Server.Host.Controllers.InstanceController:
+
+
+ + +Tgstation.Server.Host.Controllers.ModelController< Api.Models.Instance > + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 InstanceController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, IIOManager ioManager, IApplication application, IPlatformIdentifier platformIdentifier, ILogger< InstanceController > logger)
 Construct a InstanceController More...
 
override async Task< IActionResult > Create ([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
 
override async Task< IActionResult > Delete (long id, CancellationToken cancellationToken)
 Attempt to delete a model with a particular id More...
 
override async Task< IActionResult > Update ([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
 
override async Task< IActionResult > List (CancellationToken cancellationToken)
 Attempt to list entries of the TModel More...
 
override async Task< IActionResult > GetId (long id, CancellationToken cancellationToken)
 Attempt to get a specific a TModel More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Controllers.ModelController< Api.Models.Instance >
 ModelController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)
 Construct a ModelController<TModel> More...
 
virtual Task< IActionResult > Create ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to create a model More...
 
virtual Task< IActionResult > Read (CancellationToken cancellationToken)
 Attempt to read a TModel More...
 
virtual Task< IActionResult > Update ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to update a model More...
 
+ + + + + +

+Private Member Functions

void NormalizeModelPath (Api.Models.Instance model, out string absolutePath)
 
Models.InstanceUser InstanceAdminUser ()
 
+ + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

const string InstanceAttachFileName = "TGS4_ALLOW_INSTANCE_ATTACH"
 File name to allow attaching instances More...
 
const string MoveInstanceJobPrefix = "Move instance ID "
 
readonly IJobManager jobManager
 The IJobManager for the InstanceController More...
 
readonly IInstanceManager instanceManager
 The IInstanceManager for the InstanceController More...
 
readonly IIOManager ioManager
 The IIOManager for the InstanceController More...
 
readonly IApplication application
 The IApplication for the InstanceController More...
 
readonly IPlatformIdentifier platformIdentifier
 The IPlatformIdentifier for the InstanceController More...
 
+

Detailed Description

+

Controller for managing Components.Instances

+ +

Definition at line 30 of file InstanceController.cs.

+

Constructor & Destructor Documentation

+ +

◆ InstanceController()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Controllers.InstanceController.InstanceController (IDatabaseContext databaseContext,
IAuthenticationContextFactory authenticationContextFactory,
IJobManager jobManager,
IInstanceManager instanceManager,
IIOManager ioManager,
IApplication application,
IPlatformIdentifier platformIdentifier,
ILogger< InstanceControllerlogger 
)
+
+ +

Construct a InstanceController

+
Parameters
+ + + + + + + + + +
databaseContextThe IDatabaseContext for the ApiController
authenticationContextFactoryThe IAuthenticationContextFactory for the ApiController
jobManagerThe value of jobManager
instanceManagerThe value of instanceManager
ioManagerThe value of ioManager
applicationThe value of application
platformIdentifierThe value of platformIdentifier
loggerThe ILogger for the ApiController
+
+
+ +

Definition at line 75 of file InstanceController.cs.

+
75  : base(databaseContext, authenticationContextFactory, logger, false)
76  {
77  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
78  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
79  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
80  this.application = application ?? throw new ArgumentNullException(nameof(application));
81  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
82  }
readonly IInstanceManager instanceManager
The IInstanceManager for the InstanceController
+
readonly IApplication application
The IApplication for the InstanceController
+
readonly IIOManager ioManager
The IIOManager for the InstanceController
+
readonly IJobManager jobManager
The IJobManager for the InstanceController
+
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the InstanceController
+
+

References Tgstation.Server.Host.Controllers.InstanceController.application, Tgstation.Server.Host.Controllers.InstanceController.instanceManager, Tgstation.Server.Host.Controllers.InstanceController.ioManager, Tgstation.Server.Host.Controllers.InstanceController.jobManager, and Tgstation.Server.Host.Controllers.InstanceController.platformIdentifier.

+ +
+
+

Member Function Documentation

+ +

◆ Create()

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.InstanceController.Create ([FromBody] Api.Models.Instance model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 113 of file InstanceController.cs.

+
114  {
115  if (model == null)
116  throw new ArgumentNullException(nameof(model));
117 
118  if (String.IsNullOrWhiteSpace(model.Name))
119  return BadRequest(new ErrorMessage { Message = "name must not be empty!" });
120 
121  if (model.Path == null)
122  return BadRequest(new ErrorMessage { Message = "path must not be empty!" });
123 
124  NormalizeModelPath(model, out var rawPath);
125 
126  var localPath = ioManager.ResolvePath(".");
127  NormalizeModelPath(new Api.Models.Instance
128  {
129  Path = localPath
130  }, out var normalizedLocalPath);
131 
132  if (rawPath.StartsWith(normalizedLocalPath, StringComparison.Ordinal))
133  return Conflict("Instances cannot be created in the installation directory!");
134 
135  var dirExistsTask = ioManager.DirectoryExists(model.Path, cancellationToken);
136  bool attached = false;
137  if (await ioManager.FileExists(model.Path, cancellationToken).ConfigureAwait(false) || await dirExistsTask.ConfigureAwait(false))
138  if (!await ioManager.FileExists(ioManager.ConcatPath(model.Path, InstanceAttachFileName), cancellationToken).ConfigureAwait(false))
139  return Conflict(new ErrorMessage { Message = "Path not empty!" });
140  else
141  attached = true;
142 
143  var newInstance = new Models.Instance
144  {
145  ConfigurationType = model.ConfigurationType ?? ConfigurationType.Disallowed,
147  {
148  AllowWebClient = false,
149  AutoStart = false,
150  PrimaryPort = 1337,
151  SecondaryPort = 1338,
152  SecurityLevel = DreamDaemonSecurity.Safe,
153  SoftRestart = false,
154  SoftShutdown = false,
155  StartupTimeout = 20
156  },
158  {
159  ApiValidationPort = 1339,
160  ApiValidationSecurityLevel = DreamDaemonSecurity.Safe
161  },
162  Name = model.Name,
163  Online = false,
164  Path = model.Path,
165  AutoUpdateInterval = model.AutoUpdateInterval ?? 0,
167  {
168  CommitterEmail = "tgstation-server@users.noreply.github.com",
169  CommitterName = application.VersionPrefix,
170  PushTestMergeCommits = false,
171  ShowTestMergeCommitters = false,
172  AutoUpdatesKeepTestMerges = false,
173  AutoUpdatesSynchronize = false,
174  PostTestMergeComment = false
175  },
176  InstanceUsers = new List<Models.InstanceUser> // give this user full privileges on the instance
177  {
179  }
180  };
181 
182  DatabaseContext.Instances.Add(newInstance);
183  try
184  {
185  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
186 
187  try
188  {
189  // actually reserve it now
190  await ioManager.CreateDirectory(rawPath, cancellationToken).ConfigureAwait(false);
191  await ioManager.DeleteFile(ioManager.ConcatPath(rawPath, InstanceAttachFileName), cancellationToken).ConfigureAwait(false);
192  }
193  catch
194  {
195  // oh shit delete the model
196  DatabaseContext.Instances.Remove(newInstance);
197 
198  await DatabaseContext.Save(default).ConfigureAwait(false);
199  throw;
200  }
201  }
202  catch (IOException e)
203  {
204  return Conflict(new ErrorMessage { Message = e.Message });
205  }
206  catch (DbUpdateException e)
207  {
208  return Conflict(new ErrorMessage { Message = e.Message });
209  }
210 
211  Logger.LogInformation("{0} {1} instance {2}: {3} ({4})", AuthenticationContext.User.Name, attached ? "attached" : "created", newInstance.Name, newInstance.Id, newInstance.Path);
212 
213  var api = newInstance.ToApi();
214  return attached ? (IActionResult)Json(api) : StatusCode((int)HttpStatusCode.Created, api);
215  }
string Name
The name of the User
Definition: User.cs:38
+ + +
User can enable Models.Internal.DreamDaemonSettings.SoftRestart
+ + +
const string InstanceAttachFileName
File name to allow attaching instances
+
readonly IApplication application
The IApplication for the InstanceController
+ +
string VersionPrefix
Prefix to VersionString
Definition: IApplication.cs:13
+ +
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
ConfigurationType
The type of configuration allowed on an Instance
+
Task CreateDirectory(string path, CancellationToken cancellationToken)
Create a directory at path
+
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
readonly IIOManager ioManager
The IIOManager for the InstanceController
+
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists
+
string Message
A human readable description of the error
Definition: ErrorMessage.cs:13
+ +
override async Task< IActionResult > List(CancellationToken cancellationToken)
Attempt to list entries of the TModel
+
DreamDaemonSecurity
DreamDaemon's security level
+
Task DeleteFile(string path, CancellationToken cancellationToken)
Deletes a file at path
+
void NormalizeModelPath(Api.Models.Instance model, out string absolutePath)
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
User can enable Models.Internal.DreamDaemonSettings.SoftShutdown
+ +
Task< bool > DirectoryExists(string path, CancellationToken cancellationToken)
Check that the directory at path exists
+ +
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
+

References Tgstation.Server.Host.Controllers.InstanceController.application, Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.IO.IIOManager.CreateDirectory(), Tgstation.Server.Host.IO.IIOManager.DeleteFile(), Tgstation.Server.Host.IO.IIOManager.DirectoryExists(), Tgstation.Server.Host.IO.IIOManager.FileExists(), Tgstation.Server.Host.Controllers.InstanceController.InstanceAdminUser(), Tgstation.Server.Host.Controllers.InstanceController.InstanceAttachFileName, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Instances, Tgstation.Server.Host.Controllers.InstanceController.ioManager, Tgstation.Server.Host.Controllers.InstanceController.List(), Tgstation.Server.Api.Models.ErrorMessage.Message, Tgstation.Server.Api.Models.Internal.User.Name, Tgstation.Server.Host.Controllers.InstanceController.NormalizeModelPath(), Tgstation.Server.Api.Models.Online, Tgstation.Server.Host.IO.IIOManager.ResolvePath(), Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save(), Tgstation.Server.Api.Rights.SoftRestart, Tgstation.Server.Api.Rights.SoftShutdown, Tgstation.Server.Host.Security.AuthenticationContext.User, and Tgstation.Server.Host.Core.IApplication.VersionPrefix.

+ +
+
+ +

◆ Delete()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.InstanceController.Delete (long id,
CancellationToken cancellationToken 
)
+
+virtual
+
+ +

Attempt to delete a model with a particular id

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< Api.Models.Instance >.

+ +

Definition at line 219 of file InstanceController.cs.

+
220  {
221  var originalModel = await DatabaseContext.Instances.Where(x => x.Id == id)
222  .Include(x => x.WatchdogReattachInformation)
223  .Include(x => x.WatchdogReattachInformation.Alpha)
224  .Include(x => x.WatchdogReattachInformation.Bravo)
225  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
226  if (originalModel == default)
227  return StatusCode((int)HttpStatusCode.Gone);
228  if (originalModel.Online.Value)
229  return Conflict(new ErrorMessage
230  {
231  Message = "Cannot detach an online instance!"
232  });
233 
234  if (originalModel.WatchdogReattachInformation != null)
235  {
236  DatabaseContext.WatchdogReattachInformations.Remove(originalModel.WatchdogReattachInformation);
237  if (originalModel.WatchdogReattachInformation.Alpha != null)
238  DatabaseContext.ReattachInformations.Remove(originalModel.WatchdogReattachInformation.Alpha);
239  if (originalModel.WatchdogReattachInformation.Bravo != null)
240  DatabaseContext.ReattachInformations.Remove(originalModel.WatchdogReattachInformation.Bravo);
241  }
242 
243  DatabaseContext.Instances.Remove(originalModel);
244 
245  var attachFileName = ioManager.ConcatPath(originalModel.Path, InstanceAttachFileName);
246  await ioManager.WriteAllBytes(attachFileName, Array.Empty<byte>(), default).ConfigureAwait(false);
247  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false); // cascades everything
248  return Ok();
249  }
DbSet< ReattachInformation > ReattachInformations
+
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+
const string InstanceAttachFileName
File name to allow attaching instances
+ +
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
readonly IIOManager ioManager
The IIOManager for the InstanceController
+ +
DbSet< WatchdogReattachInformation > WatchdogReattachInformations
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
+

References Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.Controllers.InstanceController.InstanceAttachFileName, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Instances, Tgstation.Server.Host.Controllers.InstanceController.ioManager, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.ReattachInformations, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save(), Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.WatchdogReattachInformations, and Tgstation.Server.Host.IO.IIOManager.WriteAllBytes().

+ +
+
+ +

◆ GetId()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.InstanceController.GetId (long id,
CancellationToken cancellationToken 
)
+
+virtual
+
+ +

Attempt to get a specific a TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< Api.Models.Instance >.

+ +

Definition at line 423 of file InstanceController.cs.

+
424  {
425  var query = DatabaseContext.Instances.Where(x => x.Id == id);
426  var cantList = !AuthenticationContext.User.InstanceManagerRights.Value.HasFlag(InstanceManagerRights.List);
427 
428  if (cantList)
429  query = query.Include(x => x.InstanceUsers);
430 
431  var moveJobTask = query
432  .SelectMany(x => x.Jobs)
433 #pragma warning disable CA1307 // Specify StringComparison
434  .Where(x => !x.StoppedAt.HasValue && x.Description.StartsWith(MoveInstanceJobPrefix))
435 #pragma warning restore CA1307 // Specify StringComparison
436  .Include(x => x.StartedBy).ThenInclude(x => x.CreatedBy)
437  .FirstOrDefaultAsync(cancellationToken);
438  var instance = await query.FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
439 
440  if (instance == null)
441  return StatusCode((int)HttpStatusCode.Gone);
442 
443  if (cantList && !instance.InstanceUsers.Any(x => x.UserId == AuthenticationContext.User.Id && x.AnyRights))
444  return Forbid();
445 
446  var api = instance.ToApi();
447  api.MoveJob = (await moveJobTask.ConfigureAwait(false))?.ToApi();
448  return Json(api);
449  }
+ +
InstanceManagerRights
Rights for managing Models.Instances
+ +
InstanceManagerRights? InstanceManagerRights
The Rights.InstanceManagerRights for the User
Definition: User.cs:50
+
long Id
The ID of the User
Definition: User.cs:15
+ + +
+

References Tgstation.Server.Api.Models.Internal.User.Id, Tgstation.Server.Api.Models.Internal.User.InstanceManagerRights, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Instances, and Tgstation.Server.Host.Security.AuthenticationContext.User.

+ +
+
+ +

◆ InstanceAdminUser()

+ +
+
+ + + + + +
+ + + + + + + +
Models.InstanceUser Tgstation.Server.Host.Controllers.InstanceController.InstanceAdminUser ()
+
+private
+
+
+ +

◆ List()

+ +
+
+ + + + + +
+ + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.InstanceController.List (CancellationToken cancellationToken)
+
+virtual
+
+ +

Attempt to list entries of the TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< Api.Models.Instance >.

+ +

Definition at line 399 of file InstanceController.cs.

+
400  {
401  IQueryable<Models.Instance> query = DatabaseContext.Instances;
403  query = query.Where(x => x.InstanceUsers.Any(y => y.UserId == AuthenticationContext.User.Id)).Where(x => x.InstanceUsers.Any(y => y.AnyRights));
404 
405  var moveJobTasks = query
406  .SelectMany(x => x.Jobs)
407 #pragma warning disable CA1307 // Specify StringComparison
408  .Where(x => !x.StoppedAt.HasValue && x.Description.StartsWith(MoveInstanceJobPrefix))
409 #pragma warning restore CA1307 // Specify StringComparison
410  .Include(x => x.StartedBy).ThenInclude(x => x.CreatedBy)
411  .Include(x => x.Instance)
412  .ToListAsync(cancellationToken);
413  var instances = await query.ToListAsync(cancellationToken).ConfigureAwait(false);
414  var apis = instances.Select(x => x.ToApi());
415  var moveJobs = await moveJobTasks.ConfigureAwait(false);
416  foreach(var I in moveJobs)
417  apis.Where(x => x.Id == I.Instance.Id).First().MoveJob = I.ToApi(); // if this .First() fails i will personally murder kevinz000 because I just know he is somehow responsible
418  return Json(apis);
419  }
+ +
InstanceManagerRights
Rights for managing Models.Instances
+ +
InstanceManagerRights? InstanceManagerRights
The Rights.InstanceManagerRights for the User
Definition: User.cs:50
+
long Id
The ID of the User
Definition: User.cs:15
+ + +
+

References Tgstation.Server.Api.Models.Internal.User.Id, Tgstation.Server.Api.Models.Internal.User.InstanceManagerRights, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Instances, and Tgstation.Server.Host.Security.AuthenticationContext.User.

+ +

Referenced by Tgstation.Server.Host.Controllers.InstanceController.Create().

+ +
+
+ +

◆ NormalizeModelPath()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void Tgstation.Server.Host.Controllers.InstanceController.NormalizeModelPath (Api.Models.Instance model,
out string absolutePath 
)
+
+private
+
+ +

Definition at line 84 of file InstanceController.cs.

+
85  {
86  if (model.Path == null)
87  {
88  absolutePath = null;
89  return;
90  }
91 
92  absolutePath = ioManager.ResolvePath(model.Path);
94  model.Path = absolutePath.ToUpperInvariant();
95  else
96  model.Path = absolutePath;
97  }
string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
readonly IIOManager ioManager
The IIOManager for the InstanceController
+
bool IsWindows
If the current platform is a Windows platform
+
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the InstanceController
+
+

References Tgstation.Server.Host.Controllers.InstanceController.ioManager, Tgstation.Server.Host.Core.IPlatformIdentifier.IsWindows, Tgstation.Server.Host.Controllers.InstanceController.platformIdentifier, and Tgstation.Server.Host.IO.IIOManager.ResolvePath().

+ +

Referenced by Tgstation.Server.Host.Controllers.InstanceController.Create().

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.InstanceController.Update ([FromBody] Api.Models.Instance model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 254 of file InstanceController.cs.

+
255  {
256  var instanceQuery = DatabaseContext.Instances.Where(x => x.Id == model.Id);
257 
258  var moveJob = await instanceQuery
259  .SelectMany(x => x.Jobs).
260 #pragma warning disable CA1307 // Specify StringComparison
261  Where(x => !x.StoppedAt.HasValue && x.Description.StartsWith(MoveInstanceJobPrefix))
262 #pragma warning restore CA1307 // Specify StringComparison
263  .Select(x => new Models.Job
264  {
265  Id = x.Id
266  }).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
267 
268  if (moveJob != default)
269  await jobManager.CancelJob(moveJob, AuthenticationContext.User, true, cancellationToken).ConfigureAwait(false); // cancel it now
270 
271  var usersInstanceUserTask = instanceQuery.SelectMany(x => x.InstanceUsers).Where(x => x.UserId == AuthenticationContext.User.Id).FirstOrDefaultAsync(cancellationToken);
272 
273  var originalModel = await instanceQuery
274  .Include(x => x.RepositorySettings)
275  .Include(x => x.ChatSettings)
276  .ThenInclude(x => x.Channels)
277  .Include(x => x.DreamDaemonSettings) // need these for onlining
278  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
279  if (originalModel == default(Models.Instance))
280  return StatusCode((int)HttpStatusCode.Gone);
281 
282  var userRights = (InstanceManagerRights)AuthenticationContext.GetRight(RightsType.InstanceManager);
283  bool CheckModified<T>(Expression<Func<Api.Models.Instance, T>> expression, InstanceManagerRights requiredRight)
284  {
285  var memberSelectorExpression = (MemberExpression)expression.Body;
286  var property = (PropertyInfo)memberSelectorExpression.Member;
287 
288  var newVal = property.GetValue(model);
289  if (newVal == null)
290  return false;
291  if (!userRights.HasFlag(requiredRight) && property.GetValue(originalModel) != newVal)
292  return true;
293 
294  property.SetValue(originalModel, newVal);
295  return false;
296  }
297 
298  string originalModelPath = null;
299  string rawPath = null;
300  if (model.Path != null)
301  {
302  NormalizeModelPath(model, out rawPath);
303 
304  if (model.Path != originalModel.Path)
305  {
306  if (!userRights.HasFlag(InstanceManagerRights.Relocate))
307  return Forbid();
308  if (originalModel.Online.Value && model.Online != true)
309  return Conflict(new ErrorMessage { Message = "Cannot relocate an online instance!" });
310 
311  var dirExistsTask = ioManager.DirectoryExists(model.Path, cancellationToken);
312  if (await ioManager.FileExists(model.Path, cancellationToken).ConfigureAwait(false) || await dirExistsTask.ConfigureAwait(false))
313  return Conflict(new ErrorMessage { Message = "Path not empty!" });
314 
315  originalModelPath = originalModel.Path;
316  originalModel.Path = model.Path;
317  }
318  }
319 
320  var oldAutoUpdateInterval = originalModel.AutoUpdateInterval.Value;
321  var originalOnline = originalModel.Online.Value;
322  var renamed = model.Name != null && originalModel.Name != model.Name;
323 
324  if (CheckModified(x => x.AutoUpdateInterval, InstanceManagerRights.SetAutoUpdate)
325  || CheckModified(x => x.ConfigurationType, InstanceManagerRights.SetConfiguration)
326  || CheckModified(x => x.Name, InstanceManagerRights.Rename)
327  || CheckModified(x => x.Online, InstanceManagerRights.SetOnline))
328  return Forbid();
329 
330  // ensure the current user has write privilege on the instance
331  var usersInstanceUser = await usersInstanceUserTask.ConfigureAwait(false);
332  if (usersInstanceUser == default)
333  {
334  var instanceAdminUser = InstanceAdminUser();
335  instanceAdminUser.InstanceId = originalModel.Id;
336  DatabaseContext.InstanceUsers.Add(instanceAdminUser);
337  }
338  else
339  usersInstanceUser.InstanceUserRights |= InstanceUserRights.WriteUsers;
340 
341  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
342 
343  if (renamed)
344  instanceManager.GetInstance(originalModel).Rename(originalModel.Name);
345 
346  var oldAutoStart = originalModel.DreamDaemonSettings.AutoStart;
347  try
348  {
349  if (originalOnline && model.Online == false)
350  await instanceManager.OfflineInstance(originalModel, AuthenticationContext.User, cancellationToken).ConfigureAwait(false);
351  else if (!originalOnline && model.Online == true)
352  {
353  // force autostart false here because we don't want any long running jobs right now
354  // remember to document this
355  originalModel.DreamDaemonSettings.AutoStart = false;
356  await instanceManager.OnlineInstance(originalModel, cancellationToken).ConfigureAwait(false);
357  }
358  }
359  catch (Exception e)
360  {
361  if(!(e is OperationCanceledException))
362  Logger.LogError("Error changing instance online state! Exception: {0}", e);
363  originalModel.Online = originalOnline;
364  originalModel.DreamDaemonSettings.AutoStart = oldAutoStart;
365  if (originalModelPath != null)
366  originalModel.Path = originalModelPath;
367  await DatabaseContext.Save(default).ConfigureAwait(false);
368  throw;
369  }
370 
371  var api = (AuthenticationContext.GetRight(RightsType.InstanceManager) & (ulong)InstanceManagerRights.Read) != 0 ? originalModel.ToApi() : new Api.Models.Instance
372  {
373  Id = originalModel.Id
374  };
375  if (originalModelPath != null)
376  {
377  var job = new Models.Job
378  {
379  Description = String.Format(CultureInfo.InvariantCulture, MoveInstanceJobPrefix + "{0} from {1} to {2}", originalModel.Id, originalModel.Path, rawPath),
380  Instance = originalModel,
381  CancelRightsType = RightsType.InstanceManager,
382  CancelRight = (ulong)InstanceManagerRights.Relocate,
383  StartedBy = AuthenticationContext.User
384  };
385 
386  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressHandler, ct) => instanceManager.MoveInstance(originalModel, rawPath, ct), cancellationToken).ConfigureAwait(false);
387  api.MoveJob = job.ToApi();
388  }
389 
390  if (originalModel.Online.Value && model.AutoUpdateInterval.HasValue && oldAutoUpdateInterval != model.AutoUpdateInterval)
391  await instanceManager.GetInstance(originalModel).SetAutoUpdateInterval(model.AutoUpdateInterval.Value).ConfigureAwait(false);
392 
393  return Json(api);
394  }
+ +
Task MoveInstance(Models.Instance metadata, string newPath, CancellationToken cancellationToken)
Move an IInstance
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
InstanceUserRights
Rights for an Models.Instance
+
readonly IInstanceManager instanceManager
The IInstanceManager for the InstanceController
+
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+ +
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+
Task RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
Registers a given Job and begins running it
+
readonly IIOManager ioManager
The IIOManager for the InstanceController
+
readonly IJobManager jobManager
The IJobManager for the InstanceController
+
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists
+
Task OfflineInstance(Models.Instance metadata, User user, CancellationToken cancellationToken)
Offline an IInstance
+
Task OnlineInstance(Models.Instance metadata, CancellationToken cancellationToken)
Online an IInstance
+
InstanceManagerRights
Rights for managing Models.Instances
+ + +
Task< bool > CancelJob(Job job, User user, bool blocking, CancellationToken cancellationToken)
Cancels a give job
+
void Rename(string newName)
Rename the IInstance
+
long Id
The ID of the User
Definition: User.cs:15
+
Metadata about a server instance
Definition: Instance.cs:9
+ +
void NormalizeModelPath(Api.Models.Instance model, out string absolutePath)
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
Task< bool > DirectoryExists(string path, CancellationToken cancellationToken)
Check that the directory at path exists
+ +
Task SetAutoUpdateInterval(uint newInterval)
Change the Api.Models.Instance.AutoUpdateInterval for the IInstance
+
+

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Instances, and Tgstation.Server.Host.Controllers.InstanceController.MoveInstanceJobPrefix.

+ +
+
+

Member Data Documentation

+ +

◆ application

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Controllers.InstanceController.application
+
+private
+
+
+ +

◆ InstanceAttachFileName

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Controllers.InstanceController.InstanceAttachFileName = "TGS4_ALLOW_INSTANCE_ATTACH"
+
+private
+
+ +

File name to allow attaching instances

+ +

Definition at line 35 of file InstanceController.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.InstanceController.Create(), and Tgstation.Server.Host.Controllers.InstanceController.Delete().

+ +
+
+ +

◆ instanceManager

+ +
+
+ + + + + +
+ + + + +
readonly IInstanceManager Tgstation.Server.Host.Controllers.InstanceController.instanceManager
+
+private
+
+ +

The IInstanceManager for the InstanceController

+ +

Definition at line 47 of file InstanceController.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.InstanceController.InstanceController().

+ +
+
+ +

◆ ioManager

+ + + +

◆ jobManager

+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Controllers.InstanceController.jobManager
+
+private
+
+ +

The IJobManager for the InstanceController

+ +

Definition at line 42 of file InstanceController.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.InstanceController.InstanceController().

+ +
+
+ +

◆ MoveInstanceJobPrefix

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Controllers.InstanceController.MoveInstanceJobPrefix = "Move instance ID "
+
+private
+
+ +

Definition at line 37 of file InstanceController.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.InstanceController.Update().

+ +
+
+ +

◆ platformIdentifier

+ +
+
+ + + + + +
+ + + + +
readonly IPlatformIdentifier Tgstation.Server.Host.Controllers.InstanceController.platformIdentifier
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.png b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..c92733fc8f7cfeac26837c9622c2d25e12931d40 GIT binary patch literal 1303 zcmeAS@N?(olHy`uVBq!ia0y~yVB7>`2XHV0N$)TQVIU^Z_k}_=G@OWO=rvh5WmB-Zg$T7`FV9u z_a*;0<~M2189nP+XX37G6qxiS?D&aajdqS^NA0z4rB41>`TS%4o&9ZZ9{!qj*SPq5 zzKm@8z9nhqCvE2Mv`9OlJX`+E#lKH_j=uP-^~huw=bp5ru5D5`mYkpM5w$)uMeER> z)Ax4oUUXLVORCx7Z_bnUDs5WH^)2Xf)lBi2b!xiS`IBFMdZf0*S-zM<(K$gnan|N) z>wn*-bl$cLzjOWMF{yGRquzt>@AGXk-Ldfox9NHv&$FlR?Ydla{7`tYbaM3B3sqLG zx7SPvR$F(!H0|fY>I$h-GS>=Md}cIaPSX1k#0 zJXmd6!Q5~EyuaTodo^We_>}Ft-~5fd=Kk!`3zK7uH|wzdT430wS5z=-jwz>gO7WXN z=V~`s%}QDS_sG3Dspr#Q_sN!jD`wO^tGDfQ=KFK=pE~Uup7^Nh*Is;jtfbLPc{b*G!eAmzZxF@Hl5mv?+En{G0!aQG+ohP?7n> zlKJzK*d}mE(ua(_E_q~Ho*(1WGa`W12ADV zglMHuL&2B-uGgZnmtKoHtt92ZsnCvY`b)Kx+&|1`w%)Vb_ceE$J<|*1bbFhZ=fdSs z=Z4~4`O{^66V5+2{kNN?Z{kt=E~U<%d~EE9|I=Jv_ssTJEPLp zy_VMA&mQ5^wQ~$vcC7k6ajmh@)fZ=OIb}Oc*ju{%XA0F0{8K|Y(P%U<`>(gw+QdJ&9xrruuJ=y@0!uLlPgg&ebxsLQ0EWX~fdBvi literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller-members.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller-members.html new file mode 100644 index 0000000000..ab54848cae --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller-members.html @@ -0,0 +1,96 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Controllers.InstanceUserController Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Controllers.InstanceUserController, including all inherited members.

+ + + + + + + + + + + + +
Create([FromBody] Api.Models.InstanceUser model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.InstanceUserController
ModelController< Api.Models.InstanceUser >.Create([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Api.Models.InstanceUser >virtual
Delete(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.InstanceUserControllervirtual
GetId(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.InstanceUserControllervirtual
InstanceUserController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger< InstanceUserController > logger)Tgstation.Server.Host.Controllers.InstanceUserController
List(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.InstanceUserControllervirtual
ModelController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)Tgstation.Server.Host.Controllers.ModelController< Api.Models.InstanceUser >
Read(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.InstanceUserControllervirtual
StandardModelChecks(Api.Models.InstanceUser model)Tgstation.Server.Host.Controllers.InstanceUserControllerprivate
Update([FromBody] Api.Models.InstanceUser model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.InstanceUserController
ModelController< Api.Models.InstanceUser >.Update([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Api.Models.InstanceUser >virtual
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html new file mode 100644 index 0000000000..7e80d2242d --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html @@ -0,0 +1,489 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Controllers.InstanceUserController Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Controllers.InstanceUserController Class Reference
+
+
+ +

For managing Users + More...

+
+Inheritance diagram for Tgstation.Server.Host.Controllers.InstanceUserController:
+
+
+ + +Tgstation.Server.Host.Controllers.ModelController< Api.Models.InstanceUser > + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 InstanceUserController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger< InstanceUserController > logger)
 Construct a UserController More...
 
override async Task< IActionResult > Create ([FromBody] Api.Models.InstanceUser model, CancellationToken cancellationToken)
 
override async Task< IActionResult > Update ([FromBody] Api.Models.InstanceUser model, CancellationToken cancellationToken)
 
override Task< IActionResult > Read (CancellationToken cancellationToken)
 Attempt to read a TModel More...
 
override async Task< IActionResult > List (CancellationToken cancellationToken)
 Attempt to list entries of the TModel More...
 
override async Task< IActionResult > GetId (long id, CancellationToken cancellationToken)
 Attempt to get a specific a TModel More...
 
override async Task< IActionResult > Delete (long id, CancellationToken cancellationToken)
 Attempt to delete a model with a particular id More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Controllers.ModelController< Api.Models.InstanceUser >
 ModelController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)
 Construct a ModelController<TModel> More...
 
virtual Task< IActionResult > Create ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to create a model More...
 
virtual Task< IActionResult > Update ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to update a model More...
 
+ + + + +

+Private Member Functions

BadRequestObjectResult StandardModelChecks (Api.Models.InstanceUser model)
 Checks a model for errors More...
 
+

Detailed Description

+

For managing Users

+ +

Definition at line 22 of file InstanceUserController.cs.

+

Constructor & Destructor Documentation

+ +

◆ InstanceUserController()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Controllers.InstanceUserController.InstanceUserController (IDatabaseContext databaseContext,
IAuthenticationContextFactory authenticationContextFactory,
ILogger< InstanceUserControllerlogger 
)
+
+ +

Construct a UserController

+
Parameters
+ + + + +
databaseContextThe IDatabaseContext for the ApiController
authenticationContextFactoryThe IAuthenticationContextFactory for the ApiController
loggerThe ILogger for the ApiController
+
+
+ +

Definition at line 30 of file InstanceUserController.cs.

+
30  : base(databaseContext, authenticationContextFactory, logger, true) // false instance requirement, we handle this ourself
31  { }
+
+
+

Member Function Documentation

+ +

◆ Create()

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.InstanceUserController.Create ([FromBody] Api.Models.InstanceUser model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 51 of file InstanceUserController.cs.

+
52  {
53  var test = StandardModelChecks(model);
54  if (test != null)
55  return test;
56 
57  var dbUser = new Models.InstanceUser
58  {
59  ByondRights = model.ByondRights ?? ByondRights.None,
60  ChatBotRights = model.ChatBotRights ?? ChatBotRights.None,
61  ConfigurationRights = model.ConfigurationRights ?? ConfigurationRights.None,
62  DreamDaemonRights = model.DreamDaemonRights ?? DreamDaemonRights.None,
63  DreamMakerRights = model.DreamMakerRights ?? DreamMakerRights.None,
64  RepositoryRights = model.RepositoryRights ?? RepositoryRights.None,
65  InstanceUserRights = model.InstanceUserRights ?? InstanceUserRights.None,
66  UserId = model.UserId,
67  InstanceId = Instance.Id
68  };
69 
70  DatabaseContext.InstanceUsers.Add(dbUser);
71 
72  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
73  return StatusCode((int)HttpStatusCode.Created, dbUser.ToApi());
74  }
ConfigurationRights
Rights for Models.ConfigurationFile
+
ByondRights
Rights for Models.Byond
Definition: ByondRights.cs:9
+
InstanceUserRights
Rights for an Models.Instance
+
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
DreamDaemonRights
Rights for Models.DreamDaemon
+
BadRequestObjectResult StandardModelChecks(Api.Models.InstanceUser model)
Checks a model for errors
+
DreamMakerRights
Rights for Models.DreamMaker
+ + +
RepositoryRights
Rights for a Models.Repository
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Metadata about a server instance
Definition: Instance.cs:9
+
ChatBotRights
Rights for Models.ChatBot
Definition: ChatBotRights.cs:9
+
+

References Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.InstanceUsers, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save(), and Tgstation.Server.Host.Controllers.InstanceUserController.StandardModelChecks().

+ +
+
+ +

◆ Delete()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.InstanceUserController.Delete (long id,
CancellationToken cancellationToken 
)
+
+virtual
+
+ +

Attempt to delete a model with a particular id

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< Api.Models.InstanceUser >.

+ +

Definition at line 130 of file InstanceUserController.cs.

+
131  {
132  await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).SelectMany(x => x.InstanceUsers).Where(x => x.UserId == id).DeleteAsync(cancellationToken).ConfigureAwait(false);
133  return Ok();
134  }
+ +
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Metadata about a server instance
Definition: Instance.cs:9
+
+

References Tgstation.Server.Api.Models.Instance.Id, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Instances.

+ +
+
+ +

◆ GetId()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.InstanceUserController.GetId (long id,
CancellationToken cancellationToken 
)
+
+virtual
+
+ +

Attempt to get a specific a TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< Api.Models.InstanceUser >.

+ +

Definition at line 119 of file InstanceUserController.cs.

+
120  {
121  // this functions as userId
122  var user = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).SelectMany(x => x.InstanceUsers).Where(x => x.UserId == id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
123  if (user == default)
124  return StatusCode((int)HttpStatusCode.Gone);
125  return Json(user.ToApi());
126  }
+ +
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Metadata about a server instance
Definition: Instance.cs:9
+
+

References Tgstation.Server.Api.Models.Instance.Id, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Instances.

+ +
+
+ +

◆ List()

+ +
+
+ + + + + +
+ + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.InstanceUserController.List (CancellationToken cancellationToken)
+
+virtual
+
+ +

Attempt to list entries of the TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< Api.Models.InstanceUser >.

+ +

Definition at line 111 of file InstanceUserController.cs.

+
112  {
113  var users = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).SelectMany(x => x.InstanceUsers).ToListAsync(cancellationToken).ConfigureAwait(false);
114  return Json(users.Select(x => x.ToApi()));
115  }
+ +
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Metadata about a server instance
Definition: Instance.cs:9
+
+

References Tgstation.Server.Api.Models.Instance.Id, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Instances.

+ +
+
+ +

◆ Read()

+ +
+
+ + + + + +
+ + + + + + + + +
override Task<IActionResult> Tgstation.Server.Host.Controllers.InstanceUserController.Read (CancellationToken cancellationToken)
+
+virtual
+
+ +

Attempt to read a TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< Api.Models.InstanceUser >.

+ +
+
+ +

◆ StandardModelChecks()

+ +
+
+ + + + + +
+ + + + + + + + +
BadRequestObjectResult Tgstation.Server.Host.Controllers.InstanceUserController.StandardModelChecks (Api.Models.InstanceUser model)
+
+private
+
+ +

Checks a model for errors

+
Parameters
+ + +
modelThe Api.Models.InstanceUser to check
+
+
+
Returns
A BadRequestResult explaining any errors, null if none
+ +

Definition at line 38 of file InstanceUserController.cs.

+
39  {
40  if (model == null)
41  throw new ArgumentNullException(nameof(model));
42 
43  if (!model.UserId.HasValue)
44  return BadRequest(new ErrorMessage { Message = "Missing UserId!" });
45 
46  return null;
47  }
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+

Referenced by Tgstation.Server.Host.Controllers.InstanceUserController.Create(), and Tgstation.Server.Host.Controllers.InstanceUserController.Update().

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.InstanceUserController.Update ([FromBody] Api.Models.InstanceUser model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 79 of file InstanceUserController.cs.

+
80  {
81  var test = StandardModelChecks(model);
82  if (test != null)
83  return test;
84 
85  var originalUser = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).SelectMany(x => x.InstanceUsers).Where(x => x.UserId == model.UserId).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
86  if (originalUser == null)
87  return StatusCode((int)HttpStatusCode.Gone);
88 
89  originalUser.ByondRights = model.ByondRights ?? originalUser.ByondRights;
90  originalUser.RepositoryRights = model.RepositoryRights ?? originalUser.RepositoryRights;
91  originalUser.InstanceUserRights = model.InstanceUserRights ?? originalUser.InstanceUserRights;
92  originalUser.ChatBotRights = model.ChatBotRights ?? originalUser.ChatBotRights;
93  originalUser.ConfigurationRights = model.ConfigurationRights ?? originalUser.ConfigurationRights;
94  originalUser.DreamDaemonRights = model.DreamDaemonRights ?? originalUser.DreamDaemonRights;
95  originalUser.DreamMakerRights = model.DreamMakerRights ?? originalUser.DreamMakerRights;
96 
97  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
98  return Json(originalUser.UserId == AuthenticationContext.User.Id || (AuthenticationContext.GetRight(RightsType.InstanceUser) & (ulong)InstanceUserRights.ReadUsers) != 0 ? originalUser.ToApi() : new Api.Models.InstanceUser
99  {
100  UserId = originalUser.UserId
101  });
102  }
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
InstanceUserRights
Rights for an Models.Instance
+ +
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+
BadRequestObjectResult StandardModelChecks(Api.Models.InstanceUser model)
Checks a model for errors
+ +
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
long Id
The ID of the User
Definition: User.cs:15
+
Metadata about a server instance
Definition: Instance.cs:9
+ +
+

References Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Api.Models.Internal.User.Id, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Instances, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save(), Tgstation.Server.Host.Controllers.InstanceUserController.StandardModelChecks(), and Tgstation.Server.Host.Security.AuthenticationContext.User.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.png b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..4b3686af495455ee304bfea2be1a118231c10f4c GIT binary patch literal 1364 zcmb`HeKga19LIn2Y?6vxQMhHEx*}P`Efi^E%TxD~gu8}yr94E+P#)6hL}v0sxEot? zJ;Y*d2;-jeEDw{-QYV=(WHwLX{_4;E?t9Mn`+0x9=Y2lk&*z-i`QCHKx~Rgn;Q#=r zqRu#Z0syQV((X#K&{@K*vw?z^yPLQ3*47pzr)DMBGdT|-^?kRrw8-BZ(}Pl_Xiuyc z0GYn6;ZAQ$0Fe8La&q*(0TUH|sGT<5mTLb;h;-e4@thw|E_9e1B}E!-cQxxbm`Gm8 zCFIkGtT2Pi_faHI(vk=bk~Ex@y-0VAgV3Hk5N;?q70&3^L(#8fG821z_Dx+Rm1a#6 zL=%#@(6Y>s5#N0a>SORKyU#*%HS@Ufh?RE1E|$UZ>|=Q@U1JOhyTr)iRoc7Tthe@P zA>K&561cK^z8Mf}_TdD}NLDo~wzot3`Ej4?G~^X}S6hYbFgu_=;_!MxY3ygwwyRlS zbolnLeqrGm9&dnQKq=}LzVjcr3@7Gen5(`)Yc;TO%}J6T-}^c8NNXi$g|X-G-#$h$ zh5~vhF4XO4T4gFiCp>0-&ctZ$wf~owX7xQ^^!G29P%DvsxMbTT77N*{h^?sE|1^sj z&0Ne-DHgsv-TavTP<3EbROp4hAlX~7h?zGtDxM6!dkbvKx%xrWVwG;1bR6t@6p5g` zoC-X;bKO#cEh;n*XgD4B{GiRp_J9;_gMHZ9Mr+C(ZB$!e+cRNUsVUU$ZnNY&JUcfM z?$!4+InF1zcyIou`}~tZ`~q1$IqI5k;}kJkPLVK|T^qTla&xpJJ|QF{hz%&>rBl6O zs!bljM2s!FuGf};Jr~>5G}*-e)45i(;Nt8jrhR$e+nAYmV8e#HjA1_NmGZ!bM?0Ca zS8~l)B{|bnE?H#e^&!5RnCOSTf9d-BiTI32_!=YC4^g&7Q4nRAJ|E@fN_jHWaK?8`N+8`2YCS(yt(X6ZlRx&U(WY zIM6f5>zEPuyX*B;G5p(rCfzo>sH!xXYuIADJQtO>;s~;OOFa(6oobd5M;ZgdB?8FA z#BD{57i6lk6MC95=U;`!KD%rs))@H|#Jzo4a8>8yU($^;V*~s>^;ttN;%DjnuNCcI zL04e`1-LMDH|Wr6%>xd%JEb!LKz%?tJgOC=$!k%pA5%-MJQfgg z6856JuWiio(xTPtyZ`wnotC~4blM$?SGc7^RB&Og*+_%=H$VqMw4p}QziUSHprYWY@sWhr>oiqk=mvmw$wdh@+{^`~g#^=33)#hFnyVe_wuLn>b^@ zyVwQ6TK91cxz*O~-<94_9hTc%IDK%~*({Oohr|aDO$=#Ez0+!#;W~-L6(KZCSzl{d znM^6LSp*fxc9zwbUnoC8w9Mte9?Gl~tjXdvp&Mq-k2F|=G&0GQMy?)7bTspCk + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Controllers.JobController Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Controllers.JobController, including all inherited members.

+ + + + + + + + + + +
Create([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Api.Models.Job >virtual
Delete(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.JobControllervirtual
GetId(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.JobControllervirtual
JobController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, ILogger< JobController > logger)Tgstation.Server.Host.Controllers.JobController
jobManagerTgstation.Server.Host.Controllers.JobControllerprivate
List(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.JobControllervirtual
ModelController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)Tgstation.Server.Host.Controllers.ModelController< Api.Models.Job >
Read(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.JobControllervirtual
Update([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Api.Models.Job >virtual
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html new file mode 100644 index 0000000000..ccff1379e0 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html @@ -0,0 +1,404 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Controllers.JobController Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Controllers.JobController Class Reference
+
+
+ +

ModelController<TModel> for Api.Models.Jobs + More...

+
+Inheritance diagram for Tgstation.Server.Host.Controllers.JobController:
+
+
+ + +Tgstation.Server.Host.Controllers.ModelController< Api.Models.Job > + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 JobController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, ILogger< JobController > logger)
 Construct a HomeController More...
 
override async Task< IActionResult > Read (CancellationToken cancellationToken)
 Attempt to read a TModel More...
 
override async Task< IActionResult > List (CancellationToken cancellationToken)
 Attempt to list entries of the TModel More...
 
override async Task< IActionResult > Delete (long id, CancellationToken cancellationToken)
 Attempt to delete a model with a particular id More...
 
override async Task< IActionResult > GetId (long id, CancellationToken cancellationToken)
 Attempt to get a specific a TModel More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Controllers.ModelController< Api.Models.Job >
 ModelController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)
 Construct a ModelController<TModel> More...
 
virtual Task< IActionResult > Create ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to create a model More...
 
virtual Task< IActionResult > Update ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to update a model More...
 
+ + + + +

+Private Attributes

readonly IJobManager jobManager
 The IJobManager for the JobController More...
 
+

Detailed Description

+

ModelController<TModel> for Api.Models.Jobs

+ +

Definition at line 20 of file JobController.cs.

+

Constructor & Destructor Documentation

+ +

◆ JobController()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Controllers.JobController.JobController (IDatabaseContext databaseContext,
IAuthenticationContextFactory authenticationContextFactory,
IJobManager jobManager,
ILogger< JobControllerlogger 
)
+
+ +

Construct a HomeController

+
Parameters
+ + + + + +
databaseContextThe IDatabaseContext for the ApiController
authenticationContextFactoryThe IAuthenticationContextFactory for the ApiController
jobManagerThe value of jobManager
loggerThe ILogger for the ApiController
+
+
+ +

Definition at line 34 of file JobController.cs.

+
34  : base(databaseContext, authenticationContextFactory, logger, true)
35  {
36  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
37  }
readonly IJobManager jobManager
The IJobManager for the JobController
+
+

References Tgstation.Server.Host.Controllers.JobController.jobManager.

+ +
+
+

Member Function Documentation

+ +

◆ Delete()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.JobController.Delete (long id,
CancellationToken cancellationToken 
)
+
+virtual
+
+ +

Attempt to delete a model with a particular id

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< Api.Models.Job >.

+ +

Definition at line 61 of file JobController.cs.

+
62  {
63  // don't care if an instance post or not at this point
64  var job = await DatabaseContext.Jobs.Where(x => x.Id == id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
65  if (job == default(Job))
66  return NotFound();
67 
68  if (job.StoppedAt != null)
69  return StatusCode((int)HttpStatusCode.Gone);
70 
71  if (job.CancelRight.HasValue && job.CancelRightsType.HasValue && (AuthenticationContext.GetRight(job.CancelRightsType.Value) & job.CancelRight.Value) == 0)
72  return Forbid();
73 
74  var cancelled = await jobManager.CancelJob(job, AuthenticationContext.User, false, cancellationToken).ConfigureAwait(false);
75  return cancelled ? (IActionResult)Accepted() : StatusCode((int)HttpStatusCode.Gone);
76  }
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+ + +
Task< bool > CancelJob(Job job, User user, bool blocking, CancellationToken cancellationToken)
Cancels a give job
+ +
readonly IJobManager jobManager
The IJobManager for the JobController
+ +
+

References Tgstation.Server.Host.Core.IJobManager.CancelJob(), Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Host.Controllers.JobController.jobManager, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Jobs, and Tgstation.Server.Host.Security.AuthenticationContext.User.

+ +
+
+ +

◆ GetId()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.JobController.GetId (long id,
CancellationToken cancellationToken 
)
+
+virtual
+
+ +

Attempt to get a specific a TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< Api.Models.Job >.

+ +

Definition at line 80 of file JobController.cs.

+
81  {
82  var job = await DatabaseContext.Jobs.Where(x => x.Id == id).Include(x => x.StartedBy).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
83  if (job == default(Job))
84  return NotFound();
85  var api = job.ToApi();
86  api.Progress = jobManager.JobProgress(job);
87  return Json(api);
88  }
+ + +
readonly IJobManager jobManager
The IJobManager for the JobController
+
int? JobProgress(Job job)
Get the Api.Models.Job.Progress for a job
+
+

References Tgstation.Server.Host.Controllers.JobController.jobManager, Tgstation.Server.Host.Core.IJobManager.JobProgress(), and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Jobs.

+ +
+
+ +

◆ List()

+ +
+
+ + + + + +
+ + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.JobController.List (CancellationToken cancellationToken)
+
+virtual
+
+ +

Attempt to list entries of the TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< Api.Models.Job >.

+ +

Definition at line 49 of file JobController.cs.

+
50  {
51  // you KNOW this will need pagination eventually right?
52  var jobs = await DatabaseContext.Jobs.Where(x => x.Instance.Id == Instance.Id).OrderByDescending(x => x.StartedAt).Select(x => new Api.Models.Job
53  {
54  Id = x.Id
55  }).ToListAsync(cancellationToken).ConfigureAwait(false);
56  return Json(jobs);
57  }
+
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+ +
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
+

References Tgstation.Server.Api.Models.Instance.Id, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Jobs.

+ +
+
+ +

◆ Read()

+ +
+
+ + + + + +
+ + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.JobController.Read (CancellationToken cancellationToken)
+
+virtual
+
+ +

Attempt to read a TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< Api.Models.Job >.

+ +

Definition at line 41 of file JobController.cs.

+
42  {
43  var result = await DatabaseContext.Jobs.Where(x => x.Instance.Id == Instance.Id && !x.StoppedAt.HasValue).OrderByDescending(x => x.StartedAt).ToListAsync(cancellationToken).ConfigureAwait(false);
44  return Json(result.Select(x => x.ToApi()));
45  }
+
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
+ +
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
+

References Tgstation.Server.Api.Models.Instance.Id, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Jobs.

+ +
+
+

Member Data Documentation

+ +

◆ jobManager

+ +
+
+ + + + + +
+ + + + +
readonly IJobManager Tgstation.Server.Host.Controllers.JobController.jobManager
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.png b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..615eba10971c57115ae237e4304d0f891a639142 GIT binary patch literal 1238 zcmeAS@N?(olHy`uVBq!ia0y~yV4MMD2XHV0Nny>&API>8pAgso|NjG-FW!7D?LRaD z$O7X72M(}y-jN4#IZA^3f*F8{K;Y`B5F-W#mQ+s{$B+ufw{zbXy;k61o&I>{zW>Vi zRm|8J%O3S_n-y1DV`Z4&nKALlX%pYzj9JT0PM@Kosp2_LBthlmLZ%)S%aDeND(zeb zlb!@f`po*T66#-B`zPz!CztONReDYIv&GlHcXqC|nSJh4OKd_}!ClY&b(KF){B949 zJ^H3~kLasCv7S|{YYmc}-4Ez|`yNz$^Q4XajDJUVFZm?H{&~aSTZfJ9KIhBL{l1+o zK>mkJsh^{1%E2d{Id_jm?wnD(KWJ-DS(~>?XjWIV)r-%5DpS)XBPUJJezv#VJ9oxe zTZ7YauiZVLt`wWmq4oUhyHyp}TIYH)@914QKHAH)VfI;G zgQG4dqr6YfvGZIR{x>UcBd@qw`rcl_C`Cq=GS-Y_FX=8Pv+Ua8{2{}-+$>oH$+p`az^E+ zetDL@Hfy`Jz&k#Zx4+M=FrnG*^^t80wmO*UUD17iG(oua?Nr+t$9Af;s${Ns?-#_q zY;PARMtkd|eDsVxxjZkm)yeb#WnY$yV#YDQ!DSQQg_*O|!kK;;|6<}`{1Mc^_+k0_ z^$N@n{218|%$JL4;%P8vm0+08rNh7{n!q5Vb%4Plq=B(u1q1Vg0HBhEOgs(FKn1`= zLk$IAmmgR%B}ilGl$uT!0j3X2&~4ep2~3s^uQb>9$0wWrb!SjMd-~SV*S{|W$e&+l zEd0JUjj`|bzOI|M4@~R7{v)07O|zu*E}my%n;DLmn$I}SSpBbJ-sbCx(f`jbUjKjn z&37r!GM=fXooG5Kd~=s?=F_Baf4%M)-I6r>dZD%Amd*j!yF6((v;R)e@ZYLX91}cg za_rl!Ycvw9CbJbtJ11{4%;B#Ve-ycyA-vRn#-_!SwoaR5+3oNubpNdAoWreW6Y>|I zPq;p17ytQLtUFe{XAE9ytzOK1rby)ax(Uuk&dpthXP*VI^{zLY@Ht^t1>?FGvk$!4 zwn=SaY5M8|J?|2K|Mb(YF5dDxNxH7$pw0o+zsF>a*^-6qGE%F{eX?ITXiGP*JZzIE z_Fz>W+vht$FO7>^?Q7S(UAfoi*}~LgF*08#>G|9+tM|oc46N z@=G9(u`g2u2C&8Q*$3}Lo?-aE{@uD6OBXOYF{FRxUCX1uQs9anw_h112YD@=5>&Lb Z{-8^+K~AuP7qAdw@O1TaS?83{1OS-QFNXjC literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller-members.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller-members.html new file mode 100644 index 0000000000..4ec117e542 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller-members.html @@ -0,0 +1,99 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Controllers.ModelController< TModel > Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Controllers.ModelController< TModel >, including all inherited members.

+ + + + + + + + + + + + + + + +
ApiController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance, bool requireHeaders)Tgstation.Server.Host.Controllers.ApiController
ApiHeadersTgstation.Server.Host.Controllers.ApiControllerprotected
AuthenticationContextTgstation.Server.Host.Controllers.ApiControllerprotected
Create([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< TModel >virtual
DatabaseContextTgstation.Server.Host.Controllers.ApiControllerprotected
Delete(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< TModel >virtual
GetId(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< TModel >virtual
InstanceTgstation.Server.Host.Controllers.ApiControllerprotected
List(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< TModel >virtual
LoggerTgstation.Server.Host.Controllers.ApiControllerprotected
ModelController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)Tgstation.Server.Host.Controllers.ModelController< TModel >
OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)Tgstation.Server.Host.Controllers.ApiController
Read(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< TModel >virtual
Update([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< TModel >virtual
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html new file mode 100644 index 0000000000..b14594b70b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html @@ -0,0 +1,487 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Controllers.ModelController< TModel > Class Template Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Controllers.ModelController< TModel > Class Template Reference
+
+
+ +

An ApiController representing a TModel + More...

+
+Inheritance diagram for Tgstation.Server.Host.Controllers.ModelController< TModel >:
+
+
+ + +Tgstation.Server.Host.Controllers.ApiController +Controller + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ModelController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)
 Construct a ModelController<TModel> More...
 
virtual Task< IActionResult > Create ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to create a model More...
 
virtual Task< IActionResult > Read (CancellationToken cancellationToken)
 Attempt to read a TModel More...
 
virtual Task< IActionResult > GetId (long id, CancellationToken cancellationToken)
 Attempt to get a specific a TModel More...
 
virtual Task< IActionResult > Update ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to update a model More...
 
virtual Task< IActionResult > Delete (long id, CancellationToken cancellationToken)
 Attempt to delete a model with a particular id More...
 
virtual Task< IActionResult > List (CancellationToken cancellationToken)
 Attempt to list entries of the TModel More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Controllers.ApiController
 ApiController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance, bool requireHeaders)
 Construct an ApiController More...
 
override async Task OnActionExecutionAsync (ActionExecutingContext context, ActionExecutionDelegate next)
 
+ + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Properties inherited from Tgstation.Server.Host.Controllers.ApiController
ApiHeaders ApiHeaders [get, private set]
 The ApiHeaders for the operation More...
 
IDatabaseContext DatabaseContext [get]
 The IDatabaseContext for the operation More...
 
IAuthenticationContext AuthenticationContext [get]
 The IAuthenticationContext for the operation More...
 
ILogger Logger [get]
 The ILogger for the ApiController More...
 
Models.Instance Instance [get]
 The Instance for the operation More...
 
+

Detailed Description

+

An ApiController representing a TModel

+
Template Parameters
+ + +
TModelThe model being represented
+
+
+
+
Type Constraints
+ + +
TModel :class 
+
+
+
+ +

Definition at line 14 of file ModelController.cs.

+

Constructor & Destructor Documentation

+ +

◆ ModelController()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Controllers.ModelController< TModel >.ModelController (IDatabaseContext databaseContext,
IAuthenticationContextFactory authenticationContextFactory,
ILogger logger,
bool requireInstance 
)
+
+ +

Construct a ModelController<TModel>

+
Parameters
+ + + + + +
databaseContextThe IDatabaseContext for the ApiController
authenticationContextFactoryThe IAuthenticationContextFactory for the ApiController
loggerThe ILogger for the ApiController
requireInstanceIf the ModelController<TModel> requires an IAuthenticationContext.InstanceUser
+
+
+ +

Definition at line 23 of file ModelController.cs.

+
23 : base(databaseContext, authenticationContextFactory, logger, requireInstance, true) { }
readonly bool requireInstance
If IAuthenticationContext.InstanceUser permissions are required to access the ApiController
+
+
+
+

Member Function Documentation

+ +

◆ Create()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
virtual Task<IActionResult> Tgstation.Server.Host.Controllers.ModelController< TModel >.Create ([FromBody] TModel model,
CancellationToken cancellationToken 
)
+
+virtual
+
+ +

Attempt to create a model

+
Parameters
+ + + +
modelThe TModel being created
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the IActionResult of the operation
+ +
+
+ +

◆ Delete()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
virtual Task<IActionResult> Tgstation.Server.Host.Controllers.ModelController< TModel >.Delete (long id,
CancellationToken cancellationToken 
)
+
+virtual
+
+ +

Attempt to delete a model with a particular id

+
Parameters
+ + + +
idThe ID of the model to delete
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the IActionResult of the operation
+ +

Reimplemented in Tgstation.Server.Host.Controllers.InstanceController, Tgstation.Server.Host.Controllers.ChatController, Tgstation.Server.Host.Controllers.InstanceUserController, and Tgstation.Server.Host.Controllers.JobController.

+ +
+
+ +

◆ GetId()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
virtual Task<IActionResult> Tgstation.Server.Host.Controllers.ModelController< TModel >.GetId (long id,
CancellationToken cancellationToken 
)
+
+virtual
+
+ +

Attempt to get a specific a TModel

+
Parameters
+ + + +
idThe ID of the model to get
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the IActionResult of the operation
+ +

Reimplemented in Tgstation.Server.Host.Controllers.InstanceController, Tgstation.Server.Host.Controllers.UserController, Tgstation.Server.Host.Controllers.ChatController, Tgstation.Server.Host.Controllers.InstanceUserController, Tgstation.Server.Host.Controllers.JobController, and Tgstation.Server.Host.Controllers.DreamMakerController.

+ +
+
+ +

◆ List()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual Task<IActionResult> Tgstation.Server.Host.Controllers.ModelController< TModel >.List (CancellationToken cancellationToken)
+
+virtual
+
+
+ +

◆ Read()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual Task<IActionResult> Tgstation.Server.Host.Controllers.ModelController< TModel >.Read (CancellationToken cancellationToken)
+
+virtual
+
+
+ +

◆ Update()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
virtual Task<IActionResult> Tgstation.Server.Host.Controllers.ModelController< TModel >.Update ([FromBody] TModel model,
CancellationToken cancellationToken 
)
+
+virtual
+
+ +

Attempt to update a model

+
Parameters
+ + + +
modelThe TModel being updated
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the IActionResult of the operation
+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.png b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..b0f587e76dc378a4cdee6c787d056bda9bf0676c GIT binary patch literal 1523 zcmeAS@N?(olHy`uVBq!ia0y~yV9W%vJ2;quq|m8X?}3y=fKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+18b9~i(^OyeX9)wSi6%mzwLi= z`okw~52v=UqEfeYo&^hTPkH-IUvp_nkk`vJk4Y&iFT--8CMj*m^z1sYOjVO<_OvA& zcDKG5{PPTQy=)x!?YqaNZ~ zvprKkscV}4@%*#-M~f$YnelVmw`Xsw%meJ_ZBDtGfBC39%hV;t>(;#7Y$)5CS|{&W zbz)YqHhs17u`L*4& z%67SHm*w{-NiW|riD#F2Zs}Pk^dl+2vufJuWz!E%_iZlH&Wlh_6W(!4yKVma6U%l_ zxZ1NdIm5}U@$|%!yW!1VmoD!~w&FL+&e$6M+V#?f;J7gLgN|KMUh<2l2ZcA?t=4Cq zx@39f^^%AATZ>bwBK2;E#gr#p-MV>MaaXu+_|8?zUwJQ|%}{-*dC#mi%2vwxteBox zY5B9O{qsZm*-x*(&-eT2%PgRK`l?@l+4u6)1HZ2pt1ss+5MSk` zYD`~}uTt@4x^Mg~$4OrdYr0>SihEuv|75yM^`yt8;u~93ToW!&5^41H4q`FW^%U$` z7VLF$$&^cb8ERzh8Q31A0n$D6&c4i9q!;|@{OMA>xpOO+kd&Znn8-u~C~g`e@w#wU!Yw#B|@ zdv&~cM$X@b`xaI;f1jK)Yu+g~k+l(*(~~Vu+4jpnP<+1ZJM-S8s#rsZysy%G<}R7B z>G;itO{L4GbN=o%)NOcs|Bf|(#pwXOlcslm`MHMYR{c%vjqBg&VfcLBy;@+xc|K9( z{XF3*&HLuDoLFmIJArpaRCbkQ%}t3DYj-THI_R79^Tf5#neUv!jIZ@Ayg7 z)$ZHr`l>6%^9>o7-~9F5>hjNXYZhLOTg#vDLQ{YBvOXk-Mo~gT+&iOFcczxZUB~>;Nd4J0+>c0P5P;Gkh-mJPAZ#zx@?(lm*dmYca zkp9h9ciE~IR*5LTe0}uXf_VQ;(aYu2s{@vQ7Th&YIM}^>!?mMJEmlF&*3S)ke%Gx6 zs=qy3dx!1b?ALP^$bGr0;*fXO$m$F*cnxBYGZ`?{yJY`LaAM#&kh;rs?;BPI<`3a- tLivHzbhL!gv#dQ);*0^$;k|#DbyrTB@h(|d6Iensc)I$ztaD0e0sup##?Al$ literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller-members.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller-members.html new file mode 100644 index 0000000000..79912f82fd --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller-members.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Controllers.RepositoryController Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Controllers.RepositoryController, including all inherited members.

+ + + + + + + + + + + + + + + + + + +
Create([FromBody] Repository model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.RepositoryController
ModelController< Repository >.Create([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Repository >virtual
Delete(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.RepositoryController
ModelController< Repository >.Delete(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Repository >virtual
generalConfigurationTgstation.Server.Host.Controllers.RepositoryControllerprivate
GetId(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Repository >virtual
gitHubClientFactoryTgstation.Server.Host.Controllers.RepositoryControllerprivate
instanceManagerTgstation.Server.Host.Controllers.RepositoryControllerprivate
jobManagerTgstation.Server.Host.Controllers.RepositoryControllerprivate
List(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Repository >virtual
LoadRevisionInformation(Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, string lastOriginCommitSha, Action< Models.RevisionInformation > revInfoSink, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.RepositoryControllerprivate
ModelController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)Tgstation.Server.Host.Controllers.ModelController< Repository >
PopulateApi(Repository model, Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.RepositoryControllerprivate
Read(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.RepositoryControllervirtual
RepositoryController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IGitHubClientFactory gitHubClientFactory, IJobManager jobManager, ILogger< RepositoryController > logger, IOptions< GeneralConfiguration > generalConfigurationOptions)Tgstation.Server.Host.Controllers.RepositoryController
Update([FromBody]Repository model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.RepositoryController
ModelController< Repository >.Update([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< Repository >virtual
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html new file mode 100644 index 0000000000..b01b314cb3 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html @@ -0,0 +1,708 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Controllers.RepositoryController Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Controllers.RepositoryController Class Reference
+
+
+ +

Controller for managing the Repositorys + More...

+
+Inheritance diagram for Tgstation.Server.Host.Controllers.RepositoryController:
+
+
+ + +Tgstation.Server.Host.Controllers.ModelController< Repository > + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 RepositoryController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IGitHubClientFactory gitHubClientFactory, IJobManager jobManager, ILogger< RepositoryController > logger, IOptions< GeneralConfiguration > generalConfigurationOptions)
 Construct a RepositoryController More...
 
override async Task< IActionResult > Create ([FromBody] Repository model, CancellationToken cancellationToken)
 
async Task< IActionResult > Delete (CancellationToken cancellationToken)
 Delete the Repository More...
 
override async Task< IActionResult > Read (CancellationToken cancellationToken)
 Attempt to read a TModel More...
 
override async Task< IActionResult > Update ([FromBody]Repository model, CancellationToken cancellationToken)
 
- Public Member Functions inherited from Tgstation.Server.Host.Controllers.ModelController< Repository >
 ModelController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)
 Construct a ModelController<TModel> More...
 
virtual Task< IActionResult > Create ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to create a model More...
 
virtual Task< IActionResult > GetId (long id, CancellationToken cancellationToken)
 Attempt to get a specific a TModel More...
 
virtual Task< IActionResult > Update ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to update a model More...
 
virtual Task< IActionResult > Delete (long id, CancellationToken cancellationToken)
 Attempt to delete a model with a particular id More...
 
virtual Task< IActionResult > List (CancellationToken cancellationToken)
 Attempt to list entries of the TModel More...
 
+ + + + + +

+Private Member Functions

async Task< bool > LoadRevisionInformation (Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, string lastOriginCommitSha, Action< Models.RevisionInformation > revInfoSink, CancellationToken cancellationToken)
 
async Task< bool > PopulateApi (Repository model, Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, CancellationToken cancellationToken)
 
+ + + + + + + + + + + + + +

+Private Attributes

readonly IInstanceManager instanceManager
 The IInstanceManager for the RepositoryController More...
 
readonly IGitHubClientFactory gitHubClientFactory
 The IGitHubClientFactory for the RepositoryController More...
 
readonly IJobManager jobManager
 The IJobManager for the RepositoryController More...
 
readonly GeneralConfiguration generalConfiguration
 The GeneralConfiguration for the RepositoryController More...
 
+

Detailed Description

+

Controller for managing the Repositorys

+ +

Definition at line 30 of file RepositoryController.cs.

+

Constructor & Destructor Documentation

+ +

◆ RepositoryController()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Controllers.RepositoryController.RepositoryController (IDatabaseContext databaseContext,
IAuthenticationContextFactory authenticationContextFactory,
IInstanceManager instanceManager,
IGitHubClientFactory gitHubClientFactory,
IJobManager jobManager,
ILogger< RepositoryControllerlogger,
IOptions< GeneralConfigurationgeneralConfigurationOptions 
)
+
+ +

Construct a RepositoryController

+
Parameters
+ + + + + + + + +
databaseContextThe IDatabaseContext for the ApiController
authenticationContextFactoryThe IAuthenticationContextFactory for the ApiController
instanceManagerThe value of instanceManager
gitHubClientFactoryThe value of gitHubClientFactory
jobManagerThe value of jobManager
loggerThe ILogger for the ApiController
generalConfigurationOptionsThe IOptions<TOptions> containing value of generalConfiguration
+
+
+ +

Definition at line 62 of file RepositoryController.cs.

+
62  : base(databaseContext, authenticationContextFactory, logger, true)
63  {
64  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
65  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
66  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
67  generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
68  }
readonly IInstanceManager instanceManager
The IInstanceManager for the RepositoryController
+
readonly IGitHubClientFactory gitHubClientFactory
The IGitHubClientFactory for the RepositoryController
+
readonly IJobManager jobManager
The IJobManager for the RepositoryController
+
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the RepositoryController
+
+

References Tgstation.Server.Host.Controllers.RepositoryController.generalConfiguration, Tgstation.Server.Host.Controllers.RepositoryController.gitHubClientFactory, Tgstation.Server.Host.Controllers.RepositoryController.instanceManager, and Tgstation.Server.Host.Controllers.RepositoryController.jobManager.

+ +
+
+

Member Function Documentation

+ +

◆ Create()

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.RepositoryController.Create ([FromBody] Repository model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 131 of file RepositoryController.cs.

+
132  {
133  if (model == null)
134  throw new ArgumentNullException(nameof(model));
135 
136  if (model.Origin == null)
137  return BadRequest(new ErrorMessage { Message = "Missing repo origin!" });
138 
139  if (model.AccessUser == null ^ model.AccessToken == null)
140  return BadRequest(new ErrorMessage { Message = "Either both accessToken and accessUser must be present or neither!" });
141 
142  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
143 
144  if (currentModel == default)
145  return StatusCode((int)HttpStatusCode.Gone);
146 
147  // normalize github urls
148  const string BadGitHubUrl = "://www.github.com/";
149  var uiOrigin = model.Origin.ToUpperInvariant();
150  var uiBad = BadGitHubUrl.ToUpperInvariant();
151  var uiGitHub = Components.Repository.Repository.GitHubUrl.ToUpperInvariant();
152  if (uiOrigin.Contains(uiBad, StringComparison.Ordinal))
153  model.Origin = uiOrigin.Replace(uiBad, uiGitHub, StringComparison.Ordinal);
154 
155  currentModel.AccessToken = model.AccessToken;
156  currentModel.AccessUser = model.AccessUser; // intentionally only these fields, user not allowed to change anything else atm
157  var cloneBranch = model.Reference;
158  var origin = model.Origin;
159 
161 
162  if (repoManager.CloneInProgress)
163  return Conflict(new ErrorMessage
164  {
165  Message = "A clone operation is in progress!"
166  });
167 
168  if(repoManager.InUse)
169  return Conflict(new ErrorMessage
170  {
171  Message = "The repo is busy!"
172  });
173 
174  using (var repo = await repoManager.LoadRepository(cancellationToken).ConfigureAwait(false))
175  {
176  // clone conflict
177  if (repo != null)
178  return Conflict(new ErrorMessage
179  {
180  Message = "The repository already exists!"
181  });
182 
183  var job = new Models.Job
184  {
185  Description = String.Format(CultureInfo.InvariantCulture, "Clone branch {1} of repository {0}", origin, cloneBranch ?? "master"),
186  StartedBy = AuthenticationContext.User,
187  CancelRightsType = RightsType.Repository,
188  CancelRight = (ulong)RepositoryRights.CancelClone,
190  };
191  var api = currentModel.ToApi();
192  await jobManager.RegisterOperation(job, async (paramJob, databaseContext, progressReporter, ct) =>
193  {
194  using (var repos = await repoManager.CloneRepository(new Uri(origin), cloneBranch, currentModel.AccessUser, currentModel.AccessToken, progressReporter, ct).ConfigureAwait(false))
195  {
196  if (repos == null)
197  throw new JobException("Filesystem conflict while cloning repository!");
198  var instance = new Models.Instance
199  {
200  Id = Instance.Id
201  };
202  databaseContext.Instances.Attach(instance);
203  if (await PopulateApi(api, repos, databaseContext, instance, ct).ConfigureAwait(false))
204  await databaseContext.Save(ct).ConfigureAwait(false);
205  }
206  }, cancellationToken).ConfigureAwait(false);
207 
208  api.Origin = model.Origin;
209  api.Reference = model.Reference;
210  api.ActiveJob = job.ToApi();
211 
212  return StatusCode((int)HttpStatusCode.Created, api);
213  }
214  }
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+
async Task< bool > PopulateApi(Repository model, Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, CancellationToken cancellationToken)
+
Task RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
Registers a given Job and begins running it
+
readonly IInstanceManager instanceManager
The IInstanceManager for the RepositoryController
+
string AccessUser
The username to access the git repository with
+
IRepositoryManager RepositoryManager
The IRepositoryManager for the IInstance
Definition: IInstance.cs:22
+ +
DbSet< RepositorySettings > RepositorySettings
+
RepositoryRights
Rights for a Models.Repository
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
string Reference
The branch or tag HEAD points to
Definition: Repository.cs:48
+
Metadata about a server instance
Definition: Instance.cs:9
+
string Origin
The origin URL. If null, the Repository does not exist
Definition: Repository.cs:13
+
readonly IJobManager jobManager
The IJobManager for the RepositoryController
+
string AccessToken
The token/password to access the git repository with
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+
+

References Tgstation.Server.Host.Components.IInstanceManager.GetInstance(), Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Host.Controllers.RepositoryController.instanceManager, Tgstation.Server.Host.Controllers.RepositoryController.jobManager, Tgstation.Server.Host.Controllers.RepositoryController.PopulateApi(), Tgstation.Server.Host.Core.IJobManager.RegisterOperation(), Tgstation.Server.Host.Components.IInstance.RepositoryManager, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.RepositorySettings, and Tgstation.Server.Host.Security.AuthenticationContext.User.

+ +
+
+ +

◆ Delete()

+ +
+
+ + + + + + + + +
async Task<IActionResult> Tgstation.Server.Host.Controllers.RepositoryController.Delete (CancellationToken cancellationToken)
+
+ +

Delete the Repository

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the IActionResult of the operation
+ +

Definition at line 222 of file RepositoryController.cs.

+
223  {
224  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
225 
226  if (currentModel == default)
227  return StatusCode((int)HttpStatusCode.Gone);
228 
229  currentModel.AccessToken = null;
230  currentModel.AccessUser = null;
231 
232  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
233 
234  Logger.LogInformation("Instance {0} repository delete initiated by user {1}", Instance.Id, AuthenticationContext.User.Id);
235 
236  var job = new Models.Job
237  {
238  Description = "Delete repository",
239  StartedBy = AuthenticationContext.User,
241  };
242  var api = currentModel.ToApi();
243  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressReporter, ct) => instanceManager.GetInstance(Instance).RepositoryManager.DeleteRepository(cancellationToken), cancellationToken).ConfigureAwait(false);
244  api.ActiveJob = job.ToApi();
245  return Accepted(api);
246  }
+
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
Task RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
Registers a given Job and begins running it
+
readonly IInstanceManager instanceManager
The IInstanceManager for the RepositoryController
+
IRepositoryManager RepositoryManager
The IRepositoryManager for the IInstance
Definition: IInstance.cs:22
+ +
DbSet< RepositorySettings > RepositorySettings
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
long Id
The ID of the User
Definition: User.cs:15
+
Metadata about a server instance
Definition: Instance.cs:9
+
readonly IJobManager jobManager
The IJobManager for the RepositoryController
+ +
+

References Tgstation.Server.Host.Components.IInstanceManager.GetInstance(), Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Api.Models.Internal.User.Id, Tgstation.Server.Host.Controllers.RepositoryController.instanceManager, Tgstation.Server.Host.Controllers.RepositoryController.jobManager, Tgstation.Server.Host.Core.IJobManager.RegisterOperation(), Tgstation.Server.Host.Components.IInstance.RepositoryManager, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.RepositorySettings, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save(), and Tgstation.Server.Host.Security.AuthenticationContext.User.

+ +
+
+ +

◆ LoadRevisionInformation()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task<bool> Tgstation.Server.Host.Controllers.RepositoryController.LoadRevisionInformation (Components.Repository.IRepository repository,
IDatabaseContext databaseContext,
Models.Instance instance,
string lastOriginCommitSha,
Action< Models.RevisionInformationrevInfoSink,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Definition at line 70 of file RepositoryController.cs.

+
71  {
72  var repoSha = repository.Head;
73 
74  IQueryable<Models.RevisionInformation> ApplyQuery(IQueryable<Models.RevisionInformation> query) => query
75  .Where(x => x.CommitSha == repoSha && x.Instance.Id == instance.Id)
76  .Include(x => x.CompileJobs)
77  .Include(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy);
78 
79  var revisionInfo = await ApplyQuery(databaseContext.RevisionInformations).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
80 
81  if (revisionInfo == default)
82  revisionInfo = databaseContext.RevisionInformations.Local.Where(x => x.CommitSha == repoSha && x.Instance.Id == instance.Id).FirstOrDefault();
83 
84  var needsDbUpdate = revisionInfo == default;
85  if (needsDbUpdate)
86  {
87  // needs insertion
88  revisionInfo = new Models.RevisionInformation
89  {
90  Instance = instance,
91  CommitSha = repoSha,
92  CompileJobs = new List<Models.CompileJob>(),
93  ActiveTestMerges = new List<RevInfoTestMerge>() // non null vals for api returns
94  };
95 
96  lock (databaseContext) // cleaner this way
97  databaseContext.RevisionInformations.Add(revisionInfo);
98  }
99 
100  revisionInfo.OriginCommitSha = revisionInfo.OriginCommitSha ?? lastOriginCommitSha;
101  if (revisionInfo.OriginCommitSha == null)
102  {
103  revisionInfo.OriginCommitSha = repoSha;
104  Logger.LogWarning(Components.Repository.Repository.OriginTrackingErrorTemplate, repoSha);
105  }
106 
107  revInfoSink?.Invoke(revisionInfo);
108  return needsDbUpdate;
109  }
User may list and read all Models.CompileJobs
+
Metadata about a server instance
Definition: Instance.cs:9
+
DbSet< RevisionInformation > RevisionInformations
The RevisionInformations in the IDatabaseContext
+
virtual Task< IActionResult > List(CancellationToken cancellationToken)
Attempt to list entries of the TModel
+
+

References Tgstation.Server.Api.Rights.CompileJobs, Tgstation.Server.Host.Controllers.ModelController< Repository >.List(), and Tgstation.Server.Host.Models.IDatabaseContext.RevisionInformations.

+ +

Referenced by Tgstation.Server.Host.Controllers.RepositoryController.PopulateApi(), and Tgstation.Server.Host.Controllers.RepositoryController.Update().

+ +
+
+ +

◆ PopulateApi()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task<bool> Tgstation.Server.Host.Controllers.RepositoryController.PopulateApi (Repository model,
Components.Repository.IRepository repository,
IDatabaseContext databaseContext,
Models.Instance instance,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Definition at line 111 of file RepositoryController.cs.

+
112  {
113  if (repository.IsGitHubRepository)
114  {
115  model.GitHubOwner = repository.GitHubOwner;
116  model.GitHubName = repository.GitHubRepoName;
117  }
118 
119  model.Origin = repository.Origin;
120  model.Reference = repository.Reference;
121 
122  // rev info stuff
123  Models.RevisionInformation revisionInfo = null;
124  var needsDbUpdate = await LoadRevisionInformation(repository, databaseContext, instance, null, x => revisionInfo = x, cancellationToken).ConfigureAwait(false);
125  model.RevisionInformation = revisionInfo.ToApi();
126  return needsDbUpdate;
127  }
string GitHubOwner
If the repository was cloned from GitHub.com this will be set with the owner of the repository
Definition: Repository.cs:28
+
async Task< bool > LoadRevisionInformation(Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, string lastOriginCommitSha, Action< Models.RevisionInformation > revInfoSink, CancellationToken cancellationToken)
+
RevisionInformation RevisionInformation
The current Models.RevisionInformation for the Repository
Definition: Repository.cs:23
+
string Reference
The branch or tag HEAD points to
Definition: Repository.cs:48
+
string Origin
The origin URL. If null, the Repository does not exist
Definition: Repository.cs:13
+
string GitHubName
If the repository was cloned from GitHub.com this will be set with the name of the repository
Definition: Repository.cs:33
+
+

References Tgstation.Server.Api.Models.Repository.GitHubName, Tgstation.Server.Api.Models.Repository.GitHubOwner, Tgstation.Server.Host.Controllers.RepositoryController.LoadRevisionInformation(), Tgstation.Server.Api.Models.Repository.Origin, Tgstation.Server.Api.Models.Repository.Reference, and Tgstation.Server.Api.Models.Repository.RevisionInformation.

+ +

Referenced by Tgstation.Server.Host.Controllers.RepositoryController.Create(), Tgstation.Server.Host.Controllers.RepositoryController.Read(), and Tgstation.Server.Host.Controllers.RepositoryController.Update().

+ +
+
+ +

◆ Read()

+ +
+
+ + + + + +
+ + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.RepositoryController.Read (CancellationToken cancellationToken)
+
+virtual
+
+ +

Attempt to read a TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< Repository >.

+ +

Definition at line 250 of file RepositoryController.cs.

+
251  {
252  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
253 
254  if (currentModel == default)
255  return StatusCode((int)HttpStatusCode.Gone);
256 
257  var api = currentModel.ToApi();
259 
260  if (repoManager.CloneInProgress)
261  return Conflict(new ErrorMessage
262  {
263  Message = "A clone operation is in progress!"
264  });
265 
266  if (repoManager.InUse)
267  return Conflict(new ErrorMessage
268  {
269  Message = "The repo is busy!"
270  });
271 
272  using (var repo = await repoManager.LoadRepository(cancellationToken).ConfigureAwait(false))
273  {
274  if (repo != null && await PopulateApi(api, repo, DatabaseContext, Instance, cancellationToken).ConfigureAwait(false))
275  {
276  // user may have fucked with the repo without telling us, do what we can
277  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
278  return StatusCode((int)HttpStatusCode.Created, api);
279  }
280 
281  return Json(api);
282  }
283  }
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
async Task< bool > PopulateApi(Repository model, Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, CancellationToken cancellationToken)
+
readonly IInstanceManager instanceManager
The IInstanceManager for the RepositoryController
+
IRepositoryManager RepositoryManager
The IRepositoryManager for the IInstance
Definition: IInstance.cs:22
+ +
DbSet< RepositorySettings > RepositorySettings
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
Metadata about a server instance
Definition: Instance.cs:9
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+

References Tgstation.Server.Host.Components.IInstanceManager.GetInstance(), Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Host.Controllers.RepositoryController.instanceManager, Tgstation.Server.Host.Controllers.RepositoryController.PopulateApi(), Tgstation.Server.Host.Components.IInstance.RepositoryManager, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.RepositorySettings, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save().

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.RepositoryController.Update ([FromBody] Repository model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 289 of file RepositoryController.cs.

+
290  {
291  if (model == null)
292  throw new ArgumentNullException(nameof(model));
293 
294  if (model.AccessUser == null ^ model.AccessToken == null)
295  return BadRequest(new ErrorMessage { Message = "Either both accessToken and accessUser must be present or neither!" });
296 
297  if (model.CheckoutSha != null && model.Reference != null)
298  return BadRequest(new ErrorMessage { Message = "Only one of sha or reference may be specified!" });
299 
300  if (model.CheckoutSha != null && model.UpdateFromOrigin == true)
301  return BadRequest(new ErrorMessage { Message = "Cannot update a reference when checking out a sha!" });
302 
303  if (model.Origin != null)
304  return BadRequest(new ErrorMessage { Message = "origin cannot be modified without deleting the repository!" });
305 
306  if (model.NewTestMerges?.Any(x => !x.Number.HasValue) == true)
307  return BadRequest(new ErrorMessage { Message = "All new test merges must provide a number!" });
308 
309  if (model.NewTestMerges?.Any(x => model.NewTestMerges.Any(y => x != y && x.Number == y.Number)) == true)
310  return BadRequest(new ErrorMessage { Message = "Cannot test merge the same PR twice in one job!" });
311 
312  if (model.CommitterName?.Length == 0)
313  return BadRequest(new ErrorMessage { Message = "Cannot set empty committer name!" });
314 
315  if (model.CommitterEmail?.Length == 0)
316  return BadRequest(new ErrorMessage { Message = "Cannot set empty committer e=mail!" });
317 
318  var newTestMerges = model.NewTestMerges != null && model.NewTestMerges.Count > 0;
319  var userRights = (RepositoryRights)AuthenticationContext.GetRight(RightsType.Repository);
320  if (newTestMerges && !userRights.HasFlag(RepositoryRights.MergePullRequest))
321  return Forbid();
322 
323  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
324 
325  if (currentModel == default)
326  return StatusCode((int)HttpStatusCode.Gone);
327 
328  bool CheckModified<T>(Expression<Func<Api.Models.Internal.RepositorySettings, T>> expression, RepositoryRights requiredRight)
329  {
330  var memberSelectorExpression = (MemberExpression)expression.Body;
331  var property = (PropertyInfo)memberSelectorExpression.Member;
332 
333  var newVal = property.GetValue(model);
334  if (newVal == null)
335  return false;
336  if (!userRights.HasFlag(requiredRight) && property.GetValue(currentModel) != newVal)
337  return true;
338 
339  property.SetValue(currentModel, newVal);
340  return false;
341  }
342 
343  if (CheckModified(x => x.AccessToken, RepositoryRights.ChangeCredentials)
344  || CheckModified(x => x.AccessUser, RepositoryRights.ChangeCredentials)
345  || CheckModified(x => x.AutoUpdatesKeepTestMerges, RepositoryRights.ChangeAutoUpdateSettings)
346  || CheckModified(x => x.AutoUpdatesSynchronize, RepositoryRights.ChangeAutoUpdateSettings)
347  || CheckModified(x => x.CommitterEmail, RepositoryRights.ChangeCommitter)
348  || CheckModified(x => x.CommitterName, RepositoryRights.ChangeCommitter)
349  || CheckModified(x => x.PushTestMergeCommits, RepositoryRights.ChangeTestMergeCommits)
350  || CheckModified(x => x.ShowTestMergeCommitters, RepositoryRights.ChangeTestMergeCommits)
351  || CheckModified(x => x.PostTestMergeComment, RepositoryRights.ChangeTestMergeCommits)
352  || (model.UpdateFromOrigin == true && !userRights.HasFlag(RepositoryRights.UpdateBranch)))
353  return Forbid();
354 
355  if (currentModel.AccessToken?.Length == 0 && currentModel.AccessUser?.Length == 0)
356  {
357  // setting an empty string clears everything
358  currentModel.AccessUser = null;
359  currentModel.AccessToken = null;
360  }
361 
362  var canRead = userRights.HasFlag(RepositoryRights.Read);
363 
364  var api = canRead ? currentModel.ToApi() : new Repository();
366 
367  if (canRead)
368  {
369  if (repoManager.CloneInProgress)
370  return Conflict(new ErrorMessage
371  {
372  Message = "A clone operation is in progress!"
373  });
374 
375  if (repoManager.InUse)
376  return Conflict(new ErrorMessage
377  {
378  Message = "The repo is busy!"
379  });
380 
381  using (var repo = await repoManager.LoadRepository(cancellationToken).ConfigureAwait(false))
382  {
383  if (repo == null)
384  return Conflict(new ErrorMessage
385  {
386  Message = "Repository could not be loaded!"
387  });
388  await PopulateApi(api, repo, DatabaseContext, Instance, cancellationToken).ConfigureAwait(false);
389  }
390  }
391 
392  // this is just db stuf so stow it away
393  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
394 
395  // format the job description
396  string description = null;
397  if (model.UpdateFromOrigin == true)
398  if (model.Reference != null)
399  description = String.Format(CultureInfo.InvariantCulture, "Fetch and hard reset repository to origin/{0}", model.Reference);
400  else if (model.CheckoutSha != null)
401  description = String.Format(CultureInfo.InvariantCulture, "Fetch and checkout {0} in repository", model.CheckoutSha);
402  else
403  description = "Pull current repository reference";
404  else if (model.Reference != null || model.CheckoutSha != null)
405  description = String.Format(CultureInfo.InvariantCulture, "Checkout repository {0} {1}", model.Reference != null ? "reference" : "SHA", model.Reference ?? model.CheckoutSha);
406 
407  if (newTestMerges)
408  description = String.Format(CultureInfo.InvariantCulture, "{0}est merge pull request(s) {1}{2}",
409  description != null ? String.Format(CultureInfo.InvariantCulture, "{0} and t", description) : "T",
410  String.Join(", ", model.NewTestMerges.Select(x =>
411  String.Format(CultureInfo.InvariantCulture, "#{0}{1}", x.Number,
412  x.PullRequestRevision != null ? String.Format(CultureInfo.InvariantCulture, " at {0}", x.PullRequestRevision.Substring(0, 7)) : String.Empty))),
413  description != null ? String.Empty : " in repository");
414 
415  if (description == null)
416  return Json(api); // no git changes
417 
418  var job = new Models.Job
419  {
420  Description = description,
421  StartedBy = AuthenticationContext.User,
422  Instance = Instance,
423  CancelRightsType = RightsType.Repository,
424  CancelRight = (ulong)RepositoryRights.CancelPendingChanges,
425  };
426 
427  await jobManager.RegisterOperation(job, async (paramJob, databaseContext, progressReporter, ct) =>
428  {
429  using (var repo = await repoManager.LoadRepository(ct).ConfigureAwait(false))
430  {
431  if (repo == null)
432  throw new JobException("Repository could not be loaded!");
433 
434  var modelHasShaOrReference = model.CheckoutSha != null || model.Reference != null;
435 
436  var startReference = repo.Reference;
437  var startSha = repo.Head;
438  string postUpdateSha = null;
439 
440  if (newTestMerges && !repo.IsGitHubRepository)
441  throw new JobException("Cannot test merge on a non GitHub based repository!");
442 
443  var committerName = currentModel.ShowTestMergeCommitters.Value ? AuthenticationContext.User.Name : currentModel.CommitterName;
444 
445  var hardResettingToOriginReference = model.UpdateFromOrigin == true && model.Reference != null;
446 
447  var numSteps = (model.NewTestMerges?.Count ?? 0) + (model.UpdateFromOrigin == true ? 1 : 0) + (!modelHasShaOrReference ? 2 : (hardResettingToOriginReference ? 3 : 1));
448  var doneSteps = 0;
449 
450  Action<int> NextProgressReporter()
451  {
452  var tmpDoneSteps = doneSteps;
453  ++doneSteps;
454  return progress => progressReporter((progress + (100 * tmpDoneSteps)) / numSteps);
455  }
456 
457  progressReporter(0);
458 
459  // get a base line for where we are
460  Models.RevisionInformation lastRevisionInfo = null;
461 
462  var attachedInstance = new Models.Instance
463  {
464  Id = Instance.Id
465  };
466  databaseContext.Instances.Attach(attachedInstance);
467 
468  await LoadRevisionInformation(repo, databaseContext, attachedInstance, null, x => lastRevisionInfo = x, ct).ConfigureAwait(false);
469 
470  // apply new rev info, tracking applied test merges
471  async Task UpdateRevInfo()
472  {
473  var last = lastRevisionInfo;
474  await LoadRevisionInformation(repo, databaseContext, attachedInstance, last.OriginCommitSha, x => lastRevisionInfo = x, ct).ConfigureAwait(false);
475  lastRevisionInfo.ActiveTestMerges.AddRange(last.ActiveTestMerges);
476  }
477 
478  try
479  {
480  // fetch/pull
481  if (model.UpdateFromOrigin == true)
482  {
483  if (!repo.Tracking)
484  throw new JobException("Not on an updatable reference!");
485  await repo.FetchOrigin(currentModel.AccessUser, currentModel.AccessToken, NextProgressReporter(), ct).ConfigureAwait(false);
486  doneSteps = 1;
487  if (!modelHasShaOrReference)
488  {
489  var fastForward = await repo.MergeOrigin(committerName, currentModel.CommitterEmail, NextProgressReporter(), ct).ConfigureAwait(false);
490  if (!fastForward.HasValue)
491  throw new JobException("Merge conflict occurred during origin update!");
492  await UpdateRevInfo().ConfigureAwait(false);
493  if (fastForward.Value)
494  {
495  lastRevisionInfo.OriginCommitSha = repo.Head;
496  await repo.Sychronize(currentModel.AccessUser, currentModel.AccessToken, currentModel.CommitterName, currentModel.CommitterEmail, NextProgressReporter(), true, ct).ConfigureAwait(false);
497  postUpdateSha = repo.Head;
498  }
499  else
500  NextProgressReporter()(100);
501  }
502  }
503 
504  // checkout/hard reset
505  if (modelHasShaOrReference)
506  {
507  if ((model.CheckoutSha != null && repo.Head.ToUpperInvariant().StartsWith(model.CheckoutSha.ToUpperInvariant(), StringComparison.Ordinal))
508  || (model.Reference != null && repo.Reference.ToUpperInvariant() != model.Reference.ToUpperInvariant()))
509  {
510  var committish = model.CheckoutSha ?? model.Reference;
511  var isSha = await repo.IsSha(committish, cancellationToken).ConfigureAwait(false);
512 
513  if ((isSha && model.Reference != null) || (!isSha && model.CheckoutSha != null))
514  throw new JobException("Attempted to checkout a SHA or reference that was actually the opposite!");
515 
516  await repo.CheckoutObject(committish, NextProgressReporter(), ct).ConfigureAwait(false);
517  await LoadRevisionInformation(repo, databaseContext, attachedInstance, null, x => lastRevisionInfo = x, ct).ConfigureAwait(false); // we've either seen origin before or what we're checking out is on origin
518  }
519  else
520  NextProgressReporter()(100);
521 
522  if (hardResettingToOriginReference)
523  {
524  if (!repo.Tracking)
525  throw new JobException("Checked out reference does not track a remote object!");
526  await repo.ResetToOrigin(NextProgressReporter(), ct).ConfigureAwait(false);
527  await repo.Sychronize(currentModel.AccessUser, currentModel.AccessToken, currentModel.CommitterName, currentModel.CommitterEmail, NextProgressReporter(), true, ct).ConfigureAwait(false);
528  await LoadRevisionInformation(repo, databaseContext, attachedInstance, null, x => lastRevisionInfo = x, ct).ConfigureAwait(false);
529 
530  // repo head is on origin so force this
531  // will update the db if necessary
532  lastRevisionInfo.OriginCommitSha = repo.Head;
533  }
534  }
535 
536  // test merging
537  Dictionary<int, Octokit.PullRequest> prMap = null;
538  if (newTestMerges)
539  {
540  // bit of sanitization
541  foreach (var I in model.NewTestMerges.Where(x => String.IsNullOrWhiteSpace(x.PullRequestRevision)))
542  I.PullRequestRevision = null;
543 
544  var gitHubClient = currentModel.AccessToken != null
545  ? gitHubClientFactory.CreateClient(currentModel.AccessToken)
546  : (String.IsNullOrEmpty(generalConfiguration.GitHubAccessToken)
549 
550  var repoOwner = repo.GitHubOwner;
551  var repoName = repo.GitHubRepoName;
552 
553  // optimization: if we've already merged these exact same commits in this fashion before, just find the rev info for it and check it out
554  Models.RevisionInformation revInfoWereLookingFor = null;
555  bool needToApplyRemainingPrs = true;
556  if (lastRevisionInfo.OriginCommitSha == lastRevisionInfo.CommitSha)
557  {
558  // In order for this to work though we need the shas of all the commits
559  if (model.NewTestMerges.Any(x => x.PullRequestRevision == null))
560  prMap = new Dictionary<int, Octokit.PullRequest>();
561 
562  bool cantSearch = false;
563  foreach (var I in model.NewTestMerges)
564  {
565  if (I.PullRequestRevision != null)
566 #pragma warning disable CA1308 // Normalize strings to uppercase
567  I.PullRequestRevision = I.PullRequestRevision?.ToLowerInvariant(); // ala libgit2
568 #pragma warning restore CA1308 // Normalize strings to uppercase
569  else
570  try
571  {
572  // retrieve the latest sha
573  var pr = await gitHubClient.PullRequest.Get(repoOwner, repoName, I.Number.Value).ConfigureAwait(false);
574  prMap.Add(I.Number.Value, pr);
575  I.PullRequestRevision = pr.Head.Sha;
576  }
577  catch
578  {
579  cantSearch = true;
580  break;
581  }
582  }
583 
584  if (!cantSearch)
585  {
586  var dbPull = await databaseContext.RevisionInformations
587  .Where(x => x.Instance.Id == Instance.Id
588  && x.OriginCommitSha == lastRevisionInfo.OriginCommitSha
589  && x.ActiveTestMerges.Count <= model.NewTestMerges.Count
590  && x.ActiveTestMerges.Count > 0)
591  .Include(x => x.ActiveTestMerges)
592  .ThenInclude(x => x.TestMerge)
593  .ToListAsync(cancellationToken).ConfigureAwait(false);
594 
595  // split here cause this bit has to be done locally
596  revInfoWereLookingFor = dbPull
597  .Where(x => x.ActiveTestMerges.Count == model.NewTestMerges.Count
598  && x.ActiveTestMerges.Select(y => y.TestMerge)
599  .All(y => model.NewTestMerges.Any(z =>
600  y.Number == z.Number
601  && y.PullRequestRevision.StartsWith(z.PullRequestRevision, StringComparison.Ordinal)
602  && (y.Comment?.Trim().ToUpperInvariant() == z.Comment?.Trim().ToUpperInvariant() || z.Comment == null))))
603  .FirstOrDefault();
604 
605  if (revInfoWereLookingFor == null && model.NewTestMerges.Count > 1)
606  {
607  // okay try to add at least SOME prs we've seen before
608  var search = model.NewTestMerges.ToList();
609 
610  var appliedTestMergeIds = new List<long>();
611 
612  Models.RevisionInformation lastGoodRevInfo = null;
613  do
614  {
615  foreach (var I in search)
616  {
617  revInfoWereLookingFor = dbPull
618  .Where(x => model.NewTestMerges.Any(z =>
619  x.PrimaryTestMerge.Number == z.Number
620  && x.PrimaryTestMerge.PullRequestRevision.StartsWith(z.PullRequestRevision, StringComparison.Ordinal)
621  && (x.PrimaryTestMerge.Comment?.Trim().ToUpperInvariant() == z.Comment?.Trim().ToUpperInvariant() || z.Comment == null))
622  && x.ActiveTestMerges.Select(y => y.TestMerge).All(y => appliedTestMergeIds.Contains(y.Id)))
623  .FirstOrDefault();
624 
625  if (revInfoWereLookingFor != null)
626  {
627  lastGoodRevInfo = revInfoWereLookingFor;
628  appliedTestMergeIds.Add(revInfoWereLookingFor.PrimaryTestMerge.Id);
629  search.Remove(I);
630  break;
631  }
632  }
633  }
634  while (revInfoWereLookingFor != null && search.Count > 0);
635 
636  revInfoWereLookingFor = lastGoodRevInfo;
637  needToApplyRemainingPrs = search.Count != 0;
638  if (needToApplyRemainingPrs)
639  model.NewTestMerges = search;
640  }
641  else if (revInfoWereLookingFor != null)
642  needToApplyRemainingPrs = false;
643  }
644  }
645 
646  if (revInfoWereLookingFor != null)
647  {
648  // goteem
649  await repo.ResetToSha(revInfoWereLookingFor.CommitSha, NextProgressReporter(), cancellationToken).ConfigureAwait(false);
650  lastRevisionInfo = revInfoWereLookingFor;
651  }
652 
653  if (needToApplyRemainingPrs)
654  {
655  // an invocation of LoadRevisionInformation could have already loaded this user
656  var contextUser = databaseContext.Users.Local.Where(x => x.Id == AuthenticationContext.User.Id).FirstOrDefault();
657  if (contextUser == default)
658  {
659  contextUser = new Models.User
660  {
662  };
663  databaseContext.Users.Attach(contextUser);
664  }
665  else
666  Logger.LogTrace("Skipping attaching the user to the database context as it is already loaded!");
667 
668  foreach (var I in model.NewTestMerges)
669  {
670  Octokit.PullRequest pr = null;
671  string errorMessage = null;
672 
673  if (lastRevisionInfo.ActiveTestMerges.Any(x => x.TestMerge.Number == I.Number.Value))
674  throw new JobException("Cannot test merge the same PR twice in one HEAD!");
675 
676  try
677  {
678  // load from cache if possible
679  if (prMap == null || !prMap.TryGetValue(I.Number.Value, out pr))
680  pr = await gitHubClient.PullRequest.Get(repoOwner, repoName, I.Number.Value).ConfigureAwait(false);
681  }
682  catch (Octokit.RateLimitExceededException)
683  {
684  // you look at your anonymous access and sigh
685  errorMessage = "P.R.E. RATE LIMITED";
686  }
687  catch (Octokit.AuthorizationException)
688  {
689  errorMessage = "P.R.E. BAD CREDENTIALS";
690  }
691  catch (Octokit.NotFoundException)
692  {
693  // you look at your shithub and sigh
694  errorMessage = "P.R.E. NOT FOUND";
695  }
696 
697  // we want to take the earliest truth possible to prevent RCEs, if this fails AddTestMerge will set it
698  if (I.PullRequestRevision == null && pr != null)
699  I.PullRequestRevision = pr.Head.Sha;
700 
701  var mergeResult = await repo.AddTestMerge(I, committerName, currentModel.CommitterEmail, currentModel.AccessUser, currentModel.AccessToken, NextProgressReporter(), ct).ConfigureAwait(false);
702 
703  if (!mergeResult.HasValue)
704  throw new JobException(String.Format(CultureInfo.InvariantCulture, "Merge of PR #{0} at {1} conflicted!", I.Number, I.PullRequestRevision.Substring(0, 7)));
705 
706  ++doneSteps;
707 
708  var revInfoUpdateTask = UpdateRevInfo();
709 
710  var tm = new Models.TestMerge
711  {
712  Author = pr?.User.Login ?? errorMessage,
713  BodyAtMerge = pr?.Body ?? errorMessage ?? String.Empty,
714  MergedAt = DateTimeOffset.Now,
715  TitleAtMerge = pr?.Title ?? errorMessage ?? String.Empty,
716  Comment = I.Comment,
717  Number = I.Number,
718  MergedBy = contextUser,
719  PullRequestRevision = I.PullRequestRevision,
720  Url = pr?.HtmlUrl ?? errorMessage
721  };
722 
723  await revInfoUpdateTask.ConfigureAwait(false);
724 
725  lastRevisionInfo.PrimaryTestMerge = tm;
726  lastRevisionInfo.ActiveTestMerges.Add(new RevInfoTestMerge
727  {
728  TestMerge = tm
729  });
730  }
731  }
732  }
733 
734  var currentHead = repo.Head;
735  if (startSha != currentHead || (postUpdateSha != null && postUpdateSha != currentHead))
736  {
737  await repo.Sychronize(currentModel.AccessUser, currentModel.AccessToken, currentModel.CommitterName, currentModel.CommitterEmail, NextProgressReporter(), false, ct).ConfigureAwait(false);
738  await UpdateRevInfo().ConfigureAwait(false);
739  }
740 
741  await databaseContext.Save(ct).ConfigureAwait(false);
742  }
743  catch
744  {
745  doneSteps = 0;
746  numSteps = 2;
747 
748  // the stuff didn't make it into the db, forget what we've done and abort
749  await repo.CheckoutObject(startReference ?? startSha, NextProgressReporter(), default).ConfigureAwait(false);
750  if (startReference != null && repo.Head != startSha)
751  await repo.ResetToSha(startSha, NextProgressReporter(), default).ConfigureAwait(false);
752  else
753  progressReporter(100);
754  throw;
755  }
756  }
757  }, cancellationToken).ConfigureAwait(false);
758 
759  api.ActiveJob = job.ToApi();
760  return Accepted(api);
761  }
string Name
The name of the User
Definition: User.cs:38
+ + +
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
string GitHubAccessToken
A GitHub personal access token to use for bypassing rate limits on requests. Requires no scopes
+
IInstance GetInstance(Models.Instance metadata)
Get the IInstance associated with given metadata
+ +
Many to many relationship for Models.RevisionInformation and Models.TestMerge
+
string CheckoutSha
The commit HEAD should point to. Not populated in responses, use RevisionInformation instead for retr...
Definition: Repository.cs:18
+
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+
async Task< bool > PopulateApi(Repository model, Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, CancellationToken cancellationToken)
+
Task RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
Registers a given Job and begins running it
+
readonly IInstanceManager instanceManager
The IInstanceManager for the RepositoryController
+
async Task< bool > LoadRevisionInformation(Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, string lastOriginCommitSha, Action< Models.RevisionInformation > revInfoSink, CancellationToken cancellationToken)
+
List< TestMergeParameters > NewTestMerges
TestMergeParameters for new TestMerges. Note that merges that conflict will not be performed
Definition: Repository.cs:53
+
string AccessUser
The username to access the git repository with
+
Represents a git repository
Definition: Repository.cs:8
+
IRepositoryManager RepositoryManager
The IRepositoryManager for the IInstance
Definition: IInstance.cs:22
+ +
DbSet< RepositorySettings > RepositorySettings
+
RepositoryRights
Rights for a Models.Repository
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
+
IGitHubClient CreateClient()
Create a client with anonymous authentication. Low rate limit
+
readonly IGitHubClientFactory gitHubClientFactory
The IGitHubClientFactory for the RepositoryController
+
string Reference
The branch or tag HEAD points to
Definition: Repository.cs:48
+
long Id
The ID of the User
Definition: User.cs:15
+
Metadata about a server instance
Definition: Instance.cs:9
+ +
string Origin
The origin URL. If null, the Repository does not exist
Definition: Repository.cs:13
+
bool? UpdateFromOrigin
Do the equivalent of a git pull. Will attempt to merge unless Reference is also specified in which ca...
Definition: Repository.cs:43
+
readonly IJobManager jobManager
The IJobManager for the RepositoryController
+
string AccessToken
The token/password to access the git repository with
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the RepositoryController
+
Operation exceptions thrown from the context of a Models.Job
Definition: JobException.cs:8
+
+

References Tgstation.Server.Host.Core.IGitHubClientFactory.CreateClient(), Tgstation.Server.Host.Controllers.RepositoryController.generalConfiguration, Tgstation.Server.Host.Components.IInstanceManager.GetInstance(), Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Host.Configuration.GeneralConfiguration.GitHubAccessToken, Tgstation.Server.Host.Controllers.RepositoryController.gitHubClientFactory, Tgstation.Server.Api.Models.Instance.Id, Tgstation.Server.Api.Models.Internal.User.Id, Tgstation.Server.Host.Controllers.RepositoryController.instanceManager, Tgstation.Server.Host.Controllers.RepositoryController.jobManager, Tgstation.Server.Host.Controllers.RepositoryController.LoadRevisionInformation(), Tgstation.Server.Api.Models.Internal.User.Name, Tgstation.Server.Host.Controllers.RepositoryController.PopulateApi(), Tgstation.Server.Host.Core.IJobManager.RegisterOperation(), Tgstation.Server.Host.Components.IInstance.RepositoryManager, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.RepositorySettings, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save(), and Tgstation.Server.Host.Security.AuthenticationContext.User.

+ +
+
+

Member Data Documentation

+ +

◆ generalConfiguration

+ +
+
+ + + + + +
+ + + + +
readonly GeneralConfiguration Tgstation.Server.Host.Controllers.RepositoryController.generalConfiguration
+
+private
+
+
+ +

◆ gitHubClientFactory

+ +
+
+ + + + + +
+ + + + +
readonly IGitHubClientFactory Tgstation.Server.Host.Controllers.RepositoryController.gitHubClientFactory
+
+private
+
+
+ +

◆ instanceManager

+ + + +

◆ jobManager

+ + +
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.png b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..42555dccebeb4287a4be25ca0be97785642f936e GIT binary patch literal 1273 zcmcJPc~Dzb6o(&%HY^1livrCcYN<9Yl=acFizI~5vKV3!+W-P-r~$D+*q2fjN-LzM z>=YOV3bG7fD0>qqTU0iUY-wtMMj()F(Bx4_llWRY9moH@GrxPjJ9Ga!=bKX)9EdYA zIAQ<*fDzsgLjVAsOqhf95b!3K#*Mh+A{vV@;{ z$%McV0RHssEc{G#007&hU8xpHTxExnH=a>jH0I?2+< z>h##}>6^dspi$c|&F{-&)~)cIDwJ8BDvXGm3^&Jf=~dm9sKL>k9&jJr|so%KcTpdfv=CTUAw$jQXQh?A61mp zCV}8t48y`k1zNZfi3MS+1i?|}1qjVyJ8rQ*L-|BA?c;3P(}xzMf(wBX+QWC0?=?Qg zQ3qHR2nd`uXrisn-fHAdc@7pQu8u};#Vf)nI3|}|%-gk5v>wissrr#sK2siwInx;^;AuJW7_XB3G zoX_50j0u9fkkd=)s52DHATXR3T+Sogd_f${iXnf9 zVbTy|i?@FX8C?-&WW3E3GwV|zH#7o3U!|YqA-)!gPp%;_$DdK2=Ndv6CJg!~#5i34 z*NEudws%X2=(|}LO|F`Z6qHJIqDuaiS#0Z&*LFafz9-qj7hd=Ol^Z zUh`a?j8P20r1Z5yA#KxIE$wJzAjt3h2OL~gm@?fCzR0lJa-JUK?N#4tskQ_o;h;y`? z>U$eb({cI^65I>X0>g93RepoP9OP0##+cg(M#~n^9aGYcKc8(Eq^|F0%?yy_M%C2< zosGe9jhiR~zx0+?qUzze#mDE0HH(DuC3ds(4QbKo`4naLqO237L|iJ{?{9zLIS)6n z$#sgorw2{>aN(3~NK?J`)k75i5ncyf%?;R0*Z_uo+|A|w3K fEd>9)dm4mH60mJ|`ny + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html new file mode 100644 index 0000000000..fa179d3b37 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html @@ -0,0 +1,421 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute Class Reference
+
+
+ +

Helper for using the AuthorizeAttribute with the Api.Rights system + More...

+
+Inheritance diagram for Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute:
+
+
+ + +AuthorizeAttribute + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 TgsAuthorizeAttribute ()
 Construct a TgsAuthorizeAttribute More...
 
 TgsAuthorizeAttribute (AdministrationRights requiredRights)
 Construct a TgsAuthorizeAttribute for AdministrationRights More...
 
 TgsAuthorizeAttribute (InstanceManagerRights requiredRights)
 Construct a TgsAuthorizeAttribute for InstanceManagerRights More...
 
 TgsAuthorizeAttribute (RepositoryRights requiredRights)
 Construct a TgsAuthorizeAttribute for RepositoryRights More...
 
 TgsAuthorizeAttribute (ByondRights requiredRights)
 Construct a TgsAuthorizeAttribute for ByondRights More...
 
 TgsAuthorizeAttribute (DreamMakerRights requiredRights)
 Construct a TgsAuthorizeAttribute for DreamMakerRights More...
 
 TgsAuthorizeAttribute (DreamDaemonRights requiredRights)
 Construct a TgsAuthorizeAttribute for DreamDaemonRights More...
 
 TgsAuthorizeAttribute (ChatBotRights requiredRights)
 Construct a TgsAuthorizeAttribute for ChatBotRights More...
 
 TgsAuthorizeAttribute (ConfigurationRights requiredRights)
 Construct a TgsAuthorizeAttribute for ConfigurationRights More...
 
 TgsAuthorizeAttribute (InstanceUserRights requiredRights)
 Construct a TgsAuthorizeAttribute for InstanceUserRights More...
 
+

Detailed Description

+

Helper for using the AuthorizeAttribute with the Api.Rights system

+ +

Definition at line 12 of file TgsAuthorizeAttribute.cs.

+

Constructor & Destructor Documentation

+ +

◆ TgsAuthorizeAttribute() [1/10]

+ +
+
+ + + + + + + +
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute ()
+
+ +

Construct a TgsAuthorizeAttribute

+ +

Definition at line 17 of file TgsAuthorizeAttribute.cs.

+
17 { }
+
+
+ +

◆ TgsAuthorizeAttribute() [2/10]

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute (AdministrationRights requiredRights)
+
+ +

Construct a TgsAuthorizeAttribute for AdministrationRights

+
Parameters
+ + +
requiredRightsThe rights required
+
+
+ +

Definition at line 23 of file TgsAuthorizeAttribute.cs.

+
24  {
25  Roles = RightsHelper.RoleNames(requiredRights);
26  }
+
+
+
+ +

◆ TgsAuthorizeAttribute() [3/10]

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute (InstanceManagerRights requiredRights)
+
+ +

Construct a TgsAuthorizeAttribute for InstanceManagerRights

+
Parameters
+ + +
requiredRightsThe rights required
+
+
+ +

Definition at line 32 of file TgsAuthorizeAttribute.cs.

+
33  {
34  Roles = RightsHelper.RoleNames(requiredRights);
35  }
+
+
+
+ +

◆ TgsAuthorizeAttribute() [4/10]

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute (RepositoryRights requiredRights)
+
+ +

Construct a TgsAuthorizeAttribute for RepositoryRights

+
Parameters
+ + +
requiredRightsThe rights required
+
+
+ +

Definition at line 41 of file TgsAuthorizeAttribute.cs.

+
42  {
43  Roles = RightsHelper.RoleNames(requiredRights);
44  }
+
+
+
+ +

◆ TgsAuthorizeAttribute() [5/10]

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute (ByondRights requiredRights)
+
+ +

Construct a TgsAuthorizeAttribute for ByondRights

+
Parameters
+ + +
requiredRightsThe rights required
+
+
+ +

Definition at line 50 of file TgsAuthorizeAttribute.cs.

+
51  {
52  Roles = RightsHelper.RoleNames(requiredRights);
53  }
+
+
+
+ +

◆ TgsAuthorizeAttribute() [6/10]

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute (DreamMakerRights requiredRights)
+
+ +

Construct a TgsAuthorizeAttribute for DreamMakerRights

+
Parameters
+ + +
requiredRightsThe rights required
+
+
+ +

Definition at line 59 of file TgsAuthorizeAttribute.cs.

+
60  {
61  Roles = RightsHelper.RoleNames(requiredRights);
62  }
+
+
+
+ +

◆ TgsAuthorizeAttribute() [7/10]

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute (DreamDaemonRights requiredRights)
+
+ +

Construct a TgsAuthorizeAttribute for DreamDaemonRights

+
Parameters
+ + +
requiredRightsThe rights required
+
+
+ +

Definition at line 68 of file TgsAuthorizeAttribute.cs.

+
69  {
70  Roles = RightsHelper.RoleNames(requiredRights);
71  }
+
+
+
+ +

◆ TgsAuthorizeAttribute() [8/10]

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute (ChatBotRights requiredRights)
+
+ +

Construct a TgsAuthorizeAttribute for ChatBotRights

+
Parameters
+ + +
requiredRightsThe rights required
+
+
+ +

Definition at line 77 of file TgsAuthorizeAttribute.cs.

+
78  {
79  Roles = RightsHelper.RoleNames(requiredRights);
80  }
+
+
+
+ +

◆ TgsAuthorizeAttribute() [9/10]

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute (ConfigurationRights requiredRights)
+
+ +

Construct a TgsAuthorizeAttribute for ConfigurationRights

+
Parameters
+ + +
requiredRightsThe rights required
+
+
+ +

Definition at line 86 of file TgsAuthorizeAttribute.cs.

+
87  {
88  Roles = RightsHelper.RoleNames(requiredRights);
89  }
+
+
+
+ +

◆ TgsAuthorizeAttribute() [10/10]

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute (InstanceUserRights requiredRights)
+
+ +

Construct a TgsAuthorizeAttribute for InstanceUserRights

+
Parameters
+ + +
requiredRightsThe rights required
+
+
+ +

Definition at line 95 of file TgsAuthorizeAttribute.cs.

+
96  {
97  Roles = RightsHelper.RoleNames(requiredRights);
98  }
+
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.png b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.png new file mode 100644 index 0000000000000000000000000000000000000000..507b742f2aa88f7831a24df1548223b23342dcf2 GIT binary patch literal 1015 zcmeAS@N?(olHy`uVBq!ia0y~yU~~nt12~w0WUck63fsuKe1%rDfCpUMrg=nc6k;CeQRG{U4`C%;656 zl-4u-|DvOxSM1wVG4Ipog!!BEbmb1KyiB%9*l53cy-wfexVNsJzcl!xW#Y2;F5GxA zQpfi0?$Akg$0mziZ+(Ayed^L$*;!Jty6;kVp0HhAZTPeQN`~jJdO>ur2q6pTh!vl+ zJYo6#JL8YjKbbffWLjJq)Z^n93LbEeU@6$-!PCp2cSxyWegVe=RUM`Z&TfV{Ab0u( zs&b#2NBC$iRaiPjWK!*(=FEOqB?Wm_@-R?NC*+m3rO829~Vc)NVd^2TE|>+;Ob z?(a94Uw`u|k9^v1mHnDuXhtM6L9jr|E`{1e=6Evqb!y>lpP&bsV%&#nId{FB+k;v=D7 zpR}>Cc-@~n_`th4f`ReUk z*F?;@%5VMmnalng-Ql+@#A>!R3SCHM=KEc@OWgMT(VecF8%}oatJeS4SXZ#<{pbA^ zihjvode0>lOT^912!5PZ`7W!Zx@gy|>u#%J%`QhRe*O9`+pE_%_PAZ2Ts^VA__T7& z*V{N*jry@ qU_4Nc7ITq0%ccZP2=aRWnLTT>t7~Scbrvv}GI+ZBxvX + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Controllers.UserController Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Controllers.UserController, including all inherited members.

+ + + + + + + + + + + + + + + +
Create([FromBody] UserUpdate model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.UserController
ModelController< UserUpdate >.Create([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< UserUpdate >virtual
cryptographySuiteTgstation.Server.Host.Controllers.UserControllerprivate
Delete(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< UserUpdate >virtual
generalConfigurationTgstation.Server.Host.Controllers.UserControllerprivate
GetId(long id, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.UserControllervirtual
List(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.UserControllervirtual
loggerTgstation.Server.Host.Controllers.UserControllerprivate
ModelController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)Tgstation.Server.Host.Controllers.ModelController< UserUpdate >
Read(CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.UserControllervirtual
systemIdentityFactoryTgstation.Server.Host.Controllers.UserControllerprivate
Update([FromBody] UserUpdate model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.UserController
ModelController< UserUpdate >.Update([FromBody]TModel model, CancellationToken cancellationToken)Tgstation.Server.Host.Controllers.ModelController< UserUpdate >virtual
UserController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ISystemIdentityFactory systemIdentityFactory, ICryptographySuite cryptographySuite, ILogger< UserController > logger, IOptions< GeneralConfiguration > generalConfigurationOptions)Tgstation.Server.Host.Controllers.UserController
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html new file mode 100644 index 0000000000..a8f218821a --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html @@ -0,0 +1,571 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Controllers.UserController Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Controllers.UserController Class Reference
+
+
+ +

For managing Users + More...

+
+Inheritance diagram for Tgstation.Server.Host.Controllers.UserController:
+
+
+ + +Tgstation.Server.Host.Controllers.ModelController< UserUpdate > + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 UserController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ISystemIdentityFactory systemIdentityFactory, ICryptographySuite cryptographySuite, ILogger< UserController > logger, IOptions< GeneralConfiguration > generalConfigurationOptions)
 Construct a UserController More...
 
override async Task< IActionResult > Create ([FromBody] UserUpdate model, CancellationToken cancellationToken)
 
override async Task< IActionResult > Update ([FromBody] UserUpdate model, CancellationToken cancellationToken)
 
override Task< IActionResult > Read (CancellationToken cancellationToken)
 Attempt to read a TModel More...
 
override async Task< IActionResult > List (CancellationToken cancellationToken)
 Attempt to list entries of the TModel More...
 
override async Task< IActionResult > GetId (long id, CancellationToken cancellationToken)
 Attempt to get a specific a TModel More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Controllers.ModelController< UserUpdate >
 ModelController (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance)
 Construct a ModelController<TModel> More...
 
virtual Task< IActionResult > Create ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to create a model More...
 
virtual Task< IActionResult > Update ([FromBody]TModel model, CancellationToken cancellationToken)
 Attempt to update a model More...
 
virtual Task< IActionResult > Delete (long id, CancellationToken cancellationToken)
 Attempt to delete a model with a particular id More...
 
+ + + + + + + + + + + + + +

+Private Attributes

readonly ISystemIdentityFactory systemIdentityFactory
 The ISystemIdentityFactory for the UserController More...
 
readonly ICryptographySuite cryptographySuite
 The ICryptographySuite for the UserController More...
 
readonly ILogger< UserControllerlogger
 The ILogger for the UserController More...
 
readonly GeneralConfiguration generalConfiguration
 The GeneralConfiguration for the UserController More...
 
+

Detailed Description

+

For managing Users

+ +

Definition at line 25 of file UserController.cs.

+

Constructor & Destructor Documentation

+ +

◆ UserController()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Controllers.UserController.UserController (IDatabaseContext databaseContext,
IAuthenticationContextFactory authenticationContextFactory,
ISystemIdentityFactory systemIdentityFactory,
ICryptographySuite cryptographySuite,
ILogger< UserControllerlogger,
IOptions< GeneralConfigurationgeneralConfigurationOptions 
)
+
+ +

Construct a UserController

+
Parameters
+ + + + + + + +
databaseContextThe IDatabaseContext for the ApiController
authenticationContextFactoryThe IAuthenticationContextFactory for the ApiController
systemIdentityFactoryThe value of systemIdentityFactory
cryptographySuiteThe value of cryptographySuite
loggerThe value of logger
generalConfigurationOptionsThe IOptions<TOptions> containing the value of generalConfiguration
+
+
+ +

Definition at line 56 of file UserController.cs.

+
56  : base(databaseContext, authenticationContextFactory, logger, false)
57  {
58  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
59  this.systemIdentityFactory = systemIdentityFactory ?? throw new ArgumentNullException(nameof(systemIdentityFactory));
60  this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
61  generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
62  }
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the UserController
+
readonly ISystemIdentityFactory systemIdentityFactory
The ISystemIdentityFactory for the UserController
+
readonly ILogger< UserController > logger
The ILogger for the UserController
+
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the UserController
+
+

References Tgstation.Server.Host.Controllers.UserController.cryptographySuite, Tgstation.Server.Host.Controllers.UserController.generalConfiguration, Tgstation.Server.Host.Controllers.UserController.logger, and Tgstation.Server.Host.Controllers.UserController.systemIdentityFactory.

+ +
+
+

Member Function Documentation

+ +

◆ Create()

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.UserController.Create ([FromBody] UserUpdate model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 66 of file UserController.cs.

+
67  {
68  if (model == null)
69  throw new ArgumentNullException(nameof(model));
70 
71  if (!(model.Password == null ^ model.SystemIdentifier == null))
72  return BadRequest(new ErrorMessage { Message = "User must have exactly one of either a password or system identifier!" });
73 
74  model.Name = model.Name?.Trim();
75  if (model.Name?.Length == 0)
76  model.Name = null;
77 
78  if (!(model.Name == null ^ model.SystemIdentifier == null))
79  return BadRequest(new ErrorMessage { Message = "User must have a name if and only if user has no system identifier!" });
80 
81  var dbUser = new Models.User
82  {
84  CreatedAt = DateTimeOffset.Now,
85  CreatedBy = AuthenticationContext.User,
86  Enabled = model.Enabled ?? false,
88  Name = model.Name,
89  SystemIdentifier = model.SystemIdentifier,
90  InstanceUsers = new List<Models.InstanceUser>()
91  };
92 
93  if (model.SystemIdentifier != null)
94  try
95  {
96  using (var sysIdentity = await systemIdentityFactory.CreateSystemIdentity(dbUser, cancellationToken).ConfigureAwait(false))
97  {
98  if (sysIdentity == null)
99  return StatusCode((int)HttpStatusCode.Gone);
100  dbUser.Name = sysIdentity.Username;
101  dbUser.SystemIdentifier = sysIdentity.Uid;
102  }
103  }
104  catch (NotImplementedException)
105  {
106  return StatusCode((int)HttpStatusCode.NotImplemented);
107  }
108  else
109  {
111  return BadRequest(new ErrorMessage { Message = String.Format(CultureInfo.InvariantCulture, "Password must be at least {0} characters long!", generalConfiguration.MinimumPasswordLength) });
112  cryptographySuite.SetUserPassword(dbUser, model.Password, true);
113  }
114 
115  dbUser.CanonicalName = dbUser.Name.ToUpperInvariant();
116 
117  DatabaseContext.Users.Add(dbUser);
118 
119  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
120 
121  return StatusCode((int)HttpStatusCode.Created, dbUser.ToApi(true));
122  }
string Name
The name of the User
Definition: User.cs:38
+ +
Task< ISystemIdentity > CreateSystemIdentity(User user, CancellationToken cancellationToken)
Create a ISystemIdentity for a given user
+ +
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the UserController
+
AdministrationRights? AdministrationRights
The Rights.AdministrationRights for the User
Definition: User.cs:44
+
readonly ISystemIdentityFactory systemIdentityFactory
The ISystemIdentityFactory for the UserController
+
AdministrationRights
Rights for Models.Administration
+
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the UserController
+
InstanceManagerRights
Rights for managing Models.Instances
+ +
InstanceManagerRights? InstanceManagerRights
The Rights.InstanceManagerRights for the User
Definition: User.cs:50
+
string Password
Cleartext password of the User
Definition: UserUpdate.cs:11
+
override async Task< IActionResult > List(CancellationToken cancellationToken)
Attempt to list entries of the TModel
+
void SetUserPassword(User user, string newPassword, bool newUser)
Sets a User.PasswordHash for a given user
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
bool? Enabled
If the User is enabled since users cannot be deleted. System users cannot be disabled
Definition: User.cs:21
+
string SystemIdentifier
The SID/UID of the User on Windows/POSIX respectively
Definition: User.cs:32
+
uint MinimumPasswordLength
Minimum length of database user passwords
+
+

References Tgstation.Server.Host.Security.ISystemIdentityFactory.CreateSystemIdentity(), Tgstation.Server.Host.Controllers.UserController.cryptographySuite, Tgstation.Server.Api.Models.Internal.User.Enabled, Tgstation.Server.Host.Controllers.UserController.generalConfiguration, Tgstation.Server.Host.Controllers.UserController.List(), Tgstation.Server.Host.Configuration.GeneralConfiguration.MinimumPasswordLength, Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save(), Tgstation.Server.Host.Security.ICryptographySuite.SetUserPassword(), Tgstation.Server.Host.Controllers.UserController.systemIdentityFactory, Tgstation.Server.Host.Security.AuthenticationContext.User, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Users.

+ +
+
+ +

◆ GetId()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.UserController.GetId (long id,
CancellationToken cancellationToken 
)
+
+virtual
+
+ +

Attempt to get a specific a TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< UserUpdate >.

+ +

Definition at line 183 of file UserController.cs.

+
184  {
185  if (id == AuthenticationContext.User.Id)
186  return await Read(cancellationToken).ConfigureAwait(false);
187 
188  if (!((AdministrationRights)AuthenticationContext.GetRight(RightsType.Administration)).HasFlag(AdministrationRights.ReadUsers))
189  return Forbid();
190 
191  var user = await DatabaseContext.Users
192  .Where(x => x.Id == id)
193  .Include(x => x.CreatedBy)
194  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
195  if (user == default)
196  return NotFound();
197  return Json(user.ToApi(true));
198  }
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+ +
override Task< IActionResult > Read(CancellationToken cancellationToken)
Attempt to read a TModel
+
AdministrationRights
Rights for Models.Administration
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+ +
long Id
The ID of the User
Definition: User.cs:15
+ +
+

References Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Api.Models.Internal.User.Id, Tgstation.Server.Host.Controllers.UserController.Read(), Tgstation.Server.Host.Security.AuthenticationContext.User, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Users.

+ +
+
+ +

◆ List()

+ +
+
+ + + + + +
+ + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.UserController.List (CancellationToken cancellationToken)
+
+virtual
+
+ +

Attempt to list entries of the TModel

+ +

Reimplemented from Tgstation.Server.Host.Controllers.ModelController< UserUpdate >.

+ +

Definition at line 173 of file UserController.cs.

+
174  {
175  var users = await DatabaseContext.Users
176  .Include(x => x.CreatedBy)
177  .ToListAsync(cancellationToken).ConfigureAwait(false);
178  return Json(users.Select(x => x.ToApi(true)));
179  }
+ +
+

References Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Users.

+ +

Referenced by Tgstation.Server.Host.Controllers.UserController.Create().

+ +
+
+ +

◆ Read()

+ +
+
+ + + + + +
+ + + + + + + + +
override Task<IActionResult> Tgstation.Server.Host.Controllers.UserController.Read (CancellationToken cancellationToken)
+
+virtual
+
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
override async Task<IActionResult> Tgstation.Server.Host.Controllers.UserController.Update ([FromBody] UserUpdate model,
CancellationToken cancellationToken 
)
+
+ +

+ +

Definition at line 126 of file UserController.cs.

+
127  {
128  if (model == null)
129  throw new ArgumentNullException(nameof(model));
130 
131  var passwordEditOnly = !AuthenticationContext.User.AdministrationRights.Value.HasFlag(AdministrationRights.WriteUsers);
132 
133  var originalUser = passwordEditOnly ? AuthenticationContext.User : await DatabaseContext.Users.Where(x => x.Id == model.Id)
134  .Include(x => x.CreatedBy)
135  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
136  if (originalUser == default)
137  return NotFound();
138 
139  if (passwordEditOnly && (model.Id != originalUser.Id || model.InstanceManagerRights.HasValue || model.AdministrationRights.HasValue || model.Enabled.HasValue || model.SystemIdentifier != null || model.Name != null))
140  return Forbid();
141 
142  if (model.Password != null)
143  {
144  if (originalUser.PasswordHash == null)
145  return BadRequest(new ErrorMessage { Message = "Cannot convert a system user to a password user!" });
146  cryptographySuite.SetUserPassword(originalUser, model.Password, false);
147  }
148  else if (model.SystemIdentifier != null && model.SystemIdentifier != originalUser.SystemIdentifier)
149  return BadRequest(new ErrorMessage { Message = "Cannot change a user's system identifier!" });
150 
151  if (model.Name != null && model.Name.ToUpperInvariant() != originalUser.CanonicalName)
152  return BadRequest(new ErrorMessage { Message = "Can only change capitalization of a user's name!" });
153 
154  originalUser.InstanceManagerRights = model.InstanceManagerRights ?? originalUser.InstanceManagerRights;
155  originalUser.AdministrationRights = model.AdministrationRights ?? originalUser.AdministrationRights;
156  originalUser.Enabled = model.Enabled ?? originalUser.Enabled;
157  originalUser.Name = model.Name ?? originalUser.Name;
158 
159  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
160 
161  return Json(model.Id == originalUser.Id || (AuthenticationContext.GetRight(RightsType.Administration) & (ulong)AdministrationRights.ReadUsers) != 0 ? originalUser.ToApi(true) : new Api.Models.User
162  {
163  Id = originalUser.Id
164  });
165  }
string Name
The name of the User
Definition: User.cs:38
+ +
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+ +
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the UserController
+
AdministrationRights? AdministrationRights
The Rights.AdministrationRights for the User
Definition: User.cs:44
+
AdministrationRights
Rights for Models.Administration
+
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
+
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
+ +
InstanceManagerRights? InstanceManagerRights
The Rights.InstanceManagerRights for the User
Definition: User.cs:50
+
string Password
Cleartext password of the User
Definition: UserUpdate.cs:11
+
long Id
The ID of the User
Definition: User.cs:15
+
void SetUserPassword(User user, string newPassword, bool newUser)
Sets a User.PasswordHash for a given user
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+ +
bool? Enabled
If the User is enabled since users cannot be deleted. System users cannot be disabled
Definition: User.cs:21
+
string SystemIdentifier
The SID/UID of the User on Windows/POSIX respectively
Definition: User.cs:32
+
+

References Tgstation.Server.Api.Models.Internal.User.AdministrationRights, Tgstation.Server.Host.Controllers.UserController.cryptographySuite, Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Save(), Tgstation.Server.Host.Security.ICryptographySuite.SetUserPassword(), Tgstation.Server.Host.Security.AuthenticationContext.User, and Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Users.

+ +
+
+

Member Data Documentation

+ +

◆ cryptographySuite

+ +
+
+ + + + + +
+ + + + +
readonly ICryptographySuite Tgstation.Server.Host.Controllers.UserController.cryptographySuite
+
+private
+
+
+ +

◆ generalConfiguration

+ +
+
+ + + + + +
+ + + + +
readonly GeneralConfiguration Tgstation.Server.Host.Controllers.UserController.generalConfiguration
+
+private
+
+
+ +

◆ logger

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<UserController> Tgstation.Server.Host.Controllers.UserController.logger
+
+private
+
+ +

The ILogger for the UserController

+ +

Definition at line 40 of file UserController.cs.

+ +

Referenced by Tgstation.Server.Host.Controllers.UserController.UserController().

+ +
+
+ +

◆ systemIdentityFactory

+ +
+
+ + + + + +
+ + + + +
readonly ISystemIdentityFactory Tgstation.Server.Host.Controllers.UserController.systemIdentityFactory
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.png b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..ddbfa2ade9b17f5027e924664fba0e10e5afd016 GIT binary patch literal 1224 zcmeAS@N?(olHy`uVBq!ia0y~yU~B-g12~w0q3C;FPE&Q$nKWh65)M@cPp%NA2}>N{j8KNu zzv?G#-hTZW{(WtogqY_gpVwRJKK-*ZH91!NVolu#;X8cutXHO~ti1lj`+4jnwwcle zVz(wXKCVzX`BLV$PugZ(*;fy|4C5k$*wm zifgqijvamVd+wy%5`#NRh77ZqrN7jwZ#D@R&%6El(Z%ZD6IGVW9oVM+d&LUdw5HqJ zIZwYkH0NaPql8P1Z<1g5l(nsG)m@%fw*T8S;p&Z1v(y)Uc`3c8JkpxsLQ?L{mzg^* ztE}wVw0_-bnH?W?O6Kiu(Mu1|G;xO1NH|()|!s#whwInToy`Ek~FvF z{IzSc{FjExU+=y&T-%eKU&()C+Pk}X-&g&6uCrA!-t@K5^?h>|?z_9a>Vot<*~VuF z*lVwM+V4{Pr8gz_?}J*|Pof!22jY!Ay*w|u#-54eUy#266p8a+DK<2BD|u>q{#vn| zK}A#5vwks)f@h-_!z7UvaE5q8YUH#lz}W9#_?KDBxP&2T3IoHVFJGs!FdPE2PSp!B zbObRmaD*WKmW(WAcK4F`4v?Aqe&h3WUbBt$r|ME2)-^N(C;yFWH z`qSV2@0CB>ng2d-_3K}4y)0kB*ZqEl&Tz0ENFt2D!{b+_(SNxh3; zOr26&8vE=(tN*2pWS>hBDsyipo^u7MiDvML%D&Xckh45%{|QqLbCaEnXOCW0v5fyL zl=A$}HlS_$*&b|RDec@WdXizr*2w*Tmax=XEPedcaPGF*pAVQFF#YSxKZCiTbMBM{ zo8>M@?+R!-SABpPWVFPA@?U3N>*7!4uda@K$^FJ^OKoB6UA~`>Vy55Fd&&FtZJqqq z*U_AxCiZ;1vl(cSKSPNMLl8sw7l{Llf3ttEzy4Wz!(GP)5ug=boJ<~!G2y@{4?)6L kxE(Z?F7eV-b@|V@Q_QdN&_%O;V6nsC>FVdQ&MBb@04b#vRR910 literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application-members.html new file mode 100644 index 0000000000..3d50c4a8aa --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application-members.html @@ -0,0 +1,96 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.Application Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.Application, including all inherited members.

+ + + + + + + + + + + + +
Application(IConfiguration configuration, Microsoft.AspNetCore.Hosting.IHostingEnvironment hostingEnvironment)Tgstation.Server.Host.Core.Application
configurationTgstation.Server.Host.Core.Applicationprivate
Configure(IApplicationBuilder applicationBuilder, IServerControl serverControl, ITokenFactory tokenFactory, IOptions< ControlPanelConfiguration > controlPanelConfigurationOptions, ILogger< Application > logger)Tgstation.Server.Host.Core.Application
ConfigureServices(IServiceCollection services)Tgstation.Server.Host.Core.Application
hostingEnvironmentTgstation.Server.Host.Core.Applicationprivate
Ready(Exception initializationError)Tgstation.Server.Host.Core.Application
startupTcsTgstation.Server.Host.Core.Applicationprivate
tokenFactoryTgstation.Server.Host.Core.Applicationprivate
VersionTgstation.Server.Host.Core.Application
VersionPrefixTgstation.Server.Host.Core.Application
VersionStringTgstation.Server.Host.Core.Application
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html new file mode 100644 index 0000000000..0b95c57c66 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html @@ -0,0 +1,587 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.Application Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.Application Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.Application:
+
+
+ + +Tgstation.Server.Host.Core.IApplication + +
+ + + + + + + + + + + + + + +

+Public Member Functions

 Application (IConfiguration configuration, Microsoft.AspNetCore.Hosting.IHostingEnvironment hostingEnvironment)
 Construct an Application More...
 
void ConfigureServices (IServiceCollection services)
 Configure dependency injected services More...
 
void Configure (IApplicationBuilder applicationBuilder, IServerControl serverControl, ITokenFactory tokenFactory, IOptions< ControlPanelConfiguration > controlPanelConfigurationOptions, ILogger< Application > logger)
 Configure the Application More...
 
void Ready (Exception initializationError)
 Mark the IApplication as ready to run More...
 
+ + + +

+Public Attributes

string VersionPrefix => "tgstation-server"
 
+ + + + + + + + + + + + + + + +

+Properties

Version Version [get]
 
string VersionString [get]
 
- Properties inherited from Tgstation.Server.Host.Core.IApplication
string VersionPrefix [get]
 Prefix to VersionString More...
 
string VersionString [get]
 A more verbose version of Version More...
 
Version Version [get]
 The version of the Application More...
 
+ + + + + + + + + + + + + +

+Private Attributes

readonly IConfiguration configuration
 The IConfiguration for the Application More...
 
readonly Microsoft.AspNetCore.Hosting.IHostingEnvironment hostingEnvironment
 The Microsoft.AspNetCore.Hosting.IHostingEnvironment for the Application More...
 
readonly TaskCompletionSource< object > startupTcs
 The TaskCompletionSource<TResult> used for determining when the Application is Ready(Exception) More...
 
ITokenFactory tokenFactory
 The ITokenFactory for the Application More...
 
+

Detailed Description

+
+

Definition at line 38 of file Application.cs.

+

Constructor & Destructor Documentation

+ +

◆ Application()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Core.Application.Application (IConfiguration configuration,
Microsoft.AspNetCore.Hosting.IHostingEnvironment hostingEnvironment 
)
+
+ +

Construct an Application

+
Parameters
+ + + +
configurationThe value of configuration
hostingEnvironmentThe value of hostingEnvironment
+
+
+ +

Definition at line 74 of file Application.cs.

+
75  {
76  this.configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
77  this.hostingEnvironment = hostingEnvironment ?? throw new ArgumentNullException(nameof(hostingEnvironment));
78 
79  startupTcs = new TaskCompletionSource<object>();
80 
81  Version = Assembly.GetExecutingAssembly().GetName().Version;
82  VersionString = String.Format(CultureInfo.InvariantCulture, "{0} v{1}", VersionPrefix, Version);
83  }
readonly Microsoft.AspNetCore.Hosting.IHostingEnvironment hostingEnvironment
The Microsoft.AspNetCore.Hosting.IHostingEnvironment for the Application
Definition: Application.cs:57
+ + +
readonly TaskCompletionSource< object > startupTcs
The TaskCompletionSource<TResult> used for determining when the Application is Ready(Exception)
Definition: Application.cs:62
+ +
readonly IConfiguration configuration
The IConfiguration for the Application
Definition: Application.cs:52
+
+

References Tgstation.Server.Host.Core.Application.configuration, Tgstation.Server.Host.Core.Application.hostingEnvironment, Tgstation.Server.Host.Core.Application.startupTcs, Tgstation.Server.Host.Core.Application.Version, Tgstation.Server.Host.Core.Application.VersionPrefix, and Tgstation.Server.Host.Core.Application.VersionString.

+ +
+
+

Member Function Documentation

+ +

◆ Configure()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void Tgstation.Server.Host.Core.Application.Configure (IApplicationBuilder applicationBuilder,
IServerControl serverControl,
ITokenFactory tokenFactory,
IOptions< ControlPanelConfigurationcontrolPanelConfigurationOptions,
ILogger< Applicationlogger 
)
+
+ +

Configure the Application

+
Parameters
+ + + + + + +
applicationBuilderThe IApplicationBuilder to configure
serverControlThe IServerControl for the Application
tokenFactoryThe value of tokenFactory
controlPanelConfigurationOptionsThe IOptions<TOptions> containing the ControlPanelConfiguration to use
loggerThe Microsoft.Extensions.Logging.ILogger for the Application
+
+
+ +

Definition at line 331 of file Application.cs.

+
332  {
333  if (applicationBuilder == null)
334  throw new ArgumentNullException(nameof(applicationBuilder));
335  if (serverControl == null)
336  throw new ArgumentNullException(nameof(serverControl));
337 
338  this.tokenFactory = tokenFactory ?? throw new ArgumentNullException(nameof(tokenFactory));
339 
340  var controlPanelConfiguration = controlPanelConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(controlPanelConfigurationOptions));
341 
342  if (logger == null)
343  throw new ArgumentNullException(nameof(logger));
344 
345  logger.LogInformation(VersionString);
346  logger.LogDebug("Content Root: {0}", hostingEnvironment.ContentRootPath);
347  logger.LogTrace("Web Root: {0}", hostingEnvironment.WebRootPath);
348 
349  // attempt to restart the server if the configuration changes
350  if(serverControl.WatchdogPresent)
351  ChangeToken.OnChange(configuration.GetReloadToken, () => serverControl.Restart());
352 
353  // setup the HTTP request pipeline
354 
355  // should anything after this throw an exception, catch it and display a detailed html page
356  applicationBuilder.UseDeveloperExceptionPage(); // it is not worth it to limit this, you should only ever get it if you're an authorized user
357 
358  // suppress OperationCancelledExceptions, they are just aborted HTTP requests
359  applicationBuilder.UseCancelledRequestSuppression();
360 
361  // Set up CORS based on configuration if necessary
362  Action<CorsPolicyBuilder> corsBuilder = null;
363  if (controlPanelConfiguration.AllowAnyOrigin)
364  {
365  logger.LogTrace("Access-Control-Allow-Origin: *");
366  corsBuilder = builder => builder.AllowAnyOrigin();
367  }
368  else if (controlPanelConfiguration.AllowedOrigins?.Count > 0)
369  {
370  logger.LogTrace("Access-Control-Allow-Origin: ", String.Join(',', controlPanelConfiguration.AllowedOrigins));
371  corsBuilder = builder => builder.WithOrigins(controlPanelConfiguration.AllowedOrigins.ToArray());
372  }
373 
374  var originalBuilder = corsBuilder;
375  corsBuilder = builder =>
376  {
377  builder.AllowAnyHeader().AllowAnyMethod();
378  originalBuilder?.Invoke(builder);
379  };
380  applicationBuilder.UseCors(corsBuilder);
381 
382  // Do not service requests until Ready is called, this will return 503 until that point
383  applicationBuilder.UseAsyncInitialization(async cancellationToken =>
384  {
385  using (cancellationToken.Register(() => startupTcs.SetCanceled()))
386  await startupTcs.Task.ConfigureAwait(false);
387  });
388 
389  // spa loading if necessary
390  if (controlPanelConfiguration.Enable)
391  {
392  logger.LogWarning("Web control panel enabled. This is a highly WIP feature!");
393  applicationBuilder.UseStaticFiles();
394  }
395  else
396  logger.LogDebug("Web control panel disabled!");
397 
398  // authenticate JWT tokens using our security pipeline if present, returns 401 if bad
399  applicationBuilder.UseAuthentication();
400 
401  // suppress and log database exceptions
402  applicationBuilder.UseDbConflictHandling();
403 
404  // majority of handling is done in the controllers
405  applicationBuilder.UseMvc();
406 
407  // 404 anything that gets this far
408  }
readonly Microsoft.AspNetCore.Hosting.IHostingEnvironment hostingEnvironment
The Microsoft.AspNetCore.Hosting.IHostingEnvironment for the Application
Definition: Application.cs:57
+
ITokenFactory tokenFactory
The ITokenFactory for the Application
Definition: Application.cs:67
+ +
readonly TaskCompletionSource< object > startupTcs
The TaskCompletionSource<TResult> used for determining when the Application is Ready(Exception)
Definition: Application.cs:62
+
readonly IConfiguration configuration
The IConfiguration for the Application
Definition: Application.cs:52
+
+

References Tgstation.Server.Host.Core.Application.configuration, Tgstation.Server.Host.Core.Application.hostingEnvironment, Tgstation.Server.Host.Core.IServerControl.Restart(), Tgstation.Server.Host.Core.Application.startupTcs, Tgstation.Server.Host.Core.Application.tokenFactory, Tgstation.Server.Host.Core.Application.VersionString, and Tgstation.Server.Host.Core.IServerControl.WatchdogPresent.

+ +
+
+ +

◆ ConfigureServices()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.Core.Application.ConfigureServices (IServiceCollection services)
+
+ +

Configure dependency injected services

+
Parameters
+ + +
servicesThe IServiceCollection to configure
+
+
+ +

Definition at line 89 of file Application.cs.

+
90  {
91  if (services == null)
92  throw new ArgumentNullException(nameof(services));
93 
94  // needful
95  services.AddSingleton<IApplication>(this);
96 
97  // configure configuration
98  services.UseStandardConfig<UpdatesConfiguration>(configuration);
99  services.UseStandardConfig<DatabaseConfiguration>(configuration);
100  services.UseStandardConfig<GeneralConfiguration>(configuration);
101  services.UseStandardConfig<FileLoggingConfiguration>(configuration);
102  services.UseStandardConfig<ControlPanelConfiguration>(configuration);
103 
104  // enable options which give us config reloading
105  services.AddOptions();
106 
107  // this is needful for the setup wizard
108  services.AddLogging();
109 
110  // other stuff needed for for setup wizard and configuration
111  services.AddSingleton<IIOManager, DefaultIOManager>();
112  services.AddSingleton<IConsole, IO.Console>();
113  services.AddSingleton<IDBConnectionFactory, DBConnectionFactory>();
114  services.AddSingleton<ISetupWizard, SetupWizard>();
115  services.AddSingleton<IPlatformIdentifier, PlatformIdentifier>();
116  services.AddSingleton<IAsyncDelayer, AsyncDelayer>();
117 
118  GeneralConfiguration generalConfiguration;
119  DatabaseConfiguration databaseConfiguration;
120  FileLoggingConfiguration fileLoggingConfiguration;
121  ControlPanelConfiguration controlPanelConfiguration;
122  IIOManager ioManager;
123  IPlatformIdentifier platformIdentifier;
124 
125  // temporarily build the service provider in it's current state
126  // do it here so we can run the setup wizard if necessary
127  // also allows us to get some options and other services we need for continued configuration
128  using (var provider = services.BuildServiceProvider())
129  {
130  // run the wizard if necessary
131  var setupWizard = provider.GetRequiredService<ISetupWizard>();
132  var applicationLifetime = provider.GetRequiredService<Microsoft.AspNetCore.Hosting.IApplicationLifetime>();
133  var setupWizardRan = setupWizard.CheckRunWizard(applicationLifetime.ApplicationStopping).GetAwaiter().GetResult();
134 
135  // load the configuration options we need
136  var generalOptions = provider.GetRequiredService<IOptions<GeneralConfiguration>>();
137  generalConfiguration = generalOptions.Value;
138 
139  // unless this is set, in which case, we leave
140  if (setupWizardRan && generalConfiguration.SetupWizardMode == SetupWizardMode.Only)
141  throw new OperationCanceledException("Exiting due to SetupWizardMode configuration!"); // we don't inject a logger in the constuctor to log this because it's not yet configured
142 
143  var dbOptions = provider.GetRequiredService<IOptions<DatabaseConfiguration>>();
144  databaseConfiguration = dbOptions.Value;
145 
146  var loggingOptions = provider.GetRequiredService<IOptions<FileLoggingConfiguration>>();
147  fileLoggingConfiguration = loggingOptions.Value;
148 
149  var controlPanelOptions = provider.GetRequiredService<IOptions<ControlPanelConfiguration>>();
150  controlPanelConfiguration = controlPanelOptions.Value;
151 
152  ioManager = provider.GetRequiredService<IIOManager>();
153  platformIdentifier = provider.GetRequiredService<IPlatformIdentifier>();
154  }
155 
156  // setup file logging via serilog
157  if (!fileLoggingConfiguration.Disable)
158  services.AddLogging(builder =>
159  {
160  // common app data is C:/ProgramData on windows, else /usr/shar
161  var logPath = !String.IsNullOrEmpty(fileLoggingConfiguration.Directory) ? fileLoggingConfiguration.Directory : ioManager.ConcatPath(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), VersionPrefix, "Logs");
162 
163  logPath = ioManager.ConcatPath(logPath, "tgs-{Date}.log");
164 
165  LogEventLevel? ConvertLogLevel(LogLevel logLevel)
166  {
167  switch (logLevel)
168  {
169  case LogLevel.Critical:
170  return LogEventLevel.Fatal;
171  case LogLevel.Debug:
172  return LogEventLevel.Debug;
173  case LogLevel.Error:
174  return LogEventLevel.Error;
175  case LogLevel.Information:
176  return LogEventLevel.Information;
177  case LogLevel.Trace:
178  return LogEventLevel.Verbose;
179  case LogLevel.Warning:
180  return LogEventLevel.Warning;
181  case LogLevel.None:
182  return null;
183  default:
184  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid log level {0}", logLevel));
185  }
186  }
187 
188  var logEventLevel = ConvertLogLevel(fileLoggingConfiguration.LogLevel);
189  var microsoftEventLevel = ConvertLogLevel(fileLoggingConfiguration.MicrosoftLogLevel);
190 
191  var formatter = new MessageTemplateTextFormatter("{Timestamp:o} {RequestId,13} [{Level:u3}] {SourceContext:l}: {Message} ({EventId:x8}){NewLine}{Exception}", null);
192 
193  var configuration = new LoggerConfiguration()
194  .Enrich.FromLogContext()
195  .WriteTo.Async(w => w.RollingFile(formatter, logPath, shared: true, flushToDiskInterval: TimeSpan.FromSeconds(2)));
196 
197  if (logEventLevel.HasValue)
198  configuration.MinimumLevel.Is(logEventLevel.Value);
199 
200  if (microsoftEventLevel.HasValue)
201  configuration.MinimumLevel.Override("Microsoft", microsoftEventLevel.Value);
202 
203  builder.AddSerilog(configuration.CreateLogger(), true);
204  });
205 
206  // configure bearer token validation
207  services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(jwtBearerOptions =>
208  {
209  // this line isn't actually run until the first request is made
210  // at that point tokenFactory will be populated
211  jwtBearerOptions.TokenValidationParameters = tokenFactory.ValidationParameters;
212  jwtBearerOptions.Events = new JwtBearerEvents
213  {
214  // Application is our composition root so this monstrosity of a line is okay
215  OnTokenValidated = ctx => ctx.HttpContext.RequestServices.GetRequiredService<IClaimsInjector>().InjectClaimsIntoContext(ctx, ctx.HttpContext.RequestAborted)
216  };
217  });
218 
219  // fucking prevents converting 'sub' to M$ bs
220  // can't be done in the above lambda, that's too late
221  JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
222 
223  // add mvc, configure the json serializer settings
224  services.AddMvc().AddJsonOptions(options =>
225  {
226  options.AllowInputFormatterExceptionMessages = true;
227  options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
228  options.SerializerSettings.CheckAdditionalContent = true;
229  options.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Error;
230  options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
231  options.SerializerSettings.Converters = new[] { new VersionConverter() };
232  });
233 
234  // enable browser detection
235  services.AddDetectionCore().AddBrowser();
236 
237  // CORS conditionally enabled later
238  services.AddCors();
239 
240  void AddTypedContext<TContext>() where TContext : DatabaseContext<TContext>
241  {
242  services.AddDbContext<TContext>(builder =>
243  {
244  if (hostingEnvironment.IsDevelopment())
245  builder.EnableSensitiveDataLogging();
246  });
247  services.AddScoped<IDatabaseContext>(x => x.GetRequiredService<TContext>());
248  }
249 
250  // add the correct database context type
251  var dbType = databaseConfiguration.DatabaseType;
252  switch (dbType)
253  {
254  case DatabaseType.MySql:
255  case DatabaseType.MariaDB:
256  AddTypedContext<MySqlDatabaseContext>();
257  break;
258  case DatabaseType.SqlServer:
259  AddTypedContext<SqlServerDatabaseContext>();
260  break;
261  default:
262  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid {0}: {1}!", nameof(DatabaseType), dbType));
263  }
264 
265  // configure other database services
266  services.AddSingleton<IDatabaseContextFactory, DatabaseContextFactory>();
267  services.AddSingleton<IDatabaseSeeder, DatabaseSeeder>();
268 
269  // configure security services
271  services.AddScoped<IClaimsInjector, ClaimsInjector>();
272  services.AddSingleton<IIdentityCache, IdentityCache>();
273  services.AddSingleton<ICryptographySuite, CryptographySuite>();
274  services.AddSingleton<ITokenFactory, TokenFactory>();
275  services.AddSingleton<IPasswordHasher<Models.User>, PasswordHasher<Models.User>>();
276 
277  // configure platform specific services
278  if (platformIdentifier.IsWindows)
279  {
280  services.AddSingleton<ISystemIdentityFactory, WindowsSystemIdentityFactory>();
281  services.AddSingleton<ISymlinkFactory, WindowsSymlinkFactory>();
282  services.AddSingleton<IByondInstaller, WindowsByondInstaller>();
283  services.AddSingleton<IPostWriteHandler, WindowsPostWriteHandler>();
284 
285  services.AddSingleton<WindowsNetworkPromptReaper>();
286  services.AddSingleton<INetworkPromptReaper>(x => x.GetRequiredService<WindowsNetworkPromptReaper>());
287  services.AddSingleton<IHostedService>(x => x.GetRequiredService<WindowsNetworkPromptReaper>());
288  }
289  else
290  {
291  services.AddSingleton<ISystemIdentityFactory, PosixSystemIdentityFactory>();
292  services.AddSingleton<ISymlinkFactory, PosixSymlinkFactory>();
293  services.AddSingleton<IByondInstaller, PosixByondInstaller>();
294  services.AddSingleton<IPostWriteHandler, PosixPostWriteHandler>();
295  services.AddSingleton<INetworkPromptReaper, PosixNetworkPromptReaper>();
296  }
297 
298  // configure misc services
299  services.AddSingleton<ISynchronousIOManager, SynchronousIOManager>();
300  services.AddSingleton<IGitHubClientFactory, GitHubClientFactory>();
301  services.AddSingleton<IProcessExecutor, ProcessExecutor>();
302  services.AddSingleton<IByondTopicSender>(new ByondTopicSender
303  {
304  ReceiveTimeout = generalConfiguration.ByondTopicTimeout,
305  SendTimeout = generalConfiguration.ByondTopicTimeout
306  });
307 
308  // configure component services
309  services.AddSingleton<ICredentialsProvider, CredentialsProvider>();
310  services.AddSingleton<IProviderFactory, ProviderFactory>();
311  services.AddSingleton<IChatFactory, ChatFactory>();
312  services.AddSingleton<IWatchdogFactory, WatchdogFactory>();
313  services.AddSingleton<IInstanceFactory, InstanceFactory>();
314 
315  // configure root services
316  services.AddSingleton<InstanceManager>();
317  services.AddSingleton<IInstanceManager>(x => x.GetRequiredService<InstanceManager>());
318  services.AddSingleton<IHostedService>(x => x.GetRequiredService<InstanceManager>());
319 
320  services.AddSingleton<IJobManager, JobManager>();
321  }
LogLevel MicrosoftLogLevel
The minimum Microsoft.Extensions.Logging.LogLevel to display in logs for Microsoft library sources
+ + + + +
readonly Microsoft.AspNetCore.Hosting.IHostingEnvironment hostingEnvironment
The Microsoft.AspNetCore.Hosting.IHostingEnvironment for the Application
Definition: Application.cs:57
+
IPostWriteHandler for POSIX systems
+
Handles changing file modes/permissions after writing
+ + + +
SetupWizardMode
Determines if the Core.ISetupWizard will run
+
Abstraction for System.Console
Definition: IConsole.cs:9
+
LogLevel LogLevel
The minimum Microsoft.Extensions.Logging.LogLevel to display in logs
+ +
ITokenFactory tokenFactory
The ITokenFactory for the Application
Definition: Application.cs:67
+
For initially seeding a database
+ + + + +
ISystemIdentityFactory for windows systems. Uses long running tasks due to potential networked domain...
+
Contains various cryptographic functions
+ +
Configuration for the automatic update system
+
For downloading and installing BYOND extractions for a given system
+
For accessing the disk in a synchronous manner
+
DatabaseType DatabaseType
The Configuration.DatabaseType to create
+ + + + + +
IPostWriteHandler for Windows systems
+ + + + + + + + +
TokenValidationParameters ValidationParameters
The TokenValidationParameters for the ITokenFactory
+ + + +
Configuration options for the Models.DatabaseContext<TParentContext>
+ +
IIOManager that resolves paths to Environment.CurrentDirectory
+
For injecting System.Security.Claims.Claims that Controllers.TgsAuthorizeAttribute can look for
+ +
DatabaseType
Type of database to user
Definition: DatabaseType.cs:6
+ + +
Interface for using filesystems
Definition: IIOManager.cs:11
+
On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort()....
+ + +
readonly IConfiguration configuration
The IConfiguration for the Application
Definition: Application.cs:52
+ +
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+ + + + +
+

References Tgstation.Server.Host.Core.ISetupWizard.CheckRunWizard(), Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.Core.Application.configuration, Tgstation.Server.Host.Configuration.DatabaseConfiguration.DatabaseType, Tgstation.Server.Host.Configuration.FileLoggingConfiguration.Directory, Tgstation.Server.Host.Configuration.FileLoggingConfiguration.Disable, Tgstation.Server.Host.Core.Application.hostingEnvironment, Tgstation.Server.Host.Core.IPlatformIdentifier.IsWindows, Tgstation.Server.Host.Configuration.FileLoggingConfiguration.LogLevel, Tgstation.Server.Host.Configuration.FileLoggingConfiguration.MicrosoftLogLevel, Tgstation.Server.Host.Core.Application.tokenFactory, Tgstation.Server.Host.Security.ITokenFactory.ValidationParameters, and Tgstation.Server.Host.Core.Application.VersionPrefix.

+ +
+
+ +

◆ Ready()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.Core.Application.Ready (Exception initializationError)
+
+ +

Mark the IApplication as ready to run

+ +

Implements Tgstation.Server.Host.Core.IApplication.

+ +

Definition at line 411 of file Application.cs.

+
412  {
413  lock (startupTcs)
414  {
415  if (startupTcs.Task.IsCompleted)
416  throw new InvalidOperationException("Ready has already been called!");
417  if (initializationError == null)
418  startupTcs.SetResult(null);
419  else
420  startupTcs.SetException(initializationError);
421  }
422  }
readonly TaskCompletionSource< object > startupTcs
The TaskCompletionSource<TResult> used for determining when the Application is Ready(Exception)
Definition: Application.cs:62
+
+

References Tgstation.Server.Host.Core.Application.startupTcs.

+ +
+
+

Member Data Documentation

+ +

◆ configuration

+ +
+
+ + + + + +
+ + + + +
readonly IConfiguration Tgstation.Server.Host.Core.Application.configuration
+
+private
+
+
+ +

◆ hostingEnvironment

+ +
+
+ + + + + +
+ + + + +
readonly Microsoft.AspNetCore.Hosting.IHostingEnvironment Tgstation.Server.Host.Core.Application.hostingEnvironment
+
+private
+
+ +

The Microsoft.AspNetCore.Hosting.IHostingEnvironment for the Application

+ +

Definition at line 57 of file Application.cs.

+ +

Referenced by Tgstation.Server.Host.Core.Application.Application(), Tgstation.Server.Host.Core.Application.Configure(), and Tgstation.Server.Host.Core.Application.ConfigureServices().

+ +
+
+ +

◆ startupTcs

+ +
+
+ + + + + +
+ + + + +
readonly TaskCompletionSource<object> Tgstation.Server.Host.Core.Application.startupTcs
+
+private
+
+ +

The TaskCompletionSource<TResult> used for determining when the Application is Ready(Exception)

+ +

Definition at line 62 of file Application.cs.

+ +

Referenced by Tgstation.Server.Host.Core.Application.Application(), Tgstation.Server.Host.Core.Application.Configure(), and Tgstation.Server.Host.Core.Application.Ready().

+ +
+
+ +

◆ tokenFactory

+ +
+
+ + + + + +
+ + + + +
ITokenFactory Tgstation.Server.Host.Core.Application.tokenFactory
+
+private
+
+ +

The ITokenFactory for the Application

+ +

Definition at line 67 of file Application.cs.

+ +

Referenced by Tgstation.Server.Host.Core.Application.Configure(), and Tgstation.Server.Host.Core.Application.ConfigureServices().

+ +
+
+ +

◆ VersionPrefix

+ +
+
+ + + + +
string Tgstation.Server.Host.Core.Application.VersionPrefix => "tgstation-server"
+
+
+

Property Documentation

+ +

◆ Version

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Host.Core.Application.Version
+
+get
+
+ +

+ +

Definition at line 44 of file Application.cs.

+
44 { get; }
+

Referenced by Tgstation.Server.Host.Core.Application.Application().

+ +
+
+ +

◆ VersionString

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Core.Application.VersionString
+
+get
+
+ +

+ +

Definition at line 47 of file Application.cs.

+
47 { get; }
+

Referenced by Tgstation.Server.Host.Core.Application.Application(), and Tgstation.Server.Host.Core.Application.Configure().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.png b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.png new file mode 100644 index 0000000000000000000000000000000000000000..d227b33be5f12f56fa84581f31f63b94e39469ab GIT binary patch literal 908 zcmeAS@N?(olHy`uVBq!ia0vp^Z-6*}gBeKbvSw-kDTx4|5ZC|z{{xvX-h3_XKQsZz z0^dxrxd3!*rXK63G7WA^{ z{fd>xme#nmo!V=Ev(WTi#p^_U``}4mSXUXxPr4V(8!ayH`OB!5?^?|X)tAy=9V0wv zg>r{YO1siDb&2HHhP&HxcXu-UYp!E>x5)b7zdv_6zWHt7zxMmWJ+89QNj611z^gW>xHn6|kacE&L-oqGIutjyFhK?g_-)nsZ&_1<~4 z>y_WOxkggPf8Ss1OVsCWwYQ7)#hGr4OpFzeKTA2maID*C@c}cn*b7n4f%V7Tg_d4j*S6tk`yYALcE<E-{7=Onh}*x}a7}ZEaAAQ~ BvN-?% literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application_builder_extensions-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application_builder_extensions-members.html new file mode 100644 index 0000000000..1653ea2391 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application_builder_extensions-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.ApplicationBuilderExtensions Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.ApplicationBuilderExtensions, including all inherited members.

+ + + + +
GetLogger(HttpContext httpContext)Tgstation.Server.Host.Core.ApplicationBuilderExtensionsprivatestatic
UseCancelledRequestSuppression(this IApplicationBuilder applicationBuilder)Tgstation.Server.Host.Core.ApplicationBuilderExtensionsstatic
UseDbConflictHandling(this IApplicationBuilder applicationBuilder)Tgstation.Server.Host.Core.ApplicationBuilderExtensionsstatic
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application_builder_extensions.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application_builder_extensions.html new file mode 100644 index 0000000000..e7a1275839 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application_builder_extensions.html @@ -0,0 +1,229 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.ApplicationBuilderExtensions Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.ApplicationBuilderExtensions Class Reference
+
+
+ +

Extensions for IApplicationBuilder + More...

+ + + + + + + + +

+Static Public Member Functions

static void UseDbConflictHandling (this IApplicationBuilder applicationBuilder)
 Return a ConflictObjectResult for DbUpdateExceptions More...
 
static void UseCancelledRequestSuppression (this IApplicationBuilder applicationBuilder)
 Suppress TaskCanceledException warnings when a user aborts a request More...
 
+ + + + +

+Static Private Member Functions

static ILogger GetLogger (HttpContext httpContext)
 Gets a ILogger from a given httpContext More...
 
+

Detailed Description

+

Extensions for IApplicationBuilder

+ +

Definition at line 16 of file ApplicationBuilderExtensions.cs.

+

Member Function Documentation

+ +

◆ GetLogger()

+ +
+
+ + + + + +
+ + + + + + + + +
static ILogger Tgstation.Server.Host.Core.ApplicationBuilderExtensions.GetLogger (HttpContext httpContext)
+
+staticprivate
+
+ +

Gets a ILogger from a given httpContext

+
Parameters
+ + +
httpContextThe HttpContext to get the ILogger from
+
+
+
Returns
A new ILogger
+ +

Referenced by Tgstation.Server.Host.Core.ApplicationBuilderExtensions.UseCancelledRequestSuppression(), and Tgstation.Server.Host.Core.ApplicationBuilderExtensions.UseDbConflictHandling().

+ +
+
+ +

◆ UseCancelledRequestSuppression()

+ +
+
+ + + + + +
+ + + + + + + + +
static void Tgstation.Server.Host.Core.ApplicationBuilderExtensions.UseCancelledRequestSuppression (this IApplicationBuilder applicationBuilder)
+
+static
+
+ +

Suppress TaskCanceledException warnings when a user aborts a request

+
Parameters
+ + +
applicationBuilderThe IApplicationBuilder to configure
+
+
+ +

Definition at line 55 of file ApplicationBuilderExtensions.cs.

+
56  {
57  if (applicationBuilder == null)
58  throw new ArgumentNullException(nameof(applicationBuilder));
59  applicationBuilder.Use(async (context, next) =>
60  {
61  var logger = GetLogger(context);
62  try
63  {
64  await next().ConfigureAwait(false);
65  }
66  catch (OperationCanceledException)
67  {
68  logger.LogDebug("Request cancelled!");
69  }
70  });
71  }
static ILogger GetLogger(HttpContext httpContext)
Gets a ILogger from a given httpContext
+
+

References Tgstation.Server.Host.Core.ApplicationBuilderExtensions.GetLogger().

+ +
+
+ +

◆ UseDbConflictHandling()

+ +
+
+ + + + + +
+ + + + + + + + +
static void Tgstation.Server.Host.Core.ApplicationBuilderExtensions.UseDbConflictHandling (this IApplicationBuilder applicationBuilder)
+
+static
+
+ +

Return a ConflictObjectResult for DbUpdateExceptions

+
Parameters
+ + +
applicationBuilderThe IApplicationBuilder to configure
+
+
+ +

Definition at line 29 of file ApplicationBuilderExtensions.cs.

+
30  {
31  if (applicationBuilder == null)
32  throw new ArgumentNullException(nameof(applicationBuilder));
33  applicationBuilder.Use(async (context, next) =>
34  {
35  var logger = GetLogger(context);
36  try
37  {
38  await next().ConfigureAwait(false);
39  }
40  catch (DbUpdateException e)
41  {
42  logger.LogDebug("Database conflict: {0}", e.Message);
43  await new ConflictObjectResult(new ErrorMessage { Message = String.Format(CultureInfo.InvariantCulture, "A database conflict has occurred: {0}", (e.InnerException ?? e).Message) }).ExecuteResultAsync(new ActionContext
44  {
45  HttpContext = context
46  }).ConfigureAwait(false);
47  }
48  });
49  }
static ILogger GetLogger(HttpContext httpContext)
Gets a ILogger from a given httpContext
+
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
+
+

References Tgstation.Server.Host.Core.ApplicationBuilderExtensions.GetLogger().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_async_delayer-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_async_delayer-members.html new file mode 100644 index 0000000000..16702294a8 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_async_delayer-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.AsyncDelayer Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.AsyncDelayer, including all inherited members.

+ + +
Delay(TimeSpan timeSpan, CancellationToken cancellationToken)Tgstation.Server.Host.Core.AsyncDelayer
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_async_delayer.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_async_delayer.html new file mode 100644 index 0000000000..00a9079fa0 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_async_delayer.html @@ -0,0 +1,145 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.AsyncDelayer Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.AsyncDelayer Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.AsyncDelayer:
+
+
+ + +Tgstation.Server.Host.Core.IAsyncDelayer + +
+ + + + + +

+Public Member Functions

Task Delay (TimeSpan timeSpan, CancellationToken cancellationToken)
 Create a Task that completes after a given timeSpan More...
 
+

Detailed Description

+
+

Definition at line 8 of file AsyncDelayer.cs.

+

Member Function Documentation

+ +

◆ Delay()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Core.AsyncDelayer.Delay (TimeSpan timeSpan,
CancellationToken cancellationToken 
)
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_async_delayer.png b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_async_delayer.png new file mode 100644 index 0000000000000000000000000000000000000000..73593a9084b8a7e391a25001f7662c83ccef363c GIT binary patch literal 964 zcmeAS@N?(olHy`uVBq!ia0vp^|A07vgBeKj#aa9XQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;SZ+_|D|H;=? zd2dKe%3F2CGwsw{A*OBpyyvuUZ_BMbs^%HF^@FPBYO#GPsaHGW`|LfRW%c*(es}k$ zlFp(go_PgVMRseHN`tq6GWiFES=uj zt@xb9zGCKb3%(l*)PAtN;;C%=uhVq1_UnQfypqn@ddq&Sow)OOapLss=Z8~nF|;g5 z`!Rj?e(u}zSexy$^6GwGea3IAQ!>H(&%QU47yK*vcKk8@q4TdCi$ z=Tz_iuTy8)oBwOJGp;ZCbM+_Vr>uv}DOV4%pIFt(KOvM`USYMEokN&zO~aa~9}K`q zV%&tL;6bw1(kXiuF(5RF{(sZru>02I$9Z#>@8C#Sk{o5f)9$|1uF}iQdjzJht(#N# z^<2;XWA(lD*)Qtme^dL{^8b(6zbA$MX@4!=T zSAX^Q=d1KCo@?~n+-c`h(pbOq=k5(}BMp8me)ep7eD1$M>CH>`A9{bw z{;8zqId#7Azx$YL{Py=08reShp3D0{{*~>Q=2zR(xIg%RRr~ev8T*NauqcrGv2@C$ au=|pCOg?y|&Up>YatxlXelF{r5}E*fZ1Erf literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_d_b_connection_factory-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_d_b_connection_factory-members.html new file mode 100644 index 0000000000..7551073525 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_d_b_connection_factory-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.DBConnectionFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.DBConnectionFactory, including all inherited members.

+ + +
CreateConnection(string connectionString, DatabaseType databaseType)Tgstation.Server.Host.Core.DBConnectionFactory
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_d_b_connection_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_d_b_connection_factory.html new file mode 100644 index 0000000000..2dbb55c8cd --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_d_b_connection_factory.html @@ -0,0 +1,146 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.DBConnectionFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.DBConnectionFactory Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.DBConnectionFactory:
+
+
+ + +Tgstation.Server.Host.Core.IDBConnectionFactory + +
+ + + + + +

+Public Member Functions

DbConnection CreateConnection (string connectionString, DatabaseType databaseType)
 Create a DbConnection More...
 
+

Detailed Description

+
+

Definition at line 11 of file DBConnectionFactory.cs.

+

Member Function Documentation

+ +

◆ CreateConnection()

+ +
+
+ + + + + + + + + + + + + + + + + + +
DbConnection Tgstation.Server.Host.Core.DBConnectionFactory.CreateConnection (string connectionString,
DatabaseType databaseType 
)
+
+ +

Create a DbConnection

+ +

Implements Tgstation.Server.Host.Core.IDBConnectionFactory.

+ +

Definition at line 14 of file DBConnectionFactory.cs.

+
15  {
16  if (connectionString == null)
17  throw new ArgumentNullException(nameof(connectionString));
18 
19  switch (databaseType)
20  {
21  case DatabaseType.MariaDB:
22  case DatabaseType.MySql:
23  return new MySqlConnection
24  {
25  ConnectionString = connectionString
26  };
27  case DatabaseType.SqlServer:
28  return new SqlConnection
29  {
30  ConnectionString = connectionString
31  };
32  default:
33  throw new ArgumentOutOfRangeException(nameof(databaseType), databaseType, "Invalid DatabaseType!");
34  }
35  }
DatabaseType
Type of database to user
Definition: DatabaseType.cs:6
+
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_d_b_connection_factory.png b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_d_b_connection_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..e93ff7efd33c893e92365bbc67a493f3c5b8a657 GIT binary patch literal 1149 zcmeAS@N?(olHy`uVBq!ia0y~yVAKM#12~w0v-d_YPfz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-op%>Pv!KA;JqMky<$e0R z>Tk#zy^!roimPK@be!6K^^X0I{O!B9&-rQK`1DU!UatVp8l{z!_m(by_()h*%l`Jl zUowWwtFHQ=Um!F)CHMVL$*GJVTDCix?uws$*Y!&J)YVOvtHiuDR;MYHt*CL2TvYWY zY{fR#8?84~H?RL-x~i7(*V`ZREAAY!4%z%?b8d3;tD3O0ftDm#Y@u`6wh(kH)cSnGO5EGxNs%a&bVirdPP?)&~J zm)-Eq_BvziA?Xma+p3yd-LJ~uob=^tmO56{$+j#t_Mq8SOqSg_us_Cp%KXF@)XjxfDQ3f)+7xXa+L2Oj*GIj93OmRV_-T|M`Y2oia&l>6FPD44Msl(d=5esLHQ$ zLG0Uarn8J?)fvx}%>H`pYu)~U(sh+Tm+J%5OhLF|U!>`+xA$f~H|+nuf{**^^~Vee z>t|j~ddw&$6}UHGzwOVvT;JcYXS?T<`b>`J?d!uYyesRjr zm%ARtr#DAl<~!qWk7q0HZ3{T#x-jHa%`8nIG zFGQb{nXx!a+tfZ?E+T^UMN0nN%pE^m+E1O&TVdyZrXlO=W#bh`Voq6kb6MmDN;3FY zXon=TnBI>Ks14ic1l0L(&gLw(r1n$WC#!08r#EIrH^g?t+LgQRbJ?ozuwS;`^=a7M zg|nW{&y}tYdA>QT@08*Ukq7VA%+fRYdCtN@^ueK@pCe0MQmqr-2EJdHIJ-k%==zQ~ zUT-H_&-P)@(M{SGAbmY5$MvN;&)y^ZW?Q_sN_bnnj``QQHvy$*81}_khy0z$`(f{= zv#Xz9s?s=6etO~zF$D*%f^f75-WxDA$ZOS + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.DatabaseContextFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.DatabaseContextFactory, including all inherited members.

+ + + + +
DatabaseContextFactory(IServiceScopeFactory scopeFactory)Tgstation.Server.Host.Core.DatabaseContextFactory
scopeFactoryTgstation.Server.Host.Core.DatabaseContextFactoryprivate
UseContext(Func< IDatabaseContext, Task > operation)Tgstation.Server.Host.Core.DatabaseContextFactory
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_database_context_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_database_context_factory.html new file mode 100644 index 0000000000..fa5eef93a9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_database_context_factory.html @@ -0,0 +1,211 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.DatabaseContextFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.DatabaseContextFactory Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.DatabaseContextFactory:
+
+
+ + +Tgstation.Server.Host.Core.IDatabaseContextFactory + +
+ + + + + + + + +

+Public Member Functions

 DatabaseContextFactory (IServiceScopeFactory scopeFactory)
 Construct a DatabaseContextFactory More...
 
async Task UseContext (Func< IDatabaseContext, Task > operation)
 Run an operation in the scope of an IDatabaseContext More...
 
+ + + + +

+Private Attributes

readonly IServiceScopeFactory scopeFactory
 The IServiceScopeFactory for the DatabaseContextFactory More...
 
+

Detailed Description

+
+

Definition at line 9 of file DatabaseContextFactory.cs.

+

Constructor & Destructor Documentation

+ +

◆ DatabaseContextFactory()

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Core.DatabaseContextFactory.DatabaseContextFactory (IServiceScopeFactory scopeFactory)
+
+ +

Construct a DatabaseContextFactory

+
Parameters
+ + +
scopeFactoryThe value of scopeFactory. Created scopes must be able to provide instances of IDatabaseContext
+
+
+ +

Definition at line 20 of file DatabaseContextFactory.cs.

+
21  {
22  this.scopeFactory = scopeFactory ?? throw new ArgumentNullException(nameof(scopeFactory));
23 
24  using (var scope = scopeFactory.CreateScope())
25  scope.ServiceProvider.GetRequiredService<IDatabaseContext>();
26  }
+
readonly IServiceScopeFactory scopeFactory
The IServiceScopeFactory for the DatabaseContextFactory
+
+

References Tgstation.Server.Host.Core.DatabaseContextFactory.scopeFactory.

+ +
+
+

Member Function Documentation

+ +

◆ UseContext()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Core.DatabaseContextFactory.UseContext (Func< IDatabaseContext, Task > operation)
+
+ +

Run an operation in the scope of an IDatabaseContext

+ +

Implements Tgstation.Server.Host.Core.IDatabaseContextFactory.

+ +

Definition at line 29 of file DatabaseContextFactory.cs.

+
30  {
31  if (operation == null)
32  throw new ArgumentNullException(nameof(operation));
33 
34  using (var scope = scopeFactory.CreateScope())
35  await operation(scope.ServiceProvider.GetRequiredService<IDatabaseContext>()).ConfigureAwait(false);
36  }
+
readonly IServiceScopeFactory scopeFactory
The IServiceScopeFactory for the DatabaseContextFactory
+
+

References Tgstation.Server.Host.Core.DatabaseContextFactory.scopeFactory.

+ +
+
+

Member Data Documentation

+ +

◆ scopeFactory

+ +
+
+ + + + + +
+ + + + +
readonly IServiceScopeFactory Tgstation.Server.Host.Core.DatabaseContextFactory.scopeFactory
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_database_context_factory.png b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_database_context_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..9444ac62b895c89d2ae3984d12895378c6cad659 GIT binary patch literal 1214 zcmeAS@N?(olHy`uVBq!ia0y~yV6*_T12~w0M0w9l=IuVU+V1bX!tviEG4IbJxW@3FoluqUb>xQw(sA4>tA#0Hx(T83|ey`U%++CKkMtyj@6U6&`zJU9j;!#~c;iDu#Eif4@H!|F@I*`s2IRcIVfhZmj(O-}pO?%KD39cnX`xeok%d)Fm-dr(kx>i=EQ zCB{ct&h_^>e^R+VS+aq<@=SQfi`uRX=5r5Tbl+_(zC7zmN$kN+>EN7$y<5+$ymj}+ z+!v(}-WvuPvOQljU27}r^|xgY@`6jFK9pSe8@qwMeEuqL)g7K!-~au!@!(v;k28(a z@3gM8)?<6l#2@taT_3kBtLBUC|31r_|DJn%meUu*}bK$po_jhu4*xf%re}CYppK<|1_q@jH#{acHpVsFc z`daaQ-uch3ixPJ2-`@H9(}Q2_@9s7mEIy_=gRTF#XiuS)UFGup;KvWFrkplf=6PpV zQo(Xvlgk-BX*^cXvpr>x-8g#h>9u`3zA)nMq8~-Pu1@Oj=jZuJ@$yZlU)xzwRGga}Hh<-_86y&FtjMT}{r$%WgDD zpDtW^tM*1NQi>AV%9@^-d*JS}S6d#uT;qTJpxB+-Rc=QWe6GHq3rtb1z!Y`)*x^%m z3Jop9t0$}~FOPYlG2{6~S#xV(a?%1OC;O(&pI~SI%Bv@oTo`l6o26jb(niuMG3!XMeo+HaGO^*87dKIhdw2Tzq%nthl{HrftCM zPU%v~1zS9i7=$u + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.GitHubClientFactory Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory.html new file mode 100644 index 0000000000..580f6bfe23 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory.html @@ -0,0 +1,270 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.GitHubClientFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.GitHubClientFactory Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.GitHubClientFactory:
+
+
+ + +Tgstation.Server.Host.Core.IGitHubClientFactory + +
+ + + + + + + + + + + +

+Public Member Functions

 GitHubClientFactory (IApplication application)
 Construct a GitHubClientFactory More...
 
IGitHubClient CreateClient ()
 Create a client with anonymous authentication. Low rate limit More...
 
IGitHubClient CreateClient (string accessToken)
 Create a client with authentication using a personal access token More...
 
+ + + + +

+Private Member Functions

GitHubClient CreateBaseClient ()
 Create a GitHubClient More...
 
+ + + + +

+Private Attributes

readonly IApplication application
 The IApplication for the GitHubClientFactory More...
 
+

Detailed Description

+
+

Definition at line 7 of file GitHubClientFactory.cs.

+

Constructor & Destructor Documentation

+ +

◆ GitHubClientFactory()

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Core.GitHubClientFactory.GitHubClientFactory (IApplication application)
+
+ +

Construct a GitHubClientFactory

+
Parameters
+ + +
applicationThe value of application
+
+
+ +

Definition at line 18 of file GitHubClientFactory.cs.

+
19  {
20  this.application = application ?? throw new ArgumentNullException(nameof(application));
21  }
readonly IApplication application
The IApplication for the GitHubClientFactory
+
+

References Tgstation.Server.Host.Core.GitHubClientFactory.application.

+ +
+
+

Member Function Documentation

+ +

◆ CreateBaseClient()

+ +
+
+ + + + + +
+ + + + + + + +
GitHubClient Tgstation.Server.Host.Core.GitHubClientFactory.CreateBaseClient ()
+
+private
+
+ +

Create a GitHubClient

+
Returns
A new GitHubClient
+ +

Referenced by Tgstation.Server.Host.Core.GitHubClientFactory.CreateClient().

+ +
+
+ +

◆ CreateClient() [1/2]

+ +
+
+ + + + + + + +
IGitHubClient Tgstation.Server.Host.Core.GitHubClientFactory.CreateClient ()
+
+ +

Create a client with anonymous authentication. Low rate limit

+ +

Implements Tgstation.Server.Host.Core.IGitHubClientFactory.

+ +
+
+ +

◆ CreateClient() [2/2]

+ +
+
+ + + + + + + + +
IGitHubClient Tgstation.Server.Host.Core.GitHubClientFactory.CreateClient (string accessToken)
+
+ +

Create a client with authentication using a personal access token

+ +

Implements Tgstation.Server.Host.Core.IGitHubClientFactory.

+ +

Definition at line 33 of file GitHubClientFactory.cs.

+
34  {
35  if (accessToken == null)
36  throw new ArgumentNullException(nameof(accessToken));
37  var result = CreateBaseClient();
38  result.Credentials = new Credentials(accessToken);
39  return result;
40  }
GitHubClient CreateBaseClient()
Create a GitHubClient
+
+

References Tgstation.Server.Host.Core.GitHubClientFactory.CreateBaseClient().

+ +
+
+

Member Data Documentation

+ +

◆ application

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Core.GitHubClientFactory.application
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory.png b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..0a8926f97a27ad0dc0481afefda223d5af834c3a GIT binary patch literal 1137 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y^412~w0r1*!%A|NFZ;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O0Ct93?@1!3;n}AaM0mh!Fz=3xlVNV@L(#+qoC}9vg7D_UAA8`QQKE zww1XG6V^S;T(arZ+*}#y!-fyS`yN|F9WRtwX`!-G)w6R}zsl7tyGbFde|iM1eWvWW zRc(IZzsV`{{{H$Qy6-Iibk|8!Ud|CyU;n+@dAzp@&t?%C# z{yX8hvAxf0JHO3Y^SAWA*}2zn*QC^Cz0rxb_fD@7)(en#JoMZ&Q0m#m3w38&Ixo+A z|7XkpXr1+pGgstBT)Z%~|Fr!35F_ojlRhuu^N+-wP3NES?QvhaN7t&KGghqimz3YWcBO{-lqdbG+vl9`Q&sVqW^XzFgu#}N zlg`fx|G0DQdVz3{==cMs^MC*Pl>Q;xZsV*;zq~HheqR~?b^e_GZtIoncmJC##r1o} zJAuNP%QASDe*L=f|DDepzfaHn_3+;((+BHhvora3)+N7NfA_Vq^Y8Cfu?}l2i|cir zfwHH248=1#4t(BtQpfZDno0g|_D=dzdy7Ty=jQeHp1=GgnIdaFgMg86N!?W5bJf)v zm6c(iCoYNNw*yAi+Q$}sJ`DAq_6)iWA!peaTsiO0%(UW44TG2M2NQ(`r?c!2{CwFL zgnedQakYja%T&H03aE;T+-vh68y}NcYk17#C_@ILN|qhN)>-@xYo9R(tp3SxC8{QE zH`}+(@$&nNCR}%An0YR<@Ke?Qlox;hmZ;q73NtF7pX}KansEKk&U3qerycvxf5CRX zf7_Yw(sspRX)ElK8l1xI-fREw{CTwMuciC>%aQE~{CT&k%oKgRarTcY-?FnmV}vXkpYq8_gx?Im{;*4zNq&D->fzs>Iah1GHDubq%V85J zJ$>9I_wK15JLdYj?p&x+ALIF?rp%(O5S~u@Q-eN$)5(cD0f$u~>BJh6PKxdt|MdNT z^5>2nlYi}cZNGBi4lA=sGgTMni@f_6{{QERI`0`g+6evNcO>pZx0GxxZ}v zd7h*9xjVL|zFVKFdMCbars1 + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.JobException Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.JobException, including all inherited members.

+ + + + +
JobException()Tgstation.Server.Host.Core.JobException
JobException(string message)Tgstation.Server.Host.Core.JobException
JobException(string message, Exception innerException)Tgstation.Server.Host.Core.JobException
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_exception.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_exception.html new file mode 100644 index 0000000000..f8e5cff994 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_exception.html @@ -0,0 +1,203 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.JobException Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.JobException Class Reference
+
+
+ +

Operation exceptions thrown from the context of a Models.Job + More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.JobException:
+
+
+ +
+ + + + + + + + + + + +

+Public Member Functions

 JobException ()
 Construct a JobException More...
 
 JobException (string message)
 Construct a JobException with a message More...
 
 JobException (string message, Exception innerException)
 Construct a JobException with a message and innerException More...
 
+

Detailed Description

+

Operation exceptions thrown from the context of a Models.Job

+ +

Definition at line 8 of file JobException.cs.

+

Constructor & Destructor Documentation

+ +

◆ JobException() [1/3]

+ +
+
+ + + + + + + +
Tgstation.Server.Host.Core.JobException.JobException ()
+
+ +

Construct a JobException

+ +

Definition at line 13 of file JobException.cs.

+
14  {
15  }
+
+
+ +

◆ JobException() [2/3]

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Core.JobException.JobException (string message)
+
+ +

Construct a JobException with a message

+
Parameters
+ + +
messageThe message for the Exception
+
+
+ +

Definition at line 21 of file JobException.cs.

+
21  : base(message)
22  {
23  }
+
+
+ +

◆ JobException() [3/3]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Core.JobException.JobException (string message,
Exception innerException 
)
+
+ +

Construct a JobException with a message and innerException

+
Parameters
+ + + +
messageThe message for the Exception
innerExceptionThe inner Exception for the nase Exception
+
+
+ +

Definition at line 30 of file JobException.cs.

+
30  : base(message, innerException)
31  {
32  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_exception.png b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_exception.png new file mode 100644 index 0000000000000000000000000000000000000000..d411c7a940e6993276e151914e1bb08beb425a75 GIT binary patch literal 722 zcmeAS@N?(olHy`uVBq!ia0vp^-+(xPgBeK5c2;l#DTx4|5ZC|z{{xvX-h3_XKQsZz z0^SEtdS2tJll)qAXGfumb^|rp+&%?c*m!6kAymzl?=kZ0H zPU3=|zvk%Oxy}1cs*B;q)Z8gw;*Z{oy2V}n+kM0JCcBqU`X|4CV&ACiX;9=&6=R5EMh>F%Vx zu0`=%cfOJN@TGLy{GvzY-Fwfl7PGtA-f0n9dUt74Q1@yc(;IV7s@3dW=zP#jZkPDm zP0k$qEBDI|<~N^}-W%B-m&=|0edGN1ZwaG~|ay9k+CkmlUKkMg!}LBni*;Gm$_MK W+Oe|xtt!9-$l&Sf=d#Wzp$PzY9ZDep literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler-members.html new file mode 100644 index 0000000000..bb9ba8deaa --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler-members.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.JobHandler Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html new file mode 100644 index 0000000000..09bec330de --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html @@ -0,0 +1,330 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.JobHandler Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.JobHandler Class Reference
+
+
+ +

Class for pairing Tasks with CancellationTokenSources + More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.JobHandler:
+
+
+ + +IDisposable + +
+ + + + + + + + + + + + + +

+Public Member Functions

 JobHandler (Func< CancellationToken, Task > job)
 Construct a JobHandler More...
 
void Dispose ()
 
async Task Wait (CancellationToken cancellationToken)
 Wait for task to complete More...
 
void Cancel ()
 Cancels task More...
 
+ + + + +

+Properties

int? Progress [get, set]
 The progress of the job More...
 
+ + + + + + + +

+Private Attributes

readonly CancellationTokenSource cancellationTokenSource
 The CancellationTokenSource for task More...
 
readonly Task task
 The Task being run More...
 
+

Detailed Description

+

Class for pairing Tasks with CancellationTokenSources

+ +

Definition at line 10 of file JobHandler.cs.

+

Constructor & Destructor Documentation

+ +

◆ JobHandler()

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Core.JobHandler.JobHandler (Func< CancellationToken, Task > job)
+
+ +

Construct a JobHandler

+
Parameters
+ + +
jobA Func<T, TResult> taking a CancellationToken and returning a Task that the JobHandler will wrap
+
+
+ +

Definition at line 26 of file JobHandler.cs.

+
27  {
28  if (job == null)
29  throw new ArgumentNullException(nameof(job));
30  cancellationTokenSource = new CancellationTokenSource();
31  task = job(cancellationTokenSource.Token);
32  }
readonly CancellationTokenSource cancellationTokenSource
The CancellationTokenSource for task
Definition: JobHandler.cs:15
+
readonly Task task
The Task being run
Definition: JobHandler.cs:20
+
+

References Tgstation.Server.Host.Core.JobHandler.cancellationTokenSource, and Tgstation.Server.Host.Core.JobHandler.task.

+ +
+
+

Member Function Documentation

+ +

◆ Cancel()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.JobHandler.Cancel ()
+
+
+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.JobHandler.Dispose ()
+
+
+ +

◆ Wait()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Core.JobHandler.Wait (CancellationToken cancellationToken)
+
+ +

Wait for task to complete

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 47 of file JobHandler.cs.

+
48  {
49  TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
50  using (cancellationToken.Register(() => tcs.SetCanceled()))
51  await Task.WhenAny(tcs.Task, task).ConfigureAwait(false);
52  cancellationToken.ThrowIfCancellationRequested();
53  }
readonly Task task
The Task being run
Definition: JobHandler.cs:20
+
+

References Tgstation.Server.Host.Core.JobHandler.task.

+ +

Referenced by Tgstation.Server.Host.Core.JobManager.CancelJob(), and Tgstation.Server.Host.Core.JobManager.WaitForJobCompletion().

+ +
+
+

Member Data Documentation

+ +

◆ cancellationTokenSource

+ +
+
+ + + + + +
+ + + + +
readonly CancellationTokenSource Tgstation.Server.Host.Core.JobHandler.cancellationTokenSource
+
+private
+
+ +

The CancellationTokenSource for task

+ +

Definition at line 15 of file JobHandler.cs.

+ +

Referenced by Tgstation.Server.Host.Core.JobHandler.JobHandler().

+ +
+
+ +

◆ task

+ +
+
+ + + + + +
+ + + + +
readonly Task Tgstation.Server.Host.Core.JobHandler.task
+
+private
+
+ +

The Task being run

+ +

Definition at line 20 of file JobHandler.cs.

+ +

Referenced by Tgstation.Server.Host.Core.JobHandler.JobHandler(), and Tgstation.Server.Host.Core.JobHandler.Wait().

+ +
+
+

Property Documentation

+ +

◆ Progress

+ +
+
+ + + + + +
+ + + + +
int? Tgstation.Server.Host.Core.JobHandler.Progress
+
+getset
+
+ +

The progress of the job

+ +

Definition at line 40 of file JobHandler.cs.

+
40 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.png b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.png new file mode 100644 index 0000000000000000000000000000000000000000..69fd3987aa7388aab7eba18b0659bbe393513ae0 GIT binary patch literal 723 zcmeAS@N?(olHy`uVBq!ia0vp^Z-6*}gBeKbvSw-kDTx4|5ZC|z{{xvX-h3_XKQsZz z0^!fD^2fQY^v#wF8yb`OK$y){Qggy%5$CHJN*-Q6W2FulGn!AnURy~BIY-rEi~pg zzQLWd)sy?&#$Mf=bJ>%=Z2l#ZBYkPInQ(#UufSR*Y5&5s*VW&wq}TtiH<$JfT3($W z=(#KGfY&A2SzKY0>Vg@yJ>^6+sY&ZTIRq1}-b?x~1YrFof+Z&s(X=iRn=B9N| z`*Q9!g~Z=XDCgTEwmE+GW@mAoH&(1mR!z`YDmCHyvl)iWQ>LEvW!q+)DYn-9ip%MW zic2xP8}v#x9P=~0o*c4+Gb3dGtThEjuFSV + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.JobManager Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.JobManager, including all inherited members.

+ + + + + + + + + + + + + + +
CancelJob(Job job, User user, bool blocking, CancellationToken cancellationToken)Tgstation.Server.Host.Core.JobManager
CheckGetJob(Job job)Tgstation.Server.Host.Core.JobManagerprivate
databaseContextFactoryTgstation.Server.Host.Core.JobManagerprivate
Dispose()Tgstation.Server.Host.Core.JobManager
JobManager(IDatabaseContextFactory databaseContextFactory, ILogger< JobManager > logger)Tgstation.Server.Host.Core.JobManager
JobProgress(Job job)Tgstation.Server.Host.Core.JobManager
jobsTgstation.Server.Host.Core.JobManagerprivate
loggerTgstation.Server.Host.Core.JobManagerprivate
RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)Tgstation.Server.Host.Core.JobManager
RunJob(Job job, Func< Job, IDatabaseContext, CancellationToken, Task > operation, CancellationToken cancellationToken)Tgstation.Server.Host.Core.JobManagerprivate
StartAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Core.JobManager
StopAsync(CancellationToken cancellationToken)Tgstation.Server.Host.Core.JobManager
WaitForJobCompletion(Job job, User canceller, CancellationToken jobCancellationToken, CancellationToken cancellationToken)Tgstation.Server.Host.Core.JobManager
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html new file mode 100644 index 0000000000..d9bd27ac4f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html @@ -0,0 +1,647 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.JobManager Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.JobManager Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.JobManager:
+
+
+ + +Tgstation.Server.Host.Core.IJobManager +IDisposable +IHostedService + +
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 JobManager (IDatabaseContextFactory databaseContextFactory, ILogger< JobManager > logger)
 Construct a JobManager More...
 
void Dispose ()
 
Task RegisterOperation (Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
 Registers a given Job and begins running it More...
 
async Task StartAsync (CancellationToken cancellationToken)
 
async Task StopAsync (CancellationToken cancellationToken)
 
async Task< bool > CancelJob (Job job, User user, bool blocking, CancellationToken cancellationToken)
 Cancels a give job More...
 
int? JobProgress (Job job)
 Get the Api.Models.Job.Progress for a job More...
 
async Task WaitForJobCompletion (Job job, User canceller, CancellationToken jobCancellationToken, CancellationToken cancellationToken)
 Wait for a given job to complete More...
 
+ + + + + + + +

+Private Member Functions

JobHandler CheckGetJob (Job job)
 Gets the JobHandler for a given job if it exists More...
 
async Task RunJob (Job job, Func< Job, IDatabaseContext, CancellationToken, Task > operation, CancellationToken cancellationToken)
 Runner for JobHandlers More...
 
+ + + + + + + + + + +

+Private Attributes

readonly IDatabaseContextFactory databaseContextFactory
 The IServiceProvider for the JobManager More...
 
readonly ILogger< JobManagerlogger
 The ILogger for the JobManager More...
 
readonly Dictionary< long, JobHandlerjobs
 Dictionary<TKey, TValue> of Api.Models.Internal.Job.Id to running JobHandlers More...
 
+

Detailed Description

+
+

Definition at line 13 of file JobManager.cs.

+

Constructor & Destructor Documentation

+ +

◆ JobManager()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Core.JobManager.JobManager (IDatabaseContextFactory databaseContextFactory,
ILogger< JobManagerlogger 
)
+
+ +

Construct a JobManager

+
Parameters
+ + + +
databaseContextFactoryThe value of databaseContextFactory
loggerThe value of logger
+
+
+ +

Definition at line 35 of file JobManager.cs.

+
36  {
37  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
38  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
39  jobs = new Dictionary<long, JobHandler>();
40  }
readonly Dictionary< long, JobHandler > jobs
Dictionary<TKey, TValue> of Api.Models.Internal.Job.Id to running JobHandlers
Definition: JobManager.cs:28
+
readonly ILogger< JobManager > logger
The ILogger for the JobManager
Definition: JobManager.cs:23
+
readonly IDatabaseContextFactory databaseContextFactory
The IServiceProvider for the JobManager
Definition: JobManager.cs:18
+
+

References Tgstation.Server.Host.Core.JobManager.databaseContextFactory, Tgstation.Server.Host.Core.JobManager.jobs, and Tgstation.Server.Host.Core.JobManager.logger.

+ +
+
+

Member Function Documentation

+ +

◆ CancelJob()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task<bool> Tgstation.Server.Host.Core.JobManager.CancelJob (Job job,
User user,
bool blocking,
CancellationToken cancellationToken 
)
+
+ +

Cancels a give job

+ +

Implements Tgstation.Server.Host.Core.IJobManager.

+ +

Definition at line 220 of file JobManager.cs.

+
221  {
222  if (job == null)
223  throw new ArgumentNullException(nameof(job));
224  if (user == null)
225  throw new ArgumentNullException(nameof(user));
226  JobHandler handler;
227  try
228  {
229  handler = CheckGetJob(job);
230  }
231  catch (InvalidOperationException)
232  {
233  // this is fine
234  return false;
235  }
236 
237  handler.Cancel(); // this will ensure the db update is only done once
238  await databaseContextFactory.UseContext(async databaseContext =>
239  {
240  job = new Job { Id = job.Id };
241  databaseContext.Jobs.Attach(job);
242  user = new User { Id = user.Id };
243  databaseContext.Users.Attach(user);
244  job.CancelledBy = user;
245 
246  // let either startup or cancellation set job.cancelled
247  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
248  }).ConfigureAwait(false);
249  if (blocking)
250  await handler.Wait(cancellationToken).ConfigureAwait(false);
251  return true;
252  }
JobHandler CheckGetJob(Job job)
Gets the JobHandler for a given job if it exists
Definition: JobManager.cs:54
+
User CancelledBy
See Api.Models.Job.CancelledBy
Definition: Job.cs:21
+ + +
long Id
The ID of the User
Definition: User.cs:15
+ +
readonly IDatabaseContextFactory databaseContextFactory
The IServiceProvider for the JobManager
Definition: JobManager.cs:18
+
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+
+

References Tgstation.Server.Host.Core.JobHandler.Cancel(), Tgstation.Server.Host.Models.Job.CancelledBy, Tgstation.Server.Host.Core.JobManager.CheckGetJob(), Tgstation.Server.Host.Core.JobManager.databaseContextFactory, Tgstation.Server.Api.Models.Internal.Job.Id, Tgstation.Server.Api.Models.Internal.User.Id, Tgstation.Server.Host.Core.IDatabaseContextFactory.UseContext(), and Tgstation.Server.Host.Core.JobHandler.Wait().

+ +

Referenced by Tgstation.Server.Host.Core.JobManager.WaitForJobCompletion().

+ +
+
+ +

◆ CheckGetJob()

+ +
+
+ + + + + +
+ + + + + + + + +
JobHandler Tgstation.Server.Host.Core.JobManager.CheckGetJob (Job job)
+
+private
+
+ +

Gets the JobHandler for a given job if it exists

+
Parameters
+ + +
jobThe Job to get the JobHandler for
+
+
+
Returns
The JobHandler
+ +

Definition at line 54 of file JobManager.cs.

+
55  {
56  lock (this)
57  {
58  if (!jobs.TryGetValue(job.Id, out JobHandler jobHandler))
59  throw new InvalidOperationException("Job not running!");
60  return jobHandler;
61  }
62  }
readonly Dictionary< long, JobHandler > jobs
Dictionary<TKey, TValue> of Api.Models.Internal.Job.Id to running JobHandlers
Definition: JobManager.cs:28
+ +
+

References Tgstation.Server.Api.Models.Internal.Job.Id, and Tgstation.Server.Host.Core.JobManager.jobs.

+ +

Referenced by Tgstation.Server.Host.Core.JobManager.CancelJob().

+ +
+
+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.JobManager.Dispose ()
+
+ +

+ +

Definition at line 43 of file JobManager.cs.

+
44  {
45  foreach (var job in jobs)
46  job.Value.Dispose();
47  }
readonly Dictionary< long, JobHandler > jobs
Dictionary<TKey, TValue> of Api.Models.Internal.Job.Id to running JobHandlers
Definition: JobManager.cs:28
+
+

References Tgstation.Server.Host.Core.JobManager.jobs.

+ +
+
+ +

◆ JobProgress()

+ +
+
+ + + + + + + + +
int? Tgstation.Server.Host.Core.JobManager.JobProgress (Job job)
+
+ +

Get the Api.Models.Job.Progress for a job

+ +

Implements Tgstation.Server.Host.Core.IJobManager.

+ +

Definition at line 255 of file JobManager.cs.

+
256  {
257  if (job == null)
258  throw new ArgumentNullException(nameof(job));
259  lock (this)
260  {
261  if (!jobs.TryGetValue(job.Id, out var handler))
262  return null;
263  return handler.Progress;
264  }
265  }
readonly Dictionary< long, JobHandler > jobs
Dictionary<TKey, TValue> of Api.Models.Internal.Job.Id to running JobHandlers
Definition: JobManager.cs:28
+ +
+

References Tgstation.Server.Api.Models.Internal.Job.Id, and Tgstation.Server.Host.Core.JobManager.jobs.

+ +
+
+ +

◆ RegisterOperation()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Core.JobManager.RegisterOperation (Job job,
Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation,
CancellationToken cancellationToken 
)
+
+ +

Registers a given Job and begins running it

+ +

Implements Tgstation.Server.Host.Core.IJobManager.

+ +
+
+ +

◆ RunJob()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Core.JobManager.RunJob (Job job,
Func< Job, IDatabaseContext, CancellationToken, Task > operation,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Runner for JobHandlers

+
Parameters
+ + + + +
jobThe Job being run
operationThe operation for the job
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 71 of file JobManager.cs.

+
72  {
73  try
74  {
75  await databaseContextFactory.UseContext(async databaseContext =>
76  {
77  async Task HandleExceptions(Task task)
78  {
79  void LogRegularException() => logger.LogDebug("Job {0} exited with error! Exception: {1}", job.Id, job.ExceptionDetails);
80  try
81  {
82  await task.ConfigureAwait(false);
83  }
84  catch (OperationCanceledException)
85  {
86  logger.LogDebug("Job {0} cancelled!", job.Id);
87  job.Cancelled = true;
88  }
89  catch (JobException e)
90  {
91  job.ExceptionDetails = e.Message;
92  LogRegularException();
93  if (e.InnerException != null)
94  logger.LogDebug("Inner exception for job {0}: {1}", job.Id, e.InnerException);
95  }
96  catch (Exception e)
97  {
98  job.ExceptionDetails = e.ToString();
99  LogRegularException();
100  }
101  finally
102  {
103  job.StoppedAt = DateTimeOffset.Now;
104  }
105  }
106 
107  async Task RunJobInternal()
108  {
109  var oldJob = job;
110  job = new Job { Id = oldJob.Id };
111  databaseContext.Jobs.Attach(job);
112 
113  await operation(job, databaseContext, cancellationToken).ConfigureAwait(false);
114 
115  logger.LogDebug("Job {0} completed!", job.Id);
116  }
117 
118  await HandleExceptions(RunJobInternal()).ConfigureAwait(false);
119 
120  await databaseContext.Save(default).ConfigureAwait(false);
121 
122  bool JobErroredOrCancelled() => job.ExceptionDetails != null || job.Cancelled == true;
123 
124  // ok so, now it's time for the post commit step if it exists
125  if (!JobErroredOrCancelled() && job.PostComplete != null)
126  {
127  await HandleExceptions(job.PostComplete(cancellationToken)).ConfigureAwait(false);
128  if (JobErroredOrCancelled())
129  await databaseContext.Save(default).ConfigureAwait(false);
130  }
131  }).ConfigureAwait(false);
132  }
133  finally
134  {
135  lock (this)
136  {
137  var handler = jobs[job.Id];
138  jobs.Remove(job.Id);
139  handler.Dispose();
140  }
141  }
142  }
readonly Dictionary< long, JobHandler > jobs
Dictionary<TKey, TValue> of Api.Models.Internal.Job.Id to running JobHandlers
Definition: JobManager.cs:28
+
string ExceptionDetails
Details of any exceptions caught during the Job
Definition: Job.cs:26
+
DateTimeOffset? StoppedAt
When the Job stopped
Definition: Job.cs:37
+
bool? Cancelled
If the Job was cancelled
Definition: Job.cs:43
+
Func< CancellationToken, Task > PostComplete
A Task to run after the job completes. This will not affect the Api.Models.Internal....
Definition: Job.cs:34
+ +
readonly ILogger< JobManager > logger
The ILogger for the JobManager
Definition: JobManager.cs:23
+ +
readonly IDatabaseContextFactory databaseContextFactory
The IServiceProvider for the JobManager
Definition: JobManager.cs:18
+
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+
+

References Tgstation.Server.Api.Models.Internal.Job.Cancelled, Tgstation.Server.Host.Core.JobManager.databaseContextFactory, Tgstation.Server.Api.Models.Internal.Job.ExceptionDetails, Tgstation.Server.Api.Models.Internal.Job.Id, Tgstation.Server.Host.Core.JobManager.jobs, Tgstation.Server.Host.Core.JobManager.logger, Tgstation.Server.Host.Models.Job.PostComplete, Tgstation.Server.Api.Models.Internal.Job.StoppedAt, and Tgstation.Server.Host.Core.IDatabaseContextFactory.UseContext().

+ +
+
+ +

◆ StartAsync()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Core.JobManager.StartAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 184 of file JobManager.cs.

+
185  {
186  logger.LogTrace("Starting job manager...");
187  await databaseContextFactory.UseContext(async databaseContext =>
188  {
189  // mark all jobs as cancelled
190  var badJobs = await databaseContext.Jobs.Where(y => !y.StoppedAt.HasValue).Select(y => y.Id).ToListAsync(cancellationToken).ConfigureAwait(false);
191  if (badJobs.Count > 0)
192  {
193  logger.LogTrace("Cleaning {0} unfinished jobs...", badJobs.Count);
194  foreach (var I in badJobs)
195  {
196  var job = new Job { Id = I };
197  databaseContext.Jobs.Attach(job);
198  job.Cancelled = true;
199  job.StoppedAt = DateTimeOffset.Now;
200  }
201 
202  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
203  }
204  }).ConfigureAwait(false);
205  logger.LogDebug("Job manager started!");
206  }
bool? Cancelled
If the Job was cancelled
Definition: Job.cs:43
+
readonly ILogger< JobManager > logger
The ILogger for the JobManager
Definition: JobManager.cs:23
+ +
readonly IDatabaseContextFactory databaseContextFactory
The IServiceProvider for the JobManager
Definition: JobManager.cs:18
+
Task UseContext(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext
+
+

References Tgstation.Server.Api.Models.Internal.Job.Cancelled, Tgstation.Server.Host.Core.JobManager.databaseContextFactory, Tgstation.Server.Host.Core.JobManager.logger, and Tgstation.Server.Host.Core.IDatabaseContextFactory.UseContext().

+ +
+
+ +

◆ StopAsync()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Core.JobManager.StopAsync (CancellationToken cancellationToken)
+
+ +

+ +

Definition at line 209 of file JobManager.cs.

+
210  {
211  var joinTasks = jobs.Select(x =>
212  {
213  x.Value.Cancel();
214  return x.Value.Wait(cancellationToken);
215  });
216  await Task.WhenAll(joinTasks).ConfigureAwait(false);
217  }
readonly Dictionary< long, JobHandler > jobs
Dictionary<TKey, TValue> of Api.Models.Internal.Job.Id to running JobHandlers
Definition: JobManager.cs:28
+
+

References Tgstation.Server.Host.Core.JobManager.jobs.

+ +
+
+ +

◆ WaitForJobCompletion()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Core.JobManager.WaitForJobCompletion (Job job,
User canceller,
CancellationToken jobCancellationToken,
CancellationToken cancellationToken 
)
+
+ +

Wait for a given job to complete

+ +

Implements Tgstation.Server.Host.Core.IJobManager.

+ +

Definition at line 268 of file JobManager.cs.

+
269  {
270  if (job == null)
271  throw new ArgumentNullException(nameof(job));
272  if (canceller == null)
273  throw new ArgumentNullException(nameof(canceller));
274  JobHandler handler;
275  lock (this)
276  {
277  if (!jobs.TryGetValue(job.Id, out handler))
278  return;
279  }
280 
281  Task cancelTask = null;
282  using (jobCancellationToken.Register(() => cancelTask = CancelJob(job, canceller, true, cancellationToken)))
283  await handler.Wait(cancellationToken).ConfigureAwait(false);
284 
285  if (cancelTask != null)
286  await cancelTask.ConfigureAwait(false);
287  }
readonly Dictionary< long, JobHandler > jobs
Dictionary<TKey, TValue> of Api.Models.Internal.Job.Id to running JobHandlers
Definition: JobManager.cs:28
+
async Task< bool > CancelJob(Job job, User user, bool blocking, CancellationToken cancellationToken)
Cancels a give job
Definition: JobManager.cs:220
+ +
+

References Tgstation.Server.Host.Core.JobManager.CancelJob(), Tgstation.Server.Api.Models.Internal.Job.Id, Tgstation.Server.Host.Core.JobManager.jobs, and Tgstation.Server.Host.Core.JobHandler.Wait().

+ +
+
+

Member Data Documentation

+ +

◆ databaseContextFactory

+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContextFactory Tgstation.Server.Host.Core.JobManager.databaseContextFactory
+
+private
+
+
+ +

◆ jobs

+ + + +

◆ logger

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<JobManager> Tgstation.Server.Host.Core.JobManager.logger
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.png b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..dfa17ef3db196d935f660d5b20f7c22a5976978d GIT binary patch literal 1622 zcmbuA3rv$&6oCJVSi*Q^GeKUqE)*ZZ>KZB1@em>@rAk>XSX&EJ5JVJ|hd`ke-2f4# z`l}!yFqaktkw*kN9)-qQDxg$d3fNXARYYG5>ImK@`9RN^TL_TX`gtSiOa5K`a3*5u-H5d$t_~z}0B;nnQi1bI5 z$z;a4Y78c9e;86XfVt z1BI^gZgS+D7E__DcKoLUbCFW;NjMB9Zt&K(Ud42(hUuf2TV=fE;k0Mv(hSau0l%%% zP3pRt*vG73W%G_H*J^_!OhUH7M?6>cp5)}(`RtOOvEiy zn~d(+!O3LAk*{nh7|m!<{EPt00c*P;9PAU~)gJ?MQy2H3Q#NX@Ec^9Mya^#Ju|n8` zFCtsPkTPk;9d@fDP7dKV+Z5m_-SvrIJfPlPl|Tf{WR)$bb(!u=(k^_gD;w>XB{q8X zVpjbWMc~2!Tpynqfv5=14p^H4i;HGdv|qN^$WacVkgEa^)Bj&B+kXv-16en&07E~cmH{eV%SU0fd)eiEZD1I(F0ysN>jU6%(eI}l#6vsY^Rpdo77bP_F!L_ zEq|KUct9FN6u4kEWV3i?wdoO7y;0&gSM*#`_?FwCb`1+wRTWfBL8AB|%b#vHquHJG zY!+41YL-{2+2k+$?ilshqj~|?s&~IA=S0A3m;8fZZ6wxX^>CLuhY=hl!pG+5Kw?+< z5s^}o1`i9`w9h=#d4>lPQSzN{`fk-*bznUlixc4KZ$}7EX0Z(OQ@o{nH?&PT```g$ zT_MA{sUh7(YB?X)W>>QgL~ z;h;z|M~>1ndFzx|X?ZCu&+j87x!cmL6@&e0_U}SdD!e)l(jSA->r0|(&wpIo?sPM( zx#}EwNY|sw1;>jex{vRMc;{*0DyrzlS|h_5EuV>#Do@U4B^Aq=IM|#4O^4xN0eAa# zm0zJKzmpr!hT{U9K`q518_AIBX=$!6=-HF9bA`smUlJ*L;%8i*Ec8^pzkb30Pbxd^ znPa!P<;1~2%daDJw#qG?ioUPlKPtLCY2P89e4qhRyI1D^4aTmSQ*DRW$bfVU+JA*O zlv`Y}*#Ri(-ii7w0j34Lm_Uv=rPEHuFnldLJJFyUm;UxK-)BdXLg>KKcQdXx1%0S{ zINqYQCQXU!I4qKkcBFFNGfP;a+~c`0x_sw}r=Zt;&@O3non=?`CVtE_p6~}ooZ{h_ zaUfNA>FPGKRSnu;eL^+28t>E- + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.PlatformIdentifier Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_platform_identifier.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_platform_identifier.html new file mode 100644 index 0000000000..6ee4647153 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_platform_identifier.html @@ -0,0 +1,208 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.PlatformIdentifier Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.PlatformIdentifier Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.PlatformIdentifier:
+
+
+ + +Tgstation.Server.Host.Core.IPlatformIdentifier + +
+ + + + + +

+Public Member Functions

 PlatformIdentifier ()
 Construct a PlatformIdentifier More...
 
+ + + + + + + + + + + + +

+Properties

bool IsWindows [get]
 
string ScriptFileExtension [get]
 
- Properties inherited from Tgstation.Server.Host.Core.IPlatformIdentifier
bool IsWindows [get]
 If the current platform is a Windows platform More...
 
string ScriptFileExtension [get]
 The extension of executable script files for the system More...
 
+

Detailed Description

+
+

Definition at line 6 of file PlatformIdentifier.cs.

+

Constructor & Destructor Documentation

+ +

◆ PlatformIdentifier()

+ +
+
+ + + + + + + +
Tgstation.Server.Host.Core.PlatformIdentifier.PlatformIdentifier ()
+
+
+

Property Documentation

+ +

◆ IsWindows

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Core.PlatformIdentifier.IsWindows
+
+get
+
+ +

+ +

Definition at line 9 of file PlatformIdentifier.cs.

+
9 { get; }
+

Referenced by Tgstation.Server.Host.Core.PlatformIdentifier.PlatformIdentifier().

+ +
+
+ +

◆ ScriptFileExtension

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Core.PlatformIdentifier.ScriptFileExtension
+
+get
+
+ +

+ +

Definition at line 12 of file PlatformIdentifier.cs.

+
12 { get; }
+

Referenced by Tgstation.Server.Host.Core.PlatformIdentifier.PlatformIdentifier().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_platform_identifier.png b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_platform_identifier.png new file mode 100644 index 0000000000000000000000000000000000000000..52fa672893df44a47e4e1a7a4ecd3fe9482bc3e8 GIT binary patch literal 1021 zcmeAS@N?(olHy`uVBq!ia0y~yVB`U^12~w0Ss}uPXN$DoT@H$~q@QeNTV(V`X*;6IIc%ICWi~VBI$EoDI_fpEfEQfUSq&JLO%R`m=8xJmNl;U-j zIMy_`=!nf)_T_sSA15&-|H`oGG!yAlQ}X+DIb`WkA-=Y`ve|A-hj(WE^(eo(b4SBM zr#Fmi5?uV<%Vsq_H%`{u*kahd>YVHIEAA3?+)mfsCAJ?w!urrAG*x+uhxOlgGa??8 zbsja0On18^z31QUSrZQ%II10gvMy~&+oV|^m3tx%)mf?iGBf;oT_kPxsb@kLrln0@ zDfr54=1~h{lmEw)jpkko&e_p#0ozC-+VDDd+Fzej8ppdXh^U!E38Nm;b~aGxcGW-!aiU;PY>>% z%wRP4@Sg`CYx7rFr`z0$W?WR|(@?oyBkX!xULW(jUm?HCP2MHe7+l%C|Hiy(iSpGh z65`v;za$$UJAbn(@B9s+y&Lbw-FLj2V*66|?yjTj($1z_G}z@n-MH$ZozrncTf4;; z%iaGANgS8Sc(v3p-gLocX~S;}Q}1g{KYk$Ll0$Es43F{MKKrD3%bJhhYp~9i?0Nb4 zi;C&u0+R!t^|MxOi8yp{!{*qt9tjrqYlUA + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.Process Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html new file mode 100644 index 0000000000..b8b4131b02 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html @@ -0,0 +1,622 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.Process Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.Process Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.Process:
+
+
+ + +Tgstation.Server.Host.Core.IProcess +Tgstation.Server.Host.Core.IProcessBase +IDisposable + +
+ + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 Process (System.Diagnostics.Process handle, Task< int > lifetime, StringBuilder outputStringBuilder, StringBuilder errorStringBuilder, StringBuilder combinedStringBuilder, ILogger< Process > logger, bool preExisting)
 Construct a Process More...
 
void Dispose ()
 
string GetCombinedOutput ()
 Get the stderr and stdout output of the IProcess More...
 
string GetErrorOutput ()
 Get the stderr output of the IProcess More...
 
string GetStandardOutput ()
 Get the stdout output of the IProcess More...
 
void Terminate ()
 Terminates the process More...
 
void SetHighPriority ()
 Set's the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass.AboveNormal More...
 
+ + + + + + + + + + + + + + + + + + +

+Properties

int Id [get]
 
Task Startup [get]
 
Task< int > Lifetime [get]
 
- Properties inherited from Tgstation.Server.Host.Core.IProcess
int Id [get]
 The IProcess' ID More...
 
Task Startup [get]
 The Task representing the time until the IProcess becomes "idle" More...
 
- Properties inherited from Tgstation.Server.Host.Core.IProcessBase
Task< int > Lifetime [get]
 The Task<TResult> resulting in the exit code of the process More...
 
+ + + + + + + + + + + + +

+Private Attributes

readonly System.Diagnostics.Process handle
 
readonly StringBuilder outputStringBuilder
 
readonly StringBuilder errorStringBuilder
 
readonly StringBuilder combinedStringBuilder
 
readonly ILogger< Processlogger
 The ILogger for the Process More...
 
+

Detailed Description

+
+

Definition at line 9 of file Process.cs.

+

Constructor & Destructor Documentation

+ +

◆ Process()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Core.Process.Process (System.Diagnostics.Process handle,
Task< int > lifetime,
StringBuilder outputStringBuilder,
StringBuilder errorStringBuilder,
StringBuilder combinedStringBuilder,
ILogger< Processlogger,
bool preExisting 
)
+
+ +

Construct a Process

+
Parameters
+ + + + + + + + +
handleThe value of handle
lifetimeThe value of Lifetime
outputStringBuilderThe value of outputStringBuilder
errorStringBuilderThe value of errorStringBuilder
combinedStringBuilderThe value of combinedStringBuilder
loggerThe value of logger
preExistingIf handle was NOT just created
+
+
+ +

Definition at line 41 of file Process.cs.

+
42  {
43  this.handle = handle ?? throw new ArgumentNullException(nameof(handle));
44  Lifetime = lifetime ?? throw new ArgumentNullException(nameof(lifetime));
45 
49 
50  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
51 
52  Id = handle.Id;
53 
54  if (preExisting)
55  {
56  Startup = Task.CompletedTask;
57  return;
58  }
59 
60  Startup = Task.Factory.StartNew(() =>
61  {
62  try
63  {
64  handle.WaitForInputIdle();
65  }
66  catch (InvalidOperationException) { }
67  }, default, TaskCreationOptions.LongRunning, TaskScheduler.Current);
68 
69  logger.LogTrace("Created process ID: {0}", Id);
70  }
readonly StringBuilder errorStringBuilder
Definition: Process.cs:23
+ + +
readonly StringBuilder combinedStringBuilder
Definition: Process.cs:24
+ +
readonly ILogger< Process > logger
The ILogger for the Process
Definition: Process.cs:29
+
readonly System.Diagnostics.Process handle
Definition: Process.cs:20
+
readonly StringBuilder outputStringBuilder
Definition: Process.cs:22
+
+

References Tgstation.Server.Host.Core.Process.combinedStringBuilder, Tgstation.Server.Host.Core.Process.errorStringBuilder, Tgstation.Server.Host.Core.Process.handle, Tgstation.Server.Host.Core.Process.Id, Tgstation.Server.Host.Core.Process.Lifetime, Tgstation.Server.Host.Core.Process.logger, Tgstation.Server.Host.Core.Process.outputStringBuilder, and Tgstation.Server.Host.Core.Process.Startup.

+ +
+
+

Member Function Documentation

+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Process.Dispose ()
+
+ +

+ +
+
+ +

◆ GetCombinedOutput()

+ +
+
+ + + + + + + +
string Tgstation.Server.Host.Core.Process.GetCombinedOutput ()
+
+ +

Get the stderr and stdout output of the IProcess

+ +

Implements Tgstation.Server.Host.Core.IProcess.

+ +

Definition at line 76 of file Process.cs.

+
77  {
78  if (combinedStringBuilder == null)
79  throw new InvalidOperationException("Output/Error reading was not enabled!");
80  return combinedStringBuilder.ToString().TrimStart(Environment.NewLine.ToCharArray());
81  }
readonly StringBuilder combinedStringBuilder
Definition: Process.cs:24
+
+

References Tgstation.Server.Host.Core.Process.combinedStringBuilder.

+ +
+
+ +

◆ GetErrorOutput()

+ +
+
+ + + + + + + +
string Tgstation.Server.Host.Core.Process.GetErrorOutput ()
+
+ +

Get the stderr output of the IProcess

+ +

Implements Tgstation.Server.Host.Core.IProcess.

+ +

Definition at line 84 of file Process.cs.

+
85  {
86  if (errorStringBuilder == null)
87  throw new InvalidOperationException("Error reading was not enabled!");
88  return errorStringBuilder.ToString().TrimStart(Environment.NewLine.ToCharArray());
89  }
readonly StringBuilder errorStringBuilder
Definition: Process.cs:23
+
+

References Tgstation.Server.Host.Core.Process.errorStringBuilder.

+ +
+
+ +

◆ GetStandardOutput()

+ +
+
+ + + + + + + +
string Tgstation.Server.Host.Core.Process.GetStandardOutput ()
+
+ +

Get the stdout output of the IProcess

+ +

Implements Tgstation.Server.Host.Core.IProcess.

+ +

Definition at line 92 of file Process.cs.

+
93  {
94  if (outputStringBuilder == null)
95  throw new InvalidOperationException("Output reading was not enabled!");
96  return errorStringBuilder.ToString().TrimStart(Environment.NewLine.ToCharArray());
97  }
readonly StringBuilder errorStringBuilder
Definition: Process.cs:23
+
readonly StringBuilder outputStringBuilder
Definition: Process.cs:22
+
+

References Tgstation.Server.Host.Core.Process.errorStringBuilder, and Tgstation.Server.Host.Core.Process.outputStringBuilder.

+ +
+
+ +

◆ SetHighPriority()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Process.SetHighPriority ()
+
+ +

Set's the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass.AboveNormal

+ +

Implements Tgstation.Server.Host.Core.IProcessBase.

+ +

Definition at line 117 of file Process.cs.

+
118  {
119  try
120  {
121  handle.PriorityClass = System.Diagnostics.ProcessPriorityClass.AboveNormal;
122  logger.LogTrace("Set to above normal priority", handle.Id);
123  }
124  catch (Exception e)
125  {
126  logger.LogWarning("Unable to raise process priority! Exception: {0}", e);
127  }
128  }
+
readonly ILogger< Process > logger
The ILogger for the Process
Definition: Process.cs:29
+
readonly System.Diagnostics.Process handle
Definition: Process.cs:20
+
+

References Tgstation.Server.Host.Core.Process.handle, Tgstation.Server.Host.Core.Process.Id, and Tgstation.Server.Host.Core.Process.logger.

+ +
+
+ +

◆ Terminate()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Process.Terminate ()
+
+ +

Terminates the process

+ +

Implements Tgstation.Server.Host.Core.IProcess.

+ +

Definition at line 100 of file Process.cs.

+
101  {
102  if (handle.HasExited)
103  return;
104  try
105  {
106  logger.LogTrace("Terminating process...");
107  handle.Kill();
108  handle.WaitForExit();
109  }
110  catch (Exception e)
111  {
112  logger.LogDebug("Process termination exception: {0}", e);
113  }
114  }
readonly ILogger< Process > logger
The ILogger for the Process
Definition: Process.cs:29
+
readonly System.Diagnostics.Process handle
Definition: Process.cs:20
+
+

References Tgstation.Server.Host.Core.Process.handle, and Tgstation.Server.Host.Core.Process.logger.

+ +
+
+

Member Data Documentation

+ +

◆ combinedStringBuilder

+ +
+
+ + + + + +
+ + + + +
readonly StringBuilder Tgstation.Server.Host.Core.Process.combinedStringBuilder
+
+private
+
+
+ +

◆ errorStringBuilder

+ +
+
+ + + + + +
+ + + + +
readonly StringBuilder Tgstation.Server.Host.Core.Process.errorStringBuilder
+
+private
+
+
+ +

◆ handle

+ +
+
+ + + + + +
+ + + + +
readonly System.Diagnostics.Process Tgstation.Server.Host.Core.Process.handle
+
+private
+
+
+ +

◆ logger

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<Process> Tgstation.Server.Host.Core.Process.logger
+
+private
+
+
+ +

◆ outputStringBuilder

+ +
+
+ + + + + +
+ + + + +
readonly StringBuilder Tgstation.Server.Host.Core.Process.outputStringBuilder
+
+private
+
+
+

Property Documentation

+ +

◆ Id

+ +
+
+ + + + + +
+ + + + +
int Tgstation.Server.Host.Core.Process.Id
+
+get
+
+ +

+ +

Definition at line 12 of file Process.cs.

+
12 { get; }
+

Referenced by Tgstation.Server.Host.Core.Process.Process(), and Tgstation.Server.Host.Core.Process.SetHighPriority().

+ +
+
+ +

◆ Lifetime

+ +
+
+ + + + + +
+ + + + +
Task<int> Tgstation.Server.Host.Core.Process.Lifetime
+
+get
+
+ +

+ +

Definition at line 18 of file Process.cs.

+
18 { get; }
+

Referenced by Tgstation.Server.Host.Core.Process.Process().

+ +
+
+ +

◆ Startup

+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Core.Process.Startup
+
+get
+
+ +

+ +

Definition at line 15 of file Process.cs.

+
15 { get; }
+

Referenced by Tgstation.Server.Host.Core.Process.Process().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.png b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.png new file mode 100644 index 0000000000000000000000000000000000000000..fc17a0898feff073bc00e42dbda0d0bfe2cbb862 GIT binary patch literal 1545 zcma)+e^AnA9LI4am8Gt2NvY{=qSKnz<&S2Fo|(DtH8qiP4o&-^r3NBkMu;)Hqgg8w z9aIy`(ljkhZSqS6vsGe>Kh9tIHKOFMTN9B@UF@ihpJ;E(w%|iA5Itd-TijQn8VoAYjp) z#t|zdXVpMmS1Kza`b4 zb+#p{7SCU>&t$mNK{ZzMICe>watBup3Z1b0P58ua_Y~m(&k&(be=;S5QPr)*PrNub z-4$D}H(~S-V&@``V_;S;q00w?pt{EgQmeM2v_`sEbi!s^j_ph^x^%t^bN!<8UOZBa zQViOXN(Zz!QJc{2*5t${ep-3+nJ%w>jf*2wP@%!aatW%E5z0|`1&k>O*VbwIp-T+v z5#i))jUT_NUg>b<6i3w*-f2v4P=Sd#K;dn!=0Q>O$3nt|kxc$v9R_?v=g)y7cioys ze!uG0!RbRgonnkr<+NBimRi~BSEk|w^svbAIgr-MDn=&vX>M7t$k^7I7?zr+WFrDB z@W9NyKanN*%j=buvk-!7DagDOPACO;)E*>Mf)R2vKR1Dy>CHczhKKoRqALp_j9jtg ziXl1*sQpHSca%OxA!u;RE)w2i6kFkxfj%Ql)Ysa2V$3~Zwg3pTV!cQ zvjuaVZI?->C)muE|Ix`3zp9glb&}jxe>0yw(s}p1H%J|M_sa{?L z>y%lWQY8mWzaLFTB)^0M+}GiefmZBM!PMk@W=4wrkM6*M)U-Wb{k=~3_n5r?`$^S` z^qe5|ug$MR3rq@S<*S}IB^72EYLgTM`F0LBi>>mhg@f>aw2>-m8}6J7CF^WMDZ@oY zeX75y9qiGf)A(P!=^_1f<^D!KJ2}snhMRNuCMK3O=)l_#S2dYcbo*w+)gZ1@Kp(wAK)g`|*Lyc77UoEjq-m^VadAY2c@o{Gm_@C|dx zu%TUtImuD9Z^C8L#^M~s>6b+74YMOw(>&qCkm$7InwmiA?sC1?=ArnUYXfZ_Dlt|m zJwXrC{3nMx%3{dr5PMf>o}PEmp4fZbXF{`Y=Dpt@hcIpCD~a0vTHV)bttl(0_YGwQ zj(!RfzR9y$TcbsJlXI;dQ3@Pt=jMzZN*szWJS`)nJn*>*?Xyv?rbPVKKtM^Bt6&TA z@oaHrG=$&YoyGaeg5Xr2tAg+&3DAWI6CJYpA6njp8=>o4@+xB|=P{;#8v+D}?dR=_ G&;A#d=`|z( literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor-members.html new file mode 100644 index 0000000000..70a9121507 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor-members.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.ProcessExecutor Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.ProcessExecutor, including all inherited members.

+ + + + + + + +
AttachExitHandler(System.Diagnostics.Process handle)Tgstation.Server.Host.Core.ProcessExecutorprivatestatic
GetProcess(int id)Tgstation.Server.Host.Core.ProcessExecutor
LaunchProcess(string fileName, string workingDirectory, string arguments, bool readOutput, bool readError, bool noShellExecute)Tgstation.Server.Host.Core.ProcessExecutor
loggerTgstation.Server.Host.Core.ProcessExecutorprivate
loggerFactoryTgstation.Server.Host.Core.ProcessExecutorprivate
ProcessExecutor(ILogger< ProcessExecutor > logger, ILoggerFactory loggerFactory)Tgstation.Server.Host.Core.ProcessExecutor
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html new file mode 100644 index 0000000000..5892941b15 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html @@ -0,0 +1,366 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.ProcessExecutor Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.ProcessExecutor Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.ProcessExecutor:
+
+
+ + +Tgstation.Server.Host.Core.IProcessExecutor + +
+ + + + + + + + + + + +

+Public Member Functions

 ProcessExecutor (ILogger< ProcessExecutor > logger, ILoggerFactory loggerFactory)
 Construct a ProcessExecutor More...
 
IProcess GetProcess (int id)
 Get a IProcess by id More...
 
IProcess LaunchProcess (string fileName, string workingDirectory, string arguments, bool readOutput, bool readError, bool noShellExecute)
 Launch a IProcess More...
 
+ + + + +

+Static Private Member Functions

static Task< int > AttachExitHandler (System.Diagnostics.Process handle)
 Create a Task<TResult> resulting in the exit code of a given handle More...
 
+ + + + + + + +

+Private Attributes

readonly ILogger< ProcessExecutorlogger
 The ILogger for the ProcessExecutor More...
 
readonly ILoggerFactory loggerFactory
 The ILoggerFactory for the ProcessExecutor More...
 
+

Detailed Description

+
+

Definition at line 9 of file ProcessExecutor.cs.

+

Constructor & Destructor Documentation

+ +

◆ ProcessExecutor()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Core.ProcessExecutor.ProcessExecutor (ILogger< ProcessExecutorlogger,
ILoggerFactory loggerFactory 
)
+
+ +

Construct a ProcessExecutor

+
Parameters
+ + + +
loggerThe value of logger
loggerFactoryThe value of loggerFactory
+
+
+ +

Definition at line 52 of file ProcessExecutor.cs.

+
53  {
54  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
55  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
56  }
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the ProcessExecutor
+
readonly ILogger< ProcessExecutor > logger
The ILogger for the ProcessExecutor
+
+

References Tgstation.Server.Host.Core.ProcessExecutor.logger, and Tgstation.Server.Host.Core.ProcessExecutor.loggerFactory.

+ +
+
+

Member Function Documentation

+ +

◆ AttachExitHandler()

+ +
+
+ + + + + +
+ + + + + + + + +
static Task<int> Tgstation.Server.Host.Core.ProcessExecutor.AttachExitHandler (System.Diagnostics.Process handle)
+
+staticprivate
+
+ +

Create a Task<TResult> resulting in the exit code of a given handle

+
Parameters
+ + +
handleThe System.Diagnostics.Process to attach the Task<TResult> for
+
+
+
Returns
A new Task<TResult> resulting in the exit code of handle
+ +

Definition at line 26 of file ProcessExecutor.cs.

+
27  {
28  handle.EnableRaisingEvents = true;
29  var tcs = new TaskCompletionSource<int>();
30  handle.Exited += (a, b) =>
31  {
32  int exitCode;
33  try
34  {
35  exitCode = handle.ExitCode;
36  }
37  catch (InvalidOperationException)
38  {
39  return;
40  }
41 
42  tcs.SetResult(exitCode);
43  };
44  return tcs.Task;
45  }
+

Referenced by Tgstation.Server.Host.Core.ProcessExecutor.GetProcess(), and Tgstation.Server.Host.Core.ProcessExecutor.LaunchProcess().

+ +
+
+ +

◆ GetProcess()

+ +
+
+ + + + + + + + +
IProcess Tgstation.Server.Host.Core.ProcessExecutor.GetProcess (int id)
+
+ +

Get a IProcess by id

+ +

Implements Tgstation.Server.Host.Core.IProcessExecutor.

+ +

Definition at line 59 of file ProcessExecutor.cs.

+
60  {
61  logger.LogDebug("Attaching to process {0}...", id);
62  System.Diagnostics.Process handle;
63  try
64  {
65  handle = System.Diagnostics.Process.GetProcessById(id);
66  }
67  catch(Exception e)
68  {
69  logger.LogDebug("Unable to get process {0}! Exception: {1}", id, e);
70  return null;
71  }
72 
73  try
74  {
75  return new Process(handle, AttachExitHandler(handle), null, null, null, loggerFactory.CreateLogger<Process>(), true);
76  }
77  catch
78  {
79  handle.Dispose();
80  throw;
81  }
82  }
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the ProcessExecutor
+
static Task< int > AttachExitHandler(System.Diagnostics.Process handle)
Create a Task<TResult> resulting in the exit code of a given handle
+
readonly ILogger< ProcessExecutor > logger
The ILogger for the ProcessExecutor
+
+

References Tgstation.Server.Host.Core.ProcessExecutor.AttachExitHandler(), Tgstation.Server.Host.Core.ProcessExecutor.logger, and Tgstation.Server.Host.Core.ProcessExecutor.loggerFactory.

+ +
+
+ +

◆ LaunchProcess()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IProcess Tgstation.Server.Host.Core.ProcessExecutor.LaunchProcess (string fileName,
string workingDirectory,
string arguments,
bool readOutput,
bool readError,
bool noShellExecute 
)
+
+ +

Launch a IProcess

+ +

Implements Tgstation.Server.Host.Core.IProcessExecutor.

+ +

Definition at line 85 of file ProcessExecutor.cs.

+
86  {
87  logger.LogDebug("Launching process in {0}: {1} {2}", workingDirectory, fileName, arguments);
88  var handle = new System.Diagnostics.Process();
89  try
90  {
91  handle.StartInfo.FileName = fileName;
92  handle.StartInfo.Arguments = arguments;
93  handle.StartInfo.WorkingDirectory = workingDirectory;
94 
95  handle.StartInfo.UseShellExecute = !(noShellExecute || readOutput || readError);
96 
97  StringBuilder outputStringBuilder = null, errorStringBuilder = null, combinedStringBuilder = null;
98  if (readOutput || readError)
99  {
100  combinedStringBuilder = new StringBuilder();
101  if (readOutput)
102  {
103  outputStringBuilder = new StringBuilder();
104  handle.StartInfo.RedirectStandardOutput = true;
105  handle.OutputDataReceived += (sender, e) =>
106  {
107  combinedStringBuilder.Append(Environment.NewLine);
108  combinedStringBuilder.Append(e.Data);
109  outputStringBuilder.Append(Environment.NewLine);
110  outputStringBuilder.Append(e.Data);
111  };
112  }
113 
114  if (readError)
115  {
116  errorStringBuilder = new StringBuilder();
117  handle.StartInfo.RedirectStandardError = true;
118  handle.ErrorDataReceived += (sender, e) =>
119  {
120  combinedStringBuilder.Append(Environment.NewLine);
121  combinedStringBuilder.Append(e.Data);
122  errorStringBuilder.Append(Environment.NewLine);
123  errorStringBuilder.Append(e.Data);
124  };
125  }
126  }
127 
128  var lifetimeTask = AttachExitHandler(handle);
129 
130  handle.Start();
131  try
132  {
133  if (readOutput)
134  handle.BeginOutputReadLine();
135  }
136  catch (InvalidOperationException) { }
137  try
138  {
139  if (readError)
140  handle.BeginErrorReadLine();
141  }
142  catch (InvalidOperationException) { }
143 
144  return new Process(handle, lifetimeTask, outputStringBuilder, errorStringBuilder, combinedStringBuilder, loggerFactory.CreateLogger<Process>(), false);
145  }
146  catch
147  {
148  handle.Dispose();
149  throw;
150  }
151  }
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the ProcessExecutor
+
static Task< int > AttachExitHandler(System.Diagnostics.Process handle)
Create a Task<TResult> resulting in the exit code of a given handle
+
readonly ILogger< ProcessExecutor > logger
The ILogger for the ProcessExecutor
+
+

References Tgstation.Server.Host.Core.ProcessExecutor.AttachExitHandler(), Tgstation.Server.Host.Core.ProcessExecutor.logger, and Tgstation.Server.Host.Core.ProcessExecutor.loggerFactory.

+ +
+
+

Member Data Documentation

+ +

◆ logger

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<ProcessExecutor> Tgstation.Server.Host.Core.ProcessExecutor.logger
+
+private
+
+
+ +

◆ loggerFactory

+ +
+
+ + + + + +
+ + + + +
readonly ILoggerFactory Tgstation.Server.Host.Core.ProcessExecutor.loggerFactory
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.png b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.png new file mode 100644 index 0000000000000000000000000000000000000000..7836c580a7aeb7b616f97b7f974f4758142a34c6 GIT binary patch literal 1006 zcmeAS@N?(olHy`uVBq!ia0y~yVB`g|12~w0q{-?F%Yl?cfKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+19PpXi(^OyzuXa_x^hdb>*5TLpk<2!O;j|47jJwsU8T7H z+3Wiz*VqnuPnwcxKD)R2_pOV+f1kI%`dry_xtE)7-jP6e=SfZ5{-qnnUEWc6CG4?b zAA6gB#-4_K|M%?7EBKxK{_ecn84%(ycRw~O`OmN2PMK4oZ9XSFj=BF1Xf#lQuE`wXkMe0*BAZ~yTb7bMQb zXcW$CJFb*DDRXW&zy^566 zN){M$EnNHPhMxwn~mHy~8nU)&qb^It(z%Ap&Ad_6cCcQF=3S>QIJ8ONt z<+dL}4$JQ5n7w*I+1=0c?n!aq$-MFJ=W_e#ecRV;E6ZhCc3Ya%EM|G2Tuig9(pEbIv8D6SfS~A&sd+A~Q-i_5hhv#YT zeU;zdVH;dywtMk`xA$h)U7l&ARrD<5Pr1pv^HXYzm!zLE6fIwtVq#~xj`80-rrw=S zOf|hpd0&k9KBRh;a~%j@g@~c5ixJaOHQ!#hU-i@ckMvzXMquV-@O1TaS?83{1OO+A B+=KuC literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration-members.html new file mode 100644 index 0000000000..d4e249be80 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.RestartRegistration Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration.html new file mode 100644 index 0000000000..474ef647fe --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration.html @@ -0,0 +1,201 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.RestartRegistration Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.RestartRegistration Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.RestartRegistration:
+
+
+ + +Tgstation.Server.Host.Core.IRestartRegistration +IDisposable + +
+ + + + + + + +

+Public Member Functions

 RestartRegistration (Action onDispose)
 Construct a RestartRegistration More...
 
void Dispose ()
 
+ + + + +

+Private Attributes

readonly Action onDispose
 The Dispose Action More...
 
+

Detailed Description

+
+

Definition at line 6 of file RestartRegistration.cs.

+

Constructor & Destructor Documentation

+ +

◆ RestartRegistration()

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Core.RestartRegistration.RestartRegistration (Action onDispose)
+
+ +

Construct a RestartRegistration

+
Parameters
+ + +
onDisposeThe value of onDispose
+
+
+ +

Definition at line 17 of file RestartRegistration.cs.

+
18  {
19  this.onDispose = onDispose ?? throw new ArgumentNullException(nameof(onDispose));
20  }
readonly Action onDispose
The Dispose Action
+
+

References Tgstation.Server.Host.Core.RestartRegistration.onDispose.

+ +
+
+

Member Function Documentation

+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.RestartRegistration.Dispose ()
+
+ +

+ +
+
+

Member Data Documentation

+ +

◆ onDispose

+ +
+
+ + + + + +
+ + + + +
readonly Action Tgstation.Server.Host.Core.RestartRegistration.onDispose
+
+private
+
+ +

The Dispose Action

+ +

Definition at line 11 of file RestartRegistration.cs.

+ +

Referenced by Tgstation.Server.Host.Core.RestartRegistration.RestartRegistration().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration.png b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration.png new file mode 100644 index 0000000000000000000000000000000000000000..0e9b6d688e5abe4801d66d58d56a1f011bc3e2f1 GIT binary patch literal 1413 zcmeAS@N?(olHy`uVBq!ia0y~yU=#zgJ2;quq-cl9FCZlm;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|z$)VD;uuoF_;&8?B5h3pmdQ$o{{KIz z-G9U(*kF_B?tN=+w_lmbZBW8=R(tEUSy!T*7kULLWooQ+oz!zh$TG_k*Uz_)be_s`^_1t=^ z&8fY2h zPCVx8y>_eG)@vIX{)pUT5K@?Og~{Oaw`p+Fj%B^iqQNC{`-&D`hNTSFVN7gE9zGFwdy$y3q$9BH@vsA zGXG+mWoWg@JKl5qwilj_>f040+0|7gsb$jr+~U^qYKgaj7m{Mnb=SPgxMXBLKT2nn zXr|6(h3SR5TfSUuGpsz&JVPlnX%Fws?9ZK^-Z{1^y|JH-%~qTFIY?ZzTh}{H@rKwb zzi!@TZx?^On6&kaf6mq~ZzN~g{_0i!;%ar?amIf2!na#u@)l{%DfH)!3iC8I+keX? z@b4DuWjE)Ezr6BsN64OU?ptln>t^dJ-Z`qa>y+;4KD(LG+pcz*Obg%AqkeJb?tT&5 zv^P7#4l^2kyCQ#d@7?}M^PYvtetmt`)1+rZ@2_7fT=#Du72RrMdq(x8`6nlv&C@LB zdR@wYcC;dA>ztGElm4;q5j&qH?0HFE9hhDxLQ@PVt>i%>sgL!+@(*ki7#0Fk!_4j5 zzc3j9Q$bo@*d=ZUm8}dq9-3569Kh6e%>Po5m!_wtstA_@6OSrNQuEW*WoF*{<@W8X zx8|EOMHH?#3%7f}-a3ls+^;J6$D5}A<4w@Gz2H#R&KLQ+m-RiD|6H{8si*tt>$5fH zf7!Hm@0Cv$o9{1`e|CQU@5_(BS7cAV`)hYNXaAyU-xht9Q%}gay8K^HdEV{S+YSA$ z%5AD@-uyT>fLqtSRKt1Uh0_5GBW>C*?Yo!0&Xy}`&FRXy{<5tbeRG$;>ds<4X4G3C zdnL$QK3D$o8x0@*fH@z{Qr4eUSJT~C>MgZ literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context-members.html new file mode 100644 index 0000000000..bb9f3f199f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context-members.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.SemaphoreSlimContext Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html new file mode 100644 index 0000000000..48ecefd96c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html @@ -0,0 +1,343 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.SemaphoreSlimContext Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.SemaphoreSlimContext Class Reference
+
+
+ +

Async lock context helper + More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.SemaphoreSlimContext:
+
+
+ + +IDisposable + +
+ + + + + +

+Public Member Functions

void Dispose ()
 Release the lock on lockedSemaphore More...
 
+ + + + +

+Static Public Member Functions

static async Task< SemaphoreSlimContextLock (SemaphoreSlim semaphore, CancellationToken cancellationToken)
 Asyncronously locks a semaphore More...
 
+ + + + + + + +

+Private Member Functions

 SemaphoreSlimContext (SemaphoreSlim lockedSemaphore)
 Construct a SemaphoreSlimContext More...
 
 ~SemaphoreSlimContext ()
 Finalizes an instance of the SemaphoreSlimContext class. More...
 
+ + + + + + + +

+Private Attributes

readonly SemaphoreSlim lockedSemaphore
 The locked SemaphoreSlim More...
 
bool disposed
 If Dispose has been called More...
 
+

Detailed Description

+

Async lock context helper

+ +

Definition at line 10 of file SemaphoreSlimContext.cs.

+

Constructor & Destructor Documentation

+ +

◆ SemaphoreSlimContext()

+ +
+
+ + + + + +
+ + + + + + + + +
Tgstation.Server.Host.Core.SemaphoreSlimContext.SemaphoreSlimContext (SemaphoreSlim lockedSemaphore)
+
+private
+
+ +

Construct a SemaphoreSlimContext

+
Parameters
+ + +
lockedSemaphoreThe value of lockedSemaphore
+
+
+ +

Definition at line 41 of file SemaphoreSlimContext.cs.

+
42  {
44  }
readonly SemaphoreSlim lockedSemaphore
The locked SemaphoreSlim
+
+

References Tgstation.Server.Host.Core.SemaphoreSlimContext.lockedSemaphore.

+ +

Referenced by Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock().

+ +
+
+ +

◆ ~SemaphoreSlimContext()

+ +
+
+ + + + + +
+ + + + + + + +
Tgstation.Server.Host.Core.SemaphoreSlimContext.~SemaphoreSlimContext ()
+
+private
+
+ +

Finalizes an instance of the SemaphoreSlimContext class.

+ +
+
+

Member Function Documentation

+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.SemaphoreSlimContext.Dispose ()
+
+ +

Release the lock on lockedSemaphore

+ +

Definition at line 56 of file SemaphoreSlimContext.cs.

+
57  {
58  lock (this)
59  {
60  if (disposed)
61  return;
62  disposed = true;
63  }
64 
65  GC.SuppressFinalize(this);
66  lockedSemaphore.Release();
67  }
readonly SemaphoreSlim lockedSemaphore
The locked SemaphoreSlim
+ +
+

References Tgstation.Server.Host.Core.SemaphoreSlimContext.disposed, and Tgstation.Server.Host.Core.SemaphoreSlimContext.lockedSemaphore.

+ +
+
+ +

◆ Lock()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static async Task<SemaphoreSlimContext> Tgstation.Server.Host.Core.SemaphoreSlimContext.Lock (SemaphoreSlim semaphore,
CancellationToken cancellationToken 
)
+
+static
+
+ +

Asyncronously locks a semaphore

+
Parameters
+ + + +
semaphoreThe SemaphoreSlim to lock
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the SemaphoreSlimContext for the lock
+ +

Definition at line 18 of file SemaphoreSlimContext.cs.

+
19  {
20  if (semaphore == null)
21  throw new ArgumentNullException(nameof(semaphore));
22  await semaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
23  cancellationToken.ThrowIfCancellationRequested();
24  return new SemaphoreSlimContext(semaphore);
25  }
SemaphoreSlimContext(SemaphoreSlim lockedSemaphore)
Construct a SemaphoreSlimContext
+
+

References Tgstation.Server.Host.Core.SemaphoreSlimContext.SemaphoreSlimContext().

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ChangeSettings(), Tgstation.Server.Host.Components.Byond.ByondManager.ChangeVersion(), Tgstation.Server.Host.Components.Repository.RepositoryManager.CloneRepository(), Tgstation.Server.Host.Components.StaticFiles.Configuration.CopyDMFilesTo(), Tgstation.Server.Host.Components.StaticFiles.Configuration.CreateDirectory(), Tgstation.Server.Host.Components.StaticFiles.Configuration.DeleteDirectory(), Tgstation.Server.Host.Components.Repository.RepositoryManager.DeleteRepository(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.HandleChatCommand(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.HandleEvent(), Tgstation.Server.Host.Components.StaticFiles.Configuration.HandleEvent(), Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.InstallByond(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Launch(), Tgstation.Server.Host.Components.StaticFiles.Configuration.ListDirectory(), Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.MonitorLifetimes(), Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.MonitorLifetimes(), Tgstation.Server.Host.Components.StaticFiles.Configuration.Read(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ResetRebootState(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Restart(), Tgstation.Server.Host.Components.Chat.JsonTrackingContext.SetChannels(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StartAsync(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Terminate(), and Tgstation.Server.Host.Components.StaticFiles.Configuration.Write().

+ +
+
+

Member Data Documentation

+ +

◆ disposed

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Core.SemaphoreSlimContext.disposed
+
+private
+
+ +

If Dispose has been called

+ +

Definition at line 35 of file SemaphoreSlimContext.cs.

+ +

Referenced by Tgstation.Server.Host.Core.SemaphoreSlimContext.Dispose().

+ +
+
+ +

◆ lockedSemaphore

+ +
+
+ + + + + +
+ + + + +
readonly SemaphoreSlim Tgstation.Server.Host.Core.SemaphoreSlimContext.lockedSemaphore
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.png b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.png new file mode 100644 index 0000000000000000000000000000000000000000..5fc6bfd0ae17d35bcb0e9a59640bbeaa7c1cea73 GIT binary patch literal 914 zcmeAS@N?(olHy`uVBq!ia0y~yVAKY(12~w0WZ8?w20%(8z$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opuxKEu(r3B{QEz7 z_7SxWA9J?{35Uln_eqw%aiE}j>9r`|wOiwyrm84=ir<*3@^pi?=c&Z-NmCB5Q_(!W zJ!YzV)xWjpCzYIvQVR~5^pER)$ye*-@#rR z=XuHSaoVnZ?D7Bq-L4LpWLA@3?RiPHOx4r!jn|~2JEx|q+?CipX^9L>1mwnw9jms6 z1!u1fXSmZZ&%j*J8Oylj$Ip#A4LoJ66CN!*wTVIKhNy$sY^D>5;S82 zZjb>=A6~~$1eE04O^IY-aQM?{cncgYC7l z2E)Dg^_iC5veevo?S48+jX_TT=qEb7`-=g-+p z^BND=pT3@2bg$S@uUjl{?*5O#C0C82zF25GueEy~Z0(&_A#c5{*YHT?(yhPlyb(%} zD37SxygFP{!+Ft#%K-~k)@o-wejj|pjx~Jtgo8)TF8EoWUn$LgXP3+_$)qp8ioa^U zySU?f?AJSX6D%EO2rkHxj6d92apB05tW~nNXWAZD<2JbbT3jNy#8m8M-}zWx+w8~I zMO*z&Y`Av+cWK-|YwmYfu9kfGR@V0J%&+ut=N_ipB~Mm;wR`xggx@b&X8V%|S?|B} zT|NITVNUKQP1Z+SPAQ`OmGc4L^ABoScpI`Z8wO?ZpL6a_I_x|Abr5E}RJq+rMF4<9a%;Rsc#r(GF4flns8{3}Gkp1?c=%?S@TSsPSy)(C7 z_1^Zi_~8mAA8Dos^B)-7&Wkp+07DLHwD+~I4)QWwI;H5S ZzDAUT*o@K+LtqAC@O1TaS?83{1OVBivnT)n literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_service_collection_extensions-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_service_collection_extensions-members.html new file mode 100644 index 0000000000..5e9baf4328 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_service_collection_extensions-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.ServiceCollectionExtensions Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.ServiceCollectionExtensions, including all inherited members.

+ + +
UseStandardConfig< TConfig >(this IServiceCollection serviceCollection, IConfiguration configuration)Tgstation.Server.Host.Core.ServiceCollectionExtensionsstatic
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_service_collection_extensions.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_service_collection_extensions.html new file mode 100644 index 0000000000..a9440a7430 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_service_collection_extensions.html @@ -0,0 +1,169 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.ServiceCollectionExtensions Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.ServiceCollectionExtensions Class Reference
+
+
+ +

Extensions for IServiceCollection + More...

+ + + + + +

+Static Public Member Functions

static IServiceCollection UseStandardConfig< TConfig > (this IServiceCollection serviceCollection, IConfiguration configuration)
 Add a standard TConfig binding More...
 
+

Detailed Description

+

Extensions for IServiceCollection

+ +

Definition at line 12 of file ServiceCollectionExtensions.cs.

+

Member Function Documentation

+ +

◆ UseStandardConfig< TConfig >()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static IServiceCollection Tgstation.Server.Host.Core.ServiceCollectionExtensions.UseStandardConfig< TConfig > (this IServiceCollection serviceCollection,
IConfiguration configuration 
)
+
+static
+
+ +

Add a standard TConfig binding

+
Template Parameters
+ + +
TConfigThe class to bind. Must have a public const/static string field named "Section"
+
+
+
Parameters
+ + + +
serviceCollectionThe IServiceCollection to configure
configurationThe IConfiguration containing the TConfig
+
+
+
Returns
serviceCollection
+
+
Type Constraints
+ + +
TConfig :class 
+
+
+
+ +

Definition at line 21 of file ServiceCollectionExtensions.cs.

+
21  : class
22  {
23  if (serviceCollection == null)
24  throw new ArgumentNullException(nameof(serviceCollection));
25  if (configuration == null)
26  throw new ArgumentNullException(nameof(configuration));
27 
28  const string SectionFieldName = nameof(GeneralConfiguration.Section);
29 
30  var configType = typeof(TConfig);
31  var sectionField = configType.GetField(SectionFieldName);
32  if (sectionField == null)
33  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "{0} has no {1} field!", configType, SectionFieldName));
34 
35  var stringType = typeof(string);
36  if (sectionField.FieldType != stringType)
37  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "{0} has invalid {1} field type, must be {2}!", configType, SectionFieldName, stringType));
38 
39  var sectionName = (string)sectionField.GetValue(null);
40 
41  return serviceCollection.Configure<TConfig>(configuration.GetSection(sectionName));
42  }
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the GeneralConfiguration res...
+ +
+

References Tgstation.Server.Host.Configuration.GeneralConfiguration.Section.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard-members.html new file mode 100644 index 0000000000..b30e082a66 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard-members.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.SetupWizard Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.SetupWizard, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + +
applicationTgstation.Server.Host.Core.SetupWizardprivate
asyncDelayerTgstation.Server.Host.Core.SetupWizardprivate
CheckRunWizard(CancellationToken cancellationToken)Tgstation.Server.Host.Core.SetupWizard
ConfigureControlPanel(CancellationToken cancellationToken)Tgstation.Server.Host.Core.SetupWizardprivate
ConfigureDatabase(CancellationToken cancellationToken)Tgstation.Server.Host.Core.SetupWizardprivate
ConfigureGeneral(CancellationToken cancellationToken)Tgstation.Server.Host.Core.SetupWizardprivate
ConfigureLogging(CancellationToken cancellationToken)Tgstation.Server.Host.Core.SetupWizardprivate
consoleTgstation.Server.Host.Core.SetupWizardprivate
dbConnectionFactoryTgstation.Server.Host.Core.SetupWizardprivate
generalConfigurationTgstation.Server.Host.Core.SetupWizardprivate
hostingEnvironmentTgstation.Server.Host.Core.SetupWizardprivate
ioManagerTgstation.Server.Host.Core.SetupWizardprivate
loggerTgstation.Server.Host.Core.SetupWizardprivate
platformIdentifierTgstation.Server.Host.Core.SetupWizardprivate
PromptForHostingPort(CancellationToken cancellationToken)Tgstation.Server.Host.Core.SetupWizardprivate
PromptYesNo(string question, CancellationToken cancellationToken)Tgstation.Server.Host.Core.SetupWizardprivate
RunWizard(string userConfigFileName, CancellationToken cancellationToken)Tgstation.Server.Host.Core.SetupWizardprivate
SaveConfiguration(string userConfigFileName, ushort? hostingPort, DatabaseConfiguration databaseConfiguration, GeneralConfiguration newGeneralConfiguration, FileLoggingConfiguration fileLoggingConfiguration, ControlPanelConfiguration controlPanelConfiguration, CancellationToken cancellationToken)Tgstation.Server.Host.Core.SetupWizardprivate
SetupWizard(IIOManager ioManager, IConsole console, IHostingEnvironment hostingEnvironment, IApplication application, IDBConnectionFactory dbConnectionFactory, IPlatformIdentifier platformIdentifier, IAsyncDelayer asyncDelayer, ILogger< SetupWizard > logger, IOptions< GeneralConfiguration > generalConfigurationOptions)Tgstation.Server.Host.Core.SetupWizard
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html new file mode 100644 index 0000000000..30d152e815 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html @@ -0,0 +1,1026 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.SetupWizard Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.SetupWizard Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.SetupWizard:
+
+
+ + +Tgstation.Server.Host.Core.ISetupWizard + +
+ + + + + + + + +

+Public Member Functions

 SetupWizard (IIOManager ioManager, IConsole console, IHostingEnvironment hostingEnvironment, IApplication application, IDBConnectionFactory dbConnectionFactory, IPlatformIdentifier platformIdentifier, IAsyncDelayer asyncDelayer, ILogger< SetupWizard > logger, IOptions< GeneralConfiguration > generalConfigurationOptions)
 Construct a SetupWizard More...
 
async Task< bool > CheckRunWizard (CancellationToken cancellationToken)
 Run the setup wizard if necessary More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Member Functions

async Task< bool > PromptYesNo (string question, CancellationToken cancellationToken)
 A prompt for a yes or no value More...
 
async Task< ushort?> PromptForHostingPort (CancellationToken cancellationToken)
 Prompts the user to enter the port to host TGS on More...
 
async Task< DatabaseConfigurationConfigureDatabase (CancellationToken cancellationToken)
 Prompts the user to create a DatabaseConfiguration More...
 
async Task< GeneralConfigurationConfigureGeneral (CancellationToken cancellationToken)
 Prompts the user to create a GeneralConfiguration More...
 
async Task< FileLoggingConfigurationConfigureLogging (CancellationToken cancellationToken)
 Prompts the user to create a FileLoggingConfiguration More...
 
async Task< ControlPanelConfigurationConfigureControlPanel (CancellationToken cancellationToken)
 Prompts the user to create a ControlPanelConfiguration More...
 
async Task SaveConfiguration (string userConfigFileName, ushort? hostingPort, DatabaseConfiguration databaseConfiguration, GeneralConfiguration newGeneralConfiguration, FileLoggingConfiguration fileLoggingConfiguration, ControlPanelConfiguration controlPanelConfiguration, CancellationToken cancellationToken)
 Saves a given Configuration set to userConfigFileName More...
 
async Task RunWizard (string userConfigFileName, CancellationToken cancellationToken)
 Runs the SetupWizard More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

readonly IIOManager ioManager
 The IIOManager for the SetupWizard More...
 
readonly IConsole console
 The IConsole for the SetupWizard More...
 
readonly IHostingEnvironment hostingEnvironment
 The IHostingEnvironment for the SetupWizard More...
 
readonly IApplication application
 The IApplication for the SetupWizard More...
 
readonly IDBConnectionFactory dbConnectionFactory
 The IDBConnectionFactory for the SetupWizard More...
 
readonly IPlatformIdentifier platformIdentifier
 The IPlatformIdentifier for the SetupWizard More...
 
readonly IAsyncDelayer asyncDelayer
 The IAsyncDelayer for the SetupWizard More...
 
readonly ILogger< SetupWizardlogger
 The ILogger for the SetupWizard More...
 
readonly GeneralConfiguration generalConfiguration
 The GeneralConfiguration for the SetupWizard More...
 
+

Detailed Description

+
+

Definition at line 21 of file SetupWizard.cs.

+

Constructor & Destructor Documentation

+ +

◆ SetupWizard()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Core.SetupWizard.SetupWizard (IIOManager ioManager,
IConsole console,
IHostingEnvironment hostingEnvironment,
IApplication application,
IDBConnectionFactory dbConnectionFactory,
IPlatformIdentifier platformIdentifier,
IAsyncDelayer asyncDelayer,
ILogger< SetupWizardlogger,
IOptions< GeneralConfigurationgeneralConfigurationOptions 
)
+
+ +

Construct a SetupWizard

+
Parameters
+ + + + + + + + + + +
ioManagerThe value of ioManager
consoleThe value of console
hostingEnvironmentThe value of hostingEnvironment
applicationThe value of application
dbConnectionFactoryThe value of dbConnectionFactory
platformIdentifierThe value of platformIdentifier
asyncDelayerThe value of asyncDelayer
loggerThe value of logger
generalConfigurationOptionsThe IOptions<TOptions> containing the value of generalConfiguration
+
+
+ +

Definition at line 80 of file SetupWizard.cs.

+
81  {
82  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
83  this.console = console ?? throw new ArgumentNullException(nameof(console));
84  this.hostingEnvironment = hostingEnvironment ?? throw new ArgumentNullException(nameof(hostingEnvironment));
85  this.application = application ?? throw new ArgumentNullException(nameof(application));
86  this.dbConnectionFactory = dbConnectionFactory ?? throw new ArgumentNullException(nameof(dbConnectionFactory));
87  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
88  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
89  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
90  generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
91  }
readonly IConsole console
The IConsole for the SetupWizard
Definition: SetupWizard.cs:31
+
readonly IApplication application
The IApplication for the SetupWizard
Definition: SetupWizard.cs:41
+
readonly IIOManager ioManager
The IIOManager for the SetupWizard
Definition: SetupWizard.cs:26
+
readonly IDBConnectionFactory dbConnectionFactory
The IDBConnectionFactory for the SetupWizard
Definition: SetupWizard.cs:46
+
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the SetupWizard
Definition: SetupWizard.cs:66
+
readonly IHostingEnvironment hostingEnvironment
The IHostingEnvironment for the SetupWizard
Definition: SetupWizard.cs:36
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the SetupWizard
Definition: SetupWizard.cs:56
+
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the SetupWizard
Definition: SetupWizard.cs:51
+
readonly ILogger< SetupWizard > logger
The ILogger for the SetupWizard
Definition: SetupWizard.cs:61
+
+

References Tgstation.Server.Host.Core.SetupWizard.application, Tgstation.Server.Host.Core.SetupWizard.asyncDelayer, Tgstation.Server.Host.Core.SetupWizard.console, Tgstation.Server.Host.Core.SetupWizard.dbConnectionFactory, Tgstation.Server.Host.Core.SetupWizard.generalConfiguration, Tgstation.Server.Host.Core.SetupWizard.hostingEnvironment, Tgstation.Server.Host.Core.SetupWizard.ioManager, Tgstation.Server.Host.Core.SetupWizard.logger, and Tgstation.Server.Host.Core.SetupWizard.platformIdentifier.

+ +
+
+

Member Function Documentation

+ +

◆ CheckRunWizard()

+ +
+
+ + + + + + + + +
async Task<bool> Tgstation.Server.Host.Core.SetupWizard.CheckRunWizard (CancellationToken cancellationToken)
+
+ +

Run the setup wizard if necessary

+ +

Implements Tgstation.Server.Host.Core.ISetupWizard.

+ +

Definition at line 588 of file SetupWizard.cs.

+
589  {
590  var setupWizardMode = generalConfiguration.SetupWizardMode;
591  logger.LogTrace("Checking if setup wizard should run. SetupWizardMode: {0}", setupWizardMode);
592 
593  if (setupWizardMode == SetupWizardMode.Never)
594  {
595  logger.LogTrace("Skipping due to configuration...");
596  return false;
597  }
598 
599  var forceRun = setupWizardMode == SetupWizardMode.Force || setupWizardMode == SetupWizardMode.Only;
600  if (!console.Available)
601  {
602  if (forceRun)
603  throw new InvalidOperationException("Asked to run setup wizard with no console avaliable!");
604  logger.LogTrace("Skipping due to console not being available...");
605  return false;
606  }
607 
608  var userConfigFileName = String.Format(CultureInfo.InvariantCulture, "appsettings.{0}.json", hostingEnvironment.EnvironmentName);
609  var exists = await ioManager.FileExists(userConfigFileName, cancellationToken).ConfigureAwait(false);
610 
611  bool shouldRunBasedOnAutodetect;
612  if (exists)
613  {
614  var bytes = await ioManager.ReadAllBytes(userConfigFileName, cancellationToken).ConfigureAwait(false);
615  var contents = Encoding.UTF8.GetString(bytes);
616  var existingConfigIsEmpty = String.IsNullOrWhiteSpace(contents) || contents.Trim() == "{}";
617  logger.LogTrace("Configuration json detected. Empty: {0}", existingConfigIsEmpty);
618  shouldRunBasedOnAutodetect = existingConfigIsEmpty;
619  }
620  else
621  {
622  shouldRunBasedOnAutodetect = true;
623  logger.LogTrace("No configuration json detected");
624  }
625 
626  if (!shouldRunBasedOnAutodetect)
627  {
628  if (forceRun)
629  {
630  logger.LogTrace("Asking user to bypass due to force run request...");
631  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);
632 
633  forceRun = await PromptYesNo("Continue running setup wizard? (y/n): ", cancellationToken).ConfigureAwait(false);
634  }
635 
636  if (!forceRun)
637  return false;
638  }
639 
640  // flush the logs to prevent console conflicts
641  await asyncDelayer.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
642 
643  await RunWizard(userConfigFileName, cancellationToken).ConfigureAwait(false);
644  return true;
645  }
readonly IConsole console
The IConsole for the SetupWizard
Definition: SetupWizard.cs:31
+
SetupWizardMode
Determines if the Core.ISetupWizard will run
+
bool Available
If the IConsole is visible to the user
Definition: IConsole.cs:14
+
readonly IIOManager ioManager
The IIOManager for the SetupWizard
Definition: SetupWizard.cs:26
+
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the SetupWizard
Definition: SetupWizard.cs:66
+
Task< bool > FileExists(string path, CancellationToken cancellationToken)
Check that the file at path exists
+
async Task< bool > PromptYesNo(string question, CancellationToken cancellationToken)
A prompt for a yes or no value
Definition: SetupWizard.cs:99
+
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+ +
Task WriteAsync(string text, bool newLine, CancellationToken cancellationToken)
Write some text to the IConsole
+
readonly IHostingEnvironment hostingEnvironment
The IHostingEnvironment for the SetupWizard
Definition: SetupWizard.cs:36
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the SetupWizard
Definition: SetupWizard.cs:56
+
readonly ILogger< SetupWizard > logger
The ILogger for the SetupWizard
Definition: SetupWizard.cs:61
+
Task< byte[]> ReadAllBytes(string path, CancellationToken cancellationToken)
Returns all the contents of a file at path as a byte array
+
async Task RunWizard(string userConfigFileName, CancellationToken cancellationToken)
Runs the SetupWizard
Definition: SetupWizard.cs:565
+
+

References Tgstation.Server.Host.Core.SetupWizard.asyncDelayer, Tgstation.Server.Host.IO.IConsole.Available, Tgstation.Server.Host.Core.SetupWizard.console, Tgstation.Server.Host.Core.IAsyncDelayer.Delay(), Tgstation.Server.Host.IO.IIOManager.FileExists(), Tgstation.Server.Host.Core.SetupWizard.generalConfiguration, Tgstation.Server.Host.Core.SetupWizard.hostingEnvironment, Tgstation.Server.Host.Core.SetupWizard.ioManager, Tgstation.Server.Host.Core.SetupWizard.logger, Tgstation.Server.Host.Core.SetupWizard.PromptYesNo(), Tgstation.Server.Host.IO.IIOManager.ReadAllBytes(), Tgstation.Server.Host.Core.SetupWizard.RunWizard(), Tgstation.Server.Host.Configuration.GeneralConfiguration.SetupWizardMode, and Tgstation.Server.Host.IO.IConsole.WriteAsync().

+ +
+
+ +

◆ ConfigureControlPanel()

+ +
+
+ + + + + +
+ + + + + + + + +
async Task<ControlPanelConfiguration> Tgstation.Server.Host.Core.SetupWizard.ConfigureControlPanel (CancellationToken cancellationToken)
+
+private
+
+ +

Prompts the user to create a ControlPanelConfiguration

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the new ControlPanelConfiguration
+ +

Definition at line 472 of file SetupWizard.cs.

+
473  {
474  var config = new ControlPanelConfiguration
475  {
476  Enable = await PromptYesNo("Enable the web control panel? (y/n): ", cancellationToken).ConfigureAwait(false),
477  AllowAnyOrigin = await PromptYesNo("Allow web control panels hosted elsewhere to access the server? (Access-Control-Allow-Origin: *) (y/n): ", cancellationToken).ConfigureAwait(false)
478  };
479 
480  if (!config.AllowAnyOrigin)
481  {
482  await console.WriteAsync("Enter a comma seperated list of CORS allowed origins (optional): ", false, cancellationToken).ConfigureAwait(false);
483  var commaSeperatedOrigins = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
484  if (!String.IsNullOrWhiteSpace(commaSeperatedOrigins))
485  {
486  var splits = commaSeperatedOrigins.Split(',');
487  config.AllowedOrigins = new List<string>(splits.Select(x => x.Trim()));
488  }
489  }
490 
491  return config;
492  }
readonly IConsole console
The IConsole for the SetupWizard
Definition: SetupWizard.cs:31
+
async Task< bool > PromptYesNo(string question, CancellationToken cancellationToken)
A prompt for a yes or no value
Definition: SetupWizard.cs:99
+
Task< string > ReadLineAsync(bool usePasswordChar, CancellationToken cancellationToken)
Read a line from the IConsole
+ +
Task WriteAsync(string text, bool newLine, CancellationToken cancellationToken)
Write some text to the IConsole
+
+

References Tgstation.Server.Host.Core.SetupWizard.console, Tgstation.Server.Host.Core.SetupWizard.PromptYesNo(), Tgstation.Server.Host.IO.IConsole.ReadLineAsync(), and Tgstation.Server.Host.IO.IConsole.WriteAsync().

+ +

Referenced by Tgstation.Server.Host.Core.SetupWizard.RunWizard().

+ +
+
+ +

◆ ConfigureDatabase()

+ +
+
+ + + + + +
+ + + + + + + + +
async Task<DatabaseConfiguration> Tgstation.Server.Host.Core.SetupWizard.ConfigureDatabase (CancellationToken cancellationToken)
+
+private
+
+ +

Prompts the user to create a DatabaseConfiguration

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the new DatabaseConfiguration
+ +

Definition at line 144 of file SetupWizard.cs.

+
145  {
146  do
147  {
148  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
149  await console.WriteAsync("What SQL database type will you be using?", true, cancellationToken).ConfigureAwait(false);
150 
151  var databaseConfiguration = new DatabaseConfiguration();
152  do
153  {
154  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Please enter one of {0}, {1}, or {2}: ", DatabaseType.MariaDB, DatabaseType.SqlServer, DatabaseType.MySql), false, cancellationToken).ConfigureAwait(false);
155  var databaseTypeString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
156  if (Enum.TryParse<DatabaseType>(databaseTypeString, out var databaseType))
157  {
158  databaseConfiguration.DatabaseType = databaseType;
159  break;
160  }
161 
162  await console.WriteAsync("Invalid database type!", true, cancellationToken).ConfigureAwait(false);
163  }
164  while (true);
165 
166  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
167  await console.WriteAsync("Enter the server's address and port (blank for local): ", false, cancellationToken).ConfigureAwait(false);
168  var serverAddress = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
169  if (String.IsNullOrWhiteSpace(serverAddress))
170  serverAddress = null;
171 
172  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
173  await console.WriteAsync("Enter the database name (Can be from previous installation. Otherwise, should not exist): ", false, cancellationToken).ConfigureAwait(false);
174  string databaseName;
175  do
176  {
177  databaseName = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
178  if (!String.IsNullOrWhiteSpace(databaseName))
179  break;
180  await console.WriteAsync("Invalid database name!", true, cancellationToken).ConfigureAwait(false);
181  }
182  while (true);
183 
184  var dbExists = await PromptYesNo("Does this database already exist? (y/n): ", cancellationToken).ConfigureAwait(false);
185 
186  bool useWinAuth;
187  if (databaseConfiguration.DatabaseType == DatabaseType.SqlServer && platformIdentifier.IsWindows)
188  useWinAuth = await PromptYesNo("Use Windows Authentication? (y/n): ", cancellationToken).ConfigureAwait(false);
189  else
190  useWinAuth = false;
191 
192  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
193 
194  string username = null;
195  string password = null;
196  if (!useWinAuth)
197  {
198  await console.WriteAsync("Enter username: ", false, cancellationToken).ConfigureAwait(false);
199  username = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
200  await console.WriteAsync("Enter password: ", false, cancellationToken).ConfigureAwait(false);
201  password = await console.ReadLineAsync(true, cancellationToken).ConfigureAwait(false);
202  }
203  else
204  {
205  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);
206  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);
207  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);
208  }
209 
210  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
211 
212  DbConnection testConnection;
213  void CreateTestConnection(string connectionString)
214  {
215  testConnection = dbConnectionFactory.CreateConnection(connectionString, databaseConfiguration.DatabaseType);
216  }
217 
218  if (databaseConfiguration.DatabaseType == DatabaseType.SqlServer)
219  {
220  var csb = new SqlConnectionStringBuilder
221  {
222  ApplicationName = application.VersionPrefix,
223  DataSource = serverAddress ?? "(local)"
224  };
225  if (useWinAuth)
226  csb.IntegratedSecurity = true;
227  else
228  {
229  csb.UserID = username;
230  csb.Password = password;
231  }
232 
233  CreateTestConnection(csb.ConnectionString);
234  csb.InitialCatalog = databaseName;
235  databaseConfiguration.ConnectionString = csb.ConnectionString;
236  }
237  else
238  {
239  var csb = new MySqlConnectionStringBuilder
240  {
241  Server = serverAddress ?? "127.0.0.1",
242  UserID = username,
243  Password = password
244  };
245 
246  CreateTestConnection(csb.ConnectionString);
247  csb.Database = databaseName;
248  databaseConfiguration.ConnectionString = csb.ConnectionString;
249  }
250 
251  try
252  {
253  using (testConnection)
254  {
255  await console.WriteAsync("Testing connection...", true, cancellationToken).ConfigureAwait(false);
256  await testConnection.OpenAsync(cancellationToken).ConfigureAwait(false);
257  await console.WriteAsync("Connection successful!", true, cancellationToken).ConfigureAwait(false);
258 
259  if (databaseConfiguration.DatabaseType != DatabaseType.SqlServer)
260  {
261  await console.WriteAsync("Checking MySQL/MariaDB version...", true, cancellationToken).ConfigureAwait(false);
262  using (var command = testConnection.CreateCommand())
263  {
264  command.CommandText = "SELECT VERSION()";
265  var fullVersion = (string)await command.ExecuteScalarAsync(cancellationToken).ConfigureAwait(false);
266  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Found {0}", fullVersion), true, cancellationToken).ConfigureAwait(false);
267  var splits = fullVersion.Split('-');
268  databaseConfiguration.MySqlServerVersion = splits[0];
269  }
270  }
271 
272  if (!dbExists)
273  {
274  await console.WriteAsync("Testing create DB permission...", true, cancellationToken).ConfigureAwait(false);
275  using (var command = testConnection.CreateCommand())
276  {
277  // I really don't care about user sanitization here, they want to fuck their own DB? so be it
278 #pragma warning disable CA2100 // Review SQL queries for security vulnerabilities
279  command.CommandText = $"CREATE DATABASE {databaseName}";
280 #pragma warning restore CA2100 // Review SQL queries for security vulnerabilities
281  await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false);
282  }
283 
284  await console.WriteAsync("Success!", true, cancellationToken).ConfigureAwait(false);
285  await console.WriteAsync("Dropping test database...", true, cancellationToken).ConfigureAwait(false);
286  using (var command = testConnection.CreateCommand())
287  {
288 #pragma warning disable CA2100 // Review SQL queries for security vulnerabilities
289  command.CommandText = $"DROP DATABASE {databaseName}";
290 #pragma warning restore CA2100 // Review SQL queries for security vulnerabilities
291  try
292  {
293  await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false);
294  }
295  catch (OperationCanceledException)
296  {
297  throw;
298  }
299  catch (Exception e)
300  {
301  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
302  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
303  await console.WriteAsync("This should be okay, but you may want to manually drop the database before continuing!", true, cancellationToken).ConfigureAwait(false);
304  await console.WriteAsync("Press any key to continue...", true, cancellationToken).ConfigureAwait(false);
305  await console.PressAnyKeyAsync(cancellationToken).ConfigureAwait(false);
306  }
307  }
308  }
309  }
310 
311  return databaseConfiguration;
312  }
313  catch (OperationCanceledException)
314  {
315  throw;
316  }
317  catch (Exception e)
318  {
319  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
320  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
321  await console.WriteAsync("Retrying database configuration...", true, cancellationToken).ConfigureAwait(false);
322  }
323  }
324  while (true);
325  }
readonly IConsole console
The IConsole for the SetupWizard
Definition: SetupWizard.cs:31
+ +
string VersionPrefix
Prefix to VersionString
Definition: IApplication.cs:13
+
DbConnection CreateConnection(string connectionString, DatabaseType databaseType)
Create a DbConnection
+
readonly IApplication application
The IApplication for the SetupWizard
Definition: SetupWizard.cs:41
+
readonly IDBConnectionFactory dbConnectionFactory
The IDBConnectionFactory for the SetupWizard
Definition: SetupWizard.cs:46
+
async Task< bool > PromptYesNo(string question, CancellationToken cancellationToken)
A prompt for a yes or no value
Definition: SetupWizard.cs:99
+
Task< string > ReadLineAsync(bool usePasswordChar, CancellationToken cancellationToken)
Read a line from the IConsole
+
bool IsWindows
If the current platform is a Windows platform
+
Task WriteAsync(string text, bool newLine, CancellationToken cancellationToken)
Write some text to the IConsole
+
Configuration options for the Models.DatabaseContext<TParentContext>
+
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the SetupWizard
Definition: SetupWizard.cs:51
+
DatabaseType
Type of database to user
Definition: DatabaseType.cs:6
+
Task PressAnyKeyAsync(CancellationToken cancellationToken)
Wait for a key press on the IConsole
+
+

References Tgstation.Server.Host.Core.SetupWizard.application, Tgstation.Server.Host.Core.SetupWizard.console, Tgstation.Server.Host.Core.IDBConnectionFactory.CreateConnection(), Tgstation.Server.Host.Core.SetupWizard.dbConnectionFactory, Tgstation.Server.Host.Core.IPlatformIdentifier.IsWindows, Tgstation.Server.Host.Core.SetupWizard.platformIdentifier, Tgstation.Server.Host.IO.IConsole.PressAnyKeyAsync(), Tgstation.Server.Host.Core.SetupWizard.PromptYesNo(), Tgstation.Server.Host.IO.IConsole.ReadLineAsync(), Tgstation.Server.Host.Core.IApplication.VersionPrefix, and Tgstation.Server.Host.IO.IConsole.WriteAsync().

+ +

Referenced by Tgstation.Server.Host.Core.SetupWizard.RunWizard().

+ +
+
+ +

◆ ConfigureGeneral()

+ +
+
+ + + + + +
+ + + + + + + + +
async Task<GeneralConfiguration> Tgstation.Server.Host.Core.SetupWizard.ConfigureGeneral (CancellationToken cancellationToken)
+
+private
+
+ +

Prompts the user to create a GeneralConfiguration

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the new GeneralConfiguration
+ +

Definition at line 332 of file SetupWizard.cs.

+
333  {
334  var newGeneralConfiguration = new GeneralConfiguration
335  {
337  };
338 
339  do
340  {
341  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
342  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Minimum database user password length (leave blank for default of {0}): ", newGeneralConfiguration.MinimumPasswordLength), false, cancellationToken).ConfigureAwait(false);
343  var passwordLengthString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
344  if (String.IsNullOrWhiteSpace(passwordLengthString))
345  break;
346  if (UInt32.TryParse(passwordLengthString, out var passwordLength) && passwordLength >= 0)
347  {
348  newGeneralConfiguration.MinimumPasswordLength = passwordLength;
349  break;
350  }
351 
352  await console.WriteAsync("Please enter a positive integer!", true, cancellationToken).ConfigureAwait(false);
353  }
354  while (true);
355 
356  do
357  {
358  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
359  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);
360  var topicTimeoutString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
361  if (String.IsNullOrWhiteSpace(topicTimeoutString))
362  break;
363  if (Int32.TryParse(topicTimeoutString, out var topicTimeout) && topicTimeout >= 0)
364  {
365  newGeneralConfiguration.ByondTopicTimeout = topicTimeout;
366  break;
367  }
368 
369  await console.WriteAsync("Please enter a positive integer!", true, cancellationToken).ConfigureAwait(false);
370  }
371  while (true);
372 
373  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
374  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);
375  await console.WriteAsync("GitHub personal access token: ", false, cancellationToken).ConfigureAwait(false);
376  newGeneralConfiguration.GitHubAccessToken = await console.ReadLineAsync(true, cancellationToken).ConfigureAwait(false);
377  if (String.IsNullOrWhiteSpace(newGeneralConfiguration.GitHubAccessToken))
378  newGeneralConfiguration.GitHubAccessToken = null;
379  return newGeneralConfiguration;
380  }
readonly IConsole console
The IConsole for the SetupWizard
Definition: SetupWizard.cs:31
+
SetupWizardMode
Determines if the Core.ISetupWizard will run
+
Task< string > ReadLineAsync(bool usePasswordChar, CancellationToken cancellationToken)
Read a line from the IConsole
+
Task WriteAsync(string text, bool newLine, CancellationToken cancellationToken)
Write some text to the IConsole
+ +
+

References Tgstation.Server.Host.Core.SetupWizard.console, Tgstation.Server.Host.IO.IConsole.ReadLineAsync(), and Tgstation.Server.Host.IO.IConsole.WriteAsync().

+ +

Referenced by Tgstation.Server.Host.Core.SetupWizard.RunWizard().

+ +
+
+ +

◆ ConfigureLogging()

+ +
+
+ + + + + +
+ + + + + + + + +
async Task<FileLoggingConfiguration> Tgstation.Server.Host.Core.SetupWizard.ConfigureLogging (CancellationToken cancellationToken)
+
+private
+
+ +

Prompts the user to create a FileLoggingConfiguration

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the new FileLoggingConfiguration
+ +

Definition at line 387 of file SetupWizard.cs.

+
388  {
389  var fileLoggingConfiguration = new FileLoggingConfiguration();
390  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
391  fileLoggingConfiguration.Disable = !await PromptYesNo("Enable file logging? (y/n): ", cancellationToken).ConfigureAwait(false);
392 
393  if (!fileLoggingConfiguration.Disable)
394  {
395  do
396  {
397  await console.WriteAsync("Log file directory path (leave blank for default): ", false, cancellationToken).ConfigureAwait(false);
398  fileLoggingConfiguration.Directory = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
399  if (String.IsNullOrWhiteSpace(fileLoggingConfiguration.Directory))
400  {
401  fileLoggingConfiguration.Directory = null;
402  break;
403  }
404 
405  // test a write of it
406  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
407  await console.WriteAsync("Testing directory access...", true, cancellationToken).ConfigureAwait(false);
408  try
409  {
410  await ioManager.CreateDirectory(fileLoggingConfiguration.Directory, cancellationToken).ConfigureAwait(false);
411  var testFile = ioManager.ConcatPath(fileLoggingConfiguration.Directory, String.Format(CultureInfo.InvariantCulture, "WizardAccesTest.{0}.deleteme", Guid.NewGuid()));
412  await ioManager.WriteAllBytes(testFile, Array.Empty<byte>(), cancellationToken).ConfigureAwait(false);
413  try
414  {
415  await ioManager.DeleteFile(testFile, cancellationToken).ConfigureAwait(false);
416  }
417  catch (OperationCanceledException)
418  {
419  throw;
420  }
421  catch (Exception e)
422  {
423  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Error deleting test log file: {0}", testFile), true, cancellationToken).ConfigureAwait(false);
424  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
425  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
426  }
427 
428  break;
429  }
430  catch (OperationCanceledException)
431  {
432  throw;
433  }
434  catch (Exception e)
435  {
436  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
437  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
438  await console.WriteAsync("Please verify the path is valid and you have access to it!", true, cancellationToken).ConfigureAwait(false);
439  }
440  }
441  while (true);
442 
443  async Task<LogLevel?> PromptLogLevel(string question)
444  {
445  do
446  {
447  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
448  await console.WriteAsync(question, true, cancellationToken).ConfigureAwait(false);
449  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);
450  var responseString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
451  if (String.IsNullOrWhiteSpace(responseString))
452  return null;
453  if (Enum.TryParse<LogLevel>(responseString, out var logLevel) && logLevel != LogLevel.None)
454  return logLevel;
455  await console.WriteAsync("Invalid log level!", true, cancellationToken).ConfigureAwait(false);
456  }
457  while (true);
458  }
459 
460  fileLoggingConfiguration.LogLevel = await PromptLogLevel(String.Format(CultureInfo.InvariantCulture, "Enter the level limit for normal logs (default {0}).", fileLoggingConfiguration.LogLevel)).ConfigureAwait(false) ?? fileLoggingConfiguration.LogLevel;
461  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;
462  }
463 
464  return fileLoggingConfiguration;
465  }
readonly IConsole console
The IConsole for the SetupWizard
Definition: SetupWizard.cs:31
+
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+
Task CreateDirectory(string path, CancellationToken cancellationToken)
Create a directory at path
+
readonly IIOManager ioManager
The IIOManager for the SetupWizard
Definition: SetupWizard.cs:26
+
async Task< bool > PromptYesNo(string question, CancellationToken cancellationToken)
A prompt for a yes or no value
Definition: SetupWizard.cs:99
+
Task< string > ReadLineAsync(bool usePasswordChar, CancellationToken cancellationToken)
Read a line from the IConsole
+ +
Task WriteAsync(string text, bool newLine, CancellationToken cancellationToken)
Write some text to the IConsole
+
Task DeleteFile(string path, CancellationToken cancellationToken)
Deletes a file at path
+
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
+

References Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.Core.SetupWizard.console, Tgstation.Server.Host.IO.IIOManager.CreateDirectory(), Tgstation.Server.Host.IO.IIOManager.DeleteFile(), Tgstation.Server.Host.Core.SetupWizard.ioManager, Tgstation.Server.Host.Core.SetupWizard.PromptYesNo(), Tgstation.Server.Host.IO.IConsole.ReadLineAsync(), Tgstation.Server.Host.IO.IIOManager.WriteAllBytes(), and Tgstation.Server.Host.IO.IConsole.WriteAsync().

+ +

Referenced by Tgstation.Server.Host.Core.SetupWizard.RunWizard().

+ +
+
+ +

◆ PromptForHostingPort()

+ +
+
+ + + + + +
+ + + + + + + + +
async Task<ushort?> Tgstation.Server.Host.Core.SetupWizard.PromptForHostingPort (CancellationToken cancellationToken)
+
+private
+
+ +

Prompts the user to enter the port to host TGS on

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task resulting in the hosting port, or null to use the default
+ +

Definition at line 120 of file SetupWizard.cs.

+
121  {
122  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
123  await console.WriteAsync("What port would you like to connect to TGS on?", true, cancellationToken).ConfigureAwait(false);
124  await console.WriteAsync("Note: If this is a docker container with the default port already mapped, use the default.", true, cancellationToken).ConfigureAwait(false);
125 
126  do
127  {
128  await console.WriteAsync("API Port (leave blank for default): ", false, cancellationToken).ConfigureAwait(false);
129  var portString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
130  if (String.IsNullOrWhiteSpace(portString))
131  return null;
132  if (UInt16.TryParse(portString, out var port) && port != 0)
133  return port;
134  await console.WriteAsync("Invalid port! Please enter a value between 1 and 65535", true, cancellationToken).ConfigureAwait(false);
135  }
136  while (true);
137  }
readonly IConsole console
The IConsole for the SetupWizard
Definition: SetupWizard.cs:31
+
Task< string > ReadLineAsync(bool usePasswordChar, CancellationToken cancellationToken)
Read a line from the IConsole
+
Task WriteAsync(string text, bool newLine, CancellationToken cancellationToken)
Write some text to the IConsole
+
+

References Tgstation.Server.Host.Core.SetupWizard.console, Tgstation.Server.Host.IO.IConsole.ReadLineAsync(), and Tgstation.Server.Host.IO.IConsole.WriteAsync().

+ +

Referenced by Tgstation.Server.Host.Core.SetupWizard.RunWizard().

+ +
+
+ +

◆ PromptYesNo()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
async Task<bool> Tgstation.Server.Host.Core.SetupWizard.PromptYesNo (string question,
CancellationToken cancellationToken 
)
+
+private
+
+ +

A prompt for a yes or no value

+
Parameters
+ + + +
questionThe question string
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task resulting in true if the user replied yes, false otherwise
+ +

Definition at line 99 of file SetupWizard.cs.

+
100  {
101  do
102  {
103  await console.WriteAsync(question, false, cancellationToken).ConfigureAwait(false);
104  var responseString = await console.ReadLineAsync(false, cancellationToken).ConfigureAwait(false);
105  var upperResponse = responseString.ToUpperInvariant();
106  if (upperResponse == "Y" || upperResponse == "YES")
107  return true;
108  else if (upperResponse == "N" || upperResponse == "NO")
109  return false;
110  await console.WriteAsync("Invalid response!", true, cancellationToken).ConfigureAwait(false);
111  }
112  while (true);
113  }
readonly IConsole console
The IConsole for the SetupWizard
Definition: SetupWizard.cs:31
+
Task< string > ReadLineAsync(bool usePasswordChar, CancellationToken cancellationToken)
Read a line from the IConsole
+
Task WriteAsync(string text, bool newLine, CancellationToken cancellationToken)
Write some text to the IConsole
+
+

References Tgstation.Server.Host.Core.SetupWizard.console, Tgstation.Server.Host.IO.IConsole.ReadLineAsync(), and Tgstation.Server.Host.IO.IConsole.WriteAsync().

+ +

Referenced by Tgstation.Server.Host.Core.SetupWizard.CheckRunWizard(), Tgstation.Server.Host.Core.SetupWizard.ConfigureControlPanel(), Tgstation.Server.Host.Core.SetupWizard.ConfigureDatabase(), and Tgstation.Server.Host.Core.SetupWizard.ConfigureLogging().

+ +
+
+ +

◆ RunWizard()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Core.SetupWizard.RunWizard (string userConfigFileName,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Runs the SetupWizard

+
Parameters
+ + + +
userConfigFileNameThe path to the settings json to build
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 565 of file SetupWizard.cs.

+
566  {
567  // welcome message
568  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
569  await console.WriteAsync("Welcome to tgstation-server 4!", true, cancellationToken).ConfigureAwait(false);
570  await console.WriteAsync("This wizard will help you configure your server.", true, cancellationToken).ConfigureAwait(false);
571 
572  var hostingPort = await PromptForHostingPort(cancellationToken).ConfigureAwait(false);
573 
574  var databaseConfiguration = await ConfigureDatabase(cancellationToken).ConfigureAwait(false);
575 
576  var newGeneralConfiguration = await ConfigureGeneral(cancellationToken).ConfigureAwait(false);
577 
578  var fileLoggingConfiguration = await ConfigureLogging(cancellationToken).ConfigureAwait(false);
579 
580  var controlPanelConfiguration = await ConfigureControlPanel(cancellationToken).ConfigureAwait(false);
581 
582  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
583 
584  await SaveConfiguration(userConfigFileName, hostingPort, databaseConfiguration, newGeneralConfiguration, fileLoggingConfiguration, controlPanelConfiguration, cancellationToken).ConfigureAwait(false);
585  }
readonly IConsole console
The IConsole for the SetupWizard
Definition: SetupWizard.cs:31
+
async Task< ControlPanelConfiguration > ConfigureControlPanel(CancellationToken cancellationToken)
Prompts the user to create a ControlPanelConfiguration
Definition: SetupWizard.cs:472
+
async Task< DatabaseConfiguration > ConfigureDatabase(CancellationToken cancellationToken)
Prompts the user to create a DatabaseConfiguration
Definition: SetupWizard.cs:144
+
Task WriteAsync(string text, bool newLine, CancellationToken cancellationToken)
Write some text to the IConsole
+
async Task< GeneralConfiguration > ConfigureGeneral(CancellationToken cancellationToken)
Prompts the user to create a GeneralConfiguration
Definition: SetupWizard.cs:332
+
async Task SaveConfiguration(string userConfigFileName, ushort? hostingPort, DatabaseConfiguration databaseConfiguration, GeneralConfiguration newGeneralConfiguration, FileLoggingConfiguration fileLoggingConfiguration, ControlPanelConfiguration controlPanelConfiguration, CancellationToken cancellationToken)
Saves a given Configuration set to userConfigFileName
Definition: SetupWizard.cs:505
+
async Task< ushort?> PromptForHostingPort(CancellationToken cancellationToken)
Prompts the user to enter the port to host TGS on
Definition: SetupWizard.cs:120
+
async Task< FileLoggingConfiguration > ConfigureLogging(CancellationToken cancellationToken)
Prompts the user to create a FileLoggingConfiguration
Definition: SetupWizard.cs:387
+
+

References Tgstation.Server.Host.Core.SetupWizard.ConfigureControlPanel(), Tgstation.Server.Host.Core.SetupWizard.ConfigureDatabase(), Tgstation.Server.Host.Core.SetupWizard.ConfigureGeneral(), Tgstation.Server.Host.Core.SetupWizard.ConfigureLogging(), Tgstation.Server.Host.Core.SetupWizard.console, Tgstation.Server.Host.Core.SetupWizard.PromptForHostingPort(), Tgstation.Server.Host.Core.SetupWizard.SaveConfiguration(), and Tgstation.Server.Host.IO.IConsole.WriteAsync().

+ +

Referenced by Tgstation.Server.Host.Core.SetupWizard.CheckRunWizard().

+ +
+
+ +

◆ SaveConfiguration()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Core.SetupWizard.SaveConfiguration (string userConfigFileName,
ushort? hostingPort,
DatabaseConfiguration databaseConfiguration,
GeneralConfiguration newGeneralConfiguration,
FileLoggingConfiguration fileLoggingConfiguration,
ControlPanelConfiguration controlPanelConfiguration,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Saves a given Configuration set to userConfigFileName

+
Parameters
+ + + + + + + + +
userConfigFileNameThe file to save the Configuration to
hostingPortThe hosting port to save
databaseConfigurationThe DatabaseConfiguration to save
newGeneralConfigurationThe GeneralConfiguration to save
fileLoggingConfigurationThe FileLoggingConfiguration to save
controlPanelConfigurationThe ControlPanelConfiguration to save
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 505 of file SetupWizard.cs.

+
506  {
507  await console.WriteAsync(String.Format(CultureInfo.InvariantCulture, "Configuration complete! Saving to {0}", userConfigFileName), true, cancellationToken).ConfigureAwait(false);
508 
509  var map = new Dictionary<string, object>()
510  {
511  { DatabaseConfiguration.Section, databaseConfiguration },
512  { GeneralConfiguration.Section, newGeneralConfiguration },
513  { FileLoggingConfiguration.Section, fileLoggingConfiguration },
514  { ControlPanelConfiguration.Section, controlPanelConfiguration }
515  };
516 
517  if (hostingPort.HasValue)
518  map.Add("Kestrel", new
519  {
520  EndPoints = new
521  {
522  Http = new
523  {
524  Url = String.Format(CultureInfo.InvariantCulture, "http://0.0.0.0:{0}", hostingPort)
525  }
526  }
527  });
528 
529  var json = JsonConvert.SerializeObject(map, Formatting.Indented);
530  var configBytes = Encoding.UTF8.GetBytes(json);
531 
532  try
533  {
534  await ioManager.WriteAllBytes(userConfigFileName, configBytes, cancellationToken).ConfigureAwait(false);
535  }
536  catch (OperationCanceledException)
537  {
538  throw;
539  }
540  catch (Exception e)
541  {
542  await console.WriteAsync(e.Message, true, cancellationToken).ConfigureAwait(false);
543  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
544  await console.WriteAsync("For your convienence, here's the json we tried to write out:", true, cancellationToken).ConfigureAwait(false);
545  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
546  await console.WriteAsync(json, true, cancellationToken).ConfigureAwait(false);
547  await console.WriteAsync(null, true, cancellationToken).ConfigureAwait(false);
548  await console.WriteAsync("Press any key to exit...", true, cancellationToken).ConfigureAwait(false);
549  await console.PressAnyKeyAsync(cancellationToken).ConfigureAwait(false);
550  throw new OperationCanceledException();
551  }
552 
553  await console.WriteAsync("Waiting for configuration changes to reload...", true, cancellationToken).ConfigureAwait(false);
554 
555  // we need to wait for the configuration's file system watcher to read and reload the changes
556  await asyncDelayer.Delay(TimeSpan.FromSeconds(5), cancellationToken).ConfigureAwait(false);
557  }
readonly IConsole console
The IConsole for the SetupWizard
Definition: SetupWizard.cs:31
+
Task WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content
+
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the GeneralConfiguration res...
+
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the DatabaseConfiguration re...
+
readonly IIOManager ioManager
The IIOManager for the SetupWizard
Definition: SetupWizard.cs:26
+
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the ControlPanelConfiguratio...
+
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+ + +
Task WriteAsync(string text, bool newLine, CancellationToken cancellationToken)
Write some text to the IConsole
+
Configuration options for the Models.DatabaseContext<TParentContext>
+ +
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the SetupWizard
Definition: SetupWizard.cs:56
+
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the FileLoggingConfiguration...
+
Task PressAnyKeyAsync(CancellationToken cancellationToken)
Wait for a key press on the IConsole
+
+

References Tgstation.Server.Host.Core.SetupWizard.asyncDelayer, Tgstation.Server.Host.Core.SetupWizard.console, Tgstation.Server.Host.Core.IAsyncDelayer.Delay(), Tgstation.Server.Host.Core.SetupWizard.ioManager, Tgstation.Server.Host.IO.IConsole.PressAnyKeyAsync(), Tgstation.Server.Host.Configuration.ControlPanelConfiguration.Section, Tgstation.Server.Host.Configuration.GeneralConfiguration.Section, Tgstation.Server.Host.Configuration.DatabaseConfiguration.Section, Tgstation.Server.Host.Configuration.FileLoggingConfiguration.Section, Tgstation.Server.Host.IO.IIOManager.WriteAllBytes(), and Tgstation.Server.Host.IO.IConsole.WriteAsync().

+ +

Referenced by Tgstation.Server.Host.Core.SetupWizard.RunWizard().

+ +
+
+

Member Data Documentation

+ +

◆ application

+ +
+
+ + + + + +
+ + + + +
readonly IApplication Tgstation.Server.Host.Core.SetupWizard.application
+
+private
+
+
+ +

◆ asyncDelayer

+ +
+
+ + + + + +
+ + + + +
readonly IAsyncDelayer Tgstation.Server.Host.Core.SetupWizard.asyncDelayer
+
+private
+
+
+ +

◆ console

+ + + +

◆ dbConnectionFactory

+ +
+
+ + + + + +
+ + + + +
readonly IDBConnectionFactory Tgstation.Server.Host.Core.SetupWizard.dbConnectionFactory
+
+private
+
+
+ +

◆ generalConfiguration

+ +
+
+ + + + + +
+ + + + +
readonly GeneralConfiguration Tgstation.Server.Host.Core.SetupWizard.generalConfiguration
+
+private
+
+ +

The GeneralConfiguration for the SetupWizard

+ +

Definition at line 66 of file SetupWizard.cs.

+ +

Referenced by Tgstation.Server.Host.Core.SetupWizard.CheckRunWizard(), and Tgstation.Server.Host.Core.SetupWizard.SetupWizard().

+ +
+
+ +

◆ hostingEnvironment

+ +
+
+ + + + + +
+ + + + +
readonly IHostingEnvironment Tgstation.Server.Host.Core.SetupWizard.hostingEnvironment
+
+private
+
+ +

The IHostingEnvironment for the SetupWizard

+ +

Definition at line 36 of file SetupWizard.cs.

+ +

Referenced by Tgstation.Server.Host.Core.SetupWizard.CheckRunWizard(), and Tgstation.Server.Host.Core.SetupWizard.SetupWizard().

+ +
+
+ +

◆ ioManager

+ +
+
+ + + + + +
+ + + + +
readonly IIOManager Tgstation.Server.Host.Core.SetupWizard.ioManager
+
+private
+
+
+ +

◆ logger

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<SetupWizard> Tgstation.Server.Host.Core.SetupWizard.logger
+
+private
+
+
+ +

◆ platformIdentifier

+ +
+
+ + + + + +
+ + + + +
readonly IPlatformIdentifier Tgstation.Server.Host.Core.SetupWizard.platformIdentifier
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.png b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.png new file mode 100644 index 0000000000000000000000000000000000000000..caf4c1605ea8ef93f9ce4f7a0c4d188d3b772c33 GIT binary patch literal 948 zcmeAS@N?(olHy`uVBq!ia0vp^Uw}A(gBeIl)~qlAQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;N4(Hmb>h%-mQ<@AHQg_X!sD{_t;`lr?ZR7G_x%o9xS;Tf)hDTU3mFRSn%_U^T(r2 zr>oEMRZ_BzJ^kwF)9-gK6rWn3AvWJTZQU!i$uG-RHj4>nmh|m+vu%%)IHe-o&jU0g zT=|8&$@&fR7MlKlmoT5(`$X=db@#tJ**{tM*=5_i#4~!nYklW`U$Nt{aqaZh?Pg8; z)Koj|Cb`IORycm5^=7W7Gv6-5mrd8DE=AlFU2C1U;p@XV%Z9M{FGsAH^h}i|MO}Rw zw(Hn~j%^;=8TBFRyVjk%b9Chz-UYpX-@M@16*AdUFTdo%-Vf&&ZY{lOv|X-uVeyPv zb9@#oe;R9;3)urhi-YZ=n+3>rs~!-?x?JKQ25zVc&N5yE|^})y{Z(ugXdN^6CCf z9VggdeZRYQVfg%V!HN8r?>j%ABqaD#t%`X|#|i)IZDN9*3wU*vgdF)_JhtddVEWYH-$A$QK#+AxW_A?#_wzu57E3MFGX5s*hg9eUU7Z?P$EM!#5aAtP7(8kuWfR|Um zQCdo&2~EMjxj|lG|Zc%(B0hN9R83KK~_F?A{fYU$fK~@^jXnX_8SE&)mM0$MVIoCFh-zR}}lb?v~Dx z-4Wim@T&ON6@3lfyc43XiiU%u%kTK}5~tT)XYS5Ac7@}X%tTpP$LUQ*>d$)lc1>@z zEV+8;%N)^?eJg#Po?W>7Y2BQySMwHBuU!@0yxHe^`1x9&H5)&k_P+4i`fhuf!Q4;t z?!H{N@S`O#s_KDJH9v5T_^$Go>(jfp+`T=0LH4d|llUtAw^U0nw{APLd;Y${t<~Wd zZtcBVV-JifqXWxd`q$(x2#>F5@V^wjpxBeKhJ7!))PweHSXe*bZo70!(o6AVOQRRN TH~Sm}W-$g&S3j3^P6 + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.TaskExtensions Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.TaskExtensions, including all inherited members.

+ + + +
WithToken(this Task task, CancellationToken cancellationToken)Tgstation.Server.Host.Core.TaskExtensionsstatic
WithToken< T >(this Task< T > task, CancellationToken cancellationToken)Tgstation.Server.Host.Core.TaskExtensionsstatic
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_task_extensions.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_task_extensions.html new file mode 100644 index 0000000000..371c90ab48 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_task_extensions.html @@ -0,0 +1,208 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.TaskExtensions Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.TaskExtensions Class Reference
+
+
+ +

Extensions for the Task class. + More...

+ + + + + + + + +

+Static Public Member Functions

static Task WithToken (this Task task, CancellationToken cancellationToken)
 Create a Task that can be awaited while respecting a given cancellationToken . More...
 
static async Task< T > WithToken< T > (this Task< T > task, CancellationToken cancellationToken)
 Create a Task<TResult> that can be awaited while respecting a given cancellationToken . More...
 
+

Detailed Description

+

Extensions for the Task class.

+ +

Definition at line 10 of file TaskExtensions.cs.

+

Member Function Documentation

+ +

◆ WithToken()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static Task Tgstation.Server.Host.Core.TaskExtensions.WithToken (this Task task,
CancellationToken cancellationToken 
)
+
+static
+
+ +

Create a Task that can be awaited while respecting a given cancellationToken .

+
Parameters
+ + + +
taskThe Task to add cancel support to.
cancellationTokenThe CancellationToken for the operation.
+
+
+
Returns
A Task representing the running operation.
+ +

Definition at line 18 of file TaskExtensions.cs.

+
19  {
20  if (task == null)
21  throw new ArgumentNullException(nameof(task));
22 
23  async Task<object> Wrap()
24  {
25  await task.ConfigureAwait(false);
26  return null;
27  }
28 
29  return Wrap().WithToken(cancellationToken);
30  }
+
+
+ +

◆ WithToken< T >()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static async Task<T> Tgstation.Server.Host.Core.TaskExtensions.WithToken< T > (this Task< T > task,
CancellationToken cancellationToken 
)
+
+static
+
+ +

Create a Task<TResult> that can be awaited while respecting a given cancellationToken .

+
Template Parameters
+ + +
TThe result Type of the task .
+
+
+
Parameters
+ + + +
taskThe Task<TResult> to add cancel support to.
cancellationTokenThe CancellationToken for the operation.
+
+
+
Returns
A Task<TResult> resulting in the result of task .
+ +

Definition at line 39 of file TaskExtensions.cs.

+
40  {
41  if (task == null)
42  throw new ArgumentNullException(nameof(task));
43 
44  var cancelTcs = new TaskCompletionSource<object>();
45  using (cancellationToken.Register(() => cancelTcs.SetCanceled()))
46  await Task.WhenAny(task, cancelTcs.Task).ConfigureAwait(false);
47  cancellationToken.ThrowIfCancellationRequested();
48 
49  return await task.ConfigureAwait(false);
50  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application-members.html new file mode 100644 index 0000000000..0d057a58e3 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.Tests.TestApplication Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application.html new file mode 100644 index 0000000000..25ffe61b9c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application.html @@ -0,0 +1,154 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.Tests.TestApplication Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.Tests.TestApplication Class Reference
+
+
+ +

Tests for Application + More...

+ + + + + + +

+Classes

class  MockApplicationLifetime
 
class  MockSetupWizard
 
+ + + + + +

+Public Member Functions

void TestMethodThrows ()
 
void TestConfigureServicesThrowsWhenSetupWizardConfigurationDemands ()
 
+

Detailed Description

+

Tests for Application

+ +

Definition at line 21 of file TestApplication.cs.

+

Member Function Documentation

+ +

◆ TestConfigureServicesThrowsWhenSetupWizardConfigurationDemands()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Tests.TestApplication.TestConfigureServicesThrowsWhenSetupWizardConfigurationDemands ()
+
+ +

Definition at line 69 of file TestApplication.cs.

+
70  {
71  var mockConfiguration = new Mock<IConfiguration>();
72  Assert.ThrowsException<ArgumentNullException>(() => new Application(mockConfiguration.Object, null));
73 
74  var mockHostingEnvironment = new Mock<IHostingEnvironment>();
75 
76  var app = new Application(mockConfiguration.Object, mockHostingEnvironment.Object);
77 
78  var mockOptions = new Mock<IOptions<GeneralConfiguration>>();
79  mockOptions.SetupGet(x => x.Value).Returns(new GeneralConfiguration
80  {
82  }).Verifiable();
83 
84  var fakeServiceDescriptor = new List<ServiceDescriptor>()
85  {
86  new ServiceDescriptor(typeof(IApplicationLifetime), typeof(MockApplicationLifetime), ServiceLifetime.Singleton),
87  new ServiceDescriptor(typeof(ISetupWizard), typeof(MockSetupWizard), ServiceLifetime.Singleton),
88  new ServiceDescriptor(typeof(IOptions<GeneralConfiguration>), mockOptions.Object)
89  };
90 
91  var mockServiceCollection = new Mock<IServiceCollection>();
92 
93  var mockConfigSection = new Mock<IConfigurationSection>();
94 
95  mockConfiguration.Setup(x => x.GetSection(It.IsNotNull<string>())).Returns(mockConfigSection.Object).Verifiable();
96  mockServiceCollection.Setup(x => x.GetEnumerator()).Returns(() => fakeServiceDescriptor.GetEnumerator()).Verifiable();
97 
98  Assert.ThrowsException<OperationCanceledException>(() => app.ConfigureServices(mockServiceCollection.Object));
99 
100  mockOptions.VerifyAll();
101  mockConfiguration.VerifyAll();
102  mockServiceCollection.VerifyAll();
103  }
SetupWizardMode
Determines if the Core.ISetupWizard will run
+ + +
+
+
+ +

◆ TestMethodThrows()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Tests.TestApplication.TestMethodThrows ()
+
+ +

Definition at line 24 of file TestApplication.cs.

+
25  {
26  Assert.ThrowsException<ArgumentNullException>(() => new Application(null, null));
27  var mockConfiguration = new Mock<IConfiguration>();
28  Assert.ThrowsException<ArgumentNullException>(() => new Application(mockConfiguration.Object, null));
29 
30  var mockHostingEnvironment = new Mock<IHostingEnvironment>();
31 
32  var app = new Application(mockConfiguration.Object, mockHostingEnvironment.Object);
33 
34  Assert.ThrowsException<ArgumentNullException>(() => app.ConfigureServices(null));
35  Assert.ThrowsException<ArgumentNullException>(() => app.Configure(null, null, null, null, null));
36 
37  var mockAppBuilder = new Mock<IApplicationBuilder>();
38  Assert.ThrowsException<ArgumentNullException>(() => app.Configure(mockAppBuilder.Object, null, null, null, null));
39 
40  var mockServerControl = new Mock<IServerControl>();
41  Assert.ThrowsException<ArgumentNullException>(() => app.Configure(mockAppBuilder.Object, mockServerControl.Object, null, null, null));
42 
43  var mockTokenFactory = new Mock<ITokenFactory>();
44  Assert.ThrowsException<ArgumentNullException>(() => app.Configure(mockAppBuilder.Object, mockServerControl.Object, mockTokenFactory.Object, null, null));
45 
46  var mockControlPanelOptions = new Mock<IOptions<ControlPanelConfiguration>>();
47  mockControlPanelOptions.SetupGet(x => x.Value).Returns(new ControlPanelConfiguration()).Verifiable();
48  Assert.ThrowsException<ArgumentNullException>(() => app.Configure(mockAppBuilder.Object, mockServerControl.Object, mockTokenFactory.Object, mockControlPanelOptions.Object, null));
49  mockControlPanelOptions.VerifyAll();
50  }
+
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime-members.html new file mode 100644 index 0000000000..ac8911bef8 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime-members.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.Tests.TestApplication.MockApplicationLifetime Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime.html new file mode 100644 index 0000000000..866aa86c50 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime.html @@ -0,0 +1,185 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.Tests.TestApplication.MockApplicationLifetime Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.Tests.TestApplication.MockApplicationLifetime Class Reference
+
+
+
+Inheritance diagram for Tgstation.Server.Host.Core.Tests.TestApplication.MockApplicationLifetime:
+
+
+ + +IApplicationLifetime + +
+ + + + +

+Public Member Functions

void StopApplication ()
 
+ + + + + + + +

+Public Attributes

CancellationToken ApplicationStarted => default
 
CancellationToken ApplicationStopping => default
 
CancellationToken ApplicationStopped => default
 
+

Detailed Description

+
+

Definition at line 57 of file TestApplication.cs.

+

Member Function Documentation

+ +

◆ StopApplication()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Tests.TestApplication.MockApplicationLifetime.StopApplication ()
+
+ +

Definition at line 65 of file TestApplication.cs.

+
65 { }
+
+
+

Member Data Documentation

+ +

◆ ApplicationStarted

+ +
+
+ + + + +
CancellationToken Tgstation.Server.Host.Core.Tests.TestApplication.MockApplicationLifetime.ApplicationStarted => default
+
+ +

Definition at line 59 of file TestApplication.cs.

+ +
+
+ +

◆ ApplicationStopped

+ +
+
+ + + + +
CancellationToken Tgstation.Server.Host.Core.Tests.TestApplication.MockApplicationLifetime.ApplicationStopped => default
+
+ +

Definition at line 63 of file TestApplication.cs.

+ +
+
+ +

◆ ApplicationStopping

+ +
+
+ + + + +
CancellationToken Tgstation.Server.Host.Core.Tests.TestApplication.MockApplicationLifetime.ApplicationStopping => default
+
+ +

Definition at line 61 of file TestApplication.cs.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime.png b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime.png new file mode 100644 index 0000000000000000000000000000000000000000..a1a9f89d294912bff0466bb39b90abce55f143a6 GIT binary patch literal 1114 zcmeAS@N?(olHy`uVBq!ia0y~yU|a`e2XHV0$+9Dfr9es|z$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opI?{&23^;)2*k6gkZN8I`K;@F$Re_rfw^IG=k@QO-h&-dNtvEo^6pEH(z z2)h2IRb{VXT*=-4^Ill3`qQ{>WfHG3|IG{S>yl;7JM#riZoi0Po1wDT@?J^p=Qmv` z8lL~PlS`(~i3mi($`)ucG@H=73lQn}MtvAWKGY69X_< zXp29r+!f@d>7l90KY@X%;k$YX;|@h6yzrIRaruOG|2}`aANBgDa)ann`2%rpzi(Tp zzW8=n#MWK2&RrGBe)y`n+x-5Eg(7$4Yky2%oxAvTO!5WRf=7Y>()WGaHP38|^xbub zjA~Uw_mO8Y-2{?n@W-rSD7o*NPRHF@{8+kwA!eBXHc!HTo8p>2x-!)pVh z<=u1lZTfg=(t!^zFLQ1EZS?G$1pB7Bi!P?xXBd76;@92fwQ^-d-rlLL>o&1`Q@W@h zoH(P0Gs8M+vu^a!;K{{FGo@x7(mz;|t99mW?3rGd{mV43{oVfKK-tg3a=-qZ&4~8C zdfQ~i)tdGryI$Sp@;=b=*HT7bJl1E|vh~*&OZTmR`r&%>EFWj1>qV_;vE6fjEtV_W z^(?o1?P-q{-Ze{CziFAKaEm4PqSCHqDH|?@Mj0$#oqKNK?v)qZ3%AbrtvPGUmTO;w z_$Px>)#hz{;k&k-EQm_8*4r)rT)6VmR{yroowwc0&*Y2NUCy&xdrnL6zsL1TwfpZM z%EZpD`G0tG_S$TTKT4AC&aF#z-d|Am)o*|0rk-FM{g3%yKO`CHERQ~^=B{#2dn?O! zj|kN}?CQZ6E9PDC|HZgBFC#1Q>&wYpY5h|cUYF!yzUf;yEBE~p+06A{43_NwcCKY} zX6hBwXR;0aNq)N+_Mg80K5^mek~D@I2KiN|S>z5J2POz$LMT^3N(7(;@o<^;(kV?- df{G5*zYmM9+)%`S0$30*c)I$ztaD0e0suEQBM1Nh literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_setup_wizard-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_setup_wizard-members.html new file mode 100644 index 0000000000..be9b93459b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_setup_wizard-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.Tests.TestApplication.MockSetupWizard Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.Tests.TestApplication.MockSetupWizard, including all inherited members.

+ + +
CheckRunWizard(CancellationToken cancellationToken)Tgstation.Server.Host.Core.Tests.TestApplication.MockSetupWizard
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_setup_wizard.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_setup_wizard.html new file mode 100644 index 0000000000..328a7a42e3 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_setup_wizard.html @@ -0,0 +1,137 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.Tests.TestApplication.MockSetupWizard Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.Tests.TestApplication.MockSetupWizard Class Reference
+
+
+
+Inheritance diagram for Tgstation.Server.Host.Core.Tests.TestApplication.MockSetupWizard:
+
+
+ + +Tgstation.Server.Host.Core.ISetupWizard + +
+ + + + + +

+Public Member Functions

Task< bool > CheckRunWizard (CancellationToken cancellationToken)
 Run the setup wizard if necessary More...
 
+

Detailed Description

+
+

Definition at line 52 of file TestApplication.cs.

+

Member Function Documentation

+ +

◆ CheckRunWizard()

+ +
+
+ + + + + + + + +
Task<bool> Tgstation.Server.Host.Core.Tests.TestApplication.MockSetupWizard.CheckRunWizard (CancellationToken cancellationToken)
+
+ +

Run the setup wizard if necessary

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in true if the wizard ran, false otherwise
+ +

Implements Tgstation.Server.Host.Core.ISetupWizard.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_setup_wizard.png b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_setup_wizard.png new file mode 100644 index 0000000000000000000000000000000000000000..d0a42203b263827f05241f1c3b428b7a0ccc8395 GIT binary patch literal 1292 zcmeAS@N?(olHy`uVBq!ia0y~yVC)9612~w0&oTRMIdEeW5x?sx6- zde2MyFT9SNk$wF~?8Xe;gDwm6N_4_b?n=KHpM87v8u#luT6;A^RbH}xwcl{#+X}_D zZK;xCtFKqybS*12+<$jn#N55F`Q=YP`dPg(?P1cM7lFIKCuN?PZ@lJ(zC-msou-G9 zugxbfnSX^lvgYS)=@W}pYgDUVTX)+PnK6rhNId1fJkK!y%cX$-Hu9xGJN`e5|9b7@ zxvhU&&adod>{6+1x%c`VcjTTGtGzC*{*oPeWuJnl{G$7(ohAiM`eKV35tCX~j$Y_J zS}5cG%A)V_U8Wy3e;GX(_r#uLQfT@2$5VnqaEcCt(~CBxLL zSRH_I+92U2#sG{`h9r$hh9e*a3sb0~V1J9N=F%lznor*@Vpzg(Zwzjs_5${S%=^JD7w1x^zTq_H7N$aKGp+E ze*gKN@Fvp6bj#UwVNt_5=SzwZ2dE_*ZX;)V^+-E zf0M#>&i%gWxR8JIfy!Hl-e_&|vlN@`dA!8TM8vN#F-NTDo8CLOh5Zk^Om}qi^8T*a zWcsjnrc<&|*1<*hH?U_t-Lo{X!7;gT+qAmEBQck(#fsVEcJD9CI>2$X=V4d2*tYDO z96Ci8O}Vd6Y4?uXVDK&b&$@^$w~UWp?d?0NrTtCk&E|;Nha(?5U(6LN(O(zwW_^VA zgITS;2aLtmPX5Q*o!c*!l(9b5IP;^G{^`wEeU-zigbb#s8d7PR<;0omZRh zY5iS2EARi-eVbn>r(fOKz#n|Cch}K97rmXETd!VI=k{Tmv+laIg?m}JOx|t&%!wtF z`IrCdWbWRzYOnoW@6(62GdIL9*(lDmC#=5y%88^`ml^gu%s;Vcn&N@{OYWN(JQ)AH n$4F_?-9cWSQ-etzFJD8abP0l+XkK6E$JX literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_async_delayer-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_async_delayer-members.html new file mode 100644 index 0000000000..a252bc4435 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_async_delayer-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.Tests.TestAsyncDelayer Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_async_delayer.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_async_delayer.html new file mode 100644 index 0000000000..e4eb60a5c5 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_async_delayer.html @@ -0,0 +1,138 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.Tests.TestAsyncDelayer Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.Tests.TestAsyncDelayer Class Reference
+
+
+ + + + + + +

+Public Member Functions

async Task TestDelay ()
 
async Task TestCancel ()
 
+

Detailed Description

+
+

Definition at line 9 of file TestAsyncDelayer.cs.

+

Member Function Documentation

+ +

◆ TestCancel()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.Core.Tests.TestAsyncDelayer.TestCancel ()
+
+ +

Definition at line 22 of file TestAsyncDelayer.cs.

+
23  {
24  var delayer = new AsyncDelayer();
25  using (var cts = new CancellationTokenSource())
26  {
27  cts.Cancel();
28  await Assert.ThrowsExceptionAsync<TaskCanceledException>(() => delayer.Delay(TimeSpan.FromSeconds(1), cts.Token)).ConfigureAwait(false);
29  }
30  }
+
+
+ +

◆ TestDelay()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.Core.Tests.TestAsyncDelayer.TestDelay ()
+
+ +

Definition at line 12 of file TestAsyncDelayer.cs.

+
13  {
14  var delayer = new AsyncDelayer();
15  var startDelay = delayer.Delay(TimeSpan.FromSeconds(1), default);
16  var checkDelay = Task.Delay(TimeSpan.FromSeconds(1) - TimeSpan.FromMilliseconds(10), default);
17  await startDelay.ConfigureAwait(false);
18  Assert.IsTrue(checkDelay.IsCompleted);
19  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_d_b_connection_factory-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_d_b_connection_factory-members.html new file mode 100644 index 0000000000..6d3c353e01 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_d_b_connection_factory-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.Tests.TestDBConnectionFactory Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_d_b_connection_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_d_b_connection_factory.html new file mode 100644 index 0000000000..c2fd4eab1a --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_d_b_connection_factory.html @@ -0,0 +1,140 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.Tests.TestDBConnectionFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.Tests.TestDBConnectionFactory Class Reference
+
+
+ + + + + + +

+Public Member Functions

void TestBadParameters ()
 
void TestWorks ()
 
+

Detailed Description

+
+

Definition at line 10 of file TestDBConnectionFactory.cs.

+

Member Function Documentation

+ +

◆ TestBadParameters()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Tests.TestDBConnectionFactory.TestBadParameters ()
+
+ +

Definition at line 13 of file TestDBConnectionFactory.cs.

+
14  {
15  var factory = new DBConnectionFactory();
16  Assert.ThrowsException<ArgumentNullException>(() => factory.CreateConnection(null, default));
17  Assert.ThrowsException<ArgumentOutOfRangeException>(() => factory.CreateConnection(String.Empty, (DatabaseType)42));
18  }
DatabaseType
Type of database to user
Definition: DatabaseType.cs:6
+
+
+
+ +

◆ TestWorks()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Tests.TestDBConnectionFactory.TestWorks ()
+
+ +

Definition at line 21 of file TestDBConnectionFactory.cs.

+
22  {
23  var factory = new DBConnectionFactory();
24  Assert.IsInstanceOfType(factory.CreateConnection(String.Empty, DatabaseType.MariaDB), typeof(MySqlConnection));
25  Assert.IsInstanceOfType(factory.CreateConnection(String.Empty, DatabaseType.MySql), typeof(MySqlConnection));
26  Assert.IsInstanceOfType(factory.CreateConnection(String.Empty, DatabaseType.SqlServer), typeof(SqlConnection));
27  }
DatabaseType
Type of database to user
Definition: DatabaseType.cs:6
+
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_database_context_factory-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_database_context_factory-members.html new file mode 100644 index 0000000000..42f87d86d2 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_database_context_factory-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.Tests.TestDatabaseContextFactory Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_database_context_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_database_context_factory.html new file mode 100644 index 0000000000..5463517174 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_database_context_factory.html @@ -0,0 +1,140 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.Tests.TestDatabaseContextFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.Tests.TestDatabaseContextFactory Class Reference
+
+
+ + + + + + +

+Public Member Functions

void TestConstructionThrows ()
 
async Task TestWorks ()
 
+

Detailed Description

+
+

Definition at line 11 of file TestDatabaseContextFactory.cs.

+

Member Function Documentation

+ +

◆ TestConstructionThrows()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Tests.TestDatabaseContextFactory.TestConstructionThrows ()
+
+ +

Definition at line 14 of file TestDatabaseContextFactory.cs.

+
15  {
16  Assert.ThrowsException<ArgumentNullException>(() => new DatabaseContextFactory(null));
17  var mockProvider = new Mock<IServiceProvider>();
18  mockProvider.Setup(x => x.GetService(typeof(IDatabaseContext))).Verifiable();
19  var mockScope = new Mock<IServiceScope>();
20  mockScope.SetupGet(x => x.ServiceProvider).Returns(mockProvider.Object).Verifiable();
21  var mockScopeFactory = new Mock<IServiceScopeFactory>();
22  mockScopeFactory.Setup(x => x.CreateScope()).Returns(mockScope.Object).Verifiable();
23  Assert.ThrowsException<InvalidOperationException>(() => new DatabaseContextFactory(mockScopeFactory.Object));
24  mockScopeFactory.VerifyAll();
25  mockScope.VerifyAll();
26  mockProvider.VerifyAll();
27  }
+
+
+
+ +

◆ TestWorks()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.Core.Tests.TestDatabaseContextFactory.TestWorks ()
+
+ +

Definition at line 30 of file TestDatabaseContextFactory.cs.

+
31  {
32  var mockDatabase = new Mock<IDatabaseContext>();
33  var mockProvider = new Mock<IServiceProvider>();
34  var mockDbo = mockDatabase.Object;
35  mockProvider.Setup(x => x.GetService(typeof(IDatabaseContext))).Returns(mockDbo).Verifiable();
36  var mockScope = new Mock<IServiceScope>();
37  mockScope.SetupGet(x => x.ServiceProvider).Returns(mockProvider.Object).Verifiable();
38  var mockScopeFactory = new Mock<IServiceScopeFactory>();
39  mockScopeFactory.Setup(x => x.CreateScope()).Returns(mockScope.Object).Verifiable();
40 
41  var factory = new DatabaseContextFactory(mockScopeFactory.Object);
42 
43  await Assert.ThrowsExceptionAsync<ArgumentNullException>(() => factory.UseContext(null)).ConfigureAwait(false);
44 
45  await factory.UseContext(context =>
46  {
47  Assert.AreSame(mockDbo, context);
48  return Task.CompletedTask;
49  });
50 
51  mockScopeFactory.VerifyAll();
52  mockScope.VerifyAll();
53  mockProvider.VerifyAll();
54  }
+
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_git_hub_client_factory-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_git_hub_client_factory-members.html new file mode 100644 index 0000000000..a3d5f597a7 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_git_hub_client_factory-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.Tests.TestGitHubClientFactory Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_git_hub_client_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_git_hub_client_factory.html new file mode 100644 index 0000000000..78b6f88f30 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_git_hub_client_factory.html @@ -0,0 +1,157 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.Tests.TestGitHubClientFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.Tests.TestGitHubClientFactory Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

void TestContruction ()
 
async Task TestCreateBasicClient ()
 
async Task TestCreateTokenClient ()
 
+

Detailed Description

+
+

Definition at line 10 of file TestGitHubClientFactory.cs.

+

Member Function Documentation

+ +

◆ TestContruction()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Tests.TestGitHubClientFactory.TestContruction ()
+
+ +
+
+ +

◆ TestCreateBasicClient()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.Core.Tests.TestGitHubClientFactory.TestCreateBasicClient ()
+
+ +

Definition at line 16 of file TestGitHubClientFactory.cs.

+
17  {
18  var mockApp = new Mock<IApplication>();
19  mockApp.SetupGet(x => x.Version).Returns(new Version()).Verifiable();
20  mockApp.SetupGet(x => x.VersionPrefix).Returns("TGSTests").Verifiable();
21 
22  var factory = new GitHubClientFactory(mockApp.Object);
23 
24  var client = factory.CreateClient();
25  Assert.IsNotNull(client);
26  var credentials = await client.Connection.CredentialStore.GetCredentials().ConfigureAwait(false);
27 
28  Assert.AreEqual(AuthenticationType.Anonymous, credentials.AuthenticationType);
29 
30 
31  mockApp.VerifyAll();
32  }
+
+
+ +

◆ TestCreateTokenClient()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.Core.Tests.TestGitHubClientFactory.TestCreateTokenClient ()
+
+ +

Definition at line 35 of file TestGitHubClientFactory.cs.

+
36  {
37  var mockApp = new Mock<IApplication>();
38  mockApp.SetupGet(x => x.Version).Returns(new Version()).Verifiable();
39  mockApp.SetupGet(x => x.VersionPrefix).Returns("TGSTests").Verifiable();
40 
41  var factory = new GitHubClientFactory(mockApp.Object);
42 
43  Assert.ThrowsException<ArgumentNullException>(() => factory.CreateClient(null));
44 
45  var client = factory.CreateClient("asdf");
46  Assert.IsNotNull(client);
47 
48  var credentials = await client.Connection.CredentialStore.GetCredentials().ConfigureAwait(false);
49 
50  Assert.AreEqual(AuthenticationType.Oauth, credentials.AuthenticationType);
51 
52  mockApp.VerifyAll();
53  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_exception-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_exception-members.html new file mode 100644 index 0000000000..349ebadeac --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_exception-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.Tests.TestJobException Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.Tests.TestJobException, including all inherited members.

+ + +
TestConstruction()Tgstation.Server.Host.Core.Tests.TestJobException
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_exception.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_exception.html new file mode 100644 index 0000000000..f6f1d3a37f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_exception.html @@ -0,0 +1,117 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.Tests.TestJobException Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.Tests.TestJobException Class Reference
+
+
+ + + + +

+Public Member Functions

void TestConstruction ()
 
+

Detailed Description

+
+

Definition at line 7 of file TestJobException.cs.

+

Member Function Documentation

+ +

◆ TestConstruction()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Tests.TestJobException.TestConstruction ()
+
+ +

Definition at line 10 of file TestJobException.cs.

+
11  {
12  new JobException();
13  new JobException("Message");
14  new JobException("Message", new Exception());
15  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler-members.html new file mode 100644 index 0000000000..4eb39bf648 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler-members.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.Tests.TestJobHandler Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html new file mode 100644 index 0000000000..9b778ee6ac --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html @@ -0,0 +1,301 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.Tests.TestJobHandler Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.Tests.TestJobHandler Class Reference
+
+
+ + + + + + + + + + +

+Public Member Functions

void TestConstructionAndDisposal ()
 
async Task TestWait ()
 
void TestProgress ()
 
async Task TestCancellation ()
 
+ + + +

+Private Member Functions

async Task TestJob (CancellationToken cancellationToken)
 
+ + + + + +

+Private Attributes

Task currentWaitTask
 
bool cancelled
 
+

Detailed Description

+
+

Definition at line 9 of file TestJobHandler.cs.

+

Member Function Documentation

+ +

◆ TestCancellation()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.Core.Tests.TestJobHandler.TestCancellation ()
+
+ +

Definition at line 66 of file TestJobHandler.cs.

+
67  {
68  var tcs = new TaskCompletionSource<object>();
69  currentWaitTask = tcs.Task;
70  cancelled = false;
71  using(var handler = new JobHandler(TestJob))
72  {
73  handler.Cancel();
74  tcs.SetResult(null);
75  await handler.Wait(default).ConfigureAwait(false);
76  }
77  Assert.IsTrue(cancelled);
78  }
+ +
async Task TestJob(CancellationToken cancellationToken)
+
+

References Tgstation.Server.Host.Core.Tests.TestJobHandler.cancelled, Tgstation.Server.Host.Core.Tests.TestJobHandler.currentWaitTask, and Tgstation.Server.Host.Core.Tests.TestJobHandler.TestJob().

+ +
+
+ +

◆ TestConstructionAndDisposal()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Tests.TestJobHandler.TestConstructionAndDisposal ()
+
+ +

Definition at line 21 of file TestJobHandler.cs.

+
22  {
23  cancelled = false;
24  Assert.ThrowsException<ArgumentNullException>(() => new JobHandler(null));
25 
26  currentWaitTask = Task.CompletedTask;
27  new JobHandler(TestJob).Dispose();
28  Assert.IsFalse(cancelled);
29  }
+ +
async Task TestJob(CancellationToken cancellationToken)
+
+

References Tgstation.Server.Host.Core.Tests.TestJobHandler.cancelled, Tgstation.Server.Host.Core.Tests.TestJobHandler.currentWaitTask, Tgstation.Server.Host.Core.JobHandler.Dispose(), and Tgstation.Server.Host.Core.Tests.TestJobHandler.TestJob().

+ +
+
+ +

◆ TestJob()

+ +
+
+ + + + + +
+ + + + + + + + +
async Task Tgstation.Server.Host.Core.Tests.TestJobHandler.TestJob (CancellationToken cancellationToken)
+
+private
+
+
+ +

◆ TestProgress()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Tests.TestJobHandler.TestProgress ()
+
+ +

Definition at line 52 of file TestJobHandler.cs.

+
53  {
54  currentWaitTask = Task.CompletedTask;
55  cancelled = false;
56  using (var handler = new JobHandler(TestJob))
57  {
58  Assert.IsFalse(handler.Progress.HasValue);
59  handler.Progress = 42;
60  Assert.AreEqual(42, handler.Progress);
61  }
62  Assert.IsFalse(cancelled);
63  }
+ +
async Task TestJob(CancellationToken cancellationToken)
+
+

References Tgstation.Server.Host.Core.Tests.TestJobHandler.cancelled, Tgstation.Server.Host.Core.Tests.TestJobHandler.currentWaitTask, and Tgstation.Server.Host.Core.Tests.TestJobHandler.TestJob().

+ +
+
+ +

◆ TestWait()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.Core.Tests.TestJobHandler.TestWait ()
+
+ +

Definition at line 32 of file TestJobHandler.cs.

+
33  {
34  cancelled = false;
35  //test with a cancelled cts
36  using (var cts = new CancellationTokenSource())
37  {
38  var tcs = new TaskCompletionSource<object>();
39  currentWaitTask = tcs.Task;
40  cts.Cancel();
41  using(var handler = new JobHandler(TestJob))
42  {
43  await Assert.ThrowsExceptionAsync<OperationCanceledException>(() => handler.Wait(cts.Token)).ConfigureAwait(false);
44  tcs.SetResult(null);
45  await handler.Wait(default).ConfigureAwait(false);
46  }
47  }
48  Assert.IsFalse(cancelled);
49  }
+ +
async Task TestJob(CancellationToken cancellationToken)
+
+

References Tgstation.Server.Host.Core.Tests.TestJobHandler.cancelled, Tgstation.Server.Host.Core.Tests.TestJobHandler.currentWaitTask, and Tgstation.Server.Host.Core.Tests.TestJobHandler.TestJob().

+ +
+
+

Member Data Documentation

+ +

◆ cancelled

+ + + +

◆ currentWaitTask

+ + +
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_platform_identifier-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_platform_identifier-members.html new file mode 100644 index 0000000000..7be8698481 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_platform_identifier-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.Tests.TestPlatformIdentifier Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.Tests.TestPlatformIdentifier, including all inherited members.

+ + +
TestCorrectPlatform()Tgstation.Server.Host.Core.Tests.TestPlatformIdentifier
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_platform_identifier.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_platform_identifier.html new file mode 100644 index 0000000000..0f81b767eb --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_platform_identifier.html @@ -0,0 +1,117 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.Tests.TestPlatformIdentifier Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.Tests.TestPlatformIdentifier Class Reference
+
+
+ + + + +

+Public Member Functions

void TestCorrectPlatform ()
 
+

Detailed Description

+
+

Definition at line 7 of file TestPlatformIdentifier.cs.

+

Member Function Documentation

+ +

◆ TestCorrectPlatform()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Tests.TestPlatformIdentifier.TestCorrectPlatform ()
+
+ +

Definition at line 10 of file TestPlatformIdentifier.cs.

+
11  {
12  var identifier = new PlatformIdentifier();
13 
14  var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
15  const string WindowsScriptExtension = "bat";
16  const string PosixScriptExtension = "sh";
17 
18 
19  Assert.AreEqual(isWindows, identifier.IsWindows);
20 
21  Assert.AreEqual(isWindows ? WindowsScriptExtension : PosixScriptExtension, identifier.ScriptFileExtension);
22  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions-members.html new file mode 100644 index 0000000000..4668bd9084 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions.html new file mode 100644 index 0000000000..28ee6ccc17 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions.html @@ -0,0 +1,129 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions Class Reference
+
+
+ + + + + + + + + + +

+Classes

class  BadConfig1
 
class  BadConfig2
 
class  BadConfig3
 
class  GoodConfig
 
+ + + +

+Public Member Functions

void TestUseStandardConfig ()
 
+

Detailed Description

+
+

Definition at line 10 of file TestServiceCollectionExtensions.cs.

+

Member Function Documentation

+ +

◆ TestUseStandardConfig()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.TestUseStandardConfig ()
+
+ +

Definition at line 33 of file TestServiceCollectionExtensions.cs.

+
34  {
35  var serviceCollection = new ServiceCollection();
36  var mockConfig = new Mock<IConfigurationSection>();
37  mockConfig.Setup(x => x.GetSection(It.IsNotNull<string>())).Returns(mockConfig.Object).Verifiable();
38  Assert.ThrowsException<ArgumentNullException>(() => ServiceCollectionExtensions.UseStandardConfig<GoodConfig>(null, null));
39  Assert.ThrowsException<ArgumentNullException>(() => serviceCollection.UseStandardConfig<GoodConfig>(null));
40  serviceCollection.UseStandardConfig<GoodConfig>(mockConfig.Object);
41  Assert.ThrowsException<InvalidOperationException>(() => serviceCollection.UseStandardConfig<BadConfig1>(mockConfig.Object));
42  Assert.ThrowsException<InvalidOperationException>(() => serviceCollection.UseStandardConfig<BadConfig2>(mockConfig.Object));
43  Assert.ThrowsException<InvalidOperationException>(() => serviceCollection.UseStandardConfig<BadConfig3>(mockConfig.Object));
44  mockConfig.Verify();
45  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config1-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config1-members.html new file mode 100644 index 0000000000..f1375b13d0 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config1-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.BadConfig1 Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config1.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config1.html new file mode 100644 index 0000000000..453107f728 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config1.html @@ -0,0 +1,122 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.BadConfig1 Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.BadConfig1 Class Reference
+
+
+ + + + +

+Private Attributes

const string Section = "asdf"
 
+

Detailed Description

+
+

Definition at line 17 of file TestServiceCollectionExtensions.cs.

+

Member Data Documentation

+ +

◆ Section

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.BadConfig1.Section = "asdf"
+
+private
+
+ +

Definition at line 19 of file TestServiceCollectionExtensions.cs.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config2-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config2-members.html new file mode 100644 index 0000000000..0303c18a1e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config2-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.BadConfig2 Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config2.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config2.html new file mode 100644 index 0000000000..9df53a55cf --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config2.html @@ -0,0 +1,114 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.BadConfig2 Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.BadConfig2 Class Reference
+
+
+ + + + +

+Public Attributes

const bool Section = false
 
+

Detailed Description

+
+

Definition at line 22 of file TestServiceCollectionExtensions.cs.

+

Member Data Documentation

+ +

◆ Section

+ +
+
+ + + + +
const bool Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.BadConfig2.Section = false
+
+ +

Definition at line 24 of file TestServiceCollectionExtensions.cs.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config3.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config3.html new file mode 100644 index 0000000000..e8fa54eb60 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config3.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.BadConfig3 Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.BadConfig3 Class Reference
+
+
+

Detailed Description

+
+

Definition at line 27 of file TestServiceCollectionExtensions.cs.

+

The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_good_config-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_good_config-members.html new file mode 100644 index 0000000000..8d671e16c9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_good_config-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.GoodConfig Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_good_config.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_good_config.html new file mode 100644 index 0000000000..0615f6db08 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_good_config.html @@ -0,0 +1,114 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.GoodConfig Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.GoodConfig Class Reference
+
+
+ + + + +

+Public Attributes

const string Section = "asdf"
 
+

Detailed Description

+
+

Definition at line 12 of file TestServiceCollectionExtensions.cs.

+

Member Data Documentation

+ +

◆ Section

+ +
+
+ + + + +
const string Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.GoodConfig.Section = "asdf"
+
+ +

Definition at line 14 of file TestServiceCollectionExtensions.cs.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_setup_wizard-members.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_setup_wizard-members.html new file mode 100644 index 0000000000..4210672791 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_setup_wizard-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.Tests.TestSetupWizard Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_setup_wizard.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_setup_wizard.html new file mode 100644 index 0000000000..b0f0c01d3e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_setup_wizard.html @@ -0,0 +1,141 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.Tests.TestSetupWizard Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.Tests.TestSetupWizard Class Reference
+
+
+ + + + + + +

+Public Member Functions

void TestConstructionThrows ()
 
async Task TestWithUserStupiditiy ()
 
+

Detailed Description

+
+

Definition at line 20 of file TestSetupWizard.cs.

+

Member Function Documentation

+ +

◆ TestConstructionThrows()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Core.Tests.TestSetupWizard.TestConstructionThrows ()
+
+ +

Definition at line 23 of file TestSetupWizard.cs.

+
24  {
25  Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(null, null, null, null, null, null, null, null, null));
26  var mockIOManager = new Mock<IIOManager>();
27  Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, null, null, null, null, null, null, null, null));
28  var mockConsole = new Mock<IConsole>();
29  Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, null, null, null, null, null, null, null));
30  var mockHostingEnvironment = new Mock<IHostingEnvironment>();
31  Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, null, null, null, null, null, null));
32  var mockApplication = new Mock<IApplication>();
33  Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockApplication.Object, null, null, null, null, null));
34  var mockDBConnectionFactory = new Mock<IDBConnectionFactory>();
35  Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockApplication.Object, mockDBConnectionFactory.Object, null, null, null, null));
36  var mockPlatformIdentifier = new Mock<IPlatformIdentifier>();
37  Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockApplication.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, null, null, null));
38  var mockAsyncDelayer = new Mock<IAsyncDelayer>();
39  Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockApplication.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, null, null));
40  var mockLogger = new Mock<ILogger<SetupWizard>>();
41  Assert.ThrowsException<ArgumentNullException>(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockApplication.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLogger.Object, null));
42  }
+
+
+ +

◆ TestWithUserStupiditiy()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.Core.Tests.TestSetupWizard.TestWithUserStupiditiy ()
+
+ +

Definition at line 45 of file TestSetupWizard.cs.

+
46  {
47  var mockIOManager = new Mock<IIOManager>();
48  var mockConsole = new Mock<IConsole>();
49  var mockHostingEnvironment = new Mock<IHostingEnvironment>();
50  var mockApplication = new Mock<IApplication>();
51  var mockDBConnectionFactory = new Mock<IDBConnectionFactory>();
52  var mockLogger = new Mock<ILogger<SetupWizard>>();
53  var mockGeneralConfigurationOptions = new Mock<IOptions<GeneralConfiguration>>();
54  var mockPlatformIdentifier = new Mock<IPlatformIdentifier>();
55  var mockAsyncDelayer = new Mock<IAsyncDelayer>();
56 
57  var testGeneralConfig = new GeneralConfiguration
58  {
60  };
61  mockGeneralConfigurationOptions.SetupGet(x => x.Value).Returns(testGeneralConfig).Verifiable();
62 
63  var wizard = new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockApplication.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLogger.Object, mockGeneralConfigurationOptions.Object);
64 
65  mockPlatformIdentifier.SetupGet(x => x.IsWindows).Returns(true).Verifiable();
66  mockAsyncDelayer.Setup(x => x.Delay(It.IsAny<TimeSpan>(), It.IsAny<CancellationToken>())).Returns(Task.CompletedTask).Verifiable();
67 
68  Assert.IsFalse(await wizard.CheckRunWizard(default).ConfigureAwait(false));
69 
70  testGeneralConfig.SetupWizardMode = SetupWizardMode.Force;
71  await Assert.ThrowsExceptionAsync<InvalidOperationException>(() => wizard.CheckRunWizard(default)).ConfigureAwait(false);
72 
73  testGeneralConfig.SetupWizardMode = SetupWizardMode.Only;
74  await Assert.ThrowsExceptionAsync<InvalidOperationException>(() => wizard.CheckRunWizard(default)).ConfigureAwait(false);
75 
76  mockConsole.SetupGet(x => x.Available).Returns(true).Verifiable();
77  mockIOManager.Setup(x => x.FileExists(It.IsNotNull<string>(), It.IsAny<CancellationToken>())).Returns(Task.FromResult(true)).Verifiable();
78  mockIOManager.Setup(x => x.ReadAllBytes(It.IsNotNull<string>(), It.IsAny<CancellationToken>())).Returns(Task.FromResult(Encoding.UTF8.GetBytes("cucked"))).Verifiable();
79  mockIOManager.Setup(x => x.WriteAllBytes(It.IsNotNull<string>(), It.IsNotNull<byte[]>(), It.IsAny<CancellationToken>())).Returns(Task.CompletedTask).Verifiable();
80 
81  var mockSuccessCommand = new Mock<DbCommand>();
82  mockSuccessCommand.Setup(x => x.ExecuteNonQueryAsync(It.IsAny<CancellationToken>())).Returns(Task.FromResult(0)).Verifiable();
83  mockSuccessCommand.Setup(x => x.ExecuteScalarAsync(It.IsAny<CancellationToken>())).Returns(Task.FromResult<object>("1.2.3")).Verifiable();
84  var mockFailCommand = new Mock<DbCommand>();
85  mockFailCommand.Setup(x => x.ExecuteNonQueryAsync(It.IsAny<CancellationToken>())).Throws(new Exception()).Verifiable();
86 
87  void SetDbCommandCreator(Mock<DbConnection> mock, Func<DbCommand> creator) => mock.Protected().Setup<DbCommand>("CreateDbCommand").Returns(creator).Verifiable();
88 
89  var mockGoodDbConnection = new Mock<DbConnection>();
90  mockGoodDbConnection.Setup(x => x.OpenAsync(It.IsAny<CancellationToken>())).Returns(Task.CompletedTask).Verifiable();
91  SetDbCommandCreator(mockGoodDbConnection, () => mockSuccessCommand.Object);
92 
93  var mockBadDbConnection = new Mock<DbConnection>();
94  mockBadDbConnection.Setup(x => x.OpenAsync(It.IsAny<CancellationToken>())).Throws(new Exception()).Verifiable();
95  var invokeTimes = 0;
96  var mockUglyDbConnection = new Mock<DbConnection>();
97  SetDbCommandCreator(mockUglyDbConnection, () =>
98  {
99  if (invokeTimes < 2)
100  {
101  ++invokeTimes;
102  return mockSuccessCommand.Object;
103  }
104  else
105  return mockFailCommand.Object;
106  });
107 
108  mockDBConnectionFactory.Setup(x => x.CreateConnection(It.IsAny<string>(), DatabaseType.SqlServer)).Returns(mockBadDbConnection.Object).Verifiable();
109  mockDBConnectionFactory.Setup(x => x.CreateConnection(It.IsAny<string>(), DatabaseType.MariaDB)).Returns(mockGoodDbConnection.Object).Verifiable();
110  mockDBConnectionFactory.Setup(x => x.CreateConnection(It.IsAny<string>(), DatabaseType.MySql)).Returns(mockUglyDbConnection.Object).Verifiable();
111 
112  var finalInputSequence = new List<string>()
113  {
114  //first run, just say no to the force prompt after testing it
115  "fake",
116  "n",
117  //second run say yes to the force prompt
118  "y",
119  //first normal run
120  "bad port number",
121  "0",
122  "666",
123  "FakeDBType",
124  nameof(DatabaseType.SqlServer),
125  "this isn't validated",
126  "nor is this",
127  "no",
128  //test winauth
129  "yes",
130  //sql server will always fail so reconfigure with maria
131  nameof(DatabaseType.MariaDB),
132  "bleh",
133  "blah",
134  "NO",
135  "user",
136  "pass",
137  //general config
138  "four",
139  "-12",
140  "16",
141  "eight",
142  "-27",
143  "5000",
144  "fake token",
145  //logging config
146  "no",
147  //cp config
148  "y",
149  "y",
150  //saved, now for second run
151  //this time use defaults amap
152  String.Empty,
153  //test MySQL errors
154  nameof(DatabaseType.MySql),
155  String.Empty,
156  String.Empty,
157  "DbName",
158  "n",
159  "user",
160  "pass",
161  //general config
162  "y",
163  String.Empty,
164  String.Empty,
165  String.Empty,
166  //logging config
167  "y",
168  "not actually verified because lol mocks /../!@#$%^&*()/..///.",
169  "Warning",
170  String.Empty,
171  //cp config
172  "y",
173  "n",
174  String.Empty,
175  //third run, we already hit all the code coverage so just get through it
176  String.Empty,
177  nameof(DatabaseType.MariaDB),
178  String.Empty,
179  "dbname",
180  "y",
181  "user",
182  "pass",
183  //general
184  "y",
185  String.Empty,
186  String.Empty,
187  String.Empty,
188  "y",
189  "will faile",
190  String.Empty,
191  String.Empty,
192  "fake",
193  "None",
194  "Critical",
195  //cp config
196  "y",
197  "n",
198  "http://fake.com, https://example.org",
199  };
200 
201  var inputPos = 0;
202 
203  mockApplication.SetupGet(x => x.VersionPrefix).Returns("sumfuk").Verifiable();
204 
205 
206  // This list is here for ease of debugging.
207  var consolePlayback = new List<string>();
208 
209  mockConsole.Setup(x => x.PressAnyKeyAsync(It.IsAny<CancellationToken>())).Returns(Task.CompletedTask).Verifiable();
210  mockConsole.Setup(x => x.ReadLineAsync(It.IsAny<bool>(), It.IsAny<CancellationToken>())).Returns(() =>
211  {
212  if (inputPos == finalInputSequence.Count)
213  Assert.Fail("Exhausted input sequence!");
214  var res = finalInputSequence[inputPos++];
215  consolePlayback.Add($"Input: {res}");
216  return Task.FromResult(res);
217  }).Verifiable();
218 
219  mockConsole
220  .Setup(x => x.WriteAsync(It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<CancellationToken>()))
221  .Callback<string, bool, CancellationToken>((message, error, token) => consolePlayback.Add($"Output: {message}"))
222  .Returns(Task.CompletedTask)
223  .Verifiable();
224 
225  Assert.IsFalse(await wizard.CheckRunWizard(default).ConfigureAwait(false));
226  //first real run
227  Assert.IsTrue(await wizard.CheckRunWizard(default).ConfigureAwait(false));
228 
229  //second run
230  mockIOManager.Setup(x => x.ReadAllBytes(It.IsNotNull<string>(), It.IsAny<CancellationToken>())).Returns(Task.FromResult(Encoding.UTF8.GetBytes(String.Empty))).Verifiable();
231  Assert.IsTrue(await wizard.CheckRunWizard(default).ConfigureAwait(false));
232 
233  //third run
234  testGeneralConfig.SetupWizardMode = SetupWizardMode.Autodetect;
235  mockIOManager.Setup(x => x.WriteAllBytes(It.IsNotNull<string>(), It.IsNotNull<byte[]>(), It.IsAny<CancellationToken>())).Throws(new Exception()).Verifiable();
236  var firstRun = true;
237  mockIOManager.Setup(x => x.CreateDirectory(It.IsNotNull<string>(), It.IsAny<CancellationToken>())).Returns(() =>
238  {
239  if (firstRun)
240  {
241  firstRun = false;
242  throw new Exception();
243  }
244  return Task.CompletedTask;
245  }).Verifiable();
246 
247  await Assert.ThrowsExceptionAsync<OperationCanceledException>(() => wizard.CheckRunWizard(default)).ConfigureAwait(false);
248 
249  Assert.AreEqual(finalInputSequence.Count, inputPos);
250  mockFailCommand.VerifyAll();
251  mockSuccessCommand.VerifyAll();
252  mockIOManager.VerifyAll();
253  mockGeneralConfigurationOptions.VerifyAll();
254  mockConsole.VerifyAll();
255  mockGoodDbConnection.VerifyAll();
256  mockBadDbConnection.VerifyAll();
257  mockUglyDbConnection.VerifyAll();
258  mockDBConnectionFactory.VerifyAll();
259  mockApplication.VerifyAll();
260  mockPlatformIdentifier.VerifyAll();
261  mockAsyncDelayer.VerifyAll();
262  }
SetupWizardMode
Determines if the Core.ISetupWizard will run
+ +
DatabaseType
Type of database to user
Definition: DatabaseType.cs:6
+
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console-members.html b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console-members.html new file mode 100644 index 0000000000..5be52808c9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console-members.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.IO.Console Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.IO.Console, including all inherited members.

+ + + + + + +
AvailableTgstation.Server.Host.IO.Console
CheckAvailable()Tgstation.Server.Host.IO.Consoleprivate
PressAnyKeyAsync(CancellationToken cancellationToken)Tgstation.Server.Host.IO.Console
ReadLineAsync(bool usePasswordChar, CancellationToken cancellationToken)Tgstation.Server.Host.IO.Console
WriteAsync(string text, bool newLine, CancellationToken cancellationToken)Tgstation.Server.Host.IO.Console
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.html b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.html new file mode 100644 index 0000000000..dbd2edc9ff --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.html @@ -0,0 +1,279 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.IO.Console Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IO.Console Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.IO.Console:
+
+
+ + +Tgstation.Server.Host.IO.IConsole + +
+ + + + + + + + + + + +

+Public Member Functions

Task PressAnyKeyAsync (CancellationToken cancellationToken)
 Wait for a key press on the IConsole More...
 
Task< string > ReadLineAsync (bool usePasswordChar, CancellationToken cancellationToken)
 Read a line from the IConsole More...
 
Task WriteAsync (string text, bool newLine, CancellationToken cancellationToken)
 Write some text to the IConsole More...
 
+ + + +

+Public Attributes

bool Available => Environment.UserInteractive
 
+ + + +

+Private Member Functions

void CheckAvailable ()
 
+ + + + + +

+Additional Inherited Members

- Properties inherited from Tgstation.Server.Host.IO.IConsole
bool Available [get]
 If the IConsole is visible to the user More...
 
+

Detailed Description

+
+

Definition at line 9 of file Console.cs.

+

Member Function Documentation

+ +

◆ CheckAvailable()

+ +
+
+ + + + + +
+ + + + + + + +
void Tgstation.Server.Host.IO.Console.CheckAvailable ()
+
+private
+
+ +

Definition at line 14 of file Console.cs.

+
15  {
16  if (!Available)
17  throw new InvalidOperationException("Console unavailable");
18  }
+
+

References Tgstation.Server.Host.IO.Console.Available.

+ +
+
+ +

◆ PressAnyKeyAsync()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.IO.Console.PressAnyKeyAsync (CancellationToken cancellationToken)
+
+ +

Wait for a key press on the IConsole

+ +

Implements Tgstation.Server.Host.IO.IConsole.

+ +
+
+ +

◆ ReadLineAsync()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<string> Tgstation.Server.Host.IO.Console.ReadLineAsync (bool usePasswordChar,
CancellationToken cancellationToken 
)
+
+ +

Read a line from the IConsole

+ +

Implements Tgstation.Server.Host.IO.IConsole.

+ +
+
+ +

◆ WriteAsync()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.Console.WriteAsync (string text,
bool newLine,
CancellationToken cancellationToken 
)
+
+ +

Write some text to the IConsole

+ +

Implements Tgstation.Server.Host.IO.IConsole.

+ +
+
+

Member Data Documentation

+ +

◆ Available

+ +
+
+ + + + +
bool Tgstation.Server.Host.IO.Console.Available => Environment.UserInteractive
+
+ +

+ +

Definition at line 12 of file Console.cs.

+ +

Referenced by Tgstation.Server.Host.IO.Console.CheckAvailable().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.png b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.png new file mode 100644 index 0000000000000000000000000000000000000000..5901149f5f68f1ac7d0463df9b23ff5d44569094 GIT binary patch literal 829 zcmeAS@N?(olHy`uVBq!ia0vp^XMi|>gBeIBMP&T|QW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;HkjRKDgf9}@ z%V%1qw!4Du@uu{c_yaN1B5$^Kb$s5a*eEM0_HDbmJ?3^1BlEXivoxPr_Tk;E<4ESp!oZR-_xDl+A}^aWj9beB62|TjDBI|^Wdd77alv8BF>)>^Qz~5 z_Ked;+Peb;3+>Fz)^I(GoHuB_DfB)PSkG8JO)hb44$rjF6*2UngAA@hIRk| literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager-members.html b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager-members.html new file mode 100644 index 0000000000..46484d507c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager-members.html @@ -0,0 +1,111 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.IO.DefaultIOManager Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.IO.DefaultIOManager, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
ConcatPath(params string[] paths)Tgstation.Server.Host.IO.DefaultIOManager
CopyDirectory(string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
CopyDirectoryImpl(string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManagerprivate
CopyFile(string src, string dest, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
CreateDirectory(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
DefaultBufferSizeTgstation.Server.Host.IO.DefaultIOManager
DeleteDirectory(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
DeleteFile(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
DirectoryExists(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
DownloadFile(Uri url, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
FileExists(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
GetDirectories(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
GetDirectoryName(string path)Tgstation.Server.Host.IO.DefaultIOManager
GetFileName(string path)Tgstation.Server.Host.IO.DefaultIOManager
GetFileNameWithoutExtension(string path)Tgstation.Server.Host.IO.DefaultIOManager
GetFiles(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
GetFilesWithExtension(string path, string extension, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
MoveDirectory(string source, string destination, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
MoveFile(string source, string destination, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
NormalizeAndDelete(DirectoryInfo dir, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManagerprivatestatic
OpenWriteStream(string path)Tgstation.Server.Host.IO.DefaultIOManagerprivatestatic
PathContainsParentAccess(string path)Tgstation.Server.Host.IO.DefaultIOManager
ReadAllBytes(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
ResolvePath(string path)Tgstation.Server.Host.IO.DefaultIOManagervirtual
WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
ZipToDirectory(string path, byte[] zipFileBytes, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html new file mode 100644 index 0000000000..617c39e7d2 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html @@ -0,0 +1,1122 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.IO.DefaultIOManager Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IO.DefaultIOManager Class Reference
+
+
+ +

IIOManager that resolves paths to Environment.CurrentDirectory + More...

+
+Inheritance diagram for Tgstation.Server.Host.IO.DefaultIOManager:
+
+
+ + +Tgstation.Server.Host.IO.IIOManager +Tgstation.Server.Host.IO.ResolvingIOManager + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

async Task CopyDirectory (string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)
 Copies a directory from src to dest More...
 
string ConcatPath (params string[] paths)
 Combines an array of strings into a path More...
 
async Task CopyFile (string src, string dest, CancellationToken cancellationToken)
 Copy a file from src to dest More...
 
Task CreateDirectory (string path, CancellationToken cancellationToken)
 Create a directory at path More...
 
async Task DeleteDirectory (string path, CancellationToken cancellationToken)
 Recursively delete a directory More...
 
Task DeleteFile (string path, CancellationToken cancellationToken)
 Deletes a file at path More...
 
Task< bool > FileExists (string path, CancellationToken cancellationToken)
 Check that the file at path exists More...
 
Task< bool > DirectoryExists (string path, CancellationToken cancellationToken)
 Check that the directory at path exists More...
 
string GetDirectoryName (string path)
 Gets the directory portion of a given path More...
 
string GetFileName (string path)
 Gets the file name portion of a path More...
 
string GetFileNameWithoutExtension (string path)
 Gets the file name portion of a path with More...
 
Task< List< string > > GetFilesWithExtension (string path, string extension, CancellationToken cancellationToken)
 Gets a list of files in path with the given extension More...
 
Task MoveFile (string source, string destination, CancellationToken cancellationToken)
 Moves a file at source to destination More...
 
Task MoveDirectory (string source, string destination, CancellationToken cancellationToken)
 Moves a directory at source to destination More...
 
async Task< byte[]> ReadAllBytes (string path, CancellationToken cancellationToken)
 Returns all the contents of a file at path as a byte array More...
 
virtual string ResolvePath (string path)
 Retrieve the full path of some path given a relative path. Must be used before passing relative paths to other APIs. All other operations in this interface call this internally on given paths More...
 
async Task WriteAllBytes (string path, byte[] contents, CancellationToken cancellationToken)
 Writes some contents to a file at path overwriting previous content More...
 
Task< IReadOnlyList< string > > GetDirectories (string path, CancellationToken cancellationToken)
 Returns directory names in a given path More...
 
Task< IReadOnlyList< string > > GetFiles (string path, CancellationToken cancellationToken)
 Returns file names in a given path More...
 
async Task< byte[]> DownloadFile (Uri url, CancellationToken cancellationToken)
 Downloads a file from url More...
 
Task ZipToDirectory (string path, byte[] zipFileBytes, CancellationToken cancellationToken)
 Extract a set of zipFileBytes to a given path More...
 
bool PathContainsParentAccess (string path)
 Check if a path contains the '..' parent directory accessor More...
 
+ + + + +

+Public Attributes

const int DefaultBufferSize = 4096
 Default FileStream buffer size used by .NET More...
 
+ + + + +

+Private Member Functions

IEnumerable< Task > CopyDirectoryImpl (string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)
 Copies a directory from src to dest More...
 
+ + + + + + + +

+Static Private Member Functions

static async Task NormalizeAndDelete (DirectoryInfo dir, CancellationToken cancellationToken)
 Recursively empty a directory More...
 
static FileStream OpenWriteStream (string path)
 Opens a FileStream for async writing at a given path More...
 
+

Detailed Description

+

IIOManager that resolves paths to Environment.CurrentDirectory

+ +

Definition at line 16 of file DefaultIOManager.cs.

+

Member Function Documentation

+ +

◆ ConcatPath()

+ +
+
+ + + + + + + + +
string Tgstation.Server.Host.IO.DefaultIOManager.ConcatPath (params string [] paths)
+
+ +

Combines an array of strings into a path

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +

Definition at line 121 of file DefaultIOManager.cs.

+
122  {
123  if (paths == null)
124  throw new ArgumentNullException(nameof(paths));
125  return Path.Combine(paths);
126  }
+

Referenced by Tgstation.Server.Host.IO.ResolvingIOManager.ResolvePath(), and Tgstation.Server.Host.IO.ResolvingIOManager.ResolvingIOManager().

+ +
+
+ +

◆ CopyDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.IO.DefaultIOManager.CopyDirectory (string src,
string dest,
IEnumerable< string > ignore,
CancellationToken cancellationToken 
)
+
+ +

Copies a directory from src to dest

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +

Definition at line 107 of file DefaultIOManager.cs.

+
108  {
109  if (dest == null)
110  throw new ArgumentNullException(nameof(src));
111  if (dest == null)
112  throw new ArgumentNullException(nameof(src));
113 
114  src = ResolvePath(src);
115  dest = ResolvePath(dest);
116  foreach (var directoryCopy in CopyDirectoryImpl(src, dest, ignore, cancellationToken))
117  await directoryCopy.ConfigureAwait(false);
118  }
IEnumerable< Task > CopyDirectoryImpl(string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)
Copies a directory from src to dest
+
virtual string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
+

References Tgstation.Server.Host.IO.DefaultIOManager.CopyDirectoryImpl(), and Tgstation.Server.Host.IO.DefaultIOManager.ResolvePath().

+ +
+
+ +

◆ CopyDirectoryImpl()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IEnumerable<Task> Tgstation.Server.Host.IO.DefaultIOManager.CopyDirectoryImpl (string src,
string dest,
IEnumerable< string > ignore,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Copies a directory from src to dest

+
Parameters
+ + + + + +
srcThe source directory path
destThe destination directory path
ignoreFiles and folders to ignore at the root level
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A IEnumerable<T> of Tasks representing the running operation
+ +

Definition at line 71 of file DefaultIOManager.cs.

+
72  {
73  var dir = new DirectoryInfo(src);
74  var atLeastOneSubDir = false;
75  foreach (var I in dir.EnumerateDirectories())
76  {
77  if (ignore != null && ignore.Contains(I.Name))
78  continue;
79  foreach (var J in CopyDirectoryImpl(I.FullName, Path.Combine(dest, I.Name), null, cancellationToken))
80  {
81  atLeastOneSubDir = true;
82  yield return J;
83  }
84  }
85 
86  async Task CopyThisDirectory()
87  {
88  if (!atLeastOneSubDir)
89  await CreateDirectory(dest, cancellationToken).ConfigureAwait(false); // save on createdir calls
90 
91  var tasks = new List<Task>();
92 
93  await dir.EnumerateFiles().ToAsyncEnumerable().ForEachAsync(fileInfo =>
94  {
95  if (ignore != null && ignore.Contains(fileInfo.Name))
96  return;
97  tasks.Add(CopyFile(fileInfo.FullName, Path.Combine(dest, fileInfo.Name), cancellationToken));
98  }).ConfigureAwait(false);
99 
100  await Task.WhenAll(tasks).ConfigureAwait(false);
101  }
102 
103  yield return CopyThisDirectory();
104  }
async Task CopyFile(string src, string dest, CancellationToken cancellationToken)
Copy a file from src to dest
+
IEnumerable< Task > CopyDirectoryImpl(string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)
Copies a directory from src to dest
+
Task CreateDirectory(string path, CancellationToken cancellationToken)
Create a directory at path
+
+

References Tgstation.Server.Host.IO.DefaultIOManager.CopyFile(), and Tgstation.Server.Host.IO.DefaultIOManager.CreateDirectory().

+ +

Referenced by Tgstation.Server.Host.IO.DefaultIOManager.CopyDirectory().

+ +
+
+ +

◆ CopyFile()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.IO.DefaultIOManager.CopyFile (string src,
string dest,
CancellationToken cancellationToken 
)
+
+ +

Copy a file from src to dest

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +

Definition at line 129 of file DefaultIOManager.cs.

+
130  {
131  if (src == null)
132  throw new ArgumentNullException(nameof(src));
133  if (dest == null)
134  throw new ArgumentNullException(nameof(dest));
135  using (var srcStream = new FileStream(ResolvePath(src), FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete, DefaultBufferSize, true))
136  using (var destStream = new FileStream(ResolvePath(dest), FileMode.Create, FileAccess.Write, FileShare.ReadWrite | FileShare.Delete, DefaultBufferSize, true))
137  await srcStream.CopyToAsync(destStream, 81920, cancellationToken).ConfigureAwait(false);
138  }
virtual string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
const int DefaultBufferSize
Default FileStream buffer size used by .NET
+
+

References Tgstation.Server.Host.IO.DefaultIOManager.DefaultBufferSize, and Tgstation.Server.Host.IO.DefaultIOManager.ResolvePath().

+ +

Referenced by Tgstation.Server.Host.IO.DefaultIOManager.CopyDirectoryImpl().

+ +
+
+ +

◆ CreateDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.DefaultIOManager.CreateDirectory (string path,
CancellationToken cancellationToken 
)
+
+ +

Create a directory at path

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +

Referenced by Tgstation.Server.Host.IO.DefaultIOManager.CopyDirectoryImpl().

+ +
+
+ +

◆ DeleteDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.IO.DefaultIOManager.DeleteDirectory (string path,
CancellationToken cancellationToken 
)
+
+ +

Recursively delete a directory

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +

Definition at line 144 of file DefaultIOManager.cs.

+
145  {
146  path = ResolvePath(path);
147  var di = new DirectoryInfo(path);
148  if (!di.Exists)
149  return;
150  await NormalizeAndDelete(di, cancellationToken).ConfigureAwait(false);
151  }
static async Task NormalizeAndDelete(DirectoryInfo dir, CancellationToken cancellationToken)
Recursively empty a directory
+
virtual string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
+

References Tgstation.Server.Host.IO.DefaultIOManager.NormalizeAndDelete(), and Tgstation.Server.Host.IO.DefaultIOManager.ResolvePath().

+ +
+
+ +

◆ DeleteFile()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.DefaultIOManager.DeleteFile (string path,
CancellationToken cancellationToken 
)
+
+ +

Deletes a file at path

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +
+
+ +

◆ DirectoryExists()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<bool> Tgstation.Server.Host.IO.DefaultIOManager.DirectoryExists (string path,
CancellationToken cancellationToken 
)
+
+ +

Check that the directory at path exists

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +
+
+ +

◆ DownloadFile()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task<byte[]> Tgstation.Server.Host.IO.DefaultIOManager.DownloadFile (Uri url,
CancellationToken cancellationToken 
)
+
+ +

Downloads a file from url

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +

Definition at line 262 of file DefaultIOManager.cs.

+
263  {
264  // DownloadDataTaskAsync can't be cancelled and is shittily written, don't use it
265  using (var wc = new WebClient())
266  {
267  var tcs = new TaskCompletionSource<byte[]>();
268  wc.DownloadDataCompleted += (a, b) =>
269  {
270  if (b.Error != null)
271  tcs.TrySetException(b.Error);
272  else if (b.Cancelled)
273  tcs.TrySetCanceled();
274  else
275  tcs.TrySetResult(b.Result);
276  };
277  wc.DownloadDataAsync(url);
278  using (cancellationToken.Register(() =>
279  {
280  wc.CancelAsync();
281  tcs.TrySetCanceled();
282  }))
283  return await tcs.Task.ConfigureAwait(false);
284  }
285  }
+
+
+ +

◆ FileExists()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<bool> Tgstation.Server.Host.IO.DefaultIOManager.FileExists (string path,
CancellationToken cancellationToken 
)
+
+ +

Check that the file at path exists

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +
+
+ +

◆ GetDirectories()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<IReadOnlyList<string> > Tgstation.Server.Host.IO.DefaultIOManager.GetDirectories (string path,
CancellationToken cancellationToken 
)
+
+ +

Returns directory names in a given path

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +
+
+ +

◆ GetDirectoryName()

+ +
+
+ + + + + + + + +
string Tgstation.Server.Host.IO.DefaultIOManager.GetDirectoryName (string path)
+
+ +

Gets the directory portion of a given path

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +
+
+ +

◆ GetFileName()

+ +
+
+ + + + + + + + +
string Tgstation.Server.Host.IO.DefaultIOManager.GetFileName (string path)
+
+ +

Gets the file name portion of a path

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +
+
+ +

◆ GetFileNameWithoutExtension()

+ +
+
+ + + + + + + + +
string Tgstation.Server.Host.IO.DefaultIOManager.GetFileNameWithoutExtension (string path)
+
+ +

Gets the file name portion of a path with

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +
+
+ +

◆ GetFiles()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<IReadOnlyList<string> > Tgstation.Server.Host.IO.DefaultIOManager.GetFiles (string path,
CancellationToken cancellationToken 
)
+
+ +

Returns file names in a given path

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +
+
+ +

◆ GetFilesWithExtension()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<List<string> > Tgstation.Server.Host.IO.DefaultIOManager.GetFilesWithExtension (string path,
string extension,
CancellationToken cancellationToken 
)
+
+ +

Gets a list of files in path with the given extension

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +
+
+ +

◆ MoveDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.DefaultIOManager.MoveDirectory (string source,
string destination,
CancellationToken cancellationToken 
)
+
+ +

Moves a directory at source to destination

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +
+
+ +

◆ MoveFile()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.DefaultIOManager.MoveFile (string source,
string destination,
CancellationToken cancellationToken 
)
+
+ +

Moves a file at source to destination

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +
+
+ +

◆ NormalizeAndDelete()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static async Task Tgstation.Server.Host.IO.DefaultIOManager.NormalizeAndDelete (DirectoryInfo dir,
CancellationToken cancellationToken 
)
+
+staticprivate
+
+ +

Recursively empty a directory

+
Parameters
+ + + +
dirDirectoryInfo of the directory to empty
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 29 of file DefaultIOManager.cs.

+
30  {
31  var tasks = new List<Task>();
32 
33  foreach (var subDir in dir.EnumerateDirectories())
34  {
35  cancellationToken.ThrowIfCancellationRequested();
36 
37  // if below succeeds this is probably a symlink
38  if (!subDir.Attributes.HasFlag(FileAttributes.Directory) || subDir.Attributes.HasFlag(FileAttributes.ReparsePoint))
39  subDir.Delete();
40  else
41  tasks.Add(NormalizeAndDelete(subDir, cancellationToken));
42  }
43 
44  foreach (var file in dir.EnumerateFiles())
45  {
46  cancellationToken.ThrowIfCancellationRequested();
47  file.Attributes = FileAttributes.Normal;
48  file.Delete();
49  }
50 
51  await Task.WhenAll(tasks).ConfigureAwait(false);
52  cancellationToken.ThrowIfCancellationRequested();
53  dir.Delete(true);
54  }
static async Task NormalizeAndDelete(DirectoryInfo dir, CancellationToken cancellationToken)
Recursively empty a directory
+
+

Referenced by Tgstation.Server.Host.IO.DefaultIOManager.DeleteDirectory().

+ +
+
+ +

◆ OpenWriteStream()

+ +
+
+ + + + + +
+ + + + + + + + +
static FileStream Tgstation.Server.Host.IO.DefaultIOManager.OpenWriteStream (string path)
+
+staticprivate
+
+ +

Opens a FileStream for async writing at a given path

+
Parameters
+ + +
pathThe path to open the FileStream at
+
+
+
Returns
A new FileStream ready for async writing
+ +

Referenced by Tgstation.Server.Host.IO.DefaultIOManager.WriteAllBytes().

+ +
+
+ +

◆ PathContainsParentAccess()

+ +
+
+ + + + + + + + +
bool Tgstation.Server.Host.IO.DefaultIOManager.PathContainsParentAccess (string path)
+
+ +

Check if a path contains the '..' parent directory accessor

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +
+
+ +

◆ ReadAllBytes()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task<byte[]> Tgstation.Server.Host.IO.DefaultIOManager.ReadAllBytes (string path,
CancellationToken cancellationToken 
)
+
+ +

Returns all the contents of a file at path as a byte array

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +

Definition at line 208 of file DefaultIOManager.cs.

+
209  {
210  path = ResolvePath(path);
211  using (var file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete, DefaultBufferSize, true))
212  {
213  byte[] buf;
214  buf = new byte[file.Length];
215  await file.ReadAsync(buf, 0, (int)file.Length, cancellationToken).ConfigureAwait(false);
216  return buf;
217  }
218  }
virtual string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
const int DefaultBufferSize
Default FileStream buffer size used by .NET
+
+

References Tgstation.Server.Host.IO.DefaultIOManager.DefaultBufferSize, and Tgstation.Server.Host.IO.DefaultIOManager.ResolvePath().

+ +
+
+ +

◆ ResolvePath()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual string Tgstation.Server.Host.IO.DefaultIOManager.ResolvePath (string path)
+
+virtual
+
+ +

Retrieve the full path of some path given a relative path. Must be used before passing relative paths to other APIs. All other operations in this interface call this internally on given paths

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +

Reimplemented in Tgstation.Server.Host.IO.ResolvingIOManager.

+ +

Referenced by Tgstation.Server.Host.IO.DefaultIOManager.CopyDirectory(), Tgstation.Server.Host.IO.DefaultIOManager.CopyFile(), Tgstation.Server.Host.IO.DefaultIOManager.DeleteDirectory(), Tgstation.Server.Host.IO.DefaultIOManager.ReadAllBytes(), and Tgstation.Server.Host.IO.DefaultIOManager.WriteAllBytes().

+ +
+
+ +

◆ WriteAllBytes()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.IO.DefaultIOManager.WriteAllBytes (string path,
byte [] contents,
CancellationToken cancellationToken 
)
+
+ +

Writes some contents to a file at path overwriting previous content

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +

Definition at line 224 of file DefaultIOManager.cs.

+
225  {
226  path = ResolvePath(path);
227  using (var file = OpenWriteStream(path))
228  await file.WriteAsync(contents, 0, contents.Length, cancellationToken).ConfigureAwait(false);
229  }
static FileStream OpenWriteStream(string path)
Opens a FileStream for async writing at a given path
+
virtual string ResolvePath(string path)
Retrieve the full path of some path given a relative path. Must be used before passing relative path...
+
+

References Tgstation.Server.Host.IO.DefaultIOManager.OpenWriteStream(), and Tgstation.Server.Host.IO.DefaultIOManager.ResolvePath().

+ +
+
+ +

◆ ZipToDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.DefaultIOManager.ZipToDirectory (string path,
byte [] zipFileBytes,
CancellationToken cancellationToken 
)
+
+ +

Extract a set of zipFileBytes to a given path

+ +

Implements Tgstation.Server.Host.IO.IIOManager.

+ +
+
+

Member Data Documentation

+ +

◆ DefaultBufferSize

+ +
+
+ + + + +
const int Tgstation.Server.Host.IO.DefaultIOManager.DefaultBufferSize = 4096
+
+ +

Default FileStream buffer size used by .NET

+ +

Definition at line 21 of file DefaultIOManager.cs.

+ +

Referenced by Tgstation.Server.Host.IO.DefaultIOManager.CopyFile(), and Tgstation.Server.Host.IO.DefaultIOManager.ReadAllBytes().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.png b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..0bc7a75c67bded3f7d606d06d88907c8fa5a0c61 GIT binary patch literal 1597 zcmb`H`8U*i7{|XO5?N~0Sf?ysWf_X<&d4-b&wQt0Dl^H_WGi8YsD=uY%PGb_-^wLa zPST~Aj6}p4TQw9K+qDd?$q|_&D+93UP{BFfap>fQK=D51LDzy`m1y)*py43xUKp>Fg4D6Jan=ZLf zsDQL-?R7QNECE37Ey=-_b{R39+YiU#lpIu@Ppquo#A@$#{VoGmt7d5)pAmX9Nra5? zlie&jbMxS0{JGEc@bdD4TJZMxhrFoDNhi3K zWlFw!{)Pj5(7h7g-(v`ePj*){RJC})tqU9BM;*v|MqKJ)&so%mt?uG3e%5!J*$d#f zeQAih+qEZq^yiF<%73Mjw5ABKIFji>^VHZ=t)!VgL`a_Folin!V5PBS@(0oQu!5ArA z@|>cTD`{*YH-Y0p`qqM!lsmt+&43? zU5GGcp*Q8?fC6u12O~QBd7g+!E^i4UR)+a<@k~dL_~8rZr;7CbOmOnt zWO3!J!HeHm@I3vh^$eDu5Awieutxh!q&yL3*R0QV&EJLAa{m+YRpk)i!jbhZcx{jc zlo}!heK#RXgdG_KQjnWsjJZH2QsL)fGBO?0!p|RRkV#jxf+2vxkrmv604FIrb&U_G z|6W{6Sk+dO>_#L%Q)bA|&hqXBJWeXOSa$u4T1&brwz>@-OxHt9oZ$j*S)6>Y6B>A> z5aNYoaj94g3i_0UZ0l9VV$;gkvV{;m9m;44>ak&S`#97b?d-DI9*UA|+jFen3VzzoPu7IdZ0C77HedeA9em##ZVy3x=%V5D9KHrf-F8rfE?6P(`KH(JX5K*We*CG{;v!^DQYKqSf1 zaGkb;EsK!i+CngDZ>x$yl2)L0x60s<*Wvfwx_83dV7qhZjVAVJ40R-p`DzBdjoMvfCQS16|Y6J16L=`B6sQW}D4|qe2(FqF(k{ z+`puQ+JH=ZsfCv9)9*EFDsU{njtJXqasy{LbHY)Sg}1kyKfl_=t7$^pYhS_k%b;}& z!_5ZSrHE$z!sAipK?fqXS}(@7E8lI~M9hE*!$4%#A79vK$){EiY+qrAov+YFj| z8OFjCElF)Mnhi>96o0DtrCk&5h}+jX`)TljhVF~#&{zFSD7bgneDNqlIREB#M>{$v z$-}ZX%zuTr!8c%(I`FwVEOg|@ZLmX6g=fd+1rf<~$+97m;ahsPWycUM?j5cbN)e7S z%^Q>x#5go;{iPO+E+%jy_daqIWl%^<3QOROFvpyHF0AURSTO6 + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.IO.PosixPostWriteHandler Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.IO.PosixPostWriteHandler, including all inherited members.

+ + +
HandleWrite(string filePath)Tgstation.Server.Host.IO.PosixPostWriteHandler
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_post_write_handler.html b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_post_write_handler.html new file mode 100644 index 0000000000..4567e45b6f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_post_write_handler.html @@ -0,0 +1,136 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.IO.PosixPostWriteHandler Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IO.PosixPostWriteHandler Class Reference
+
+
+ +

IPostWriteHandler for POSIX systems + More...

+
+Inheritance diagram for Tgstation.Server.Host.IO.PosixPostWriteHandler:
+
+
+ + +Tgstation.Server.Host.IO.IPostWriteHandler + +
+ + + + + +

+Public Member Functions

void HandleWrite (string filePath)
 For handling system specific necessities after a write More...
 
+

Detailed Description

+

IPostWriteHandler for POSIX systems

+ +

Definition at line 10 of file PosixPostWriteHandler.cs.

+

Member Function Documentation

+ +

◆ HandleWrite()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.IO.PosixPostWriteHandler.HandleWrite (string filePath)
+
+ +

For handling system specific necessities after a write

+ +

Implements Tgstation.Server.Host.IO.IPostWriteHandler.

+ +

Definition at line 13 of file PosixPostWriteHandler.cs.

+
14  {
15  if (filePath == null)
16  throw new ArgumentNullException(nameof(filePath));
17 
18  // set executable bit every time, don't want people calling me when their uploaded "sl" binary doesn't work
19  if (Syscall.stat(filePath, out var stat) != 0)
20  throw new UnixIOException(Stdlib.GetLastError());
21 
22  if (stat.st_mode.HasFlag(FilePermissions.S_IXUSR))
23  return;
24 
25  if (Syscall.chmod(filePath, stat.st_mode | FilePermissions.S_IXUSR) != 0)
26  throw new UnixIOException(Stdlib.GetLastError());
27  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_post_write_handler.png b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_post_write_handler.png new file mode 100644 index 0000000000000000000000000000000000000000..b73ecca63bd5938f79b47265586e018a091b5222 GIT binary patch literal 1108 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y>312~w0q@1)O2au8o@CkAK|NlRb`Qpvj(*8pe zfGjXRaNq!I=N)+y~pR~*-JqgWG zIeB_h=I{ASKJ?7*&(GA`qwe|r*7T=G*WW+ipYgidIsNxjkL!=8w-}%Wtw>(!V|0}NShh1CR`rj_w z?S9(Y@tI}Trfhz1E)!e!a^Ji6lG{~UpHDhlEWEPS-S;skx7DeNcePq_??tv4R~|mL zt03lZX;NLb&WvllkEfcocB5FKGV*Lph?S4(a8oRudSDnz9j)+aGP2+d*G15^~gk?{jiN!(Gk1FLUP zBKg4buHQQ^%{8-Xn{=UuOuc{2ouiH7)#O^&BHN}t^=biUsCbM3~2C~=#(8$M-iJ3$G9(ew1(_o8oW zx-CAe(m4I7_DjjP6L(s&&d&>6HZ3D(>!uv1BewI5&64jYD*t}}DJ`dPmifK;rz20N z&GGEg+!$%|El2PD6#u^;s#BA0+_|s$-v3sf*;KC6SvMUG!|G%5{Z2dW(O5P=?wa)F z + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.IO.PosixSymlinkFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.IO.PosixSymlinkFactory, including all inherited members.

+ + +
CreateSymbolicLink(string targetPath, string linkPath, CancellationToken cancellationToken)Tgstation.Server.Host.IO.PosixSymlinkFactory
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_symlink_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_symlink_factory.html new file mode 100644 index 0000000000..c08869d9fb --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_symlink_factory.html @@ -0,0 +1,150 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.IO.PosixSymlinkFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IO.PosixSymlinkFactory Class Reference
+
+
+ +

ISymlinkFactory for posix systems + More...

+
+Inheritance diagram for Tgstation.Server.Host.IO.PosixSymlinkFactory:
+
+
+ + +Tgstation.Server.Host.IO.ISymlinkFactory + +
+ + + + + +

+Public Member Functions

Task CreateSymbolicLink (string targetPath, string linkPath, CancellationToken cancellationToken)
 Create a symbolic link More...
 
+

Detailed Description

+

ISymlinkFactory for posix systems

+ +

Definition at line 12 of file PosixSymlinkFactory.cs.

+

Member Function Documentation

+ +

◆ CreateSymbolicLink()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.PosixSymlinkFactory.CreateSymbolicLink (string targetPath,
string linkPath,
CancellationToken cancellationToken 
)
+
+ +

Create a symbolic link

+ +

Implements Tgstation.Server.Host.IO.ISymlinkFactory.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_symlink_factory.png b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_symlink_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..f72203e476026692fb2f624af7c4297e8db4d689 GIT binary patch literal 1088 zcmeAS@N?(olHy`uVBq!ia0y~yU=#qd12~w0m+@vXC^I4QmPIXY(Db%47&NT7KEGEt0 z$|tYPJ|BPB{I|X5uI;rqEPiC<>wo|HYvTvmB+EU1P4TWeo)^Q^pZxj%c+Vt}-1rWa zySH>FJXpQ1>XCKH*}eOOPY8e6XDwa+yZFsbvkhUem3hl=J6)d^?YLwvMeZDO1{|9!#VEAhN>5tRiy8H|3^z4dH; z6!^>P@fBx*`)rpMb6=b{J@+|{|)wMAOAb$ap`{wr^_VmMvo#@0nc^7DEP|qslrAs^DW~Kj^9ik-Un%ATQ0#zY7_bZ2dgZfgzZQF@}?+ zKvm#CXyX+T?vk(1K3|u)^K(8!TG<)q9ev-v6~#}^aI*QF={#effkKAt=D8C-FSuyw zu%%X!VS5?3%8y-TdwxmndM5nOXu@KF{R{F^ZqMIa-oHojyX@L`uO6+@J{E2t@;)*9 z@WjsM)vM(`8(zJ3vF`ehtmF=ZbvkV}jGK5{k``S^W!AF4|M1t!{Ze~2e0uPS>x9LQ zvewM_+o218Fy+j34souz?od^tcEUU0o7UE{ z88Q~tr#}05WuxtC5s8w@R5kS*moJ$Yo%posx2;9&%-J$VD~+CeKfHLKS#o>UJm+ + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.IO.ResolvingIOManager Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.IO.ResolvingIOManager, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
ConcatPath(params string[] paths)Tgstation.Server.Host.IO.DefaultIOManager
CopyDirectory(string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
CopyFile(string src, string dest, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
CreateDirectory(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
DefaultBufferSizeTgstation.Server.Host.IO.DefaultIOManager
DeleteDirectory(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
DeleteFile(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
DirectoryExists(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
DownloadFile(Uri url, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
FileExists(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
GetDirectories(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
GetDirectoryName(string path)Tgstation.Server.Host.IO.DefaultIOManager
GetFileName(string path)Tgstation.Server.Host.IO.DefaultIOManager
GetFileNameWithoutExtension(string path)Tgstation.Server.Host.IO.DefaultIOManager
GetFiles(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
GetFilesWithExtension(string path, string extension, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
MoveDirectory(string source, string destination, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
MoveFile(string source, string destination, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
PathContainsParentAccess(string path)Tgstation.Server.Host.IO.DefaultIOManager
ReadAllBytes(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
ResolvePath(string path)Tgstation.Server.Host.IO.ResolvingIOManagervirtual
ResolvingIOManager(IIOManager parent, string subdirectory)Tgstation.Server.Host.IO.ResolvingIOManager
subdirectoryTgstation.Server.Host.IO.ResolvingIOManagerprivate
WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
ZipToDirectory(string path, byte[] zipFileBytes, CancellationToken cancellationToken)Tgstation.Server.Host.IO.DefaultIOManager
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_resolving_i_o_manager.html b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_resolving_i_o_manager.html new file mode 100644 index 0000000000..8acb47d08c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_resolving_i_o_manager.html @@ -0,0 +1,303 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.IO.ResolvingIOManager Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IO.ResolvingIOManager Class Reference
+
+
+ +

An IIOManager that resolve relative paths from another IIOManager to a subdirectory of that + More...

+
+Inheritance diagram for Tgstation.Server.Host.IO.ResolvingIOManager:
+
+
+ + +Tgstation.Server.Host.IO.DefaultIOManager +Tgstation.Server.Host.IO.IIOManager + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ResolvingIOManager (IIOManager parent, string subdirectory)
 Construct a ResolvingIOManager More...
 
override string ResolvePath (string path)
 Retrieve the full path of some path given a relative path. Must be used before passing relative paths to other APIs. All other operations in this interface call this internally on given paths More...
 
- Public Member Functions inherited from Tgstation.Server.Host.IO.DefaultIOManager
async Task CopyDirectory (string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)
 Copies a directory from src to dest More...
 
string ConcatPath (params string[] paths)
 Combines an array of strings into a path More...
 
async Task CopyFile (string src, string dest, CancellationToken cancellationToken)
 Copy a file from src to dest More...
 
Task CreateDirectory (string path, CancellationToken cancellationToken)
 Create a directory at path More...
 
async Task DeleteDirectory (string path, CancellationToken cancellationToken)
 Recursively delete a directory More...
 
Task DeleteFile (string path, CancellationToken cancellationToken)
 Deletes a file at path More...
 
Task< bool > FileExists (string path, CancellationToken cancellationToken)
 Check that the file at path exists More...
 
Task< bool > DirectoryExists (string path, CancellationToken cancellationToken)
 Check that the directory at path exists More...
 
string GetDirectoryName (string path)
 Gets the directory portion of a given path More...
 
string GetFileName (string path)
 Gets the file name portion of a path More...
 
string GetFileNameWithoutExtension (string path)
 Gets the file name portion of a path with More...
 
Task< List< string > > GetFilesWithExtension (string path, string extension, CancellationToken cancellationToken)
 Gets a list of files in path with the given extension More...
 
Task MoveFile (string source, string destination, CancellationToken cancellationToken)
 Moves a file at source to destination More...
 
Task MoveDirectory (string source, string destination, CancellationToken cancellationToken)
 Moves a directory at source to destination More...
 
async Task< byte[]> ReadAllBytes (string path, CancellationToken cancellationToken)
 Returns all the contents of a file at path as a byte array More...
 
async Task WriteAllBytes (string path, byte[] contents, CancellationToken cancellationToken)
 Writes some contents to a file at path overwriting previous content More...
 
Task< IReadOnlyList< string > > GetDirectories (string path, CancellationToken cancellationToken)
 Returns directory names in a given path More...
 
Task< IReadOnlyList< string > > GetFiles (string path, CancellationToken cancellationToken)
 Returns file names in a given path More...
 
async Task< byte[]> DownloadFile (Uri url, CancellationToken cancellationToken)
 Downloads a file from url More...
 
Task ZipToDirectory (string path, byte[] zipFileBytes, CancellationToken cancellationToken)
 Extract a set of zipFileBytes to a given path More...
 
bool PathContainsParentAccess (string path)
 Check if a path contains the '..' parent directory accessor More...
 
+ + + + +

+Private Attributes

readonly string subdirectory
 Path to the subdirectory attached to path resolutions More...
 
+ + + + + +

+Additional Inherited Members

- Public Attributes inherited from Tgstation.Server.Host.IO.DefaultIOManager
const int DefaultBufferSize = 4096
 Default FileStream buffer size used by .NET More...
 
+

Detailed Description

+

An IIOManager that resolve relative paths from another IIOManager to a subdirectory of that

+ +

Definition at line 9 of file ResolvingIOManager.cs.

+

Constructor & Destructor Documentation

+ +

◆ ResolvingIOManager()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.IO.ResolvingIOManager.ResolvingIOManager (IIOManager parent,
string subdirectory 
)
+
+ +

Construct a ResolvingIOManager

+
Parameters
+ + + +
parentThe IIOManager that resolves to the directory to work out of
subdirectoryThe value of subdirectory
+
+
+ +

Definition at line 21 of file ResolvingIOManager.cs.

+
22  {
23  if (parent == null)
24  throw new ArgumentNullException(nameof(parent));
25  if (subdirectory == null)
26  throw new ArgumentNullException(nameof(subdirectory));
27 
28  this.subdirectory = ConcatPath(parent.ResolvePath("."), subdirectory);
29  }
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
readonly string subdirectory
Path to the subdirectory attached to path resolutions
+
+

References Tgstation.Server.Host.IO.DefaultIOManager.ConcatPath(), Tgstation.Server.Host.IO.IIOManager.ResolvePath(), and Tgstation.Server.Host.IO.ResolvingIOManager.subdirectory.

+ +
+
+

Member Function Documentation

+ +

◆ ResolvePath()

+ +
+
+ + + + + +
+ + + + + + + + +
override string Tgstation.Server.Host.IO.ResolvingIOManager.ResolvePath (string path)
+
+virtual
+
+ +

Retrieve the full path of some path given a relative path. Must be used before passing relative paths to other APIs. All other operations in this interface call this internally on given paths

+ +

Reimplemented from Tgstation.Server.Host.IO.DefaultIOManager.

+ +

Definition at line 32 of file ResolvingIOManager.cs.

+
33  {
34  if (!Path.IsPathRooted(path))
35  return base.ResolvePath(ConcatPath(subdirectory, path));
36  return path;
37  }
string ConcatPath(params string[] paths)
Combines an array of strings into a path
+
readonly string subdirectory
Path to the subdirectory attached to path resolutions
+
+

References Tgstation.Server.Host.IO.DefaultIOManager.ConcatPath(), and Tgstation.Server.Host.IO.ResolvingIOManager.subdirectory.

+ +
+
+

Member Data Documentation

+ +

◆ subdirectory

+ +
+
+ + + + + +
+ + + + +
readonly string Tgstation.Server.Host.IO.ResolvingIOManager.subdirectory
+
+private
+
+ +

Path to the subdirectory attached to path resolutions

+ +

Definition at line 14 of file ResolvingIOManager.cs.

+ +

Referenced by Tgstation.Server.Host.IO.ResolvingIOManager.ResolvePath(), and Tgstation.Server.Host.IO.ResolvingIOManager.ResolvingIOManager().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_resolving_i_o_manager.png b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_resolving_i_o_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..f0751f911feb58b82c4f48a9c7bf79430efedd19 GIT binary patch literal 1594 zcmb`H`#02i9LB%1zCW6ie)txFg?$R)YVWGc7ZD!EM3%zP;n zZBwJ0+i}Y!%&c3DqH-A_6fHKwhNh6&Y0vIC{(wH`ygtwKKIeVT`5ecpUfIvxnhU_NEj}6Q@D-pHBBzFg~SS+#Av&&J;7M8^Q3!l%IV!Yld8D&qq zI=caqrEjml)7=OFqy!Mb);$*Sp>X8n(k?{;bJ!zJ>^M4TsAg>aQ0I{J30Hm2TAB(|8T$HVMGf*gPU+YJ4RWq^g}f0O3*gCdG|a-W zOL)u9+M#97*}rKNtlyayj&urQJzp&`6}uU2x7Ctwc&v#};q$dBikua@o$&Sb^fYC& zHLv%?o}%WMiGrAxM|F?MV|S_dmR`EfR1PW83cNrUAGR=bEHPSj7|}+y~yj`>ZE_0La3GrJ$OkpWlRZ(yP<3U#j z(XwyyBx+Cr4lp&LhT-KiEP4#ubm=ogIGOBR;+gP?wd1$^r|lKoeqxVkh0^p!4I6>r z>^|LQat--Woo%I!xx;v1Zmf1qbQY*rtsj`m<)45kTA7q=2NTr+qWWW%OcU=+jHhE; z#mF=L%5pEQua(0~Q>UBiG9{T1-$F6K{Ehe$KP8U2y+wRR zulzvNMxDLV+$@QL4-Qe%lmRO5swVvKLiZeyhmt$1%l^)iqzF@oAG#;J0$ep6QF8v0 zApU=64@{0YC;V0dW({-{pVW@r<`b7JCir9@pFE1-lxcjk+5bsG7j*_bP(A zOQ~g@0US4=$cJcYk_|KM2ZIsf%@q4$ER(LS~c+R;vx+K8uCaXjmS&>|ORgalqsSs%8I{<&l zs`_Y+*=B$J_i^@EN{aG{f<@<8)%RYttJ~#0EXe8sJNL1@l#B5`pVm6^BRb-KA(J#h zV$d2kvmI!bWxWWIRMM<03UX$0_Z0#>+c8GGVaOBsS|h-NB;G0{Iuckvs*M8Na0r9{ hq=^+V{IIBHai=Mjx>$Iq*+WwF0Oa6ID6{iF{}1S1&-VZT literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager-members.html b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager-members.html new file mode 100644 index 0000000000..4cbfe2246b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager-members.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.IO.SynchronousIOManager Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.IO.SynchronousIOManager, including all inherited members.

+ + + + + + + + +
CreateDirectory(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.SynchronousIOManager
DeleteDirectory(string path)Tgstation.Server.Host.IO.SynchronousIOManager
GetDirectories(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.SynchronousIOManager
GetFiles(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.SynchronousIOManager
IsDirectory(string path)Tgstation.Server.Host.IO.SynchronousIOManager
ReadFile(string path)Tgstation.Server.Host.IO.SynchronousIOManager
WriteFileChecked(string path, byte[] data, ref string sha1InOut, CancellationToken cancellationToken)Tgstation.Server.Host.IO.SynchronousIOManager
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.html b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.html new file mode 100644 index 0000000000..e991eb48f4 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.html @@ -0,0 +1,354 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.IO.SynchronousIOManager Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IO.SynchronousIOManager Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.IO.SynchronousIOManager:
+
+
+ + +Tgstation.Server.Host.IO.ISynchronousIOManager + +
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

bool CreateDirectory (string path, CancellationToken cancellationToken)
 Create an empty directory at path More...
 
bool DeleteDirectory (string path)
 Deletes a directory at path if it's empty More...
 
IEnumerable< string > GetDirectories (string path, CancellationToken cancellationToken)
 Enumerate directories in a given path More...
 
IEnumerable< string > GetFiles (string path, CancellationToken cancellationToken)
 Enumerate files in a given path More...
 
bool IsDirectory (string path)
 Checks if a given path is a directory More...
 
byte [] ReadFile (string path)
 Read the bytes of a file at a given path More...
 
bool WriteFileChecked (string path, byte[] data, ref string sha1InOut, CancellationToken cancellationToken)
 Write data to a file at a given path More...
 
+

Detailed Description

+
+

Definition at line 12 of file SynchronousIOManager.cs.

+

Member Function Documentation

+ +

◆ CreateDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + +
bool Tgstation.Server.Host.IO.SynchronousIOManager.CreateDirectory (string path,
CancellationToken cancellationToken 
)
+
+ +

Create an empty directory at path

+ +

Implements Tgstation.Server.Host.IO.ISynchronousIOManager.

+ +

Definition at line 15 of file SynchronousIOManager.cs.

+
16  {
17  if (IsDirectory(path))
18  return true;
19  cancellationToken.ThrowIfCancellationRequested();
20  Directory.CreateDirectory(path);
21  return false;
22  }
bool IsDirectory(string path)
Checks if a given path is a directory
+
+

References Tgstation.Server.Host.IO.SynchronousIOManager.IsDirectory().

+ +
+
+ +

◆ DeleteDirectory()

+ +
+
+ + + + + + + + +
bool Tgstation.Server.Host.IO.SynchronousIOManager.DeleteDirectory (string path)
+
+ +

Deletes a directory at path if it's empty

+ +

Implements Tgstation.Server.Host.IO.ISynchronousIOManager.

+ +

Definition at line 25 of file SynchronousIOManager.cs.

+
26  {
27  if (File.Exists(path))
28  return false;
29 
30  if (!Directory.Exists(path))
31  return true;
32 
33  if (Directory.EnumerateFileSystemEntries(path).Any())
34  return false;
35 
36  Directory.Delete(path);
37  return true;
38  }
+
+
+ +

◆ GetDirectories()

+ +
+
+ + + + + + + + + + + + + + + + + + +
IEnumerable<string> Tgstation.Server.Host.IO.SynchronousIOManager.GetDirectories (string path,
CancellationToken cancellationToken 
)
+
+ +

Enumerate directories in a given path

+ +

Implements Tgstation.Server.Host.IO.ISynchronousIOManager.

+ +

Definition at line 41 of file SynchronousIOManager.cs.

+
42  {
43  foreach (var I in Directory.EnumerateDirectories(path))
44  {
45  yield return Path.GetFileName(I);
46  cancellationToken.ThrowIfCancellationRequested();
47  }
48  }
+
+
+ +

◆ GetFiles()

+ +
+
+ + + + + + + + + + + + + + + + + + +
IEnumerable<string> Tgstation.Server.Host.IO.SynchronousIOManager.GetFiles (string path,
CancellationToken cancellationToken 
)
+
+ +

Enumerate files in a given path

+ +

Implements Tgstation.Server.Host.IO.ISynchronousIOManager.

+ +

Definition at line 51 of file SynchronousIOManager.cs.

+
52  {
53  foreach (var I in Directory.EnumerateFiles(path))
54  {
55  yield return Path.GetFileName(I);
56  cancellationToken.ThrowIfCancellationRequested();
57  }
58  }
+
+
+ +

◆ IsDirectory()

+ +
+
+ + + + + + + + +
bool Tgstation.Server.Host.IO.SynchronousIOManager.IsDirectory (string path)
+
+ +

Checks if a given path is a directory

+ +

Implements Tgstation.Server.Host.IO.ISynchronousIOManager.

+ +

Definition at line 61 of file SynchronousIOManager.cs.

+
62  {
63  if (path == null)
64  throw new ArgumentNullException(nameof(path));
65  return Directory.Exists(path);
66  }
+

Referenced by Tgstation.Server.Host.IO.SynchronousIOManager.CreateDirectory().

+ +
+
+ +

◆ ReadFile()

+ +
+
+ + + + + + + + +
byte [] Tgstation.Server.Host.IO.SynchronousIOManager.ReadFile (string path)
+
+ +

Read the bytes of a file at a given path

+ +

Implements Tgstation.Server.Host.IO.ISynchronousIOManager.

+ +

Definition at line 69 of file SynchronousIOManager.cs.

+
70  {
71  if (path == null)
72  throw new ArgumentNullException(nameof(path));
73  return File.ReadAllBytes(path);
74  }
+
+
+ +

◆ WriteFileChecked()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
bool Tgstation.Server.Host.IO.SynchronousIOManager.WriteFileChecked (string path,
byte [] data,
ref string sha1InOut,
CancellationToken cancellationToken 
)
+
+ +

Write data to a file at a given path

+ +

Implements Tgstation.Server.Host.IO.ISynchronousIOManager.

+ +

Definition at line 77 of file SynchronousIOManager.cs.

+
78  {
79  if (path == null)
80  throw new ArgumentNullException(nameof(path));
81  cancellationToken.ThrowIfCancellationRequested();
82  var directory = Path.GetDirectoryName(path);
83  Directory.CreateDirectory(directory);
84  cancellationToken.ThrowIfCancellationRequested();
85  using (var file = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
86  {
87  cancellationToken.ThrowIfCancellationRequested();
88 
89  // as nice as it would be to not have to arrayify the memory stream, we have to
90  // because, oddly enough sha1(memorystream) != sha1(memorystream.ToArray())
91  // vOv
92  byte[] originalBytes;
93  using (var readMs = new MemoryStream())
94  {
95  file.CopyTo(readMs);
96  originalBytes = readMs.ToArray();
97  }
98 
99  // no sha1? no write
100  if (originalBytes.Length != 0 && sha1InOut == null)
101  return false;
102 
103  // suppressed due to only using for consistency checks
104 #pragma warning disable CA5350 // Do not use insecure cryptographic algorithm SHA1.
105  using (var sha1 = new SHA1Managed())
106 #pragma warning restore CA5350 // Do not use insecure cryptographic algorithm SHA1.
107  {
108  string GetSha1(byte[] dataToHash) => dataToHash != null && dataToHash.Length != 0 ? String.Join(String.Empty, sha1.ComputeHash(dataToHash).Select(b => b.ToString("x2", CultureInfo.InvariantCulture))) : null;
109  var originalSha1 = GetSha1(originalBytes);
110  if (originalSha1 != sha1InOut)
111  {
112  sha1InOut = originalSha1;
113  return false;
114  }
115 
116  sha1InOut = GetSha1(data);
117  }
118 
119  cancellationToken.ThrowIfCancellationRequested();
120 
121  if (data != null)
122  {
123  file.Seek(0, SeekOrigin.Begin);
124 
125  cancellationToken.ThrowIfCancellationRequested();
126  file.SetLength(data.Length);
127  file.Write(data, 0, data.Length);
128  }
129  }
130 
131  if (data == null)
132  File.Delete(path);
133  return true;
134  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.png b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..394ee750f0e20cd11840cf8b812c0947b0cc7f80 GIT binary patch literal 1175 zcmeAS@N?(olHy`uVBq!ia0y~yVAKS%12~w0WRYw!FOZT5@CkAK|NlRb`Qpvj(*8pe zfGjXRaNq!I=N)+E(H8@uVp#u2Yt%Xf9Gw^%PXq z^z2$ON$b76=d;Yi*SEjh{_F4tk4b4&{;$>JAAdf4>(~F&liw}~w%$E!wRe5`p=(!m zT$(s(iQ~DgDr>i@Ud?}e@!NaPyU+CgT;$RB+{+VEoX+>IK788w&h68~m`&rayZk>j zd6j+0>vd_j+rJj_y*83QoVmBUw3kOb{obTmYjZea{@AWOJ*hV2ik$Jmv}4Coos2be zmat9c4x0N`Y+CO@t2fGF6RY#w#pizYO8(kc@3iV>>1_!~i7?k7b?XxIhqqko3oUOu z=jzCuTejZg=N;aeB_H)YW=gz%7q(=b%9dH{7v2b;JS$7@+7hed^$uBOzj7RJ-uW3Q z|G(?X-)up1 z4_|d_Kdc~XnHy#|&+hi`ckfERvEA1C)nwXxC@O3HoxLel^Y{AXNB_&{`R*it_`=&7 zcH_-%QSa~Wym$eq{oB2XOWt36&OEE)jpx_xTUGvM*ILYDZCbc2>!|mo@)wUko)J9b zH(zC`%1(7p&mb31uSrT?L6bxRCrw(?5x1o8u|?4FLYebSKdk;TEMYM73SwaV`$t8q zVecdn2M7ItPOgO2Dy#y*MNAzUo{TP2mM{QyGXSHup#!ME#gj{65l}jC5~b2FtUad& zd99ifWVQ(C47sUj_L#4%I>`JMl!`1b6$&2kd7t_B$*Z~zUsHaR-z?qs`ck}j$J&*J zA1~*daW$;nw&d7cn<`e0lQ;K$aKHT94*%W + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.IO.Tests.TestConsole Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_console.html b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_console.html new file mode 100644 index 0000000000..487bf7e0a2 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_console.html @@ -0,0 +1,138 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.IO.Tests.TestConsole Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IO.Tests.TestConsole Class Reference
+
+
+ + + + + + +

+Public Member Functions

async Task TestWriteLine ()
 
void TestUserInteractive ()
 
+

Detailed Description

+
+

Definition at line 10 of file TestConsole.cs.

+

Member Function Documentation

+ +

◆ TestUserInteractive()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.IO.Tests.TestConsole.TestUserInteractive ()
+
+ +

Definition at line 29 of file TestConsole.cs.

+
30  {
31  var console = new Console();
32  Assert.AreEqual(Environment.UserInteractive, console.Available);
33  }
+
+
+ +

◆ TestWriteLine()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.IO.Tests.TestConsole.TestWriteLine ()
+
+ +

Definition at line 13 of file TestConsole.cs.

+
14  {
15  var console = new Console();
16  await Assert.ThrowsExceptionAsync<InvalidOperationException>(() => console.WriteAsync(null, false, default)).ConfigureAwait(false);
17  try
18  {
19  await console.WriteAsync(null, true, default).ConfigureAwait(false);
20  await console.WriteAsync(String.Empty, false, default).ConfigureAwait(true);
21  }
22  catch(InvalidOperationException)
23  {
24  Assert.IsFalse(console.Available);
25  }
26  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_post_write_handler-members.html b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_post_write_handler-members.html new file mode 100644 index 0000000000..6937c36e35 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_post_write_handler-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.IO.Tests.TestPostWriteHandler Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_post_write_handler.html b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_post_write_handler.html new file mode 100644 index 0000000000..a7176ffade --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_post_write_handler.html @@ -0,0 +1,163 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.IO.Tests.TestPostWriteHandler Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IO.Tests.TestPostWriteHandler Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

void TestThrowsWithNullArg ()
 
void TestPostWrite ()
 
void TestThrowsOnUnix ()
 
+

Detailed Description

+
+

Definition at line 12 of file TestPostWriteHandler.cs.

+

Member Function Documentation

+ +

◆ TestPostWrite()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.IO.Tests.TestPostWriteHandler.TestPostWrite ()
+
+ +

Definition at line 28 of file TestPostWriteHandler.cs.

+
29  {
30  IPostWriteHandler postWriteHandler;
31  var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
32  if (isWindows)
33  postWriteHandler = new WindowsPostWriteHandler();
34  else
35  postWriteHandler = new PosixPostWriteHandler();
36 
37  //test on a valid file first
38  var tmpFile = Path.GetTempFileName();
39  try
40  {
41  postWriteHandler.HandleWrite(tmpFile);
42 
43  if (isWindows)
44  return; //you do nothing
45 
46  //ensure it is now executable
47  File.WriteAllBytes(tmpFile, Encoding.UTF8.GetBytes("#!/bin/sh\n"));
48 
49  using (var process = Process.Start(tmpFile))
50  {
51  process.WaitForExit();
52  Assert.AreEqual(0, process.ExitCode);
53  }
54 
55  //run it again for the code coverage on that part where no changes are made if it's already executable
56  postWriteHandler.HandleWrite(tmpFile);
57  }
58  finally
59  {
60  File.Delete(tmpFile);
61  }
62  }
+

References Tgstation.Server.Host.IO.IPostWriteHandler.HandleWrite().

+ +
+
+ +

◆ TestThrowsOnUnix()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.IO.Tests.TestPostWriteHandler.TestThrowsOnUnix ()
+
+ +

Definition at line 65 of file TestPostWriteHandler.cs.

+
66  {
67  if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
68  return;
69  var postWriteHandler = new PosixPostWriteHandler();
70  var tmpFile = Path.GetTempFileName();
71  File.Delete(tmpFile);
72  Assert.ThrowsException<UnixIOException>(() => postWriteHandler.HandleWrite(tmpFile));
73  }
+
+
+ +

◆ TestThrowsWithNullArg()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.IO.Tests.TestPostWriteHandler.TestThrowsWithNullArg ()
+
+ +

Definition at line 15 of file TestPostWriteHandler.cs.

+
16  {
17  IPostWriteHandler postWriteHandler;
18  var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
19  if (isWindows)
20  postWriteHandler = new WindowsPostWriteHandler();
21  else
22  postWriteHandler = new PosixPostWriteHandler();
23 
24  Assert.ThrowsException<ArgumentNullException>(() => postWriteHandler.HandleWrite(null));
25  }
+

References Tgstation.Server.Host.IO.IPostWriteHandler.HandleWrite().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory-members.html b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory-members.html new file mode 100644 index 0000000000..2067d20ec7 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory-members.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.IO.Tests.TestSymlinkFactory Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory.html new file mode 100644 index 0000000000..c2025ac72a --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory.html @@ -0,0 +1,265 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.IO.Tests.TestSymlinkFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IO.Tests.TestSymlinkFactory Class Reference
+
+
+ + + + + + + + + + +

+Public Member Functions

void SelectFactory ()
 
async Task TestFileWorks ()
 
async Task TestDirectoryWorks ()
 
async Task TestFailsProperly ()
 
+ + + +

+Static Public Member Functions

static bool HasPermissionToMakeSymlinks ()
 
+ + + +

+Private Attributes

ISymlinkFactory symlinkFactory
 
+

Detailed Description

+
+

Definition at line 11 of file TestSymlinkFactory.cs.

+

Member Function Documentation

+ +

◆ HasPermissionToMakeSymlinks()

+ +
+
+ + + + + +
+ + + + + + + +
static bool Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.HasPermissionToMakeSymlinks ()
+
+static
+
+ +

Definition at line 24 of file TestSymlinkFactory.cs.

+
25  {
26  if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
27  return true;
28  var identity = WindowsIdentity.GetCurrent();
29  var principal = new WindowsPrincipal(identity);
30  return principal.IsInRole(WindowsBuiltInRole.Administrator);
31  }
+

Referenced by Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.TestDirectoryWorks(), and Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.TestFileWorks().

+ +
+
+ +

◆ SelectFactory()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.SelectFactory ()
+
+ +

Definition at line 16 of file TestSymlinkFactory.cs.

+
17  {
18  if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
19  symlinkFactory = new WindowsSymlinkFactory();
20  else
21  symlinkFactory = new PosixSymlinkFactory();
22  }
+
+

References Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.symlinkFactory.

+ +
+
+ +

◆ TestDirectoryWorks()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.TestDirectoryWorks ()
+
+ +

Definition at line 63 of file TestSymlinkFactory.cs.

+
64  {
66  Assert.Inconclusive("Current user does not have permission to create symlinks!");
67  const string FileName = "TestFile.txt";
68  const string Text = "Hello world";
69  string f2 = null;
70  var f1 = Path.GetTempFileName();
71  File.Delete(f1);
72  Directory.CreateDirectory(f1);
73  try
74  {
75  f2 = f1 + ".linked";
76  var p1 = Path.Combine(f1, FileName);
77  File.WriteAllText(p1, Text);
78 
79  await Assert.ThrowsExceptionAsync<ArgumentNullException>(() => symlinkFactory.CreateSymbolicLink(null, null, default)).ConfigureAwait(false);
80  await Assert.ThrowsExceptionAsync<ArgumentNullException>(() => symlinkFactory.CreateSymbolicLink(f1, null, default)).ConfigureAwait(false);
81 
82  await symlinkFactory.CreateSymbolicLink(f1, f2, default).ConfigureAwait(false);
83 
84  var p2 = Path.Combine(f2, FileName);
85  Assert.IsTrue(File.Exists(p2));
86 
87  var f2Contents = File.ReadAllText(p2);
88  Assert.AreEqual(Text, f2Contents);
89 
90  File.Delete(p2);
91  Assert.IsFalse(File.Exists(p1));
92  }
93  finally
94  {
95  Directory.Delete(f2, true);
96  Directory.Delete(f1, true);
97  }
98  }
+ + +
+

References Tgstation.Server.Host.IO.ISymlinkFactory.CreateSymbolicLink(), Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.HasPermissionToMakeSymlinks(), and Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.symlinkFactory.

+ +
+
+ +

◆ TestFailsProperly()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.TestFailsProperly ()
+
+ +

Definition at line 101 of file TestSymlinkFactory.cs.

+
102  {
103  const string BadPath = "/../../?>!@#$%^&*()O(UF+}P{{??>/////";
104 
105  try
106  {
107  await symlinkFactory.CreateSymbolicLink(BadPath, BadPath, default).ConfigureAwait(false);
108  Assert.Fail("No exception thrown!");
109  }
110  catch { }
111  }
+ +
+

References Tgstation.Server.Host.IO.ISymlinkFactory.CreateSymbolicLink(), and Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.symlinkFactory.

+ +
+
+ +

◆ TestFileWorks()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.TestFileWorks ()
+
+ +

Definition at line 34 of file TestSymlinkFactory.cs.

+
35  {
37  Assert.Inconclusive("Current user does not have permission to create symlinks!");
38  const string Text = "Hello world";
39  string f2 = null;
40  var f1 = Path.GetTempFileName();
41  try
42  {
43  f2 = f1 + ".linked";
44  File.WriteAllText(f1, Text);
45 
46  await Assert.ThrowsExceptionAsync<ArgumentNullException>(() => symlinkFactory.CreateSymbolicLink(null, null, default)).ConfigureAwait(false);
47  await Assert.ThrowsExceptionAsync<ArgumentNullException>(() => symlinkFactory.CreateSymbolicLink(f1, null, default)).ConfigureAwait(false);
48 
49  await symlinkFactory.CreateSymbolicLink(f1, f2, default).ConfigureAwait(false);
50  Assert.IsTrue(File.Exists(f2));
51 
52  var f2Contents = File.ReadAllText(f2);
53  Assert.AreEqual(Text, f2Contents);
54  }
55  finally
56  {
57  File.Delete(f2);
58  File.Delete(f1);
59  }
60  }
+ + +
+

References Tgstation.Server.Host.IO.ISymlinkFactory.CreateSymbolicLink(), Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.HasPermissionToMakeSymlinks(), and Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.symlinkFactory.

+ +
+
+

Member Data Documentation

+ +

◆ symlinkFactory

+ + +
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_post_write_handler-members.html b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_post_write_handler-members.html new file mode 100644 index 0000000000..6bf32eb23e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_post_write_handler-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.IO.WindowsPostWriteHandler Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.IO.WindowsPostWriteHandler, including all inherited members.

+ + +
HandleWrite(string filePath)Tgstation.Server.Host.IO.WindowsPostWriteHandler
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_post_write_handler.html b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_post_write_handler.html new file mode 100644 index 0000000000..b01335e0ed --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_post_write_handler.html @@ -0,0 +1,136 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.IO.WindowsPostWriteHandler Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IO.WindowsPostWriteHandler Class Reference
+
+
+ +

IPostWriteHandler for Windows systems + More...

+
+Inheritance diagram for Tgstation.Server.Host.IO.WindowsPostWriteHandler:
+
+
+ + +Tgstation.Server.Host.IO.IPostWriteHandler + +
+ + + + + +

+Public Member Functions

void HandleWrite (string filePath)
 For handling system specific necessities after a write More...
 
+

Detailed Description

+

IPostWriteHandler for Windows systems

+ +

Definition at line 8 of file WindowsPostWriteHandler.cs.

+

Member Function Documentation

+ +

◆ HandleWrite()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.IO.WindowsPostWriteHandler.HandleWrite (string filePath)
+
+ +

For handling system specific necessities after a write

+ +

Implements Tgstation.Server.Host.IO.IPostWriteHandler.

+ +

Definition at line 11 of file WindowsPostWriteHandler.cs.

+
12  {
13  if (filePath == null)
14  throw new ArgumentNullException(nameof(filePath));
15  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_post_write_handler.png b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_post_write_handler.png new file mode 100644 index 0000000000000000000000000000000000000000..cf6a12022e7e03e520afd8691dd6393b259975e9 GIT binary patch literal 1154 zcmeAS@N?(olHy`uVBq!ia0y~yVAKb)12~w0WIZ#p7m$(&@CkAK|NlRb`Qpvj(*8pe zfGjXRaNq!I=N)+CeDP%I@m=eqTU0%@RV(+(c%QY&lIov%;p45(7vpax zKX6#%bMHe`TS3gjpRMtxYC9^EPpf7ww9$WFRx#gGBFQ)CLP%Owt4+Be+r6*Zv;NzK z*xhOF*Q^dc@%pxo=VZIbsTyBo&R6*E{HmSVF7`Zo#}2Fb(-WrcIhNLPfO);ZG?leq z6xW~rE%7_5!N|*J#e>4iM|OHnT*{Y^+F3@_-828RYkhonoLzV5?fq-wU;mSs8S^RX zs($f?f5&RK{JmJRUSU+@ji8;g_5vN2U|2D;S@I?qL8% zCPSsDe#0K1VhW}0r-f&)of?&`t19Kdsjv{uo>zOSzOo-PuCv>>cIUZnhOnyNjBh^w z`}=Fdwt4aQK6(4?)qP|?t=xCzn&w>|H|MPXnY)Gi!Pe)T1*@au&V`*ZI{5m?pF@|* zKUKZCc=}iIuHW1H-_7gqmFfPz@c9oqmrXUuGU{`Fg)ywqbuVXL_5^P-D*EaN7h6kWg6{qgN0gK6iK?DGEnIkdj3@0pHT z+_^q(+X)6oqy$W^_QolmkFAJ%wq{;!#IwD1zR%j1Hssr}_(SyJF;?7-CYF1spv0U-|gTzxwXJ3D^JGM`3LC?TU!HQu$bJi-)BJ z9g05=2CPWSziw@m`}p|R?6arax4wEj{j0Xw4%77kFa3=^KRaKs_EmUENx6J(y@{^c z7x(H{)y{@5LX^m@MM*H2~*#)`G?lpQz|!q6h!wqonGsFho<8U13GjI)nA^q0j2SYR-Cy85}S Ib4q9e0Jp0`fB*mh literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_symlink_factory-members.html b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_symlink_factory-members.html new file mode 100644 index 0000000000..b9d79fd540 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_symlink_factory-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + + +
+
+
Tgstation.Server.Host.IO.WindowsSymlinkFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.IO.WindowsSymlinkFactory, including all inherited members.

+ + +
CreateSymbolicLink(string targetPath, string linkPath, CancellationToken cancellationToken)Tgstation.Server.Host.IO.WindowsSymlinkFactory
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_symlink_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_symlink_factory.html new file mode 100644 index 0000000000..dc2f948819 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_symlink_factory.html @@ -0,0 +1,150 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.IO.WindowsSymlinkFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IO.WindowsSymlinkFactory Class Reference
+
+
+ +

ISymlinkFactory for windows systems + More...

+
+Inheritance diagram for Tgstation.Server.Host.IO.WindowsSymlinkFactory:
+
+
+ + +Tgstation.Server.Host.IO.ISymlinkFactory + +
+ + + + + +

+Public Member Functions

Task CreateSymbolicLink (string targetPath, string linkPath, CancellationToken cancellationToken)
 Create a symbolic link More...
 
+

Detailed Description

+

ISymlinkFactory for windows systems

+ +

Definition at line 12 of file WindowsSymlinkFactory.cs.

+

Member Function Documentation

+ +

◆ CreateSymbolicLink()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.WindowsSymlinkFactory.CreateSymbolicLink (string targetPath,
string linkPath,
CancellationToken cancellationToken 
)
+
+ +

Create a symbolic link

+ +

Implements Tgstation.Server.Host.IO.ISymlinkFactory.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_symlink_factory.png b/class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_symlink_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..a403280555ebb165303ec9a4a624cba0b1ee1728 GIT binary patch literal 1156 zcmeAS@N?(olHy`uVBq!ia0y~yU{nFJ12~w0Wc%YEdx4ZhfKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+1Bm;}SlSk_R$tiC8YyU{ioB3Wv^V+{#KRy-y-xU#kUY`5*x#@>r9r-!+_@pgCHIvSn zxyP%V%;xu-u)n|>$eMkO)EIO`~BZZOIq)>eA%QeY8-Ng+^R`rE;ucotI zxmchkK7sA_`Px+r)=W1m+yCXkk+lF(OE^P`NS z%Qssl|LW8?DLZvl;qu)xeI?PlR>k^LFTW7KemBa$`0m-%r7CAdoTV~6FSWnWYk$}D z#f^Ky68WqBhE=~+zQ$>J&R;M;`ODmr$xHq(#|VA73Bafcy1gyeo3UobK87HMY*m$p z?AlsY)dp`6%T@x&(gv~uIyn>qoR~PKOkiLFaveB1smZ;-?xeMJN{HstHLi>vjBC&= z2~oUi#P{W5zWn}Y2Iu7&&y=iTzEOB*zuvWLpN}j4KUuZ4Rr_2MuUNt3Lq+vvb(to7 z54N(i3uv`G$&vJEkUV`fY~7BPJB9DJeNp&R^lm5PyZd&#t?zAHSii^LHa`2~SIzhF zwE=5)zm;3@mj6}PHQwKCM{n+X^}dArYublf?ynEeaIl)TrP)dTS?j4QN1xbb2J>Ay z`Gn_EiR~=J>-Yd3g-4(cQCeJhq$8$(+A% zUH&%y<@3ciERK&U&$c~Vy8U6m?N>%~DjMQf?EVw)B-L$nK>zaFo^$Fe&E0`wza@Py w^C~>807gD2Wxx`^mxd58&6Po3k+1BPX4%RyO)q!@EHW58UHx3vIVCg!0Az0%L;wH) literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot-members.html new file mode 100644 index 0000000000..4f5a77984a --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot-members.html @@ -0,0 +1,96 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.ChatBot Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.html new file mode 100644 index 0000000000..7bc460ec92 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.html @@ -0,0 +1,246 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.ChatBot Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.ChatBot Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.ChatBot:
+
+
+ + +Tgstation.Server.Api.Models.Internal.ChatBot + +
+ + + + + + + + + + + + +

+Public Member Functions

Api.Models.ChatBot ToApi ()
 Convert the ChatBot to it's API form More...
 
- Public Member Functions inherited from Tgstation.Server.Api.Models.Internal.ChatBot
ChatConnectionStringBuilder CreateConnectionStringBuilder ()
 Get the ChatConnectionStringBuilder which maps to the ConnectionString. More...
 
void SetConnectionStringBuilder (ChatConnectionStringBuilder stringBuilder)
 Set the ChatConnectionStringBuilder for the ChatBot. Also updates the ConnectionString. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

long InstanceId [get, set]
 The Api.Models.Instance.Id More...
 
Instance Instance [get, set]
 The parent Models.Instance More...
 
List< ChatChannelChannels [get, set]
 See Api.Models.ChatBot.Channels More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.ChatBot
long Id [get, set]
 The settings id More...
 
string Name [get, set]
 The name of the connection More...
 
bool? Enabled [get, set]
 If the connection is enabled More...
 
ChatProviderProvider [get, set]
 The ChatProvider used for the connection More...
 
string ConnectionString [get, set]
 The information used to connect to the Provider More...
 
+

Detailed Description

+
+

Definition at line 8 of file ChatBot.cs.

+

Member Function Documentation

+ +

◆ ToApi()

+ +
+
+ + + + + + + +
Api.Models.ChatBot Tgstation.Server.Host.Models.ChatBot.ToApi ()
+
+ +

Convert the ChatBot to it's API form

+
Returns
A new Api.Models.ChatBot
+ +
+
+

Property Documentation

+ +

◆ Channels

+ +
+
+ + + + + +
+ + + + +
List<ChatChannel> Tgstation.Server.Host.Models.ChatBot.Channels
+
+getset
+
+ +

See Api.Models.ChatBot.Channels

+ +

Definition at line 24 of file ChatBot.cs.

+
24 { get; set; }
+
+
+ +

◆ Instance

+ +
+
+ + + + + +
+ + + + +
Instance Tgstation.Server.Host.Models.ChatBot.Instance
+
+getset
+
+ +

The parent Models.Instance

+ +

Definition at line 19 of file ChatBot.cs.

+
19 { get; set; }
+
+
+ +

◆ InstanceId

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.ChatBot.InstanceId
+
+getset
+
+ +

The Api.Models.Instance.Id

+ +

Definition at line 13 of file ChatBot.cs.

+
13 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.png new file mode 100644 index 0000000000000000000000000000000000000000..cd415b28ba4bc376517a57f89d07954f76b08d4e GIT binary patch literal 996 zcmeAS@N?(olHy`uVBq!ia0y~yVB`j}12~w0q~+EH4}g?JfKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+19P#bi(^Oy7Bn-T<#xURBgW5Lwt6G&77#fyf1goU)z;vXY<|q!r`~p4`(rT*H)e9KECLD$1#}| zradpBw%=U-Yw2CJo_lhqH(V@siChz#c6RTzoIQCC97ii{m-#gQFl;|;eJ??K^PGz3 z+kE#-?VXkEc}!i$ZT)A5<-1t2)25xMcN2S5a7gLno#op%bhH_X1?#MvuqWlA(w$2$ z<{aHp!SBx<{_eoEZ;~yCH_e$ixna?EO>X(qfA<9ZNY~k7RVfy!=q>!SrPas#v(u-y zZ+eylzu!<1t6wC>__)T6ja!$obG`W2N3VL0+}JdszP)w7dtcYyYl)g~72n4Ae%J0* zi*LGPyGStho^tVDIkrDsdb(dlWH-8Oe_s9M-rd}^Z}-1Ee0uiGKK0avr5De!_ZP7ZhKOmYnzr%{_UrWwKI2{pHnDKYrYd+Wyv}#!l?c_s5oN-p|PH z(y4NfkB#Wb%fHkp<@SBsgU2&Ur*0~bSmW(btl#@_7o#G_^Y=4^oGjSwI;zhw8xPPrK( z7H7K?7n!HK+3bJPbH;9;z5b!Rm<<=So<(*%7v}c-EiC5wFjP$5MtS{f*K*fBv&A zdLG60LvYt&r`Jjc{I9Itb7L~k1NGPMBpH9aM1=aQgNwFa^E&@r{I0pVeblR`8-ZDp N!PC{xWt~$(699)t-~#{v literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel-members.html new file mode 100644 index 0000000000..970d5e619f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel-members.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.ChatChannel Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.html new file mode 100644 index 0000000000..5fedf84a82 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.html @@ -0,0 +1,242 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.ChatChannel Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.ChatChannel Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.ChatChannel:
+
+
+ + +Tgstation.Server.Api.Models.ChatChannel + +
+ + + + + +

+Public Member Functions

Api.Models.ChatChannel ToApi ()
 Convert the ChatChannel to it's API form More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

long Id [get, set]
 The row Id More...
 
long ChatSettingsId [get, set]
 The Api.Models.Internal.ChatBot.Id More...
 
ChatBot ChatSettings [get, set]
 The Models.ChatBot More...
 
- Properties inherited from Tgstation.Server.Api.Models.ChatChannel
string IrcChannel [get, set]
 The IRC channel name More...
 
ulong? DiscordChannelId [get, set]
 The Discord channel ID More...
 
bool? IsAdminChannel [get, set]
 If the ChatChannel is an admin channel More...
 
bool? IsWatchdogChannel [get, set]
 If the ChatChannel is a watchdog channel More...
 
bool? IsUpdatesChannel [get, set]
 If the ChatChannel is an updates channel More...
 
string Tag [get, set]
 A custom tag users can define to group channels together More...
 
+

Detailed Description

+
+

Definition at line 6 of file ChatChannel.cs.

+

Member Function Documentation

+ +

◆ ToApi()

+ +
+
+ + + + + + + +
Api.Models.ChatChannel Tgstation.Server.Host.Models.ChatChannel.ToApi ()
+
+ +

Convert the ChatChannel to it's API form

+
Returns
A new Api.Models.ChatChannel
+ +
+
+

Property Documentation

+ +

◆ ChatSettings

+ +
+
+ + + + + +
+ + + + +
ChatBot Tgstation.Server.Host.Models.ChatChannel.ChatSettings
+
+getset
+
+ +

The Models.ChatBot

+ +

Definition at line 21 of file ChatChannel.cs.

+
21 { get; set; }
+
+
+ +

◆ ChatSettingsId

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.ChatChannel.ChatSettingsId
+
+getset
+
+ +

The Api.Models.Internal.ChatBot.Id

+ +

Definition at line 16 of file ChatChannel.cs.

+
16 { get; set; }
+
+
+ +

◆ Id

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.ChatChannel.Id
+
+getset
+
+ +

The row Id

+ +

Definition at line 11 of file ChatChannel.cs.

+
11 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.png new file mode 100644 index 0000000000000000000000000000000000000000..b4f20c74f93c17db6397b3f350dd0abfb98eec45 GIT binary patch literal 964 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K50yvm~o10{(Y~9#cC)~~yH!?cCm1c3f9En__{AfC=7QwIbB5FJ=16Y* z^MJSEc~y{c|Ey!lGBN+ut{SGEyZ0l;{lS?FM^7nL-zzR#d30^M(Qamg8n+vnjKPb2 zgOq;1V%%X8#L#{AY_=-HBGv!zWf?ZF4WGJ}aZZPCX{_iQ?sI%Q`fruXU)rOz+&$r3 zUgF8=HQW!rakR+g`M3OC5jlJQzQa-uGo~?~=sWP+|NsAL2fhOvXZIgqFpzy+Y27U+ z@c3xUyRv@|1vhLzP%3IOJ0s)Fx=TK%w`=z*-VQsXD{$fNeWs7w-rLpgy&@$2>8|dF zZt(Lka4KAuWZ!W9=e_p5H;?)+QoFa3HQ|!z&rfsJb%i+` z8SlN4bNJ75pd##J^_5DK?F>Fqj28OG-iORHSU>;z3++==U(EO;^{ec4=L|*u1=7D> zF&;3uJ)y1d|ko%B$?otd($6pc{26b=j$`3pHr*& z;;EZwJ2{>&A;SGY=BkzF*i<&HUw8V6q7X3he)c5yaeM!}FV%1}%)g5DK}+_lSF2*L z_b0LT2-I3|CoNP3#$6#W?)ESiRI@mJ-===3?%bM#yI-zbCC)I3Pip&2*+zf6zw5s@ z$TZxJC}Me6?XYcbYjKa%*+nFdEj$F+^pr-SCfj Y?K9K-DVq}tfmx2h)78&qol`;+08&`M(*OVf literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job-members.html new file mode 100644 index 0000000000..fdd31ac673 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job-members.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.CompileJob Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.html new file mode 100644 index 0000000000..540a6e3b67 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.html @@ -0,0 +1,272 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.CompileJob Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.CompileJob Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.CompileJob:
+
+
+ + +Tgstation.Server.Api.Models.Internal.CompileJob + +
+ + + + + +

+Public Member Functions

Api.Models.CompileJob ToApi ()
 Convert the CompileJob to it's API form More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

Job Job [get, set]
 See Api.Models.CompileJob.Job More...
 
long JobId [get, set]
 The Api.Models.Internal.Job.Id of Job More...
 
RevisionInformation RevisionInformation [get, set]
 See Api.Models.CompileJob.RevisionInformation More...
 
string ByondVersion [get, set]
 The Version the CompileJob was made with in string form More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.CompileJob
long Id [get, set]
 The ID of the job More...
 
string DmeName [get, set]
 The .dme file used for compilation More...
 
string Output [get, set]
 Textual output of DM More...
 
Guid? DirectoryName [get, set]
 The Game folder the results were compiled into More...
 
DreamDaemonSecurityMinimumSecurityLevel [get, set]
 The minimum DreamDaemonSecurity required to run the CompileJob's output More...
 
+

Detailed Description

+
+

Definition at line 7 of file CompileJob.cs.

+

Member Function Documentation

+ +

◆ ToApi()

+ +
+
+ + + + + + + +
Api.Models.CompileJob Tgstation.Server.Host.Models.CompileJob.ToApi ()
+
+ +

Convert the CompileJob to it's API form

+
Returns
A new Api.Models.CompileJob
+ +
+
+

Property Documentation

+ +

◆ ByondVersion

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Models.CompileJob.ByondVersion
+
+getset
+
+ +

The Version the CompileJob was made with in string form

+ +

Definition at line 30 of file CompileJob.cs.

+
30 { get; set; }
+
+
+ +

◆ Job

+ +
+
+ + + + + +
+ + + + +
Job Tgstation.Server.Host.Models.CompileJob.Job
+
+getset
+
+ +

See Api.Models.CompileJob.Job

+ +

Definition at line 13 of file CompileJob.cs.

+
13 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess().

+ +
+
+ +

◆ JobId

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.CompileJob.JobId
+
+getset
+
+ +

The Api.Models.Internal.Job.Id of Job

+ +

Definition at line 18 of file CompileJob.cs.

+
18 { get; set; }
+
+
+ +

◆ RevisionInformation

+ +
+
+ + + + + +
+ + + + +
RevisionInformation Tgstation.Server.Host.Models.CompileJob.RevisionInformation
+
+getset
+
+ +

See Api.Models.CompileJob.RevisionInformation

+ +

Definition at line 24 of file CompileJob.cs.

+
24 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.png new file mode 100644 index 0000000000000000000000000000000000000000..41d589fecf452dacfdc0a8ae73dfec8911c3114c GIT binary patch literal 1121 zcmeAS@N?(olHy`uVBq!ia0y~yU{nOM12~w0Wa25~pFm0?z$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-op|v>--};zU7VIXK5JTYxX!z~zkO5iGtS<7 zGq+5fl^Mu1Uue_Tob^(F+crNvx^(MG?XsndPsimho7P*nY-`Rsv3ADYO`eJG=Qavm z*_425KguC`s^TZ1k+}@YWUr!f)byCeU|5CoXisw=#6;E@NII-o> zg+y2q;~$M$hA9kwAuS9-wKXD24aK604KDl+tsDKkkvb&ggbm@yjQv zS(zrFlybpGYDR?-U2+huK`-qMu)ua3`G@~>^ny7vobOz5_;Nd0LmGI#algNs8a zn_ckf4*GPuB}e!6YTx~wxrv4C7ew@SU%L48oow)FpMYTAp6tl&X=|i39CfAJ>XuGB zYp!@8|I&2X{mw5QEnxZ+^H + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.DatabaseContext< TParentContext > Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Models.DatabaseContext< TParentContext >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ChatBotsTgstation.Server.Host.Models.DatabaseContext< TParentContext >
ChatChannelsTgstation.Server.Host.Models.DatabaseContext< TParentContext >
CompileJobsTgstation.Server.Host.Models.DatabaseContext< TParentContext >
DatabaseConfigurationTgstation.Server.Host.Models.DatabaseContext< TParentContext >protected
DatabaseContext(DbContextOptions< TParentContext > dbContextOptions, IOptions< DatabaseConfiguration > databaseConfigurationOptions, IDatabaseSeeder databaseSeeder, ILogger logger)Tgstation.Server.Host.Models.DatabaseContext< TParentContext >
databaseSeederTgstation.Server.Host.Models.DatabaseContext< TParentContext >private
DreamDaemonSettingsTgstation.Server.Host.Models.DatabaseContext< TParentContext >
DreamMakerSettingsTgstation.Server.Host.Models.DatabaseContext< TParentContext >
Initialize(CancellationToken cancellationToken)Tgstation.Server.Host.Models.DatabaseContext< TParentContext >
InstancesTgstation.Server.Host.Models.DatabaseContext< TParentContext >
InstanceUsersTgstation.Server.Host.Models.DatabaseContext< TParentContext >
JobsTgstation.Server.Host.Models.DatabaseContext< TParentContext >
LoggerTgstation.Server.Host.Models.DatabaseContext< TParentContext >protected
OnModelCreating(ModelBuilder modelBuilder)Tgstation.Server.Host.Models.DatabaseContext< TParentContext >protected
ReattachInformationsTgstation.Server.Host.Models.DatabaseContext< TParentContext >
RepositorySettingsTgstation.Server.Host.Models.DatabaseContext< TParentContext >
RevInfoTestMergesTgstation.Server.Host.Models.DatabaseContext< TParentContext >
RevisionInformationsTgstation.Server.Host.Models.DatabaseContext< TParentContext >
Save(CancellationToken cancellationToken)Tgstation.Server.Host.Models.DatabaseContext< TParentContext >
SchemaDowngradeForServerVersion(Version version, CancellationToken cancellationToken)Tgstation.Server.Host.Models.DatabaseContext< TParentContext >
TestMergesTgstation.Server.Host.Models.DatabaseContext< TParentContext >
UseMySQLMigrations()Tgstation.Server.Host.Models.DatabaseContext< TParentContext >protectedpure virtual
UsersTgstation.Server.Host.Models.DatabaseContext< TParentContext >
WatchdogReattachInformationsTgstation.Server.Host.Models.DatabaseContext< TParentContext >
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html new file mode 100644 index 0000000000..65c9596576 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html @@ -0,0 +1,937 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.DatabaseContext< TParentContext > Class Template Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.DatabaseContext< TParentContext > Class Template Referenceabstract
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.DatabaseContext< TParentContext >:
+
+
+ + +DbContext +Tgstation.Server.Host.Models.IDatabaseContext + +
+ + + + + + + + + + + + + + +

+Public Member Functions

 DatabaseContext (DbContextOptions< TParentContext > dbContextOptions, IOptions< DatabaseConfiguration > databaseConfigurationOptions, IDatabaseSeeder databaseSeeder, ILogger logger)
 Construct a DatabaseContext<TParentContext> More...
 
async Task Initialize (CancellationToken cancellationToken)
 Creates and migrates the IDatabaseContext More...
 
Task Save (CancellationToken cancellationToken)
 Saves changes made to the IDatabaseContext More...
 
async Task SchemaDowngradeForServerVersion (Version version, CancellationToken cancellationToken)
 Attempt to downgrade the schema to the migration used for a given server version More...
 
+ + + + + + +

+Protected Member Functions

override void OnModelCreating (ModelBuilder modelBuilder)
 
abstract bool UseMySQLMigrations ()
 If the MY_ class of migrations should be used instead of the MS_ class More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

DbSet< UserUsers [get, set]
 
DbSet< InstanceInstances [get, set]
 
DbSet< CompileJobCompileJobs [get, set]
 
DbSet< RevisionInformationRevisionInformations [get, set]
 
DbSet< DreamMakerSettingsDreamMakerSettings [get, set]
 
DbSet< ChatBotChatBots [get, set]
 
DbSet< DreamDaemonSettingsDreamDaemonSettings [get, set]
 
DbSet< RepositorySettingsRepositorySettings [get, set]
 
DbSet< InstanceUserInstanceUsers [get, set]
 
DbSet< ChatChannelChatChannels [get, set]
 
DbSet< JobJobs [get, set]
 
DbSet< ReattachInformationReattachInformations [get, set]
 
DbSet< WatchdogReattachInformationWatchdogReattachInformations [get, set]
 
DbSet< TestMergeTestMerges [get, set]
 The TestMerges in the DatabaseContext<TParentContext> More...
 
DbSet< RevInfoTestMergeRevInfoTestMerges [get, set]
 The RevInfoTestMerges om the DatabaseContext<TParentContext> More...
 
ILogger Logger [get]
 The ILogger for the DatabaseContext<TParentContext> More...
 
DatabaseConfiguration DatabaseConfiguration [get]
 The DatabaseConfiguration for the DatabaseContext<TParentContext> More...
 
- Properties inherited from Tgstation.Server.Host.Models.IDatabaseContext
DbSet< UserUsers [get]
 The Users in the IDatabaseContext More...
 
DbSet< InstanceInstances [get]
 The Instances in the IDatabaseContext More...
 
DbSet< InstanceUserInstanceUsers [get]
 The InstanceUsers in the IDatabaseContext More...
 
DbSet< JobJobs [get]
 The Jobs in the IDatabaseContext More...
 
DbSet< CompileJobCompileJobs [get]
 The CompileJobs in the IDatabaseContext More...
 
DbSet< RevisionInformationRevisionInformations [get]
 The RevisionInformations in the IDatabaseContext More...
 
DbSet< DreamMakerSettingsDreamMakerSettings [get, set]
 The Models.DreamMakerSettings in the IDatabaseContext More...
 
DbSet< DreamDaemonSettingsDreamDaemonSettings [get, set]
 The Models.DreamDaemonSettings in the IDatabaseContext More...
 
DbSet< ChatBotChatBots [get, set]
 The Models.ChatBot in the IDatabaseContext More...
 
DbSet< ChatChannelChatChannels [get, set]
 The ChatChannel in the IDatabaseContext More...
 
DbSet< RepositorySettingsRepositorySettings [get, set]
 The Models.RepositorySettings in the IDatabaseContext More...
 
DbSet< ReattachInformationReattachInformations [get, set]
 The DbSet<TEntity> for Models.ReattachInformations More...
 
DbSet< WatchdogReattachInformationWatchdogReattachInformations [get, set]
 The DbSet<TEntity> for Models.WatchdogReattachInformations More...
 
+ + + + +

+Private Attributes

readonly IDatabaseSeeder databaseSeeder
 The IDatabaseSeeder for the DatabaseContext<TParentContext> More...
 
+

Detailed Description

+
+
Type Constraints
+ + +
TParentContext :DbContext 
+
+
+
+ +

Definition at line 19 of file DatabaseContext.cs.

+

Constructor & Destructor Documentation

+ +

◆ DatabaseContext()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.DatabaseContext (DbContextOptions< TParentContext > dbContextOptions,
IOptions< DatabaseConfigurationdatabaseConfigurationOptions,
IDatabaseSeeder databaseSeeder,
ILogger logger 
)
+
+ +

Construct a DatabaseContext<TParentContext>

+
Parameters
+ + + + + +
dbContextOptionsThe DbContextOptions<TParentContext> for the DatabaseContext<TParentContext>
databaseConfigurationOptionsThe IOptions<TOptions> containing the value of DatabaseConfiguration
databaseSeederThe value of databaseSeeder
loggerThe value of Logger
+
+
+ +

Definition at line 92 of file DatabaseContext.cs.

+
92  : base(dbContextOptions)
93  {
94  DatabaseConfiguration = databaseConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(databaseConfigurationOptions));
95  this.databaseSeeder = databaseSeeder ?? throw new ArgumentNullException(nameof(databaseSeeder));
96  Logger = logger ?? throw new ArgumentNullException(nameof(logger));
97  }
Configuration options for the Models.DatabaseContext<TParentContext>
+
readonly IDatabaseSeeder databaseSeeder
The IDatabaseSeeder for the DatabaseContext<TParentContext>
+
ILogger Logger
The ILogger for the DatabaseContext<TParentContext>
+
+
+
+

Member Function Documentation

+ +

◆ Initialize()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.Initialize (CancellationToken cancellationToken)
+
+ +

Creates and migrates the IDatabaseContext

+ +

Implements Tgstation.Server.Host.Models.IDatabaseContext.

+ +

Definition at line 143 of file DatabaseContext.cs.

+
144  {
146  {
147  Logger.LogCritical("DropDatabase configuration option set! Dropping any existing database...");
148  await Database.EnsureDeletedAsync(cancellationToken).ConfigureAwait(false);
149  }
150 
151  var migrations = await Database.GetAppliedMigrationsAsync(cancellationToken).ConfigureAwait(false);
152  var wasEmpty = !migrations.Any();
153 
154  if (wasEmpty || (await Database.GetPendingMigrationsAsync(cancellationToken).ConfigureAwait(false)).Any())
155  {
156  Logger.LogInformation("Migrating database...");
157  await Database.MigrateAsync(cancellationToken).ConfigureAwait(false);
158  }
159  else
160  Logger.LogDebug("No migrations to apply.");
161 
162  wasEmpty |= (await Users.CountAsync(cancellationToken).ConfigureAwait(false)) == 0;
163 
164  if (wasEmpty)
165  {
166  Logger.LogInformation("Seeding database...");
167  await databaseSeeder.SeedDatabase(this, cancellationToken).ConfigureAwait(false);
168  }
170  {
171  Logger.LogWarning("Enabling and resetting admin password due to configuration!");
172  await databaseSeeder.ResetAdminPassword(this, cancellationToken).ConfigureAwait(false);
173  }
174  }
+
Task ResetAdminPassword(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Changes the admin password in IDatabaseContext back to it's default and enables the account
+
bool ResetAdminPassword
If the admin user should be enabled and have it's password reset
+
Configuration options for the Models.DatabaseContext<TParentContext>
+
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>
+
ILogger Logger
The ILogger for the DatabaseContext<TParentContext>
+
Task SeedDatabase(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Initially seed a given databaseContext
+
+
+
+ +

◆ OnModelCreating()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.OnModelCreating (ModelBuilder modelBuilder)
+
+protected
+
+ +

+ +

Definition at line 100 of file DatabaseContext.cs.

+
101  {
102  Logger.LogTrace("Building entity framework context...");
103  base.OnModelCreating(modelBuilder);
104 
105  var userModel = modelBuilder.Entity<User>();
106  userModel.HasIndex(x => x.CanonicalName).IsUnique();
107  userModel.HasMany(x => x.TestMerges).WithOne(x => x.MergedBy).OnDelete(DeleteBehavior.Restrict);
108 
109  modelBuilder.Entity<InstanceUser>().HasIndex(x => new { x.UserId, x.InstanceId }).IsUnique();
110 
111  modelBuilder.Entity<TestMerge>().HasMany(x => x.RevisonInformations).WithOne(x => x.TestMerge).OnDelete(DeleteBehavior.Cascade);
112 
113  var revInfo = modelBuilder.Entity<RevisionInformation>();
114  revInfo.HasMany(x => x.CompileJobs).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.Cascade);
115  revInfo.HasMany(x => x.ActiveTestMerges).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.Cascade);
116  revInfo.HasOne(x => x.PrimaryTestMerge).WithOne(x => x.PrimaryRevisionInformation).OnDelete(DeleteBehavior.Restrict);
117  revInfo.HasIndex(x => new { x.InstanceId, x.CommitSha }).IsUnique();
118 
119  modelBuilder.Entity<CompileJob>().HasIndex(x => x.DirectoryName);
120 
121  modelBuilder.Entity<Job>().HasOne<CompileJob>().WithOne(x => x.Job).OnDelete(DeleteBehavior.Restrict);
122 
123  var chatChannel = modelBuilder.Entity<ChatChannel>();
124  chatChannel.HasIndex(x => new { x.ChatSettingsId, x.IrcChannel }).IsUnique();
125  chatChannel.HasIndex(x => new { x.ChatSettingsId, x.DiscordChannelId }).IsUnique();
126  chatChannel.HasOne(x => x.ChatSettings).WithMany(x => x.Channels).HasForeignKey(x => x.ChatSettingsId).OnDelete(DeleteBehavior.Cascade);
127 
128  modelBuilder.Entity<ChatBot>().HasIndex(x => x.Name).IsUnique();
129 
130  var instanceModel = modelBuilder.Entity<Instance>();
131  instanceModel.HasIndex(x => x.Path).IsUnique();
132  instanceModel.HasMany(x => x.ChatSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
133  instanceModel.HasOne(x => x.DreamDaemonSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
134  instanceModel.HasOne(x => x.DreamMakerSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
135  instanceModel.HasOne(x => x.RepositorySettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
136  instanceModel.HasMany(x => x.RevisionInformations).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
137  instanceModel.HasMany(x => x.InstanceUsers).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
138  instanceModel.HasMany(x => x.Jobs).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
139  instanceModel.HasOne(x => x.WatchdogReattachInformation).WithOne().OnDelete(DeleteBehavior.Cascade);
140  }
+
ILogger Logger
The ILogger for the DatabaseContext<TParentContext>
+
+
+
+ +

◆ Save()

+ + + +

◆ SchemaDowngradeForServerVersion()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.SchemaDowngradeForServerVersion (Version version,
CancellationToken cancellationToken 
)
+
+ +

Attempt to downgrade the schema to the migration used for a given server version

+ +

Implements Tgstation.Server.Host.Models.IDatabaseContext.

+ +

Definition at line 186 of file DatabaseContext.cs.

+
187  {
188  if (version == null)
189  throw new ArgumentNullException(nameof(version));
190  if (version < new Version(4, 0))
191  throw new ArgumentOutOfRangeException(nameof(version), version, "Not a valid V4 version!");
192 
193  string targetMigration = null;
194 
195  // Update this with new migrations as they are made
196  // Always use the MS class
197  if (version < new Version(4, 0, 2))
198  targetMigration = nameof(MSReattachCompileJobRequired);
199 
200  if (targetMigration == null)
201  return;
202 
203  if (UseMySQLMigrations())
204  targetMigration = String.Format(CultureInfo.InvariantCulture, "MY{0}", targetMigration.Substring(2));
205 
206  // even though it clearly implements it in the DatabaseFacade definition this won't work without casting (╯ಠ益ಠ)╯︵ ┻━┻
207  var dbServiceProvider = ((IInfrastructure<IServiceProvider>)Database).Instance;
208  var migrator = dbServiceProvider.GetRequiredService<IMigrator>();
209 
210  Logger.LogInformation("Migrating down to version {0}. Target: {1}", version, targetMigration);
211  try
212  {
213  await migrator.MigrateAsync(targetMigration, cancellationToken).ConfigureAwait(false);
214  }
215  catch (Exception e)
216  {
217  Logger.LogCritical("Failed to migrate! Exception: {0}", e);
218  }
219  }
abstract bool UseMySQLMigrations()
If the MY_ class of migrations should be used instead of the MS_ class
+
Marks the CompileJobs of ReattachInformations as non-nullable for MSSQL
+
ILogger Logger
The ILogger for the DatabaseContext<TParentContext>
+
+
+
+ +

◆ UseMySQLMigrations()

+ +
+
+ + + + + +
+ + + + + + + +
abstract bool Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.UseMySQLMigrations ()
+
+protectedpure virtual
+
+ +

If the MY_ class of migrations should be used instead of the MS_ class

+
Returns
true if the MY_ class of migrations should be used instead of the MS_ class, false otherwise
+ +

Implemented in Tgstation.Server.Host.Models.MySqlDatabaseContext, and Tgstation.Server.Host.Models.SqlServerDatabaseContext.

+ +

Referenced by Tgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >.SchemaDowngradeForServerVersion().

+ +
+
+

Member Data Documentation

+ +

◆ databaseSeeder

+ + +

Property Documentation

+ +

◆ ChatBots

+ + + +

◆ ChatChannels

+ +
+
+ + + + + +
+ + + + +
DbSet<ChatChannel> Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.ChatChannels
+
+getset
+
+ +

+ +

Definition at line 49 of file DatabaseContext.cs.

+
49 { get; set; }
+

Referenced by Tgstation.Server.Host.Controllers.ChatController.Update().

+ +
+
+ +

◆ CompileJobs

+ +
+
+ + + + + +
+ + + + +
DbSet<CompileJob> Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.CompileJobs
+
+getset
+
+
+ +

◆ DatabaseConfiguration

+ +
+
+ + + + + +
+ + + + +
DatabaseConfiguration Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.DatabaseConfiguration
+
+getprotected
+
+ +

The DatabaseConfiguration for the DatabaseContext<TParentContext>

+ +

Definition at line 78 of file DatabaseContext.cs.

+
78 { get; }
+
+
+ +

◆ DreamDaemonSettings

+ +
+
+ + + + + +
+ + + + +
DbSet<DreamDaemonSettings> Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.DreamDaemonSettings
+
+getset
+
+ +

+ +

Definition at line 40 of file DatabaseContext.cs.

+
40 { get; set; }
+
+
+ +

◆ DreamMakerSettings

+ +
+
+ + + + + +
+ + + + +
DbSet<DreamMakerSettings> Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.DreamMakerSettings
+
+getset
+
+
+ +

◆ Instances

+ + + +

◆ InstanceUsers

+ +
+
+ + + + + +
+ + + + +
DbSet<InstanceUser> Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.InstanceUsers
+
+getset
+
+ +

+ +

Definition at line 46 of file DatabaseContext.cs.

+
46 { get; set; }
+

Referenced by Tgstation.Server.Host.Controllers.InstanceUserController.Create().

+ +
+
+ +

◆ Jobs

+ + + +

◆ Logger

+ + + +

◆ ReattachInformations

+ +
+
+ + + + + +
+ + + + +
DbSet<ReattachInformation> Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.ReattachInformations
+
+getset
+
+ +

+ +

Definition at line 55 of file DatabaseContext.cs.

+
55 { get; set; }
+

Referenced by Tgstation.Server.Host.Controllers.InstanceController.Delete().

+ +
+
+ +

◆ RepositorySettings

+ + + +

◆ RevInfoTestMerges

+ +
+
+ + + + + +
+ + + + +
DbSet<RevInfoTestMerge> Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.RevInfoTestMerges
+
+getset
+
+ +

The RevInfoTestMerges om the DatabaseContext<TParentContext>

+ +

Definition at line 68 of file DatabaseContext.cs.

+
68 { get; set; }
+
+
+ +

◆ RevisionInformations

+ +
+
+ + + + + +
+ + + + +
DbSet<RevisionInformation> Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.RevisionInformations
+
+getset
+
+ +

+ +

Definition at line 31 of file DatabaseContext.cs.

+
31 { get; set; }
+
+
+ +

◆ TestMerges

+ +
+
+ + + + + +
+ + + + +
DbSet<TestMerge> Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.TestMerges
+
+getset
+
+ +

The TestMerges in the DatabaseContext<TParentContext>

+ +

Definition at line 63 of file DatabaseContext.cs.

+
63 { get; set; }
+
+
+ +

◆ Users

+ + + +

◆ WatchdogReattachInformations

+ +
+
+ + + + + +
+ + + + +
DbSet<WatchdogReattachInformation> Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.WatchdogReattachInformations
+
+getset
+
+ +

+ +

Definition at line 58 of file DatabaseContext.cs.

+
58 { get; set; }
+

Referenced by Tgstation.Server.Host.Controllers.InstanceController.Delete().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.png new file mode 100644 index 0000000000000000000000000000000000000000..0cc83525e8ea3a4607d6a60deede547d4f50f165 GIT binary patch literal 1719 zcmah|e>~G^9DnA=D4guXqH;RluAQlMge7#E+veN(G3qu-YZ_PWCQ=fyOLw&>Yv*?8 z*Ii9C%XAVQStWq(OUqkG^x>sJ^U-x;vp7-bd{yd-O^Lk#-^ZD@oeaR+^ ztri0SOsEtR4FFvX!u<_(5&VNyJnyjnTZ6o{S}j6f42~a4s}dmW-IB}Y`uxW>h%}6$ z`33?cY2I4vg1!I%{S}q;WzZ3n`l32o_4yJ~TGr9NThl{enffYs9#e}+TA&Bj0;U@)wbI*Ugpw2WbV14J*5nb z!|n83H`7IDX{m0#3DXrE{!srMv3c4WM>V+|!Wx(@f_|^Q!RWKxlVlG|+@_Rch2M9L z&i1MjXX6Uys0!Cm4nHj|kwfhfTpfR0aKWQyz09QH>kdqOjYmA2U+ngyaU$`oQa}L0-?@5`%B{X(2+w zD{)a%PE#v7v|cc$|9J(MFL)7ewTrQ8IHY!1`InikdgN-UrCsNm26LMGn8Cg8{6Yl9 z1J~JFH$T4bPNA4FwG6(w_C+u&>9c3Ep>I^rWAV+LBkh>h`dd(zPp?FJ>1hNTd5yts zpO_ctee7gtPdzvq4T}SxEP};&$@zjJ*M^qd?q8Az3`gjtJ0>G*=bS~#rUx^V+`2)N znt;;b=TTKF!=Sya(Ea=w^6&$dQc$y9Vv-^zb=C$oh6UmW$>cS(*7Uu$5%D=s;~yV9 zHq-6FJ?5D|g#3afOi}Erug3?(Z4sv0xhFf=Qj_EIp@~;G>Q}-`_vYI}rb(w;xOoZ7 z`R_KRkljOy;`TzD9G{OO!MzroMO3R)L=`iUqD(|({a^~G(@x{E(|7B=CqPDY0lEa# zc3mdH0>!kDpyhO~OCBH?d>HX?DqIW#nHvB)%nXEA?gPd(7|?LM6<|}nL56-FihxZ4 z1fvg*F!4HaJl%v>N!Q~s3avo0)DRSZSfF~u0hL)zG`pUA*HwuR9jn~|WZ$BeZy7usUBHHq1f=@W3c_^%J z7+10Cqk>*4llOB1dipXM^g8Bj+Pq! zj6<#;_ab=JbMlQ&XsON8sK(6i&dxsA!`~PgHvDc5b24A<*dcSfRALy>?p<}Qxns#l zy0XlSmC%YIdSz@XwUz_pYmxkV$BNtsxD{8R->0l$r={il`E!*A0#2USZ*xqbb>AbY zam}8#Z({sNuW=}X!x>1C`}zb#TjiX4@LVlX`l|1!`<zW;Zz|x{nQS9LhHm(9f4#LT0h$+@pTHEy+V52ewc7yd7$7iR(b zZ_C$bbsLh$0roTmG7SE&yXYeJ`uZZg3TTWprZa`tICC!SAb=Rv+m}?}#XSBG9xx4G literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder-members.html new file mode 100644 index 0000000000..2c26cc917d --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder-members.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.DatabaseSeeder Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Models.DatabaseSeeder, including all inherited members.

+ + + + + + +
cryptographySuiteTgstation.Server.Host.Models.DatabaseSeederprivate
DatabaseSeeder(ICryptographySuite cryptographySuite)Tgstation.Server.Host.Models.DatabaseSeeder
ResetAdminPassword(IDatabaseContext databaseContext, CancellationToken cancellationToken)Tgstation.Server.Host.Models.DatabaseSeeder
SeedAdminUser(IDatabaseContext databaseContext)Tgstation.Server.Host.Models.DatabaseSeederprivate
SeedDatabase(IDatabaseContext databaseContext, CancellationToken cancellationToken)Tgstation.Server.Host.Models.DatabaseSeeder
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder.html new file mode 100644 index 0000000000..e0850f417b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder.html @@ -0,0 +1,307 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.DatabaseSeeder Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.DatabaseSeeder Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.DatabaseSeeder:
+
+
+ + +Tgstation.Server.Host.Models.IDatabaseSeeder + +
+ + + + + + + + + + + +

+Public Member Functions

 DatabaseSeeder (ICryptographySuite cryptographySuite)
 Construct a DatabaseSeeder More...
 
async Task SeedDatabase (IDatabaseContext databaseContext, CancellationToken cancellationToken)
 Initially seed a given databaseContext More...
 
async Task ResetAdminPassword (IDatabaseContext databaseContext, CancellationToken cancellationToken)
 Changes the admin password in IDatabaseContext back to it's default and enables the account More...
 
+ + + + +

+Private Member Functions

void SeedAdminUser (IDatabaseContext databaseContext)
 Add a default admin User to a given databaseContext More...
 
+ + + + +

+Private Attributes

readonly ICryptographySuite cryptographySuite
 The ICryptographySuite for the DatabaseContext<TParentContext> More...
 
+

Detailed Description

+
+

Definition at line 12 of file DatabaseSeeder.cs.

+

Constructor & Destructor Documentation

+ +

◆ DatabaseSeeder()

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Models.DatabaseSeeder.DatabaseSeeder (ICryptographySuite cryptographySuite)
+
+ +

Construct a DatabaseSeeder

+
Parameters
+ + +
cryptographySuiteThe value of cryptographySuite
+
+
+ +
+
+

Member Function Documentation

+ +

◆ ResetAdminPassword()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Models.DatabaseSeeder.ResetAdminPassword (IDatabaseContext databaseContext,
CancellationToken cancellationToken 
)
+
+ +

Changes the admin password in IDatabaseContext back to it's default and enables the account

+ +

Implements Tgstation.Server.Host.Models.IDatabaseSeeder.

+ +

Definition at line 52 of file DatabaseSeeder.cs.

+
53  {
54  var admin = await databaseContext.Users.Where(x => x.CanonicalName == Api.Models.User.AdminName.ToUpperInvariant()).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
55  if (admin == default)
56  SeedAdminUser(databaseContext);
57  else
58  {
59  admin.Enabled = true;
60  cryptographySuite.SetUserPassword(admin, Api.Models.User.DefaultAdminPassword, false);
61  }
62 
63  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
64  }
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the DatabaseContext<TParentContext>
+
void SeedAdminUser(IDatabaseContext databaseContext)
Add a default admin User to a given databaseContext
+
void SetUserPassword(User user, string newPassword, bool newUser)
Sets a User.PasswordHash for a given user
+
+

References Tgstation.Server.Host.Models.DatabaseSeeder.cryptographySuite, Tgstation.Server.Host.Models.IDatabaseContext.Save(), Tgstation.Server.Host.Models.DatabaseSeeder.SeedAdminUser(), Tgstation.Server.Host.Security.ICryptographySuite.SetUserPassword(), and Tgstation.Server.Host.Models.IDatabaseContext.Users.

+ +
+
+ +

◆ SeedAdminUser()

+ +
+
+ + + + + +
+ + + + + + + + +
void Tgstation.Server.Host.Models.DatabaseSeeder.SeedAdminUser (IDatabaseContext databaseContext)
+
+private
+
+ +

Add a default admin User to a given databaseContext

+
Parameters
+ + +
databaseContextThe IDatabaseContext to add an admin User to
+
+
+ +

Definition at line 29 of file DatabaseSeeder.cs.

+
30  {
31  var admin = new User
32  {
34  CreatedAt = DateTimeOffset.Now,
36  Name = Api.Models.User.AdminName,
37  CanonicalName = Api.Models.User.AdminName.ToUpperInvariant(),
38  Enabled = true,
39  };
40  cryptographySuite.SetUserPassword(admin, Api.Models.User.DefaultAdminPassword, true);
41  databaseContext.Users.Add(admin);
42  }
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the DatabaseContext<TParentContext>
+
AdministrationRights
Rights for Models.Administration
+
InstanceManagerRights
Rights for managing Models.Instances
+
void SetUserPassword(User user, string newPassword, bool newUser)
Sets a User.PasswordHash for a given user
+
+

References Tgstation.Server.Host.Models.DatabaseSeeder.cryptographySuite, Tgstation.Server.Host.Security.ICryptographySuite.SetUserPassword(), and Tgstation.Server.Host.Models.IDatabaseContext.Users.

+ +

Referenced by Tgstation.Server.Host.Models.DatabaseSeeder.ResetAdminPassword(), and Tgstation.Server.Host.Models.DatabaseSeeder.SeedDatabase().

+ +
+
+ +

◆ SeedDatabase()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Models.DatabaseSeeder.SeedDatabase (IDatabaseContext databaseContext,
CancellationToken cancellationToken 
)
+
+ +

Initially seed a given databaseContext

+ +

Implements Tgstation.Server.Host.Models.IDatabaseSeeder.

+ +

Definition at line 45 of file DatabaseSeeder.cs.

+
46  {
47  SeedAdminUser(databaseContext);
48  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
49  }
void SeedAdminUser(IDatabaseContext databaseContext)
Add a default admin User to a given databaseContext
+
+

References Tgstation.Server.Host.Models.IDatabaseContext.Save(), and Tgstation.Server.Host.Models.DatabaseSeeder.SeedAdminUser().

+ +
+
+

Member Data Documentation

+ +

◆ cryptographySuite

+ +
+
+ + + + + +
+ + + + +
readonly ICryptographySuite Tgstation.Server.Host.Models.DatabaseSeeder.cryptographySuite
+
+private
+
+ +

The ICryptographySuite for the DatabaseContext<TParentContext>

+ +

Definition at line 17 of file DatabaseSeeder.cs.

+ +

Referenced by Tgstation.Server.Host.Models.DatabaseSeeder.ResetAdminPassword(), and Tgstation.Server.Host.Models.DatabaseSeeder.SeedAdminUser().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder.png new file mode 100644 index 0000000000000000000000000000000000000000..7ceed1f5069deb5f9bcce4b51c3307c5c67c8bd4 GIT binary patch literal 1113 zcmeAS@N?(olHy`uVBq!ia0y~yV3Yu|12~w0S{{KHY zf3{k}VU@Fwr@j)MoZFC4Z17F{_O{%mxwp6Jn0ab>daXU+F)6TdqRL_>WluL&w@E#I z25&#BYi{}Y>z8ToT;|j6lb(E;Y36Tt@BBNPId7J~yLq#F=A@+ECD*>Rbws-FpMCrH z{E0i+i+k+Yj7#m9ir>BwHqgI+&;Fj?yPDsRFYmTL&i1S8c;uetwab>Q<9Q}y5kCJw z&%+F(fY%RiA3wg>TD<3o>!i)c0?NzTHcL;4%E*$^_3^OgI@j-isqWX2)RXVd{o^@2 zeX_pT>3gd)x4iHwGmw7uPRih?i_8p}-M*6oYkVWm%r;24);qhylheR@x^i~mwSTYE z^bWL$o;w@U=y}q>CHa++ps~-KyXQPwDodySs<8X{IF2oR)8@;TzVG51ckcBHHtjUm zmfNpw@$&P_6}l3WcfMbLY3;<)vnMae&UkNmtl4wljMXLcli#i1ch>Od;`f$mMcjOIaY>yk6?A^6$OT*69 zuO@woo^|j{XXvE5AnzkRe{?Wa0}K+P5)6xhk|7C{NdD6{ zSi3bWYwcDYDF;rEwW!8g%`g^cUfg^Ay1swGUycJWjdSPK%!=31`?lQaSFM!5?WN1N znY*2_dbs=O-v5#_s|}97Fg6H2uWWFAo*heZ$cOFS){p-E`10=j#>RhN3uWGC&evS2 z-E7Hz?y9;$vc)W(E6b)HTU;%sb3}B~@?%~HHa6VMb>QwjmXYXmE3lxhX41FI>U!Q~ z_TSPa_RV<{c52;a3Ef{4_nr=OI$~vTxb@+Q9D}-R42yrv+BCyF@xYpD^XWz(xxP(m zmFO2geSY^Y24OKv^J3O#2jrNxxuG!r=`f5Xh-I9~n zr46=+XRcEFn0EAWIjefD-P~=gkDH&o(z+WJAwFkK4dZ9q;}r%cWs9f2D?ao0ZG5rM zzem-5Gi~;sFg(91XuWjxrukkje77cEd+fDX`~Hsr<4})K7e5WwGVK#(ltY OfWgz%&t;ucLK6VP*aK|< literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings-members.html new file mode 100644 index 0000000000..d60c4261e3 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings-members.html @@ -0,0 +1,99 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.DreamDaemonSettings Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html new file mode 100644 index 0000000000..bdb7aedcf9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html @@ -0,0 +1,287 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.DreamDaemonSettings Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.DreamDaemonSettings Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.DreamDaemonSettings:
+
+
+ + +Tgstation.Server.Api.Models.Internal.DreamDaemonSettings +Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

long Id [get, set]
 The row Id More...
 
int? ProcessId [get, set]
 The PID of a currently running DD instance More...
 
string AccessToken [get, set]
 The access token used for communication with DD More...
 
long InstanceId [get, set]
 The Api.Models.Instance.Id More...
 
Instance Instance [get, set]
 The parent Models.Instance More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.DreamDaemonSettings
bool? AutoStart [get, set]
 If DreamDaemon starts when it's Instance starts More...
 
bool? SoftRestart [get, set]
 If the server is undergoing a soft reset. This may be automatically set by changes to other fields More...
 
bool? SoftShutdown [get, set]
 If the server is undergoing a soft shutdown More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters
bool? AllowWebClient [get, set]
 If the BYOND web client can be used to connect to the game server More...
 
DreamDaemonSecuritySecurityLevel [get, set]
 The DreamDaemonSecurity level of DreamDaemon More...
 
ushort? PrimaryPort [get, set]
 The first port DreamDaemon uses. This should be the publically advertised port More...
 
ushort? SecondaryPort [get, set]
 The second port DreamDaemon uses More...
 
uint? StartupTimeout [get, set]
 The DreamDaemon startup timeout in seconds More...
 
+ + + + + +

+Additional Inherited Members

- Public Member Functions inherited from Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters
bool Match (DreamDaemonLaunchParameters otherParameters)
 Check if we match a given set of otherParameters More...
 
+

Detailed Description

+
+

Definition at line 6 of file DreamDaemonSettings.cs.

+

Property Documentation

+ +

◆ AccessToken

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Models.DreamDaemonSettings.AccessToken
+
+getset
+
+ +

The access token used for communication with DD

+ +

Definition at line 21 of file DreamDaemonSettings.cs.

+
21 { get; set; }
+
+
+ +

◆ Id

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.DreamDaemonSettings.Id
+
+getset
+
+ +

The row Id

+ +

Definition at line 11 of file DreamDaemonSettings.cs.

+
11 { get; set; }
+
+
+ +

◆ Instance

+ +
+
+ + + + + +
+ + + + +
Instance Tgstation.Server.Host.Models.DreamDaemonSettings.Instance
+
+getset
+
+ +

The parent Models.Instance

+ +

Definition at line 32 of file DreamDaemonSettings.cs.

+
32 { get; set; }
+
+
+ +

◆ InstanceId

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.DreamDaemonSettings.InstanceId
+
+getset
+
+ +

The Api.Models.Instance.Id

+ +

Definition at line 26 of file DreamDaemonSettings.cs.

+
26 { get; set; }
+
+
+ +

◆ ProcessId

+ +
+
+ + + + + +
+ + + + +
int? Tgstation.Server.Host.Models.DreamDaemonSettings.ProcessId
+
+getset
+
+ +

The PID of a currently running DD instance

+ +

Definition at line 16 of file DreamDaemonSettings.cs.

+
16 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..139a7790617883744e2aba458d455a32920b1dd5 GIT binary patch literal 2091 zcmcK5X*3(y9sux=wz1Rp)D$J-h<(J6v_dPiPmy*kV=N7|%+%BpOEi`eOKWSjPY^{* zN?&bbDHW86Ewr`>Z5`33DKSNagtmwhVWQ{EhtB)@-aY5u`@iS>@45HG@BVL=tFwcm zoVpwU08m6Z+PMJ$QY1-yTLvf@=Ng}wOQz$lKe?aZ+uM_bi~Nn4oW5L1^tJc)_8!b) zgC$FuXgB9y0FtErHaX%h*$3)C*`0O2E+u%ld~MB0;rw^+U`cxpNL1okVidn+Wectu z^Cm=ETGm7*RoQM@bOZxmEi|Z9t>O$3}JcB0bwqLZLVkfWc1pbV}2~Tk;*Ejs%`)Ht{r)4xK zps@lDl10bW$(eI8?ppsx$kH&T`rR!4L3 zz5!s?67FGW(KOOuKB8_@D-wQU6F)7@YuZTUn_N-P#0++=3+xf}`{AKWjN|R>Vz|(d zI_h0wl4j;LkhXT__86&LCHzLS{Bk@Xf!N1JtY}^`iu&QwfPpd-Il=%C+xBD_X%e6^)S-$M?aAG)~f2CB56pv#+%r6cB;p628D-ye72CQ<(`kYc z1&w!|6~Ap7fBi>tXU0)jV)TE6Z5tmK5OhG03X>;j2UMfv)Q@4x>OYWUcNhLW`-K}5 zcM-2@KQG!YS!<|QE!`Y&h7tr@f0$Rq;CN@5;Qn5?fbuish#T%TE1=qdUY z-5hxvA}&mhk4J6m+`;~N#S~>x$8mgpOb{`aFs#dqbH_q>ckF+6B3>Y_=XhWthBe<> zQASL_ohn0$tD>d9{A*jM-_tjcqca&`HkDa*DVgv`EJg@*_ zEe8Pcph-E_rUG-_B`Gy>O15s21PQ+XMZ(4)=cfsHK~+fc=PZ=u+V`CHJ=by^-6V&g zF4U&#pinV~olEv0511*)?hG@S3lTbuhT1TZJ$Kd;Sti4+F+5|MuelX#l~kx)b&)LC zX1o<4#$VL!g<``4Dg2X=MJ;t*3(#E1UdHs(XovQIR#uYT_2w z4_bM(xHtiJ2->EXoiqY%W?rQSj23+2oKb!Z;~Lm$aQJ-*SDSz`xDV~wLxQ$8ngz=0 z6&HJXsDYf>qH)H_EmzE&O;=Fj@Cg~FI#Pr8^<4L^io>-g7H&a^7vz8ljiI zB@OOJkKHvi@bO@Iq&{u(tH}(C+ed9v{taq;I~P|sV~km;Ql_(Z88MNrDY5)!cr7?` z_PGMs_YZNnb*CjLXxE@V?UD17zS)9`rsNL{wSL*W7i4C$N?G1nZT#9or!fYIFe}t1 z<$p3G>Ae-&bXwA3?e|)@q-}D9p0$}Vftpc+1F>5=>UAaP(F{&qx=a5N7Lt@4HFfUU zz)PKzag)ax$rf!sPS(?_xXdJ|uMonso0>f!acR6gKd;O4U&<}6#OUVTA4x9F zn>+^ElmZbGc0V(=e#FlhV2JL-iW$#u>fBcs)_;q6Ez42n$v--f>#|R`yIVr{fSpPB*?W?hoi=B87vntBkG5~5QT|*{8xk_x@+q=o zIyREJ4DV8!5SndvBk@NpQs^}NSGfIX5OWepLWcROU%OiArS2t~hQ)FR#C|)-LZi=Q z1sWjH#iBPp;}8R`-lYaC^2qN+z6cM7u}vuFBVd>vel~u(oEoHh8qhNx!QRG-7Q;U( zax^+Xgm=Ytz1o69E*$Z2McW!-;&II&eXUh;!d{DqV|) z9`i7@!BmA$aTeMW%)N4FQLDBNzcapky4gWqP_<&yDU&^>7-)7sd4aezb}!>-X{9E~ zwML0!r`2DA!!8WUYj#++%H2A`>DXt+k9=csQ;z%&Q*OHAID^&vM9Rr7r@}REL0wGP7bYmMW`u?h~>U z#s@Bvr9Uc)6`UU(aP2TPw&=~uv9{$A>e*2^=5GMk4l`qmf|ECn^gjHr`UWB~y^UL$ c-d18zo9J=FaNnA~ + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.DreamMakerSettings Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html new file mode 100644 index 0000000000..f372a61021 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html @@ -0,0 +1,233 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.DreamMakerSettings Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.DreamMakerSettings Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.DreamMakerSettings:
+
+
+ + +Tgstation.Server.Api.Models.DreamMaker + +
+ + + + + +

+Public Member Functions

Api.Models.DreamMaker ToApi ()
 Convert the DreamDaemonSettings to it's API form More...
 
+ + + + + + + + + + + + + + + + + + + + +

+Properties

long Id [get, set]
 The row Id More...
 
long InstanceId [get, set]
 The Api.Models.Instance.Id More...
 
Instance Instance [get, set]
 The parent Models.Instance More...
 
- Properties inherited from Tgstation.Server.Api.Models.DreamMaker
string ProjectName [get, set]
 The .dme file DreamMaker tries to compile with without the extension More...
 
ushort? ApiValidationPort [get, set]
 The port used during compilation to validate the DMAPI More...
 
DreamDaemonSecurityApiValidationSecurityLevel [get, set]
 The DreamDaemonSecurity level used to validate the DMAPI More...
 
+

Detailed Description

+
+

Definition at line 6 of file DreamMakerSettings.cs.

+

Member Function Documentation

+ +

◆ ToApi()

+ +
+
+ + + + + + + +
Api.Models.DreamMaker Tgstation.Server.Host.Models.DreamMakerSettings.ToApi ()
+
+ +

Convert the DreamDaemonSettings to it's API form

+
Returns
A new Api.Models.DreamMaker
+ +
+
+

Property Documentation

+ +

◆ Id

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.DreamMakerSettings.Id
+
+getset
+
+ +

The row Id

+ +

Definition at line 11 of file DreamMakerSettings.cs.

+
11 { get; set; }
+
+
+ +

◆ Instance

+ +
+
+ + + + + +
+ + + + +
Instance Tgstation.Server.Host.Models.DreamMakerSettings.Instance
+
+getset
+
+ +

The parent Models.Instance

+ +

Definition at line 22 of file DreamMakerSettings.cs.

+
22 { get; set; }
+
+
+ +

◆ InstanceId

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.DreamMakerSettings.InstanceId
+
+getset
+
+ +

The Api.Models.Instance.Id

+ +

Definition at line 16 of file DreamMakerSettings.cs.

+
16 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..ff2f99671877934bf1b080cd10fd721eaaa78de6 GIT binary patch literal 1183 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!12~w0z$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opCfnr`M_k z&!C{~8*csfpCtMC|U3k7n^m%1h(4=)+qRzO_ShwctlfApI*O*Nc zdwXZ{e2F;+Pwj}-t>d|N`1t4Jm#@ComivEi^ZNhF6O?=YcH3{?yM2cydv^Wa@M)fF z_dlFFbIRwL$u*_zE0<$d+KNn`%?F=mUE1{U?95rV?$W<}=CVJ( zc{obOR`7jVSaPTa?RTA||mL(4U`b1s_LMp>u&KbO4bn6+-oJIg%h& zHk5ArGX3_2du_+3-stzMcHF6FYTmo`Ns;kX)AGkP^~bg^eEBV}^oQA2lW3b)r;ciP zs-HSAYlY_}_b-W`Cw)oxI_!0IrOMxZ|Kua~hN-@E{?(u0d5J&#;G`u>xTdM7hQgx6 zHUStb&SU++|B8D7OTqdk)(MxdhhJp!Sed~12it%fCBVh%y9 z+zKm!N@-5Qp)c5C%T1}}zkbVK=8%YQ#00ZcO5 zZM*id2xNX|zOm8%d*=Q(fBe6jAD9}}eNg+}1?!XCr4E2HW;2u zNS(7z%>R>j$Pvvo?O&hwFP|*_?eYEUZ(r+M4C3niZNZ6$f3<$e>)@>9o4ZUZrM=g) z{QhSs9AzUGvqbsV-tBR>mkIbK?2T(mW9v0M!!~`X=Lxp77+GoY$?g)$!Ozq0+H5%g zZr;zYE#lqo9?gq->v|qs=UlVVs%iGgn~!oG6n?+(J9@*FAzM*8WZLJ82YL=K(ro%F zDqlEdd8y1HBe$xi^bOw}+;)GlcpDNBdARlG2gjv62Lh#~?Ck=QH|l@QD^09aPn;K? z`{EMU?SfrLbHZ;Kb*@wWzU%cG;fRB8H-v@7$aWvKT%-Bxv(5S2AO4-`O7z_}-E5ED z=0(SLTWwC0S6^E)?J(2oM%k6dr|&X6R*G4#c75ryzKzpj!XD;kES{Nv@rRj-?fu+- z4j`^>bP0l+XkK_=YS! literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance-members.html new file mode 100644 index 0000000000..837295459f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance-members.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.Instance Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html new file mode 100644 index 0000000000..79baec0d30 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html @@ -0,0 +1,395 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.Instance Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.Instance Class Reference
+
+
+ +

Represents an Api.Models.Instance in the database + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.Instance:
+
+
+ + +Tgstation.Server.Api.Models.Instance + +
+ + + + + + + + + +

+Public Member Functions

Api.Models.Instance ToApi ()
 Convert the Instance to it's API form More...
 
- Public Member Functions inherited from Tgstation.Server.Api.Models.Instance
Instance CloneMetadata ()
 Create a clone of the essential Instance metadata More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

DreamMakerSettings DreamMakerSettings [get, set]
 The Models.DreamMakerSettings for the Instance More...
 
DreamDaemonSettings DreamDaemonSettings [get, set]
 The Models.DreamDaemonSettings for the Instance More...
 
RepositorySettings RepositorySettings [get, set]
 The Models.RepositorySettings for the Instance More...
 
WatchdogReattachInformation WatchdogReattachInformation [get, set]
 The Models.WatchdogReattachInformation for the Instance More...
 
List< InstanceUserInstanceUsers [get, set]
 The InstanceUsers in the Instance More...
 
List< ChatBotChatSettings [get, set]
 The ChatBots for the Instance More...
 
List< RevisionInformationRevisionInformations [get, set]
 The RevisionInformations in the Instance More...
 
List< JobJobs [get, set]
 The Jobs in the Instance More...
 
- Properties inherited from Tgstation.Server.Api.Models.Instance
long Id [get, set]
 The id of the Instance. Not modifiable More...
 
string Name [get, set]
 The name of the Instance More...
 
string Path [get, set]
 The path to where the Instance is located. Can only be changed while the Instance is offline. Must not exist when the instance is created More...
 
bool? Online [get, set]
 If the Instance is online More...
 
ConfigurationTypeConfigurationType [get, set]
 If ConfigurationFile can be used on the Instance More...
 
uint? AutoUpdateInterval [get, set]
 The time interval in minutes the repository is automatically pulled and compiles. 0 disables More...
 
Job MoveJob [get, set]
 The Job representing a change of Path More...
 
+

Detailed Description

+

Represents an Api.Models.Instance in the database

+ +

Definition at line 8 of file Instance.cs.

+

Member Function Documentation

+ +

◆ ToApi()

+ +
+
+ + + + + + + +
Api.Models.Instance Tgstation.Server.Host.Models.Instance.ToApi ()
+
+ +

Convert the Instance to it's API form

+
Returns
A new Api.Models.Instance
+ +
+
+

Property Documentation

+ +

◆ ChatSettings

+ +
+
+ + + + + +
+ + + + +
List<ChatBot> Tgstation.Server.Host.Models.Instance.ChatSettings
+
+getset
+
+ +

The ChatBots for the Instance

+ +

Definition at line 38 of file Instance.cs.

+
38 { get; set; }
+
+
+ +

◆ DreamDaemonSettings

+ +
+
+ + + + + +
+ + + + +
DreamDaemonSettings Tgstation.Server.Host.Models.Instance.DreamDaemonSettings
+
+getset
+
+ +

The Models.DreamDaemonSettings for the Instance

+ +

Definition at line 18 of file Instance.cs.

+
18 { get; set; }
+
+
+ +

◆ DreamMakerSettings

+ +
+
+ + + + + +
+ + + + +
DreamMakerSettings Tgstation.Server.Host.Models.Instance.DreamMakerSettings
+
+getset
+
+ +

The Models.DreamMakerSettings for the Instance

+ +

Definition at line 13 of file Instance.cs.

+
13 { get; set; }
+
+
+ +

◆ InstanceUsers

+ +
+
+ + + + + +
+ + + + +
List<InstanceUser> Tgstation.Server.Host.Models.Instance.InstanceUsers
+
+getset
+
+ +

The InstanceUsers in the Instance

+ +

Definition at line 33 of file Instance.cs.

+
33 { get; set; }
+
+
+ +

◆ Jobs

+ +
+
+ + + + + +
+ + + + +
List<Job> Tgstation.Server.Host.Models.Instance.Jobs
+
+getset
+
+ +

The Jobs in the Instance

+ +

Definition at line 48 of file Instance.cs.

+
48 { get; set; }
+
+
+ +

◆ RepositorySettings

+ +
+
+ + + + + +
+ + + + +
RepositorySettings Tgstation.Server.Host.Models.Instance.RepositorySettings
+
+getset
+
+ +

The Models.RepositorySettings for the Instance

+ +

Definition at line 23 of file Instance.cs.

+
23 { get; set; }
+
+
+ +

◆ RevisionInformations

+ +
+
+ + + + + +
+ + + + +
List<RevisionInformation> Tgstation.Server.Host.Models.Instance.RevisionInformations
+
+getset
+
+ +

The RevisionInformations in the Instance

+ +

Definition at line 43 of file Instance.cs.

+
43 { get; set; }
+
+
+ +

◆ WatchdogReattachInformation

+ +
+
+ + + + + +
+ + + + +
WatchdogReattachInformation Tgstation.Server.Host.Models.Instance.WatchdogReattachInformation
+
+getset
+
+ +

The Models.WatchdogReattachInformation for the Instance

+ +

Definition at line 28 of file Instance.cs.

+
28 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.png new file mode 100644 index 0000000000000000000000000000000000000000..63d9e266f0ab4e47ba6fa0bfb798232905143de0 GIT binary patch literal 908 zcmeAS@N?(olHy`uVBq!ia0vp^&wx09gBeI#ssDTkq$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IZ0r9E97Ln;{G&b>J4u?CMT|Mk$n|L5Cu zCO4~a=cjF}&JJ7H{hCigMONUG_U&!CUyrJJUfpV-y0S}bnM&xygE{N%J(u;qdmLVo ze$DezbdhoYIm>5jEzS!wd&W;%_i1@$tZ|`O`kvD_H_be**LwC>;hFaR&-<6({=4AU zW7A#s?g4kt7p^#;xn48xM55g3^OsF#Jm-3U=FP!*A+?h@FYw&14?a^n_li&O<&3nZ z?n^8t(_)gg6jxo63$%)#`P{}zKKMgzyX6_F$HmIY=lAAZPu{hAUQ(Rdjp-dW4*O;E z6K6e$pJ{m9#;kbB4auFduR`?>zUgUPU(M%f&3!?tbm~X8&t{pzXF$z<=&*@+d?UVit?*3Mm@RxQbW^!(Bu&DGZ~ zNo?AFGUV0<$L~|GCB`!Ks4biN&3wPxq%ZEj5r01Uvn?mXUF{c^=oAdd*;uMKRM^fH|^BYb&%EdY0!$A z!2ndwxGE!&DdgfImKBRyIRjj|g%@;*sX2(EDfrV7mA!Uf1_LmPpc*53y!fxevyYvXR(JSU z*~cyZUEE?Uw!dxO<+$KG6OP-&&$-6@tRgpdmhFvT?HeB^mI^0#9={XrVBC8Q6g}r# zjHc~)@#{$UNx5VHOx7=-tZ(@1gcFP9GlPsXe$&1SGt8R)cGvCsyFCo_s~>T@$}PL! zSAW3d;QWPW4f=CsPL>|aX`ggiMz2aPttKry=F+)CTV^b_J7>S%<;X)z4*}Q$iB}Th6(D literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user-members.html new file mode 100644 index 0000000000..4846c68f45 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user-members.html @@ -0,0 +1,98 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.InstanceUser Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.html new file mode 100644 index 0000000000..2eebccc96b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.html @@ -0,0 +1,274 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.InstanceUser Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.InstanceUser Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.InstanceUser:
+
+
+ + +Tgstation.Server.Api.Models.InstanceUser + +
+ + + + + +

+Public Member Functions

Api.Models.InstanceUser ToApi ()
 Convert the InstanceUser to it's API form More...
 
+ + + + +

+Public Attributes

bool AnyRights
 If the InstanceUser has any instance rights More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

long Id [get, set]
 The row Id More...
 
long InstanceId [get, set]
 The Api.Models.Instance.Id of Instance More...
 
Instance Instance [get, set]
 The Models.Instance the InstanceUser belongs to More...
 
- Properties inherited from Tgstation.Server.Api.Models.InstanceUser
long? UserId [get, set]
 The Internal.User.Id of the User the InstanceUser belongs to More...
 
InstanceUserRightsInstanceUserRights [get, set]
 The Rights.InstanceUserRights of the InstanceUser More...
 
ByondRightsByondRights [get, set]
 The Rights.ByondRights of the InstanceUser More...
 
DreamDaemonRightsDreamDaemonRights [get, set]
 The Rights.DreamDaemonRights of the InstanceUser More...
 
DreamMakerRightsDreamMakerRights [get, set]
 The Rights.DreamMakerRights of the InstanceUser More...
 
RepositoryRightsRepositoryRights [get, set]
 The Rights.RepositoryRights of the InstanceUser More...
 
ChatBotRightsChatBotRights [get, set]
 The Rights.ChatBotRights of the InstanceUser More...
 
ConfigurationRightsConfigurationRights [get, set]
 The Rights.ConfigurationRights of the InstanceUser More...
 
+

Detailed Description

+
+

Definition at line 6 of file InstanceUser.cs.

+

Member Function Documentation

+ +

◆ ToApi()

+ +
+
+ + + + + + + +
Api.Models.InstanceUser Tgstation.Server.Host.Models.InstanceUser.ToApi ()
+
+ +

Convert the InstanceUser to it's API form

+
Returns
A new Api.Models.InstanceUser
+ +
+
+

Member Data Documentation

+ +

◆ AnyRights

+ +
+
+ + + + +
bool Tgstation.Server.Host.Models.InstanceUser.AnyRights
+
+Initial value:
=> ByondRights != Api.Rights.ByondRights.None ||
ChatBotRights != Api.Rights.ChatBotRights.None ||
ConfigurationRights != Api.Rights.ConfigurationRights.None ||
DreamDaemonRights != Api.Rights.DreamDaemonRights.None ||
DreamMakerRights != Api.Rights.DreamMakerRights.None ||
InstanceUserRights != Api.Rights.InstanceUserRights.None
+

If the InstanceUser has any instance rights

+ +

Definition at line 27 of file InstanceUser.cs.

+ +
+
+

Property Documentation

+ +

◆ Id

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.InstanceUser.Id
+
+getset
+
+ +

The row Id

+ +

Definition at line 11 of file InstanceUser.cs.

+
11 { get; set; }
+
+
+ +

◆ Instance

+ +
+
+ + + + + +
+ + + + +
Instance Tgstation.Server.Host.Models.InstanceUser.Instance
+
+getset
+
+ +

The Models.Instance the InstanceUser belongs to

+ +

Definition at line 22 of file InstanceUser.cs.

+
22 { get; set; }
+
+
+ +

◆ InstanceId

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.InstanceUser.InstanceId
+
+getset
+
+ +

The Api.Models.Instance.Id of Instance

+ +

Definition at line 16 of file InstanceUser.cs.

+
16 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.png new file mode 100644 index 0000000000000000000000000000000000000000..d385a3070d25ec3dbfefad25dc7bda859e4a4a65 GIT binary patch literal 963 zcmV;!13dhRP)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d000A0NkljYTo~mZ+8+E5Z&zFo$9HtrHP>WXAKpsdF}p$vg=V+>3}F=i`-+t$@*UBIDnru+D+! z&Cg-{Ab^*W_m8)r^W(P5HG5vW+!p;Vgtyz}Vx|m$dwHz@1)#35$rPQl5Sx<{sHWAw z2Eab+ssjLLM3JI~6zM}b82u_!UoxoIK5Yx!`c1AVbF9v4vbozE#e!x4dP0>p2(J+o z5pkw(EdbL~LI4AL+lpd=7L)_v^8X_M^;%b*%>mpWz!Y6wXaT4R`%%O2xBIvSW&(B4 zKB=6&pe2Ci7H~aW?+E=-qc$IXtO)?O%mIis*`q}@L9g-edO!@oNE<7z3-Q}JDEdVY zaMQDWv*-bjPl48H&lc+%vnfE;VRfWFr8lBF1)Qw)DG;e9h=`=I4PXP<07OLc+6%yO97kdU_^5pW zWVY-8zP^$Z$PVE3{<#UH2e6yq2CxADWVQ_eAhT@%0GVwA0LW|`06=Ej001)E1^|%R zHUNOkwgCWSwhaIvvuywXnQa3A_@tFmN@k+~&H@TO!a$zkU6RL5+(5 zBD?bddffMQ+CDb^D!?Gi0ytwqQG-Gs%E2gCIr=ox?;y(zc4&}OnKdx}=o(VHu1W(&+@Y5;vwIS;a80Lv}ly0_jD`g2AN-YmCO z9RmnDXb@wuNH;;R^uP9i7=RHK)!MQLL`A>o0d9J>Zx%h^!70#s?AcshOE#sadaI7q zr|cH&9o)4o_c%HQf>x$v`VjSBPiU1I08h_VfZt;tfNyXBzuJZhxGMx8g+*HcAdPJR l8^8ttkk?)SN+~6={Q-{QHE+xt|0Vzc002ovPDHLkV1i!zs%roM literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job-members.html new file mode 100644 index 0000000000..08f1b7b180 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job-members.html @@ -0,0 +1,98 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.Job Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html new file mode 100644 index 0000000000..adf6ac1189 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html @@ -0,0 +1,282 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.Job Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.Job Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.Job:
+
+
+ + +Tgstation.Server.Api.Models.Internal.Job + +
+ + + + + +

+Public Member Functions

Api.Models.Job ToApi ()
 Convert the Job to it's API form More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

User StartedBy [get, set]
 See Api.Models.Job.StartedBy More...
 
User CancelledBy [get, set]
 See Api.Models.Job.CancelledBy More...
 
Instance Instance [get, set]
 The Models.Instance the job belongs to if any More...
 
Func< CancellationToken, Task > PostComplete [get, set]
 A Task to run after the job completes. This will not affect the Api.Models.Internal.Job.StoppedAt time, unless it is cancelled or errors More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.Job
long Id [get, set]
 The Job ID More...
 
string Description [get, set]
 English description of the Job More...
 
string ExceptionDetails [get, set]
 Details of any exceptions caught during the Job More...
 
DateTimeOffset? StartedAt [get, set]
 When the Job was started More...
 
DateTimeOffset? StoppedAt [get, set]
 When the Job stopped More...
 
bool? Cancelled [get, set]
 If the Job was cancelled More...
 
RightsTypeCancelRightsType [get, set]
 The RightsType of CancelRight if it can be cancelled More...
 
ulong? CancelRight [get, set]
 The Rights required to cancel the Job More...
 
+

Detailed Description

+
+

Definition at line 10 of file Job.cs.

+

Member Function Documentation

+ +

◆ ToApi()

+ +
+
+ + + + + + + +
Api.Models.Job Tgstation.Server.Host.Models.Job.ToApi ()
+
+ +

Convert the Job to it's API form

+
Returns
A new Api.Models.Job
+ +
+
+

Property Documentation

+ +

◆ CancelledBy

+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Host.Models.Job.CancelledBy
+
+getset
+
+ +

See Api.Models.Job.CancelledBy

+ +

Definition at line 21 of file Job.cs.

+
21 { get; set; }
+

Referenced by Tgstation.Server.Host.Core.JobManager.CancelJob().

+ +
+
+ +

◆ Instance

+ +
+
+ + + + + +
+ + + + +
Instance Tgstation.Server.Host.Models.Job.Instance
+
+getset
+
+ +

The Models.Instance the job belongs to if any

+ +

Definition at line 27 of file Job.cs.

+
27 { get; set; }
+
+
+ +

◆ PostComplete

+ +
+
+ + + + + +
+ + + + +
Func<CancellationToken, Task> Tgstation.Server.Host.Models.Job.PostComplete
+
+getset
+
+ +

A Task to run after the job completes. This will not affect the Api.Models.Internal.Job.StoppedAt time, unless it is cancelled or errors

+

This should only be used where there are database dependencies that also rely on the Job itself completing A.K.A. manually initiated CompileJobs

+ +

Definition at line 34 of file Job.cs.

+
34 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess(), and Tgstation.Server.Host.Core.JobManager.RunJob().

+ +
+
+ +

◆ StartedBy

+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Host.Models.Job.StartedBy
+
+getset
+
+ +

See Api.Models.Job.StartedBy

+ +

Definition at line 16 of file Job.cs.

+
16 { get; set; }
+
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Host/Models/Job.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.png new file mode 100644 index 0000000000000000000000000000000000000000..68bf57f479cf9527a2b30a119edc9cd9767adcda GIT binary patch literal 909 zcmeAS@N?(olHy`uVBq!ia0vp^Uw}A(gBeIl)~qlAQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;px218N_8#NS%Grm0URZU0*OeLT82JLfUs$cX za>lYn*UqqrZ{}RDE2*@txbMq7<)VE`=N(I))$GdHUHx(~--6plk5_HaytK@ND<$4` zOSevo+_q|$30-cnj@vcWFR-PaUQ+y`R@yg7_U6mtvt>UHbDw>G`S_Q-mk-|j%=pjo z%V_WJTiKiM%Eg7uYnQQUe>bgF{ch@o9bfdmytbBg-u+kV@@~iP*G)WLbX(U>y*K^B z^YU9^?-%>6YhACsLT|p0>egvd({+WHRefI=ANGFZ3^Vp?hkpFsvEttMeT|d8SpH4@ zJn4&*ZAttRm6vCK)m<=ERe7oZQrgM;lK*vhkn+DsjhvRk^uzrZ!--`*7v$wRR~kFn z&-fg;yk*{1X@zz*69+cmj0Rx%Gf0{&WHicfVotfx!ggW-C+`GDVJU@XGzI(omQI=E zE7A}H)9`|8*EFjITfhDKA--N#oYCdhvagfBf4}v%eQy1ME!~O-wur0S^6lHU=iB|o z``Yfg{}=r7FR^-8JT$gg%O&nWW6P#QcEvU87iKxJW!6G&%okqseUai2xva4zO>IYp zZ$fTo_tzN~Gi;oq=coNhDN29-<<(!l665=a-j*L&7S70YGd$chNu2S^24}k)22u>m z?>Crfm|iG0kDeu`t=0IJ%Wv1t6?Z2J?+)C1e!Fx0vhwiK+-h|2eg|a>q?p-gp@_O<56m{E6RHda3#q!yk^jzWELEi(!E{Z~n(1uaisTv%HNa UOYiL91m+zEPgg&ebxsLQ02{2lPyhe` literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_design_time_db_context_factory_helpers-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_design_time_db_context_factory_helpers-members.html new file mode 100644 index 0000000000..65af59eacc --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_design_time_db_context_factory_helpers-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.Migrations.DesignTimeDbContextFactoryHelpers Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_design_time_db_context_factory_helpers.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_design_time_db_context_factory_helpers.html new file mode 100644 index 0000000000..9b84c7af63 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_design_time_db_context_factory_helpers.html @@ -0,0 +1,208 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.Migrations.DesignTimeDbContextFactoryHelpers Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.Migrations.DesignTimeDbContextFactoryHelpers Class Reference
+
+
+ +

Contains helpers for creating design time DatabaseContext<TParentContext>s + More...

+ + + + + +

+Static Public Member Functions

static IOptions< DatabaseConfigurationGetDbContextOptions ()
 Get the IOptions<TOptions> for the DatabaseConfiguration More...
 
+ + + + + + + +

+Private Attributes

const string RootJson = "appsettings.json"
 Path to the json file to use for migrations configuration More...
 
const string DevJson = "appsettings.Development.json"
 Path to the development json file to use for migrations configuration More...
 
+

Detailed Description

+

Contains helpers for creating design time DatabaseContext<TParentContext>s

+ +

Definition at line 12 of file DesignTimeDbContextFactoryHelpers.cs.

+

Member Function Documentation

+ +

◆ GetDbContextOptions()

+ +
+
+ + + + + +
+ + + + + + + +
static IOptions<DatabaseConfiguration> Tgstation.Server.Host.Models.Migrations.DesignTimeDbContextFactoryHelpers.GetDbContextOptions ()
+
+static
+
+ +

Get the IOptions<TOptions> for the DatabaseConfiguration

+
Returns
The IOptions<TOptions> for the DatabaseConfiguration
+ +

Definition at line 28 of file DesignTimeDbContextFactoryHelpers.cs.

+
29  {
30  var builder = new ConfigurationBuilder();
31  builder.SetBasePath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
32  builder.AddJsonFile(RootJson);
33  builder.AddJsonFile(DevJson);
34  var configuration = builder.Build();
35  return Options.Create(configuration.GetSection(DatabaseConfiguration.Section).Get<DatabaseConfiguration>());
36  }
const string Section
The key for the Microsoft.Extensions.Configuration.IConfigurationSection the DatabaseConfiguration re...
+
const string DevJson
Path to the development json file to use for migrations configuration
+
Configuration options for the Models.DatabaseContext<TParentContext>
+
const string RootJson
Path to the json file to use for migrations configuration
+
+

References Tgstation.Server.Host.Models.Migrations.DesignTimeDbContextFactoryHelpers.DevJson, Tgstation.Server.Host.Models.Migrations.DesignTimeDbContextFactoryHelpers.RootJson, and Tgstation.Server.Host.Configuration.DatabaseConfiguration.Section.

+ +

Referenced by Tgstation.Server.Host.Models.Migrations.MySqlDesignTimeDbContextFactory.CreateDbContext(), and Tgstation.Server.Host.Models.Migrations.SqlServerDesignTimeDbContextFactory.CreateDbContext().

+ +
+
+

Member Data Documentation

+ +

◆ DevJson

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Models.Migrations.DesignTimeDbContextFactoryHelpers.DevJson = "appsettings.Development.json"
+
+private
+
+ +

Path to the development json file to use for migrations configuration

+ +

Definition at line 22 of file DesignTimeDbContextFactoryHelpers.cs.

+ +

Referenced by Tgstation.Server.Host.Models.Migrations.DesignTimeDbContextFactoryHelpers.GetDbContextOptions().

+ +
+
+ +

◆ RootJson

+ +
+
+ + + + + +
+ + + + +
const string Tgstation.Server.Host.Models.Migrations.DesignTimeDbContextFactoryHelpers.RootJson = "appsettings.json"
+
+private
+
+ +

Path to the json file to use for migrations configuration

+ +

Definition at line 17 of file DesignTimeDbContextFactoryHelpers.cs.

+ +

Referenced by Tgstation.Server.Host.Models.Migrations.DesignTimeDbContextFactoryHelpers.GetDbContextOptions().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security-members.html new file mode 100644 index 0000000000..249fd585fb --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity, including all inherited members.

+ + + + +
BuildTargetModel(ModelBuilder modelBuilder)Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurityprotected
Down(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurityprotected
Up(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurityprotected
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html new file mode 100644 index 0000000000..5b1478c1ab --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html @@ -0,0 +1,228 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity Class Reference
+
+
+ +

Add the Api.Models.Internal.CompileJob.MinimumSecurityLevel and DreamMaker.ApiValidationSecurityLevel columns for MSSQL + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity:
+
+
+ + +Migration + +
+ + + + + + + + + + + +

+Protected Member Functions

override void Up (MigrationBuilder migrationBuilder)
 Applies the migration More...
 
override void Down (MigrationBuilder migrationBuilder)
 Unapplies the migration More...
 
override void BuildTargetModel (ModelBuilder modelBuilder)
 Builds the target model More...
 
+

Detailed Description

+

Add the Api.Models.Internal.CompileJob.MinimumSecurityLevel and DreamMaker.ApiValidationSecurityLevel columns for MSSQL

+ +

Definition at line 10 of file 20180918021228_MSAddMinimumSecurity.cs.

+

Member Function Documentation

+ +

◆ BuildTargetModel()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.BuildTargetModel (ModelBuilder modelBuilder)
+
+protected
+
+ +

Builds the target model

+
Parameters
+ + +
modelBuilderThe ModelBuilder to use
+
+
+ +

Definition at line 19 of file 20180918021228_MSAddMinimumSecurity.Designer.cs.

+
20  {
21 #pragma warning disable 612, 618
22  modelBuilder
23  .HasAnnotation("ProductVersion", "2.1.3-rtm-32065")
24  .HasAnnotation("Relational:MaxIdentifierLength", 128)
25  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
26 
27  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
28  {
29  b.Property<long>("Id")
30  .ValueGeneratedOnAdd()
31  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
32 
33  b.Property<string>("ConnectionString")
34  .IsRequired();
35 
36  b.Property<bool?>("Enabled");
37 
38  b.Property<long>("InstanceId");
39 
40  b.Property<string>("Name")
41  .IsRequired();
42 
43  b.Property<int?>("Provider");
44 
45  b.HasKey("Id");
46 
47  b.HasIndex("InstanceId");
48 
49  b.HasIndex("Name")
50  .IsUnique();
51 
52  b.ToTable("ChatBots");
53  });
54 
55  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
56  {
57  b.Property<long>("Id")
58  .ValueGeneratedOnAdd()
59  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
60 
61  b.Property<long>("ChatSettingsId");
62 
63  b.Property<decimal?>("DiscordChannelId")
64  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
65 
66  b.Property<string>("IrcChannel");
67 
68  b.Property<bool?>("IsAdminChannel")
69  .IsRequired();
70 
71  b.Property<bool?>("IsUpdatesChannel")
72  .IsRequired();
73 
74  b.Property<bool?>("IsWatchdogChannel")
75  .IsRequired();
76 
77  b.Property<string>("Tag");
78 
79  b.HasKey("Id");
80 
81  b.HasIndex("ChatSettingsId", "DiscordChannelId")
82  .IsUnique()
83  .HasFilter("[DiscordChannelId] IS NOT NULL");
84 
85  b.HasIndex("ChatSettingsId", "IrcChannel")
86  .IsUnique()
87  .HasFilter("[IrcChannel] IS NOT NULL");
88 
89  b.ToTable("ChatChannels");
90  });
91 
92  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
93  {
94  b.Property<long>("Id")
95  .ValueGeneratedOnAdd()
96  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
97 
98  b.Property<string>("ByondVersion")
99  .IsRequired();
100 
101  b.Property<Guid?>("DirectoryName");
102 
103  b.Property<string>("DmeName");
104 
105  b.Property<long?>("JobId");
106 
107  b.Property<int>("MinimumSecurityLevel");
108 
109  b.Property<string>("Output");
110 
111  b.Property<long>("RevisionInformationId");
112 
113  b.HasKey("Id");
114 
115  b.HasIndex("DirectoryName");
116 
117  b.HasIndex("JobId");
118 
119  b.HasIndex("RevisionInformationId");
120 
121  b.ToTable("CompileJobs");
122  });
123 
124  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
125  {
126  b.Property<long>("Id")
127  .ValueGeneratedOnAdd()
128  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
129 
130  b.Property<string>("AccessToken");
131 
132  b.Property<bool?>("AllowWebClient")
133  .IsRequired();
134 
135  b.Property<bool?>("AutoStart")
136  .IsRequired();
137 
138  b.Property<long>("InstanceId");
139 
140  b.Property<int>("PrimaryPort");
141 
142  b.Property<int?>("ProcessId");
143 
144  b.Property<int>("SecondaryPort");
145 
146  b.Property<int>("SecurityLevel");
147 
148  b.Property<bool?>("SoftRestart")
149  .IsRequired();
150 
151  b.Property<bool?>("SoftShutdown")
152  .IsRequired();
153 
154  b.Property<long>("StartupTimeout");
155 
156  b.HasKey("Id");
157 
158  b.HasIndex("InstanceId")
159  .IsUnique();
160 
161  b.ToTable("DreamDaemonSettings");
162  });
163 
164  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
165  {
166  b.Property<long>("Id")
167  .ValueGeneratedOnAdd()
168  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
169 
170  b.Property<int>("ApiValidationPort");
171 
172  b.Property<int>("ApiValidationSecurityLevel");
173 
174  b.Property<long>("InstanceId");
175 
176  b.Property<string>("ProjectName");
177 
178  b.HasKey("Id");
179 
180  b.HasIndex("InstanceId")
181  .IsUnique();
182 
183  b.ToTable("DreamMakerSettings");
184  });
185 
186  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
187  {
188  b.Property<long>("Id")
189  .ValueGeneratedOnAdd()
190  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
191 
192  b.Property<long>("AutoUpdateInterval");
193 
194  b.Property<int>("ConfigurationType");
195 
196  b.Property<string>("Name")
197  .IsRequired();
198 
199  b.Property<bool?>("Online")
200  .IsRequired();
201 
202  b.Property<string>("Path")
203  .IsRequired();
204 
205  b.Property<long?>("WatchdogReattachInformationId");
206 
207  b.HasKey("Id");
208 
209  b.HasIndex("Path")
210  .IsUnique();
211 
212  b.HasIndex("WatchdogReattachInformationId");
213 
214  b.ToTable("Instances");
215  });
216 
217  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
218  {
219  b.Property<long>("Id")
220  .ValueGeneratedOnAdd()
221  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
222 
223  b.Property<decimal>("ByondRights")
224  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
225 
226  b.Property<decimal>("ChatBotRights")
227  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
228 
229  b.Property<decimal>("ConfigurationRights")
230  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
231 
232  b.Property<decimal>("DreamDaemonRights")
233  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
234 
235  b.Property<decimal>("DreamMakerRights")
236  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
237 
238  b.Property<long>("InstanceId");
239 
240  b.Property<decimal>("InstanceUserRights")
241  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
242 
243  b.Property<decimal>("RepositoryRights")
244  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
245 
246  b.Property<long?>("UserId")
247  .IsRequired();
248 
249  b.HasKey("Id");
250 
251  b.HasIndex("InstanceId");
252 
253  b.HasIndex("UserId", "InstanceId")
254  .IsUnique();
255 
256  b.ToTable("InstanceUsers");
257  });
258 
259  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
260  {
261  b.Property<long>("Id")
262  .ValueGeneratedOnAdd()
263  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
264 
265  b.Property<decimal?>("CancelRight")
266  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
267 
268  b.Property<decimal?>("CancelRightsType")
269  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
270 
271  b.Property<bool?>("Cancelled")
272  .IsRequired();
273 
274  b.Property<long?>("CancelledById");
275 
276  b.Property<string>("Description")
277  .IsRequired();
278 
279  b.Property<string>("ExceptionDetails");
280 
281  b.Property<long>("InstanceId");
282 
283  b.Property<DateTimeOffset?>("StartedAt")
284  .IsRequired();
285 
286  b.Property<long>("StartedById");
287 
288  b.Property<DateTimeOffset?>("StoppedAt");
289 
290  b.HasKey("Id");
291 
292  b.HasIndex("CancelledById");
293 
294  b.HasIndex("InstanceId");
295 
296  b.HasIndex("StartedById");
297 
298  b.ToTable("Jobs");
299  });
300 
301  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
302  {
303  b.Property<long>("Id")
304  .ValueGeneratedOnAdd()
305  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
306 
307  b.Property<string>("AccessIdentifier")
308  .IsRequired();
309 
310  b.Property<string>("ChatChannelsJson")
311  .IsRequired();
312 
313  b.Property<string>("ChatCommandsJson")
314  .IsRequired();
315 
316  b.Property<long?>("CompileJobId");
317 
318  b.Property<bool>("IsPrimary");
319 
320  b.Property<int>("Port");
321 
322  b.Property<int>("ProcessId");
323 
324  b.Property<int>("RebootState");
325 
326  b.Property<string>("ServerCommandsJson")
327  .IsRequired();
328 
329  b.HasKey("Id");
330 
331  b.HasIndex("CompileJobId");
332 
333  b.ToTable("ReattachInformations");
334  });
335 
336  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
337  {
338  b.Property<long>("Id")
339  .ValueGeneratedOnAdd()
340  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
341 
342  b.Property<string>("AccessToken");
343 
344  b.Property<string>("AccessUser");
345 
346  b.Property<bool?>("AutoUpdatesKeepTestMerges")
347  .IsRequired();
348 
349  b.Property<bool?>("AutoUpdatesSynchronize")
350  .IsRequired();
351 
352  b.Property<string>("CommitterEmail")
353  .IsRequired();
354 
355  b.Property<string>("CommitterName")
356  .IsRequired();
357 
358  b.Property<long>("InstanceId");
359 
360  b.Property<bool?>("PushTestMergeCommits")
361  .IsRequired();
362 
363  b.Property<bool?>("ShowTestMergeCommitters")
364  .IsRequired();
365 
366  b.HasKey("Id");
367 
368  b.HasIndex("InstanceId")
369  .IsUnique();
370 
371  b.ToTable("RepositorySettings");
372  });
373 
374  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
375  {
376  b.Property<long>("Id")
377  .ValueGeneratedOnAdd()
378  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
379 
380  b.Property<long>("RevisionInformationId");
381 
382  b.Property<long>("TestMergeId");
383 
384  b.HasKey("Id");
385 
386  b.HasIndex("RevisionInformationId");
387 
388  b.HasIndex("TestMergeId");
389 
390  b.ToTable("RevInfoTestMerges");
391  });
392 
393  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
394  {
395  b.Property<long>("Id")
396  .ValueGeneratedOnAdd()
397  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
398 
399  b.Property<string>("CommitSha")
400  .IsRequired()
401  .HasMaxLength(40);
402 
403  b.Property<long>("InstanceId");
404 
405  b.Property<string>("OriginCommitSha")
406  .IsRequired()
407  .HasMaxLength(40);
408 
409  b.HasKey("Id");
410 
411  b.HasIndex("CommitSha")
412  .IsUnique();
413 
414  b.HasIndex("InstanceId");
415 
416  b.ToTable("RevisionInformations");
417  });
418 
419  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
420  {
421  b.Property<long>("Id")
422  .ValueGeneratedOnAdd()
423  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
424 
425  b.Property<string>("Author")
426  .IsRequired();
427 
428  b.Property<string>("BodyAtMerge")
429  .IsRequired();
430 
431  b.Property<string>("Comment");
432 
433  b.Property<DateTimeOffset>("MergedAt");
434 
435  b.Property<long>("MergedById");
436 
437  b.Property<int?>("Number")
438  .IsRequired();
439 
440  b.Property<long?>("PrimaryRevisionInformationId");
441 
442  b.Property<string>("PullRequestRevision")
443  .IsRequired();
444 
445  b.Property<string>("TitleAtMerge")
446  .IsRequired();
447 
448  b.Property<string>("Url")
449  .IsRequired();
450 
451  b.HasKey("Id");
452 
453  b.HasIndex("MergedById");
454 
455  b.HasIndex("PrimaryRevisionInformationId")
456  .IsUnique()
457  .HasFilter("[PrimaryRevisionInformationId] IS NOT NULL");
458 
459  b.ToTable("TestMerges");
460  });
461 
462  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
463  {
464  b.Property<long>("Id")
465  .ValueGeneratedOnAdd()
466  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
467 
468  b.Property<decimal>("AdministrationRights")
469  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
470 
471  b.Property<string>("CanonicalName")
472  .IsRequired();
473 
474  b.Property<DateTimeOffset?>("CreatedAt")
475  .IsRequired();
476 
477  b.Property<long?>("CreatedById");
478 
479  b.Property<bool?>("Enabled")
480  .IsRequired();
481 
482  b.Property<decimal>("InstanceManagerRights")
483  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
484 
485  b.Property<DateTimeOffset?>("LastPasswordUpdate");
486 
487  b.Property<string>("Name")
488  .IsRequired();
489 
490  b.Property<string>("PasswordHash");
491 
492  b.Property<string>("SystemIdentifier");
493 
494  b.HasKey("Id");
495 
496  b.HasIndex("CanonicalName")
497  .IsUnique();
498 
499  b.HasIndex("CreatedById");
500 
501  b.ToTable("Users");
502  });
503 
504  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
505  {
506  b.Property<long>("Id")
507  .ValueGeneratedOnAdd()
508  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
509 
510  b.Property<long?>("AlphaId");
511 
512  b.Property<bool>("AlphaIsActive");
513 
514  b.Property<long?>("BravoId");
515 
516  b.HasKey("Id");
517 
518  b.HasIndex("AlphaId");
519 
520  b.HasIndex("BravoId");
521 
522  b.ToTable("WatchdogReattachInformations");
523  });
524 
525  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
526  {
527  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
528  .WithMany("ChatSettings")
529  .HasForeignKey("InstanceId")
530  .OnDelete(DeleteBehavior.Cascade);
531  });
532 
533  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
534  {
535  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
536  .WithMany("Channels")
537  .HasForeignKey("ChatSettingsId")
538  .OnDelete(DeleteBehavior.Cascade);
539  });
540 
541  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
542  {
543  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
544  .WithMany()
545  .HasForeignKey("JobId");
546 
547  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
548  .WithMany("CompileJobs")
549  .HasForeignKey("RevisionInformationId")
550  .OnDelete(DeleteBehavior.Cascade);
551  });
552 
553  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
554  {
555  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
556  .WithOne("DreamDaemonSettings")
557  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
558  .OnDelete(DeleteBehavior.Cascade);
559  });
560 
561  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
562  {
563  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
564  .WithOne("DreamMakerSettings")
565  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
566  .OnDelete(DeleteBehavior.Cascade);
567  });
568 
569  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
570  {
571  b.HasOne("Tgstation.Server.Host.Models.WatchdogReattachInformation", "WatchdogReattachInformation")
572  .WithMany()
573  .HasForeignKey("WatchdogReattachInformationId");
574  });
575 
576  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
577  {
578  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
579  .WithMany("InstanceUsers")
580  .HasForeignKey("InstanceId")
581  .OnDelete(DeleteBehavior.Cascade);
582 
583  b.HasOne("Tgstation.Server.Host.Models.User")
584  .WithMany("InstanceUsers")
585  .HasForeignKey("UserId")
586  .OnDelete(DeleteBehavior.Cascade);
587  });
588 
589  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
590  {
591  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
592  .WithMany()
593  .HasForeignKey("CancelledById");
594 
595  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
596  .WithMany("Jobs")
597  .HasForeignKey("InstanceId")
598  .OnDelete(DeleteBehavior.Cascade);
599 
600  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
601  .WithMany()
602  .HasForeignKey("StartedById")
603  .OnDelete(DeleteBehavior.Cascade);
604  });
605 
606  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
607  {
608  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
609  .WithMany()
610  .HasForeignKey("CompileJobId");
611  });
612 
613  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
614  {
615  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
616  .WithOne("RepositorySettings")
617  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
618  .OnDelete(DeleteBehavior.Cascade);
619  });
620 
621  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
622  {
623  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
624  .WithMany("ActiveTestMerges")
625  .HasForeignKey("RevisionInformationId")
626  .OnDelete(DeleteBehavior.Cascade);
627 
628  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
629  .WithMany("RevisonInformations")
630  .HasForeignKey("TestMergeId")
631  .OnDelete(DeleteBehavior.Cascade);
632  });
633 
634  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
635  {
636  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
637  .WithMany("RevisionInformations")
638  .HasForeignKey("InstanceId")
639  .OnDelete(DeleteBehavior.Cascade);
640  });
641 
642  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
643  {
644  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
645  .WithMany("TestMerges")
646  .HasForeignKey("MergedById")
647  .OnDelete(DeleteBehavior.Restrict);
648 
649  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
650  .WithOne("PrimaryTestMerge")
651  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
652  .OnDelete(DeleteBehavior.SetNull);
653  });
654 
655  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
656  {
657  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
658  .WithMany("CreatedUsers")
659  .HasForeignKey("CreatedById");
660  });
661 
662  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
663  {
664  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
665  .WithMany()
666  .HasForeignKey("AlphaId");
667 
668  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
669  .WithMany()
670  .HasForeignKey("BravoId");
671  });
672 #pragma warning restore 612, 618
673  }
+
+
+ +

◆ Down()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.Down (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Unapplies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 38 of file 20180918021228_MSAddMinimumSecurity.cs.

+
39  {
40  if (migrationBuilder == null)
41  throw new ArgumentNullException(nameof(migrationBuilder));
42 
43  migrationBuilder.DropColumn(
44  name: "ApiValidationSecurityLevel",
45  table: "DreamMakerSettings");
46 
47  migrationBuilder.DropColumn(
48  name: "MinimumSecurityLevel",
49  table: "CompileJobs");
50  }
+
+
+ +

◆ Up()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.Up (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Applies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 16 of file 20180918021228_MSAddMinimumSecurity.cs.

+
17  {
18  if (migrationBuilder == null)
19  throw new ArgumentNullException(nameof(migrationBuilder));
20 
21  migrationBuilder.AddColumn<int>(
22  name: "ApiValidationSecurityLevel",
23  table: "DreamMakerSettings",
24  nullable: false,
25  defaultValue: (int)DreamDaemonSecurity.Safe);
26 
27  migrationBuilder.AddColumn<int>(
28  name: "MinimumSecurityLevel",
29  table: "CompileJobs",
30  nullable: false,
31  defaultValue: (int)DreamDaemonSecurity.Safe);
32  }
DreamDaemonSecurity
DreamDaemon's security level
+
+
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.png new file mode 100644 index 0000000000000000000000000000000000000000..7abe398c969a846eefd929ca4433d2335aa72d56 GIT binary patch literal 1054 zcmeAS@N?(olHy`uVBq!ia0y~yU~B-g12~w0qM;8dO*(F{x-y z2xXb_t@huPlv8h+J%1h5QBFAj?xU)wtan+$~3=~Rl+S3r^<>{rV%EkqBh9jDpbC}L) zOJ*$nTl;rbx0E&G8H+~@+hqQq&-#DksQl{p>ZRWkI<79WKVsCps_uC~r!N%4J zZ+_NZS^LkJ`8?CPRE8}@>It_hZt*WTUXp)V{_}^rKd}l2ruJX@*xL}kr8YCi>g@52 z3E%7vciEoVKl`n3%vA9LI}7*sMYrT`Pf+8JWjo(ieJU@#`ubjb&NDOiJvF@W?=^?* z&-a%us@1DLpLI9pfZ#PTuC+7R-sSpCiV~l`ef2|wC#Jl=mDJ7^KQ<1$eC_Y+lDl`G z?E03T6s;ir-k_w^@b$GWNu!6$%9IzJy*jt;af6#9qt%=E^3!LWeOP$5-N`a#s+sdM zXZhXrQ_eoO;|)0gG`{4e#M?TZ13krRZ~YEzWV@BOTWtEuS#KJ|4!wV@$L==E`{RaL z=WOfEZ%3AwOP*)(VG`ZY>ZBcOHIHS>wPMD8_X*xH@_Te;>V0{bcDWWQCloc`=dPId z)@Iu6-v2=k)BBZu%BTq$+xnUn)j~Z=IQz?KXx(CW4&|i73&V`grYo=f~5_* z<_qn`9^_5V{jm1YD&2;|cfaSYys1_GEI#(m(UkTQ;g9JjCQM)bQ1Wx$w#`Q$^?6#) z*xM&J?f2DpzusSd7{64vV0LNstl!Se3A|$S3iTK4PhhMwe|`3bZ^aG9` v6x&%hF$gutE1)H;I3{2c(Of!3;2)#r#-LD1QJpuy%*^2F>gTe~DWM4fa!0!` literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_fix_rev_info_index-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_fix_rev_info_index-members.html new file mode 100644 index 0000000000..b899c180af --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_fix_rev_info_index-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.Migrations.MSFixRevInfoIndex Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Models.Migrations.MSFixRevInfoIndex, including all inherited members.

+ + + + +
BuildTargetModel(ModelBuilder modelBuilder)Tgstation.Server.Host.Models.Migrations.MSFixRevInfoIndexprotected
Down(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MSFixRevInfoIndexprotected
Up(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MSFixRevInfoIndexprotected
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_fix_rev_info_index.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_fix_rev_info_index.html new file mode 100644 index 0000000000..fbeba2b2a2 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_fix_rev_info_index.html @@ -0,0 +1,227 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.Migrations.MSFixRevInfoIndex Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.Migrations.MSFixRevInfoIndex Class Reference
+
+
+ +

Make commit shas non-unique per Instance for MSSQL + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.Migrations.MSFixRevInfoIndex:
+
+
+ + +Migration + +
+ + + + + + + + + + + +

+Protected Member Functions

override void Up (MigrationBuilder migrationBuilder)
 Applies the migration More...
 
override void Down (MigrationBuilder migrationBuilder)
 Unpplies the migration More...
 
override void BuildTargetModel (ModelBuilder modelBuilder)
 Builds the target model More...
 
+

Detailed Description

+

Make commit shas non-unique per Instance for MSSQL

+ +

Definition at line 9 of file 20190219041825_MSFixRevInfoIndex.cs.

+

Member Function Documentation

+ +

◆ BuildTargetModel()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSFixRevInfoIndex.BuildTargetModel (ModelBuilder modelBuilder)
+
+protected
+
+ +

Builds the target model

+
Parameters
+ + +
modelBuilderThe ModelBuilder to use
+
+
+ +

Definition at line 19 of file 20190219041825_MSFixRevInfoIndex.Designer.cs.

+
20  {
21 #pragma warning disable 612, 618
22  modelBuilder
23  .HasAnnotation("ProductVersion", "2.1.4-rtm-31024")
24  .HasAnnotation("Relational:MaxIdentifierLength", 128)
25  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
26 
27  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
28  {
29  b.Property<long>("Id")
30  .ValueGeneratedOnAdd()
31  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
32 
33  b.Property<string>("ConnectionString")
34  .IsRequired();
35 
36  b.Property<bool?>("Enabled");
37 
38  b.Property<long>("InstanceId");
39 
40  b.Property<string>("Name")
41  .IsRequired();
42 
43  b.Property<int?>("Provider");
44 
45  b.HasKey("Id");
46 
47  b.HasIndex("InstanceId");
48 
49  b.HasIndex("Name")
50  .IsUnique();
51 
52  b.ToTable("ChatBots");
53  });
54 
55  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
56  {
57  b.Property<long>("Id")
58  .ValueGeneratedOnAdd()
59  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
60 
61  b.Property<long>("ChatSettingsId");
62 
63  b.Property<decimal?>("DiscordChannelId")
64  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
65 
66  b.Property<string>("IrcChannel");
67 
68  b.Property<bool?>("IsAdminChannel")
69  .IsRequired();
70 
71  b.Property<bool?>("IsUpdatesChannel")
72  .IsRequired();
73 
74  b.Property<bool?>("IsWatchdogChannel")
75  .IsRequired();
76 
77  b.Property<string>("Tag");
78 
79  b.HasKey("Id");
80 
81  b.HasIndex("ChatSettingsId", "DiscordChannelId")
82  .IsUnique()
83  .HasFilter("[DiscordChannelId] IS NOT NULL");
84 
85  b.HasIndex("ChatSettingsId", "IrcChannel")
86  .IsUnique()
87  .HasFilter("[IrcChannel] IS NOT NULL");
88 
89  b.ToTable("ChatChannels");
90  });
91 
92  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
93  {
94  b.Property<long>("Id")
95  .ValueGeneratedOnAdd()
96  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
97 
98  b.Property<string>("ByondVersion")
99  .IsRequired();
100 
101  b.Property<Guid?>("DirectoryName")
102  .IsRequired();
103 
104  b.Property<string>("DmeName")
105  .IsRequired();
106 
107  b.Property<long>("JobId");
108 
109  b.Property<int>("MinimumSecurityLevel");
110 
111  b.Property<string>("Output")
112  .IsRequired();
113 
114  b.Property<long>("RevisionInformationId");
115 
116  b.HasKey("Id");
117 
118  b.HasIndex("DirectoryName");
119 
120  b.HasIndex("JobId")
121  .IsUnique();
122 
123  b.HasIndex("RevisionInformationId");
124 
125  b.ToTable("CompileJobs");
126  });
127 
128  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
129  {
130  b.Property<long>("Id")
131  .ValueGeneratedOnAdd()
132  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
133 
134  b.Property<string>("AccessToken");
135 
136  b.Property<bool?>("AllowWebClient")
137  .IsRequired();
138 
139  b.Property<bool?>("AutoStart")
140  .IsRequired();
141 
142  b.Property<long>("InstanceId");
143 
144  b.Property<int>("PrimaryPort");
145 
146  b.Property<int?>("ProcessId");
147 
148  b.Property<int>("SecondaryPort");
149 
150  b.Property<int>("SecurityLevel");
151 
152  b.Property<bool?>("SoftRestart")
153  .IsRequired();
154 
155  b.Property<bool?>("SoftShutdown")
156  .IsRequired();
157 
158  b.Property<long>("StartupTimeout");
159 
160  b.HasKey("Id");
161 
162  b.HasIndex("InstanceId")
163  .IsUnique();
164 
165  b.ToTable("DreamDaemonSettings");
166  });
167 
168  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
169  {
170  b.Property<long>("Id")
171  .ValueGeneratedOnAdd()
172  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
173 
174  b.Property<int>("ApiValidationPort");
175 
176  b.Property<int>("ApiValidationSecurityLevel");
177 
178  b.Property<long>("InstanceId");
179 
180  b.Property<string>("ProjectName");
181 
182  b.HasKey("Id");
183 
184  b.HasIndex("InstanceId")
185  .IsUnique();
186 
187  b.ToTable("DreamMakerSettings");
188  });
189 
190  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
191  {
192  b.Property<long>("Id")
193  .ValueGeneratedOnAdd()
194  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
195 
196  b.Property<long>("AutoUpdateInterval");
197 
198  b.Property<int>("ConfigurationType");
199 
200  b.Property<string>("Name")
201  .IsRequired();
202 
203  b.Property<bool?>("Online")
204  .IsRequired();
205 
206  b.Property<string>("Path")
207  .IsRequired();
208 
209  b.HasKey("Id");
210 
211  b.HasIndex("Path")
212  .IsUnique();
213 
214  b.ToTable("Instances");
215  });
216 
217  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
218  {
219  b.Property<long>("Id")
220  .ValueGeneratedOnAdd()
221  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
222 
223  b.Property<decimal>("ByondRights")
224  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
225 
226  b.Property<decimal>("ChatBotRights")
227  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
228 
229  b.Property<decimal>("ConfigurationRights")
230  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
231 
232  b.Property<decimal>("DreamDaemonRights")
233  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
234 
235  b.Property<decimal>("DreamMakerRights")
236  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
237 
238  b.Property<long>("InstanceId");
239 
240  b.Property<decimal>("InstanceUserRights")
241  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
242 
243  b.Property<decimal>("RepositoryRights")
244  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
245 
246  b.Property<long?>("UserId")
247  .IsRequired();
248 
249  b.HasKey("Id");
250 
251  b.HasIndex("InstanceId");
252 
253  b.HasIndex("UserId", "InstanceId")
254  .IsUnique();
255 
256  b.ToTable("InstanceUsers");
257  });
258 
259  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
260  {
261  b.Property<long>("Id")
262  .ValueGeneratedOnAdd()
263  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
264 
265  b.Property<decimal?>("CancelRight")
266  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
267 
268  b.Property<decimal?>("CancelRightsType")
269  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
270 
271  b.Property<bool?>("Cancelled")
272  .IsRequired();
273 
274  b.Property<long?>("CancelledById");
275 
276  b.Property<string>("Description")
277  .IsRequired();
278 
279  b.Property<string>("ExceptionDetails");
280 
281  b.Property<long>("InstanceId");
282 
283  b.Property<DateTimeOffset?>("StartedAt")
284  .IsRequired();
285 
286  b.Property<long>("StartedById");
287 
288  b.Property<DateTimeOffset?>("StoppedAt");
289 
290  b.HasKey("Id");
291 
292  b.HasIndex("CancelledById");
293 
294  b.HasIndex("InstanceId");
295 
296  b.HasIndex("StartedById");
297 
298  b.ToTable("Jobs");
299  });
300 
301  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
302  {
303  b.Property<long>("Id")
304  .ValueGeneratedOnAdd()
305  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
306 
307  b.Property<string>("AccessIdentifier")
308  .IsRequired();
309 
310  b.Property<string>("ChatChannelsJson")
311  .IsRequired();
312 
313  b.Property<string>("ChatCommandsJson")
314  .IsRequired();
315 
316  b.Property<long>("CompileJobId");
317 
318  b.Property<bool>("IsPrimary");
319 
320  b.Property<int>("Port");
321 
322  b.Property<int>("ProcessId");
323 
324  b.Property<int>("RebootState");
325 
326  b.Property<string>("ServerCommandsJson")
327  .IsRequired();
328 
329  b.HasKey("Id");
330 
331  b.HasIndex("CompileJobId");
332 
333  b.ToTable("ReattachInformations");
334  });
335 
336  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
337  {
338  b.Property<long>("Id")
339  .ValueGeneratedOnAdd()
340  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
341 
342  b.Property<string>("AccessToken");
343 
344  b.Property<string>("AccessUser");
345 
346  b.Property<bool?>("AutoUpdatesKeepTestMerges")
347  .IsRequired();
348 
349  b.Property<bool?>("AutoUpdatesSynchronize")
350  .IsRequired();
351 
352  b.Property<string>("CommitterEmail")
353  .IsRequired();
354 
355  b.Property<string>("CommitterName")
356  .IsRequired();
357 
358  b.Property<long>("InstanceId");
359 
360  b.Property<bool?>("PostTestMergeComment")
361  .IsRequired();
362 
363  b.Property<bool?>("PushTestMergeCommits")
364  .IsRequired();
365 
366  b.Property<bool?>("ShowTestMergeCommitters")
367  .IsRequired();
368 
369  b.HasKey("Id");
370 
371  b.HasIndex("InstanceId")
372  .IsUnique();
373 
374  b.ToTable("RepositorySettings");
375  });
376 
377  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
378  {
379  b.Property<long>("Id")
380  .ValueGeneratedOnAdd()
381  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
382 
383  b.Property<long>("RevisionInformationId");
384 
385  b.Property<long>("TestMergeId");
386 
387  b.HasKey("Id");
388 
389  b.HasIndex("RevisionInformationId");
390 
391  b.HasIndex("TestMergeId");
392 
393  b.ToTable("RevInfoTestMerges");
394  });
395 
396  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
397  {
398  b.Property<long>("Id")
399  .ValueGeneratedOnAdd()
400  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
401 
402  b.Property<string>("CommitSha")
403  .IsRequired()
404  .HasMaxLength(40);
405 
406  b.Property<long>("InstanceId");
407 
408  b.Property<string>("OriginCommitSha")
409  .IsRequired()
410  .HasMaxLength(40);
411 
412  b.HasKey("Id");
413 
414  b.HasIndex("InstanceId", "CommitSha")
415  .IsUnique();
416 
417  b.ToTable("RevisionInformations");
418  });
419 
420  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
421  {
422  b.Property<long>("Id")
423  .ValueGeneratedOnAdd()
424  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
425 
426  b.Property<string>("Author")
427  .IsRequired();
428 
429  b.Property<string>("BodyAtMerge")
430  .IsRequired();
431 
432  b.Property<string>("Comment");
433 
434  b.Property<DateTimeOffset>("MergedAt");
435 
436  b.Property<long>("MergedById");
437 
438  b.Property<int?>("Number")
439  .IsRequired();
440 
441  b.Property<long?>("PrimaryRevisionInformationId")
442  .IsRequired();
443 
444  b.Property<string>("PullRequestRevision")
445  .IsRequired();
446 
447  b.Property<string>("TitleAtMerge")
448  .IsRequired();
449 
450  b.Property<string>("Url")
451  .IsRequired();
452 
453  b.HasKey("Id");
454 
455  b.HasIndex("MergedById");
456 
457  b.HasIndex("PrimaryRevisionInformationId")
458  .IsUnique();
459 
460  b.ToTable("TestMerges");
461  });
462 
463  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
464  {
465  b.Property<long>("Id")
466  .ValueGeneratedOnAdd()
467  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
468 
469  b.Property<decimal>("AdministrationRights")
470  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
471 
472  b.Property<string>("CanonicalName")
473  .IsRequired();
474 
475  b.Property<DateTimeOffset?>("CreatedAt")
476  .IsRequired();
477 
478  b.Property<long?>("CreatedById");
479 
480  b.Property<bool?>("Enabled")
481  .IsRequired();
482 
483  b.Property<decimal>("InstanceManagerRights")
484  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
485 
486  b.Property<DateTimeOffset?>("LastPasswordUpdate");
487 
488  b.Property<string>("Name")
489  .IsRequired();
490 
491  b.Property<string>("PasswordHash");
492 
493  b.Property<string>("SystemIdentifier");
494 
495  b.HasKey("Id");
496 
497  b.HasIndex("CanonicalName")
498  .IsUnique();
499 
500  b.HasIndex("CreatedById");
501 
502  b.ToTable("Users");
503  });
504 
505  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
506  {
507  b.Property<long>("Id")
508  .ValueGeneratedOnAdd()
509  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
510 
511  b.Property<long?>("AlphaId");
512 
513  b.Property<bool>("AlphaIsActive");
514 
515  b.Property<long?>("BravoId");
516 
517  b.Property<long>("InstanceId");
518 
519  b.HasKey("Id");
520 
521  b.HasIndex("AlphaId");
522 
523  b.HasIndex("BravoId");
524 
525  b.HasIndex("InstanceId")
526  .IsUnique();
527 
528  b.ToTable("WatchdogReattachInformations");
529  });
530 
531  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
532  {
533  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
534  .WithMany("ChatSettings")
535  .HasForeignKey("InstanceId")
536  .OnDelete(DeleteBehavior.Cascade);
537  });
538 
539  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
540  {
541  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
542  .WithMany("Channels")
543  .HasForeignKey("ChatSettingsId")
544  .OnDelete(DeleteBehavior.Cascade);
545  });
546 
547  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
548  {
549  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
550  .WithOne()
551  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
552  .OnDelete(DeleteBehavior.Restrict);
553 
554  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
555  .WithMany("CompileJobs")
556  .HasForeignKey("RevisionInformationId")
557  .OnDelete(DeleteBehavior.Cascade);
558  });
559 
560  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
561  {
562  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
563  .WithOne("DreamDaemonSettings")
564  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
565  .OnDelete(DeleteBehavior.Cascade);
566  });
567 
568  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
569  {
570  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
571  .WithOne("DreamMakerSettings")
572  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
573  .OnDelete(DeleteBehavior.Cascade);
574  });
575 
576  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
577  {
578  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
579  .WithMany("InstanceUsers")
580  .HasForeignKey("InstanceId")
581  .OnDelete(DeleteBehavior.Cascade);
582 
583  b.HasOne("Tgstation.Server.Host.Models.User")
584  .WithMany("InstanceUsers")
585  .HasForeignKey("UserId")
586  .OnDelete(DeleteBehavior.Cascade);
587  });
588 
589  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
590  {
591  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
592  .WithMany()
593  .HasForeignKey("CancelledById");
594 
595  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
596  .WithMany("Jobs")
597  .HasForeignKey("InstanceId")
598  .OnDelete(DeleteBehavior.Cascade);
599 
600  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
601  .WithMany()
602  .HasForeignKey("StartedById")
603  .OnDelete(DeleteBehavior.Cascade);
604  });
605 
606  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
607  {
608  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
609  .WithMany()
610  .HasForeignKey("CompileJobId")
611  .OnDelete(DeleteBehavior.Cascade);
612  });
613 
614  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
615  {
616  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
617  .WithOne("RepositorySettings")
618  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
619  .OnDelete(DeleteBehavior.Cascade);
620  });
621 
622  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
623  {
624  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
625  .WithMany("ActiveTestMerges")
626  .HasForeignKey("RevisionInformationId")
627  .OnDelete(DeleteBehavior.Cascade);
628 
629  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
630  .WithMany("RevisonInformations")
631  .HasForeignKey("TestMergeId")
632  .OnDelete(DeleteBehavior.Cascade);
633  });
634 
635  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
636  {
637  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
638  .WithMany("RevisionInformations")
639  .HasForeignKey("InstanceId")
640  .OnDelete(DeleteBehavior.Cascade);
641  });
642 
643  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
644  {
645  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
646  .WithMany("TestMerges")
647  .HasForeignKey("MergedById")
648  .OnDelete(DeleteBehavior.Restrict);
649 
650  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
651  .WithOne("PrimaryTestMerge")
652  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
653  .OnDelete(DeleteBehavior.Restrict);
654  });
655 
656  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
657  {
658  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
659  .WithMany("CreatedUsers")
660  .HasForeignKey("CreatedById");
661  });
662 
663  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
664  {
665  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
666  .WithMany()
667  .HasForeignKey("AlphaId");
668 
669  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
670  .WithMany()
671  .HasForeignKey("BravoId");
672 
673  b.HasOne("Tgstation.Server.Host.Models.Instance")
674  .WithOne("WatchdogReattachInformation")
675  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
676  .OnDelete(DeleteBehavior.Cascade);
677  });
678 #pragma warning restore 612, 618
679  }
+
+
+ +

◆ Down()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSFixRevInfoIndex.Down (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Unpplies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 39 of file 20190219041825_MSFixRevInfoIndex.cs.

+
40  {
41  if (migrationBuilder == null)
42  throw new ArgumentNullException(nameof(migrationBuilder));
43 
44  migrationBuilder.DropIndex(
45  name: "IX_RevisionInformations_InstanceId_CommitSha",
46  table: "RevisionInformations");
47 
48  migrationBuilder.CreateIndex(
49  name: "IX_RevisionInformations_CommitSha",
50  table: "RevisionInformations",
51  column: "CommitSha",
52  unique: true);
53 
54  migrationBuilder.CreateIndex(
55  name: "IX_RevisionInformations_InstanceId",
56  table: "RevisionInformations",
57  column: "InstanceId");
58  }
+
+
+ +

◆ Up()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSFixRevInfoIndex.Up (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Applies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 15 of file 20190219041825_MSFixRevInfoIndex.cs.

+
16  {
17  if (migrationBuilder == null)
18  throw new ArgumentNullException(nameof(migrationBuilder));
19 
20  migrationBuilder.DropIndex(
21  name: "IX_RevisionInformations_CommitSha",
22  table: "RevisionInformations");
23 
24  migrationBuilder.DropIndex(
25  name: "IX_RevisionInformations_InstanceId",
26  table: "RevisionInformations");
27 
28  migrationBuilder.CreateIndex(
29  name: "IX_RevisionInformations_InstanceId_CommitSha",
30  table: "RevisionInformations",
31  columns: new[] { "InstanceId", "CommitSha" },
32  unique: true);
33  }
+
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_fix_rev_info_index.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_fix_rev_info_index.png new file mode 100644 index 0000000000000000000000000000000000000000..666b6ffecff25dab2b17d3f587f6d38399e3416b GIT binary patch literal 1006 zcmeAS@N?(olHy`uVBq!ia0y~yU`z(G12~w0v%S*SPJ&3o}6Bw>CZ+Er5&)zHi{Ws#d|2fgC zF9ZFqrq}8&{kU>c{F5Jx)E>K4SWH_Yzp?vusGQvPF9Ln4FXJPv=RNBJT4SHGMH0xb zzjW)5#I~J}HXlDf>)2iu+ur9^)0RwIZZ&0z^}Ro4^u*g@no9hkjVeDkS)Q|euJC-$UWN+scm~D>>4y>rrmkN-_M+>sozpP0;&_dIptXk1I)5CXCYjr5=l)y|S?R#P#?>$n5=Bf4;GJe|Nv1`JJ}- z#jnkN=q&TA5%v^5a;PwOZCTaBZ#PsDn*QES`SVjm`1s)_lig=6@}AFhx0cQ8^Q(@T z)n(Up@uN;k^^N6yy*nSJKK&81U+VH!SD&jX^4B%jF`IMWSmT|%k^j}4D%rO=74^>B z^6%|Aa_F(ull|8F&WiTVR`i%W>38-X>Ae2Sr#?P86l1-wzs&CXit1Y*n2-Ox^jAy% zyllC?vE||NpA~a|dt5Op+xO|?-p5a47JC&xpSk&`?s3y6v#r

wWg@{`<2Jr4!}|vx1gTe~DWM4fPkik$ literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create-members.html new file mode 100644 index 0000000000..159d9a2eeb --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +

+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.Migrations.MSInitialCreate Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Models.Migrations.MSInitialCreate, including all inherited members.

+ + + + +
BuildTargetModel(ModelBuilder modelBuilder)Tgstation.Server.Host.Models.Migrations.MSInitialCreateprotected
Down(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MSInitialCreateprotected
Up(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MSInitialCreateprotected
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html new file mode 100644 index 0000000000..dee15d9ccd --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html @@ -0,0 +1,240 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.Migrations.MSInitialCreate Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.Migrations.MSInitialCreate Class Reference
+
+
+ +

The initial database migration for MSSQL + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.Migrations.MSInitialCreate:
+
+
+ + +Migration + +
+ + + + + + + + + + + +

+Protected Member Functions

override void Up (MigrationBuilder migrationBuilder)
 Applies the migration More...
 
override void Down (MigrationBuilder migrationBuilder)
 Unapplies the migration More...
 
override void BuildTargetModel (ModelBuilder modelBuilder)
 Builds the target model More...
 
+

Detailed Description

+

The initial database migration for MSSQL

+ +

Definition at line 11 of file 20180906135553_MSInitialCreate.cs.

+

Member Function Documentation

+ +

◆ BuildTargetModel()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSInitialCreate.BuildTargetModel (ModelBuilder modelBuilder)
+
+protected
+
+ +

Builds the target model

+
Parameters
+ + +
modelBuilderThe ModelBuilder to use
+
+
+ +

Definition at line 19 of file 20180906135553_MSInitialCreate.Designer.cs.

+
20  {
21 #pragma warning disable 612, 618
22  modelBuilder
23  .HasAnnotation("ProductVersion", "2.1.2-rtm-30932")
24  .HasAnnotation("Relational:MaxIdentifierLength", 128)
25  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
26 
27  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
28  {
29  b.Property<long>("Id")
30  .ValueGeneratedOnAdd()
31  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
32 
33  b.Property<string>("ConnectionString")
34  .IsRequired();
35 
36  b.Property<bool?>("Enabled");
37 
38  b.Property<long>("InstanceId");
39 
40  b.Property<string>("Name")
41  .IsRequired();
42 
43  b.Property<int?>("Provider");
44 
45  b.HasKey("Id");
46 
47  b.HasIndex("InstanceId");
48 
49  b.HasIndex("Name")
50  .IsUnique();
51 
52  b.ToTable("ChatBots");
53  });
54 
55  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
56  {
57  b.Property<long>("Id")
58  .ValueGeneratedOnAdd()
59  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
60 
61  b.Property<long>("ChatSettingsId");
62 
63  b.Property<decimal?>("DiscordChannelId")
64  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
65 
66  b.Property<string>("IrcChannel");
67 
68  b.Property<bool?>("IsAdminChannel")
69  .IsRequired();
70 
71  b.Property<bool?>("IsUpdatesChannel")
72  .IsRequired();
73 
74  b.Property<bool?>("IsWatchdogChannel")
75  .IsRequired();
76 
77  b.Property<string>("Tag");
78 
79  b.HasKey("Id");
80 
81  b.HasIndex("ChatSettingsId", "DiscordChannelId")
82  .IsUnique()
83  .HasFilter("[DiscordChannelId] IS NOT NULL");
84 
85  b.HasIndex("ChatSettingsId", "IrcChannel")
86  .IsUnique()
87  .HasFilter("[IrcChannel] IS NOT NULL");
88 
89  b.ToTable("ChatChannels");
90  });
91 
92  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
93  {
94  b.Property<long>("Id")
95  .ValueGeneratedOnAdd()
96  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
97 
98  b.Property<string>("ByondVersion")
99  .IsRequired();
100 
101  b.Property<Guid?>("DirectoryName");
102 
103  b.Property<string>("DmeName");
104 
105  b.Property<long?>("JobId");
106 
107  b.Property<string>("Output");
108 
109  b.Property<long>("RevisionInformationId");
110 
111  b.HasKey("Id");
112 
113  b.HasIndex("DirectoryName");
114 
115  b.HasIndex("JobId");
116 
117  b.HasIndex("RevisionInformationId");
118 
119  b.ToTable("CompileJobs");
120  });
121 
122  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
123  {
124  b.Property<long>("Id")
125  .ValueGeneratedOnAdd()
126  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
127 
128  b.Property<string>("AccessToken");
129 
130  b.Property<bool?>("AllowWebClient")
131  .IsRequired();
132 
133  b.Property<bool?>("AutoStart")
134  .IsRequired();
135 
136  b.Property<long>("InstanceId");
137 
138  b.Property<int>("PrimaryPort");
139 
140  b.Property<int?>("ProcessId");
141 
142  b.Property<int>("SecondaryPort");
143 
144  b.Property<int>("SecurityLevel");
145 
146  b.Property<bool?>("SoftRestart")
147  .IsRequired();
148 
149  b.Property<bool?>("SoftShutdown")
150  .IsRequired();
151 
152  b.Property<long>("StartupTimeout");
153 
154  b.HasKey("Id");
155 
156  b.HasIndex("InstanceId")
157  .IsUnique();
158 
159  b.ToTable("DreamDaemonSettings");
160  });
161 
162  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
163  {
164  b.Property<long>("Id")
165  .ValueGeneratedOnAdd()
166  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
167 
168  b.Property<int>("ApiValidationPort");
169 
170  b.Property<long>("InstanceId");
171 
172  b.Property<string>("ProjectName");
173 
174  b.HasKey("Id");
175 
176  b.HasIndex("InstanceId")
177  .IsUnique();
178 
179  b.ToTable("DreamMakerSettings");
180  });
181 
182  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
183  {
184  b.Property<long>("Id")
185  .ValueGeneratedOnAdd()
186  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
187 
188  b.Property<long>("AutoUpdateInterval");
189 
190  b.Property<int>("ConfigurationType");
191 
192  b.Property<string>("Name")
193  .IsRequired();
194 
195  b.Property<bool?>("Online")
196  .IsRequired();
197 
198  b.Property<string>("Path")
199  .IsRequired();
200 
201  b.Property<long?>("WatchdogReattachInformationId");
202 
203  b.HasKey("Id");
204 
205  b.HasIndex("Path")
206  .IsUnique();
207 
208  b.HasIndex("WatchdogReattachInformationId");
209 
210  b.ToTable("Instances");
211  });
212 
213  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
214  {
215  b.Property<long>("Id")
216  .ValueGeneratedOnAdd()
217  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
218 
219  b.Property<decimal>("ByondRights")
220  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
221 
222  b.Property<decimal>("ChatBotRights")
223  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
224 
225  b.Property<decimal>("ConfigurationRights")
226  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
227 
228  b.Property<decimal>("DreamDaemonRights")
229  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
230 
231  b.Property<decimal>("DreamMakerRights")
232  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
233 
234  b.Property<long>("InstanceId");
235 
236  b.Property<decimal>("InstanceUserRights")
237  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
238 
239  b.Property<decimal>("RepositoryRights")
240  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
241 
242  b.Property<long?>("UserId")
243  .IsRequired();
244 
245  b.HasKey("Id");
246 
247  b.HasIndex("InstanceId");
248 
249  b.HasIndex("UserId", "InstanceId")
250  .IsUnique();
251 
252  b.ToTable("InstanceUsers");
253  });
254 
255  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
256  {
257  b.Property<long>("Id")
258  .ValueGeneratedOnAdd()
259  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
260 
261  b.Property<decimal?>("CancelRight")
262  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
263 
264  b.Property<decimal?>("CancelRightsType")
265  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
266 
267  b.Property<bool?>("Cancelled")
268  .IsRequired();
269 
270  b.Property<long?>("CancelledById");
271 
272  b.Property<string>("Description")
273  .IsRequired();
274 
275  b.Property<string>("ExceptionDetails");
276 
277  b.Property<long>("InstanceId");
278 
279  b.Property<DateTimeOffset?>("StartedAt")
280  .IsRequired();
281 
282  b.Property<long>("StartedById");
283 
284  b.Property<DateTimeOffset?>("StoppedAt");
285 
286  b.HasKey("Id");
287 
288  b.HasIndex("CancelledById");
289 
290  b.HasIndex("InstanceId");
291 
292  b.HasIndex("StartedById");
293 
294  b.ToTable("Jobs");
295  });
296 
297  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
298  {
299  b.Property<long>("Id")
300  .ValueGeneratedOnAdd()
301  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
302 
303  b.Property<string>("AccessIdentifier")
304  .IsRequired();
305 
306  b.Property<string>("ChatChannelsJson")
307  .IsRequired();
308 
309  b.Property<string>("ChatCommandsJson")
310  .IsRequired();
311 
312  b.Property<long?>("CompileJobId");
313 
314  b.Property<bool>("IsPrimary");
315 
316  b.Property<int>("Port");
317 
318  b.Property<int>("ProcessId");
319 
320  b.Property<int>("RebootState");
321 
322  b.Property<string>("ServerCommandsJson")
323  .IsRequired();
324 
325  b.HasKey("Id");
326 
327  b.HasIndex("CompileJobId");
328 
329  b.ToTable("ReattachInformations");
330  });
331 
332  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
333  {
334  b.Property<long>("Id")
335  .ValueGeneratedOnAdd()
336  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
337 
338  b.Property<string>("AccessToken");
339 
340  b.Property<string>("AccessUser");
341 
342  b.Property<bool?>("AutoUpdatesKeepTestMerges")
343  .IsRequired();
344 
345  b.Property<bool?>("AutoUpdatesSynchronize")
346  .IsRequired();
347 
348  b.Property<string>("CommitterEmail")
349  .IsRequired();
350 
351  b.Property<string>("CommitterName")
352  .IsRequired();
353 
354  b.Property<long>("InstanceId");
355 
356  b.Property<bool?>("PushTestMergeCommits")
357  .IsRequired();
358 
359  b.Property<bool?>("ShowTestMergeCommitters")
360  .IsRequired();
361 
362  b.HasKey("Id");
363 
364  b.HasIndex("InstanceId")
365  .IsUnique();
366 
367  b.ToTable("RepositorySettings");
368  });
369 
370  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
371  {
372  b.Property<long>("Id")
373  .ValueGeneratedOnAdd()
374  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
375 
376  b.Property<long>("RevisionInformationId");
377 
378  b.Property<long>("TestMergeId");
379 
380  b.HasKey("Id");
381 
382  b.HasIndex("RevisionInformationId");
383 
384  b.HasIndex("TestMergeId");
385 
386  b.ToTable("RevInfoTestMerges");
387  });
388 
389  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
390  {
391  b.Property<long>("Id")
392  .ValueGeneratedOnAdd()
393  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
394 
395  b.Property<string>("CommitSha")
396  .IsRequired()
397  .HasMaxLength(40);
398 
399  b.Property<long>("InstanceId");
400 
401  b.Property<string>("OriginCommitSha")
402  .IsRequired()
403  .HasMaxLength(40);
404 
405  b.HasKey("Id");
406 
407  b.HasIndex("CommitSha")
408  .IsUnique();
409 
410  b.HasIndex("InstanceId");
411 
412  b.ToTable("RevisionInformations");
413  });
414 
415  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
416  {
417  b.Property<long>("Id")
418  .ValueGeneratedOnAdd()
419  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
420 
421  b.Property<string>("Author")
422  .IsRequired();
423 
424  b.Property<string>("BodyAtMerge")
425  .IsRequired();
426 
427  b.Property<string>("Comment");
428 
429  b.Property<DateTimeOffset>("MergedAt");
430 
431  b.Property<long>("MergedById");
432 
433  b.Property<int?>("Number")
434  .IsRequired();
435 
436  b.Property<long?>("PrimaryRevisionInformationId");
437 
438  b.Property<string>("PullRequestRevision")
439  .IsRequired();
440 
441  b.Property<string>("TitleAtMerge")
442  .IsRequired();
443 
444  b.Property<string>("Url")
445  .IsRequired();
446 
447  b.HasKey("Id");
448 
449  b.HasIndex("MergedById");
450 
451  b.HasIndex("PrimaryRevisionInformationId")
452  .IsUnique()
453  .HasFilter("[PrimaryRevisionInformationId] IS NOT NULL");
454 
455  b.ToTable("TestMerges");
456  });
457 
458  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
459  {
460  b.Property<long>("Id")
461  .ValueGeneratedOnAdd()
462  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
463 
464  b.Property<decimal>("AdministrationRights")
465  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
466 
467  b.Property<string>("CanonicalName")
468  .IsRequired();
469 
470  b.Property<DateTimeOffset?>("CreatedAt")
471  .IsRequired();
472 
473  b.Property<long?>("CreatedById");
474 
475  b.Property<bool?>("Enabled")
476  .IsRequired();
477 
478  b.Property<decimal>("InstanceManagerRights")
479  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
480 
481  b.Property<DateTimeOffset?>("LastPasswordUpdate");
482 
483  b.Property<string>("Name")
484  .IsRequired();
485 
486  b.Property<string>("PasswordHash");
487 
488  b.Property<string>("SystemIdentifier");
489 
490  b.HasKey("Id");
491 
492  b.HasIndex("CanonicalName")
493  .IsUnique();
494 
495  b.HasIndex("CreatedById");
496 
497  b.ToTable("Users");
498  });
499 
500  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
501  {
502  b.Property<long>("Id")
503  .ValueGeneratedOnAdd()
504  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
505 
506  b.Property<long?>("AlphaId");
507 
508  b.Property<bool>("AlphaIsActive");
509 
510  b.Property<long?>("BravoId");
511 
512  b.HasKey("Id");
513 
514  b.HasIndex("AlphaId");
515 
516  b.HasIndex("BravoId");
517 
518  b.ToTable("WatchdogReattachInformations");
519  });
520 
521  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
522  {
523  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
524  .WithMany("ChatSettings")
525  .HasForeignKey("InstanceId")
526  .OnDelete(DeleteBehavior.Cascade);
527  });
528 
529  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
530  {
531  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
532  .WithMany("Channels")
533  .HasForeignKey("ChatSettingsId")
534  .OnDelete(DeleteBehavior.Cascade);
535  });
536 
537  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
538  {
539  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
540  .WithMany()
541  .HasForeignKey("JobId");
542 
543  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
544  .WithMany("CompileJobs")
545  .HasForeignKey("RevisionInformationId")
546  .OnDelete(DeleteBehavior.Cascade);
547  });
548 
549  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
550  {
551  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
552  .WithOne("DreamDaemonSettings")
553  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
554  .OnDelete(DeleteBehavior.Cascade);
555  });
556 
557  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
558  {
559  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
560  .WithOne("DreamMakerSettings")
561  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
562  .OnDelete(DeleteBehavior.Cascade);
563  });
564 
565  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
566  {
567  b.HasOne("Tgstation.Server.Host.Models.WatchdogReattachInformation", "WatchdogReattachInformation")
568  .WithMany()
569  .HasForeignKey("WatchdogReattachInformationId");
570  });
571 
572  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
573  {
574  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
575  .WithMany("InstanceUsers")
576  .HasForeignKey("InstanceId")
577  .OnDelete(DeleteBehavior.Cascade);
578 
579  b.HasOne("Tgstation.Server.Host.Models.User")
580  .WithMany("InstanceUsers")
581  .HasForeignKey("UserId")
582  .OnDelete(DeleteBehavior.Cascade);
583  });
584 
585  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
586  {
587  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
588  .WithMany()
589  .HasForeignKey("CancelledById");
590 
591  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
592  .WithMany("Jobs")
593  .HasForeignKey("InstanceId")
594  .OnDelete(DeleteBehavior.Cascade);
595 
596  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
597  .WithMany()
598  .HasForeignKey("StartedById")
599  .OnDelete(DeleteBehavior.Cascade);
600  });
601 
602  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
603  {
604  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
605  .WithMany()
606  .HasForeignKey("CompileJobId");
607  });
608 
609  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
610  {
611  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
612  .WithOne("RepositorySettings")
613  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
614  .OnDelete(DeleteBehavior.Cascade);
615  });
616 
617  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
618  {
619  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
620  .WithMany("ActiveTestMerges")
621  .HasForeignKey("RevisionInformationId")
622  .OnDelete(DeleteBehavior.Cascade);
623 
624  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
625  .WithMany("RevisonInformations")
626  .HasForeignKey("TestMergeId")
627  .OnDelete(DeleteBehavior.Cascade);
628  });
629 
630  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
631  {
632  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
633  .WithMany("RevisionInformations")
634  .HasForeignKey("InstanceId")
635  .OnDelete(DeleteBehavior.Cascade);
636  });
637 
638  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
639  {
640  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
641  .WithMany("TestMerges")
642  .HasForeignKey("MergedById")
643  .OnDelete(DeleteBehavior.Restrict);
644 
645  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
646  .WithOne("PrimaryTestMerge")
647  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
648  .OnDelete(DeleteBehavior.SetNull);
649  });
650 
651  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
652  {
653  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
654  .WithMany("CreatedUsers")
655  .HasForeignKey("CreatedById");
656  });
657 
658  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
659  {
660  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
661  .WithMany()
662  .HasForeignKey("AlphaId");
663 
664  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
665  .WithMany()
666  .HasForeignKey("BravoId");
667  });
668 #pragma warning restore 612, 618
669  }
+
+
+ +

◆ Down()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSInitialCreate.Down (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Unapplies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 600 of file 20180906135553_MSInitialCreate.cs.

+
601  {
602  if (migrationBuilder == null)
603  throw new ArgumentNullException(nameof(migrationBuilder));
604 
605  migrationBuilder.DropForeignKey(
606  name: "FK_Jobs_Instances_InstanceId",
607  table: "Jobs");
608 
609  migrationBuilder.DropForeignKey(
610  name: "FK_RevisionInformations_Instances_InstanceId",
611  table: "RevisionInformations");
612 
613  migrationBuilder.DropTable(
614  name: "ChatChannels");
615 
616  migrationBuilder.DropTable(
617  name: "DreamDaemonSettings");
618 
619  migrationBuilder.DropTable(
620  name: "DreamMakerSettings");
621 
622  migrationBuilder.DropTable(
623  name: "InstanceUsers");
624 
625  migrationBuilder.DropTable(
626  name: "RepositorySettings");
627 
628  migrationBuilder.DropTable(
629  name: "RevInfoTestMerges");
630 
631  migrationBuilder.DropTable(
632  name: "ChatBots");
633 
634  migrationBuilder.DropTable(
635  name: "TestMerges");
636 
637  migrationBuilder.DropTable(
638  name: "Instances");
639 
640  migrationBuilder.DropTable(
641  name: "WatchdogReattachInformations");
642 
643  migrationBuilder.DropTable(
644  name: "ReattachInformations");
645 
646  migrationBuilder.DropTable(
647  name: "CompileJobs");
648 
649  migrationBuilder.DropTable(
650  name: "Jobs");
651 
652  migrationBuilder.DropTable(
653  name: "RevisionInformations");
654 
655  migrationBuilder.DropTable(
656  name: "Users");
657  }
+
+
+ +

◆ Up()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSInitialCreate.Up (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Applies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 17 of file 20180906135553_MSInitialCreate.cs.

+
18  {
19  if (migrationBuilder == null)
20  throw new ArgumentNullException(nameof(migrationBuilder));
21 
22  migrationBuilder.CreateTable(
23  name: "Users",
24  columns: table => new
25  {
26  Id = table.Column<long>(nullable: false)
27  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
28  Enabled = table.Column<bool>(nullable: false),
29  CreatedAt = table.Column<DateTimeOffset>(nullable: false),
30  SystemIdentifier = table.Column<string>(nullable: true),
31  Name = table.Column<string>(nullable: false),
32  AdministrationRights = table.Column<decimal>(nullable: false),
33  InstanceManagerRights = table.Column<decimal>(nullable: false),
34  PasswordHash = table.Column<string>(nullable: true),
35  CreatedById = table.Column<long>(nullable: true),
36  CanonicalName = table.Column<string>(nullable: false),
37  LastPasswordUpdate = table.Column<DateTimeOffset>(nullable: true)
38  },
39  constraints: table =>
40  {
41  table.PrimaryKey("PK_Users", x => x.Id);
42  table.ForeignKey(
43  name: "FK_Users_Users_CreatedById",
44  column: x => x.CreatedById,
45  principalTable: "Users",
46  principalColumn: "Id",
47  onDelete: ReferentialAction.Restrict);
48  });
49 
50  migrationBuilder.CreateTable(
51  name: "ChatChannels",
52  columns: table => new
53  {
54  IrcChannel = table.Column<string>(nullable: true),
55  DiscordChannelId = table.Column<decimal>(nullable: true),
56  IsAdminChannel = table.Column<bool>(nullable: false),
57  IsWatchdogChannel = table.Column<bool>(nullable: false),
58  IsUpdatesChannel = table.Column<bool>(nullable: false),
59  Tag = table.Column<string>(nullable: true),
60  Id = table.Column<long>(nullable: false)
61  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
62  ChatSettingsId = table.Column<long>(nullable: false)
63  },
64  constraints: table =>
65  {
66  table.PrimaryKey("PK_ChatChannels", x => x.Id);
67  });
68 
69  migrationBuilder.CreateTable(
70  name: "ReattachInformations",
71  columns: table => new
72  {
73  ChatCommandsJson = table.Column<string>(nullable: false),
74  ChatChannelsJson = table.Column<string>(nullable: false),
75  ServerCommandsJson = table.Column<string>(nullable: false),
76  AccessIdentifier = table.Column<string>(nullable: false),
77  ProcessId = table.Column<int>(nullable: false),
78  IsPrimary = table.Column<bool>(nullable: false),
79  Port = table.Column<int>(nullable: false),
80  RebootState = table.Column<int>(nullable: false),
81  Id = table.Column<long>(nullable: false)
82  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
83  CompileJobId = table.Column<long>(nullable: true)
84  },
85  constraints: table =>
86  {
87  table.PrimaryKey("PK_ReattachInformations", x => x.Id);
88  });
89 
90  migrationBuilder.CreateTable(
91  name: "WatchdogReattachInformations",
92  columns: table => new
93  {
94  AlphaIsActive = table.Column<bool>(nullable: false),
95  Id = table.Column<long>(nullable: false)
96  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
97  AlphaId = table.Column<long>(nullable: true),
98  BravoId = table.Column<long>(nullable: true)
99  },
100  constraints: table =>
101  {
102  table.PrimaryKey("PK_WatchdogReattachInformations", x => x.Id);
103  table.ForeignKey(
104  name: "FK_WatchdogReattachInformations_ReattachInformations_AlphaId",
105  column: x => x.AlphaId,
106  principalTable: "ReattachInformations",
107  principalColumn: "Id",
108  onDelete: ReferentialAction.Restrict);
109  table.ForeignKey(
110  name: "FK_WatchdogReattachInformations_ReattachInformations_BravoId",
111  column: x => x.BravoId,
112  principalTable: "ReattachInformations",
113  principalColumn: "Id",
114  onDelete: ReferentialAction.Restrict);
115  });
116 
117  migrationBuilder.CreateTable(
118  name: "Instances",
119  columns: table => new
120  {
121  Id = table.Column<long>(nullable: false)
122  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
123  Name = table.Column<string>(nullable: false),
124  Path = table.Column<string>(nullable: false),
125  Online = table.Column<bool>(nullable: false),
126  ConfigurationType = table.Column<int>(nullable: false),
127  AutoUpdateInterval = table.Column<long>(nullable: false),
128  WatchdogReattachInformationId = table.Column<long>(nullable: true)
129  },
130  constraints: table =>
131  {
132  table.PrimaryKey("PK_Instances", x => x.Id);
133  table.ForeignKey(
134  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInformationId",
135  column: x => x.WatchdogReattachInformationId,
136  principalTable: "WatchdogReattachInformations",
137  principalColumn: "Id",
138  onDelete: ReferentialAction.Restrict);
139  });
140 
141  migrationBuilder.CreateTable(
142  name: "ChatBots",
143  columns: table => new
144  {
145  Id = table.Column<long>(nullable: false)
146  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
147  Name = table.Column<string>(nullable: false),
148  Enabled = table.Column<bool>(nullable: true),
149  Provider = table.Column<int>(nullable: true),
150  ConnectionString = table.Column<string>(nullable: false),
151  InstanceId = table.Column<long>(nullable: false)
152  },
153  constraints: table =>
154  {
155  table.PrimaryKey("PK_ChatBots", x => x.Id);
156  table.ForeignKey(
157  name: "FK_ChatBots_Instances_InstanceId",
158  column: x => x.InstanceId,
159  principalTable: "Instances",
160  principalColumn: "Id",
161  onDelete: ReferentialAction.Cascade);
162  });
163 
164  migrationBuilder.CreateTable(
165  name: "DreamDaemonSettings",
166  columns: table => new
167  {
168  AllowWebClient = table.Column<bool>(nullable: false),
169  SecurityLevel = table.Column<int>(nullable: false),
170  PrimaryPort = table.Column<int>(nullable: false),
171  SecondaryPort = table.Column<int>(nullable: false),
172  StartupTimeout = table.Column<long>(nullable: false),
173  AutoStart = table.Column<bool>(nullable: false),
174  SoftRestart = table.Column<bool>(nullable: false),
175  SoftShutdown = table.Column<bool>(nullable: false),
176  Id = table.Column<long>(nullable: false)
177  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
178  ProcessId = table.Column<int>(nullable: true),
179  AccessToken = table.Column<string>(nullable: true),
180  InstanceId = table.Column<long>(nullable: false)
181  },
182  constraints: table =>
183  {
184  table.PrimaryKey("PK_DreamDaemonSettings", x => x.Id);
185  table.ForeignKey(
186  name: "FK_DreamDaemonSettings_Instances_InstanceId",
187  column: x => x.InstanceId,
188  principalTable: "Instances",
189  principalColumn: "Id",
190  onDelete: ReferentialAction.Cascade);
191  });
192 
193  migrationBuilder.CreateTable(
194  name: "DreamMakerSettings",
195  columns: table => new
196  {
197  ProjectName = table.Column<string>(nullable: true),
198  ApiValidationPort = table.Column<int>(nullable: false),
199  Id = table.Column<long>(nullable: false)
200  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
201  InstanceId = table.Column<long>(nullable: false)
202  },
203  constraints: table =>
204  {
205  table.PrimaryKey("PK_DreamMakerSettings", x => x.Id);
206  table.ForeignKey(
207  name: "FK_DreamMakerSettings_Instances_InstanceId",
208  column: x => x.InstanceId,
209  principalTable: "Instances",
210  principalColumn: "Id",
211  onDelete: ReferentialAction.Cascade);
212  });
213 
214  migrationBuilder.CreateTable(
215  name: "InstanceUsers",
216  columns: table => new
217  {
218  UserId = table.Column<long>(nullable: false),
219  InstanceUserRights = table.Column<decimal>(nullable: false),
220  ByondRights = table.Column<decimal>(nullable: false),
221  DreamDaemonRights = table.Column<decimal>(nullable: false),
222  DreamMakerRights = table.Column<decimal>(nullable: false),
223  RepositoryRights = table.Column<decimal>(nullable: false),
224  ChatBotRights = table.Column<decimal>(nullable: false),
225  ConfigurationRights = table.Column<decimal>(nullable: false),
226  Id = table.Column<long>(nullable: false)
227  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
228  InstanceId = table.Column<long>(nullable: false)
229  },
230  constraints: table =>
231  {
232  table.PrimaryKey("PK_InstanceUsers", x => x.Id);
233  table.ForeignKey(
234  name: "FK_InstanceUsers_Instances_InstanceId",
235  column: x => x.InstanceId,
236  principalTable: "Instances",
237  principalColumn: "Id",
238  onDelete: ReferentialAction.Cascade);
239  table.ForeignKey(
240  name: "FK_InstanceUsers_Users_UserId",
241  column: x => x.UserId,
242  principalTable: "Users",
243  principalColumn: "Id",
244  onDelete: ReferentialAction.Cascade);
245  });
246 
247  migrationBuilder.CreateTable(
248  name: "Jobs",
249  columns: table => new
250  {
251  Id = table.Column<long>(nullable: false)
252  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
253  Description = table.Column<string>(nullable: false),
254  ExceptionDetails = table.Column<string>(nullable: true),
255  StartedAt = table.Column<DateTimeOffset>(nullable: false),
256  StoppedAt = table.Column<DateTimeOffset>(nullable: true),
257  Cancelled = table.Column<bool>(nullable: false),
258  CancelRightsType = table.Column<decimal>(nullable: true),
259  CancelRight = table.Column<decimal>(nullable: true),
260  StartedById = table.Column<long>(nullable: false),
261  CancelledById = table.Column<long>(nullable: true),
262  InstanceId = table.Column<long>(nullable: false)
263  },
264  constraints: table =>
265  {
266  table.PrimaryKey("PK_Jobs", x => x.Id);
267  table.ForeignKey(
268  name: "FK_Jobs_Users_CancelledById",
269  column: x => x.CancelledById,
270  principalTable: "Users",
271  principalColumn: "Id",
272  onDelete: ReferentialAction.Restrict);
273  table.ForeignKey(
274  name: "FK_Jobs_Instances_InstanceId",
275  column: x => x.InstanceId,
276  principalTable: "Instances",
277  principalColumn: "Id",
278  onDelete: ReferentialAction.Cascade);
279  table.ForeignKey(
280  name: "FK_Jobs_Users_StartedById",
281  column: x => x.StartedById,
282  principalTable: "Users",
283  principalColumn: "Id",
284  onDelete: ReferentialAction.Cascade);
285  });
286 
287  migrationBuilder.CreateTable(
288  name: "RepositorySettings",
289  columns: table => new
290  {
291  CommitterName = table.Column<string>(nullable: false),
292  CommitterEmail = table.Column<string>(nullable: false),
293  AccessUser = table.Column<string>(nullable: true),
294  AccessToken = table.Column<string>(nullable: true),
295  PushTestMergeCommits = table.Column<bool>(nullable: false),
296  ShowTestMergeCommitters = table.Column<bool>(nullable: false),
297  AutoUpdatesKeepTestMerges = table.Column<bool>(nullable: false),
298  AutoUpdatesSynchronize = table.Column<bool>(nullable: false),
299  Id = table.Column<long>(nullable: false)
300  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
301  InstanceId = table.Column<long>(nullable: false)
302  },
303  constraints: table =>
304  {
305  table.PrimaryKey("PK_RepositorySettings", x => x.Id);
306  table.ForeignKey(
307  name: "FK_RepositorySettings_Instances_InstanceId",
308  column: x => x.InstanceId,
309  principalTable: "Instances",
310  principalColumn: "Id",
311  onDelete: ReferentialAction.Cascade);
312  });
313 
314  migrationBuilder.CreateTable(
315  name: "RevisionInformations",
316  columns: table => new
317  {
318  CommitSha = table.Column<string>(maxLength: 40, nullable: false),
319  OriginCommitSha = table.Column<string>(maxLength: 40, nullable: false),
320  Id = table.Column<long>(nullable: false)
321  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
322  InstanceId = table.Column<long>(nullable: false)
323  },
324  constraints: table =>
325  {
326  table.PrimaryKey("PK_RevisionInformations", x => x.Id);
327  table.ForeignKey(
328  name: "FK_RevisionInformations_Instances_InstanceId",
329  column: x => x.InstanceId,
330  principalTable: "Instances",
331  principalColumn: "Id",
332  onDelete: ReferentialAction.Cascade);
333  });
334 
335  migrationBuilder.CreateTable(
336  name: "CompileJobs",
337  columns: table => new
338  {
339  Id = table.Column<long>(nullable: false)
340  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
341  DmeName = table.Column<string>(nullable: true),
342  Output = table.Column<string>(nullable: true),
343  DirectoryName = table.Column<Guid>(nullable: true),
344  JobId = table.Column<long>(nullable: true),
345  RevisionInformationId = table.Column<long>(nullable: false),
346  ByondVersion = table.Column<string>(nullable: false)
347  },
348  constraints: table =>
349  {
350  table.PrimaryKey("PK_CompileJobs", x => x.Id);
351  table.ForeignKey(
352  name: "FK_CompileJobs_Jobs_JobId",
353  column: x => x.JobId,
354  principalTable: "Jobs",
355  principalColumn: "Id",
356  onDelete: ReferentialAction.Restrict);
357  table.ForeignKey(
358  name: "FK_CompileJobs_RevisionInformations_RevisionInformationId",
359  column: x => x.RevisionInformationId,
360  principalTable: "RevisionInformations",
361  principalColumn: "Id",
362  onDelete: ReferentialAction.Cascade);
363  });
364 
365  migrationBuilder.CreateTable(
366  name: "TestMerges",
367  columns: table => new
368  {
369  Number = table.Column<int>(nullable: false),
370  PullRequestRevision = table.Column<string>(nullable: false),
371  Comment = table.Column<string>(nullable: true),
372  TitleAtMerge = table.Column<string>(nullable: false),
373  BodyAtMerge = table.Column<string>(nullable: false),
374  Url = table.Column<string>(nullable: false),
375  Author = table.Column<string>(nullable: false),
376  Id = table.Column<long>(nullable: false)
377  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
378  MergedAt = table.Column<DateTimeOffset>(nullable: false),
379  MergedById = table.Column<long>(nullable: false),
380  PrimaryRevisionInformationId = table.Column<long>(nullable: true)
381  },
382  constraints: table =>
383  {
384  table.PrimaryKey("PK_TestMerges", x => x.Id);
385  table.ForeignKey(
386  name: "FK_TestMerges_Users_MergedById",
387  column: x => x.MergedById,
388  principalTable: "Users",
389  principalColumn: "Id",
390  onDelete: ReferentialAction.Restrict);
391  table.ForeignKey(
392  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
393  column: x => x.PrimaryRevisionInformationId,
394  principalTable: "RevisionInformations",
395  principalColumn: "Id",
396  onDelete: ReferentialAction.SetNull);
397  });
398 
399  migrationBuilder.CreateTable(
400  name: "RevInfoTestMerges",
401  columns: table => new
402  {
403  Id = table.Column<long>(nullable: false)
404  .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
405  TestMergeId = table.Column<long>(nullable: false),
406  RevisionInformationId = table.Column<long>(nullable: false)
407  },
408  constraints: table =>
409  {
410  table.PrimaryKey("PK_RevInfoTestMerges", x => x.Id);
411  table.ForeignKey(
412  name: "FK_RevInfoTestMerges_RevisionInformations_RevisionInformationId",
413  column: x => x.RevisionInformationId,
414  principalTable: "RevisionInformations",
415  principalColumn: "Id",
416  onDelete: ReferentialAction.Cascade);
417  table.ForeignKey(
418  name: "FK_RevInfoTestMerges_TestMerges_TestMergeId",
419  column: x => x.TestMergeId,
420  principalTable: "TestMerges",
421  principalColumn: "Id",
422  onDelete: ReferentialAction.Cascade);
423  });
424 
425  migrationBuilder.CreateIndex(
426  name: "IX_ChatBots_InstanceId",
427  table: "ChatBots",
428  column: "InstanceId");
429 
430  migrationBuilder.CreateIndex(
431  name: "IX_ChatBots_Name",
432  table: "ChatBots",
433  column: "Name",
434  unique: true);
435 
436  migrationBuilder.CreateIndex(
437  name: "IX_ChatChannels_ChatSettingsId_DiscordChannelId",
438  table: "ChatChannels",
439  columns: new[] { "ChatSettingsId", "DiscordChannelId" },
440  unique: true,
441  filter: "[DiscordChannelId] IS NOT NULL");
442 
443  migrationBuilder.CreateIndex(
444  name: "IX_ChatChannels_ChatSettingsId_IrcChannel",
445  table: "ChatChannels",
446  columns: new[] { "ChatSettingsId", "IrcChannel" },
447  unique: true,
448  filter: "[IrcChannel] IS NOT NULL");
449 
450  migrationBuilder.CreateIndex(
451  name: "IX_CompileJobs_DirectoryName",
452  table: "CompileJobs",
453  column: "DirectoryName");
454 
455  migrationBuilder.CreateIndex(
456  name: "IX_CompileJobs_JobId",
457  table: "CompileJobs",
458  column: "JobId");
459 
460  migrationBuilder.CreateIndex(
461  name: "IX_CompileJobs_RevisionInformationId",
462  table: "CompileJobs",
463  column: "RevisionInformationId");
464 
465  migrationBuilder.CreateIndex(
466  name: "IX_DreamDaemonSettings_InstanceId",
467  table: "DreamDaemonSettings",
468  column: "InstanceId",
469  unique: true);
470 
471  migrationBuilder.CreateIndex(
472  name: "IX_DreamMakerSettings_InstanceId",
473  table: "DreamMakerSettings",
474  column: "InstanceId",
475  unique: true);
476 
477  migrationBuilder.CreateIndex(
478  name: "IX_Instances_Path",
479  table: "Instances",
480  column: "Path",
481  unique: true);
482 
483  migrationBuilder.CreateIndex(
484  name: "IX_Instances_WatchdogReattachInformationId",
485  table: "Instances",
486  column: "WatchdogReattachInformationId");
487 
488  migrationBuilder.CreateIndex(
489  name: "IX_InstanceUsers_InstanceId",
490  table: "InstanceUsers",
491  column: "InstanceId");
492 
493  migrationBuilder.CreateIndex(
494  name: "IX_InstanceUsers_UserId_InstanceId",
495  table: "InstanceUsers",
496  columns: new[] { "UserId", "InstanceId" },
497  unique: true);
498 
499  migrationBuilder.CreateIndex(
500  name: "IX_Jobs_CancelledById",
501  table: "Jobs",
502  column: "CancelledById");
503 
504  migrationBuilder.CreateIndex(
505  name: "IX_Jobs_InstanceId",
506  table: "Jobs",
507  column: "InstanceId");
508 
509  migrationBuilder.CreateIndex(
510  name: "IX_Jobs_StartedById",
511  table: "Jobs",
512  column: "StartedById");
513 
514  migrationBuilder.CreateIndex(
515  name: "IX_ReattachInformations_CompileJobId",
516  table: "ReattachInformations",
517  column: "CompileJobId");
518 
519  migrationBuilder.CreateIndex(
520  name: "IX_RepositorySettings_InstanceId",
521  table: "RepositorySettings",
522  column: "InstanceId",
523  unique: true);
524 
525  migrationBuilder.CreateIndex(
526  name: "IX_RevInfoTestMerges_RevisionInformationId",
527  table: "RevInfoTestMerges",
528  column: "RevisionInformationId");
529 
530  migrationBuilder.CreateIndex(
531  name: "IX_RevInfoTestMerges_TestMergeId",
532  table: "RevInfoTestMerges",
533  column: "TestMergeId");
534 
535  migrationBuilder.CreateIndex(
536  name: "IX_RevisionInformations_CommitSha",
537  table: "RevisionInformations",
538  column: "CommitSha",
539  unique: true);
540 
541  migrationBuilder.CreateIndex(
542  name: "IX_RevisionInformations_InstanceId",
543  table: "RevisionInformations",
544  column: "InstanceId");
545 
546  migrationBuilder.CreateIndex(
547  name: "IX_TestMerges_MergedById",
548  table: "TestMerges",
549  column: "MergedById");
550 
551  migrationBuilder.CreateIndex(
552  name: "IX_TestMerges_PrimaryRevisionInformationId",
553  table: "TestMerges",
554  column: "PrimaryRevisionInformationId",
555  unique: true,
556  filter: "[PrimaryRevisionInformationId] IS NOT NULL");
557 
558  migrationBuilder.CreateIndex(
559  name: "IX_Users_CanonicalName",
560  table: "Users",
561  column: "CanonicalName",
562  unique: true);
563 
564  migrationBuilder.CreateIndex(
565  name: "IX_Users_CreatedById",
566  table: "Users",
567  column: "CreatedById");
568 
569  migrationBuilder.CreateIndex(
570  name: "IX_WatchdogReattachInformations_AlphaId",
571  table: "WatchdogReattachInformations",
572  column: "AlphaId");
573 
574  migrationBuilder.CreateIndex(
575  name: "IX_WatchdogReattachInformations_BravoId",
576  table: "WatchdogReattachInformations",
577  column: "BravoId");
578 
579  migrationBuilder.AddForeignKey(
580  name: "FK_ChatChannels_ChatBots_ChatSettingsId",
581  table: "ChatChannels",
582  column: "ChatSettingsId",
583  principalTable: "ChatBots",
584  principalColumn: "Id",
585  onDelete: ReferentialAction.Cascade);
586 
587  migrationBuilder.AddForeignKey(
588  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
589  table: "ReattachInformations",
590  column: "CompileJobId",
591  principalTable: "CompileJobs",
592  principalColumn: "Id",
593  onDelete: ReferentialAction.Restrict);
594  }
ConfigurationRights
Rights for Models.ConfigurationFile
+
User can enable Models.Internal.DreamDaemonSettings.SoftRestart
+
ByondRights
Rights for Models.Byond
Definition: ByondRights.cs:9
+
InstanceUserRights
Rights for an Models.Instance
+
AdministrationRights
Rights for Models.Administration
+
ConfigurationType
The type of configuration allowed on an Instance
+
DreamDaemonRights
Rights for Models.DreamDaemon
+
InstanceManagerRights
Rights for managing Models.Instances
+
DreamMakerRights
Rights for Models.DreamMaker
+
RepositoryRights
Rights for a Models.Repository
+
ChatBotRights
Rights for Models.ChatBot
Definition: ChatBotRights.cs:9
+ +
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
+
+
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.png new file mode 100644 index 0000000000000000000000000000000000000000..0a13f9c64b2ee8e29124106de67ad835d05ca849 GIT binary patch literal 979 zcmeAS@N?(olHy`uVBq!ia0y~yVDtg912~w0r0eB9mOx4(z$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opFBNg#D`QSQdt~JQs`2Iw-kFn3(#)?|S99JjD?2e|$?-F(eA_F549W0Z#o$SG zuB+FkeO7LK|MGU)XQ18vkzUhO?rz+4=4seGApPZ3&D%83Up!&=pH2E=2zM7y;~b8e zlb#$=Gk!j&c}{VibOZkbZUu&l`4c!F9KIfYgQY+*h3UtJojkJ{QfYZ5`vI-`~2@#ozaYaM~!EH zH#$9qY3rF3K574U4wIvM;tt853pKU-|BT;gyIoxHHvf*FmTI5Ao=a7gE&hIY&6j++ ztw!FiKdYWE54)|`yXTx+=8ou@?$*_Rzf^8}XSFRj$~o_8PwKm=6MPf{yE8Aiq_O2B zZQwiCHr;<-;-03pSNo;pd5^FC{jg;H><_;K&F336=enmKvz!)bA7J`Lw#0VAg5&qh zmVesO-FW8ZjH;Qr_K!2#fl7~WF0*xzE~~Yi7Zu(nj9;(rw>Ca*w0i~n?e}HQyk_4PAA3HtQos1t^?sxEhbybnZspWH zyKQ^9bmdk{R-aef;#c+0GQN~jY+U?pviZ$Dxpz`NFaD}?>*A5?i&xA%{OMcbbD1Tw zVJ|c1oSl7@=Yyq=P@(>2e?5lm%>hTIPmL7UJ)pk9@5tg@J^_Y5>S*z}@uZLDQiY{c c?md$ayzA~>x^7o6Fb6Vty85}Sb4q9e01)cKaR2}S literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup-members.html new file mode 100644 index 0000000000..aed8e97a4a --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup, including all inherited members.

+ + + + +
BuildTargetModel(ModelBuilder modelBuilder)Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanupprotected
Down(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanupprotected
Up(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanupprotected
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html new file mode 100644 index 0000000000..0b534bf64a --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html @@ -0,0 +1,227 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup Class Reference
+
+
+ +

Cleans up of nullable columns and foreign keys MSSQL + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup:
+
+
+ + +Migration + +
+ + + + + + + + + + + +

+Protected Member Functions

override void Up (MigrationBuilder migrationBuilder)
 Applies the migration More...
 
override void Down (MigrationBuilder migrationBuilder)
 Unapplies the migration More...
 
override void BuildTargetModel (ModelBuilder modelBuilder)
 Builds the target model More...
 
+

Detailed Description

+

Cleans up of nullable columns and foreign keys MSSQL

+ +

Definition at line 9 of file 20180918205224_MSNullableAndForeignKeyCleanup.cs.

+

Member Function Documentation

+ +

◆ BuildTargetModel()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.BuildTargetModel (ModelBuilder modelBuilder)
+
+protected
+
+ +

Builds the target model

+
Parameters
+ + +
modelBuilderThe ModelBuilder to use
+
+
+ +

Definition at line 19 of file 20180918205224_MSNullableAndForeignKeyCleanup.Designer.cs.

+
20  {
21 #pragma warning disable 612, 618
22  modelBuilder
23  .HasAnnotation("ProductVersion", "2.1.3-rtm-32065")
24  .HasAnnotation("Relational:MaxIdentifierLength", 128)
25  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
26 
27  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
28  {
29  b.Property<long>("Id")
30  .ValueGeneratedOnAdd()
31  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
32 
33  b.Property<string>("ConnectionString")
34  .IsRequired();
35 
36  b.Property<bool?>("Enabled");
37 
38  b.Property<long>("InstanceId");
39 
40  b.Property<string>("Name")
41  .IsRequired();
42 
43  b.Property<int?>("Provider");
44 
45  b.HasKey("Id");
46 
47  b.HasIndex("InstanceId");
48 
49  b.HasIndex("Name")
50  .IsUnique();
51 
52  b.ToTable("ChatBots");
53  });
54 
55  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
56  {
57  b.Property<long>("Id")
58  .ValueGeneratedOnAdd()
59  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
60 
61  b.Property<long>("ChatSettingsId");
62 
63  b.Property<decimal?>("DiscordChannelId")
64  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
65 
66  b.Property<string>("IrcChannel");
67 
68  b.Property<bool?>("IsAdminChannel")
69  .IsRequired();
70 
71  b.Property<bool?>("IsUpdatesChannel")
72  .IsRequired();
73 
74  b.Property<bool?>("IsWatchdogChannel")
75  .IsRequired();
76 
77  b.Property<string>("Tag");
78 
79  b.HasKey("Id");
80 
81  b.HasIndex("ChatSettingsId", "DiscordChannelId")
82  .IsUnique()
83  .HasFilter("[DiscordChannelId] IS NOT NULL");
84 
85  b.HasIndex("ChatSettingsId", "IrcChannel")
86  .IsUnique()
87  .HasFilter("[IrcChannel] IS NOT NULL");
88 
89  b.ToTable("ChatChannels");
90  });
91 
92  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
93  {
94  b.Property<long>("Id")
95  .ValueGeneratedOnAdd()
96  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
97 
98  b.Property<string>("ByondVersion")
99  .IsRequired();
100 
101  b.Property<Guid?>("DirectoryName")
102  .IsRequired();
103 
104  b.Property<string>("DmeName")
105  .IsRequired();
106 
107  b.Property<long>("JobId");
108 
109  b.Property<int>("MinimumSecurityLevel");
110 
111  b.Property<string>("Output")
112  .IsRequired();
113 
114  b.Property<long>("RevisionInformationId");
115 
116  b.HasKey("Id");
117 
118  b.HasIndex("DirectoryName");
119 
120  b.HasIndex("JobId")
121  .IsUnique();
122 
123  b.HasIndex("RevisionInformationId");
124 
125  b.ToTable("CompileJobs");
126  });
127 
128  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
129  {
130  b.Property<long>("Id")
131  .ValueGeneratedOnAdd()
132  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
133 
134  b.Property<string>("AccessToken");
135 
136  b.Property<bool?>("AllowWebClient")
137  .IsRequired();
138 
139  b.Property<bool?>("AutoStart")
140  .IsRequired();
141 
142  b.Property<long>("InstanceId");
143 
144  b.Property<int>("PrimaryPort");
145 
146  b.Property<int?>("ProcessId");
147 
148  b.Property<int>("SecondaryPort");
149 
150  b.Property<int>("SecurityLevel");
151 
152  b.Property<bool?>("SoftRestart")
153  .IsRequired();
154 
155  b.Property<bool?>("SoftShutdown")
156  .IsRequired();
157 
158  b.Property<long>("StartupTimeout");
159 
160  b.HasKey("Id");
161 
162  b.HasIndex("InstanceId")
163  .IsUnique();
164 
165  b.ToTable("DreamDaemonSettings");
166  });
167 
168  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
169  {
170  b.Property<long>("Id")
171  .ValueGeneratedOnAdd()
172  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
173 
174  b.Property<int>("ApiValidationPort");
175 
176  b.Property<int>("ApiValidationSecurityLevel");
177 
178  b.Property<long>("InstanceId");
179 
180  b.Property<string>("ProjectName");
181 
182  b.HasKey("Id");
183 
184  b.HasIndex("InstanceId")
185  .IsUnique();
186 
187  b.ToTable("DreamMakerSettings");
188  });
189 
190  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
191  {
192  b.Property<long>("Id")
193  .ValueGeneratedOnAdd()
194  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
195 
196  b.Property<long>("AutoUpdateInterval");
197 
198  b.Property<int>("ConfigurationType");
199 
200  b.Property<string>("Name")
201  .IsRequired();
202 
203  b.Property<bool?>("Online")
204  .IsRequired();
205 
206  b.Property<string>("Path")
207  .IsRequired();
208 
209  b.HasKey("Id");
210 
211  b.HasIndex("Path")
212  .IsUnique();
213 
214  b.ToTable("Instances");
215  });
216 
217  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
218  {
219  b.Property<long>("Id")
220  .ValueGeneratedOnAdd()
221  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
222 
223  b.Property<decimal>("ByondRights")
224  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
225 
226  b.Property<decimal>("ChatBotRights")
227  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
228 
229  b.Property<decimal>("ConfigurationRights")
230  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
231 
232  b.Property<decimal>("DreamDaemonRights")
233  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
234 
235  b.Property<decimal>("DreamMakerRights")
236  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
237 
238  b.Property<long>("InstanceId");
239 
240  b.Property<decimal>("InstanceUserRights")
241  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
242 
243  b.Property<decimal>("RepositoryRights")
244  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
245 
246  b.Property<long?>("UserId")
247  .IsRequired();
248 
249  b.HasKey("Id");
250 
251  b.HasIndex("InstanceId");
252 
253  b.HasIndex("UserId", "InstanceId")
254  .IsUnique();
255 
256  b.ToTable("InstanceUsers");
257  });
258 
259  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
260  {
261  b.Property<long>("Id")
262  .ValueGeneratedOnAdd()
263  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
264 
265  b.Property<decimal?>("CancelRight")
266  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
267 
268  b.Property<decimal?>("CancelRightsType")
269  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
270 
271  b.Property<bool?>("Cancelled")
272  .IsRequired();
273 
274  b.Property<long?>("CancelledById");
275 
276  b.Property<string>("Description")
277  .IsRequired();
278 
279  b.Property<string>("ExceptionDetails");
280 
281  b.Property<long>("InstanceId");
282 
283  b.Property<DateTimeOffset?>("StartedAt")
284  .IsRequired();
285 
286  b.Property<long>("StartedById");
287 
288  b.Property<DateTimeOffset?>("StoppedAt");
289 
290  b.HasKey("Id");
291 
292  b.HasIndex("CancelledById");
293 
294  b.HasIndex("InstanceId");
295 
296  b.HasIndex("StartedById");
297 
298  b.ToTable("Jobs");
299  });
300 
301  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
302  {
303  b.Property<long>("Id")
304  .ValueGeneratedOnAdd()
305  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
306 
307  b.Property<string>("AccessIdentifier")
308  .IsRequired();
309 
310  b.Property<string>("ChatChannelsJson")
311  .IsRequired();
312 
313  b.Property<string>("ChatCommandsJson")
314  .IsRequired();
315 
316  b.Property<long?>("CompileJobId");
317 
318  b.Property<bool>("IsPrimary");
319 
320  b.Property<int>("Port");
321 
322  b.Property<int>("ProcessId");
323 
324  b.Property<int>("RebootState");
325 
326  b.Property<string>("ServerCommandsJson")
327  .IsRequired();
328 
329  b.HasKey("Id");
330 
331  b.HasIndex("CompileJobId");
332 
333  b.ToTable("ReattachInformations");
334  });
335 
336  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
337  {
338  b.Property<long>("Id")
339  .ValueGeneratedOnAdd()
340  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
341 
342  b.Property<string>("AccessToken");
343 
344  b.Property<string>("AccessUser");
345 
346  b.Property<bool?>("AutoUpdatesKeepTestMerges")
347  .IsRequired();
348 
349  b.Property<bool?>("AutoUpdatesSynchronize")
350  .IsRequired();
351 
352  b.Property<string>("CommitterEmail")
353  .IsRequired();
354 
355  b.Property<string>("CommitterName")
356  .IsRequired();
357 
358  b.Property<long>("InstanceId");
359 
360  b.Property<bool?>("PushTestMergeCommits")
361  .IsRequired();
362 
363  b.Property<bool?>("ShowTestMergeCommitters")
364  .IsRequired();
365 
366  b.HasKey("Id");
367 
368  b.HasIndex("InstanceId")
369  .IsUnique();
370 
371  b.ToTable("RepositorySettings");
372  });
373 
374  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
375  {
376  b.Property<long>("Id")
377  .ValueGeneratedOnAdd()
378  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
379 
380  b.Property<long>("RevisionInformationId");
381 
382  b.Property<long>("TestMergeId");
383 
384  b.HasKey("Id");
385 
386  b.HasIndex("RevisionInformationId");
387 
388  b.HasIndex("TestMergeId");
389 
390  b.ToTable("RevInfoTestMerges");
391  });
392 
393  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
394  {
395  b.Property<long>("Id")
396  .ValueGeneratedOnAdd()
397  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
398 
399  b.Property<string>("CommitSha")
400  .IsRequired()
401  .HasMaxLength(40);
402 
403  b.Property<long>("InstanceId");
404 
405  b.Property<string>("OriginCommitSha")
406  .IsRequired()
407  .HasMaxLength(40);
408 
409  b.HasKey("Id");
410 
411  b.HasIndex("CommitSha")
412  .IsUnique();
413 
414  b.HasIndex("InstanceId");
415 
416  b.ToTable("RevisionInformations");
417  });
418 
419  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
420  {
421  b.Property<long>("Id")
422  .ValueGeneratedOnAdd()
423  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
424 
425  b.Property<string>("Author")
426  .IsRequired();
427 
428  b.Property<string>("BodyAtMerge")
429  .IsRequired();
430 
431  b.Property<string>("Comment");
432 
433  b.Property<DateTimeOffset>("MergedAt");
434 
435  b.Property<long>("MergedById");
436 
437  b.Property<int?>("Number")
438  .IsRequired();
439 
440  b.Property<long?>("PrimaryRevisionInformationId")
441  .IsRequired();
442 
443  b.Property<string>("PullRequestRevision")
444  .IsRequired();
445 
446  b.Property<string>("TitleAtMerge")
447  .IsRequired();
448 
449  b.Property<string>("Url")
450  .IsRequired();
451 
452  b.HasKey("Id");
453 
454  b.HasIndex("MergedById");
455 
456  b.HasIndex("PrimaryRevisionInformationId")
457  .IsUnique();
458 
459  b.ToTable("TestMerges");
460  });
461 
462  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
463  {
464  b.Property<long>("Id")
465  .ValueGeneratedOnAdd()
466  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
467 
468  b.Property<decimal>("AdministrationRights")
469  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
470 
471  b.Property<string>("CanonicalName")
472  .IsRequired();
473 
474  b.Property<DateTimeOffset?>("CreatedAt")
475  .IsRequired();
476 
477  b.Property<long?>("CreatedById");
478 
479  b.Property<bool?>("Enabled")
480  .IsRequired();
481 
482  b.Property<decimal>("InstanceManagerRights")
483  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
484 
485  b.Property<DateTimeOffset?>("LastPasswordUpdate");
486 
487  b.Property<string>("Name")
488  .IsRequired();
489 
490  b.Property<string>("PasswordHash");
491 
492  b.Property<string>("SystemIdentifier");
493 
494  b.HasKey("Id");
495 
496  b.HasIndex("CanonicalName")
497  .IsUnique();
498 
499  b.HasIndex("CreatedById");
500 
501  b.ToTable("Users");
502  });
503 
504  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
505  {
506  b.Property<long>("Id")
507  .ValueGeneratedOnAdd()
508  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
509 
510  b.Property<long?>("AlphaId");
511 
512  b.Property<bool>("AlphaIsActive");
513 
514  b.Property<long?>("BravoId");
515 
516  b.Property<long>("InstanceId");
517 
518  b.HasKey("Id");
519 
520  b.HasIndex("AlphaId");
521 
522  b.HasIndex("BravoId");
523 
524  b.HasIndex("InstanceId")
525  .IsUnique();
526 
527  b.ToTable("WatchdogReattachInformations");
528  });
529 
530  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
531  {
532  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
533  .WithMany("ChatSettings")
534  .HasForeignKey("InstanceId")
535  .OnDelete(DeleteBehavior.Cascade);
536  });
537 
538  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
539  {
540  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
541  .WithMany("Channels")
542  .HasForeignKey("ChatSettingsId")
543  .OnDelete(DeleteBehavior.Cascade);
544  });
545 
546  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
547  {
548  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
549  .WithOne()
550  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
551  .OnDelete(DeleteBehavior.Restrict);
552 
553  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
554  .WithMany("CompileJobs")
555  .HasForeignKey("RevisionInformationId")
556  .OnDelete(DeleteBehavior.Cascade);
557  });
558 
559  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
560  {
561  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
562  .WithOne("DreamDaemonSettings")
563  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
564  .OnDelete(DeleteBehavior.Cascade);
565  });
566 
567  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
568  {
569  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
570  .WithOne("DreamMakerSettings")
571  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
572  .OnDelete(DeleteBehavior.Cascade);
573  });
574 
575  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
576  {
577  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
578  .WithMany("InstanceUsers")
579  .HasForeignKey("InstanceId")
580  .OnDelete(DeleteBehavior.Cascade);
581 
582  b.HasOne("Tgstation.Server.Host.Models.User")
583  .WithMany("InstanceUsers")
584  .HasForeignKey("UserId")
585  .OnDelete(DeleteBehavior.Cascade);
586  });
587 
588  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
589  {
590  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
591  .WithMany()
592  .HasForeignKey("CancelledById");
593 
594  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
595  .WithMany("Jobs")
596  .HasForeignKey("InstanceId")
597  .OnDelete(DeleteBehavior.Cascade);
598 
599  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
600  .WithMany()
601  .HasForeignKey("StartedById")
602  .OnDelete(DeleteBehavior.Cascade);
603  });
604 
605  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
606  {
607  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
608  .WithMany()
609  .HasForeignKey("CompileJobId");
610  });
611 
612  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
613  {
614  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
615  .WithOne("RepositorySettings")
616  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
617  .OnDelete(DeleteBehavior.Cascade);
618  });
619 
620  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
621  {
622  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
623  .WithMany("ActiveTestMerges")
624  .HasForeignKey("RevisionInformationId")
625  .OnDelete(DeleteBehavior.Cascade);
626 
627  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
628  .WithMany("RevisonInformations")
629  .HasForeignKey("TestMergeId")
630  .OnDelete(DeleteBehavior.Cascade);
631  });
632 
633  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
634  {
635  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
636  .WithMany("RevisionInformations")
637  .HasForeignKey("InstanceId")
638  .OnDelete(DeleteBehavior.Cascade);
639  });
640 
641  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
642  {
643  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
644  .WithMany("TestMerges")
645  .HasForeignKey("MergedById")
646  .OnDelete(DeleteBehavior.Restrict);
647 
648  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
649  .WithOne("PrimaryTestMerge")
650  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
651  .OnDelete(DeleteBehavior.Restrict);
652  });
653 
654  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
655  {
656  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
657  .WithMany("CreatedUsers")
658  .HasForeignKey("CreatedById");
659  });
660 
661  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
662  {
663  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
664  .WithMany()
665  .HasForeignKey("AlphaId");
666 
667  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
668  .WithMany()
669  .HasForeignKey("BravoId");
670 
671  b.HasOne("Tgstation.Server.Host.Models.Instance")
672  .WithOne("WatchdogReattachInformation")
673  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
674  .OnDelete(DeleteBehavior.Cascade);
675  });
676 #pragma warning restore 612, 618
677  }
+
+
+ +

◆ Down()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.Down (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Unapplies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 124 of file 20180918205224_MSNullableAndForeignKeyCleanup.cs.

+
125  {
126  if (migrationBuilder == null)
127  throw new ArgumentNullException(nameof(migrationBuilder));
128 
129  migrationBuilder.DropForeignKey(
130  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
131  table: "TestMerges");
132 
133  migrationBuilder.DropForeignKey(
134  name: "FK_WatchdogReattachInformations_Instances_InstanceId",
135  table: "WatchdogReattachInformations");
136 
137  migrationBuilder.DropIndex(
138  name: "IX_WatchdogReattachInformations_InstanceId",
139  table: "WatchdogReattachInformations");
140 
141  migrationBuilder.DropIndex(
142  name: "IX_TestMerges_PrimaryRevisionInformationId",
143  table: "TestMerges");
144 
145  migrationBuilder.DropIndex(
146  name: "IX_CompileJobs_JobId",
147  table: "CompileJobs");
148 
149  migrationBuilder.DropColumn(
150  name: "InstanceId",
151  table: "WatchdogReattachInformations");
152 
153  migrationBuilder.AlterColumn<long>(
154  name: "PrimaryRevisionInformationId",
155  table: "TestMerges",
156  nullable: true,
157  oldClrType: typeof(long));
158 
159  migrationBuilder.AddColumn<long>(
160  name: "WatchdogReattachInformationId",
161  table: "Instances",
162  nullable: true);
163 
164  migrationBuilder.AlterColumn<string>(
165  name: "Output",
166  table: "CompileJobs",
167  nullable: true,
168  oldClrType: typeof(string));
169 
170  migrationBuilder.AlterColumn<long>(
171  name: "JobId",
172  table: "CompileJobs",
173  nullable: true,
174  oldClrType: typeof(long));
175 
176  migrationBuilder.AlterColumn<string>(
177  name: "DmeName",
178  table: "CompileJobs",
179  nullable: true,
180  oldClrType: typeof(string));
181 
182  migrationBuilder.AlterColumn<Guid>(
183  name: "DirectoryName",
184  table: "CompileJobs",
185  nullable: true,
186  oldClrType: typeof(Guid));
187 
188  migrationBuilder.CreateIndex(
189  name: "IX_TestMerges_PrimaryRevisionInformationId",
190  table: "TestMerges",
191  column: "PrimaryRevisionInformationId",
192  unique: true,
193  filter: "[PrimaryRevisionInformationId] IS NOT NULL");
194 
195  migrationBuilder.CreateIndex(
196  name: "IX_Instances_WatchdogReattachInformationId",
197  table: "Instances",
198  column: "WatchdogReattachInformationId");
199 
200  migrationBuilder.CreateIndex(
201  name: "IX_CompileJobs_JobId",
202  table: "CompileJobs",
203  column: "JobId");
204 
205  migrationBuilder.AddForeignKey(
206  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInformationId",
207  table: "Instances",
208  column: "WatchdogReattachInformationId",
209  principalTable: "WatchdogReattachInformations",
210  principalColumn: "Id",
211  onDelete: ReferentialAction.Restrict);
212 
213  migrationBuilder.AddForeignKey(
214  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
215  table: "TestMerges",
216  column: "PrimaryRevisionInformationId",
217  principalTable: "RevisionInformations",
218  principalColumn: "Id",
219  onDelete: ReferentialAction.SetNull);
220  }
+
+
+ +

◆ Up()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.Up (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Applies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 15 of file 20180918205224_MSNullableAndForeignKeyCleanup.cs.

+
16  {
17  if (migrationBuilder == null)
18  throw new ArgumentNullException(nameof(migrationBuilder));
19 
20  migrationBuilder.DropForeignKey(
21  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInformationId",
22  table: "Instances");
23 
24  migrationBuilder.DropForeignKey(
25  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
26  table: "TestMerges");
27 
28  migrationBuilder.DropIndex(
29  name: "IX_TestMerges_PrimaryRevisionInformationId",
30  table: "TestMerges");
31 
32  migrationBuilder.DropIndex(
33  name: "IX_Instances_WatchdogReattachInformationId",
34  table: "Instances");
35 
36  migrationBuilder.DropIndex(
37  name: "IX_CompileJobs_JobId",
38  table: "CompileJobs");
39 
40  migrationBuilder.DropColumn(
41  name: "WatchdogReattachInformationId",
42  table: "Instances");
43 
44  migrationBuilder.AddColumn<long>(
45  name: "InstanceId",
46  table: "WatchdogReattachInformations",
47  nullable: false,
48  defaultValue: 0L);
49 
50  migrationBuilder.AlterColumn<long>(
51  name: "PrimaryRevisionInformationId",
52  table: "TestMerges",
53  nullable: false,
54  oldClrType: typeof(long),
55  oldNullable: true);
56 
57  migrationBuilder.AlterColumn<string>(
58  name: "Output",
59  table: "CompileJobs",
60  nullable: false,
61  oldClrType: typeof(string),
62  oldNullable: true);
63 
64  migrationBuilder.AlterColumn<long>(
65  name: "JobId",
66  table: "CompileJobs",
67  nullable: false,
68  oldClrType: typeof(long),
69  oldNullable: true);
70 
71  migrationBuilder.AlterColumn<string>(
72  name: "DmeName",
73  table: "CompileJobs",
74  nullable: false,
75  oldClrType: typeof(string),
76  oldNullable: true);
77 
78  migrationBuilder.AlterColumn<Guid>(
79  name: "DirectoryName",
80  table: "CompileJobs",
81  nullable: false,
82  oldClrType: typeof(Guid),
83  oldNullable: true);
84 
85  migrationBuilder.CreateIndex(
86  name: "IX_WatchdogReattachInformations_InstanceId",
87  table: "WatchdogReattachInformations",
88  column: "InstanceId",
89  unique: true);
90 
91  migrationBuilder.CreateIndex(
92  name: "IX_TestMerges_PrimaryRevisionInformationId",
93  table: "TestMerges",
94  column: "PrimaryRevisionInformationId",
95  unique: true);
96 
97  migrationBuilder.CreateIndex(
98  name: "IX_CompileJobs_JobId",
99  table: "CompileJobs",
100  column: "JobId",
101  unique: true);
102 
103  migrationBuilder.AddForeignKey(
104  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
105  table: "TestMerges",
106  column: "PrimaryRevisionInformationId",
107  principalTable: "RevisionInformations",
108  principalColumn: "Id",
109  onDelete: ReferentialAction.Restrict);
110 
111  migrationBuilder.AddForeignKey(
112  name: "FK_WatchdogReattachInformations_Instances_InstanceId",
113  table: "WatchdogReattachInformations",
114  column: "InstanceId",
115  principalTable: "Instances",
116  principalColumn: "Id",
117  onDelete: ReferentialAction.Cascade);
118  }
+
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.png new file mode 100644 index 0000000000000000000000000000000000000000..d0797bb232404db7420c4ec48a0f501d3b593e9b GIT binary patch literal 1140 zcmeAS@N?(olHy`uVBq!ia0y~yVB8O62XHV0$$cxj7XvAY0G|-o|Ns93nJ?aaE$u%v z0muU50|ySUcHWT(ayd$Z{DK*Pia_A%sSqOu1{P*d7srqa#D4&9%bfFA#07=Dn{sc5<=o!3w8eK4m#3G<&&f;nOtJSoZ(kS7 zO7(yHZI!=Hu^_Tuy!>Oa(dqdreCu|m_Ntk+r{=3X zT?*6}2WQ0n+m?H~EBE%c9)>k%>>HRARG;!I=>GpV)uCa{6#IrPd%gf!OMt91Q*0Z6 zUZgG7dB1+^wXSPX-kiJ(7(6_FGN159!lz%Zul>hReAhnye$x5J&J2Rbs~M_g_n%Lz zzrD9UXCAxhZo@sVIrjIT<-O1<;g?*m6mhWqU1E=(T*G{W=lL}mo9g0^Fkblh=KUSl z1GQ)Ww9cJBjeCdw=O2>)mcOj7Prg=l&xoO~bBVTG!+ME7dzXE>IpcSl!GGD?Uq7EI zi0hmC{ax9yv{`%he?DeewfxDx-1y9zQl@i#$0cXDT37$+`zZ7NUmCl?!nwsp&bM8+ z3zt89Klfal_WQe5bGx!7e@R#|-n+k1@~!LReLn2lCDMBT2F0x3WyR+_i}lO){jX}| z=5HvspZo5k^`8^*77d48AABm3m>_#*ZS;fnyN!hfei+X_+-Ek+kWKnRV*M^I>HSI{ z%;h>d?f=iSxb>k>xNbx2;=gXq^Rh$lCcdiTsonos{Pr91ybsTVj&0tr_$@p8chsHv z`+tju2X&}teM-4<^JjI3S=F6(k*DYN6lH=xE!%bVyZRLtk(>z+|Ls`xci#VV_mls< z>8cXnt=YKEh3{Wm?!SVZV>Jf;S(h^&m!JK6Hpn4>bJ@Q-3rAI2(l|3^1lfga1>BVD1?rQ%JGDk$1qfgcxV?NbP0l+XkK12;-r literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required-members.html new file mode 100644 index 0000000000..15c2fd3056 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired, including all inherited members.

+ + + + +
BuildTargetModel(ModelBuilder modelBuilder)Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequiredprotected
Down(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequiredprotected
Up(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequiredprotected
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html new file mode 100644 index 0000000000..92670dfeba --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html @@ -0,0 +1,227 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired Class Reference
+
+
+ +

Marks the CompileJobs of ReattachInformations as non-nullable for MSSQL + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired:
+
+
+ + +Migration + +
+ + + + + + + + + + + +

+Protected Member Functions

override void Up (MigrationBuilder migrationBuilder)
 Applies the migration More...
 
override void Down (MigrationBuilder migrationBuilder)
 Unapplies the migration More...
 
override void BuildTargetModel (ModelBuilder modelBuilder)
 Builds the target model More...
 
+

Detailed Description

+

Marks the CompileJobs of ReattachInformations as non-nullable for MSSQL

+ +

Definition at line 9 of file 20180926033145_MSReattachCompileJobRequired.cs.

+

Member Function Documentation

+ +

◆ BuildTargetModel()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.BuildTargetModel (ModelBuilder modelBuilder)
+
+protected
+
+ +

Builds the target model

+
Parameters
+ + +
modelBuilderThe ModelBuilder to use
+
+
+ +

Definition at line 19 of file 20180926033145_MSReattachCompileJobRequired.Designer.cs.

+
20  {
21 #pragma warning disable 612, 618
22  modelBuilder
23  .HasAnnotation("ProductVersion", "2.1.3-rtm-32065")
24  .HasAnnotation("Relational:MaxIdentifierLength", 128)
25  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
26 
27  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
28  {
29  b.Property<long>("Id")
30  .ValueGeneratedOnAdd()
31  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
32 
33  b.Property<string>("ConnectionString")
34  .IsRequired();
35 
36  b.Property<bool?>("Enabled");
37 
38  b.Property<long>("InstanceId");
39 
40  b.Property<string>("Name")
41  .IsRequired();
42 
43  b.Property<int?>("Provider");
44 
45  b.HasKey("Id");
46 
47  b.HasIndex("InstanceId");
48 
49  b.HasIndex("Name")
50  .IsUnique();
51 
52  b.ToTable("ChatBots");
53  });
54 
55  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
56  {
57  b.Property<long>("Id")
58  .ValueGeneratedOnAdd()
59  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
60 
61  b.Property<long>("ChatSettingsId");
62 
63  b.Property<decimal?>("DiscordChannelId")
64  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
65 
66  b.Property<string>("IrcChannel");
67 
68  b.Property<bool?>("IsAdminChannel")
69  .IsRequired();
70 
71  b.Property<bool?>("IsUpdatesChannel")
72  .IsRequired();
73 
74  b.Property<bool?>("IsWatchdogChannel")
75  .IsRequired();
76 
77  b.Property<string>("Tag");
78 
79  b.HasKey("Id");
80 
81  b.HasIndex("ChatSettingsId", "DiscordChannelId")
82  .IsUnique()
83  .HasFilter("[DiscordChannelId] IS NOT NULL");
84 
85  b.HasIndex("ChatSettingsId", "IrcChannel")
86  .IsUnique()
87  .HasFilter("[IrcChannel] IS NOT NULL");
88 
89  b.ToTable("ChatChannels");
90  });
91 
92  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
93  {
94  b.Property<long>("Id")
95  .ValueGeneratedOnAdd()
96  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
97 
98  b.Property<string>("ByondVersion")
99  .IsRequired();
100 
101  b.Property<Guid?>("DirectoryName")
102  .IsRequired();
103 
104  b.Property<string>("DmeName")
105  .IsRequired();
106 
107  b.Property<long>("JobId");
108 
109  b.Property<int>("MinimumSecurityLevel");
110 
111  b.Property<string>("Output")
112  .IsRequired();
113 
114  b.Property<long>("RevisionInformationId");
115 
116  b.HasKey("Id");
117 
118  b.HasIndex("DirectoryName");
119 
120  b.HasIndex("JobId")
121  .IsUnique();
122 
123  b.HasIndex("RevisionInformationId");
124 
125  b.ToTable("CompileJobs");
126  });
127 
128  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
129  {
130  b.Property<long>("Id")
131  .ValueGeneratedOnAdd()
132  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
133 
134  b.Property<string>("AccessToken");
135 
136  b.Property<bool?>("AllowWebClient")
137  .IsRequired();
138 
139  b.Property<bool?>("AutoStart")
140  .IsRequired();
141 
142  b.Property<long>("InstanceId");
143 
144  b.Property<int>("PrimaryPort");
145 
146  b.Property<int?>("ProcessId");
147 
148  b.Property<int>("SecondaryPort");
149 
150  b.Property<int>("SecurityLevel");
151 
152  b.Property<bool?>("SoftRestart")
153  .IsRequired();
154 
155  b.Property<bool?>("SoftShutdown")
156  .IsRequired();
157 
158  b.Property<long>("StartupTimeout");
159 
160  b.HasKey("Id");
161 
162  b.HasIndex("InstanceId")
163  .IsUnique();
164 
165  b.ToTable("DreamDaemonSettings");
166  });
167 
168  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
169  {
170  b.Property<long>("Id")
171  .ValueGeneratedOnAdd()
172  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
173 
174  b.Property<int>("ApiValidationPort");
175 
176  b.Property<int>("ApiValidationSecurityLevel");
177 
178  b.Property<long>("InstanceId");
179 
180  b.Property<string>("ProjectName");
181 
182  b.HasKey("Id");
183 
184  b.HasIndex("InstanceId")
185  .IsUnique();
186 
187  b.ToTable("DreamMakerSettings");
188  });
189 
190  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
191  {
192  b.Property<long>("Id")
193  .ValueGeneratedOnAdd()
194  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
195 
196  b.Property<long>("AutoUpdateInterval");
197 
198  b.Property<int>("ConfigurationType");
199 
200  b.Property<string>("Name")
201  .IsRequired();
202 
203  b.Property<bool?>("Online")
204  .IsRequired();
205 
206  b.Property<string>("Path")
207  .IsRequired();
208 
209  b.HasKey("Id");
210 
211  b.HasIndex("Path")
212  .IsUnique();
213 
214  b.ToTable("Instances");
215  });
216 
217  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
218  {
219  b.Property<long>("Id")
220  .ValueGeneratedOnAdd()
221  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
222 
223  b.Property<decimal>("ByondRights")
224  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
225 
226  b.Property<decimal>("ChatBotRights")
227  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
228 
229  b.Property<decimal>("ConfigurationRights")
230  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
231 
232  b.Property<decimal>("DreamDaemonRights")
233  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
234 
235  b.Property<decimal>("DreamMakerRights")
236  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
237 
238  b.Property<long>("InstanceId");
239 
240  b.Property<decimal>("InstanceUserRights")
241  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
242 
243  b.Property<decimal>("RepositoryRights")
244  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
245 
246  b.Property<long?>("UserId")
247  .IsRequired();
248 
249  b.HasKey("Id");
250 
251  b.HasIndex("InstanceId");
252 
253  b.HasIndex("UserId", "InstanceId")
254  .IsUnique();
255 
256  b.ToTable("InstanceUsers");
257  });
258 
259  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
260  {
261  b.Property<long>("Id")
262  .ValueGeneratedOnAdd()
263  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
264 
265  b.Property<decimal?>("CancelRight")
266  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
267 
268  b.Property<decimal?>("CancelRightsType")
269  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
270 
271  b.Property<bool?>("Cancelled")
272  .IsRequired();
273 
274  b.Property<long?>("CancelledById");
275 
276  b.Property<string>("Description")
277  .IsRequired();
278 
279  b.Property<string>("ExceptionDetails");
280 
281  b.Property<long>("InstanceId");
282 
283  b.Property<DateTimeOffset?>("StartedAt")
284  .IsRequired();
285 
286  b.Property<long>("StartedById");
287 
288  b.Property<DateTimeOffset?>("StoppedAt");
289 
290  b.HasKey("Id");
291 
292  b.HasIndex("CancelledById");
293 
294  b.HasIndex("InstanceId");
295 
296  b.HasIndex("StartedById");
297 
298  b.ToTable("Jobs");
299  });
300 
301  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
302  {
303  b.Property<long>("Id")
304  .ValueGeneratedOnAdd()
305  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
306 
307  b.Property<string>("AccessIdentifier")
308  .IsRequired();
309 
310  b.Property<string>("ChatChannelsJson")
311  .IsRequired();
312 
313  b.Property<string>("ChatCommandsJson")
314  .IsRequired();
315 
316  b.Property<long>("CompileJobId");
317 
318  b.Property<bool>("IsPrimary");
319 
320  b.Property<int>("Port");
321 
322  b.Property<int>("ProcessId");
323 
324  b.Property<int>("RebootState");
325 
326  b.Property<string>("ServerCommandsJson")
327  .IsRequired();
328 
329  b.HasKey("Id");
330 
331  b.HasIndex("CompileJobId");
332 
333  b.ToTable("ReattachInformations");
334  });
335 
336  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
337  {
338  b.Property<long>("Id")
339  .ValueGeneratedOnAdd()
340  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
341 
342  b.Property<string>("AccessToken");
343 
344  b.Property<string>("AccessUser");
345 
346  b.Property<bool?>("AutoUpdatesKeepTestMerges")
347  .IsRequired();
348 
349  b.Property<bool?>("AutoUpdatesSynchronize")
350  .IsRequired();
351 
352  b.Property<string>("CommitterEmail")
353  .IsRequired();
354 
355  b.Property<string>("CommitterName")
356  .IsRequired();
357 
358  b.Property<long>("InstanceId");
359 
360  b.Property<bool?>("PushTestMergeCommits")
361  .IsRequired();
362 
363  b.Property<bool?>("ShowTestMergeCommitters")
364  .IsRequired();
365 
366  b.HasKey("Id");
367 
368  b.HasIndex("InstanceId")
369  .IsUnique();
370 
371  b.ToTable("RepositorySettings");
372  });
373 
374  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
375  {
376  b.Property<long>("Id")
377  .ValueGeneratedOnAdd()
378  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
379 
380  b.Property<long>("RevisionInformationId");
381 
382  b.Property<long>("TestMergeId");
383 
384  b.HasKey("Id");
385 
386  b.HasIndex("RevisionInformationId");
387 
388  b.HasIndex("TestMergeId");
389 
390  b.ToTable("RevInfoTestMerges");
391  });
392 
393  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
394  {
395  b.Property<long>("Id")
396  .ValueGeneratedOnAdd()
397  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
398 
399  b.Property<string>("CommitSha")
400  .IsRequired()
401  .HasMaxLength(40);
402 
403  b.Property<long>("InstanceId");
404 
405  b.Property<string>("OriginCommitSha")
406  .IsRequired()
407  .HasMaxLength(40);
408 
409  b.HasKey("Id");
410 
411  b.HasIndex("CommitSha")
412  .IsUnique();
413 
414  b.HasIndex("InstanceId");
415 
416  b.ToTable("RevisionInformations");
417  });
418 
419  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
420  {
421  b.Property<long>("Id")
422  .ValueGeneratedOnAdd()
423  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
424 
425  b.Property<string>("Author")
426  .IsRequired();
427 
428  b.Property<string>("BodyAtMerge")
429  .IsRequired();
430 
431  b.Property<string>("Comment");
432 
433  b.Property<DateTimeOffset>("MergedAt");
434 
435  b.Property<long>("MergedById");
436 
437  b.Property<int?>("Number")
438  .IsRequired();
439 
440  b.Property<long?>("PrimaryRevisionInformationId")
441  .IsRequired();
442 
443  b.Property<string>("PullRequestRevision")
444  .IsRequired();
445 
446  b.Property<string>("TitleAtMerge")
447  .IsRequired();
448 
449  b.Property<string>("Url")
450  .IsRequired();
451 
452  b.HasKey("Id");
453 
454  b.HasIndex("MergedById");
455 
456  b.HasIndex("PrimaryRevisionInformationId")
457  .IsUnique();
458 
459  b.ToTable("TestMerges");
460  });
461 
462  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
463  {
464  b.Property<long>("Id")
465  .ValueGeneratedOnAdd()
466  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
467 
468  b.Property<decimal>("AdministrationRights")
469  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
470 
471  b.Property<string>("CanonicalName")
472  .IsRequired();
473 
474  b.Property<DateTimeOffset?>("CreatedAt")
475  .IsRequired();
476 
477  b.Property<long?>("CreatedById");
478 
479  b.Property<bool?>("Enabled")
480  .IsRequired();
481 
482  b.Property<decimal>("InstanceManagerRights")
483  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
484 
485  b.Property<DateTimeOffset?>("LastPasswordUpdate");
486 
487  b.Property<string>("Name")
488  .IsRequired();
489 
490  b.Property<string>("PasswordHash");
491 
492  b.Property<string>("SystemIdentifier");
493 
494  b.HasKey("Id");
495 
496  b.HasIndex("CanonicalName")
497  .IsUnique();
498 
499  b.HasIndex("CreatedById");
500 
501  b.ToTable("Users");
502  });
503 
504  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
505  {
506  b.Property<long>("Id")
507  .ValueGeneratedOnAdd()
508  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
509 
510  b.Property<long?>("AlphaId");
511 
512  b.Property<bool>("AlphaIsActive");
513 
514  b.Property<long?>("BravoId");
515 
516  b.Property<long>("InstanceId");
517 
518  b.HasKey("Id");
519 
520  b.HasIndex("AlphaId");
521 
522  b.HasIndex("BravoId");
523 
524  b.HasIndex("InstanceId")
525  .IsUnique();
526 
527  b.ToTable("WatchdogReattachInformations");
528  });
529 
530  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
531  {
532  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
533  .WithMany("ChatSettings")
534  .HasForeignKey("InstanceId")
535  .OnDelete(DeleteBehavior.Cascade);
536  });
537 
538  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
539  {
540  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
541  .WithMany("Channels")
542  .HasForeignKey("ChatSettingsId")
543  .OnDelete(DeleteBehavior.Cascade);
544  });
545 
546  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
547  {
548  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
549  .WithOne()
550  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
551  .OnDelete(DeleteBehavior.Restrict);
552 
553  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
554  .WithMany("CompileJobs")
555  .HasForeignKey("RevisionInformationId")
556  .OnDelete(DeleteBehavior.Cascade);
557  });
558 
559  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
560  {
561  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
562  .WithOne("DreamDaemonSettings")
563  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
564  .OnDelete(DeleteBehavior.Cascade);
565  });
566 
567  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
568  {
569  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
570  .WithOne("DreamMakerSettings")
571  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
572  .OnDelete(DeleteBehavior.Cascade);
573  });
574 
575  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
576  {
577  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
578  .WithMany("InstanceUsers")
579  .HasForeignKey("InstanceId")
580  .OnDelete(DeleteBehavior.Cascade);
581 
582  b.HasOne("Tgstation.Server.Host.Models.User")
583  .WithMany("InstanceUsers")
584  .HasForeignKey("UserId")
585  .OnDelete(DeleteBehavior.Cascade);
586  });
587 
588  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
589  {
590  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
591  .WithMany()
592  .HasForeignKey("CancelledById");
593 
594  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
595  .WithMany("Jobs")
596  .HasForeignKey("InstanceId")
597  .OnDelete(DeleteBehavior.Cascade);
598 
599  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
600  .WithMany()
601  .HasForeignKey("StartedById")
602  .OnDelete(DeleteBehavior.Cascade);
603  });
604 
605  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
606  {
607  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
608  .WithMany()
609  .HasForeignKey("CompileJobId")
610  .OnDelete(DeleteBehavior.Cascade);
611  });
612 
613  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
614  {
615  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
616  .WithOne("RepositorySettings")
617  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
618  .OnDelete(DeleteBehavior.Cascade);
619  });
620 
621  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
622  {
623  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
624  .WithMany("ActiveTestMerges")
625  .HasForeignKey("RevisionInformationId")
626  .OnDelete(DeleteBehavior.Cascade);
627 
628  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
629  .WithMany("RevisonInformations")
630  .HasForeignKey("TestMergeId")
631  .OnDelete(DeleteBehavior.Cascade);
632  });
633 
634  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
635  {
636  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
637  .WithMany("RevisionInformations")
638  .HasForeignKey("InstanceId")
639  .OnDelete(DeleteBehavior.Cascade);
640  });
641 
642  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
643  {
644  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
645  .WithMany("TestMerges")
646  .HasForeignKey("MergedById")
647  .OnDelete(DeleteBehavior.Restrict);
648 
649  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
650  .WithOne("PrimaryTestMerge")
651  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
652  .OnDelete(DeleteBehavior.Restrict);
653  });
654 
655  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
656  {
657  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
658  .WithMany("CreatedUsers")
659  .HasForeignKey("CreatedById");
660  });
661 
662  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
663  {
664  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
665  .WithMany()
666  .HasForeignKey("AlphaId");
667 
668  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
669  .WithMany()
670  .HasForeignKey("BravoId");
671 
672  b.HasOne("Tgstation.Server.Host.Models.Instance")
673  .WithOne("WatchdogReattachInformation")
674  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
675  .OnDelete(DeleteBehavior.Cascade);
676  });
677 #pragma warning restore 612, 618
678  }
+
+
+ +

◆ Down()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.Down (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Unapplies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 44 of file 20180926033145_MSReattachCompileJobRequired.cs.

+
45  {
46  if (migrationBuilder == null)
47  throw new ArgumentNullException(nameof(migrationBuilder));
48 
49  migrationBuilder.DropForeignKey(
50  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
51  table: "ReattachInformations");
52 
53  migrationBuilder.AlterColumn<long>(
54  name: "CompileJobId",
55  table: "ReattachInformations",
56  nullable: true,
57  oldClrType: typeof(long));
58 
59  migrationBuilder.AddForeignKey(
60  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
61  table: "ReattachInformations",
62  column: "CompileJobId",
63  principalTable: "CompileJobs",
64  principalColumn: "Id",
65  onDelete: ReferentialAction.Restrict);
66  }
+
+
+ +

◆ Up()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.Up (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Applies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 15 of file 20180926033145_MSReattachCompileJobRequired.cs.

+
16  {
17  if (migrationBuilder == null)
18  throw new ArgumentNullException(nameof(migrationBuilder));
19 
20  migrationBuilder.DropForeignKey(
21  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
22  table: "ReattachInformations");
23 
24  migrationBuilder.AlterColumn<long>(
25  name: "CompileJobId",
26  table: "ReattachInformations",
27  nullable: false,
28  oldClrType: typeof(long),
29  oldNullable: true);
30 
31  migrationBuilder.AddForeignKey(
32  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
33  table: "ReattachInformations",
34  column: "CompileJobId",
35  principalTable: "CompileJobs",
36  principalColumn: "Id",
37  onDelete: ReferentialAction.Cascade);
38  }
+
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.png new file mode 100644 index 0000000000000000000000000000000000000000..deb3843c5416d9150fe472b3723ec19f1c38920f GIT binary patch literal 1104 zcmeAS@N?(olHy`uVBq!ia0y~yU|a`e2XHV0$+9Dfr9es|z$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-oph8y#f4ebvmG0*=H@WuRYktjLFJWd|ZM8=B zr|w+&-*)_>+AUH z?Ru?a->d)gyZ(IQ?#o|i9o=_t8*9Qp+0_N>jo-8-ulyr+yL*Su`qzI7w%wD=n4de{ z&0qZe<_BW;zGj49jeWCj-}kgAmR;9;zMOxvxbgMw%yXuB(Jz)~ua3LCGtJ`S)~St2 zLaoz$7|qLtgRZA@Uk)wE_$1XfbIaT3`#uB~#O<2z7k-!T{&(MnOEa_G4$ECoJ`mtz zG&}Q>lYMOZF8-rV;nIDtvqTbGL>C!@w!xc9t#`dz>G@7KLPw0qrd-N&bN8y??y_x$kIE1T}bmWF1UXI)<+-C=*W z=ArU^xwg|6&rO?Vf7thax^Xx#P|1)D5I1iXl+Qk6Oi3t4RQmB`vr{+?Y2l6je WV)WZuUTOieKZB>MpUXO@geCyw + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments, including all inherited members.

+ + + + +
BuildTargetModel(ModelBuilder modelBuilder)Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeCommentsprotected
Down(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeCommentsprotected
Up(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeCommentsprotected
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.html new file mode 100644 index 0000000000..8ecdccb5d8 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.html @@ -0,0 +1,227 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments Class Reference
+
+
+ +

Add the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MSSQL + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments:
+
+
+ + +Migration + +
+ + + + + + + + + + + +

+Protected Member Functions

override void Up (MigrationBuilder migrationBuilder)
 Applies the migration More...
 
override void Down (MigrationBuilder migrationBuilder)
 Unapplies the migration More...
 
override void BuildTargetModel (ModelBuilder modelBuilder)
 Builds the target model More...
 
+

Detailed Description

+

Member Function Documentation

+ +

◆ BuildTargetModel()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments.BuildTargetModel (ModelBuilder modelBuilder)
+
+protected
+
+ +

Builds the target model

+
Parameters
+ + +
modelBuilderThe ModelBuilder to use
+
+
+ +

Definition at line 19 of file 20181124231534_MSToggleTestmergeComments.Designer.cs.

+
20  {
21 #pragma warning disable 612, 618
22  modelBuilder
23  .HasAnnotation("ProductVersion", "2.1.4-rtm-31024")
24  .HasAnnotation("Relational:MaxIdentifierLength", 128)
25  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
26 
27  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
28  {
29  b.Property<long>("Id")
30  .ValueGeneratedOnAdd()
31  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
32 
33  b.Property<string>("ConnectionString")
34  .IsRequired();
35 
36  b.Property<bool?>("Enabled");
37 
38  b.Property<long>("InstanceId");
39 
40  b.Property<string>("Name")
41  .IsRequired();
42 
43  b.Property<int?>("Provider");
44 
45  b.HasKey("Id");
46 
47  b.HasIndex("InstanceId");
48 
49  b.HasIndex("Name")
50  .IsUnique();
51 
52  b.ToTable("ChatBots");
53  });
54 
55  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
56  {
57  b.Property<long>("Id")
58  .ValueGeneratedOnAdd()
59  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
60 
61  b.Property<long>("ChatSettingsId");
62 
63  b.Property<decimal?>("DiscordChannelId")
64  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
65 
66  b.Property<string>("IrcChannel");
67 
68  b.Property<bool?>("IsAdminChannel")
69  .IsRequired();
70 
71  b.Property<bool?>("IsUpdatesChannel")
72  .IsRequired();
73 
74  b.Property<bool?>("IsWatchdogChannel")
75  .IsRequired();
76 
77  b.Property<string>("Tag");
78 
79  b.HasKey("Id");
80 
81  b.HasIndex("ChatSettingsId", "DiscordChannelId")
82  .IsUnique()
83  .HasFilter("[DiscordChannelId] IS NOT NULL");
84 
85  b.HasIndex("ChatSettingsId", "IrcChannel")
86  .IsUnique()
87  .HasFilter("[IrcChannel] IS NOT NULL");
88 
89  b.ToTable("ChatChannels");
90  });
91 
92  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
93  {
94  b.Property<long>("Id")
95  .ValueGeneratedOnAdd()
96  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
97 
98  b.Property<string>("ByondVersion")
99  .IsRequired();
100 
101  b.Property<Guid?>("DirectoryName")
102  .IsRequired();
103 
104  b.Property<string>("DmeName")
105  .IsRequired();
106 
107  b.Property<long>("JobId");
108 
109  b.Property<int>("MinimumSecurityLevel");
110 
111  b.Property<string>("Output")
112  .IsRequired();
113 
114  b.Property<long>("RevisionInformationId");
115 
116  b.HasKey("Id");
117 
118  b.HasIndex("DirectoryName");
119 
120  b.HasIndex("JobId")
121  .IsUnique();
122 
123  b.HasIndex("RevisionInformationId");
124 
125  b.ToTable("CompileJobs");
126  });
127 
128  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
129  {
130  b.Property<long>("Id")
131  .ValueGeneratedOnAdd()
132  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
133 
134  b.Property<string>("AccessToken");
135 
136  b.Property<bool?>("AllowWebClient")
137  .IsRequired();
138 
139  b.Property<bool?>("AutoStart")
140  .IsRequired();
141 
142  b.Property<long>("InstanceId");
143 
144  b.Property<int>("PrimaryPort");
145 
146  b.Property<int?>("ProcessId");
147 
148  b.Property<int>("SecondaryPort");
149 
150  b.Property<int>("SecurityLevel");
151 
152  b.Property<bool?>("SoftRestart")
153  .IsRequired();
154 
155  b.Property<bool?>("SoftShutdown")
156  .IsRequired();
157 
158  b.Property<long>("StartupTimeout");
159 
160  b.HasKey("Id");
161 
162  b.HasIndex("InstanceId")
163  .IsUnique();
164 
165  b.ToTable("DreamDaemonSettings");
166  });
167 
168  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
169  {
170  b.Property<long>("Id")
171  .ValueGeneratedOnAdd()
172  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
173 
174  b.Property<int>("ApiValidationPort");
175 
176  b.Property<int>("ApiValidationSecurityLevel");
177 
178  b.Property<long>("InstanceId");
179 
180  b.Property<string>("ProjectName");
181 
182  b.HasKey("Id");
183 
184  b.HasIndex("InstanceId")
185  .IsUnique();
186 
187  b.ToTable("DreamMakerSettings");
188  });
189 
190  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
191  {
192  b.Property<long>("Id")
193  .ValueGeneratedOnAdd()
194  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
195 
196  b.Property<long>("AutoUpdateInterval");
197 
198  b.Property<int>("ConfigurationType");
199 
200  b.Property<string>("Name")
201  .IsRequired();
202 
203  b.Property<bool?>("Online")
204  .IsRequired();
205 
206  b.Property<string>("Path")
207  .IsRequired();
208 
209  b.HasKey("Id");
210 
211  b.HasIndex("Path")
212  .IsUnique();
213 
214  b.ToTable("Instances");
215  });
216 
217  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
218  {
219  b.Property<long>("Id")
220  .ValueGeneratedOnAdd()
221  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
222 
223  b.Property<decimal>("ByondRights")
224  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
225 
226  b.Property<decimal>("ChatBotRights")
227  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
228 
229  b.Property<decimal>("ConfigurationRights")
230  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
231 
232  b.Property<decimal>("DreamDaemonRights")
233  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
234 
235  b.Property<decimal>("DreamMakerRights")
236  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
237 
238  b.Property<long>("InstanceId");
239 
240  b.Property<decimal>("InstanceUserRights")
241  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
242 
243  b.Property<decimal>("RepositoryRights")
244  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
245 
246  b.Property<long?>("UserId")
247  .IsRequired();
248 
249  b.HasKey("Id");
250 
251  b.HasIndex("InstanceId");
252 
253  b.HasIndex("UserId", "InstanceId")
254  .IsUnique();
255 
256  b.ToTable("InstanceUsers");
257  });
258 
259  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
260  {
261  b.Property<long>("Id")
262  .ValueGeneratedOnAdd()
263  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
264 
265  b.Property<decimal?>("CancelRight")
266  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
267 
268  b.Property<decimal?>("CancelRightsType")
269  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
270 
271  b.Property<bool?>("Cancelled")
272  .IsRequired();
273 
274  b.Property<long?>("CancelledById");
275 
276  b.Property<string>("Description")
277  .IsRequired();
278 
279  b.Property<string>("ExceptionDetails");
280 
281  b.Property<long>("InstanceId");
282 
283  b.Property<DateTimeOffset?>("StartedAt")
284  .IsRequired();
285 
286  b.Property<long>("StartedById");
287 
288  b.Property<DateTimeOffset?>("StoppedAt");
289 
290  b.HasKey("Id");
291 
292  b.HasIndex("CancelledById");
293 
294  b.HasIndex("InstanceId");
295 
296  b.HasIndex("StartedById");
297 
298  b.ToTable("Jobs");
299  });
300 
301  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
302  {
303  b.Property<long>("Id")
304  .ValueGeneratedOnAdd()
305  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
306 
307  b.Property<string>("AccessIdentifier")
308  .IsRequired();
309 
310  b.Property<string>("ChatChannelsJson")
311  .IsRequired();
312 
313  b.Property<string>("ChatCommandsJson")
314  .IsRequired();
315 
316  b.Property<long>("CompileJobId");
317 
318  b.Property<bool>("IsPrimary");
319 
320  b.Property<int>("Port");
321 
322  b.Property<int>("ProcessId");
323 
324  b.Property<int>("RebootState");
325 
326  b.Property<string>("ServerCommandsJson")
327  .IsRequired();
328 
329  b.HasKey("Id");
330 
331  b.HasIndex("CompileJobId");
332 
333  b.ToTable("ReattachInformations");
334  });
335 
336  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
337  {
338  b.Property<long>("Id")
339  .ValueGeneratedOnAdd()
340  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
341 
342  b.Property<string>("AccessToken");
343 
344  b.Property<string>("AccessUser");
345 
346  b.Property<bool?>("AutoUpdatesKeepTestMerges")
347  .IsRequired();
348 
349  b.Property<bool?>("AutoUpdatesSynchronize")
350  .IsRequired();
351 
352  b.Property<string>("CommitterEmail")
353  .IsRequired();
354 
355  b.Property<string>("CommitterName")
356  .IsRequired();
357 
358  b.Property<long>("InstanceId");
359 
360  b.Property<bool?>("PostTestMergeComment")
361  .IsRequired();
362 
363  b.Property<bool?>("PushTestMergeCommits")
364  .IsRequired();
365 
366  b.Property<bool?>("ShowTestMergeCommitters")
367  .IsRequired();
368 
369  b.HasKey("Id");
370 
371  b.HasIndex("InstanceId")
372  .IsUnique();
373 
374  b.ToTable("RepositorySettings");
375  });
376 
377  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
378  {
379  b.Property<long>("Id")
380  .ValueGeneratedOnAdd()
381  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
382 
383  b.Property<long>("RevisionInformationId");
384 
385  b.Property<long>("TestMergeId");
386 
387  b.HasKey("Id");
388 
389  b.HasIndex("RevisionInformationId");
390 
391  b.HasIndex("TestMergeId");
392 
393  b.ToTable("RevInfoTestMerges");
394  });
395 
396  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
397  {
398  b.Property<long>("Id")
399  .ValueGeneratedOnAdd()
400  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
401 
402  b.Property<string>("CommitSha")
403  .IsRequired()
404  .HasMaxLength(40);
405 
406  b.Property<long>("InstanceId");
407 
408  b.Property<string>("OriginCommitSha")
409  .IsRequired()
410  .HasMaxLength(40);
411 
412  b.HasKey("Id");
413 
414  b.HasIndex("CommitSha")
415  .IsUnique();
416 
417  b.HasIndex("InstanceId");
418 
419  b.ToTable("RevisionInformations");
420  });
421 
422  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
423  {
424  b.Property<long>("Id")
425  .ValueGeneratedOnAdd()
426  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
427 
428  b.Property<string>("Author")
429  .IsRequired();
430 
431  b.Property<string>("BodyAtMerge")
432  .IsRequired();
433 
434  b.Property<string>("Comment");
435 
436  b.Property<DateTimeOffset>("MergedAt");
437 
438  b.Property<long>("MergedById");
439 
440  b.Property<int?>("Number")
441  .IsRequired();
442 
443  b.Property<long?>("PrimaryRevisionInformationId")
444  .IsRequired();
445 
446  b.Property<string>("PullRequestRevision")
447  .IsRequired();
448 
449  b.Property<string>("TitleAtMerge")
450  .IsRequired();
451 
452  b.Property<string>("Url")
453  .IsRequired();
454 
455  b.HasKey("Id");
456 
457  b.HasIndex("MergedById");
458 
459  b.HasIndex("PrimaryRevisionInformationId")
460  .IsUnique();
461 
462  b.ToTable("TestMerges");
463  });
464 
465  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
466  {
467  b.Property<long>("Id")
468  .ValueGeneratedOnAdd()
469  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
470 
471  b.Property<decimal>("AdministrationRights")
472  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
473 
474  b.Property<string>("CanonicalName")
475  .IsRequired();
476 
477  b.Property<DateTimeOffset?>("CreatedAt")
478  .IsRequired();
479 
480  b.Property<long?>("CreatedById");
481 
482  b.Property<bool?>("Enabled")
483  .IsRequired();
484 
485  b.Property<decimal>("InstanceManagerRights")
486  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
487 
488  b.Property<DateTimeOffset?>("LastPasswordUpdate");
489 
490  b.Property<string>("Name")
491  .IsRequired();
492 
493  b.Property<string>("PasswordHash");
494 
495  b.Property<string>("SystemIdentifier");
496 
497  b.HasKey("Id");
498 
499  b.HasIndex("CanonicalName")
500  .IsUnique();
501 
502  b.HasIndex("CreatedById");
503 
504  b.ToTable("Users");
505  });
506 
507  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
508  {
509  b.Property<long>("Id")
510  .ValueGeneratedOnAdd()
511  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
512 
513  b.Property<long?>("AlphaId");
514 
515  b.Property<bool>("AlphaIsActive");
516 
517  b.Property<long?>("BravoId");
518 
519  b.Property<long>("InstanceId");
520 
521  b.HasKey("Id");
522 
523  b.HasIndex("AlphaId");
524 
525  b.HasIndex("BravoId");
526 
527  b.HasIndex("InstanceId")
528  .IsUnique();
529 
530  b.ToTable("WatchdogReattachInformations");
531  });
532 
533  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
534  {
535  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
536  .WithMany("ChatSettings")
537  .HasForeignKey("InstanceId")
538  .OnDelete(DeleteBehavior.Cascade);
539  });
540 
541  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
542  {
543  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
544  .WithMany("Channels")
545  .HasForeignKey("ChatSettingsId")
546  .OnDelete(DeleteBehavior.Cascade);
547  });
548 
549  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
550  {
551  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
552  .WithOne()
553  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
554  .OnDelete(DeleteBehavior.Restrict);
555 
556  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
557  .WithMany("CompileJobs")
558  .HasForeignKey("RevisionInformationId")
559  .OnDelete(DeleteBehavior.Cascade);
560  });
561 
562  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
563  {
564  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
565  .WithOne("DreamDaemonSettings")
566  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
567  .OnDelete(DeleteBehavior.Cascade);
568  });
569 
570  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
571  {
572  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
573  .WithOne("DreamMakerSettings")
574  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
575  .OnDelete(DeleteBehavior.Cascade);
576  });
577 
578  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
579  {
580  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
581  .WithMany("InstanceUsers")
582  .HasForeignKey("InstanceId")
583  .OnDelete(DeleteBehavior.Cascade);
584 
585  b.HasOne("Tgstation.Server.Host.Models.User")
586  .WithMany("InstanceUsers")
587  .HasForeignKey("UserId")
588  .OnDelete(DeleteBehavior.Cascade);
589  });
590 
591  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
592  {
593  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
594  .WithMany()
595  .HasForeignKey("CancelledById");
596 
597  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
598  .WithMany("Jobs")
599  .HasForeignKey("InstanceId")
600  .OnDelete(DeleteBehavior.Cascade);
601 
602  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
603  .WithMany()
604  .HasForeignKey("StartedById")
605  .OnDelete(DeleteBehavior.Cascade);
606  });
607 
608  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
609  {
610  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
611  .WithMany()
612  .HasForeignKey("CompileJobId")
613  .OnDelete(DeleteBehavior.Cascade);
614  });
615 
616  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
617  {
618  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
619  .WithOne("RepositorySettings")
620  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
621  .OnDelete(DeleteBehavior.Cascade);
622  });
623 
624  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
625  {
626  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
627  .WithMany("ActiveTestMerges")
628  .HasForeignKey("RevisionInformationId")
629  .OnDelete(DeleteBehavior.Cascade);
630 
631  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
632  .WithMany("RevisonInformations")
633  .HasForeignKey("TestMergeId")
634  .OnDelete(DeleteBehavior.Cascade);
635  });
636 
637  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
638  {
639  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
640  .WithMany("RevisionInformations")
641  .HasForeignKey("InstanceId")
642  .OnDelete(DeleteBehavior.Cascade);
643  });
644 
645  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
646  {
647  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
648  .WithMany("TestMerges")
649  .HasForeignKey("MergedById")
650  .OnDelete(DeleteBehavior.Restrict);
651 
652  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
653  .WithOne("PrimaryTestMerge")
654  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
655  .OnDelete(DeleteBehavior.Restrict);
656  });
657 
658  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
659  {
660  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
661  .WithMany("CreatedUsers")
662  .HasForeignKey("CreatedById");
663  });
664 
665  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
666  {
667  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
668  .WithMany()
669  .HasForeignKey("AlphaId");
670 
671  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
672  .WithMany()
673  .HasForeignKey("BravoId");
674 
675  b.HasOne("Tgstation.Server.Host.Models.Instance")
676  .WithOne("WatchdogReattachInformation")
677  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
678  .OnDelete(DeleteBehavior.Cascade);
679  });
680 #pragma warning restore 612, 618
681  }
+
+
+ +

◆ Down()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments.Down (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Unapplies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 31 of file 20181124231534_MSToggleTestmergeComments.cs.

+
32  {
33  if (migrationBuilder == null)
34  throw new ArgumentNullException(nameof(migrationBuilder));
35 
36  migrationBuilder.DropColumn(
37  name: "PostTestMergeComment",
38  table: "RepositorySettings");
39  }
+
+
+ +

◆ Up()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments.Up (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Applies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 15 of file 20181124231534_MSToggleTestmergeComments.cs.

+
16  {
17  if (migrationBuilder == null)
18  throw new ArgumentNullException(nameof(migrationBuilder));
19 
20  migrationBuilder.AddColumn<bool>(
21  name: "PostTestMergeComment",
22  table: "RepositorySettings",
23  nullable: false,
24  defaultValue: true);
25  }
+
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.png new file mode 100644 index 0000000000000000000000000000000000000000..9cfce5aa3989100d2da5d584f669d1eebe217e86 GIT binary patch literal 1107 zcmeAS@N?(olHy`uVBq!ia0y~yU|a-b2XHV0$($dJzk!rQfKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+1M?$K7srqa#I{ zEEPEpm;z~<;`6~%g1j8PG%H(K1Q>p(h%oL@L&n-(zwHlf`Sko(?wU>WSqvUUuy1(# z!@B%>|LU*5-&F=|X1^O%{p0ZT_tWYoDm7TXf1deamnus`muJ^4!S`!x*J|X8EZ8!0 z(ZdJZKc_95{^5D>o5`z17=3;!_^%gTJMsPPY~%cY)@FC@mf!w*TU z{`;!-`sv2lOB$I)bJ+9R)8*dgRQ>(*_0mt9d5LC=`RoI*j4s-SL_tEkCtnVUE6Dm7oAs*ll}BfWU6Y>cY}z)MZL zKcDE$$`KQ;o4uT+cK5#JxqN4Bcj;~_owJv7#R=5|Ax)pBuez?)e@^pR*4p|_Tuau4 ze0{L^zSyqJEsNhyIh^lgS6rZHD3^Nd#);h@ZriA4M9IFH_ha9Mo1eK0l=sOOMlWQr zd+HsywJRr+>BIT&%I{uV9!Re-T=h=m>156VexQojJ&bnGs{?zvWE~hDGzG9cn1zf( i1HCj^HJ3h_Vt;yF + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity, including all inherited members.

+ + + + +
BuildTargetModel(ModelBuilder modelBuilder)Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurityprotected
Down(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurityprotected
Up(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurityprotected
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html new file mode 100644 index 0000000000..a1172a7912 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html @@ -0,0 +1,228 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity Class Reference
+
+
+ +

Add the Api.Models.Internal.CompileJob.MinimumSecurityLevel and DreamMaker.ApiValidationSecurityLevel columns for MySQL/MariaDB + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity:
+
+
+ + +Migration + +
+ + + + + + + + + + + +

+Protected Member Functions

override void Up (MigrationBuilder migrationBuilder)
 Applies the migration More...
 
override void Down (MigrationBuilder migrationBuilder)
 Unapplies the migration More...
 
override void BuildTargetModel (ModelBuilder modelBuilder)
 Builds the target model More...
 
+

Detailed Description

+

Add the Api.Models.Internal.CompileJob.MinimumSecurityLevel and DreamMaker.ApiValidationSecurityLevel columns for MySQL/MariaDB

+ +

Definition at line 10 of file 20180918020726_MYAddMinimumSecurity.cs.

+

Member Function Documentation

+ +

◆ BuildTargetModel()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.BuildTargetModel (ModelBuilder modelBuilder)
+
+protected
+
+ +

Builds the target model

+
Parameters
+ + +
modelBuilderThe ModelBuilder to use
+
+
+ +

Definition at line 17 of file 20180918020726_MYAddMinimumSecurity.Designer.cs.

+
18  {
19 #pragma warning disable 612, 618
20  modelBuilder
21  .HasAnnotation("ProductVersion", "2.1.3-rtm-32065")
22  .HasAnnotation("Relational:MaxIdentifierLength", 64);
23 
24  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
25  {
26  b.Property<long>("Id")
27  .ValueGeneratedOnAdd();
28 
29  b.Property<string>("ConnectionString")
30  .IsRequired();
31 
32  b.Property<bool?>("Enabled");
33 
34  b.Property<long>("InstanceId");
35 
36  b.Property<string>("Name")
37  .IsRequired();
38 
39  b.Property<int?>("Provider");
40 
41  b.HasKey("Id");
42 
43  b.HasIndex("InstanceId");
44 
45  b.HasIndex("Name")
46  .IsUnique();
47 
48  b.ToTable("ChatBots");
49  });
50 
51  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
52  {
53  b.Property<long>("Id")
54  .ValueGeneratedOnAdd();
55 
56  b.Property<long>("ChatSettingsId");
57 
58  b.Property<ulong?>("DiscordChannelId");
59 
60  b.Property<string>("IrcChannel");
61 
62  b.Property<bool?>("IsAdminChannel")
63  .IsRequired();
64 
65  b.Property<bool?>("IsUpdatesChannel")
66  .IsRequired();
67 
68  b.Property<bool?>("IsWatchdogChannel")
69  .IsRequired();
70 
71  b.Property<string>("Tag");
72 
73  b.HasKey("Id");
74 
75  b.HasIndex("ChatSettingsId", "DiscordChannelId")
76  .IsUnique();
77 
78  b.HasIndex("ChatSettingsId", "IrcChannel")
79  .IsUnique();
80 
81  b.ToTable("ChatChannels");
82  });
83 
84  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
85  {
86  b.Property<long>("Id")
87  .ValueGeneratedOnAdd();
88 
89  b.Property<string>("ByondVersion")
90  .IsRequired();
91 
92  b.Property<Guid?>("DirectoryName");
93 
94  b.Property<string>("DmeName");
95 
96  b.Property<long?>("JobId");
97 
98  b.Property<int>("MinimumSecurityLevel");
99 
100  b.Property<string>("Output");
101 
102  b.Property<long>("RevisionInformationId");
103 
104  b.HasKey("Id");
105 
106  b.HasIndex("DirectoryName");
107 
108  b.HasIndex("JobId");
109 
110  b.HasIndex("RevisionInformationId");
111 
112  b.ToTable("CompileJobs");
113  });
114 
115  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
116  {
117  b.Property<long>("Id")
118  .ValueGeneratedOnAdd();
119 
120  b.Property<string>("AccessToken");
121 
122  b.Property<bool?>("AllowWebClient")
123  .IsRequired();
124 
125  b.Property<bool?>("AutoStart")
126  .IsRequired();
127 
128  b.Property<long>("InstanceId");
129 
130  b.Property<ushort?>("PrimaryPort")
131  .IsRequired();
132 
133  b.Property<int?>("ProcessId");
134 
135  b.Property<ushort?>("SecondaryPort")
136  .IsRequired();
137 
138  b.Property<int>("SecurityLevel");
139 
140  b.Property<bool?>("SoftRestart")
141  .IsRequired();
142 
143  b.Property<bool?>("SoftShutdown")
144  .IsRequired();
145 
146  b.Property<uint?>("StartupTimeout")
147  .IsRequired();
148 
149  b.HasKey("Id");
150 
151  b.HasIndex("InstanceId")
152  .IsUnique();
153 
154  b.ToTable("DreamDaemonSettings");
155  });
156 
157  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
158  {
159  b.Property<long>("Id")
160  .ValueGeneratedOnAdd();
161 
162  b.Property<ushort?>("ApiValidationPort")
163  .IsRequired();
164 
165  b.Property<int>("ApiValidationSecurityLevel");
166 
167  b.Property<long>("InstanceId");
168 
169  b.Property<string>("ProjectName");
170 
171  b.HasKey("Id");
172 
173  b.HasIndex("InstanceId")
174  .IsUnique();
175 
176  b.ToTable("DreamMakerSettings");
177  });
178 
179  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
180  {
181  b.Property<long>("Id")
182  .ValueGeneratedOnAdd();
183 
184  b.Property<uint?>("AutoUpdateInterval")
185  .IsRequired();
186 
187  b.Property<int>("ConfigurationType");
188 
189  b.Property<string>("Name")
190  .IsRequired();
191 
192  b.Property<bool?>("Online")
193  .IsRequired();
194 
195  b.Property<string>("Path")
196  .IsRequired();
197 
198  b.Property<long?>("WatchdogReattachInformationId");
199 
200  b.HasKey("Id");
201 
202  b.HasIndex("Path")
203  .IsUnique();
204 
205  b.HasIndex("WatchdogReattachInformationId");
206 
207  b.ToTable("Instances");
208  });
209 
210  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
211  {
212  b.Property<long>("Id")
213  .ValueGeneratedOnAdd();
214 
215  b.Property<ulong>("ByondRights");
216 
217  b.Property<ulong>("ChatBotRights");
218 
219  b.Property<ulong>("ConfigurationRights");
220 
221  b.Property<ulong>("DreamDaemonRights");
222 
223  b.Property<ulong>("DreamMakerRights");
224 
225  b.Property<long>("InstanceId");
226 
227  b.Property<ulong>("InstanceUserRights");
228 
229  b.Property<ulong>("RepositoryRights");
230 
231  b.Property<long?>("UserId")
232  .IsRequired();
233 
234  b.HasKey("Id");
235 
236  b.HasIndex("InstanceId");
237 
238  b.HasIndex("UserId", "InstanceId")
239  .IsUnique();
240 
241  b.ToTable("InstanceUsers");
242  });
243 
244  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
245  {
246  b.Property<long>("Id")
247  .ValueGeneratedOnAdd();
248 
249  b.Property<ulong?>("CancelRight");
250 
251  b.Property<ulong?>("CancelRightsType");
252 
253  b.Property<bool?>("Cancelled")
254  .IsRequired();
255 
256  b.Property<long?>("CancelledById");
257 
258  b.Property<string>("Description")
259  .IsRequired();
260 
261  b.Property<string>("ExceptionDetails");
262 
263  b.Property<long>("InstanceId");
264 
265  b.Property<DateTimeOffset?>("StartedAt")
266  .IsRequired();
267 
268  b.Property<long>("StartedById");
269 
270  b.Property<DateTimeOffset?>("StoppedAt");
271 
272  b.HasKey("Id");
273 
274  b.HasIndex("CancelledById");
275 
276  b.HasIndex("InstanceId");
277 
278  b.HasIndex("StartedById");
279 
280  b.ToTable("Jobs");
281  });
282 
283  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
284  {
285  b.Property<long>("Id")
286  .ValueGeneratedOnAdd();
287 
288  b.Property<string>("AccessIdentifier")
289  .IsRequired();
290 
291  b.Property<string>("ChatChannelsJson")
292  .IsRequired();
293 
294  b.Property<string>("ChatCommandsJson")
295  .IsRequired();
296 
297  b.Property<long?>("CompileJobId");
298 
299  b.Property<bool>("IsPrimary");
300 
301  b.Property<ushort>("Port");
302 
303  b.Property<int>("ProcessId");
304 
305  b.Property<int>("RebootState");
306 
307  b.Property<string>("ServerCommandsJson")
308  .IsRequired();
309 
310  b.HasKey("Id");
311 
312  b.HasIndex("CompileJobId");
313 
314  b.ToTable("ReattachInformations");
315  });
316 
317  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
318  {
319  b.Property<long>("Id")
320  .ValueGeneratedOnAdd();
321 
322  b.Property<string>("AccessToken");
323 
324  b.Property<string>("AccessUser");
325 
326  b.Property<bool?>("AutoUpdatesKeepTestMerges")
327  .IsRequired();
328 
329  b.Property<bool?>("AutoUpdatesSynchronize")
330  .IsRequired();
331 
332  b.Property<string>("CommitterEmail")
333  .IsRequired();
334 
335  b.Property<string>("CommitterName")
336  .IsRequired();
337 
338  b.Property<long>("InstanceId");
339 
340  b.Property<bool?>("PushTestMergeCommits")
341  .IsRequired();
342 
343  b.Property<bool?>("ShowTestMergeCommitters")
344  .IsRequired();
345 
346  b.HasKey("Id");
347 
348  b.HasIndex("InstanceId")
349  .IsUnique();
350 
351  b.ToTable("RepositorySettings");
352  });
353 
354  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
355  {
356  b.Property<long>("Id")
357  .ValueGeneratedOnAdd();
358 
359  b.Property<long>("RevisionInformationId");
360 
361  b.Property<long>("TestMergeId");
362 
363  b.HasKey("Id");
364 
365  b.HasIndex("RevisionInformationId");
366 
367  b.HasIndex("TestMergeId");
368 
369  b.ToTable("RevInfoTestMerges");
370  });
371 
372  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
373  {
374  b.Property<long>("Id")
375  .ValueGeneratedOnAdd();
376 
377  b.Property<string>("CommitSha")
378  .IsRequired()
379  .HasMaxLength(40);
380 
381  b.Property<long>("InstanceId");
382 
383  b.Property<string>("OriginCommitSha")
384  .IsRequired()
385  .HasMaxLength(40);
386 
387  b.HasKey("Id");
388 
389  b.HasIndex("CommitSha")
390  .IsUnique();
391 
392  b.HasIndex("InstanceId");
393 
394  b.ToTable("RevisionInformations");
395  });
396 
397  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
398  {
399  b.Property<long>("Id")
400  .ValueGeneratedOnAdd();
401 
402  b.Property<string>("Author")
403  .IsRequired();
404 
405  b.Property<string>("BodyAtMerge")
406  .IsRequired();
407 
408  b.Property<string>("Comment");
409 
410  b.Property<DateTimeOffset>("MergedAt");
411 
412  b.Property<long>("MergedById");
413 
414  b.Property<int?>("Number")
415  .IsRequired();
416 
417  b.Property<long?>("PrimaryRevisionInformationId");
418 
419  b.Property<string>("PullRequestRevision")
420  .IsRequired();
421 
422  b.Property<string>("TitleAtMerge")
423  .IsRequired();
424 
425  b.Property<string>("Url")
426  .IsRequired();
427 
428  b.HasKey("Id");
429 
430  b.HasIndex("MergedById");
431 
432  b.HasIndex("PrimaryRevisionInformationId")
433  .IsUnique();
434 
435  b.ToTable("TestMerges");
436  });
437 
438  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
439  {
440  b.Property<long>("Id")
441  .ValueGeneratedOnAdd();
442 
443  b.Property<ulong>("AdministrationRights");
444 
445  b.Property<string>("CanonicalName")
446  .IsRequired();
447 
448  b.Property<DateTimeOffset?>("CreatedAt")
449  .IsRequired();
450 
451  b.Property<long?>("CreatedById");
452 
453  b.Property<bool?>("Enabled")
454  .IsRequired();
455 
456  b.Property<ulong>("InstanceManagerRights");
457 
458  b.Property<DateTimeOffset?>("LastPasswordUpdate");
459 
460  b.Property<string>("Name")
461  .IsRequired();
462 
463  b.Property<string>("PasswordHash");
464 
465  b.Property<string>("SystemIdentifier");
466 
467  b.HasKey("Id");
468 
469  b.HasIndex("CanonicalName")
470  .IsUnique();
471 
472  b.HasIndex("CreatedById");
473 
474  b.ToTable("Users");
475  });
476 
477  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
478  {
479  b.Property<long>("Id")
480  .ValueGeneratedOnAdd();
481 
482  b.Property<long?>("AlphaId");
483 
484  b.Property<bool>("AlphaIsActive");
485 
486  b.Property<long?>("BravoId");
487 
488  b.HasKey("Id");
489 
490  b.HasIndex("AlphaId");
491 
492  b.HasIndex("BravoId");
493 
494  b.ToTable("WatchdogReattachInformations");
495  });
496 
497  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
498  {
499  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
500  .WithMany("ChatSettings")
501  .HasForeignKey("InstanceId")
502  .OnDelete(DeleteBehavior.Cascade);
503  });
504 
505  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
506  {
507  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
508  .WithMany("Channels")
509  .HasForeignKey("ChatSettingsId")
510  .OnDelete(DeleteBehavior.Cascade);
511  });
512 
513  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
514  {
515  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
516  .WithMany()
517  .HasForeignKey("JobId");
518 
519  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
520  .WithMany("CompileJobs")
521  .HasForeignKey("RevisionInformationId")
522  .OnDelete(DeleteBehavior.Cascade);
523  });
524 
525  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
526  {
527  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
528  .WithOne("DreamDaemonSettings")
529  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
530  .OnDelete(DeleteBehavior.Cascade);
531  });
532 
533  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
534  {
535  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
536  .WithOne("DreamMakerSettings")
537  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
538  .OnDelete(DeleteBehavior.Cascade);
539  });
540 
541  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
542  {
543  b.HasOne("Tgstation.Server.Host.Models.WatchdogReattachInformation", "WatchdogReattachInformation")
544  .WithMany()
545  .HasForeignKey("WatchdogReattachInformationId");
546  });
547 
548  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
549  {
550  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
551  .WithMany("InstanceUsers")
552  .HasForeignKey("InstanceId")
553  .OnDelete(DeleteBehavior.Cascade);
554 
555  b.HasOne("Tgstation.Server.Host.Models.User")
556  .WithMany("InstanceUsers")
557  .HasForeignKey("UserId")
558  .OnDelete(DeleteBehavior.Cascade);
559  });
560 
561  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
562  {
563  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
564  .WithMany()
565  .HasForeignKey("CancelledById");
566 
567  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
568  .WithMany("Jobs")
569  .HasForeignKey("InstanceId")
570  .OnDelete(DeleteBehavior.Cascade);
571 
572  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
573  .WithMany()
574  .HasForeignKey("StartedById")
575  .OnDelete(DeleteBehavior.Cascade);
576  });
577 
578  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
579  {
580  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
581  .WithMany()
582  .HasForeignKey("CompileJobId");
583  });
584 
585  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
586  {
587  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
588  .WithOne("RepositorySettings")
589  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
590  .OnDelete(DeleteBehavior.Cascade);
591  });
592 
593  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
594  {
595  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
596  .WithMany("ActiveTestMerges")
597  .HasForeignKey("RevisionInformationId")
598  .OnDelete(DeleteBehavior.Cascade);
599 
600  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
601  .WithMany("RevisonInformations")
602  .HasForeignKey("TestMergeId")
603  .OnDelete(DeleteBehavior.Cascade);
604  });
605 
606  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
607  {
608  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
609  .WithMany("RevisionInformations")
610  .HasForeignKey("InstanceId")
611  .OnDelete(DeleteBehavior.Cascade);
612  });
613 
614  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
615  {
616  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
617  .WithMany("TestMerges")
618  .HasForeignKey("MergedById")
619  .OnDelete(DeleteBehavior.Restrict);
620 
621  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
622  .WithOne("PrimaryTestMerge")
623  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
624  .OnDelete(DeleteBehavior.SetNull);
625  });
626 
627  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
628  {
629  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
630  .WithMany("CreatedUsers")
631  .HasForeignKey("CreatedById");
632  });
633 
634  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
635  {
636  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
637  .WithMany()
638  .HasForeignKey("AlphaId");
639 
640  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
641  .WithMany()
642  .HasForeignKey("BravoId");
643  });
644 #pragma warning restore 612, 618
645  }
+
+
+ +

◆ Down()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.Down (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Unapplies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 38 of file 20180918020726_MYAddMinimumSecurity.cs.

+
39  {
40  if (migrationBuilder == null)
41  throw new ArgumentNullException(nameof(migrationBuilder));
42 
43  migrationBuilder.DropColumn(
44  name: "ApiValidationSecurityLevel",
45  table: "DreamMakerSettings");
46 
47  migrationBuilder.DropColumn(
48  name: "MinimumSecurityLevel",
49  table: "CompileJobs");
50  }
+
+
+ +

◆ Up()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.Up (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Applies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 16 of file 20180918020726_MYAddMinimumSecurity.cs.

+
17  {
18  if (migrationBuilder == null)
19  throw new ArgumentNullException(nameof(migrationBuilder));
20 
21  migrationBuilder.AddColumn<int>(
22  name: "ApiValidationSecurityLevel",
23  table: "DreamMakerSettings",
24  nullable: false,
25  defaultValue: (int)DreamDaemonSecurity.Safe);
26 
27  migrationBuilder.AddColumn<int>(
28  name: "MinimumSecurityLevel",
29  table: "CompileJobs",
30  nullable: false,
31  defaultValue: (int)DreamDaemonSecurity.Safe);
32  }
DreamDaemonSecurity
DreamDaemon's security level
+
+
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.png new file mode 100644 index 0000000000000000000000000000000000000000..11b2206e8e46235cb66747c2dbaf1a80c5186b54 GIT binary patch literal 1056 zcmeAS@N?(olHy`uVBq!ia0y~yU~B}k12~w0Yi zwdeg)fx;`>i|k@t4(?*pyQTP`1Zd!|?wriG!h6$yZv6=2<p}JPa^jwe1-=b-T3ZC;^jdVQyb+Qr`TIzZFui3@+?X26Ru=Izq9+UpD zqqx$Od6LM<(++F5s%^a{#eCpW4WkN!;}XUOhkg5k7#(CX85AZ=ZwO%!aFb%_Q2op= z;0dHvco|$Ku`wulGBW_Z+~9GE!9fM6aFPiFh0-T~v3Y5#YA&6kpuxcDz=39Fk(9;x z)CE(&eJ?dPD}B#m@JNDv!_y!2VZV>({i*(Hv*KoR;di@DVwVe+9Do0JMt^ip8t5ep6d_O4>qxPX7Bzx8!as`pWGRnaBHmitl3C()~$WXE#=^lz&-qx$gR} zZ~tTM?r2n(t^06{tuHZm;f1cu2X@C(R+bia?v}b2SJ|3qf28O0ogY3|HkAIijQu{1 zbGD!LF6one6&kyC&6t^e_D;~lq}dWL%ssf)-bwkr^U1T;{K~l|j}_V2@^;_SHCx@W=>TSD22WQ%mvv4FO#my? B*Zcqg literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_fix_rev_info_index-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_fix_rev_info_index-members.html new file mode 100644 index 0000000000..383d6667fd --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_fix_rev_info_index-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.Migrations.MYFixRevInfoIndex Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Models.Migrations.MYFixRevInfoIndex, including all inherited members.

+ + + + +
BuildTargetModel(ModelBuilder modelBuilder)Tgstation.Server.Host.Models.Migrations.MYFixRevInfoIndexprotected
Down(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MYFixRevInfoIndexprotected
Up(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MYFixRevInfoIndexprotected
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_fix_rev_info_index.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_fix_rev_info_index.html new file mode 100644 index 0000000000..bab0bdf138 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_fix_rev_info_index.html @@ -0,0 +1,227 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.Migrations.MYFixRevInfoIndex Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.Migrations.MYFixRevInfoIndex Class Reference
+
+
+ +

Make commit shas non-unique per Instance for MSSQL + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.Migrations.MYFixRevInfoIndex:
+
+
+ + +Migration + +
+ + + + + + + + + + + +

+Protected Member Functions

override void Up (MigrationBuilder migrationBuilder)
 Applies the migration More...
 
override void Down (MigrationBuilder migrationBuilder)
 Unapplies the migration More...
 
override void BuildTargetModel (ModelBuilder modelBuilder)
 Builds the target model More...
 
+

Detailed Description

+

Make commit shas non-unique per Instance for MSSQL

+ +

Definition at line 9 of file 20190219042440_MYFixRevInfoIndex.cs.

+

Member Function Documentation

+ +

◆ BuildTargetModel()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYFixRevInfoIndex.BuildTargetModel (ModelBuilder modelBuilder)
+
+protected
+
+ +

Builds the target model

+
Parameters
+ + +
modelBuilderThe ModelBuilder to use
+
+
+ +

Definition at line 17 of file 20190219042440_MYFixRevInfoIndex.Designer.cs.

+
18  {
19 #pragma warning disable 612, 618
20  modelBuilder
21  .HasAnnotation("ProductVersion", "2.1.4-rtm-31024")
22  .HasAnnotation("Relational:MaxIdentifierLength", 64);
23 
24  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
25  {
26  b.Property<long>("Id")
27  .ValueGeneratedOnAdd();
28 
29  b.Property<string>("ConnectionString")
30  .IsRequired();
31 
32  b.Property<bool?>("Enabled");
33 
34  b.Property<long>("InstanceId");
35 
36  b.Property<string>("Name")
37  .IsRequired();
38 
39  b.Property<int?>("Provider");
40 
41  b.HasKey("Id");
42 
43  b.HasIndex("InstanceId");
44 
45  b.HasIndex("Name")
46  .IsUnique();
47 
48  b.ToTable("ChatBots");
49  });
50 
51  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
52  {
53  b.Property<long>("Id")
54  .ValueGeneratedOnAdd();
55 
56  b.Property<long>("ChatSettingsId");
57 
58  b.Property<ulong?>("DiscordChannelId");
59 
60  b.Property<string>("IrcChannel");
61 
62  b.Property<bool?>("IsAdminChannel")
63  .IsRequired();
64 
65  b.Property<bool?>("IsUpdatesChannel")
66  .IsRequired();
67 
68  b.Property<bool?>("IsWatchdogChannel")
69  .IsRequired();
70 
71  b.Property<string>("Tag");
72 
73  b.HasKey("Id");
74 
75  b.HasIndex("ChatSettingsId", "DiscordChannelId")
76  .IsUnique();
77 
78  b.HasIndex("ChatSettingsId", "IrcChannel")
79  .IsUnique();
80 
81  b.ToTable("ChatChannels");
82  });
83 
84  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
85  {
86  b.Property<long>("Id")
87  .ValueGeneratedOnAdd();
88 
89  b.Property<string>("ByondVersion")
90  .IsRequired();
91 
92  b.Property<Guid?>("DirectoryName")
93  .IsRequired();
94 
95  b.Property<string>("DmeName")
96  .IsRequired();
97 
98  b.Property<long>("JobId");
99 
100  b.Property<int>("MinimumSecurityLevel");
101 
102  b.Property<string>("Output")
103  .IsRequired();
104 
105  b.Property<long>("RevisionInformationId");
106 
107  b.HasKey("Id");
108 
109  b.HasIndex("DirectoryName");
110 
111  b.HasIndex("JobId")
112  .IsUnique();
113 
114  b.HasIndex("RevisionInformationId");
115 
116  b.ToTable("CompileJobs");
117  });
118 
119  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
120  {
121  b.Property<long>("Id")
122  .ValueGeneratedOnAdd();
123 
124  b.Property<string>("AccessToken");
125 
126  b.Property<bool?>("AllowWebClient")
127  .IsRequired();
128 
129  b.Property<bool?>("AutoStart")
130  .IsRequired();
131 
132  b.Property<long>("InstanceId");
133 
134  b.Property<ushort?>("PrimaryPort")
135  .IsRequired();
136 
137  b.Property<int?>("ProcessId");
138 
139  b.Property<ushort?>("SecondaryPort")
140  .IsRequired();
141 
142  b.Property<int>("SecurityLevel");
143 
144  b.Property<bool?>("SoftRestart")
145  .IsRequired();
146 
147  b.Property<bool?>("SoftShutdown")
148  .IsRequired();
149 
150  b.Property<uint?>("StartupTimeout")
151  .IsRequired();
152 
153  b.HasKey("Id");
154 
155  b.HasIndex("InstanceId")
156  .IsUnique();
157 
158  b.ToTable("DreamDaemonSettings");
159  });
160 
161  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
162  {
163  b.Property<long>("Id")
164  .ValueGeneratedOnAdd();
165 
166  b.Property<ushort?>("ApiValidationPort")
167  .IsRequired();
168 
169  b.Property<int>("ApiValidationSecurityLevel");
170 
171  b.Property<long>("InstanceId");
172 
173  b.Property<string>("ProjectName");
174 
175  b.HasKey("Id");
176 
177  b.HasIndex("InstanceId")
178  .IsUnique();
179 
180  b.ToTable("DreamMakerSettings");
181  });
182 
183  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
184  {
185  b.Property<long>("Id")
186  .ValueGeneratedOnAdd();
187 
188  b.Property<uint?>("AutoUpdateInterval")
189  .IsRequired();
190 
191  b.Property<int>("ConfigurationType");
192 
193  b.Property<string>("Name")
194  .IsRequired();
195 
196  b.Property<bool?>("Online")
197  .IsRequired();
198 
199  b.Property<string>("Path")
200  .IsRequired();
201 
202  b.HasKey("Id");
203 
204  b.HasIndex("Path")
205  .IsUnique();
206 
207  b.ToTable("Instances");
208  });
209 
210  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
211  {
212  b.Property<long>("Id")
213  .ValueGeneratedOnAdd();
214 
215  b.Property<ulong>("ByondRights");
216 
217  b.Property<ulong>("ChatBotRights");
218 
219  b.Property<ulong>("ConfigurationRights");
220 
221  b.Property<ulong>("DreamDaemonRights");
222 
223  b.Property<ulong>("DreamMakerRights");
224 
225  b.Property<long>("InstanceId");
226 
227  b.Property<ulong>("InstanceUserRights");
228 
229  b.Property<ulong>("RepositoryRights");
230 
231  b.Property<long?>("UserId")
232  .IsRequired();
233 
234  b.HasKey("Id");
235 
236  b.HasIndex("InstanceId");
237 
238  b.HasIndex("UserId", "InstanceId")
239  .IsUnique();
240 
241  b.ToTable("InstanceUsers");
242  });
243 
244  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
245  {
246  b.Property<long>("Id")
247  .ValueGeneratedOnAdd();
248 
249  b.Property<ulong?>("CancelRight");
250 
251  b.Property<ulong?>("CancelRightsType");
252 
253  b.Property<bool?>("Cancelled")
254  .IsRequired();
255 
256  b.Property<long?>("CancelledById");
257 
258  b.Property<string>("Description")
259  .IsRequired();
260 
261  b.Property<string>("ExceptionDetails");
262 
263  b.Property<long>("InstanceId");
264 
265  b.Property<DateTimeOffset?>("StartedAt")
266  .IsRequired();
267 
268  b.Property<long>("StartedById");
269 
270  b.Property<DateTimeOffset?>("StoppedAt");
271 
272  b.HasKey("Id");
273 
274  b.HasIndex("CancelledById");
275 
276  b.HasIndex("InstanceId");
277 
278  b.HasIndex("StartedById");
279 
280  b.ToTable("Jobs");
281  });
282 
283  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
284  {
285  b.Property<long>("Id")
286  .ValueGeneratedOnAdd();
287 
288  b.Property<string>("AccessIdentifier")
289  .IsRequired();
290 
291  b.Property<string>("ChatChannelsJson")
292  .IsRequired();
293 
294  b.Property<string>("ChatCommandsJson")
295  .IsRequired();
296 
297  b.Property<long>("CompileJobId");
298 
299  b.Property<bool>("IsPrimary");
300 
301  b.Property<ushort>("Port");
302 
303  b.Property<int>("ProcessId");
304 
305  b.Property<int>("RebootState");
306 
307  b.Property<string>("ServerCommandsJson")
308  .IsRequired();
309 
310  b.HasKey("Id");
311 
312  b.HasIndex("CompileJobId");
313 
314  b.ToTable("ReattachInformations");
315  });
316 
317  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
318  {
319  b.Property<long>("Id")
320  .ValueGeneratedOnAdd();
321 
322  b.Property<string>("AccessToken");
323 
324  b.Property<string>("AccessUser");
325 
326  b.Property<bool?>("AutoUpdatesKeepTestMerges")
327  .IsRequired();
328 
329  b.Property<bool?>("AutoUpdatesSynchronize")
330  .IsRequired();
331 
332  b.Property<string>("CommitterEmail")
333  .IsRequired();
334 
335  b.Property<string>("CommitterName")
336  .IsRequired();
337 
338  b.Property<long>("InstanceId");
339 
340  b.Property<bool?>("PostTestMergeComment")
341  .IsRequired();
342 
343  b.Property<bool?>("PushTestMergeCommits")
344  .IsRequired();
345 
346  b.Property<bool?>("ShowTestMergeCommitters")
347  .IsRequired();
348 
349  b.HasKey("Id");
350 
351  b.HasIndex("InstanceId")
352  .IsUnique();
353 
354  b.ToTable("RepositorySettings");
355  });
356 
357  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
358  {
359  b.Property<long>("Id")
360  .ValueGeneratedOnAdd();
361 
362  b.Property<long>("RevisionInformationId");
363 
364  b.Property<long>("TestMergeId");
365 
366  b.HasKey("Id");
367 
368  b.HasIndex("RevisionInformationId");
369 
370  b.HasIndex("TestMergeId");
371 
372  b.ToTable("RevInfoTestMerges");
373  });
374 
375  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
376  {
377  b.Property<long>("Id")
378  .ValueGeneratedOnAdd();
379 
380  b.Property<string>("CommitSha")
381  .IsRequired()
382  .HasMaxLength(40);
383 
384  b.Property<long>("InstanceId");
385 
386  b.Property<string>("OriginCommitSha")
387  .IsRequired()
388  .HasMaxLength(40);
389 
390  b.HasKey("Id");
391 
392  b.HasIndex("InstanceId", "CommitSha")
393  .IsUnique();
394 
395  b.ToTable("RevisionInformations");
396  });
397 
398  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
399  {
400  b.Property<long>("Id")
401  .ValueGeneratedOnAdd();
402 
403  b.Property<string>("Author")
404  .IsRequired();
405 
406  b.Property<string>("BodyAtMerge")
407  .IsRequired();
408 
409  b.Property<string>("Comment");
410 
411  b.Property<DateTimeOffset>("MergedAt");
412 
413  b.Property<long>("MergedById");
414 
415  b.Property<int?>("Number")
416  .IsRequired();
417 
418  b.Property<long?>("PrimaryRevisionInformationId")
419  .IsRequired();
420 
421  b.Property<string>("PullRequestRevision")
422  .IsRequired();
423 
424  b.Property<string>("TitleAtMerge")
425  .IsRequired();
426 
427  b.Property<string>("Url")
428  .IsRequired();
429 
430  b.HasKey("Id");
431 
432  b.HasIndex("MergedById");
433 
434  b.HasIndex("PrimaryRevisionInformationId")
435  .IsUnique();
436 
437  b.ToTable("TestMerges");
438  });
439 
440  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
441  {
442  b.Property<long>("Id")
443  .ValueGeneratedOnAdd();
444 
445  b.Property<ulong>("AdministrationRights");
446 
447  b.Property<string>("CanonicalName")
448  .IsRequired();
449 
450  b.Property<DateTimeOffset?>("CreatedAt")
451  .IsRequired();
452 
453  b.Property<long?>("CreatedById");
454 
455  b.Property<bool?>("Enabled")
456  .IsRequired();
457 
458  b.Property<ulong>("InstanceManagerRights");
459 
460  b.Property<DateTimeOffset?>("LastPasswordUpdate");
461 
462  b.Property<string>("Name")
463  .IsRequired();
464 
465  b.Property<string>("PasswordHash");
466 
467  b.Property<string>("SystemIdentifier");
468 
469  b.HasKey("Id");
470 
471  b.HasIndex("CanonicalName")
472  .IsUnique();
473 
474  b.HasIndex("CreatedById");
475 
476  b.ToTable("Users");
477  });
478 
479  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
480  {
481  b.Property<long>("Id")
482  .ValueGeneratedOnAdd();
483 
484  b.Property<long?>("AlphaId");
485 
486  b.Property<bool>("AlphaIsActive");
487 
488  b.Property<long?>("BravoId");
489 
490  b.Property<long>("InstanceId");
491 
492  b.HasKey("Id");
493 
494  b.HasIndex("AlphaId");
495 
496  b.HasIndex("BravoId");
497 
498  b.HasIndex("InstanceId")
499  .IsUnique();
500 
501  b.ToTable("WatchdogReattachInformations");
502  });
503 
504  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
505  {
506  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
507  .WithMany("ChatSettings")
508  .HasForeignKey("InstanceId")
509  .OnDelete(DeleteBehavior.Cascade);
510  });
511 
512  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
513  {
514  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
515  .WithMany("Channels")
516  .HasForeignKey("ChatSettingsId")
517  .OnDelete(DeleteBehavior.Cascade);
518  });
519 
520  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
521  {
522  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
523  .WithOne()
524  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
525  .OnDelete(DeleteBehavior.Restrict);
526 
527  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
528  .WithMany("CompileJobs")
529  .HasForeignKey("RevisionInformationId")
530  .OnDelete(DeleteBehavior.Cascade);
531  });
532 
533  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
534  {
535  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
536  .WithOne("DreamDaemonSettings")
537  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
538  .OnDelete(DeleteBehavior.Cascade);
539  });
540 
541  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
542  {
543  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
544  .WithOne("DreamMakerSettings")
545  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
546  .OnDelete(DeleteBehavior.Cascade);
547  });
548 
549  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
550  {
551  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
552  .WithMany("InstanceUsers")
553  .HasForeignKey("InstanceId")
554  .OnDelete(DeleteBehavior.Cascade);
555 
556  b.HasOne("Tgstation.Server.Host.Models.User")
557  .WithMany("InstanceUsers")
558  .HasForeignKey("UserId")
559  .OnDelete(DeleteBehavior.Cascade);
560  });
561 
562  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
563  {
564  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
565  .WithMany()
566  .HasForeignKey("CancelledById");
567 
568  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
569  .WithMany("Jobs")
570  .HasForeignKey("InstanceId")
571  .OnDelete(DeleteBehavior.Cascade);
572 
573  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
574  .WithMany()
575  .HasForeignKey("StartedById")
576  .OnDelete(DeleteBehavior.Cascade);
577  });
578 
579  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
580  {
581  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
582  .WithMany()
583  .HasForeignKey("CompileJobId")
584  .OnDelete(DeleteBehavior.Cascade);
585  });
586 
587  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
588  {
589  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
590  .WithOne("RepositorySettings")
591  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
592  .OnDelete(DeleteBehavior.Cascade);
593  });
594 
595  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
596  {
597  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
598  .WithMany("ActiveTestMerges")
599  .HasForeignKey("RevisionInformationId")
600  .OnDelete(DeleteBehavior.Cascade);
601 
602  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
603  .WithMany("RevisonInformations")
604  .HasForeignKey("TestMergeId")
605  .OnDelete(DeleteBehavior.Cascade);
606  });
607 
608  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
609  {
610  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
611  .WithMany("RevisionInformations")
612  .HasForeignKey("InstanceId")
613  .OnDelete(DeleteBehavior.Cascade);
614  });
615 
616  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
617  {
618  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
619  .WithMany("TestMerges")
620  .HasForeignKey("MergedById")
621  .OnDelete(DeleteBehavior.Restrict);
622 
623  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
624  .WithOne("PrimaryTestMerge")
625  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
626  .OnDelete(DeleteBehavior.Restrict);
627  });
628 
629  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
630  {
631  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
632  .WithMany("CreatedUsers")
633  .HasForeignKey("CreatedById");
634  });
635 
636  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
637  {
638  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
639  .WithMany()
640  .HasForeignKey("AlphaId");
641 
642  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
643  .WithMany()
644  .HasForeignKey("BravoId");
645 
646  b.HasOne("Tgstation.Server.Host.Models.Instance")
647  .WithOne("WatchdogReattachInformation")
648  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
649  .OnDelete(DeleteBehavior.Cascade);
650  });
651 #pragma warning restore 612, 618
652  }
+
+
+ +

◆ Down()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYFixRevInfoIndex.Down (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Unapplies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 51 of file 20190219042440_MYFixRevInfoIndex.cs.

+
52  {
53  if (migrationBuilder == null)
54  throw new ArgumentNullException(nameof(migrationBuilder));
55 
56  migrationBuilder.DropForeignKey(
57  name: "FK_RevisionInformations_Instances_InstanceId",
58  table: "RevisionInformations");
59 
60  migrationBuilder.DropIndex(
61  name: "IX_RevisionInformations_InstanceId_CommitSha",
62  table: "RevisionInformations");
63 
64  migrationBuilder.CreateIndex(
65  name: "IX_RevisionInformations_CommitSha",
66  table: "RevisionInformations",
67  column: "CommitSha",
68  unique: true);
69 
70  migrationBuilder.CreateIndex(
71  name: "IX_RevisionInformations_InstanceId",
72  table: "RevisionInformations",
73  column: "InstanceId");
74 
75  migrationBuilder.AddForeignKey(
76  name: "FK_RevisionInformations_Instances_InstanceId",
77  table: "RevisionInformations",
78  column: "InstanceId",
79  principalTable: "Instances",
80  principalColumn: "Id",
81  onDelete: ReferentialAction.Cascade);
82  }
+
+
+ +

◆ Up()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYFixRevInfoIndex.Up (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Applies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 15 of file 20190219042440_MYFixRevInfoIndex.cs.

+
16  {
17  if (migrationBuilder == null)
18  throw new ArgumentNullException(nameof(migrationBuilder));
19 
20  migrationBuilder.DropForeignKey(
21  name: "FK_RevisionInformations_Instances_InstanceId",
22  table: "RevisionInformations");
23 
24  migrationBuilder.DropIndex(
25  name: "IX_RevisionInformations_CommitSha",
26  table: "RevisionInformations");
27 
28  migrationBuilder.DropIndex(
29  name: "IX_RevisionInformations_InstanceId",
30  table: "RevisionInformations");
31 
32  migrationBuilder.CreateIndex(
33  name: "IX_RevisionInformations_InstanceId_CommitSha",
34  table: "RevisionInformations",
35  columns: new[] { "InstanceId", "CommitSha" },
36  unique: true);
37 
38  migrationBuilder.AddForeignKey(
39  name: "FK_RevisionInformations_Instances_InstanceId",
40  table: "RevisionInformations",
41  column: "InstanceId",
42  principalTable: "Instances",
43  principalColumn: "Id",
44  onDelete: ReferentialAction.Cascade);
45  }
+
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_fix_rev_info_index.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_fix_rev_info_index.png new file mode 100644 index 0000000000000000000000000000000000000000..508131c5a7eeec94319558a1c97d03f398ce0200 GIT binary patch literal 1003 zcmeAS@N?(olHy`uVBq!ia0y~yU`zqB12~w0q-5lOSs*15;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|z+C0&;uuoF_;&8=zBLL0Y~B4S_y14q zf822)=FUyq+ns820~Q~4oh3AT|C2ez6N=B(O;FXGprY@zNySollIqEs6LdV!wWN3! zJ=-@ac<;1mPv1y0k4tNJY<#l);A16ES$@MmA}81He!DCF8}FX*X|wh|E~}4!S?(tu z`f9h#y8d5LUXOEi?L9tu`kpve;W2H={Ef3;$L@2@lT=dizErOSI)SPre`NIBDMT$(LGH zY$w57r>5dP$rxzRoSQ1o!QRMYu<6lnU^vh}f#<>L>){b>1*$5{KQ>wNoo1NVlEP5# zWY}P=D0yHeP};|Xtw2qM*+O^{;~dVD3_#y9q&pc=D$PG-PLP+Qm*!7LCJu%@9BAe$ z?UZSD(Ea+p%)DOmu|k97aT|x|zW+;ana%!r{8eed>b9RBuAklbtN6x|Hr~bC)+Nn* z_hfbYx}t{S$^rU+HI!AbH1L< zex>@Jzu}6A&{h*!pCi2;R!4Ri?mlMoiRba#m1gxU0 zEQ;_jJDD|O=gb8c=QQ*w{xf^u8|W_UlVZ{PRC#`NPx&$VuK^KP6LvuLL0I$@LIImyo^-In40ppYk5sK3+x3d6gz z%t~@)ML%sA<{kX2JZ~v?1H*%U^tkmc^3r70T>9jgecxrD(Ce!Y+yUlH22WQ%mvv4F FO#s-6)7k(4 literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create-members.html new file mode 100644 index 0000000000..780e46e8b3 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.Migrations.MYInitialCreate Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Models.Migrations.MYInitialCreate, including all inherited members.

+ + + + +
BuildTargetModel(ModelBuilder modelBuilder)Tgstation.Server.Host.Models.Migrations.MYInitialCreateprotected
Down(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MYInitialCreateprotected
Up(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MYInitialCreateprotected
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html new file mode 100644 index 0000000000..7e8958afcd --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html @@ -0,0 +1,240 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.Migrations.MYInitialCreate Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.Migrations.MYInitialCreate Class Reference
+
+
+ +

The initial database migration for MySQL/MariaDB + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.Migrations.MYInitialCreate:
+
+
+ + +Migration + +
+ + + + + + + + + + + +

+Protected Member Functions

override void Up (MigrationBuilder migrationBuilder)
 Applies the migration More...
 
override void Down (MigrationBuilder migrationBuilder)
 Unapplies the migration More...
 
override void BuildTargetModel (ModelBuilder modelBuilder)
 Builds the target model More...
 
+

Detailed Description

+

The initial database migration for MySQL/MariaDB

+ +

Definition at line 11 of file 20180906143029_MYInitialCreate.cs.

+

Member Function Documentation

+ +

◆ BuildTargetModel()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYInitialCreate.BuildTargetModel (ModelBuilder modelBuilder)
+
+protected
+
+ +

Builds the target model

+
Parameters
+ + +
modelBuilderThe ModelBuilder to use
+
+
+ +

Definition at line 17 of file 20180906143029_MYInitialCreate.Designer.cs.

+
18  {
19 #pragma warning disable 612, 618
20  modelBuilder
21  .HasAnnotation("ProductVersion", "2.1.2-rtm-30932")
22  .HasAnnotation("Relational:MaxIdentifierLength", 64);
23 
24  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
25  {
26  b.Property<long>("Id")
27  .ValueGeneratedOnAdd();
28 
29  b.Property<string>("ConnectionString")
30  .IsRequired();
31 
32  b.Property<bool?>("Enabled");
33 
34  b.Property<long>("InstanceId");
35 
36  b.Property<string>("Name")
37  .IsRequired();
38 
39  b.Property<int?>("Provider");
40 
41  b.HasKey("Id");
42 
43  b.HasIndex("InstanceId");
44 
45  b.HasIndex("Name")
46  .IsUnique();
47 
48  b.ToTable("ChatBots");
49  });
50 
51  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
52  {
53  b.Property<long>("Id")
54  .ValueGeneratedOnAdd();
55 
56  b.Property<long>("ChatSettingsId");
57 
58  b.Property<ulong?>("DiscordChannelId");
59 
60  b.Property<string>("IrcChannel");
61 
62  b.Property<bool?>("IsAdminChannel")
63  .IsRequired();
64 
65  b.Property<bool?>("IsUpdatesChannel")
66  .IsRequired();
67 
68  b.Property<bool?>("IsWatchdogChannel")
69  .IsRequired();
70 
71  b.Property<string>("Tag");
72 
73  b.HasKey("Id");
74 
75  b.HasIndex("ChatSettingsId", "DiscordChannelId")
76  .IsUnique();
77 
78  b.HasIndex("ChatSettingsId", "IrcChannel")
79  .IsUnique();
80 
81  b.ToTable("ChatChannels");
82  });
83 
84  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
85  {
86  b.Property<long>("Id")
87  .ValueGeneratedOnAdd();
88 
89  b.Property<string>("ByondVersion")
90  .IsRequired();
91 
92  b.Property<Guid?>("DirectoryName");
93 
94  b.Property<string>("DmeName");
95 
96  b.Property<long?>("JobId");
97 
98  b.Property<string>("Output");
99 
100  b.Property<long>("RevisionInformationId");
101 
102  b.HasKey("Id");
103 
104  b.HasIndex("DirectoryName");
105 
106  b.HasIndex("JobId");
107 
108  b.HasIndex("RevisionInformationId");
109 
110  b.ToTable("CompileJobs");
111  });
112 
113  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
114  {
115  b.Property<long>("Id")
116  .ValueGeneratedOnAdd();
117 
118  b.Property<string>("AccessToken");
119 
120  b.Property<bool?>("AllowWebClient")
121  .IsRequired();
122 
123  b.Property<bool?>("AutoStart")
124  .IsRequired();
125 
126  b.Property<long>("InstanceId");
127 
128  b.Property<ushort?>("PrimaryPort")
129  .IsRequired();
130 
131  b.Property<int?>("ProcessId");
132 
133  b.Property<ushort?>("SecondaryPort")
134  .IsRequired();
135 
136  b.Property<int>("SecurityLevel");
137 
138  b.Property<bool?>("SoftRestart")
139  .IsRequired();
140 
141  b.Property<bool?>("SoftShutdown")
142  .IsRequired();
143 
144  b.Property<uint?>("StartupTimeout")
145  .IsRequired();
146 
147  b.HasKey("Id");
148 
149  b.HasIndex("InstanceId")
150  .IsUnique();
151 
152  b.ToTable("DreamDaemonSettings");
153  });
154 
155  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
156  {
157  b.Property<long>("Id")
158  .ValueGeneratedOnAdd();
159 
160  b.Property<ushort?>("ApiValidationPort")
161  .IsRequired();
162 
163  b.Property<long>("InstanceId");
164 
165  b.Property<string>("ProjectName");
166 
167  b.HasKey("Id");
168 
169  b.HasIndex("InstanceId")
170  .IsUnique();
171 
172  b.ToTable("DreamMakerSettings");
173  });
174 
175  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
176  {
177  b.Property<long>("Id")
178  .ValueGeneratedOnAdd();
179 
180  b.Property<uint?>("AutoUpdateInterval")
181  .IsRequired();
182 
183  b.Property<int>("ConfigurationType");
184 
185  b.Property<string>("Name")
186  .IsRequired();
187 
188  b.Property<bool?>("Online")
189  .IsRequired();
190 
191  b.Property<string>("Path")
192  .IsRequired();
193 
194  b.Property<long?>("WatchdogReattachInformationId");
195 
196  b.HasKey("Id");
197 
198  b.HasIndex("Path")
199  .IsUnique();
200 
201  b.HasIndex("WatchdogReattachInformationId");
202 
203  b.ToTable("Instances");
204  });
205 
206  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
207  {
208  b.Property<long>("Id")
209  .ValueGeneratedOnAdd();
210 
211  b.Property<ulong>("ByondRights");
212 
213  b.Property<ulong>("ChatBotRights");
214 
215  b.Property<ulong>("ConfigurationRights");
216 
217  b.Property<ulong>("DreamDaemonRights");
218 
219  b.Property<ulong>("DreamMakerRights");
220 
221  b.Property<long>("InstanceId");
222 
223  b.Property<ulong>("InstanceUserRights");
224 
225  b.Property<ulong>("RepositoryRights");
226 
227  b.Property<long?>("UserId")
228  .IsRequired();
229 
230  b.HasKey("Id");
231 
232  b.HasIndex("InstanceId");
233 
234  b.HasIndex("UserId", "InstanceId")
235  .IsUnique();
236 
237  b.ToTable("InstanceUsers");
238  });
239 
240  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
241  {
242  b.Property<long>("Id")
243  .ValueGeneratedOnAdd();
244 
245  b.Property<ulong?>("CancelRight");
246 
247  b.Property<ulong?>("CancelRightsType");
248 
249  b.Property<bool?>("Cancelled")
250  .IsRequired();
251 
252  b.Property<long?>("CancelledById");
253 
254  b.Property<string>("Description")
255  .IsRequired();
256 
257  b.Property<string>("ExceptionDetails");
258 
259  b.Property<long>("InstanceId");
260 
261  b.Property<DateTimeOffset?>("StartedAt")
262  .IsRequired();
263 
264  b.Property<long>("StartedById");
265 
266  b.Property<DateTimeOffset?>("StoppedAt");
267 
268  b.HasKey("Id");
269 
270  b.HasIndex("CancelledById");
271 
272  b.HasIndex("InstanceId");
273 
274  b.HasIndex("StartedById");
275 
276  b.ToTable("Jobs");
277  });
278 
279  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
280  {
281  b.Property<long>("Id")
282  .ValueGeneratedOnAdd();
283 
284  b.Property<string>("AccessIdentifier")
285  .IsRequired();
286 
287  b.Property<string>("ChatChannelsJson")
288  .IsRequired();
289 
290  b.Property<string>("ChatCommandsJson")
291  .IsRequired();
292 
293  b.Property<long?>("CompileJobId");
294 
295  b.Property<bool>("IsPrimary");
296 
297  b.Property<ushort>("Port");
298 
299  b.Property<int>("ProcessId");
300 
301  b.Property<int>("RebootState");
302 
303  b.Property<string>("ServerCommandsJson")
304  .IsRequired();
305 
306  b.HasKey("Id");
307 
308  b.HasIndex("CompileJobId");
309 
310  b.ToTable("ReattachInformations");
311  });
312 
313  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
314  {
315  b.Property<long>("Id")
316  .ValueGeneratedOnAdd();
317 
318  b.Property<string>("AccessToken");
319 
320  b.Property<string>("AccessUser");
321 
322  b.Property<bool?>("AutoUpdatesKeepTestMerges")
323  .IsRequired();
324 
325  b.Property<bool?>("AutoUpdatesSynchronize")
326  .IsRequired();
327 
328  b.Property<string>("CommitterEmail")
329  .IsRequired();
330 
331  b.Property<string>("CommitterName")
332  .IsRequired();
333 
334  b.Property<long>("InstanceId");
335 
336  b.Property<bool?>("PushTestMergeCommits")
337  .IsRequired();
338 
339  b.Property<bool?>("ShowTestMergeCommitters")
340  .IsRequired();
341 
342  b.HasKey("Id");
343 
344  b.HasIndex("InstanceId")
345  .IsUnique();
346 
347  b.ToTable("RepositorySettings");
348  });
349 
350  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
351  {
352  b.Property<long>("Id")
353  .ValueGeneratedOnAdd();
354 
355  b.Property<long>("RevisionInformationId");
356 
357  b.Property<long>("TestMergeId");
358 
359  b.HasKey("Id");
360 
361  b.HasIndex("RevisionInformationId");
362 
363  b.HasIndex("TestMergeId");
364 
365  b.ToTable("RevInfoTestMerges");
366  });
367 
368  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
369  {
370  b.Property<long>("Id")
371  .ValueGeneratedOnAdd();
372 
373  b.Property<string>("CommitSha")
374  .IsRequired()
375  .HasMaxLength(40);
376 
377  b.Property<long>("InstanceId");
378 
379  b.Property<string>("OriginCommitSha")
380  .IsRequired()
381  .HasMaxLength(40);
382 
383  b.HasKey("Id");
384 
385  b.HasIndex("CommitSha")
386  .IsUnique();
387 
388  b.HasIndex("InstanceId");
389 
390  b.ToTable("RevisionInformations");
391  });
392 
393  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
394  {
395  b.Property<long>("Id")
396  .ValueGeneratedOnAdd();
397 
398  b.Property<string>("Author")
399  .IsRequired();
400 
401  b.Property<string>("BodyAtMerge")
402  .IsRequired();
403 
404  b.Property<string>("Comment");
405 
406  b.Property<DateTimeOffset>("MergedAt");
407 
408  b.Property<long>("MergedById");
409 
410  b.Property<int?>("Number")
411  .IsRequired();
412 
413  b.Property<long?>("PrimaryRevisionInformationId");
414 
415  b.Property<string>("PullRequestRevision")
416  .IsRequired();
417 
418  b.Property<string>("TitleAtMerge")
419  .IsRequired();
420 
421  b.Property<string>("Url")
422  .IsRequired();
423 
424  b.HasKey("Id");
425 
426  b.HasIndex("MergedById");
427 
428  b.HasIndex("PrimaryRevisionInformationId")
429  .IsUnique();
430 
431  b.ToTable("TestMerges");
432  });
433 
434  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
435  {
436  b.Property<long>("Id")
437  .ValueGeneratedOnAdd();
438 
439  b.Property<ulong>("AdministrationRights");
440 
441  b.Property<string>("CanonicalName")
442  .IsRequired();
443 
444  b.Property<DateTimeOffset?>("CreatedAt")
445  .IsRequired();
446 
447  b.Property<long?>("CreatedById");
448 
449  b.Property<bool?>("Enabled")
450  .IsRequired();
451 
452  b.Property<ulong>("InstanceManagerRights");
453 
454  b.Property<DateTimeOffset?>("LastPasswordUpdate");
455 
456  b.Property<string>("Name")
457  .IsRequired();
458 
459  b.Property<string>("PasswordHash");
460 
461  b.Property<string>("SystemIdentifier");
462 
463  b.HasKey("Id");
464 
465  b.HasIndex("CanonicalName")
466  .IsUnique();
467 
468  b.HasIndex("CreatedById");
469 
470  b.ToTable("Users");
471  });
472 
473  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
474  {
475  b.Property<long>("Id")
476  .ValueGeneratedOnAdd();
477 
478  b.Property<long?>("AlphaId");
479 
480  b.Property<bool>("AlphaIsActive");
481 
482  b.Property<long?>("BravoId");
483 
484  b.HasKey("Id");
485 
486  b.HasIndex("AlphaId");
487 
488  b.HasIndex("BravoId");
489 
490  b.ToTable("WatchdogReattachInformations");
491  });
492 
493  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
494  {
495  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
496  .WithMany("ChatSettings")
497  .HasForeignKey("InstanceId")
498  .OnDelete(DeleteBehavior.Cascade);
499  });
500 
501  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
502  {
503  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
504  .WithMany("Channels")
505  .HasForeignKey("ChatSettingsId")
506  .OnDelete(DeleteBehavior.Cascade);
507  });
508 
509  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
510  {
511  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
512  .WithMany()
513  .HasForeignKey("JobId");
514 
515  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
516  .WithMany("CompileJobs")
517  .HasForeignKey("RevisionInformationId")
518  .OnDelete(DeleteBehavior.Cascade);
519  });
520 
521  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
522  {
523  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
524  .WithOne("DreamDaemonSettings")
525  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
526  .OnDelete(DeleteBehavior.Cascade);
527  });
528 
529  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
530  {
531  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
532  .WithOne("DreamMakerSettings")
533  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
534  .OnDelete(DeleteBehavior.Cascade);
535  });
536 
537  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
538  {
539  b.HasOne("Tgstation.Server.Host.Models.WatchdogReattachInformation", "WatchdogReattachInformation")
540  .WithMany()
541  .HasForeignKey("WatchdogReattachInformationId");
542  });
543 
544  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
545  {
546  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
547  .WithMany("InstanceUsers")
548  .HasForeignKey("InstanceId")
549  .OnDelete(DeleteBehavior.Cascade);
550 
551  b.HasOne("Tgstation.Server.Host.Models.User")
552  .WithMany("InstanceUsers")
553  .HasForeignKey("UserId")
554  .OnDelete(DeleteBehavior.Cascade);
555  });
556 
557  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
558  {
559  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
560  .WithMany()
561  .HasForeignKey("CancelledById");
562 
563  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
564  .WithMany("Jobs")
565  .HasForeignKey("InstanceId")
566  .OnDelete(DeleteBehavior.Cascade);
567 
568  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
569  .WithMany()
570  .HasForeignKey("StartedById")
571  .OnDelete(DeleteBehavior.Cascade);
572  });
573 
574  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
575  {
576  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
577  .WithMany()
578  .HasForeignKey("CompileJobId");
579  });
580 
581  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
582  {
583  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
584  .WithOne("RepositorySettings")
585  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
586  .OnDelete(DeleteBehavior.Cascade);
587  });
588 
589  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
590  {
591  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
592  .WithMany("ActiveTestMerges")
593  .HasForeignKey("RevisionInformationId")
594  .OnDelete(DeleteBehavior.Cascade);
595 
596  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
597  .WithMany("RevisonInformations")
598  .HasForeignKey("TestMergeId")
599  .OnDelete(DeleteBehavior.Cascade);
600  });
601 
602  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
603  {
604  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
605  .WithMany("RevisionInformations")
606  .HasForeignKey("InstanceId")
607  .OnDelete(DeleteBehavior.Cascade);
608  });
609 
610  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
611  {
612  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
613  .WithMany("TestMerges")
614  .HasForeignKey("MergedById")
615  .OnDelete(DeleteBehavior.Restrict);
616 
617  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
618  .WithOne("PrimaryTestMerge")
619  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
620  .OnDelete(DeleteBehavior.SetNull);
621  });
622 
623  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
624  {
625  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
626  .WithMany("CreatedUsers")
627  .HasForeignKey("CreatedById");
628  });
629 
630  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
631  {
632  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
633  .WithMany()
634  .HasForeignKey("AlphaId");
635 
636  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
637  .WithMany()
638  .HasForeignKey("BravoId");
639  });
640 #pragma warning restore 612, 618
641  }
+
+
+ +

◆ Down()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYInitialCreate.Down (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Unapplies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 597 of file 20180906143029_MYInitialCreate.cs.

+
598  {
599  if (migrationBuilder == null)
600  throw new ArgumentNullException(nameof(migrationBuilder));
601 
602  migrationBuilder.DropForeignKey(
603  name: "FK_Jobs_Instances_InstanceId",
604  table: "Jobs");
605 
606  migrationBuilder.DropForeignKey(
607  name: "FK_RevisionInformations_Instances_InstanceId",
608  table: "RevisionInformations");
609 
610  migrationBuilder.DropTable(
611  name: "ChatChannels");
612 
613  migrationBuilder.DropTable(
614  name: "DreamDaemonSettings");
615 
616  migrationBuilder.DropTable(
617  name: "DreamMakerSettings");
618 
619  migrationBuilder.DropTable(
620  name: "InstanceUsers");
621 
622  migrationBuilder.DropTable(
623  name: "RepositorySettings");
624 
625  migrationBuilder.DropTable(
626  name: "RevInfoTestMerges");
627 
628  migrationBuilder.DropTable(
629  name: "ChatBots");
630 
631  migrationBuilder.DropTable(
632  name: "TestMerges");
633 
634  migrationBuilder.DropTable(
635  name: "Instances");
636 
637  migrationBuilder.DropTable(
638  name: "WatchdogReattachInformations");
639 
640  migrationBuilder.DropTable(
641  name: "ReattachInformations");
642 
643  migrationBuilder.DropTable(
644  name: "CompileJobs");
645 
646  migrationBuilder.DropTable(
647  name: "Jobs");
648 
649  migrationBuilder.DropTable(
650  name: "RevisionInformations");
651 
652  migrationBuilder.DropTable(
653  name: "Users");
654  }
+
+
+ +

◆ Up()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYInitialCreate.Up (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Applies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 17 of file 20180906143029_MYInitialCreate.cs.

+
18  {
19  if (migrationBuilder == null)
20  throw new ArgumentNullException(nameof(migrationBuilder));
21 
22  migrationBuilder.CreateTable(
23  name: "Users",
24  columns: table => new
25  {
26  Id = table.Column<long>(nullable: false)
27  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
28  Enabled = table.Column<bool>(nullable: false),
29  CreatedAt = table.Column<DateTimeOffset>(nullable: false),
30  SystemIdentifier = table.Column<string>(nullable: true),
31  Name = table.Column<string>(nullable: false),
32  AdministrationRights = table.Column<ulong>(nullable: false),
33  InstanceManagerRights = table.Column<ulong>(nullable: false),
34  PasswordHash = table.Column<string>(nullable: true),
35  CreatedById = table.Column<long>(nullable: true),
36  CanonicalName = table.Column<string>(nullable: false),
37  LastPasswordUpdate = table.Column<DateTimeOffset>(nullable: true)
38  },
39  constraints: table =>
40  {
41  table.PrimaryKey("PK_Users", x => x.Id);
42  table.ForeignKey(
43  name: "FK_Users_Users_CreatedById",
44  column: x => x.CreatedById,
45  principalTable: "Users",
46  principalColumn: "Id",
47  onDelete: ReferentialAction.Restrict);
48  });
49 
50  migrationBuilder.CreateTable(
51  name: "ChatChannels",
52  columns: table => new
53  {
54  IrcChannel = table.Column<string>(nullable: true),
55  DiscordChannelId = table.Column<ulong>(nullable: true),
56  IsAdminChannel = table.Column<bool>(nullable: false),
57  IsWatchdogChannel = table.Column<bool>(nullable: false),
58  IsUpdatesChannel = table.Column<bool>(nullable: false),
59  Tag = table.Column<string>(nullable: true),
60  Id = table.Column<long>(nullable: false)
61  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
62  ChatSettingsId = table.Column<long>(nullable: false)
63  },
64  constraints: table =>
65  {
66  table.PrimaryKey("PK_ChatChannels", x => x.Id);
67  });
68 
69  migrationBuilder.CreateTable(
70  name: "ReattachInformations",
71  columns: table => new
72  {
73  ChatCommandsJson = table.Column<string>(nullable: false),
74  ChatChannelsJson = table.Column<string>(nullable: false),
75  ServerCommandsJson = table.Column<string>(nullable: false),
76  AccessIdentifier = table.Column<string>(nullable: false),
77  ProcessId = table.Column<int>(nullable: false),
78  IsPrimary = table.Column<bool>(nullable: false),
79  Port = table.Column<ushort>(nullable: false),
80  RebootState = table.Column<int>(nullable: false),
81  Id = table.Column<long>(nullable: false)
82  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
83  CompileJobId = table.Column<long>(nullable: true)
84  },
85  constraints: table =>
86  {
87  table.PrimaryKey("PK_ReattachInformations", x => x.Id);
88  });
89 
90  migrationBuilder.CreateTable(
91  name: "WatchdogReattachInformations",
92  columns: table => new
93  {
94  AlphaIsActive = table.Column<bool>(nullable: false),
95  Id = table.Column<long>(nullable: false)
96  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
97  AlphaId = table.Column<long>(nullable: true),
98  BravoId = table.Column<long>(nullable: true)
99  },
100  constraints: table =>
101  {
102  table.PrimaryKey("PK_WatchdogReattachInformations", x => x.Id);
103  table.ForeignKey(
104  name: "FK_WatchdogReattachInformations_ReattachInformations_AlphaId",
105  column: x => x.AlphaId,
106  principalTable: "ReattachInformations",
107  principalColumn: "Id",
108  onDelete: ReferentialAction.Restrict);
109  table.ForeignKey(
110  name: "FK_WatchdogReattachInformations_ReattachInformations_BravoId",
111  column: x => x.BravoId,
112  principalTable: "ReattachInformations",
113  principalColumn: "Id",
114  onDelete: ReferentialAction.Restrict);
115  });
116 
117  migrationBuilder.CreateTable(
118  name: "Instances",
119  columns: table => new
120  {
121  Id = table.Column<long>(nullable: false)
122  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
123  Name = table.Column<string>(nullable: false),
124  Path = table.Column<string>(nullable: false),
125  Online = table.Column<bool>(nullable: false),
126  ConfigurationType = table.Column<int>(nullable: false),
127  AutoUpdateInterval = table.Column<uint>(nullable: false),
128  WatchdogReattachInformationId = table.Column<long>(nullable: true)
129  },
130  constraints: table =>
131  {
132  table.PrimaryKey("PK_Instances", x => x.Id);
133  table.ForeignKey(
134  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInfor~",
135  column: x => x.WatchdogReattachInformationId,
136  principalTable: "WatchdogReattachInformations",
137  principalColumn: "Id",
138  onDelete: ReferentialAction.Restrict);
139  });
140 
141  migrationBuilder.CreateTable(
142  name: "ChatBots",
143  columns: table => new
144  {
145  Id = table.Column<long>(nullable: false)
146  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
147  Name = table.Column<string>(nullable: false),
148  Enabled = table.Column<bool>(nullable: true),
149  Provider = table.Column<int>(nullable: true),
150  ConnectionString = table.Column<string>(nullable: false),
151  InstanceId = table.Column<long>(nullable: false)
152  },
153  constraints: table =>
154  {
155  table.PrimaryKey("PK_ChatBots", x => x.Id);
156  table.ForeignKey(
157  name: "FK_ChatBots_Instances_InstanceId",
158  column: x => x.InstanceId,
159  principalTable: "Instances",
160  principalColumn: "Id",
161  onDelete: ReferentialAction.Cascade);
162  });
163 
164  migrationBuilder.CreateTable(
165  name: "DreamDaemonSettings",
166  columns: table => new
167  {
168  AllowWebClient = table.Column<bool>(nullable: false),
169  SecurityLevel = table.Column<int>(nullable: false),
170  PrimaryPort = table.Column<ushort>(nullable: false),
171  SecondaryPort = table.Column<ushort>(nullable: false),
172  StartupTimeout = table.Column<uint>(nullable: false),
173  AutoStart = table.Column<bool>(nullable: false),
174  SoftRestart = table.Column<bool>(nullable: false),
175  SoftShutdown = table.Column<bool>(nullable: false),
176  Id = table.Column<long>(nullable: false)
177  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
178  ProcessId = table.Column<int>(nullable: true),
179  AccessToken = table.Column<string>(nullable: true),
180  InstanceId = table.Column<long>(nullable: false)
181  },
182  constraints: table =>
183  {
184  table.PrimaryKey("PK_DreamDaemonSettings", x => x.Id);
185  table.ForeignKey(
186  name: "FK_DreamDaemonSettings_Instances_InstanceId",
187  column: x => x.InstanceId,
188  principalTable: "Instances",
189  principalColumn: "Id",
190  onDelete: ReferentialAction.Cascade);
191  });
192 
193  migrationBuilder.CreateTable(
194  name: "DreamMakerSettings",
195  columns: table => new
196  {
197  ProjectName = table.Column<string>(nullable: true),
198  ApiValidationPort = table.Column<ushort>(nullable: false),
199  Id = table.Column<long>(nullable: false)
200  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
201  InstanceId = table.Column<long>(nullable: false)
202  },
203  constraints: table =>
204  {
205  table.PrimaryKey("PK_DreamMakerSettings", x => x.Id);
206  table.ForeignKey(
207  name: "FK_DreamMakerSettings_Instances_InstanceId",
208  column: x => x.InstanceId,
209  principalTable: "Instances",
210  principalColumn: "Id",
211  onDelete: ReferentialAction.Cascade);
212  });
213 
214  migrationBuilder.CreateTable(
215  name: "InstanceUsers",
216  columns: table => new
217  {
218  UserId = table.Column<long>(nullable: false),
219  InstanceUserRights = table.Column<ulong>(nullable: false),
220  ByondRights = table.Column<ulong>(nullable: false),
221  DreamDaemonRights = table.Column<ulong>(nullable: false),
222  DreamMakerRights = table.Column<ulong>(nullable: false),
223  RepositoryRights = table.Column<ulong>(nullable: false),
224  ChatBotRights = table.Column<ulong>(nullable: false),
225  ConfigurationRights = table.Column<ulong>(nullable: false),
226  Id = table.Column<long>(nullable: false)
227  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
228  InstanceId = table.Column<long>(nullable: false)
229  },
230  constraints: table =>
231  {
232  table.PrimaryKey("PK_InstanceUsers", x => x.Id);
233  table.ForeignKey(
234  name: "FK_InstanceUsers_Instances_InstanceId",
235  column: x => x.InstanceId,
236  principalTable: "Instances",
237  principalColumn: "Id",
238  onDelete: ReferentialAction.Cascade);
239  table.ForeignKey(
240  name: "FK_InstanceUsers_Users_UserId",
241  column: x => x.UserId,
242  principalTable: "Users",
243  principalColumn: "Id",
244  onDelete: ReferentialAction.Cascade);
245  });
246 
247  migrationBuilder.CreateTable(
248  name: "Jobs",
249  columns: table => new
250  {
251  Id = table.Column<long>(nullable: false)
252  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
253  Description = table.Column<string>(nullable: false),
254  ExceptionDetails = table.Column<string>(nullable: true),
255  StartedAt = table.Column<DateTimeOffset>(nullable: false),
256  StoppedAt = table.Column<DateTimeOffset>(nullable: true),
257  Cancelled = table.Column<bool>(nullable: false),
258  CancelRightsType = table.Column<ulong>(nullable: true),
259  CancelRight = table.Column<ulong>(nullable: true),
260  StartedById = table.Column<long>(nullable: false),
261  CancelledById = table.Column<long>(nullable: true),
262  InstanceId = table.Column<long>(nullable: false)
263  },
264  constraints: table =>
265  {
266  table.PrimaryKey("PK_Jobs", x => x.Id);
267  table.ForeignKey(
268  name: "FK_Jobs_Users_CancelledById",
269  column: x => x.CancelledById,
270  principalTable: "Users",
271  principalColumn: "Id",
272  onDelete: ReferentialAction.Restrict);
273  table.ForeignKey(
274  name: "FK_Jobs_Instances_InstanceId",
275  column: x => x.InstanceId,
276  principalTable: "Instances",
277  principalColumn: "Id",
278  onDelete: ReferentialAction.Cascade);
279  table.ForeignKey(
280  name: "FK_Jobs_Users_StartedById",
281  column: x => x.StartedById,
282  principalTable: "Users",
283  principalColumn: "Id",
284  onDelete: ReferentialAction.Cascade);
285  });
286 
287  migrationBuilder.CreateTable(
288  name: "RepositorySettings",
289  columns: table => new
290  {
291  CommitterName = table.Column<string>(nullable: false),
292  CommitterEmail = table.Column<string>(nullable: false),
293  AccessUser = table.Column<string>(nullable: true),
294  AccessToken = table.Column<string>(nullable: true),
295  PushTestMergeCommits = table.Column<bool>(nullable: false),
296  ShowTestMergeCommitters = table.Column<bool>(nullable: false),
297  AutoUpdatesKeepTestMerges = table.Column<bool>(nullable: false),
298  AutoUpdatesSynchronize = table.Column<bool>(nullable: false),
299  Id = table.Column<long>(nullable: false)
300  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
301  InstanceId = table.Column<long>(nullable: false)
302  },
303  constraints: table =>
304  {
305  table.PrimaryKey("PK_RepositorySettings", x => x.Id);
306  table.ForeignKey(
307  name: "FK_RepositorySettings_Instances_InstanceId",
308  column: x => x.InstanceId,
309  principalTable: "Instances",
310  principalColumn: "Id",
311  onDelete: ReferentialAction.Cascade);
312  });
313 
314  migrationBuilder.CreateTable(
315  name: "RevisionInformations",
316  columns: table => new
317  {
318  CommitSha = table.Column<string>(maxLength: 40, nullable: false),
319  OriginCommitSha = table.Column<string>(maxLength: 40, nullable: false),
320  Id = table.Column<long>(nullable: false)
321  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
322  InstanceId = table.Column<long>(nullable: false)
323  },
324  constraints: table =>
325  {
326  table.PrimaryKey("PK_RevisionInformations", x => x.Id);
327  table.ForeignKey(
328  name: "FK_RevisionInformations_Instances_InstanceId",
329  column: x => x.InstanceId,
330  principalTable: "Instances",
331  principalColumn: "Id",
332  onDelete: ReferentialAction.Cascade);
333  });
334 
335  migrationBuilder.CreateTable(
336  name: "CompileJobs",
337  columns: table => new
338  {
339  Id = table.Column<long>(nullable: false)
340  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
341  DmeName = table.Column<string>(nullable: true),
342  Output = table.Column<string>(nullable: true),
343  DirectoryName = table.Column<Guid>(nullable: true),
344  JobId = table.Column<long>(nullable: true),
345  RevisionInformationId = table.Column<long>(nullable: false),
346  ByondVersion = table.Column<string>(nullable: false)
347  },
348  constraints: table =>
349  {
350  table.PrimaryKey("PK_CompileJobs", x => x.Id);
351  table.ForeignKey(
352  name: "FK_CompileJobs_Jobs_JobId",
353  column: x => x.JobId,
354  principalTable: "Jobs",
355  principalColumn: "Id",
356  onDelete: ReferentialAction.Restrict);
357  table.ForeignKey(
358  name: "FK_CompileJobs_RevisionInformations_RevisionInformationId",
359  column: x => x.RevisionInformationId,
360  principalTable: "RevisionInformations",
361  principalColumn: "Id",
362  onDelete: ReferentialAction.Cascade);
363  });
364 
365  migrationBuilder.CreateTable(
366  name: "TestMerges",
367  columns: table => new
368  {
369  Number = table.Column<int>(nullable: false),
370  PullRequestRevision = table.Column<string>(nullable: false),
371  Comment = table.Column<string>(nullable: true),
372  TitleAtMerge = table.Column<string>(nullable: false),
373  BodyAtMerge = table.Column<string>(nullable: false),
374  Url = table.Column<string>(nullable: false),
375  Author = table.Column<string>(nullable: false),
376  Id = table.Column<long>(nullable: false)
377  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
378  MergedAt = table.Column<DateTimeOffset>(nullable: false),
379  MergedById = table.Column<long>(nullable: false),
380  PrimaryRevisionInformationId = table.Column<long>(nullable: true)
381  },
382  constraints: table =>
383  {
384  table.PrimaryKey("PK_TestMerges", x => x.Id);
385  table.ForeignKey(
386  name: "FK_TestMerges_Users_MergedById",
387  column: x => x.MergedById,
388  principalTable: "Users",
389  principalColumn: "Id",
390  onDelete: ReferentialAction.Restrict);
391  table.ForeignKey(
392  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
393  column: x => x.PrimaryRevisionInformationId,
394  principalTable: "RevisionInformations",
395  principalColumn: "Id",
396  onDelete: ReferentialAction.SetNull);
397  });
398 
399  migrationBuilder.CreateTable(
400  name: "RevInfoTestMerges",
401  columns: table => new
402  {
403  Id = table.Column<long>(nullable: false)
404  .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
405  TestMergeId = table.Column<long>(nullable: false),
406  RevisionInformationId = table.Column<long>(nullable: false)
407  },
408  constraints: table =>
409  {
410  table.PrimaryKey("PK_RevInfoTestMerges", x => x.Id);
411  table.ForeignKey(
412  name: "FK_RevInfoTestMerges_RevisionInformations_RevisionInformationId",
413  column: x => x.RevisionInformationId,
414  principalTable: "RevisionInformations",
415  principalColumn: "Id",
416  onDelete: ReferentialAction.Cascade);
417  table.ForeignKey(
418  name: "FK_RevInfoTestMerges_TestMerges_TestMergeId",
419  column: x => x.TestMergeId,
420  principalTable: "TestMerges",
421  principalColumn: "Id",
422  onDelete: ReferentialAction.Cascade);
423  });
424 
425  migrationBuilder.CreateIndex(
426  name: "IX_ChatBots_InstanceId",
427  table: "ChatBots",
428  column: "InstanceId");
429 
430  migrationBuilder.CreateIndex(
431  name: "IX_ChatBots_Name",
432  table: "ChatBots",
433  column: "Name",
434  unique: true);
435 
436  migrationBuilder.CreateIndex(
437  name: "IX_ChatChannels_ChatSettingsId_DiscordChannelId",
438  table: "ChatChannels",
439  columns: new[] { "ChatSettingsId", "DiscordChannelId" },
440  unique: true);
441 
442  migrationBuilder.CreateIndex(
443  name: "IX_ChatChannels_ChatSettingsId_IrcChannel",
444  table: "ChatChannels",
445  columns: new[] { "ChatSettingsId", "IrcChannel" },
446  unique: true);
447 
448  migrationBuilder.CreateIndex(
449  name: "IX_CompileJobs_DirectoryName",
450  table: "CompileJobs",
451  column: "DirectoryName");
452 
453  migrationBuilder.CreateIndex(
454  name: "IX_CompileJobs_JobId",
455  table: "CompileJobs",
456  column: "JobId");
457 
458  migrationBuilder.CreateIndex(
459  name: "IX_CompileJobs_RevisionInformationId",
460  table: "CompileJobs",
461  column: "RevisionInformationId");
462 
463  migrationBuilder.CreateIndex(
464  name: "IX_DreamDaemonSettings_InstanceId",
465  table: "DreamDaemonSettings",
466  column: "InstanceId",
467  unique: true);
468 
469  migrationBuilder.CreateIndex(
470  name: "IX_DreamMakerSettings_InstanceId",
471  table: "DreamMakerSettings",
472  column: "InstanceId",
473  unique: true);
474 
475  migrationBuilder.CreateIndex(
476  name: "IX_Instances_Path",
477  table: "Instances",
478  column: "Path",
479  unique: true);
480 
481  migrationBuilder.CreateIndex(
482  name: "IX_Instances_WatchdogReattachInformationId",
483  table: "Instances",
484  column: "WatchdogReattachInformationId");
485 
486  migrationBuilder.CreateIndex(
487  name: "IX_InstanceUsers_InstanceId",
488  table: "InstanceUsers",
489  column: "InstanceId");
490 
491  migrationBuilder.CreateIndex(
492  name: "IX_InstanceUsers_UserId_InstanceId",
493  table: "InstanceUsers",
494  columns: new[] { "UserId", "InstanceId" },
495  unique: true);
496 
497  migrationBuilder.CreateIndex(
498  name: "IX_Jobs_CancelledById",
499  table: "Jobs",
500  column: "CancelledById");
501 
502  migrationBuilder.CreateIndex(
503  name: "IX_Jobs_InstanceId",
504  table: "Jobs",
505  column: "InstanceId");
506 
507  migrationBuilder.CreateIndex(
508  name: "IX_Jobs_StartedById",
509  table: "Jobs",
510  column: "StartedById");
511 
512  migrationBuilder.CreateIndex(
513  name: "IX_ReattachInformations_CompileJobId",
514  table: "ReattachInformations",
515  column: "CompileJobId");
516 
517  migrationBuilder.CreateIndex(
518  name: "IX_RepositorySettings_InstanceId",
519  table: "RepositorySettings",
520  column: "InstanceId",
521  unique: true);
522 
523  migrationBuilder.CreateIndex(
524  name: "IX_RevInfoTestMerges_RevisionInformationId",
525  table: "RevInfoTestMerges",
526  column: "RevisionInformationId");
527 
528  migrationBuilder.CreateIndex(
529  name: "IX_RevInfoTestMerges_TestMergeId",
530  table: "RevInfoTestMerges",
531  column: "TestMergeId");
532 
533  migrationBuilder.CreateIndex(
534  name: "IX_RevisionInformations_CommitSha",
535  table: "RevisionInformations",
536  column: "CommitSha",
537  unique: true);
538 
539  migrationBuilder.CreateIndex(
540  name: "IX_RevisionInformations_InstanceId",
541  table: "RevisionInformations",
542  column: "InstanceId");
543 
544  migrationBuilder.CreateIndex(
545  name: "IX_TestMerges_MergedById",
546  table: "TestMerges",
547  column: "MergedById");
548 
549  migrationBuilder.CreateIndex(
550  name: "IX_TestMerges_PrimaryRevisionInformationId",
551  table: "TestMerges",
552  column: "PrimaryRevisionInformationId",
553  unique: true);
554 
555  migrationBuilder.CreateIndex(
556  name: "IX_Users_CanonicalName",
557  table: "Users",
558  column: "CanonicalName",
559  unique: true);
560 
561  migrationBuilder.CreateIndex(
562  name: "IX_Users_CreatedById",
563  table: "Users",
564  column: "CreatedById");
565 
566  migrationBuilder.CreateIndex(
567  name: "IX_WatchdogReattachInformations_AlphaId",
568  table: "WatchdogReattachInformations",
569  column: "AlphaId");
570 
571  migrationBuilder.CreateIndex(
572  name: "IX_WatchdogReattachInformations_BravoId",
573  table: "WatchdogReattachInformations",
574  column: "BravoId");
575 
576  migrationBuilder.AddForeignKey(
577  name: "FK_ChatChannels_ChatBots_ChatSettingsId",
578  table: "ChatChannels",
579  column: "ChatSettingsId",
580  principalTable: "ChatBots",
581  principalColumn: "Id",
582  onDelete: ReferentialAction.Cascade);
583 
584  migrationBuilder.AddForeignKey(
585  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
586  table: "ReattachInformations",
587  column: "CompileJobId",
588  principalTable: "CompileJobs",
589  principalColumn: "Id",
590  onDelete: ReferentialAction.Restrict);
591  }
ConfigurationRights
Rights for Models.ConfigurationFile
+
User can enable Models.Internal.DreamDaemonSettings.SoftRestart
+
ByondRights
Rights for Models.Byond
Definition: ByondRights.cs:9
+
InstanceUserRights
Rights for an Models.Instance
+
AdministrationRights
Rights for Models.Administration
+
ConfigurationType
The type of configuration allowed on an Instance
+
DreamDaemonRights
Rights for Models.DreamDaemon
+
InstanceManagerRights
Rights for managing Models.Instances
+
DreamMakerRights
Rights for Models.DreamMaker
+
RepositoryRights
Rights for a Models.Repository
+
ChatBotRights
Rights for Models.ChatBot
Definition: ChatBotRights.cs:9
+ +
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
+
+
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.png new file mode 100644 index 0000000000000000000000000000000000000000..2da706c5b19b2ca7bc6ce9ef1dbecb641080f4fa GIT binary patch literal 975 zcmeAS@N?(olHy`uVBq!ia0y~yVDtsD12~w0_AE)z$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-ope=-WuIZO{?mF9Dm0^~3c$tdt4biWc_>ylwF zJvo|Y4EDf3TL$?9;tmWC9B!}_JbJBN!t_JHjB(D5lr}#G@k442@(+a$bZ_8%;Ch4Q zgHjGtg`gSZ9*)@zK+iJh1Es|ig(;Qx-#9bK%h5~I(t(MCq0Sf09+BBk{g|>=t-rm0 zWyaYJ7zuiyxHkF zOr~dZ__Y1oIZRHP$ls9hy?a>We^T-5l>Z0H#m}CfSY7i+$|JWXr8Zpq@9Z_#(lj;V z-?Lmzy1jJc^_Lo=<=US!+|OpO3E%tP{rcv)SEP!w({qaTTT+BNXZf_MnHVPtH&4B= zruo_Aa0&MfTYrQ;-TY`rnf;t~mC44A)8F0xXJ%u3VdL3n4w-$E&Q1O}vw`pTtvP2N z>#>wT#FYolWN#FPT_hMJxtn%&$iJo`ApStj@ zc+2-^{$|H_FX~*O|L^8b%WXGXZErO8M`vx=9v`~z+}ZTmho8OAxp(~Yw>w+Pf0e#| zcRjZJpc#AP&I50!XN7GRIWsqJ*}1w;5B>7B&C7p9R*StoeCB@IMic$xS;o_>9_?NI zaqhh}=?&)-r*>4&{>#g}!A#q=CVF=1O{N+qZdaRIFBupQ>=!~yB(u*>3E~R!dinhi ZBeSA=>HfVT1;E_L;OXk;vd$@?2>` + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup, including all inherited members.

+ + + + +
BuildTargetModel(ModelBuilder modelBuilder)Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanupprotected
Down(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanupprotected
Up(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanupprotected
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html new file mode 100644 index 0000000000..57693a68b9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html @@ -0,0 +1,227 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup Class Reference
+
+
+ +

Cleans up of nullable columns and foreign keys MySQL/MariaDB + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup:
+
+
+ + +Migration + +
+ + + + + + + + + + + +

+Protected Member Functions

override void Up (MigrationBuilder migrationBuilder)
 Applies the migration More...
 
override void Down (MigrationBuilder migrationBuilder)
 Unapplies the migration More...
 
override void BuildTargetModel (ModelBuilder modelBuilder)
 Builds the target model More...
 
+

Detailed Description

+

Cleans up of nullable columns and foreign keys MySQL/MariaDB

+ +

Definition at line 9 of file 20180918204520_MYNullableAndForeignKeyCleanup.cs.

+

Member Function Documentation

+ +

◆ BuildTargetModel()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.BuildTargetModel (ModelBuilder modelBuilder)
+
+protected
+
+ +

Builds the target model

+
Parameters
+ + +
modelBuilderThe ModelBuilder to use
+
+
+ +

Definition at line 17 of file 20180918204520_MYNullableAndForeignKeyCleanup.Designer.cs.

+
18  {
19 #pragma warning disable 612, 618
20  modelBuilder
21  .HasAnnotation("ProductVersion", "2.1.3-rtm-32065")
22  .HasAnnotation("Relational:MaxIdentifierLength", 64);
23 
24  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
25  {
26  b.Property<long>("Id")
27  .ValueGeneratedOnAdd();
28 
29  b.Property<string>("ConnectionString")
30  .IsRequired();
31 
32  b.Property<bool?>("Enabled");
33 
34  b.Property<long>("InstanceId");
35 
36  b.Property<string>("Name")
37  .IsRequired();
38 
39  b.Property<int?>("Provider");
40 
41  b.HasKey("Id");
42 
43  b.HasIndex("InstanceId");
44 
45  b.HasIndex("Name")
46  .IsUnique();
47 
48  b.ToTable("ChatBots");
49  });
50 
51  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
52  {
53  b.Property<long>("Id")
54  .ValueGeneratedOnAdd();
55 
56  b.Property<long>("ChatSettingsId");
57 
58  b.Property<ulong?>("DiscordChannelId");
59 
60  b.Property<string>("IrcChannel");
61 
62  b.Property<bool?>("IsAdminChannel")
63  .IsRequired();
64 
65  b.Property<bool?>("IsUpdatesChannel")
66  .IsRequired();
67 
68  b.Property<bool?>("IsWatchdogChannel")
69  .IsRequired();
70 
71  b.Property<string>("Tag");
72 
73  b.HasKey("Id");
74 
75  b.HasIndex("ChatSettingsId", "DiscordChannelId")
76  .IsUnique();
77 
78  b.HasIndex("ChatSettingsId", "IrcChannel")
79  .IsUnique();
80 
81  b.ToTable("ChatChannels");
82  });
83 
84  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
85  {
86  b.Property<long>("Id")
87  .ValueGeneratedOnAdd();
88 
89  b.Property<string>("ByondVersion")
90  .IsRequired();
91 
92  b.Property<Guid?>("DirectoryName")
93  .IsRequired();
94 
95  b.Property<string>("DmeName")
96  .IsRequired();
97 
98  b.Property<long>("JobId");
99 
100  b.Property<int>("MinimumSecurityLevel");
101 
102  b.Property<string>("Output")
103  .IsRequired();
104 
105  b.Property<long>("RevisionInformationId");
106 
107  b.HasKey("Id");
108 
109  b.HasIndex("DirectoryName");
110 
111  b.HasIndex("JobId")
112  .IsUnique();
113 
114  b.HasIndex("RevisionInformationId");
115 
116  b.ToTable("CompileJobs");
117  });
118 
119  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
120  {
121  b.Property<long>("Id")
122  .ValueGeneratedOnAdd();
123 
124  b.Property<string>("AccessToken");
125 
126  b.Property<bool?>("AllowWebClient")
127  .IsRequired();
128 
129  b.Property<bool?>("AutoStart")
130  .IsRequired();
131 
132  b.Property<long>("InstanceId");
133 
134  b.Property<ushort?>("PrimaryPort")
135  .IsRequired();
136 
137  b.Property<int?>("ProcessId");
138 
139  b.Property<ushort?>("SecondaryPort")
140  .IsRequired();
141 
142  b.Property<int>("SecurityLevel");
143 
144  b.Property<bool?>("SoftRestart")
145  .IsRequired();
146 
147  b.Property<bool?>("SoftShutdown")
148  .IsRequired();
149 
150  b.Property<uint?>("StartupTimeout")
151  .IsRequired();
152 
153  b.HasKey("Id");
154 
155  b.HasIndex("InstanceId")
156  .IsUnique();
157 
158  b.ToTable("DreamDaemonSettings");
159  });
160 
161  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
162  {
163  b.Property<long>("Id")
164  .ValueGeneratedOnAdd();
165 
166  b.Property<ushort?>("ApiValidationPort")
167  .IsRequired();
168 
169  b.Property<int>("ApiValidationSecurityLevel");
170 
171  b.Property<long>("InstanceId");
172 
173  b.Property<string>("ProjectName");
174 
175  b.HasKey("Id");
176 
177  b.HasIndex("InstanceId")
178  .IsUnique();
179 
180  b.ToTable("DreamMakerSettings");
181  });
182 
183  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
184  {
185  b.Property<long>("Id")
186  .ValueGeneratedOnAdd();
187 
188  b.Property<uint?>("AutoUpdateInterval")
189  .IsRequired();
190 
191  b.Property<int>("ConfigurationType");
192 
193  b.Property<string>("Name")
194  .IsRequired();
195 
196  b.Property<bool?>("Online")
197  .IsRequired();
198 
199  b.Property<string>("Path")
200  .IsRequired();
201 
202  b.HasKey("Id");
203 
204  b.HasIndex("Path")
205  .IsUnique();
206 
207  b.ToTable("Instances");
208  });
209 
210  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
211  {
212  b.Property<long>("Id")
213  .ValueGeneratedOnAdd();
214 
215  b.Property<ulong>("ByondRights");
216 
217  b.Property<ulong>("ChatBotRights");
218 
219  b.Property<ulong>("ConfigurationRights");
220 
221  b.Property<ulong>("DreamDaemonRights");
222 
223  b.Property<ulong>("DreamMakerRights");
224 
225  b.Property<long>("InstanceId");
226 
227  b.Property<ulong>("InstanceUserRights");
228 
229  b.Property<ulong>("RepositoryRights");
230 
231  b.Property<long?>("UserId")
232  .IsRequired();
233 
234  b.HasKey("Id");
235 
236  b.HasIndex("InstanceId");
237 
238  b.HasIndex("UserId", "InstanceId")
239  .IsUnique();
240 
241  b.ToTable("InstanceUsers");
242  });
243 
244  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
245  {
246  b.Property<long>("Id")
247  .ValueGeneratedOnAdd();
248 
249  b.Property<ulong?>("CancelRight");
250 
251  b.Property<ulong?>("CancelRightsType");
252 
253  b.Property<bool?>("Cancelled")
254  .IsRequired();
255 
256  b.Property<long?>("CancelledById");
257 
258  b.Property<string>("Description")
259  .IsRequired();
260 
261  b.Property<string>("ExceptionDetails");
262 
263  b.Property<long>("InstanceId");
264 
265  b.Property<DateTimeOffset?>("StartedAt")
266  .IsRequired();
267 
268  b.Property<long>("StartedById");
269 
270  b.Property<DateTimeOffset?>("StoppedAt");
271 
272  b.HasKey("Id");
273 
274  b.HasIndex("CancelledById");
275 
276  b.HasIndex("InstanceId");
277 
278  b.HasIndex("StartedById");
279 
280  b.ToTable("Jobs");
281  });
282 
283  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
284  {
285  b.Property<long>("Id")
286  .ValueGeneratedOnAdd();
287 
288  b.Property<string>("AccessIdentifier")
289  .IsRequired();
290 
291  b.Property<string>("ChatChannelsJson")
292  .IsRequired();
293 
294  b.Property<string>("ChatCommandsJson")
295  .IsRequired();
296 
297  b.Property<long?>("CompileJobId");
298 
299  b.Property<bool>("IsPrimary");
300 
301  b.Property<ushort>("Port");
302 
303  b.Property<int>("ProcessId");
304 
305  b.Property<int>("RebootState");
306 
307  b.Property<string>("ServerCommandsJson")
308  .IsRequired();
309 
310  b.HasKey("Id");
311 
312  b.HasIndex("CompileJobId");
313 
314  b.ToTable("ReattachInformations");
315  });
316 
317  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
318  {
319  b.Property<long>("Id")
320  .ValueGeneratedOnAdd();
321 
322  b.Property<string>("AccessToken");
323 
324  b.Property<string>("AccessUser");
325 
326  b.Property<bool?>("AutoUpdatesKeepTestMerges")
327  .IsRequired();
328 
329  b.Property<bool?>("AutoUpdatesSynchronize")
330  .IsRequired();
331 
332  b.Property<string>("CommitterEmail")
333  .IsRequired();
334 
335  b.Property<string>("CommitterName")
336  .IsRequired();
337 
338  b.Property<long>("InstanceId");
339 
340  b.Property<bool?>("PushTestMergeCommits")
341  .IsRequired();
342 
343  b.Property<bool?>("ShowTestMergeCommitters")
344  .IsRequired();
345 
346  b.HasKey("Id");
347 
348  b.HasIndex("InstanceId")
349  .IsUnique();
350 
351  b.ToTable("RepositorySettings");
352  });
353 
354  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
355  {
356  b.Property<long>("Id")
357  .ValueGeneratedOnAdd();
358 
359  b.Property<long>("RevisionInformationId");
360 
361  b.Property<long>("TestMergeId");
362 
363  b.HasKey("Id");
364 
365  b.HasIndex("RevisionInformationId");
366 
367  b.HasIndex("TestMergeId");
368 
369  b.ToTable("RevInfoTestMerges");
370  });
371 
372  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
373  {
374  b.Property<long>("Id")
375  .ValueGeneratedOnAdd();
376 
377  b.Property<string>("CommitSha")
378  .IsRequired()
379  .HasMaxLength(40);
380 
381  b.Property<long>("InstanceId");
382 
383  b.Property<string>("OriginCommitSha")
384  .IsRequired()
385  .HasMaxLength(40);
386 
387  b.HasKey("Id");
388 
389  b.HasIndex("CommitSha")
390  .IsUnique();
391 
392  b.HasIndex("InstanceId");
393 
394  b.ToTable("RevisionInformations");
395  });
396 
397  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
398  {
399  b.Property<long>("Id")
400  .ValueGeneratedOnAdd();
401 
402  b.Property<string>("Author")
403  .IsRequired();
404 
405  b.Property<string>("BodyAtMerge")
406  .IsRequired();
407 
408  b.Property<string>("Comment");
409 
410  b.Property<DateTimeOffset>("MergedAt");
411 
412  b.Property<long>("MergedById");
413 
414  b.Property<int?>("Number")
415  .IsRequired();
416 
417  b.Property<long?>("PrimaryRevisionInformationId")
418  .IsRequired();
419 
420  b.Property<string>("PullRequestRevision")
421  .IsRequired();
422 
423  b.Property<string>("TitleAtMerge")
424  .IsRequired();
425 
426  b.Property<string>("Url")
427  .IsRequired();
428 
429  b.HasKey("Id");
430 
431  b.HasIndex("MergedById");
432 
433  b.HasIndex("PrimaryRevisionInformationId")
434  .IsUnique();
435 
436  b.ToTable("TestMerges");
437  });
438 
439  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
440  {
441  b.Property<long>("Id")
442  .ValueGeneratedOnAdd();
443 
444  b.Property<ulong>("AdministrationRights");
445 
446  b.Property<string>("CanonicalName")
447  .IsRequired();
448 
449  b.Property<DateTimeOffset?>("CreatedAt")
450  .IsRequired();
451 
452  b.Property<long?>("CreatedById");
453 
454  b.Property<bool?>("Enabled")
455  .IsRequired();
456 
457  b.Property<ulong>("InstanceManagerRights");
458 
459  b.Property<DateTimeOffset?>("LastPasswordUpdate");
460 
461  b.Property<string>("Name")
462  .IsRequired();
463 
464  b.Property<string>("PasswordHash");
465 
466  b.Property<string>("SystemIdentifier");
467 
468  b.HasKey("Id");
469 
470  b.HasIndex("CanonicalName")
471  .IsUnique();
472 
473  b.HasIndex("CreatedById");
474 
475  b.ToTable("Users");
476  });
477 
478  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
479  {
480  b.Property<long>("Id")
481  .ValueGeneratedOnAdd();
482 
483  b.Property<long?>("AlphaId");
484 
485  b.Property<bool>("AlphaIsActive");
486 
487  b.Property<long?>("BravoId");
488 
489  b.Property<long>("InstanceId");
490 
491  b.HasKey("Id");
492 
493  b.HasIndex("AlphaId");
494 
495  b.HasIndex("BravoId");
496 
497  b.HasIndex("InstanceId")
498  .IsUnique();
499 
500  b.ToTable("WatchdogReattachInformations");
501  });
502 
503  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
504  {
505  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
506  .WithMany("ChatSettings")
507  .HasForeignKey("InstanceId")
508  .OnDelete(DeleteBehavior.Cascade);
509  });
510 
511  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
512  {
513  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
514  .WithMany("Channels")
515  .HasForeignKey("ChatSettingsId")
516  .OnDelete(DeleteBehavior.Cascade);
517  });
518 
519  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
520  {
521  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
522  .WithOne()
523  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
524  .OnDelete(DeleteBehavior.Restrict);
525 
526  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
527  .WithMany("CompileJobs")
528  .HasForeignKey("RevisionInformationId")
529  .OnDelete(DeleteBehavior.Cascade);
530  });
531 
532  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
533  {
534  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
535  .WithOne("DreamDaemonSettings")
536  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
537  .OnDelete(DeleteBehavior.Cascade);
538  });
539 
540  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
541  {
542  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
543  .WithOne("DreamMakerSettings")
544  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
545  .OnDelete(DeleteBehavior.Cascade);
546  });
547 
548  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
549  {
550  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
551  .WithMany("InstanceUsers")
552  .HasForeignKey("InstanceId")
553  .OnDelete(DeleteBehavior.Cascade);
554 
555  b.HasOne("Tgstation.Server.Host.Models.User")
556  .WithMany("InstanceUsers")
557  .HasForeignKey("UserId")
558  .OnDelete(DeleteBehavior.Cascade);
559  });
560 
561  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
562  {
563  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
564  .WithMany()
565  .HasForeignKey("CancelledById");
566 
567  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
568  .WithMany("Jobs")
569  .HasForeignKey("InstanceId")
570  .OnDelete(DeleteBehavior.Cascade);
571 
572  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
573  .WithMany()
574  .HasForeignKey("StartedById")
575  .OnDelete(DeleteBehavior.Cascade);
576  });
577 
578  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
579  {
580  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
581  .WithMany()
582  .HasForeignKey("CompileJobId");
583  });
584 
585  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
586  {
587  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
588  .WithOne("RepositorySettings")
589  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
590  .OnDelete(DeleteBehavior.Cascade);
591  });
592 
593  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
594  {
595  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
596  .WithMany("ActiveTestMerges")
597  .HasForeignKey("RevisionInformationId")
598  .OnDelete(DeleteBehavior.Cascade);
599 
600  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
601  .WithMany("RevisonInformations")
602  .HasForeignKey("TestMergeId")
603  .OnDelete(DeleteBehavior.Cascade);
604  });
605 
606  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
607  {
608  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
609  .WithMany("RevisionInformations")
610  .HasForeignKey("InstanceId")
611  .OnDelete(DeleteBehavior.Cascade);
612  });
613 
614  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
615  {
616  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
617  .WithMany("TestMerges")
618  .HasForeignKey("MergedById")
619  .OnDelete(DeleteBehavior.Restrict);
620 
621  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
622  .WithOne("PrimaryTestMerge")
623  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
624  .OnDelete(DeleteBehavior.Restrict);
625  });
626 
627  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
628  {
629  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
630  .WithMany("CreatedUsers")
631  .HasForeignKey("CreatedById");
632  });
633 
634  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
635  {
636  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
637  .WithMany()
638  .HasForeignKey("AlphaId");
639 
640  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
641  .WithMany()
642  .HasForeignKey("BravoId");
643 
644  b.HasOne("Tgstation.Server.Host.Models.Instance")
645  .WithOne("WatchdogReattachInformation")
646  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
647  .OnDelete(DeleteBehavior.Cascade);
648  });
649 #pragma warning restore 612, 618
650  }
+
+
+ +

◆ Down()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.Down (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Unapplies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 126 of file 20180918204520_MYNullableAndForeignKeyCleanup.cs.

+
127  {
128  if (migrationBuilder == null)
129  throw new ArgumentNullException(nameof(migrationBuilder));
130 
131  migrationBuilder.DropForeignKey(
132  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
133  table: "TestMerges");
134 
135  migrationBuilder.DropForeignKey(
136  name: "FK_WatchdogReattachInformations_Instances_InstanceId",
137  table: "WatchdogReattachInformations");
138 
139  migrationBuilder.DropForeignKey(
140  name: "FK_CompileJobs_Jobs_JobId",
141  table: "CompileJobs");
142 
143  migrationBuilder.DropIndex(
144  name: "IX_WatchdogReattachInformations_InstanceId",
145  table: "WatchdogReattachInformations");
146 
147  migrationBuilder.DropIndex(
148  name: "IX_CompileJobs_JobId",
149  table: "CompileJobs");
150 
151  migrationBuilder.DropColumn(
152  name: "InstanceId",
153  table: "WatchdogReattachInformations");
154 
155  migrationBuilder.AlterColumn<long>(
156  name: "PrimaryRevisionInformationId",
157  table: "TestMerges",
158  nullable: true,
159  oldClrType: typeof(long));
160 
161  migrationBuilder.AddColumn<long>(
162  name: "WatchdogReattachInformationId",
163  table: "Instances",
164  nullable: true);
165 
166  migrationBuilder.AlterColumn<string>(
167  name: "Output",
168  table: "CompileJobs",
169  nullable: true,
170  oldClrType: typeof(string));
171 
172  migrationBuilder.AlterColumn<long>(
173  name: "JobId",
174  table: "CompileJobs",
175  nullable: true,
176  oldClrType: typeof(long));
177 
178  migrationBuilder.AlterColumn<string>(
179  name: "DmeName",
180  table: "CompileJobs",
181  nullable: true,
182  oldClrType: typeof(string));
183 
184  migrationBuilder.AlterColumn<Guid>(
185  name: "DirectoryName",
186  table: "CompileJobs",
187  nullable: true,
188  oldClrType: typeof(Guid));
189 
190  migrationBuilder.CreateIndex(
191  name: "IX_Instances_WatchdogReattachInformationId",
192  table: "Instances",
193  column: "WatchdogReattachInformationId");
194 
195  migrationBuilder.CreateIndex(
196  name: "IX_CompileJobs_JobId",
197  table: "CompileJobs",
198  column: "JobId");
199 
200  migrationBuilder.AddForeignKey(
201  name: "FK_CompileJobs_Jobs_JobId",
202  table: "CompileJobs",
203  column: "JobId",
204  principalTable: "Jobs",
205  principalColumn: "Id",
206  onDelete: ReferentialAction.Restrict);
207 
208  migrationBuilder.AddForeignKey(
209  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInfor~",
210  table: "Instances",
211  column: "WatchdogReattachInformationId",
212  principalTable: "WatchdogReattachInformations",
213  principalColumn: "Id",
214  onDelete: ReferentialAction.Restrict);
215 
216  migrationBuilder.AddForeignKey(
217  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
218  table: "TestMerges",
219  column: "PrimaryRevisionInformationId",
220  principalTable: "RevisionInformations",
221  principalColumn: "Id",
222  onDelete: ReferentialAction.SetNull);
223  }
+
+
+ +

◆ Up()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.Up (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Applies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 15 of file 20180918204520_MYNullableAndForeignKeyCleanup.cs.

+
16  {
17  if (migrationBuilder == null)
18  throw new ArgumentNullException(nameof(migrationBuilder));
19 
20  migrationBuilder.DropForeignKey(
21  name: "FK_Instances_WatchdogReattachInformations_WatchdogReattachInfor~",
22  table: "Instances");
23 
24  migrationBuilder.DropForeignKey(
25  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
26  table: "TestMerges");
27 
28  migrationBuilder.DropForeignKey(
29  name: "FK_CompileJobs_Jobs_JobId",
30  table: "CompileJobs");
31 
32  migrationBuilder.DropIndex(
33  name: "IX_Instances_WatchdogReattachInformationId",
34  table: "Instances");
35 
36  migrationBuilder.DropIndex(
37  name: "IX_CompileJobs_JobId",
38  table: "CompileJobs");
39 
40  migrationBuilder.DropColumn(
41  name: "WatchdogReattachInformationId",
42  table: "Instances");
43 
44  migrationBuilder.AddColumn<long>(
45  name: "InstanceId",
46  table: "WatchdogReattachInformations",
47  nullable: false,
48  defaultValue: 0L);
49 
50  migrationBuilder.AlterColumn<long>(
51  name: "PrimaryRevisionInformationId",
52  table: "TestMerges",
53  nullable: false,
54  oldClrType: typeof(long),
55  oldNullable: true);
56 
57  migrationBuilder.AlterColumn<string>(
58  name: "Output",
59  table: "CompileJobs",
60  nullable: false,
61  oldClrType: typeof(string),
62  oldNullable: true);
63 
64  migrationBuilder.AlterColumn<long>(
65  name: "JobId",
66  table: "CompileJobs",
67  nullable: false,
68  oldClrType: typeof(long),
69  oldNullable: true);
70 
71  migrationBuilder.AlterColumn<string>(
72  name: "DmeName",
73  table: "CompileJobs",
74  nullable: false,
75  oldClrType: typeof(string),
76  oldNullable: true);
77 
78  migrationBuilder.AlterColumn<Guid>(
79  name: "DirectoryName",
80  table: "CompileJobs",
81  nullable: false,
82  oldClrType: typeof(Guid),
83  oldNullable: true);
84 
85  migrationBuilder.CreateIndex(
86  name: "IX_WatchdogReattachInformations_InstanceId",
87  table: "WatchdogReattachInformations",
88  column: "InstanceId",
89  unique: true);
90 
91  migrationBuilder.CreateIndex(
92  name: "IX_CompileJobs_JobId",
93  table: "CompileJobs",
94  column: "JobId",
95  unique: true);
96 
97  migrationBuilder.AddForeignKey(
98  name: "FK_CompileJobs_Jobs_JobId",
99  table: "CompileJobs",
100  column: "JobId",
101  principalTable: "Jobs",
102  principalColumn: "Id",
103  onDelete: ReferentialAction.Restrict);
104 
105  migrationBuilder.AddForeignKey(
106  name: "FK_TestMerges_RevisionInformations_PrimaryRevisionInformationId",
107  table: "TestMerges",
108  column: "PrimaryRevisionInformationId",
109  principalTable: "RevisionInformations",
110  principalColumn: "Id",
111  onDelete: ReferentialAction.Restrict);
112 
113  migrationBuilder.AddForeignKey(
114  name: "FK_WatchdogReattachInformations_Instances_InstanceId",
115  table: "WatchdogReattachInformations",
116  column: "InstanceId",
117  principalTable: "Instances",
118  principalColumn: "Id",
119  onDelete: ReferentialAction.Cascade);
120  }
+
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.png new file mode 100644 index 0000000000000000000000000000000000000000..03b63ed83cc5269c4570bf88eb7e78c6b381c795 GIT binary patch literal 1133 zcmeAS@N?(olHy`uVBq!ia0y~yU_1b12XHV0$(^r4w*e`M0G|-o|Ns93nJ?aaE$u%v z0muU50|ySUcHWT(ayd$Z{DK*Pia_A%sSqOu2IfDWE{-7;jBn@OowV4BhwZj}=;wd^ zH5?D!H?>Y)xmU8##9N;wXTsHOHK#Y}cyH7>JxN&1Q%gltSv6piP%x9KrXif+FL-0! z=R(bsGTZr8G!6R&e{9=4UuEUviQndFekk2KZ~NtKAGXatK6mZIs=p!&&ucE6zTx}E z>O1e_kAM82$R@A-;mIwAxo3qmJnP%fdcA+Co4Ixt(CB|A-{nefK78@r`nX{Z@ipqIs7SBsP>0C7zxF#==7Y%aT``0ekGcWpa%-|l|F8{6~HVw;>Jm-^Ym3g69Z_OCj_C1ZV8l$e2&-Gx+EDz-r3dr|%_G|5e|wt^aZ6 z?$w_j2k%|D|B0!e{rGKb_3O#MJ(brO7ns};KN!0u@VoZ4$FHn-^9?r2HXFU)7P(!y z{9}G^pLF`m-H!_N&e?o1EMePopw{eG^RdzyY_FTdUNQJtyran}yP z7yE_XrOV8hXB=`f?qjn}kGfm*DvBp}zp%vXH^$~1C9cVO1s#7+1Z#vllAgggoh263(^S|EboHOl0Uh?}S^Q$NG zCO02QoaZlgE<*6#>07y5lE3pay%;LmwCO&*A3TT`su$yx+G285+Wkhutdm_SXr&dsS)E^;7OgRoT_;dn4BWKetI@ zO2=N2FWN`%6$$@)lQijB{7a^frWefby}vC~CH*#K)6NGqoOg{<%%{x0d*E$C*%PyW z8GJL&emJ%K^kHkZ|3aG;Z`?g2ZrdP}(pe$&e0^Jj)OV&>Rkk0Wfqc2=@7)XpEA%qK zvSQEm-3^2}0vMhwU|~{OhJ@2ZZ$xFgX0KiP#D3fC_;>T(1epQL1_n=8KbLh*2~7a+ CANnQ$ literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required-members.html new file mode 100644 index 0000000000..b10e991bf9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired, including all inherited members.

+ + + + +
BuildTargetModel(ModelBuilder modelBuilder)Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequiredprotected
Down(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequiredprotected
Up(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequiredprotected
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html new file mode 100644 index 0000000000..20f4626b5c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html @@ -0,0 +1,227 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired Class Reference
+
+
+ +

Marks the CompileJobs of ReattachInformations as non-nullable for MySQL/MariaDB + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired:
+
+
+ + +Migration + +
+ + + + + + + + + + + +

+Protected Member Functions

override void Up (MigrationBuilder migrationBuilder)
 Applies the migration More...
 
override void Down (MigrationBuilder migrationBuilder)
 Unapplies the migration More...
 
override void BuildTargetModel (ModelBuilder modelBuilder)
 Builds the target model More...
 
+

Detailed Description

+

Marks the CompileJobs of ReattachInformations as non-nullable for MySQL/MariaDB

+ +

Definition at line 9 of file 20180926034014_MYReattachCompileJobRequired.cs.

+

Member Function Documentation

+ +

◆ BuildTargetModel()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.BuildTargetModel (ModelBuilder modelBuilder)
+
+protected
+
+ +

Builds the target model

+
Parameters
+ + +
modelBuilderThe ModelBuilder to use
+
+
+ +

Definition at line 17 of file 20180926034014_MYReattachCompileJobRequired.Designer.cs.

+
18  {
19 #pragma warning disable 612, 618
20  modelBuilder
21  .HasAnnotation("ProductVersion", "2.1.3-rtm-32065")
22  .HasAnnotation("Relational:MaxIdentifierLength", 64);
23 
24  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
25  {
26  b.Property<long>("Id")
27  .ValueGeneratedOnAdd();
28 
29  b.Property<string>("ConnectionString")
30  .IsRequired();
31 
32  b.Property<bool?>("Enabled");
33 
34  b.Property<long>("InstanceId");
35 
36  b.Property<string>("Name")
37  .IsRequired();
38 
39  b.Property<int?>("Provider");
40 
41  b.HasKey("Id");
42 
43  b.HasIndex("InstanceId");
44 
45  b.HasIndex("Name")
46  .IsUnique();
47 
48  b.ToTable("ChatBots");
49  });
50 
51  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
52  {
53  b.Property<long>("Id")
54  .ValueGeneratedOnAdd();
55 
56  b.Property<long>("ChatSettingsId");
57 
58  b.Property<ulong?>("DiscordChannelId");
59 
60  b.Property<string>("IrcChannel");
61 
62  b.Property<bool?>("IsAdminChannel")
63  .IsRequired();
64 
65  b.Property<bool?>("IsUpdatesChannel")
66  .IsRequired();
67 
68  b.Property<bool?>("IsWatchdogChannel")
69  .IsRequired();
70 
71  b.Property<string>("Tag");
72 
73  b.HasKey("Id");
74 
75  b.HasIndex("ChatSettingsId", "DiscordChannelId")
76  .IsUnique();
77 
78  b.HasIndex("ChatSettingsId", "IrcChannel")
79  .IsUnique();
80 
81  b.ToTable("ChatChannels");
82  });
83 
84  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
85  {
86  b.Property<long>("Id")
87  .ValueGeneratedOnAdd();
88 
89  b.Property<string>("ByondVersion")
90  .IsRequired();
91 
92  b.Property<Guid?>("DirectoryName")
93  .IsRequired();
94 
95  b.Property<string>("DmeName")
96  .IsRequired();
97 
98  b.Property<long>("JobId");
99 
100  b.Property<int>("MinimumSecurityLevel");
101 
102  b.Property<string>("Output")
103  .IsRequired();
104 
105  b.Property<long>("RevisionInformationId");
106 
107  b.HasKey("Id");
108 
109  b.HasIndex("DirectoryName");
110 
111  b.HasIndex("JobId")
112  .IsUnique();
113 
114  b.HasIndex("RevisionInformationId");
115 
116  b.ToTable("CompileJobs");
117  });
118 
119  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
120  {
121  b.Property<long>("Id")
122  .ValueGeneratedOnAdd();
123 
124  b.Property<string>("AccessToken");
125 
126  b.Property<bool?>("AllowWebClient")
127  .IsRequired();
128 
129  b.Property<bool?>("AutoStart")
130  .IsRequired();
131 
132  b.Property<long>("InstanceId");
133 
134  b.Property<ushort?>("PrimaryPort")
135  .IsRequired();
136 
137  b.Property<int?>("ProcessId");
138 
139  b.Property<ushort?>("SecondaryPort")
140  .IsRequired();
141 
142  b.Property<int>("SecurityLevel");
143 
144  b.Property<bool?>("SoftRestart")
145  .IsRequired();
146 
147  b.Property<bool?>("SoftShutdown")
148  .IsRequired();
149 
150  b.Property<uint?>("StartupTimeout")
151  .IsRequired();
152 
153  b.HasKey("Id");
154 
155  b.HasIndex("InstanceId")
156  .IsUnique();
157 
158  b.ToTable("DreamDaemonSettings");
159  });
160 
161  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
162  {
163  b.Property<long>("Id")
164  .ValueGeneratedOnAdd();
165 
166  b.Property<ushort?>("ApiValidationPort")
167  .IsRequired();
168 
169  b.Property<int>("ApiValidationSecurityLevel");
170 
171  b.Property<long>("InstanceId");
172 
173  b.Property<string>("ProjectName");
174 
175  b.HasKey("Id");
176 
177  b.HasIndex("InstanceId")
178  .IsUnique();
179 
180  b.ToTable("DreamMakerSettings");
181  });
182 
183  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
184  {
185  b.Property<long>("Id")
186  .ValueGeneratedOnAdd();
187 
188  b.Property<uint?>("AutoUpdateInterval")
189  .IsRequired();
190 
191  b.Property<int>("ConfigurationType");
192 
193  b.Property<string>("Name")
194  .IsRequired();
195 
196  b.Property<bool?>("Online")
197  .IsRequired();
198 
199  b.Property<string>("Path")
200  .IsRequired();
201 
202  b.HasKey("Id");
203 
204  b.HasIndex("Path")
205  .IsUnique();
206 
207  b.ToTable("Instances");
208  });
209 
210  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
211  {
212  b.Property<long>("Id")
213  .ValueGeneratedOnAdd();
214 
215  b.Property<ulong>("ByondRights");
216 
217  b.Property<ulong>("ChatBotRights");
218 
219  b.Property<ulong>("ConfigurationRights");
220 
221  b.Property<ulong>("DreamDaemonRights");
222 
223  b.Property<ulong>("DreamMakerRights");
224 
225  b.Property<long>("InstanceId");
226 
227  b.Property<ulong>("InstanceUserRights");
228 
229  b.Property<ulong>("RepositoryRights");
230 
231  b.Property<long?>("UserId")
232  .IsRequired();
233 
234  b.HasKey("Id");
235 
236  b.HasIndex("InstanceId");
237 
238  b.HasIndex("UserId", "InstanceId")
239  .IsUnique();
240 
241  b.ToTable("InstanceUsers");
242  });
243 
244  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
245  {
246  b.Property<long>("Id")
247  .ValueGeneratedOnAdd();
248 
249  b.Property<ulong?>("CancelRight");
250 
251  b.Property<ulong?>("CancelRightsType");
252 
253  b.Property<bool?>("Cancelled")
254  .IsRequired();
255 
256  b.Property<long?>("CancelledById");
257 
258  b.Property<string>("Description")
259  .IsRequired();
260 
261  b.Property<string>("ExceptionDetails");
262 
263  b.Property<long>("InstanceId");
264 
265  b.Property<DateTimeOffset?>("StartedAt")
266  .IsRequired();
267 
268  b.Property<long>("StartedById");
269 
270  b.Property<DateTimeOffset?>("StoppedAt");
271 
272  b.HasKey("Id");
273 
274  b.HasIndex("CancelledById");
275 
276  b.HasIndex("InstanceId");
277 
278  b.HasIndex("StartedById");
279 
280  b.ToTable("Jobs");
281  });
282 
283  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
284  {
285  b.Property<long>("Id")
286  .ValueGeneratedOnAdd();
287 
288  b.Property<string>("AccessIdentifier")
289  .IsRequired();
290 
291  b.Property<string>("ChatChannelsJson")
292  .IsRequired();
293 
294  b.Property<string>("ChatCommandsJson")
295  .IsRequired();
296 
297  b.Property<long>("CompileJobId");
298 
299  b.Property<bool>("IsPrimary");
300 
301  b.Property<ushort>("Port");
302 
303  b.Property<int>("ProcessId");
304 
305  b.Property<int>("RebootState");
306 
307  b.Property<string>("ServerCommandsJson")
308  .IsRequired();
309 
310  b.HasKey("Id");
311 
312  b.HasIndex("CompileJobId");
313 
314  b.ToTable("ReattachInformations");
315  });
316 
317  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
318  {
319  b.Property<long>("Id")
320  .ValueGeneratedOnAdd();
321 
322  b.Property<string>("AccessToken");
323 
324  b.Property<string>("AccessUser");
325 
326  b.Property<bool?>("AutoUpdatesKeepTestMerges")
327  .IsRequired();
328 
329  b.Property<bool?>("AutoUpdatesSynchronize")
330  .IsRequired();
331 
332  b.Property<string>("CommitterEmail")
333  .IsRequired();
334 
335  b.Property<string>("CommitterName")
336  .IsRequired();
337 
338  b.Property<long>("InstanceId");
339 
340  b.Property<bool?>("PushTestMergeCommits")
341  .IsRequired();
342 
343  b.Property<bool?>("ShowTestMergeCommitters")
344  .IsRequired();
345 
346  b.HasKey("Id");
347 
348  b.HasIndex("InstanceId")
349  .IsUnique();
350 
351  b.ToTable("RepositorySettings");
352  });
353 
354  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
355  {
356  b.Property<long>("Id")
357  .ValueGeneratedOnAdd();
358 
359  b.Property<long>("RevisionInformationId");
360 
361  b.Property<long>("TestMergeId");
362 
363  b.HasKey("Id");
364 
365  b.HasIndex("RevisionInformationId");
366 
367  b.HasIndex("TestMergeId");
368 
369  b.ToTable("RevInfoTestMerges");
370  });
371 
372  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
373  {
374  b.Property<long>("Id")
375  .ValueGeneratedOnAdd();
376 
377  b.Property<string>("CommitSha")
378  .IsRequired()
379  .HasMaxLength(40);
380 
381  b.Property<long>("InstanceId");
382 
383  b.Property<string>("OriginCommitSha")
384  .IsRequired()
385  .HasMaxLength(40);
386 
387  b.HasKey("Id");
388 
389  b.HasIndex("CommitSha")
390  .IsUnique();
391 
392  b.HasIndex("InstanceId");
393 
394  b.ToTable("RevisionInformations");
395  });
396 
397  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
398  {
399  b.Property<long>("Id")
400  .ValueGeneratedOnAdd();
401 
402  b.Property<string>("Author")
403  .IsRequired();
404 
405  b.Property<string>("BodyAtMerge")
406  .IsRequired();
407 
408  b.Property<string>("Comment");
409 
410  b.Property<DateTimeOffset>("MergedAt");
411 
412  b.Property<long>("MergedById");
413 
414  b.Property<int?>("Number")
415  .IsRequired();
416 
417  b.Property<long?>("PrimaryRevisionInformationId")
418  .IsRequired();
419 
420  b.Property<string>("PullRequestRevision")
421  .IsRequired();
422 
423  b.Property<string>("TitleAtMerge")
424  .IsRequired();
425 
426  b.Property<string>("Url")
427  .IsRequired();
428 
429  b.HasKey("Id");
430 
431  b.HasIndex("MergedById");
432 
433  b.HasIndex("PrimaryRevisionInformationId")
434  .IsUnique();
435 
436  b.ToTable("TestMerges");
437  });
438 
439  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
440  {
441  b.Property<long>("Id")
442  .ValueGeneratedOnAdd();
443 
444  b.Property<ulong>("AdministrationRights");
445 
446  b.Property<string>("CanonicalName")
447  .IsRequired();
448 
449  b.Property<DateTimeOffset?>("CreatedAt")
450  .IsRequired();
451 
452  b.Property<long?>("CreatedById");
453 
454  b.Property<bool?>("Enabled")
455  .IsRequired();
456 
457  b.Property<ulong>("InstanceManagerRights");
458 
459  b.Property<DateTimeOffset?>("LastPasswordUpdate");
460 
461  b.Property<string>("Name")
462  .IsRequired();
463 
464  b.Property<string>("PasswordHash");
465 
466  b.Property<string>("SystemIdentifier");
467 
468  b.HasKey("Id");
469 
470  b.HasIndex("CanonicalName")
471  .IsUnique();
472 
473  b.HasIndex("CreatedById");
474 
475  b.ToTable("Users");
476  });
477 
478  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
479  {
480  b.Property<long>("Id")
481  .ValueGeneratedOnAdd();
482 
483  b.Property<long?>("AlphaId");
484 
485  b.Property<bool>("AlphaIsActive");
486 
487  b.Property<long?>("BravoId");
488 
489  b.Property<long>("InstanceId");
490 
491  b.HasKey("Id");
492 
493  b.HasIndex("AlphaId");
494 
495  b.HasIndex("BravoId");
496 
497  b.HasIndex("InstanceId")
498  .IsUnique();
499 
500  b.ToTable("WatchdogReattachInformations");
501  });
502 
503  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
504  {
505  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
506  .WithMany("ChatSettings")
507  .HasForeignKey("InstanceId")
508  .OnDelete(DeleteBehavior.Cascade);
509  });
510 
511  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
512  {
513  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
514  .WithMany("Channels")
515  .HasForeignKey("ChatSettingsId")
516  .OnDelete(DeleteBehavior.Cascade);
517  });
518 
519  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
520  {
521  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
522  .WithOne()
523  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
524  .OnDelete(DeleteBehavior.Restrict);
525 
526  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
527  .WithMany("CompileJobs")
528  .HasForeignKey("RevisionInformationId")
529  .OnDelete(DeleteBehavior.Cascade);
530  });
531 
532  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
533  {
534  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
535  .WithOne("DreamDaemonSettings")
536  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
537  .OnDelete(DeleteBehavior.Cascade);
538  });
539 
540  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
541  {
542  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
543  .WithOne("DreamMakerSettings")
544  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
545  .OnDelete(DeleteBehavior.Cascade);
546  });
547 
548  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
549  {
550  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
551  .WithMany("InstanceUsers")
552  .HasForeignKey("InstanceId")
553  .OnDelete(DeleteBehavior.Cascade);
554 
555  b.HasOne("Tgstation.Server.Host.Models.User")
556  .WithMany("InstanceUsers")
557  .HasForeignKey("UserId")
558  .OnDelete(DeleteBehavior.Cascade);
559  });
560 
561  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
562  {
563  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
564  .WithMany()
565  .HasForeignKey("CancelledById");
566 
567  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
568  .WithMany("Jobs")
569  .HasForeignKey("InstanceId")
570  .OnDelete(DeleteBehavior.Cascade);
571 
572  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
573  .WithMany()
574  .HasForeignKey("StartedById")
575  .OnDelete(DeleteBehavior.Cascade);
576  });
577 
578  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
579  {
580  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
581  .WithMany()
582  .HasForeignKey("CompileJobId")
583  .OnDelete(DeleteBehavior.Cascade);
584  });
585 
586  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
587  {
588  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
589  .WithOne("RepositorySettings")
590  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
591  .OnDelete(DeleteBehavior.Cascade);
592  });
593 
594  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
595  {
596  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
597  .WithMany("ActiveTestMerges")
598  .HasForeignKey("RevisionInformationId")
599  .OnDelete(DeleteBehavior.Cascade);
600 
601  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
602  .WithMany("RevisonInformations")
603  .HasForeignKey("TestMergeId")
604  .OnDelete(DeleteBehavior.Cascade);
605  });
606 
607  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
608  {
609  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
610  .WithMany("RevisionInformations")
611  .HasForeignKey("InstanceId")
612  .OnDelete(DeleteBehavior.Cascade);
613  });
614 
615  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
616  {
617  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
618  .WithMany("TestMerges")
619  .HasForeignKey("MergedById")
620  .OnDelete(DeleteBehavior.Restrict);
621 
622  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
623  .WithOne("PrimaryTestMerge")
624  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
625  .OnDelete(DeleteBehavior.Restrict);
626  });
627 
628  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
629  {
630  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
631  .WithMany("CreatedUsers")
632  .HasForeignKey("CreatedById");
633  });
634 
635  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
636  {
637  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
638  .WithMany()
639  .HasForeignKey("AlphaId");
640 
641  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
642  .WithMany()
643  .HasForeignKey("BravoId");
644 
645  b.HasOne("Tgstation.Server.Host.Models.Instance")
646  .WithOne("WatchdogReattachInformation")
647  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
648  .OnDelete(DeleteBehavior.Cascade);
649  });
650 #pragma warning restore 612, 618
651  }
+
+
+ +

◆ Down()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.Down (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Unapplies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 44 of file 20180926034014_MYReattachCompileJobRequired.cs.

+
45  {
46  if (migrationBuilder == null)
47  throw new ArgumentNullException(nameof(migrationBuilder));
48 
49  migrationBuilder.DropForeignKey(
50  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
51  table: "ReattachInformations");
52 
53  migrationBuilder.AlterColumn<long>(
54  name: "CompileJobId",
55  table: "ReattachInformations",
56  nullable: true,
57  oldClrType: typeof(long));
58 
59  migrationBuilder.AddForeignKey(
60  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
61  table: "ReattachInformations",
62  column: "CompileJobId",
63  principalTable: "CompileJobs",
64  principalColumn: "Id",
65  onDelete: ReferentialAction.Restrict);
66  }
+
+
+ +

◆ Up()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.Up (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Applies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 15 of file 20180926034014_MYReattachCompileJobRequired.cs.

+
16  {
17  if (migrationBuilder == null)
18  throw new ArgumentNullException(nameof(migrationBuilder));
19 
20  migrationBuilder.DropForeignKey(
21  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
22  table: "ReattachInformations");
23 
24  migrationBuilder.AlterColumn<long>(
25  name: "CompileJobId",
26  table: "ReattachInformations",
27  nullable: false,
28  oldClrType: typeof(long),
29  oldNullable: true);
30 
31  migrationBuilder.AddForeignKey(
32  name: "FK_ReattachInformations_CompileJobs_CompileJobId",
33  table: "ReattachInformations",
34  column: "CompileJobId",
35  principalTable: "CompileJobs",
36  principalColumn: "Id",
37  onDelete: ReferentialAction.Cascade);
38  }
+
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.png new file mode 100644 index 0000000000000000000000000000000000000000..3abf6ff439563486d2ebf875378659c42438788b GIT binary patch literal 1105 zcmeAS@N?(olHy`uVBq!ia0y~yU|bJm2XHV0$(d|i-atwsz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opfhd$dvaTDG{+4U&527GmgswSIsclp!~)K6`5t;} zubr3C^-s+zN0s-icRp4*c}bu8$*O7Vzh8d6@BX*ct?JjN*gk%3xnuv2--(}#W0r3- z-W&ThIVZ9IbLmAseRcg>&r9~n(=TLO&e^l=z!z1|`$ukFFR}NDpY(-a@+{DzUtxP@ zZr9x{zwi3JnU8F|f_xVJo}}WRBR{F+_~x3U@%BLa@U`n3-+EqhuDn;L;dx%Q)-y=v z(sY%hiZI5*r`fl+>E7Iy+s$x5_$Q+WgVTh442M2^o_vU55twyp>LG?EAWLcDHikz) znx^8$y z=XzUyk>bFN=_ens9{p0PN8mw&mo-H%VT@0}m4HkRw_ zm?zklq_=sFn(3FvrK^5N=+x}&-5Y8(%itK-g@;aw{wFGhh2x!{+?knO^RrB>aGq%X z_Rj{AOm7z7Wk0cZz50(DqaSK_WujV&-ky$FVHo#QN^1StTT4#p&O7_FOMI$7xxdbiP}|mKcfKZn*Y~eK|IGURipluq@^|Of-{kwT`pos8 zrSG$&YF@oQ{Bx_#$C%~$U3C`w-!%QIsf%sDSNh~FXLuH)%=4!8=HbEKMVEhSUGlrS z&g;71{)Io!r0=@RKYj1snbB!&TOZ1NjZu8D>a|;*$jtKSxhJ#w`||cY-!JPgz36-D zdF2L&n!x`5{^50j+rFok8#KIse!A+<^xCVU90D!xUwyp)jdcP;jp|Eo1wLe~4^3Ar b|Co=TjEQ~SJi!^5{~0`8{an^LB{Ts5FnvF4 literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments-members.html new file mode 100644 index 0000000000..23c771bd9c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments, including all inherited members.

+ + + + +
BuildTargetModel(ModelBuilder modelBuilder)Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeCommentsprotected
Down(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeCommentsprotected
Up(MigrationBuilder migrationBuilder)Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeCommentsprotected
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.html new file mode 100644 index 0000000000..bac57a3878 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.html @@ -0,0 +1,227 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments Class Reference
+
+
+ +

Add the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MySQL/MariaDB + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments:
+
+
+ + +Migration + +
+ + + + + + + + + + + +

+Protected Member Functions

override void Up (MigrationBuilder migrationBuilder)
 Applies the migration More...
 
override void Down (MigrationBuilder migrationBuilder)
 Unapplies the migration More...
 
override void BuildTargetModel (ModelBuilder modelBuilder)
 Builds the target model More...
 
+

Detailed Description

+

Member Function Documentation

+ +

◆ BuildTargetModel()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments.BuildTargetModel (ModelBuilder modelBuilder)
+
+protected
+
+ +

Builds the target model

+
Parameters
+ + +
modelBuilderThe ModelBuilder to use
+
+
+ +

Definition at line 17 of file 20181124231549_MYToggleTestmergeComments.Designer.cs.

+
18  {
19 #pragma warning disable 612, 618
20  modelBuilder
21  .HasAnnotation("ProductVersion", "2.1.4-rtm-31024")
22  .HasAnnotation("Relational:MaxIdentifierLength", 64);
23 
24  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
25  {
26  b.Property<long>("Id")
27  .ValueGeneratedOnAdd();
28 
29  b.Property<string>("ConnectionString")
30  .IsRequired();
31 
32  b.Property<bool?>("Enabled");
33 
34  b.Property<long>("InstanceId");
35 
36  b.Property<string>("Name")
37  .IsRequired();
38 
39  b.Property<int?>("Provider");
40 
41  b.HasKey("Id");
42 
43  b.HasIndex("InstanceId");
44 
45  b.HasIndex("Name")
46  .IsUnique();
47 
48  b.ToTable("ChatBots");
49  });
50 
51  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
52  {
53  b.Property<long>("Id")
54  .ValueGeneratedOnAdd();
55 
56  b.Property<long>("ChatSettingsId");
57 
58  b.Property<ulong?>("DiscordChannelId");
59 
60  b.Property<string>("IrcChannel");
61 
62  b.Property<bool?>("IsAdminChannel")
63  .IsRequired();
64 
65  b.Property<bool?>("IsUpdatesChannel")
66  .IsRequired();
67 
68  b.Property<bool?>("IsWatchdogChannel")
69  .IsRequired();
70 
71  b.Property<string>("Tag");
72 
73  b.HasKey("Id");
74 
75  b.HasIndex("ChatSettingsId", "DiscordChannelId")
76  .IsUnique();
77 
78  b.HasIndex("ChatSettingsId", "IrcChannel")
79  .IsUnique();
80 
81  b.ToTable("ChatChannels");
82  });
83 
84  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
85  {
86  b.Property<long>("Id")
87  .ValueGeneratedOnAdd();
88 
89  b.Property<string>("ByondVersion")
90  .IsRequired();
91 
92  b.Property<Guid?>("DirectoryName")
93  .IsRequired();
94 
95  b.Property<string>("DmeName")
96  .IsRequired();
97 
98  b.Property<long>("JobId");
99 
100  b.Property<int>("MinimumSecurityLevel");
101 
102  b.Property<string>("Output")
103  .IsRequired();
104 
105  b.Property<long>("RevisionInformationId");
106 
107  b.HasKey("Id");
108 
109  b.HasIndex("DirectoryName");
110 
111  b.HasIndex("JobId")
112  .IsUnique();
113 
114  b.HasIndex("RevisionInformationId");
115 
116  b.ToTable("CompileJobs");
117  });
118 
119  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
120  {
121  b.Property<long>("Id")
122  .ValueGeneratedOnAdd();
123 
124  b.Property<string>("AccessToken");
125 
126  b.Property<bool?>("AllowWebClient")
127  .IsRequired();
128 
129  b.Property<bool?>("AutoStart")
130  .IsRequired();
131 
132  b.Property<long>("InstanceId");
133 
134  b.Property<ushort?>("PrimaryPort")
135  .IsRequired();
136 
137  b.Property<int?>("ProcessId");
138 
139  b.Property<ushort?>("SecondaryPort")
140  .IsRequired();
141 
142  b.Property<int>("SecurityLevel");
143 
144  b.Property<bool?>("SoftRestart")
145  .IsRequired();
146 
147  b.Property<bool?>("SoftShutdown")
148  .IsRequired();
149 
150  b.Property<uint?>("StartupTimeout")
151  .IsRequired();
152 
153  b.HasKey("Id");
154 
155  b.HasIndex("InstanceId")
156  .IsUnique();
157 
158  b.ToTable("DreamDaemonSettings");
159  });
160 
161  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
162  {
163  b.Property<long>("Id")
164  .ValueGeneratedOnAdd();
165 
166  b.Property<ushort?>("ApiValidationPort")
167  .IsRequired();
168 
169  b.Property<int>("ApiValidationSecurityLevel");
170 
171  b.Property<long>("InstanceId");
172 
173  b.Property<string>("ProjectName");
174 
175  b.HasKey("Id");
176 
177  b.HasIndex("InstanceId")
178  .IsUnique();
179 
180  b.ToTable("DreamMakerSettings");
181  });
182 
183  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
184  {
185  b.Property<long>("Id")
186  .ValueGeneratedOnAdd();
187 
188  b.Property<uint?>("AutoUpdateInterval")
189  .IsRequired();
190 
191  b.Property<int>("ConfigurationType");
192 
193  b.Property<string>("Name")
194  .IsRequired();
195 
196  b.Property<bool?>("Online")
197  .IsRequired();
198 
199  b.Property<string>("Path")
200  .IsRequired();
201 
202  b.HasKey("Id");
203 
204  b.HasIndex("Path")
205  .IsUnique();
206 
207  b.ToTable("Instances");
208  });
209 
210  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
211  {
212  b.Property<long>("Id")
213  .ValueGeneratedOnAdd();
214 
215  b.Property<ulong>("ByondRights");
216 
217  b.Property<ulong>("ChatBotRights");
218 
219  b.Property<ulong>("ConfigurationRights");
220 
221  b.Property<ulong>("DreamDaemonRights");
222 
223  b.Property<ulong>("DreamMakerRights");
224 
225  b.Property<long>("InstanceId");
226 
227  b.Property<ulong>("InstanceUserRights");
228 
229  b.Property<ulong>("RepositoryRights");
230 
231  b.Property<long?>("UserId")
232  .IsRequired();
233 
234  b.HasKey("Id");
235 
236  b.HasIndex("InstanceId");
237 
238  b.HasIndex("UserId", "InstanceId")
239  .IsUnique();
240 
241  b.ToTable("InstanceUsers");
242  });
243 
244  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
245  {
246  b.Property<long>("Id")
247  .ValueGeneratedOnAdd();
248 
249  b.Property<ulong?>("CancelRight");
250 
251  b.Property<ulong?>("CancelRightsType");
252 
253  b.Property<bool?>("Cancelled")
254  .IsRequired();
255 
256  b.Property<long?>("CancelledById");
257 
258  b.Property<string>("Description")
259  .IsRequired();
260 
261  b.Property<string>("ExceptionDetails");
262 
263  b.Property<long>("InstanceId");
264 
265  b.Property<DateTimeOffset?>("StartedAt")
266  .IsRequired();
267 
268  b.Property<long>("StartedById");
269 
270  b.Property<DateTimeOffset?>("StoppedAt");
271 
272  b.HasKey("Id");
273 
274  b.HasIndex("CancelledById");
275 
276  b.HasIndex("InstanceId");
277 
278  b.HasIndex("StartedById");
279 
280  b.ToTable("Jobs");
281  });
282 
283  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
284  {
285  b.Property<long>("Id")
286  .ValueGeneratedOnAdd();
287 
288  b.Property<string>("AccessIdentifier")
289  .IsRequired();
290 
291  b.Property<string>("ChatChannelsJson")
292  .IsRequired();
293 
294  b.Property<string>("ChatCommandsJson")
295  .IsRequired();
296 
297  b.Property<long>("CompileJobId");
298 
299  b.Property<bool>("IsPrimary");
300 
301  b.Property<ushort>("Port");
302 
303  b.Property<int>("ProcessId");
304 
305  b.Property<int>("RebootState");
306 
307  b.Property<string>("ServerCommandsJson")
308  .IsRequired();
309 
310  b.HasKey("Id");
311 
312  b.HasIndex("CompileJobId");
313 
314  b.ToTable("ReattachInformations");
315  });
316 
317  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
318  {
319  b.Property<long>("Id")
320  .ValueGeneratedOnAdd();
321 
322  b.Property<string>("AccessToken");
323 
324  b.Property<string>("AccessUser");
325 
326  b.Property<bool?>("AutoUpdatesKeepTestMerges")
327  .IsRequired();
328 
329  b.Property<bool?>("AutoUpdatesSynchronize")
330  .IsRequired();
331 
332  b.Property<string>("CommitterEmail")
333  .IsRequired();
334 
335  b.Property<string>("CommitterName")
336  .IsRequired();
337 
338  b.Property<long>("InstanceId");
339 
340  b.Property<bool?>("PostTestMergeComment")
341  .IsRequired();
342 
343  b.Property<bool?>("PushTestMergeCommits")
344  .IsRequired();
345 
346  b.Property<bool?>("ShowTestMergeCommitters")
347  .IsRequired();
348 
349  b.HasKey("Id");
350 
351  b.HasIndex("InstanceId")
352  .IsUnique();
353 
354  b.ToTable("RepositorySettings");
355  });
356 
357  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
358  {
359  b.Property<long>("Id")
360  .ValueGeneratedOnAdd();
361 
362  b.Property<long>("RevisionInformationId");
363 
364  b.Property<long>("TestMergeId");
365 
366  b.HasKey("Id");
367 
368  b.HasIndex("RevisionInformationId");
369 
370  b.HasIndex("TestMergeId");
371 
372  b.ToTable("RevInfoTestMerges");
373  });
374 
375  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
376  {
377  b.Property<long>("Id")
378  .ValueGeneratedOnAdd();
379 
380  b.Property<string>("CommitSha")
381  .IsRequired()
382  .HasMaxLength(40);
383 
384  b.Property<long>("InstanceId");
385 
386  b.Property<string>("OriginCommitSha")
387  .IsRequired()
388  .HasMaxLength(40);
389 
390  b.HasKey("Id");
391 
392  b.HasIndex("CommitSha")
393  .IsUnique();
394 
395  b.HasIndex("InstanceId");
396 
397  b.ToTable("RevisionInformations");
398  });
399 
400  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
401  {
402  b.Property<long>("Id")
403  .ValueGeneratedOnAdd();
404 
405  b.Property<string>("Author")
406  .IsRequired();
407 
408  b.Property<string>("BodyAtMerge")
409  .IsRequired();
410 
411  b.Property<string>("Comment");
412 
413  b.Property<DateTimeOffset>("MergedAt");
414 
415  b.Property<long>("MergedById");
416 
417  b.Property<int?>("Number")
418  .IsRequired();
419 
420  b.Property<long?>("PrimaryRevisionInformationId")
421  .IsRequired();
422 
423  b.Property<string>("PullRequestRevision")
424  .IsRequired();
425 
426  b.Property<string>("TitleAtMerge")
427  .IsRequired();
428 
429  b.Property<string>("Url")
430  .IsRequired();
431 
432  b.HasKey("Id");
433 
434  b.HasIndex("MergedById");
435 
436  b.HasIndex("PrimaryRevisionInformationId")
437  .IsUnique();
438 
439  b.ToTable("TestMerges");
440  });
441 
442  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
443  {
444  b.Property<long>("Id")
445  .ValueGeneratedOnAdd();
446 
447  b.Property<ulong>("AdministrationRights");
448 
449  b.Property<string>("CanonicalName")
450  .IsRequired();
451 
452  b.Property<DateTimeOffset?>("CreatedAt")
453  .IsRequired();
454 
455  b.Property<long?>("CreatedById");
456 
457  b.Property<bool?>("Enabled")
458  .IsRequired();
459 
460  b.Property<ulong>("InstanceManagerRights");
461 
462  b.Property<DateTimeOffset?>("LastPasswordUpdate");
463 
464  b.Property<string>("Name")
465  .IsRequired();
466 
467  b.Property<string>("PasswordHash");
468 
469  b.Property<string>("SystemIdentifier");
470 
471  b.HasKey("Id");
472 
473  b.HasIndex("CanonicalName")
474  .IsUnique();
475 
476  b.HasIndex("CreatedById");
477 
478  b.ToTable("Users");
479  });
480 
481  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
482  {
483  b.Property<long>("Id")
484  .ValueGeneratedOnAdd();
485 
486  b.Property<long?>("AlphaId");
487 
488  b.Property<bool>("AlphaIsActive");
489 
490  b.Property<long?>("BravoId");
491 
492  b.Property<long>("InstanceId");
493 
494  b.HasKey("Id");
495 
496  b.HasIndex("AlphaId");
497 
498  b.HasIndex("BravoId");
499 
500  b.HasIndex("InstanceId")
501  .IsUnique();
502 
503  b.ToTable("WatchdogReattachInformations");
504  });
505 
506  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
507  {
508  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
509  .WithMany("ChatSettings")
510  .HasForeignKey("InstanceId")
511  .OnDelete(DeleteBehavior.Cascade);
512  });
513 
514  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
515  {
516  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
517  .WithMany("Channels")
518  .HasForeignKey("ChatSettingsId")
519  .OnDelete(DeleteBehavior.Cascade);
520  });
521 
522  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
523  {
524  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
525  .WithOne()
526  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
527  .OnDelete(DeleteBehavior.Restrict);
528 
529  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
530  .WithMany("CompileJobs")
531  .HasForeignKey("RevisionInformationId")
532  .OnDelete(DeleteBehavior.Cascade);
533  });
534 
535  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
536  {
537  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
538  .WithOne("DreamDaemonSettings")
539  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
540  .OnDelete(DeleteBehavior.Cascade);
541  });
542 
543  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
544  {
545  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
546  .WithOne("DreamMakerSettings")
547  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
548  .OnDelete(DeleteBehavior.Cascade);
549  });
550 
551  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
552  {
553  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
554  .WithMany("InstanceUsers")
555  .HasForeignKey("InstanceId")
556  .OnDelete(DeleteBehavior.Cascade);
557 
558  b.HasOne("Tgstation.Server.Host.Models.User")
559  .WithMany("InstanceUsers")
560  .HasForeignKey("UserId")
561  .OnDelete(DeleteBehavior.Cascade);
562  });
563 
564  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
565  {
566  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
567  .WithMany()
568  .HasForeignKey("CancelledById");
569 
570  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
571  .WithMany("Jobs")
572  .HasForeignKey("InstanceId")
573  .OnDelete(DeleteBehavior.Cascade);
574 
575  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
576  .WithMany()
577  .HasForeignKey("StartedById")
578  .OnDelete(DeleteBehavior.Cascade);
579  });
580 
581  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
582  {
583  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
584  .WithMany()
585  .HasForeignKey("CompileJobId")
586  .OnDelete(DeleteBehavior.Cascade);
587  });
588 
589  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
590  {
591  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
592  .WithOne("RepositorySettings")
593  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
594  .OnDelete(DeleteBehavior.Cascade);
595  });
596 
597  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
598  {
599  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
600  .WithMany("ActiveTestMerges")
601  .HasForeignKey("RevisionInformationId")
602  .OnDelete(DeleteBehavior.Cascade);
603 
604  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
605  .WithMany("RevisonInformations")
606  .HasForeignKey("TestMergeId")
607  .OnDelete(DeleteBehavior.Cascade);
608  });
609 
610  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
611  {
612  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
613  .WithMany("RevisionInformations")
614  .HasForeignKey("InstanceId")
615  .OnDelete(DeleteBehavior.Cascade);
616  });
617 
618  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
619  {
620  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
621  .WithMany("TestMerges")
622  .HasForeignKey("MergedById")
623  .OnDelete(DeleteBehavior.Restrict);
624 
625  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
626  .WithOne("PrimaryTestMerge")
627  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
628  .OnDelete(DeleteBehavior.Restrict);
629  });
630 
631  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
632  {
633  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
634  .WithMany("CreatedUsers")
635  .HasForeignKey("CreatedById");
636  });
637 
638  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
639  {
640  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
641  .WithMany()
642  .HasForeignKey("AlphaId");
643 
644  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
645  .WithMany()
646  .HasForeignKey("BravoId");
647 
648  b.HasOne("Tgstation.Server.Host.Models.Instance")
649  .WithOne("WatchdogReattachInformation")
650  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
651  .OnDelete(DeleteBehavior.Cascade);
652  });
653 #pragma warning restore 612, 618
654  }
+
+
+ +

◆ Down()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments.Down (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Unapplies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 31 of file 20181124231549_MYToggleTestmergeComments.cs.

+
32  {
33  if (migrationBuilder == null)
34  throw new ArgumentNullException(nameof(migrationBuilder));
35 
36  migrationBuilder.DropColumn(
37  name: "PostTestMergeComment",
38  table: "RepositorySettings");
39  }
+
+
+ +

◆ Up()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments.Up (MigrationBuilder migrationBuilder)
+
+protected
+
+ +

Applies the migration

+
Parameters
+ + +
migrationBuilderThe MigrationBuilder to use
+
+
+ +

Definition at line 15 of file 20181124231549_MYToggleTestmergeComments.cs.

+
16  {
17  if (migrationBuilder == null)
18  throw new ArgumentNullException(nameof(migrationBuilder));
19 
20  migrationBuilder.AddColumn<bool>(
21  name: "PostTestMergeComment",
22  table: "RepositorySettings",
23  nullable: false,
24  defaultValue: true);
25  }
+
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.png new file mode 100644 index 0000000000000000000000000000000000000000..694a45aa659de782421ded5c0f8fd1e4bd6d50dc GIT binary patch literal 1105 zcmeAS@N?(olHy`uVBq!ia0y~yU|bAj2XHV0$!4opM}d??fKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+1M>q<7srqa#+7D+R^GdiOI9b%VLts{T5}6hu#^6!OSYL=Nhr9V(rN5=D#eX4iO>ZI=*rfn}!@%%q~=ingeyThABv-1W%td4_)Gq%RipLSC!9>_l-R z*s*K+rlm$UrACUaXRztkZ(ul}`;g;+X?(mQ=K*67YxSZDEDvTBusoP+!17==kfteS zxAM|ls<3p*9VaFZhB-og3^l??c(Ux$zw!xDKi^lGmfiGck|hg&ku_~f`~U-_1{f4gp!1^m5Py?wu`?Kj!e{kPjgVz(}?QMTXfS-mrNx{2Q` zmFJDO56*D6o>g}&sw{r}T>jgV>Bg@jv|n$Fe)nj5rxt(Svv(KeZqKl=dUw-pk%{qw zTN_R$&kS1nP3DH}C!WJDdDnN!%_%pQxtq6q<~^%d*YqZz^~?ybyt!ea`Q+7?qMNLi znH2AS(l2|{DfiQ@^!pKB4$gC#g3liJ=8-9NTK)Z$#j5L)?$&eizTJPfFS`24im9wi zX3bRgh~0fJUwrAwnscwuTwHj6&dbje!jJE_4|H-$sD`#FBiXOeA+eR$88tY z7q`D2zoljvzUt50+g9i9v4lKPO2|6+b4gb8(`%MTYvNwJhc#X~x=OC*%k3!h-fxd; zUnSX1E?8%HE7J5>+r6Xr)wCQhzsmT2=KI!j^AZ}QKXMChcjbBzT&J<-+QhYf4F7(% zcKn{j_d(KLBCNdc(@mBg?E3`@V-GOeJ%4^k>Z%nm1+xRwtvNDYy?9CxSCH39?Rtjn Xt&u0y?)&%x^FM>9tDnm{r-UW|zC9p& literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_database_context_model_snapshot-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_database_context_model_snapshot-members.html new file mode 100644 index 0000000000..8887dec371 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_database_context_model_snapshot-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.Migrations.MySqlDatabaseContextModelSnapshot Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Models.Migrations.MySqlDatabaseContextModelSnapshot, including all inherited members.

+ + +
BuildModel(ModelBuilder modelBuilder)Tgstation.Server.Host.Models.Migrations.MySqlDatabaseContextModelSnapshotprotected
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_database_context_model_snapshot.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_database_context_model_snapshot.html new file mode 100644 index 0000000000..5b57cf81b4 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_database_context_model_snapshot.html @@ -0,0 +1,135 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.Migrations.MySqlDatabaseContextModelSnapshot Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.Migrations.MySqlDatabaseContextModelSnapshot Class Reference
+
+
+
+Inheritance diagram for Tgstation.Server.Host.Models.Migrations.MySqlDatabaseContextModelSnapshot:
+
+
+ + +ModelSnapshot + +
+ + + + +

+Protected Member Functions

override void BuildModel (ModelBuilder modelBuilder)
 
+

Detailed Description

+
+

Definition at line 9 of file MySqlDatabaseContextModelSnapshot.cs.

+

Member Function Documentation

+ +

◆ BuildModel()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.MySqlDatabaseContextModelSnapshot.BuildModel (ModelBuilder modelBuilder)
+
+protected
+
+ +

Definition at line 11 of file MySqlDatabaseContextModelSnapshot.cs.

+
12  {
13 #pragma warning disable 612, 618
14  modelBuilder
15  .HasAnnotation("ProductVersion", "2.1.4-rtm-31024")
16  .HasAnnotation("Relational:MaxIdentifierLength", 64);
17 
18  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
19  {
20  b.Property<long>("Id")
21  .ValueGeneratedOnAdd();
22 
23  b.Property<string>("ConnectionString")
24  .IsRequired();
25 
26  b.Property<bool?>("Enabled");
27 
28  b.Property<long>("InstanceId");
29 
30  b.Property<string>("Name")
31  .IsRequired();
32 
33  b.Property<int?>("Provider");
34 
35  b.HasKey("Id");
36 
37  b.HasIndex("InstanceId");
38 
39  b.HasIndex("Name")
40  .IsUnique();
41 
42  b.ToTable("ChatBots");
43  });
44 
45  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
46  {
47  b.Property<long>("Id")
48  .ValueGeneratedOnAdd();
49 
50  b.Property<long>("ChatSettingsId");
51 
52  b.Property<ulong?>("DiscordChannelId");
53 
54  b.Property<string>("IrcChannel");
55 
56  b.Property<bool?>("IsAdminChannel")
57  .IsRequired();
58 
59  b.Property<bool?>("IsUpdatesChannel")
60  .IsRequired();
61 
62  b.Property<bool?>("IsWatchdogChannel")
63  .IsRequired();
64 
65  b.Property<string>("Tag");
66 
67  b.HasKey("Id");
68 
69  b.HasIndex("ChatSettingsId", "DiscordChannelId")
70  .IsUnique();
71 
72  b.HasIndex("ChatSettingsId", "IrcChannel")
73  .IsUnique();
74 
75  b.ToTable("ChatChannels");
76  });
77 
78  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
79  {
80  b.Property<long>("Id")
81  .ValueGeneratedOnAdd();
82 
83  b.Property<string>("ByondVersion")
84  .IsRequired();
85 
86  b.Property<Guid?>("DirectoryName")
87  .IsRequired();
88 
89  b.Property<string>("DmeName")
90  .IsRequired();
91 
92  b.Property<long>("JobId");
93 
94  b.Property<int>("MinimumSecurityLevel");
95 
96  b.Property<string>("Output")
97  .IsRequired();
98 
99  b.Property<long>("RevisionInformationId");
100 
101  b.HasKey("Id");
102 
103  b.HasIndex("DirectoryName");
104 
105  b.HasIndex("JobId")
106  .IsUnique();
107 
108  b.HasIndex("RevisionInformationId");
109 
110  b.ToTable("CompileJobs");
111  });
112 
113  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
114  {
115  b.Property<long>("Id")
116  .ValueGeneratedOnAdd();
117 
118  b.Property<string>("AccessToken");
119 
120  b.Property<bool?>("AllowWebClient")
121  .IsRequired();
122 
123  b.Property<bool?>("AutoStart")
124  .IsRequired();
125 
126  b.Property<long>("InstanceId");
127 
128  b.Property<ushort?>("PrimaryPort")
129  .IsRequired();
130 
131  b.Property<int?>("ProcessId");
132 
133  b.Property<ushort?>("SecondaryPort")
134  .IsRequired();
135 
136  b.Property<int>("SecurityLevel");
137 
138  b.Property<bool?>("SoftRestart")
139  .IsRequired();
140 
141  b.Property<bool?>("SoftShutdown")
142  .IsRequired();
143 
144  b.Property<uint?>("StartupTimeout")
145  .IsRequired();
146 
147  b.HasKey("Id");
148 
149  b.HasIndex("InstanceId")
150  .IsUnique();
151 
152  b.ToTable("DreamDaemonSettings");
153  });
154 
155  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
156  {
157  b.Property<long>("Id")
158  .ValueGeneratedOnAdd();
159 
160  b.Property<ushort?>("ApiValidationPort")
161  .IsRequired();
162 
163  b.Property<int>("ApiValidationSecurityLevel");
164 
165  b.Property<long>("InstanceId");
166 
167  b.Property<string>("ProjectName");
168 
169  b.HasKey("Id");
170 
171  b.HasIndex("InstanceId")
172  .IsUnique();
173 
174  b.ToTable("DreamMakerSettings");
175  });
176 
177  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
178  {
179  b.Property<long>("Id")
180  .ValueGeneratedOnAdd();
181 
182  b.Property<uint?>("AutoUpdateInterval")
183  .IsRequired();
184 
185  b.Property<int>("ConfigurationType");
186 
187  b.Property<string>("Name")
188  .IsRequired();
189 
190  b.Property<bool?>("Online")
191  .IsRequired();
192 
193  b.Property<string>("Path")
194  .IsRequired();
195 
196  b.HasKey("Id");
197 
198  b.HasIndex("Path")
199  .IsUnique();
200 
201  b.ToTable("Instances");
202  });
203 
204  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
205  {
206  b.Property<long>("Id")
207  .ValueGeneratedOnAdd();
208 
209  b.Property<ulong>("ByondRights");
210 
211  b.Property<ulong>("ChatBotRights");
212 
213  b.Property<ulong>("ConfigurationRights");
214 
215  b.Property<ulong>("DreamDaemonRights");
216 
217  b.Property<ulong>("DreamMakerRights");
218 
219  b.Property<long>("InstanceId");
220 
221  b.Property<ulong>("InstanceUserRights");
222 
223  b.Property<ulong>("RepositoryRights");
224 
225  b.Property<long?>("UserId")
226  .IsRequired();
227 
228  b.HasKey("Id");
229 
230  b.HasIndex("InstanceId");
231 
232  b.HasIndex("UserId", "InstanceId")
233  .IsUnique();
234 
235  b.ToTable("InstanceUsers");
236  });
237 
238  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
239  {
240  b.Property<long>("Id")
241  .ValueGeneratedOnAdd();
242 
243  b.Property<ulong?>("CancelRight");
244 
245  b.Property<ulong?>("CancelRightsType");
246 
247  b.Property<bool?>("Cancelled")
248  .IsRequired();
249 
250  b.Property<long?>("CancelledById");
251 
252  b.Property<string>("Description")
253  .IsRequired();
254 
255  b.Property<string>("ExceptionDetails");
256 
257  b.Property<long>("InstanceId");
258 
259  b.Property<DateTimeOffset?>("StartedAt")
260  .IsRequired();
261 
262  b.Property<long>("StartedById");
263 
264  b.Property<DateTimeOffset?>("StoppedAt");
265 
266  b.HasKey("Id");
267 
268  b.HasIndex("CancelledById");
269 
270  b.HasIndex("InstanceId");
271 
272  b.HasIndex("StartedById");
273 
274  b.ToTable("Jobs");
275  });
276 
277  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
278  {
279  b.Property<long>("Id")
280  .ValueGeneratedOnAdd();
281 
282  b.Property<string>("AccessIdentifier")
283  .IsRequired();
284 
285  b.Property<string>("ChatChannelsJson")
286  .IsRequired();
287 
288  b.Property<string>("ChatCommandsJson")
289  .IsRequired();
290 
291  b.Property<long>("CompileJobId");
292 
293  b.Property<bool>("IsPrimary");
294 
295  b.Property<ushort>("Port");
296 
297  b.Property<int>("ProcessId");
298 
299  b.Property<int>("RebootState");
300 
301  b.Property<string>("ServerCommandsJson")
302  .IsRequired();
303 
304  b.HasKey("Id");
305 
306  b.HasIndex("CompileJobId");
307 
308  b.ToTable("ReattachInformations");
309  });
310 
311  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
312  {
313  b.Property<long>("Id")
314  .ValueGeneratedOnAdd();
315 
316  b.Property<string>("AccessToken");
317 
318  b.Property<string>("AccessUser");
319 
320  b.Property<bool?>("AutoUpdatesKeepTestMerges")
321  .IsRequired();
322 
323  b.Property<bool?>("AutoUpdatesSynchronize")
324  .IsRequired();
325 
326  b.Property<string>("CommitterEmail")
327  .IsRequired();
328 
329  b.Property<string>("CommitterName")
330  .IsRequired();
331 
332  b.Property<long>("InstanceId");
333 
334  b.Property<bool?>("PostTestMergeComment")
335  .IsRequired();
336 
337  b.Property<bool?>("PushTestMergeCommits")
338  .IsRequired();
339 
340  b.Property<bool?>("ShowTestMergeCommitters")
341  .IsRequired();
342 
343  b.HasKey("Id");
344 
345  b.HasIndex("InstanceId")
346  .IsUnique();
347 
348  b.ToTable("RepositorySettings");
349  });
350 
351  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
352  {
353  b.Property<long>("Id")
354  .ValueGeneratedOnAdd();
355 
356  b.Property<long>("RevisionInformationId");
357 
358  b.Property<long>("TestMergeId");
359 
360  b.HasKey("Id");
361 
362  b.HasIndex("RevisionInformationId");
363 
364  b.HasIndex("TestMergeId");
365 
366  b.ToTable("RevInfoTestMerges");
367  });
368 
369  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
370  {
371  b.Property<long>("Id")
372  .ValueGeneratedOnAdd();
373 
374  b.Property<string>("CommitSha")
375  .IsRequired()
376  .HasMaxLength(40);
377 
378  b.Property<long>("InstanceId");
379 
380  b.Property<string>("OriginCommitSha")
381  .IsRequired()
382  .HasMaxLength(40);
383 
384  b.HasKey("Id");
385 
386  b.HasIndex("InstanceId", "CommitSha")
387  .IsUnique();
388 
389  b.ToTable("RevisionInformations");
390  });
391 
392  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
393  {
394  b.Property<long>("Id")
395  .ValueGeneratedOnAdd();
396 
397  b.Property<string>("Author")
398  .IsRequired();
399 
400  b.Property<string>("BodyAtMerge")
401  .IsRequired();
402 
403  b.Property<string>("Comment");
404 
405  b.Property<DateTimeOffset>("MergedAt");
406 
407  b.Property<long>("MergedById");
408 
409  b.Property<int?>("Number")
410  .IsRequired();
411 
412  b.Property<long?>("PrimaryRevisionInformationId")
413  .IsRequired();
414 
415  b.Property<string>("PullRequestRevision")
416  .IsRequired();
417 
418  b.Property<string>("TitleAtMerge")
419  .IsRequired();
420 
421  b.Property<string>("Url")
422  .IsRequired();
423 
424  b.HasKey("Id");
425 
426  b.HasIndex("MergedById");
427 
428  b.HasIndex("PrimaryRevisionInformationId")
429  .IsUnique();
430 
431  b.ToTable("TestMerges");
432  });
433 
434  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
435  {
436  b.Property<long>("Id")
437  .ValueGeneratedOnAdd();
438 
439  b.Property<ulong>("AdministrationRights");
440 
441  b.Property<string>("CanonicalName")
442  .IsRequired();
443 
444  b.Property<DateTimeOffset?>("CreatedAt")
445  .IsRequired();
446 
447  b.Property<long?>("CreatedById");
448 
449  b.Property<bool?>("Enabled")
450  .IsRequired();
451 
452  b.Property<ulong>("InstanceManagerRights");
453 
454  b.Property<DateTimeOffset?>("LastPasswordUpdate");
455 
456  b.Property<string>("Name")
457  .IsRequired();
458 
459  b.Property<string>("PasswordHash");
460 
461  b.Property<string>("SystemIdentifier");
462 
463  b.HasKey("Id");
464 
465  b.HasIndex("CanonicalName")
466  .IsUnique();
467 
468  b.HasIndex("CreatedById");
469 
470  b.ToTable("Users");
471  });
472 
473  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
474  {
475  b.Property<long>("Id")
476  .ValueGeneratedOnAdd();
477 
478  b.Property<long?>("AlphaId");
479 
480  b.Property<bool>("AlphaIsActive");
481 
482  b.Property<long?>("BravoId");
483 
484  b.Property<long>("InstanceId");
485 
486  b.HasKey("Id");
487 
488  b.HasIndex("AlphaId");
489 
490  b.HasIndex("BravoId");
491 
492  b.HasIndex("InstanceId")
493  .IsUnique();
494 
495  b.ToTable("WatchdogReattachInformations");
496  });
497 
498  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
499  {
500  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
501  .WithMany("ChatSettings")
502  .HasForeignKey("InstanceId")
503  .OnDelete(DeleteBehavior.Cascade);
504  });
505 
506  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
507  {
508  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
509  .WithMany("Channels")
510  .HasForeignKey("ChatSettingsId")
511  .OnDelete(DeleteBehavior.Cascade);
512  });
513 
514  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
515  {
516  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
517  .WithOne()
518  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
519  .OnDelete(DeleteBehavior.Restrict);
520 
521  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
522  .WithMany("CompileJobs")
523  .HasForeignKey("RevisionInformationId")
524  .OnDelete(DeleteBehavior.Cascade);
525  });
526 
527  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
528  {
529  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
530  .WithOne("DreamDaemonSettings")
531  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
532  .OnDelete(DeleteBehavior.Cascade);
533  });
534 
535  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
536  {
537  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
538  .WithOne("DreamMakerSettings")
539  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
540  .OnDelete(DeleteBehavior.Cascade);
541  });
542 
543  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
544  {
545  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
546  .WithMany("InstanceUsers")
547  .HasForeignKey("InstanceId")
548  .OnDelete(DeleteBehavior.Cascade);
549 
550  b.HasOne("Tgstation.Server.Host.Models.User")
551  .WithMany("InstanceUsers")
552  .HasForeignKey("UserId")
553  .OnDelete(DeleteBehavior.Cascade);
554  });
555 
556  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
557  {
558  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
559  .WithMany()
560  .HasForeignKey("CancelledById");
561 
562  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
563  .WithMany("Jobs")
564  .HasForeignKey("InstanceId")
565  .OnDelete(DeleteBehavior.Cascade);
566 
567  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
568  .WithMany()
569  .HasForeignKey("StartedById")
570  .OnDelete(DeleteBehavior.Cascade);
571  });
572 
573  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
574  {
575  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
576  .WithMany()
577  .HasForeignKey("CompileJobId")
578  .OnDelete(DeleteBehavior.Cascade);
579  });
580 
581  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
582  {
583  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
584  .WithOne("RepositorySettings")
585  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
586  .OnDelete(DeleteBehavior.Cascade);
587  });
588 
589  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
590  {
591  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
592  .WithMany("ActiveTestMerges")
593  .HasForeignKey("RevisionInformationId")
594  .OnDelete(DeleteBehavior.Cascade);
595 
596  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
597  .WithMany("RevisonInformations")
598  .HasForeignKey("TestMergeId")
599  .OnDelete(DeleteBehavior.Cascade);
600  });
601 
602  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
603  {
604  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
605  .WithMany("RevisionInformations")
606  .HasForeignKey("InstanceId")
607  .OnDelete(DeleteBehavior.Cascade);
608  });
609 
610  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
611  {
612  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
613  .WithMany("TestMerges")
614  .HasForeignKey("MergedById")
615  .OnDelete(DeleteBehavior.Restrict);
616 
617  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
618  .WithOne("PrimaryTestMerge")
619  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
620  .OnDelete(DeleteBehavior.Restrict);
621  });
622 
623  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
624  {
625  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
626  .WithMany("CreatedUsers")
627  .HasForeignKey("CreatedById");
628  });
629 
630  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
631  {
632  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
633  .WithMany()
634  .HasForeignKey("AlphaId");
635 
636  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
637  .WithMany()
638  .HasForeignKey("BravoId");
639 
640  b.HasOne("Tgstation.Server.Host.Models.Instance")
641  .WithOne("WatchdogReattachInformation")
642  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
643  .OnDelete(DeleteBehavior.Cascade);
644  });
645 #pragma warning restore 612, 618
646  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_database_context_model_snapshot.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_database_context_model_snapshot.png new file mode 100644 index 0000000000000000000000000000000000000000..c7c993627b5e6f6d3ce77569e1a0adb618f09ba9 GIT binary patch literal 1194 zcmeAS@N?(olHy`uVBq!ia0y~yU_1|G2XHV0Nsoto)<8-kz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-op1B5}BmJ&NXk+6ZeC`lm2K_cukUL z_4oX=xc#%w-T(hy{?*=VH)+eYtZgc`KK{>lvhQcU_Ti7s9Alu4FT9&<`jdbBTIWCW z`SbL5_pML8SoivqiT9=JuRebL_MmXewY{eP({{e}2+GZ!u3{T1SIL+2De&xywtpwB zJ*yVTo!@-m&4NAl+ir->+qzih-UCg~`wL9Zw>|#!XWjWNDz*XVpIctacz>Styvj{6 z8`YQf)Avf)mws_xWp|b7HqY-rPcQ!Es%{6W-pMlx;r#ojf+yK%!F>ZX zyiUYM^<;mX&Gy{ePPez^%CUTq{=zK4RIu;?=L0u;dq$B1-A(EZ(t8Wo0vOb}<}u6@ zF<}IT2h)$h4=f)R0~NU+6h6=oR00ei2790apn=p-@Z$OhAI+r!UYa`vI2BkPIH21y zrE=L{<{4q~@%x|MIqu0|Ec=^bo9y|YrMK_CvELUbz4cYZ+p85H=iS}8)qo}AmWhOL z|NDw+*&8o&itWz(MC$&ntml7Wd45i)L$3C`%LmmJS$w3IZ;yM@5Pfg^w0Z2w$3EY> zE#0{H_~)%B=gG|%F^qS=^rpCt$9mIC+Z_2zd$KB@_3fz=e|#%O|#kIe4Re7V9a&eGhYa3wF2O-1btd@lA!?&1C7$TW1>7EYzMI zQ|eyGBQs4WZAye(?RK{3HS_!4-JSV9bbrmaE9YIi-R2zr?kr=*`WubUC;U`Do@HYYJn#9nzRPP@ z2G2|0Yy0)#lbUm0?>e`y^*o*X{==Sq_Rnp0AMkzk;O1XT-`Cd7r~g)-E4HeAlKJj@ z;=%6U#b+11yApeQ`8~h$`YM;#Rm$-_b^2ua;=SY2wr`9#<7I8nI&N71ODgPr`$i9o)5BSn76QgLxs^rY5xX+1InW4 l=~aK8=28(aO;!G1{E2-@FEx)Hs0J1+44$rjF6*2UngEpHNN@lE literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_design_time_db_context_factory-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_design_time_db_context_factory-members.html new file mode 100644 index 0000000000..89f914c1da --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_design_time_db_context_factory-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.Migrations.MySqlDesignTimeDbContextFactory Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_design_time_db_context_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_design_time_db_context_factory.html new file mode 100644 index 0000000000..4ad8c5bce5 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_design_time_db_context_factory.html @@ -0,0 +1,135 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.Migrations.MySqlDesignTimeDbContextFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.Migrations.MySqlDesignTimeDbContextFactory Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.Migrations.MySqlDesignTimeDbContextFactory:
+
+
+ + +IDesignTimeDbContextFactory + +
+ + + + +

+Public Member Functions

MySqlDatabaseContext CreateDbContext (string[] args)
 
+

Detailed Description

+
+

Definition at line 10 of file MySqlDesignTimeDbContextFactory.cs.

+

Member Function Documentation

+ +

◆ CreateDbContext()

+ +
+
+ + + + + + + + +
MySqlDatabaseContext Tgstation.Server.Host.Models.Migrations.MySqlDesignTimeDbContextFactory.CreateDbContext (string [] args)
+
+ +

+ +

Definition at line 13 of file MySqlDesignTimeDbContextFactory.cs.

+
14  {
15  using (var loggerFactory = new LoggerFactory())
16  {
17  return new MySqlDatabaseContext(new DbContextOptions<MySqlDatabaseContext>(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher<User>())), loggerFactory.CreateLogger<MySqlDatabaseContext>());
18  }
19  }
+
+

References Tgstation.Server.Host.Models.Migrations.DesignTimeDbContextFactoryHelpers.GetDbContextOptions().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_design_time_db_context_factory.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_design_time_db_context_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..ba224fcf750ad73dd745d1e15e239263da29dc41 GIT binary patch literal 1468 zcmb_cdoIQaOIcIrcJ@E)BJ_?V|8$i;z zW;)k|*t%>QprDItk|$z81rYC#-d(OVJ-4UzrKZGfMxbTd{bF@)W?nXbosvX5D(jq^ zBldXP!s{C%48|zV#|&cUh9X1slS}da=mi3OhvryRJa8Nz1wO7O(CT9PA||t~sE@vKR}=(H zrdMSroH8{QyQ|eMQ`)|y9(k$4iUlL$Cr+!5yHD?1OWH{lOi!z{A9O0(N-ny4nOgF` z?&2}fihdp))IXAm4=|r*%QzW>+C%2m%Naz2)xyJo2c>1XEnOm^|R#)=%^28!%E(Mp>)I?4^#v znzbKE?}|X*X6?%)xuW^{D`_Y!4pFaQh|By(YaU$m%>^}JHEIQNhaLyO6wcQXO;bKKOF z@8@?TU(H{Gu7P#_&jom3c?SJd7q^?~Fp;Fn_Da%bW2DJ6Nr`ZIax%gHIPy5T#Sr64 zc@)&nFOB7i)fX5vO9l>FEX@ut>?~f3fl<^%0emoQ4eLr!qz*3;Sh6?%w>wpN&)QkS zPkGM<3l)YUp}^#qZYdS$sto(r7*DB4qDUUFdi|k5X-G>j7`?1P0qG~thUp;2_GlBWJ@PyWF{7Ry zKE0MP3wvKOg3HL=X*0H^D?tVq6(=5(OSonIb}{jejhK5)SB*n;`7f-wMi^*PBaXPOCTcd^OLNh&#M({o9G$xdnpiCD_+v%1?gV + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.Migrations.SqlServerDatabaseContextModelSnapshot Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Models.Migrations.SqlServerDatabaseContextModelSnapshot, including all inherited members.

+ + +
BuildModel(ModelBuilder modelBuilder)Tgstation.Server.Host.Models.Migrations.SqlServerDatabaseContextModelSnapshotprotected
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_database_context_model_snapshot.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_database_context_model_snapshot.html new file mode 100644 index 0000000000..b3b7d4b00d --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_database_context_model_snapshot.html @@ -0,0 +1,135 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.Migrations.SqlServerDatabaseContextModelSnapshot Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.Migrations.SqlServerDatabaseContextModelSnapshot Class Reference
+
+
+
+Inheritance diagram for Tgstation.Server.Host.Models.Migrations.SqlServerDatabaseContextModelSnapshot:
+
+
+ + +ModelSnapshot + +
+ + + + +

+Protected Member Functions

override void BuildModel (ModelBuilder modelBuilder)
 
+

Detailed Description

+
+

Definition at line 11 of file SqlServerDatabaseContextModelSnapshot.cs.

+

Member Function Documentation

+ +

◆ BuildModel()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.Migrations.SqlServerDatabaseContextModelSnapshot.BuildModel (ModelBuilder modelBuilder)
+
+protected
+
+ +

Definition at line 13 of file SqlServerDatabaseContextModelSnapshot.cs.

+
14  {
15 #pragma warning disable 612, 618
16  modelBuilder
17  .HasAnnotation("ProductVersion", "2.1.4-rtm-31024")
18  .HasAnnotation("Relational:MaxIdentifierLength", 128)
19  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
20 
21  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
22  {
23  b.Property<long>("Id")
24  .ValueGeneratedOnAdd()
25  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
26 
27  b.Property<string>("ConnectionString")
28  .IsRequired();
29 
30  b.Property<bool?>("Enabled");
31 
32  b.Property<long>("InstanceId");
33 
34  b.Property<string>("Name")
35  .IsRequired();
36 
37  b.Property<int?>("Provider");
38 
39  b.HasKey("Id");
40 
41  b.HasIndex("InstanceId");
42 
43  b.HasIndex("Name")
44  .IsUnique();
45 
46  b.ToTable("ChatBots");
47  });
48 
49  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
50  {
51  b.Property<long>("Id")
52  .ValueGeneratedOnAdd()
53  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
54 
55  b.Property<long>("ChatSettingsId");
56 
57  b.Property<decimal?>("DiscordChannelId")
58  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
59 
60  b.Property<string>("IrcChannel");
61 
62  b.Property<bool?>("IsAdminChannel")
63  .IsRequired();
64 
65  b.Property<bool?>("IsUpdatesChannel")
66  .IsRequired();
67 
68  b.Property<bool?>("IsWatchdogChannel")
69  .IsRequired();
70 
71  b.Property<string>("Tag");
72 
73  b.HasKey("Id");
74 
75  b.HasIndex("ChatSettingsId", "DiscordChannelId")
76  .IsUnique()
77  .HasFilter("[DiscordChannelId] IS NOT NULL");
78 
79  b.HasIndex("ChatSettingsId", "IrcChannel")
80  .IsUnique()
81  .HasFilter("[IrcChannel] IS NOT NULL");
82 
83  b.ToTable("ChatChannels");
84  });
85 
86  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
87  {
88  b.Property<long>("Id")
89  .ValueGeneratedOnAdd()
90  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
91 
92  b.Property<string>("ByondVersion")
93  .IsRequired();
94 
95  b.Property<Guid?>("DirectoryName")
96  .IsRequired();
97 
98  b.Property<string>("DmeName")
99  .IsRequired();
100 
101  b.Property<long>("JobId");
102 
103  b.Property<int>("MinimumSecurityLevel");
104 
105  b.Property<string>("Output")
106  .IsRequired();
107 
108  b.Property<long>("RevisionInformationId");
109 
110  b.HasKey("Id");
111 
112  b.HasIndex("DirectoryName");
113 
114  b.HasIndex("JobId")
115  .IsUnique();
116 
117  b.HasIndex("RevisionInformationId");
118 
119  b.ToTable("CompileJobs");
120  });
121 
122  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
123  {
124  b.Property<long>("Id")
125  .ValueGeneratedOnAdd()
126  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
127 
128  b.Property<string>("AccessToken");
129 
130  b.Property<bool?>("AllowWebClient")
131  .IsRequired();
132 
133  b.Property<bool?>("AutoStart")
134  .IsRequired();
135 
136  b.Property<long>("InstanceId");
137 
138  b.Property<int>("PrimaryPort");
139 
140  b.Property<int?>("ProcessId");
141 
142  b.Property<int>("SecondaryPort");
143 
144  b.Property<int>("SecurityLevel");
145 
146  b.Property<bool?>("SoftRestart")
147  .IsRequired();
148 
149  b.Property<bool?>("SoftShutdown")
150  .IsRequired();
151 
152  b.Property<long>("StartupTimeout");
153 
154  b.HasKey("Id");
155 
156  b.HasIndex("InstanceId")
157  .IsUnique();
158 
159  b.ToTable("DreamDaemonSettings");
160  });
161 
162  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
163  {
164  b.Property<long>("Id")
165  .ValueGeneratedOnAdd()
166  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
167 
168  b.Property<int>("ApiValidationPort");
169 
170  b.Property<int>("ApiValidationSecurityLevel");
171 
172  b.Property<long>("InstanceId");
173 
174  b.Property<string>("ProjectName");
175 
176  b.HasKey("Id");
177 
178  b.HasIndex("InstanceId")
179  .IsUnique();
180 
181  b.ToTable("DreamMakerSettings");
182  });
183 
184  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
185  {
186  b.Property<long>("Id")
187  .ValueGeneratedOnAdd()
188  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
189 
190  b.Property<long>("AutoUpdateInterval");
191 
192  b.Property<int>("ConfigurationType");
193 
194  b.Property<string>("Name")
195  .IsRequired();
196 
197  b.Property<bool?>("Online")
198  .IsRequired();
199 
200  b.Property<string>("Path")
201  .IsRequired();
202 
203  b.HasKey("Id");
204 
205  b.HasIndex("Path")
206  .IsUnique();
207 
208  b.ToTable("Instances");
209  });
210 
211  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
212  {
213  b.Property<long>("Id")
214  .ValueGeneratedOnAdd()
215  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
216 
217  b.Property<decimal>("ByondRights")
218  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
219 
220  b.Property<decimal>("ChatBotRights")
221  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
222 
223  b.Property<decimal>("ConfigurationRights")
224  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
225 
226  b.Property<decimal>("DreamDaemonRights")
227  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
228 
229  b.Property<decimal>("DreamMakerRights")
230  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
231 
232  b.Property<long>("InstanceId");
233 
234  b.Property<decimal>("InstanceUserRights")
235  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
236 
237  b.Property<decimal>("RepositoryRights")
238  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
239 
240  b.Property<long?>("UserId")
241  .IsRequired();
242 
243  b.HasKey("Id");
244 
245  b.HasIndex("InstanceId");
246 
247  b.HasIndex("UserId", "InstanceId")
248  .IsUnique();
249 
250  b.ToTable("InstanceUsers");
251  });
252 
253  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
254  {
255  b.Property<long>("Id")
256  .ValueGeneratedOnAdd()
257  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
258 
259  b.Property<decimal?>("CancelRight")
260  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
261 
262  b.Property<decimal?>("CancelRightsType")
263  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
264 
265  b.Property<bool?>("Cancelled")
266  .IsRequired();
267 
268  b.Property<long?>("CancelledById");
269 
270  b.Property<string>("Description")
271  .IsRequired();
272 
273  b.Property<string>("ExceptionDetails");
274 
275  b.Property<long>("InstanceId");
276 
277  b.Property<DateTimeOffset?>("StartedAt")
278  .IsRequired();
279 
280  b.Property<long>("StartedById");
281 
282  b.Property<DateTimeOffset?>("StoppedAt");
283 
284  b.HasKey("Id");
285 
286  b.HasIndex("CancelledById");
287 
288  b.HasIndex("InstanceId");
289 
290  b.HasIndex("StartedById");
291 
292  b.ToTable("Jobs");
293  });
294 
295  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
296  {
297  b.Property<long>("Id")
298  .ValueGeneratedOnAdd()
299  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
300 
301  b.Property<string>("AccessIdentifier")
302  .IsRequired();
303 
304  b.Property<string>("ChatChannelsJson")
305  .IsRequired();
306 
307  b.Property<string>("ChatCommandsJson")
308  .IsRequired();
309 
310  b.Property<long>("CompileJobId");
311 
312  b.Property<bool>("IsPrimary");
313 
314  b.Property<int>("Port");
315 
316  b.Property<int>("ProcessId");
317 
318  b.Property<int>("RebootState");
319 
320  b.Property<string>("ServerCommandsJson")
321  .IsRequired();
322 
323  b.HasKey("Id");
324 
325  b.HasIndex("CompileJobId");
326 
327  b.ToTable("ReattachInformations");
328  });
329 
330  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
331  {
332  b.Property<long>("Id")
333  .ValueGeneratedOnAdd()
334  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
335 
336  b.Property<string>("AccessToken");
337 
338  b.Property<string>("AccessUser");
339 
340  b.Property<bool?>("AutoUpdatesKeepTestMerges")
341  .IsRequired();
342 
343  b.Property<bool?>("AutoUpdatesSynchronize")
344  .IsRequired();
345 
346  b.Property<string>("CommitterEmail")
347  .IsRequired();
348 
349  b.Property<string>("CommitterName")
350  .IsRequired();
351 
352  b.Property<long>("InstanceId");
353 
354  b.Property<bool?>("PostTestMergeComment")
355  .IsRequired();
356 
357  b.Property<bool?>("PushTestMergeCommits")
358  .IsRequired();
359 
360  b.Property<bool?>("ShowTestMergeCommitters")
361  .IsRequired();
362 
363  b.HasKey("Id");
364 
365  b.HasIndex("InstanceId")
366  .IsUnique();
367 
368  b.ToTable("RepositorySettings");
369  });
370 
371  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
372  {
373  b.Property<long>("Id")
374  .ValueGeneratedOnAdd()
375  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
376 
377  b.Property<long>("RevisionInformationId");
378 
379  b.Property<long>("TestMergeId");
380 
381  b.HasKey("Id");
382 
383  b.HasIndex("RevisionInformationId");
384 
385  b.HasIndex("TestMergeId");
386 
387  b.ToTable("RevInfoTestMerges");
388  });
389 
390  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
391  {
392  b.Property<long>("Id")
393  .ValueGeneratedOnAdd()
394  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
395 
396  b.Property<string>("CommitSha")
397  .IsRequired()
398  .HasMaxLength(40);
399 
400  b.Property<long>("InstanceId");
401 
402  b.Property<string>("OriginCommitSha")
403  .IsRequired()
404  .HasMaxLength(40);
405 
406  b.HasKey("Id");
407 
408  b.HasIndex("InstanceId", "CommitSha")
409  .IsUnique();
410 
411  b.ToTable("RevisionInformations");
412  });
413 
414  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
415  {
416  b.Property<long>("Id")
417  .ValueGeneratedOnAdd()
418  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
419 
420  b.Property<string>("Author")
421  .IsRequired();
422 
423  b.Property<string>("BodyAtMerge")
424  .IsRequired();
425 
426  b.Property<string>("Comment");
427 
428  b.Property<DateTimeOffset>("MergedAt");
429 
430  b.Property<long>("MergedById");
431 
432  b.Property<int?>("Number")
433  .IsRequired();
434 
435  b.Property<long?>("PrimaryRevisionInformationId")
436  .IsRequired();
437 
438  b.Property<string>("PullRequestRevision")
439  .IsRequired();
440 
441  b.Property<string>("TitleAtMerge")
442  .IsRequired();
443 
444  b.Property<string>("Url")
445  .IsRequired();
446 
447  b.HasKey("Id");
448 
449  b.HasIndex("MergedById");
450 
451  b.HasIndex("PrimaryRevisionInformationId")
452  .IsUnique();
453 
454  b.ToTable("TestMerges");
455  });
456 
457  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
458  {
459  b.Property<long>("Id")
460  .ValueGeneratedOnAdd()
461  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
462 
463  b.Property<decimal>("AdministrationRights")
464  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
465 
466  b.Property<string>("CanonicalName")
467  .IsRequired();
468 
469  b.Property<DateTimeOffset?>("CreatedAt")
470  .IsRequired();
471 
472  b.Property<long?>("CreatedById");
473 
474  b.Property<bool?>("Enabled")
475  .IsRequired();
476 
477  b.Property<decimal>("InstanceManagerRights")
478  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
479 
480  b.Property<DateTimeOffset?>("LastPasswordUpdate");
481 
482  b.Property<string>("Name")
483  .IsRequired();
484 
485  b.Property<string>("PasswordHash");
486 
487  b.Property<string>("SystemIdentifier");
488 
489  b.HasKey("Id");
490 
491  b.HasIndex("CanonicalName")
492  .IsUnique();
493 
494  b.HasIndex("CreatedById");
495 
496  b.ToTable("Users");
497  });
498 
499  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
500  {
501  b.Property<long>("Id")
502  .ValueGeneratedOnAdd()
503  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
504 
505  b.Property<long?>("AlphaId");
506 
507  b.Property<bool>("AlphaIsActive");
508 
509  b.Property<long?>("BravoId");
510 
511  b.Property<long>("InstanceId");
512 
513  b.HasKey("Id");
514 
515  b.HasIndex("AlphaId");
516 
517  b.HasIndex("BravoId");
518 
519  b.HasIndex("InstanceId")
520  .IsUnique();
521 
522  b.ToTable("WatchdogReattachInformations");
523  });
524 
525  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
526  {
527  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
528  .WithMany("ChatSettings")
529  .HasForeignKey("InstanceId")
530  .OnDelete(DeleteBehavior.Cascade);
531  });
532 
533  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
534  {
535  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
536  .WithMany("Channels")
537  .HasForeignKey("ChatSettingsId")
538  .OnDelete(DeleteBehavior.Cascade);
539  });
540 
541  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
542  {
543  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
544  .WithOne()
545  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
546  .OnDelete(DeleteBehavior.Restrict);
547 
548  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
549  .WithMany("CompileJobs")
550  .HasForeignKey("RevisionInformationId")
551  .OnDelete(DeleteBehavior.Cascade);
552  });
553 
554  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
555  {
556  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
557  .WithOne("DreamDaemonSettings")
558  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
559  .OnDelete(DeleteBehavior.Cascade);
560  });
561 
562  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
563  {
564  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
565  .WithOne("DreamMakerSettings")
566  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
567  .OnDelete(DeleteBehavior.Cascade);
568  });
569 
570  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
571  {
572  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
573  .WithMany("InstanceUsers")
574  .HasForeignKey("InstanceId")
575  .OnDelete(DeleteBehavior.Cascade);
576 
577  b.HasOne("Tgstation.Server.Host.Models.User")
578  .WithMany("InstanceUsers")
579  .HasForeignKey("UserId")
580  .OnDelete(DeleteBehavior.Cascade);
581  });
582 
583  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
584  {
585  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
586  .WithMany()
587  .HasForeignKey("CancelledById");
588 
589  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
590  .WithMany("Jobs")
591  .HasForeignKey("InstanceId")
592  .OnDelete(DeleteBehavior.Cascade);
593 
594  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
595  .WithMany()
596  .HasForeignKey("StartedById")
597  .OnDelete(DeleteBehavior.Cascade);
598  });
599 
600  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
601  {
602  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
603  .WithMany()
604  .HasForeignKey("CompileJobId")
605  .OnDelete(DeleteBehavior.Cascade);
606  });
607 
608  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
609  {
610  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
611  .WithOne("RepositorySettings")
612  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
613  .OnDelete(DeleteBehavior.Cascade);
614  });
615 
616  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
617  {
618  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
619  .WithMany("ActiveTestMerges")
620  .HasForeignKey("RevisionInformationId")
621  .OnDelete(DeleteBehavior.Cascade);
622 
623  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
624  .WithMany("RevisonInformations")
625  .HasForeignKey("TestMergeId")
626  .OnDelete(DeleteBehavior.Cascade);
627  });
628 
629  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
630  {
631  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
632  .WithMany("RevisionInformations")
633  .HasForeignKey("InstanceId")
634  .OnDelete(DeleteBehavior.Cascade);
635  });
636 
637  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
638  {
639  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
640  .WithMany("TestMerges")
641  .HasForeignKey("MergedById")
642  .OnDelete(DeleteBehavior.Restrict);
643 
644  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
645  .WithOne("PrimaryTestMerge")
646  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
647  .OnDelete(DeleteBehavior.Restrict);
648  });
649 
650  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
651  {
652  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
653  .WithMany("CreatedUsers")
654  .HasForeignKey("CreatedById");
655  });
656 
657  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
658  {
659  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
660  .WithMany()
661  .HasForeignKey("AlphaId");
662 
663  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
664  .WithMany()
665  .HasForeignKey("BravoId");
666 
667  b.HasOne("Tgstation.Server.Host.Models.Instance")
668  .WithOne("WatchdogReattachInformation")
669  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
670  .OnDelete(DeleteBehavior.Cascade);
671  });
672 #pragma warning restore 612, 618
673  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_database_context_model_snapshot.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_database_context_model_snapshot.png new file mode 100644 index 0000000000000000000000000000000000000000..398bab2253f4e3b7ea40af4121fcc2a97abbcbd8 GIT binary patch literal 1197 zcmeAS@N?(olHy`uVBq!ia0y~yV0;2(2XHV0$^S9mWPp@JfKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+1B;EPi(^Oy zPnC@ag~V?!uf2Kknx6Jn#>J;uKAzf^8=ZA~o9?34ww%;dx;pGZh$M4~udT)01X6b`GA}@35JSH(|m_1>Pu)Q+%zJcA# z$xGgcDV*pnaDVkTJ-f8IhHp#qya}o=k7x1TJQzFg%h#9FfeKVkC@a;g>nn(#+}5Jw zX&?M;)88o%`S*Q(yXJh}t>^J`@2=m#?{TSIn`X89f+}ggUWxthKM7WaN;cn$mEi%Fyo= z!^Ei*7!PR+GP8s`v2mD_S@le|8DFp%Q7|i`19`qz3sXKvm<4Zmd+*|J=|S!*%(e46`xc0>LHvlkSY?QcxGCt~o{ zjP>rfdAgQ6HZ|1r&8ukhf6K>uO5^vdyuUj;JzJ8U#3$^XyK{T;!TfF;o}@{_{&&Bw zSNJZyWMdvx)UAGU-F{x+eo6!Ea zppfBsut{sp+qXxafA-tQ|7cN6JX=}eq;%2WO04%jFTJTg;r;t3p@(A3)KkB_@|*YW ztNP^Ib8C2ap055~aOSR7$G*oG=k8%k=IUH~(Oh%Jyb_INcb)AXty6s-EOc*j)Yn(a z_jmURmZ#)Q-*5a%{pyhoONx(NzwK#tX5sEn-&#_1ZTJ^m3r}8ZclBt$Z?gDnvF!;_ zf_Aq1d>zFnZMRz!5L>W4J3NVDpHuzYkKbFl9+b*E^WPMUXqdmg{?m_gr@TgTe~DWM4fBwaAt literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_design_time_db_context_factory-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_design_time_db_context_factory-members.html new file mode 100644 index 0000000000..019c2224ef --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_design_time_db_context_factory-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.Migrations.SqlServerDesignTimeDbContextFactory Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_design_time_db_context_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_design_time_db_context_factory.html new file mode 100644 index 0000000000..577d6ddefb --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_design_time_db_context_factory.html @@ -0,0 +1,135 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.Migrations.SqlServerDesignTimeDbContextFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.Migrations.SqlServerDesignTimeDbContextFactory Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.Migrations.SqlServerDesignTimeDbContextFactory:
+
+
+ + +IDesignTimeDbContextFactory + +
+ + + + +

+Public Member Functions

SqlServerDatabaseContext CreateDbContext (string[] args)
 
+

Detailed Description

+
+

Definition at line 10 of file SqlServerDesignTimeDbContextFactory.cs.

+

Member Function Documentation

+ +

◆ CreateDbContext()

+ +
+
+ + + + + + + + +
SqlServerDatabaseContext Tgstation.Server.Host.Models.Migrations.SqlServerDesignTimeDbContextFactory.CreateDbContext (string [] args)
+
+ +

+ +

Definition at line 13 of file SqlServerDesignTimeDbContextFactory.cs.

+
14  {
15  using (var loggerFactory = new LoggerFactory())
16  {
17  return new SqlServerDatabaseContext(new DbContextOptions<SqlServerDatabaseContext>(), DesignTimeDbContextFactoryHelpers.GetDbContextOptions(), new DatabaseSeeder(new CryptographySuite(new PasswordHasher<User>())), loggerFactory.CreateLogger<SqlServerDatabaseContext>());
18  }
19  }
+
+

References Tgstation.Server.Host.Models.Migrations.DesignTimeDbContextFactoryHelpers.GetDbContextOptions().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_design_time_db_context_factory.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_design_time_db_context_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..c5d3465b233a32efed76635bfc2e5924c74b6a67 GIT binary patch literal 1515 zcmb_ceLT|%82`zU*X~pFVv)op6@|PEbvG|**sN{LOKY6uysj`~X7ZA96>i>YlO``Q zQJk?`%x0cB6g|-0zH4@Yvf=*VMzb&TjHqlX|+xmS}_~wbG_U%$HoU3|uVB}SDY$Fv^g~^+A zbnU)qnAc?jHG#%gG7dst>Z8Bwp=UD9Qc#FuGyIypaOEdlI&~;=E~TH;>nw=bJ=D}; z^t6V`u?M>%MVxTlSdFv3x_^ja9JnMW;WP zqf65C_ zTOYQG+<538%TCxS5|1(GC8YW^tb{!}c%Mb8zf9LGZtC*?Ncp3}jEEK(B$JyfQ=J#c zqrpadPGT@^HgD^+`uClG>7Uiq8=J$_EM-aE38z^1bja~?7*;}jQz?tGjQg1G9bork z0y7078Mp3;DEUV{c0~`_tH#LQSu@ZGP@VEIq zGf4#=Ra{lPVCzSvpu9~_@Li!C-}EA8gBNwBt)&1kvry@CK`56cmj%C3XlyLTGVcG9LzV)*v>1>Jb20WI78hZz-Tdn z4SgS#c4adeg;0B2!_XRsLALYgN{WM;AAna9lq>ds5N6Wv(vV&iMaX!wZ9i!6ZhWm! zhk!l!p4YOvyc7#pv}=Uakhg>cZ(up=6APab-m^|)RQ2ec+Kw`u>I zBy1rgG4P4B{&$ZAJ*Uo-l|Ecru())>DZ~Nm99kZ*gnn9PqRs&w3z51OS%i&$;A+yOIc_$_%INphfd&g^%~fOEokk=x*gs!aJAve zX3^b3=aDn?jD#Hf + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.MySqlDatabaseContext Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Models.MySqlDatabaseContext, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
ChatBotsTgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
ChatChannelsTgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
CompileJobsTgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
DatabaseConfigurationTgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >protected
DatabaseContext(DbContextOptions< TParentContext > dbContextOptions, IOptions< DatabaseConfiguration > databaseConfigurationOptions, IDatabaseSeeder databaseSeeder, ILogger logger)Tgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
DreamDaemonSettingsTgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
DreamMakerSettingsTgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
Initialize(CancellationToken cancellationToken)Tgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
InstancesTgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
InstanceUsersTgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
JobsTgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
LoggerTgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >protected
MySqlDatabaseContext(DbContextOptions< MySqlDatabaseContext > dbContextOptions, IOptions< DatabaseConfiguration > databaseConfiguration, IDatabaseSeeder databaseSeeder, ILogger< MySqlDatabaseContext > logger)Tgstation.Server.Host.Models.MySqlDatabaseContext
OnConfiguring(DbContextOptionsBuilder options)Tgstation.Server.Host.Models.MySqlDatabaseContextprotected
OnModelCreating(ModelBuilder modelBuilder)Tgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >protected
ReattachInformationsTgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
RepositorySettingsTgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
RevInfoTestMergesTgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
RevisionInformationsTgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
Save(CancellationToken cancellationToken)Tgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
SchemaDowngradeForServerVersion(Version version, CancellationToken cancellationToken)Tgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
TestMergesTgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
UseMySQLMigrations()Tgstation.Server.Host.Models.MySqlDatabaseContextprotectedvirtual
UsersTgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
WatchdogReattachInformationsTgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_my_sql_database_context.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_my_sql_database_context.html new file mode 100644 index 0000000000..ff45209dd4 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_my_sql_database_context.html @@ -0,0 +1,298 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.MySqlDatabaseContext Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.MySqlDatabaseContext Class Reference
+
+
+ +

DatabaseContext<TParentContext> for MySQL + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.MySqlDatabaseContext:
+
+
+ + +Tgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext > + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

 MySqlDatabaseContext (DbContextOptions< MySqlDatabaseContext > dbContextOptions, IOptions< DatabaseConfiguration > databaseConfiguration, IDatabaseSeeder databaseSeeder, ILogger< MySqlDatabaseContext > logger)
 Construct a MySqlDatabaseContext More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
 DatabaseContext (DbContextOptions< TParentContext > dbContextOptions, IOptions< DatabaseConfiguration > databaseConfigurationOptions, IDatabaseSeeder databaseSeeder, ILogger logger)
 Construct a DatabaseContext<TParentContext> More...
 
async Task Initialize (CancellationToken cancellationToken)
 
Task Save (CancellationToken cancellationToken)
 
async Task SchemaDowngradeForServerVersion (Version version, CancellationToken cancellationToken)
 
+ + + + + + + + + +

+Protected Member Functions

override void OnConfiguring (DbContextOptionsBuilder options)
 
override bool UseMySQLMigrations ()
 If the MY_ class of migrations should be used instead of the MS_ class More...
 
- Protected Member Functions inherited from Tgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
override void OnModelCreating (ModelBuilder modelBuilder)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Properties inherited from Tgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
DbSet< UserUsers [get, set]
 
DbSet< InstanceInstances [get, set]
 
DbSet< CompileJobCompileJobs [get, set]
 
DbSet< RevisionInformationRevisionInformations [get, set]
 
DbSet< DreamMakerSettingsDreamMakerSettings [get, set]
 
DbSet< ChatBotChatBots [get, set]
 
DbSet< DreamDaemonSettingsDreamDaemonSettings [get, set]
 
DbSet< RepositorySettingsRepositorySettings [get, set]
 
DbSet< InstanceUserInstanceUsers [get, set]
 
DbSet< ChatChannelChatChannels [get, set]
 
DbSet< JobJobs [get, set]
 
DbSet< ReattachInformationReattachInformations [get, set]
 
DbSet< WatchdogReattachInformationWatchdogReattachInformations [get, set]
 
DbSet< TestMergeTestMerges [get, set]
 The TestMerges in the DatabaseContext<TParentContext> More...
 
DbSet< RevInfoTestMergeRevInfoTestMerges [get, set]
 The RevInfoTestMerges om the DatabaseContext<TParentContext> More...
 
ILogger Logger [get]
 The ILogger for the DatabaseContext<TParentContext> More...
 
DatabaseConfiguration DatabaseConfiguration [get]
 The DatabaseConfiguration for the DatabaseContext<TParentContext> More...
 
+

Detailed Description

+

DatabaseContext<TParentContext> for MySQL

+ +

Definition at line 14 of file MySqlDatabaseContext.cs.

+

Constructor & Destructor Documentation

+ +

◆ MySqlDatabaseContext()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Models.MySqlDatabaseContext.MySqlDatabaseContext (DbContextOptions< MySqlDatabaseContextdbContextOptions,
IOptions< DatabaseConfigurationdatabaseConfiguration,
IDatabaseSeeder databaseSeeder,
ILogger< MySqlDatabaseContextlogger 
)
+
+ +

Construct a MySqlDatabaseContext

+
Parameters
+ + + + + +
dbContextOptionsThe DbContextOptions<TContext> for the DatabaseContext<TParentContext>
databaseConfigurationThe IOptions<TOptions> of DatabaseConfiguration for the DatabaseContext<TParentContext>
databaseSeederThe IDatabaseSeeder for the DatabaseContext<TParentContext>
loggerThe ILogger for the DatabaseContext<TParentContext>
+
+
+ +

Definition at line 23 of file MySqlDatabaseContext.cs.

+
23  : base(dbContextOptions, databaseConfiguration, databaseSeeder, logger)
24  { }
readonly IDatabaseSeeder databaseSeeder
The IDatabaseSeeder for the DatabaseContext<TParentContext>
+
+
+
+

Member Function Documentation

+ +

◆ OnConfiguring()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.MySqlDatabaseContext.OnConfiguring (DbContextOptionsBuilder options)
+
+protected
+
+ +

+ +

Definition at line 27 of file MySqlDatabaseContext.cs.

+
28  {
29  base.OnConfiguring(options);
30  var stringDeconstructor = new MySqlConnectionStringBuilder
31  {
32  ConnectionString = DatabaseConfiguration.ConnectionString
33  };
34  if (stringDeconstructor.Server == "localhost")
35  Logger.LogWarning("MariaDB/MySQL server address is set to 'localhost'! If there are connection issues, try setting it to '127.0.0.1'!");
36  if (!String.IsNullOrEmpty(DatabaseConfiguration.MySqlServerVersion))
37  options.UseMySql(DatabaseConfiguration.ConnectionString, mySqlOptions => mySqlOptions.ServerVersion(Version.Parse(DatabaseConfiguration.MySqlServerVersion), DatabaseConfiguration.DatabaseType == DatabaseType.MariaDB ? ServerType.MariaDb : ServerType.MySql));
38  else
39  options.UseMySql(DatabaseConfiguration.ConnectionString);
40  }
string ConnectionString
The connection string for the database
+
DatabaseType DatabaseType
The Configuration.DatabaseType to create
+
string MySqlServerVersion
The string form of the System.Version of a target MySQL/MariaDB server
+
Configuration options for the Models.DatabaseContext<TParentContext>
+
DatabaseType
Type of database to user
Definition: DatabaseType.cs:6
+
ILogger Logger
The ILogger for the DatabaseContext<TParentContext>
+
+

References Tgstation.Server.Host.Configuration.DatabaseConfiguration.ConnectionString, Tgstation.Server.Host.Configuration.DatabaseConfiguration.DatabaseType, Tgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >.Logger, and Tgstation.Server.Host.Configuration.DatabaseConfiguration.MySqlServerVersion.

+ +
+
+ +

◆ UseMySQLMigrations()

+ +
+
+ + + + + +
+ + + + + + + +
override bool Tgstation.Server.Host.Models.MySqlDatabaseContext.UseMySQLMigrations ()
+
+protectedvirtual
+
+ +

If the MY_ class of migrations should be used instead of the MS_ class

+ +

Implements Tgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_my_sql_database_context.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_my_sql_database_context.png new file mode 100644 index 0000000000000000000000000000000000000000..02d13f34022301c06c17b6ea0395c2597446450c GIT binary patch literal 1378 zcmeAS@N?(olHy`uVBq!ia0y~yVB7#?2XHV0N&m$c^njE^fKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+1ItHG7srqa#YQrPnA?W%N3_T}prbMm&dPuQ<>def9?sgXq;t}aVdlqNZ{`nae}+|>DiJ3nmPDrqG%goBhf9vJ9T|Tz|>q>UNGcHGL5?82y z{INglhEDPM)6W+bs=s;l*ZBVHAH_%3HNM?^p7FD0jh1WSiv9-Q!kej8iuG!<1a9bV z``usNk#DkSbVIoig zFojV=!LRJbt=FPfZoO92!4|-DVgb4hRg4?9)iQkT*}px0WA{(h29Mb@&F}sHo@kx> z=ltQU3oV8G*N&EM5=xj?V6LvnTobYJ( zvS0f~l=m{s*vR%{<~@ctn^b4H%wCh3@NU-Z2H&OfOvU=v$#1n;%(fpnt)S-@QE-KE z-%|hkiG~J~n-{3Y-A_!6wKtj9xYGKJ-mf2gpLc(JzbcCbXf;R9{epbaZ1WxK>$h0W z-vCRMdZu}EEmMK1l4tef52kTJwmwJi*MBW7+hkR>UAp&2#>~I94f(H456D!B7>)^pUXO@geCwSp={p( literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information-members.html new file mode 100644 index 0000000000..c5b2792519 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information-members.html @@ -0,0 +1,100 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.ReattachInformation Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information.html new file mode 100644 index 0000000000..df243c0cd4 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information.html @@ -0,0 +1,215 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.ReattachInformation Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.ReattachInformation Class Reference
+
+
+ +

Database representation of Components.Watchdog.ReattachInformation + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.ReattachInformation:
+
+
+ + +Tgstation.Server.Host.Models.ReattachInformationBase +Tgstation.Server.Host.Components.Interop.JsonSubFileList + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

long Id [get, set]
 The row Id More...
 
CompileJob CompileJob [get, set]
 The Models.CompileJob for the Components.Watchdog.ReattachInformation.Dmb More...
 
- Properties inherited from Tgstation.Server.Host.Models.ReattachInformationBase
string AccessIdentifier [get, set]
 Used to identify and authenticate the DreamDaemon instance More...
 
int ProcessId [get, set]
 The system process ID More...
 
bool IsPrimary [get, set]
 If the Components.IDmbProvider.PrimaryDirectory of the associated dmb is being used More...
 
ushort Port [get, set]
 The port DreamDaemon was last listening on More...
 
RebootState RebootState [get, set]
 The current DreamDaemon reboot state More...
 
- Properties inherited from Tgstation.Server.Host.Components.Interop.JsonSubFileList
string ChatCommandsJson [get, set]
 Path to the chat commands json file More...
 
string ChatChannelsJson [get, set]
 Path to the chat channels json file More...
 
string ServerCommandsJson [get, set]
 Path to the server commands json file More...
 
+ + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Member Functions inherited from Tgstation.Server.Host.Models.ReattachInformationBase
override string ToString ()
 
- Public Member Functions inherited from Tgstation.Server.Host.Components.Interop.JsonSubFileList
 JsonSubFileList (JsonSubFileList copy)
 Construct an JsonSubFileList from a copy More...
 
- Protected Member Functions inherited from Tgstation.Server.Host.Models.ReattachInformationBase
 ReattachInformationBase ()
 Construct a ReattachInformationBase More...
 
 ReattachInformationBase (ReattachInformationBase copy)
 Construct a ReattachInformationBase from a given copy More...
 
- Protected Member Functions inherited from Tgstation.Server.Host.Components.Interop.JsonSubFileList
 JsonSubFileList ()
 Construct an JsonSubFileList More...
 
+

Detailed Description

+

Database representation of Components.Watchdog.ReattachInformation

+ +

Definition at line 8 of file ReattachInformation.cs.

+

Property Documentation

+ +

◆ CompileJob

+ +
+
+ + + + + +
+ + + + +
CompileJob Tgstation.Server.Host.Models.ReattachInformation.CompileJob
+
+getset
+
+ +

The Models.CompileJob for the Components.Watchdog.ReattachInformation.Dmb

+ +

Definition at line 19 of file ReattachInformation.cs.

+
19 { get; set; }
+
+
+ +

◆ Id

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.ReattachInformation.Id
+
+getset
+
+ +

The row Id

+ +

Definition at line 13 of file ReattachInformation.cs.

+
13 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information.png new file mode 100644 index 0000000000000000000000000000000000000000..1c6ca4c0e780109e285b95b6a998c6a8a88d841b GIT binary patch literal 1858 zcmcJQe=yW(9LIOJD9y1hIi_pluBB1uM~o7?NQ$p&bt_i1U*&{Lwvw-1D_7L{k?Ukh zKiD;mrE~0lNmSONv?+rnA+#xLt^Hv)xm{7XZ}+3QAAjE5GxI#p`!mny`7!f(&HKsT zOY$>bv3dmxg)#>GeaR>knu6%8UC%oGFk53y>G|j;vym^)H*2l{zXLn)>~Ry z46>hFA>r~wGARg!Bz^}CQAq@D39O(zp4XIPCbyyxV`!B(Fj zNnS7Oa?0s+*Uom8^eo}DdPFpzOq48Yc&!O35-Z&NI&IzNr#-2~(D_pBrpqORFL3Cg z3$n9tsjlYs@eHG*OnH{R;?gU_pN({2uH|Ieo=In%GR6sAyl1l6CAU`U6xDnI3~KZ& z8>Cy%Y1T80tai$+;3J+q+Vo6xM%p+Su2SR7_?rZPvideZ-LZTk2hSHka)DpIPO0zD1T(Q?s+QTCMu!wo^zk)EZi3;a z`R77FN0qm{H87dUX783$@w=Hz@nI$_I@LkZ>7{fj zJe9O`&{Un~^QoKCwvAhp8{AB|$#ian}*9!y41T0)uz$zdI;8D%rJDyo;UGU2a)2;!^d4nul zA?Dn4_q9lLIsl`*wuKpFtrub*eE8rH8 zeXjeHzXZ}gzEBa<+TO5>Nbvy{j{L1resD%B4-7`cB${LkN)2;iKL;GIEJ))4NS0 zcca3+doRb2&k6xpxRy85NLnwH>8L-|>ahupujl+HXQfwPEnMyLf^WPVDO}ttnF2~A zAocn0_<6v*LDIL}l57q!VqG0W;7^zFdPHGfZSLX|?)laDlRTm3?5?7_w<@URXU!rL zj=^rYn6^WYf)=jIdg|5BvD`hAtJguzr>X=36`@Vh;mzuR6m^HY-&`?>@1(KZ)x64= z({{FCW>iCZ%ucPa$kEAI(w5A=!Gj$%UayZF4Yt?_(`dERlG4Xa*P<%TQ;57BciiQQ z>2PNzIFLN#-aX1$8?6cjUOng+ktg4)7%=ZX`HUs=fB4iRCBXzWWGpr4CQ zW#5<>XFp9-&AAWHj=-?jOPyF5=aJEwP0bMyi|1d&##G@dh;N|B#g)C&+|Bf$hP(sf z)sY@gs9a&`XICnh0_1Egxa4J)yvZeVt<5U~mV-B7q!XAflKsVAw+ z@Cavt|2B@y0dfEkU}v-P%*cHUZ;WXG(_pz=wNZreMToke9J{9mbq`^x#G3a%GWG%B z>B>ghaJ|iNef;%mG#-U;_BW8l9xk}PKq?Qb8C}h>q-lB$#x44b zq*ARG^VR-wBPZ!YCOf0ysEb&;BVke(E0ja-3VT@VGtUSb(f@&1(}s_TP1K}w{*4$Y z=D>Mjja07SP5(qBuSDt|c*c&7;ME%KuzBdPyW1DGGy3zrCz94=5L!KI2}6bKcWKXJ z2P`Yz$-a?DB#+DvK3oQd8`|gY@9tL{CO!+N+>;0GZZw%q()IoDB4ta&!PO19(;*zx zIxD7Y{m(hNQ;8WGxU)ErDuh2m7 zHrh{^A`IUU1m|yuixSO8{lJkiBPW|%OhNiBhg&CD9LRyDw9e=qw3L&0g{t9=D3Io)0;l^ we)Eb++-!uzo$Dc#HJb5HPa*tSxV-mROH8JoywTt~^5LO?9VB1A&%yLx0gukMF8}}l literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base-members.html new file mode 100644 index 0000000000..416075e210 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base-members.html @@ -0,0 +1,98 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.ReattachInformationBase Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html new file mode 100644 index 0000000000..7c8b391ba5 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html @@ -0,0 +1,393 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.ReattachInformationBase Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.ReattachInformationBase Class Reference
+
+
+ +

Base class for ReattachInformation + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.ReattachInformationBase:
+
+
+ + +Tgstation.Server.Host.Components.Interop.JsonSubFileList +Tgstation.Server.Host.Components.Watchdog.ReattachInformation +Tgstation.Server.Host.Models.ReattachInformation + +
+ + + + + + + + +

+Public Member Functions

override string ToString ()
 
- Public Member Functions inherited from Tgstation.Server.Host.Components.Interop.JsonSubFileList
 JsonSubFileList (JsonSubFileList copy)
 Construct an JsonSubFileList from a copy More...
 
+ + + + + + + + + + + +

+Protected Member Functions

 ReattachInformationBase ()
 Construct a ReattachInformationBase More...
 
 ReattachInformationBase (ReattachInformationBase copy)
 Construct a ReattachInformationBase from a given copy More...
 
- Protected Member Functions inherited from Tgstation.Server.Host.Components.Interop.JsonSubFileList
 JsonSubFileList ()
 Construct an JsonSubFileList More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

string AccessIdentifier [get, set]
 Used to identify and authenticate the DreamDaemon instance More...
 
int ProcessId [get, set]
 The system process ID More...
 
bool IsPrimary [get, set]
 If the Components.IDmbProvider.PrimaryDirectory of the associated dmb is being used More...
 
ushort Port [get, set]
 The port DreamDaemon was last listening on More...
 
RebootState RebootState [get, set]
 The current DreamDaemon reboot state More...
 
- Properties inherited from Tgstation.Server.Host.Components.Interop.JsonSubFileList
string ChatCommandsJson [get, set]
 Path to the chat commands json file More...
 
string ChatChannelsJson [get, set]
 Path to the chat channels json file More...
 
string ServerCommandsJson [get, set]
 Path to the server commands json file More...
 
+

Detailed Description

+

Base class for ReattachInformation

+ +

Definition at line 12 of file ReattachInformationBase.cs.

+

Constructor & Destructor Documentation

+ +

◆ ReattachInformationBase() [1/2]

+ +
+
+ + + + + +
+ + + + + + + +
Tgstation.Server.Host.Models.ReattachInformationBase.ReattachInformationBase ()
+
+protected
+
+ +

Construct a ReattachInformationBase

+ +

Definition at line 43 of file ReattachInformationBase.cs.

+
43 { }
+
+
+ +

◆ ReattachInformationBase() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + +
Tgstation.Server.Host.Models.ReattachInformationBase.ReattachInformationBase (ReattachInformationBase copy)
+
+protected
+
+ +

Construct a ReattachInformationBase from a given copy

+
Parameters
+ + +
copyThe ReattachInformationBase to copy values from
+
+
+ +

Definition at line 49 of file ReattachInformationBase.cs.

+
49  : base(copy)
50  {
51  if (copy == null)
52  throw new ArgumentNullException(nameof(copy));
53  AccessIdentifier = copy.AccessIdentifier;
54  IsPrimary = copy.IsPrimary;
55  Port = copy.Port;
56  ProcessId = copy.ProcessId;
57  RebootState = copy.RebootState;
58  }
ushort Port
The port DreamDaemon was last listening on
+
bool IsPrimary
If the Components.IDmbProvider.PrimaryDirectory of the associated dmb is being used
+ +
RebootState
Represents the action to take when /world/Reboot() is called
Definition: RebootState.cs:6
+
string AccessIdentifier
Used to identify and authenticate the DreamDaemon instance
+
+

References Tgstation.Server.Host.Models.ReattachInformationBase.AccessIdentifier, Tgstation.Server.Host.Models.ReattachInformationBase.IsPrimary, Tgstation.Server.Host.Models.ReattachInformationBase.Port, Tgstation.Server.Host.Models.ReattachInformationBase.ProcessId, and Tgstation.Server.Host.Models.ReattachInformationBase.RebootState.

+ +
+
+

Member Function Documentation

+ +

◆ ToString()

+ +
+
+ + + + + + + +
override string Tgstation.Server.Host.Models.ReattachInformationBase.ToString ()
+
+ +

+ +
+
+

Property Documentation

+ +

◆ AccessIdentifier

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Models.ReattachInformationBase.AccessIdentifier
+
+getset
+
+
+ +

◆ IsPrimary

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Models.ReattachInformationBase.IsPrimary
+
+getset
+
+
+ +

◆ Port

+ +
+
+ + + + + +
+ + + + +
ushort Tgstation.Server.Host.Models.ReattachInformationBase.Port
+
+getset
+
+
+ +

◆ ProcessId

+ +
+
+ + + + + +
+ + + + +
int Tgstation.Server.Host.Models.ReattachInformationBase.ProcessId
+
+getset
+
+
+ +

◆ RebootState

+ +
+
+ + + + + +
+ + + + +
RebootState Tgstation.Server.Host.Models.ReattachInformationBase.RebootState
+
+getset
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.png new file mode 100644 index 0000000000000000000000000000000000000000..0ea6df129e84fc68006c658152fac78c706976e8 GIT binary patch literal 2684 zcmcgudo)yQ8{b0>Ifhi^3^9&Nq7XB2oS8v#8A`dG1`&xuZe=1eqekUcY7`M7AsNQC za-S3_O(qi|3^_vX#&w!8-yY}t*7w&r>s#lKZ?CoY`#kS@F7JMy-}C<7_+xffFbTK> z001zY^&tlU5QTzroVY0X^|z5^frI?9!%h|gfdCZ8r~{e6z=D!~kfHL8aQyIBql*LKnx2;=aeC0C`9N0+&?=1yns@YDL?-0nbg; zD{6#hIFLlog|Ze@_tY(ap$QVgd&4P<8Tl@~5p_+2cOHja>p0j(3HxB5C(qyp+t^!M zMuvOg0{}gdGlgaiF|>g1YdqJr?0`8-D@yZ{$=PFv98A}t1Xic(t^~YV)%3sZ@p#bNC10ic*(5&n4_**V&*a&uxuWO#%a~06n9GrF$!je1 z&$)S(1`Of)Y+>D$ce+RVXjHQbjpDTFuJtq8btPV1K1@G_Q~QIZzfI|c?NB;y?^FKp z@IE_jg#(wJk`&-Lhb!Q3U(tq7CHA_0rPk`pXy7)lP1g<(1&UJkQ%ww& zN?<6^IDUZ#&WX{lK+7-ShAY5r3UMY=B^)M{{Eq$JwnAImWkVcrA1oKDkW6p{# z01YXACv7|B@iyTe9!HAT2^8S56sy0e`R&5G=DEHvyZz#-3ElR;JGYD&-*S556J7c; zScS@-N?tJf4(Y7J#62<*TVK<#(ZIbr^C@`4K$n{vF0FV`Ks3ag3I=bC(|Aqx;o`d?0zQeRi`fZl30k^gxne_cGM zrIUKDez5S(JVCxGP8PwGC?Dsq?W3zO>`FUia=?vFqPr0yb0yp5K66bzdqzhcA%DwB zLq^E@Px2KmY|`8Sz~Ds;MzE&SHm31{@0yJz&5qU*8iMY#8L1k>_MZ?9)(t!1Q#6i> zfz`9xepemL^t{|1EUfqBb$klu4TpN8T|+V?K?u`uWJI^f;og?lL?75ezHfdlY1`BA z06d|lrb2dOnhdWiLt?Y=>MZJynyRI~Xes~716BY;q)_0gN5!y3OwN~(02bUk#%1~GW z%TxIm47TVc5C7H}Z`F3NKX~xdP(*f=M`uWH&!1^lw45JO0l6cr!P)A zpbVQO^_<7841j08H&8B3QW#Pcc2ThZ){8BMNO2zr>{C=v9rc}l!*725)NbF+Bv&$X z)1OAOXXo6bdfy7r{3gTii(w)n?RiT_da5~AZm`*g)8?GQA!Nl94R-M+@dBE!u;L8HyXO*5)D{ znTOVXu*h@WItH)*2y$Mu9r@b>TiYeAg}fC(Bz*BiWwmkQFPP4ul?&Rq<3-5TjIPS0 zMpenC)I!_%K*tV4&L}ZZUb*FN!Oo%;qY308t+7w5<3X^pT(cw-L9MuI$K{C1%NYcj zsL0m)OAp5oC3Bb7v3X{NsP^^OCkj*&32USMHl5Bk|K+(hiv!dAl-uz_mcwTR#`#=~ z(mNA=$uxA1yu3f@Alc}OzBD8IQS>F=*xHXc=s-8MrwpEc^CwJB&`O6|1gRI9G;OnO+9D{1nwO@l@%P)nh-XvO_`1B=^2Mw + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.RepositorySettings Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html new file mode 100644 index 0000000000..85dd0c2afc --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html @@ -0,0 +1,251 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.RepositorySettings Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.RepositorySettings Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.RepositorySettings:
+
+
+ + +Tgstation.Server.Api.Models.Internal.RepositorySettings + +
+ + + + + +

+Public Member Functions

Repository ToApi ()
 Convert the Repository to it's API form More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

long Id [get, set]
 The row Id More...
 
long InstanceId [get, set]
 The Api.Models.Instance.Id More...
 
Instance Instance [get, set]
 The parent Models.Instance More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.RepositorySettings
string CommitterName [get, set]
 The name of the committer More...
 
string CommitterEmail [get, set]
 The e-mail of the committer More...
 
string AccessUser [get, set]
 The username to access the git repository with More...
 
string AccessToken [get, set]
 The token/password to access the git repository with More...
 
bool? PushTestMergeCommits [get, set]
 If commits created from testmerges are pushed to the remote More...
 
bool? ShowTestMergeCommitters [get, set]
 If test merge commits are signed with the username of the person who merged it. Note this only affects future commits More...
 
bool? AutoUpdatesKeepTestMerges [get, set]
 If test merge commits should be kept when auto updating. May cause merge conflicts which will block the update More...
 
bool? AutoUpdatesSynchronize [get, set]
 If synchronization should occur when auto updating More...
 
bool? PostTestMergeComment [get, set]
 If test merging should create a comment More...
 
+

Detailed Description

+
+

Definition at line 7 of file RepositorySettings.cs.

+

Member Function Documentation

+ +

◆ ToApi()

+ +
+
+ + + + + + + +
Repository Tgstation.Server.Host.Models.RepositorySettings.ToApi ()
+
+ +

Convert the Repository to it's API form

+
Returns
A new Repository
+ +
+
+

Property Documentation

+ +

◆ Id

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.RepositorySettings.Id
+
+getset
+
+ +

The row Id

+ +

Definition at line 12 of file RepositorySettings.cs.

+
12 { get; set; }
+
+
+ +

◆ Instance

+ +
+
+ + + + + +
+ + + + +
Instance Tgstation.Server.Host.Models.RepositorySettings.Instance
+
+getset
+
+ +

The parent Models.Instance

+ +

Definition at line 23 of file RepositorySettings.cs.

+
23 { get; set; }
+
+
+ +

◆ InstanceId

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.RepositorySettings.InstanceId
+
+getset
+
+ +

The Api.Models.Instance.Id

+ +

Definition at line 17 of file RepositorySettings.cs.

+
17 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..4bc53d481887cd032fe59fb998bd9f7f90c28fde GIT binary patch literal 1245 zcmeAS@N?(olHy`uVBq!ia0y~yU~~tv12~w0Dn`vL>Ep_YVui}Esdt#FGcblI( zQ@1C&maqDKJnK!R)5=lPKa^YOv6|nM@BW=}>f^)%Uq( zYp+k+y2i(be{Pxly>FQ`=ZwR>%aYF4&u!YHu0KC7Q8xeS)#tXoSI)g>Z+e%~bEfzX zyXRRG)30efY&>eo!kz62x$9E;Yua`$n%Vr~%%t5J?Ja*iOn*LGT;BOr%*NN^+j_Ms z`DHgh`35Qcwkj$)$tIKkv+wECP4enS>-vrJo_%jtH#c*-pgg<4#4k>|`rO9|nc%?i z$XiO>mv?!Yc72?6^J?jRf#&^&w+yGhdpYmn+{Lj!?aW+0tXsEu>8!#nOOx;E?*CXH zQX|}#7qLVBuHF3WU-$YgNsD@Kc5%0cGt1{)|7z@x$;{1Ke%!0 zHLtZ>rwQ>cV3`nrX4l@w757{m^8bGQDAK=|pQ+=E(dT2wf8VsNlY3Uak?D+S?{(Hc zn|>dD`!&)2p1t3v4`SJgd!AR+#6I3(@-pSF_;>aLKHf6&D{bWGNxs!C|GTH^`~7+E zpMHpVy8PzplowK#^W^>B_a*<&S#B~xUo6?;*xP&8@6KLvtf61&&hNWx7=+gr+?nfa z-0PNqEP)}R$W-w51iizvPit>cUi|v@m5LG(_g78@5AUpLR&Vg=mf1aBZae?gX>QC+ zH?Kcr>08cWaqq>B&xL80JRhZ)=PmiR@7n){#WUZWsXg{F;>f&PoJY%8e{b|JENhpP z{B~{fOvPLO6_3YVF3Xv5%lws9)Fnyx=%i=2 z0;c=-t}kEi|NX1zA6u>DzjKbvJ9U4@df9-6dZ*P7>(1u2F5d6VP`6X;aI8_ZSA8Zh z9mzeAzZl+~qx$#iE;bFuBj_>De*9XL_SS1rZvPptE_cpf{D9RTSQasOy85}Sb4q9e E01jnz5&!@I literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_rev_info_test_merge-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_rev_info_test_merge-members.html new file mode 100644 index 0000000000..3850ff35c0 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_rev_info_test_merge-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.RevInfoTestMerge Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_rev_info_test_merge.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_rev_info_test_merge.html new file mode 100644 index 0000000000..0adf81ae38 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_rev_info_test_merge.html @@ -0,0 +1,187 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.RevInfoTestMerge Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.RevInfoTestMerge Class Reference
+
+
+ +

Many to many relationship for Models.RevisionInformation and Models.TestMerge + More...

+ + + + + + + + + + + +

+Properties

long Id [get, set]
 The row Id More...
 
TestMerge TestMerge [get, set]
 The Models.TestMerge More...
 
RevisionInformation RevisionInformation [get, set]
 The Models.RevisionInformation More...
 
+

Detailed Description

+

Many to many relationship for Models.RevisionInformation and Models.TestMerge

+ +

Definition at line 8 of file RevInfoTestMerge.cs.

+

Property Documentation

+ +

◆ Id

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.RevInfoTestMerge.Id
+
+getset
+
+ +

The row Id

+ +

Definition at line 13 of file RevInfoTestMerge.cs.

+
13 { get; set; }
+
+
+ +

◆ RevisionInformation

+ +
+
+ + + + + +
+ + + + +
RevisionInformation Tgstation.Server.Host.Models.RevInfoTestMerge.RevisionInformation
+
+getset
+
+ +

The Models.RevisionInformation

+ +

Definition at line 25 of file RevInfoTestMerge.cs.

+
25 { get; set; }
+
+
+ +

◆ TestMerge

+ +
+
+ + + + + +
+ + + + +
TestMerge Tgstation.Server.Host.Models.RevInfoTestMerge.TestMerge
+
+getset
+
+ +

The Models.TestMerge

+ +

Definition at line 19 of file RevInfoTestMerge.cs.

+
19 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information-members.html new file mode 100644 index 0000000000..1516fd5996 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information-members.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.RevisionInformation Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html new file mode 100644 index 0000000000..a08f0c77fc --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html @@ -0,0 +1,321 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.RevisionInformation Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.RevisionInformation Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.RevisionInformation:
+
+
+ + +Tgstation.Server.Api.Models.Internal.RevisionInformation + +
+ + + + + +

+Public Member Functions

Api.Models.RevisionInformation ToApi ()
 Convert the RevisionInformation to it's API form More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

long Id [get, set]
 The row Id More...
 
long InstanceId [get, set]
 The Api.Models.Instance.Id More...
 
Instance Instance [get, set]
 The Models.Instance the RevisionInformation belongs to More...
 
TestMerge PrimaryTestMerge [get, set]
 See Api.Models.RevisionInformation.PrimaryTestMerge More...
 
List< RevInfoTestMergeActiveTestMerges [get, set]
 See Api.Models.RevisionInformation.ActiveTestMerges More...
 
List< CompileJobCompileJobs [get, set]
 See CompileJobs made from this RevisionInformation More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.RevisionInformation
string CommitSha [get, set]
 The revision sha More...
 
string OriginCommitSha [get, set]
 The sha of the most recent remote commit More...
 
+

Detailed Description

+
+

Definition at line 8 of file RevisionInformation.cs.

+

Member Function Documentation

+ +

◆ ToApi()

+ +
+
+ + + + + + + +
Api.Models.RevisionInformation Tgstation.Server.Host.Models.RevisionInformation.ToApi ()
+
+ +

Convert the RevisionInformation to it's API form

+
Returns
A new Api.Models.RevisionInformation
+ +
+
+

Property Documentation

+ +

◆ ActiveTestMerges

+ +
+
+ + + + + +
+ + + + +
List<RevInfoTestMerge> Tgstation.Server.Host.Models.RevisionInformation.ActiveTestMerges
+
+getset
+
+
+ +

◆ CompileJobs

+ +
+
+ + + + + +
+ + + + +
List<CompileJob> Tgstation.Server.Host.Models.RevisionInformation.CompileJobs
+
+getset
+
+ +

See CompileJobs made from this RevisionInformation

+ +

Definition at line 39 of file RevisionInformation.cs.

+
39 { get; set; }
+
+
+ +

◆ Id

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.RevisionInformation.Id
+
+getset
+
+ +

The row Id

+ +

Definition at line 13 of file RevisionInformation.cs.

+
13 { get; set; }
+
+
+ +

◆ Instance

+ +
+
+ + + + + +
+ + + + +
Instance Tgstation.Server.Host.Models.RevisionInformation.Instance
+
+getset
+
+ +

The Models.Instance the RevisionInformation belongs to

+ +

Definition at line 24 of file RevisionInformation.cs.

+
24 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess().

+ +
+
+ +

◆ InstanceId

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.RevisionInformation.InstanceId
+
+getset
+
+ +

The Api.Models.Instance.Id

+ +

Definition at line 18 of file RevisionInformation.cs.

+
18 { get; set; }
+
+
+ +

◆ PrimaryTestMerge

+ +
+
+ + + + + +
+ + + + +
TestMerge Tgstation.Server.Host.Models.RevisionInformation.PrimaryTestMerge
+
+getset
+
+ +

See Api.Models.RevisionInformation.PrimaryTestMerge

+ +

Definition at line 29 of file RevisionInformation.cs.

+
29 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.png new file mode 100644 index 0000000000000000000000000000000000000000..edb0bd20150109643a65519ae0a93af7af59f05a GIT binary patch literal 1200 zcmeAS@N?(olHy`uVBq!ia0y~yVDtsD12~w0_AE)z$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opE&6*^#6wYW) zyZKLL=JLNawXcu$HC|TooOR;toq8Fw_ebB>WKVlC@9IeaG$($r*J*cZ%POKUSZ$e#^c1dpFnSZ>!6>_I2~qdvRaVs{C&+vzWYi zr~Z2O6@RV6ew^ib_0{Lcg+AN&k9zbAMMVFb^5#C(@EX_+F!O0Y{whYx{p6G;5hwBXOh*; z`Sa4Ie`lD&6Y8qHGOK`zFBu{Z!NMje;a7&mr-`QEq$}~=g(g6 zAJ2MI;r^NJxc=SQ$+PsX6ffPb^J|x+N@-z!TGP6^Rm%F@9!f$7J#Noo#L zkny?bce!Hn4$iV!Y7Wb1Z>|)4 zQ1URVUhIJB+1f9XXP?iu^LhO8$8nQ*&b|Bhe2(&W_-5vRWIN7&nYYciP|g3d zgvFk6liM5aURtouo=}l4K?t0Jy@CSTNz%FC5k_%rV<;k=;z=AMlDvmmLEUtjlH zI(>L^ucYn2xbN-D+445;vhKV1w$5>FVdQ&MBb@0CA*D5&!@I literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context-members.html new file mode 100644 index 0000000000..b784b074a1 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context-members.html @@ -0,0 +1,110 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.SqlServerDatabaseContext Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Models.SqlServerDatabaseContext, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
ChatBotsTgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
ChatChannelsTgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
CompileJobsTgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
DatabaseConfigurationTgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >protected
DatabaseContext(DbContextOptions< TParentContext > dbContextOptions, IOptions< DatabaseConfiguration > databaseConfigurationOptions, IDatabaseSeeder databaseSeeder, ILogger logger)Tgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
DreamDaemonSettingsTgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
DreamMakerSettingsTgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
Initialize(CancellationToken cancellationToken)Tgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
InstancesTgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
InstanceUsersTgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
JobsTgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
LoggerTgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >protected
OnConfiguring(DbContextOptionsBuilder options)Tgstation.Server.Host.Models.SqlServerDatabaseContextprotected
OnModelCreating(ModelBuilder modelBuilder)Tgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >protected
ReattachInformationsTgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
RepositorySettingsTgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
RevInfoTestMergesTgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
RevisionInformationsTgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
Save(CancellationToken cancellationToken)Tgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
SchemaDowngradeForServerVersion(Version version, CancellationToken cancellationToken)Tgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
SqlServerDatabaseContext(DbContextOptions< SqlServerDatabaseContext > dbContextOptions, IOptions< DatabaseConfiguration > databaseConfiguration, IDatabaseSeeder databaseSeeder, ILogger< SqlServerDatabaseContext > logger)Tgstation.Server.Host.Models.SqlServerDatabaseContext
TestMergesTgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
UseMySQLMigrations()Tgstation.Server.Host.Models.SqlServerDatabaseContextprotectedvirtual
UsersTgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
WatchdogReattachInformationsTgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context.html new file mode 100644 index 0000000000..67a68cda85 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context.html @@ -0,0 +1,294 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.SqlServerDatabaseContext Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.SqlServerDatabaseContext Class Reference
+
+
+ +

DatabaseContext<TParentContext> for Sqlserver + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.SqlServerDatabaseContext:
+
+
+ + +Tgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext > + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

 SqlServerDatabaseContext (DbContextOptions< SqlServerDatabaseContext > dbContextOptions, IOptions< DatabaseConfiguration > databaseConfiguration, IDatabaseSeeder databaseSeeder, ILogger< SqlServerDatabaseContext > logger)
 Construct a SqlServerDatabaseContext More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
 DatabaseContext (DbContextOptions< TParentContext > dbContextOptions, IOptions< DatabaseConfiguration > databaseConfigurationOptions, IDatabaseSeeder databaseSeeder, ILogger logger)
 Construct a DatabaseContext<TParentContext> More...
 
async Task Initialize (CancellationToken cancellationToken)
 
Task Save (CancellationToken cancellationToken)
 
async Task SchemaDowngradeForServerVersion (Version version, CancellationToken cancellationToken)
 
+ + + + + + + + + +

+Protected Member Functions

override void OnConfiguring (DbContextOptionsBuilder options)
 
override bool UseMySQLMigrations ()
 If the MY_ class of migrations should be used instead of the MS_ class More...
 
- Protected Member Functions inherited from Tgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
override void OnModelCreating (ModelBuilder modelBuilder)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Properties inherited from Tgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
DbSet< UserUsers [get, set]
 
DbSet< InstanceInstances [get, set]
 
DbSet< CompileJobCompileJobs [get, set]
 
DbSet< RevisionInformationRevisionInformations [get, set]
 
DbSet< DreamMakerSettingsDreamMakerSettings [get, set]
 
DbSet< ChatBotChatBots [get, set]
 
DbSet< DreamDaemonSettingsDreamDaemonSettings [get, set]
 
DbSet< RepositorySettingsRepositorySettings [get, set]
 
DbSet< InstanceUserInstanceUsers [get, set]
 
DbSet< ChatChannelChatChannels [get, set]
 
DbSet< JobJobs [get, set]
 
DbSet< ReattachInformationReattachInformations [get, set]
 
DbSet< WatchdogReattachInformationWatchdogReattachInformations [get, set]
 
DbSet< TestMergeTestMerges [get, set]
 The TestMerges in the DatabaseContext<TParentContext> More...
 
DbSet< RevInfoTestMergeRevInfoTestMerges [get, set]
 The RevInfoTestMerges om the DatabaseContext<TParentContext> More...
 
ILogger Logger [get]
 The ILogger for the DatabaseContext<TParentContext> More...
 
DatabaseConfiguration DatabaseConfiguration [get]
 The DatabaseConfiguration for the DatabaseContext<TParentContext> More...
 
+

Detailed Description

+

DatabaseContext<TParentContext> for Sqlserver

+ +

Definition at line 11 of file SqlServerDatabaseContext.cs.

+

Constructor & Destructor Documentation

+ +

◆ SqlServerDatabaseContext()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Models.SqlServerDatabaseContext.SqlServerDatabaseContext (DbContextOptions< SqlServerDatabaseContextdbContextOptions,
IOptions< DatabaseConfigurationdatabaseConfiguration,
IDatabaseSeeder databaseSeeder,
ILogger< SqlServerDatabaseContextlogger 
)
+
+ +

Construct a SqlServerDatabaseContext

+
Parameters
+ + + + + +
dbContextOptionsThe DbContextOptions<TContext> for the DatabaseContext<TParentContext>
databaseConfigurationThe IOptions<TOptions> of DatabaseConfiguration for the DatabaseContext<TParentContext>
databaseSeederThe IDatabaseSeeder for the DatabaseContext<TParentContext>
loggerThe ILogger for the DatabaseContext<TParentContext>
+
+
+ +

Definition at line 20 of file SqlServerDatabaseContext.cs.

+
20  : base(dbContextOptions, databaseConfiguration, databaseSeeder, logger)
21  { }
readonly IDatabaseSeeder databaseSeeder
The IDatabaseSeeder for the DatabaseContext<TParentContext>
+
+
+
+

Member Function Documentation

+ +

◆ OnConfiguring()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Models.SqlServerDatabaseContext.OnConfiguring (DbContextOptionsBuilder options)
+
+protected
+
+ +

+ +

Definition at line 24 of file SqlServerDatabaseContext.cs.

+
25  {
26  base.OnConfiguring(options);
27  options.UseSqlServer(DatabaseConfiguration.ConnectionString);
28  }
string ConnectionString
The connection string for the database
+
Configuration options for the Models.DatabaseContext<TParentContext>
+
+

References Tgstation.Server.Host.Configuration.DatabaseConfiguration.ConnectionString.

+ +
+
+ +

◆ UseMySQLMigrations()

+ +
+
+ + + + + +
+ + + + + + + +
override bool Tgstation.Server.Host.Models.SqlServerDatabaseContext.UseMySQLMigrations ()
+
+protectedvirtual
+
+ +

If the MY_ class of migrations should be used instead of the MS_ class

+ +

Implements Tgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context.png new file mode 100644 index 0000000000000000000000000000000000000000..8693b9d7a270f504a40471757451841410359718 GIT binary patch literal 1377 zcmeAS@N?(olHy`uVBq!ia0y~yU_1(B2XHV0$@s(bJ^?9-0G|-o|Ns93nJ?aaE$u%v z0muU50|ySUcHWT(ayd$Z{DK*Pia_A%sSqOu29^(=E{-7;jBn@O&UyB>uaucl_sT6V?6H#ou2GstVwAuUa>pb}MA&#rY#G(0a( z6;ajPrFC@EA5WvTwRUx-$)yR~JtnzDE&Dq8`ukgN+vnEiUoMmJnf&C|g{#c<$GYe3 ze<%B6vfi)V72E!u_;#nB|FPxK(l2sH*FBHxIJPdX<%IsKoi()&_;*<>`N8pIQc-c* zjQVV)bHdv*wlnL+p3gija{a01wZ>i5?i+cdC$kl95B|NqGEL`(?3&f5LpC4$pf}^Q zF8j_(kO7M<)=%il)XF;RQ}EDyVxD)*hwYuab^n|L>pre0en9EjCzjmT%q0=Q=%3SK6=3 zEU9kY?z%0(Lo2TKx^?Uu3%P(T?ovxzw9lRH%@^Ai^rGk6%a<{;cDuXj{7iJc%jVm3 zWm7Qs7G1e!ft@%1-p)yvX4m8U6DPh~#ClmpRAB6vzq;GSPuuHSckNb@4U&o9zqqJ0 z>!HfUzixN8ZWqay`*BwQSF7yqs`{tLXZ+zw>=*5I@^kN9ty_EWV*Ky3 zv-=*MY`p*e(aYU0sF86^}PM$?+_d0`(|57-;d{~u82R5`5UUf zR&o2f(sj2MAL-N+LDlvu1QlS zEphPbnj{kI88~T?Has1$ABCon7{))3e=&J5vV;Y(aI9Ou{s@Oaw5OoL4mkl~Wrqw^ z*M=WnZ4AI9!wA&O9sT%h|C~q46THjLduIGwYq@{M z?YnbLT_!%4{q6lSrN=Y3=9tGXo5i~?d?Ewi z7pJbx#Q{ExFU*?x;84EO-Dx`>;Ut^tQ)~oYjTz7x|n*G4fzP!ID;?v*98JhP#9typZ8$3B;tI@SXdEMt4 z7R~1UV7#~SQKoC@#qV3s#p(R-daLp7-QfvI+jp4Xx_2~N-%sn+%5?Se!Wd14ee3=A zce^u|Uc482<#T!Aj5o(8-=5O0 zbwVfhb;oYwZKwB}m3o?PynV^?kyb(al`Chn^|Lrl+E?v=^(;H=#@StGb-%BDbnPoc z{o3mRZwi?H)VY2Vec+Bai06_bDiFp60}Xiq^;Tl`&1r%cjXI%UT% a=4~fpV%}Ly+yE>O89ZJ6T-G@yGywpKLzu<@ literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge-members.html new file mode 100644 index 0000000000..da6b151f44 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge-members.html @@ -0,0 +1,101 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.TestMerge Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html new file mode 100644 index 0000000000..f871f71cf6 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html @@ -0,0 +1,296 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.TestMerge Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.TestMerge Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.TestMerge:
+
+
+ + +Tgstation.Server.Api.Models.Internal.TestMerge +Tgstation.Server.Api.Models.Internal.TestMergeBase +Tgstation.Server.Api.Models.TestMergeParameters + +
+ + + + + +

+Public Member Functions

Api.Models.TestMerge ToApi ()
 Convert the TestMerge to it's API form More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

User MergedBy [get, set]
 See Api.Models.TestMerge.MergedBy More...
 
RevisionInformation PrimaryRevisionInformation [get, set]
 The initial RevisionInformation the TestMerge was merged with More...
 
long? PrimaryRevisionInformationId [get, set]
 Foreign key for PrimaryRevisionInformation More...
 
List< RevInfoTestMergeRevisonInformations [get, set]
 All the RevInfoTestMerge for the TestMerge More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.TestMerge
long Id [get, set]
 The ID of the TestMerge More...
 
DateTimeOffset MergedAt [get, set]
 When the TestMerge was created More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.TestMergeBase
string TitleAtMerge [get, set]
 The title of the pull request More...
 
string BodyAtMerge [get, set]
 The body of the pull request More...
 
string Url [get, set]
 The URL of the pull request More...
 
string Author [get, set]
 The author of the pull request More...
 
- Properties inherited from Tgstation.Server.Api.Models.TestMergeParameters
int? Number [get, set]
 The number of the pull request More...
 
string PullRequestRevision [get, set]
 The sha of the pull request revision to merge. If not specified, the latest commit shall be used (semi-unsafe) More...
 
string Comment [get, set]
 Optional comment about the test More...
 
+ + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from Tgstation.Server.Api.Models.Internal.TestMergeBase
 TestMergeBase ()
 Construct a TestMergeBase More...
 
 TestMergeBase (TestMergeBase copy)
 Construct a TestMergeBase from a copy More...
 
+

Detailed Description

+
+

Definition at line 7 of file TestMerge.cs.

+

Member Function Documentation

+ +

◆ ToApi()

+ +
+
+ + + + + + + +
Api.Models.TestMerge Tgstation.Server.Host.Models.TestMerge.ToApi ()
+
+ +

Convert the TestMerge to it's API form

+
Returns
A new Api.Models.TestMerge
+ +
+
+

Property Documentation

+ +

◆ MergedBy

+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Host.Models.TestMerge.MergedBy
+
+getset
+
+ +

See Api.Models.TestMerge.MergedBy

+ +

Definition at line 13 of file TestMerge.cs.

+
13 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess().

+ +
+
+ +

◆ PrimaryRevisionInformation

+ +
+
+ + + + + +
+ + + + +
RevisionInformation Tgstation.Server.Host.Models.TestMerge.PrimaryRevisionInformation
+
+getset
+
+ +

The initial RevisionInformation the TestMerge was merged with

+ +

Definition at line 19 of file TestMerge.cs.

+
19 { get; set; }
+
+
+ +

◆ PrimaryRevisionInformationId

+ +
+
+ + + + + +
+ + + + +
long? Tgstation.Server.Host.Models.TestMerge.PrimaryRevisionInformationId
+
+getset
+
+ +

Foreign key for PrimaryRevisionInformation

+ +

Definition at line 24 of file TestMerge.cs.

+
24 { get; set; }
+
+
+ +

◆ RevisonInformations

+ +
+
+ + + + + +
+ + + + +
List<RevInfoTestMerge> Tgstation.Server.Host.Models.TestMerge.RevisonInformations
+
+getset
+
+ +

All the RevInfoTestMerge for the TestMerge

+ +

Definition at line 29 of file TestMerge.cs.

+
29 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.png new file mode 100644 index 0000000000000000000000000000000000000000..3b2a74c1954bfa698fa0cb358c52306e1e3d44c8 GIT binary patch literal 2392 zcmcJRc~DbH9>)VLE5cv~!~^A0K^GX1Q6b6^Kv8@k34(%x7eY`5b8R4iTplY7ARrM5 z0|LV#mqreO5IK^OBivCCl)M-aArV7hFpwxQVS+Wfv-8LPGc~WOU;p}bS65ekKlSOC zlEEa&m+eUE-x=D%C|F%;ptCqDXPzn z!CAtxlhZ zHqem<79MY}ZEriFvpnb*dT+$fJ!v~&0=Sho0$yi2JV@`&Fr-Xh{OyuvJt|6eJLph+ z%%@G>p9=}&GnWun2>0@!U)YnvUxNjxllVqM4R z>>S#hGhwUE9+NgV<=J6CGrPKS=p)8G^sX8In8CK3V#Mi5u&L{jqjgG9=fyX;i8rf# zW@4CXPtNV6Er!d~H*I0>_cKhg$b#Sa8QUGg5Ju17ckdbT zjvnY&MVSqGjHX0Q5{>nEy2H}}-8`D16+g%-$bU4T``-dq+%U+o6okD^2y_+rayV9r zk7*M&mo%^uXDbgFWo!v~Rx)p!?Z03bemS1r!O?sFF*5=ac+(jbJV*VNs5T1&dLKw_ zTc(1gA#=XYDFoCdHjA^s*>Ebo^JEcO_T2WZY~h3hvA64K&8Qd|!8y&H8=i)El3I&) z=8}UtH{89!xhCHN&@19Qh3>R=J_QyEEG5WaMM)8sW#MLu%+!x_j7_U1wgXY?U_j6P zl>ng_O1;kyl=_H*r$f_-vZ_IO)vaTAl@BflHI1q!{&~w6 zuhMnDQEBox2cifbqS)w4bMj`VGm6E3aoVw;Qa|EGsn62(Ai0q;Jy(cI&NZI;dS)Rf zYY|D(mCetGMpEh7Ho#!ge*p^tFb{UJypkQKtAG-?Jd`A$l{fYovbPCF@z=qV zZZ)m|kz-P#`8N7A5qXi344ai0EZoE>7O9jy*>v1v?e*nvQcBm!n2 zwc-d2RmIK#Gxl%%c&be1X&Vjq%N=YT*y?BAPUHg*~=yADl8&fwT1ZCW+Ry+$&p8AXxHjgi*E45> zwQ^uru_HWAbFL2#Tz1DyiK|&r<^v*OoiS{Le8IHCz+~F1jE`<081h2puOL|$r?Ot& z8pGo3+)c&*0?3bFi>)M|=IfT0PB7`=;zhc2M(d$B3nkEoO*NuHi72@CWklqK?Hw;d z<_m>z38k}cUu08?@7Al#)UuyQ#$}-xP*Qy$Wywn86nlGHE6R=iaNoNysm_4!nEm){U;>b->-WtiM~ zlCzCt=P_#(faZabDAhYrc>3w#>0F6_B>59n+AkjBUcI)Suimz&l$J`{78TZRwa^=9 zD=D32_*pSy-<2f_YxwCHlWsvK_(fwS$nbS+YwA#-89*;~>=9auaz#Yq5tHeN1z#5E z!IOOU7)IxdzP{W)FRuHCQttSLT5P*QuQa@(?c}y%uYv-Fy^iBm4hybQ7)r(pXTgsi z{k#12J75AN!9NRSYSCL;(yr{Oe7O8ivgGm`Bw9bG%RhWr=br;pa`7Xlrcn8@Y&ubn zJ&=lql-#k!iU#-2hIB;3AJWj+vDd`)KU`8VqCguRIPiG;7CQXhJT@;@Hdmw1qpJLR zs=*TPoe#>-Q{gy46~%p3&{^S(i;Ycwu===96b6iVbo~arPnlfZO~K-)4K#M#cKtat zN4D5~p3t|!DzFY;a=sLTS=6E$1h69ibJ6{xlJcl)ghhv?GG^_hz;hdhuopsI%FZpU z;a~1VON(0a#s8Q&hT}fgxGnysuiD_<0`A=C?5e&@YWlb1J_UpoXrO5=4-`_m9|ofH z^6?tEJx|kOD%QM?JOGg_4Xzl;{+ew|>sV1w9~b*te;zvv1Ch~X>N&aQfkO-)k&hU8 zitKmIS;BFUl+D;3wcqP1H~J=nkZ;GAQ)+dmX!p`~GYVep(2d1$cQJLx=LFYp!tZ-u sSw{cqHhOU#to_bC + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.User Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html new file mode 100644 index 0000000000..db3aa4bf85 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html @@ -0,0 +1,425 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.User Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.User Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.User:
+
+
+ + +Tgstation.Server.Api.Models.Internal.User + +
+ + + + + +

+Public Member Functions

Api.Models.User ToApi (bool showDetails)
 Convert the User to it's API form More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

string PasswordHash [get, set]
 The hash of the user's password More...
 
User CreatedBy [get, set]
 See Api.Models.User More...
 
string CanonicalName [get, set]
 The uppercase invariant of Api.Models.Internal.User.Name More...
 
DateTimeOffset? LastPasswordUpdate [get, set]
 When PasswordHash was last changed More...
 
List< UserCreatedUsers [get, set]
 Users created by this User More...
 
List< InstanceUserInstanceUsers [get, set]
 The InstanceUsers for the User More...
 
List< TestMergeTestMerges [get, set]
 The TestMerges made by the User More...
 
- Properties inherited from Tgstation.Server.Api.Models.Internal.User
long Id [get, set]
 The ID of the User More...
 
bool? Enabled [get, set]
 If the User is enabled since users cannot be deleted. System users cannot be disabled More...
 
DateTimeOffset? CreatedAt [get, set]
 When the User was created More...
 
string SystemIdentifier [get, set]
 The SID/UID of the User on Windows/POSIX respectively More...
 
string Name [get, set]
 The name of the User More...
 
AdministrationRightsAdministrationRights [get, set]
 The Rights.AdministrationRights for the User More...
 
InstanceManagerRightsInstanceManagerRights [get, set]
 The Rights.InstanceManagerRights for the User More...
 
+ + + + +

+Private Member Functions

Api.Models.User ToApi (bool recursive, bool showDetails)
 See ToApi(bool) More...
 
+

Detailed Description

+
+

Definition at line 8 of file User.cs.

+

Member Function Documentation

+ +

◆ ToApi() [1/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Api.Models.User Tgstation.Server.Host.Models.User.ToApi (bool recursive,
bool showDetails 
)
+
+private
+
+ +

See ToApi(bool)

+
Parameters
+ + + +
recursiveIf we should recurse on CreatedBy
showDetailsIf rights and system identifier should be shown
+
+
+
Returns
A new Api.Models.User
+ +
+
+ +

◆ ToApi() [2/2]

+ +
+
+ + + + + + + + +
Api.Models.User Tgstation.Server.Host.Models.User.ToApi (bool showDetails)
+
+ +

Convert the User to it's API form

+
Parameters
+ + +
showDetailsIf rights and system identifier should be shown
+
+
+
Returns
A new Api.Models.User
+ +
+
+

Property Documentation

+ +

◆ CanonicalName

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Models.User.CanonicalName
+
+getset
+
+ +

The uppercase invariant of Api.Models.Internal.User.Name

+ +

Definition at line 24 of file User.cs.

+
24 { get; set; }
+
+
+ +

◆ CreatedBy

+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Host.Models.User.CreatedBy
+
+getset
+
+ +

See Api.Models.User

+ +

Definition at line 18 of file User.cs.

+
18 { get; set; }
+
+
+ +

◆ CreatedUsers

+ +
+
+ + + + + +
+ + + + +
List<User> Tgstation.Server.Host.Models.User.CreatedUsers
+
+getset
+
+ +

Users created by this User

+ +

Definition at line 34 of file User.cs.

+
34 { get; set; }
+
+
+ +

◆ InstanceUsers

+ +
+
+ + + + + +
+ + + + +
List<InstanceUser> Tgstation.Server.Host.Models.User.InstanceUsers
+
+getset
+
+ +

The InstanceUsers for the User

+ +

Definition at line 39 of file User.cs.

+
39 { get; set; }
+
+
+ +

◆ LastPasswordUpdate

+ +
+
+ + + + + +
+ + + + +
DateTimeOffset? Tgstation.Server.Host.Models.User.LastPasswordUpdate
+
+getset
+
+ +

When PasswordHash was last changed

+ +

Definition at line 29 of file User.cs.

+
29 { get; set; }
+

Referenced by Tgstation.Server.Host.Security.CryptographySuite.SetUserPassword().

+ +
+
+ +

◆ PasswordHash

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Models.User.PasswordHash
+
+getset
+
+ +

The hash of the user's password

+ +

Definition at line 13 of file User.cs.

+
13 { get; set; }
+

Referenced by Tgstation.Server.Host.Security.CryptographySuite.CheckUserPassword(), and Tgstation.Server.Host.Security.CryptographySuite.SetUserPassword().

+ +
+
+ +

◆ TestMerges

+ +
+
+ + + + + +
+ + + + +
List<TestMerge> Tgstation.Server.Host.Models.User.TestMerges
+
+getset
+
+ +

The TestMerges made by the User

+ +

Definition at line 44 of file User.cs.

+
44 { get; set; }
+
+
+
The documentation for this class was generated from the following file:
    +
  • src/Tgstation.Server.Host/Models/User.cs
  • +
+
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.png new file mode 100644 index 0000000000000000000000000000000000000000..0e8b60a32332ef737a8a4478871c237917806002 GIT binary patch literal 929 zcmV;S177@zP)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d0009pNklG&E;E+B|o3zPKdYN@Tfh zT(^JUL4FJ2{^uUadYt>?(Yrodocp@l(cjG;Ca%koZ_{gdhP=-3&dj!~spmthKI>Gw zbbZ*dJ)WL?T~I2fsi-w$-~u;3+LR$|YqN*9ZKm@Tc@Cm8htx&ufWmkJ@;2A_>lZe8 zS0n|pub#XMFCZWG+?SgU#XAbgN3$bx!}Cb2WAg1JOrGt@YE#d5_+t#0-^|BsZ;9d7 z^U;pk-p6x9ewyv$RdV;fUG=eeM=5zg-c1Y7ygSS|+k+54de38Ww`pT`wGjHN8|3%N zJwMC#OZWUjZQrZtS~(a{}eD0$5ZN%|uFRB}m5p-C=DxirZoDVJ{K%d#vP1@LWp14yZ~ z}iqC7-n&Ae$yRKrT&kfLxm70J${D0di@Q1LV>q2gs#K4v+9qDK6mMa9DB=ZGD>IL*pQ*K3{;= zE|NDN%~QV(HW3RD$iBKt61xb*5z+ytLawgdbvO>%%-n&bevbR#dNl#F@@9}qK_Xah^f00000NkvXXu0mjf DT&B^t literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information-members.html new file mode 100644 index 0000000000..67d39c0db2 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information-members.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.WatchdogReattachInformation Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information.html new file mode 100644 index 0000000000..49a06f870f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information.html @@ -0,0 +1,240 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.WatchdogReattachInformation Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.WatchdogReattachInformation Class Reference
+
+
+ +

Database representation of Components.Watchdog.WatchdogReattachInformation + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.WatchdogReattachInformation:
+
+
+ + +Tgstation.Server.Host.Models.WatchdogReattachInformationBase + +
+ + + + + + + + + + + + + + + + + + +

+Properties

long Id [get, set]
 The row Id More...
 
long InstanceId [get, set]
 The Api.Models.Instance.Id of the Instance the WatchdogReattachInformation belongs to More...
 
ReattachInformation Alpha [get, set]
 The ReattachInformation for the Alpha server More...
 
ReattachInformation Bravo [get, set]
 The ReattachInformation for the Bravo server More...
 
- Properties inherited from Tgstation.Server.Host.Models.WatchdogReattachInformationBase
bool AlphaIsActive [get, set]
 If the Alpha session is the active session More...
 
+ + + + + + + + + +

+Additional Inherited Members

- Public Member Functions inherited from Tgstation.Server.Host.Models.WatchdogReattachInformationBase
 WatchdogReattachInformationBase ()
 Construct a WatchdogReattachInformationBase More...
 
- Protected Member Functions inherited from Tgstation.Server.Host.Models.WatchdogReattachInformationBase
 WatchdogReattachInformationBase (WatchdogReattachInformationBase copy)
 Construct a WatchdogReattachInformation from a given copy More...
 
+

Detailed Description

+

Database representation of Components.Watchdog.WatchdogReattachInformation

+ +

Definition at line 6 of file WatchdogReattachInformation.cs.

+

Property Documentation

+ +

◆ Alpha

+ +
+
+ + + + + +
+ + + + +
ReattachInformation Tgstation.Server.Host.Models.WatchdogReattachInformation.Alpha
+
+getset
+
+ +

The ReattachInformation for the Alpha server

+ +

Definition at line 21 of file WatchdogReattachInformation.cs.

+
21 { get; set; }
+
+
+ +

◆ Bravo

+ +
+
+ + + + + +
+ + + + +
ReattachInformation Tgstation.Server.Host.Models.WatchdogReattachInformation.Bravo
+
+getset
+
+ +

The ReattachInformation for the Bravo server

+ +

Definition at line 26 of file WatchdogReattachInformation.cs.

+
26 { get; set; }
+
+
+ +

◆ Id

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.WatchdogReattachInformation.Id
+
+getset
+
+ +

The row Id

+ +

Definition at line 11 of file WatchdogReattachInformation.cs.

+
11 { get; set; }
+
+
+ +

◆ InstanceId

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Host.Models.WatchdogReattachInformation.InstanceId
+
+getset
+
+ +

The Api.Models.Instance.Id of the Instance the WatchdogReattachInformation belongs to

+ +

Definition at line 16 of file WatchdogReattachInformation.cs.

+
16 { get; set; }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information.png new file mode 100644 index 0000000000000000000000000000000000000000..f6f2ad0d5cdfe075e85c61259af4aac257f95725 GIT binary patch literal 1318 zcmeAS@N?(olHy`uVBq!ia0y~yV5|bN12~w0q=KEF8<3I+@CkAK|NlRb`Qpvj(*8pe zfGjXRaNq!I=N)+3l-?&s=v7{*E{$2w!P6gN=ll76TfR+?CxmMKqXcz(m!r5 z7#RQm=a1|etA!^|?C4mYd~?T-Ke6p^x7@tX7aprK=TVVS%n~z~t+%^6be>x6OkA9| zSNdv^U$6b~e^P%fe{X&fzWDo#_d#Ety}#k}LjLCa%v$%9f7WjOQ=}I?`)TvweQK|d z{H7PLUB22acz?OdyHrnVZ|}zAX=~2M_qs~ko|&@q>!#Zp_pOdU%RiZZ&#$rQ!uvXx zu3t+${$F7_?DO!YT3bZ4#m=1PmxZjJi*@IkXgqc^SNa2jmviDih8bXjC;4) z;r`?|7xw%x`J<%Nd~DN&U7h<|o9nuEyGO-Ox9!OMEV!b|Y2Vu?M?KTHGArx;w#}|t ze^GmZ=yk5YQ$nAvXrB|kJ}$NP*6Sa>2QR)Tt=Rq|)GImb@A2*z*K0}+zWn*^bHu{^ zIu_2#o0cw!PrS{i_T}=?$Yb_jGoroX9ry3L^||c)!u_kF#DD&KAN78*d9(%V^Ig}f zRntOWhrd|ACVur-`-XqpuFb!@cwgVGJ?(sX^6Rti{3?5;82virc=_#!xpLb~-d$0v zu1Li}!nfjAWUPo*-ZC@xOmsYNlPv#p|7~Y8~z`|2pkej7gPr za{t+g`TM1QnN`iuEPkE3J#b%X-`V@B@(#7vUzFPiTybAmpVgSS>_dsL^BUbbG20eI zIX%CVw6XVCZ|=6R7r70|^VW%1-#Q-IcX3xu!@s+W-g}m1#MMaEF|zfhE-V$U=Vt#q zWtQK<<%V+>=GQ6&`k&Z7caOzMAH~?um7;r@q6*i>@<)dDRh`)RwYK})mg_rw&=TVO z2cMOGoo+HVQHtjJCA#fxf|Gr$jQHN$i?3?#FM6%N?%STb#V_)IFueNBzV)7a{sb%Z zBq;de{JX-i=4;^em!JLR8!-I^-=6LH{&cgqaL3#0k8iJe*t;<^`>N2}4Bxd+GxzrJ zFLO`eI@iVDa8c-Q0UJZT$NULbOn*J?Wc(9W>lI|a{a;NeL%qBFq${-t89f;PBm>it o05Z0{Fg?g?)s&!nYyLC%Df`|#dUVY;V4=p~>FVdQ&MBb@0N$9A2><{9 literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base-members.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base-members.html new file mode 100644 index 0000000000..502cd6e11e --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.WatchdogReattachInformationBase Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base.html b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base.html new file mode 100644 index 0000000000..871426025c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base.html @@ -0,0 +1,216 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.WatchdogReattachInformationBase Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.WatchdogReattachInformationBase Class Reference
+
+
+ +

Base class for WatchdogReattachInformation + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.WatchdogReattachInformationBase:
+
+
+ + +Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation +Tgstation.Server.Host.Models.WatchdogReattachInformation + +
+ + + + + +

+Public Member Functions

 WatchdogReattachInformationBase ()
 Construct a WatchdogReattachInformationBase More...
 
+ + + + +

+Protected Member Functions

 WatchdogReattachInformationBase (WatchdogReattachInformationBase copy)
 Construct a WatchdogReattachInformation from a given copy More...
 
+ + + + +

+Properties

bool AlphaIsActive [get, set]
 If the Alpha session is the active session More...
 
+

Detailed Description

+

Base class for WatchdogReattachInformation

+ +

Definition at line 8 of file WatchdogReattachInformationBase.cs.

+

Constructor & Destructor Documentation

+ +

◆ WatchdogReattachInformationBase() [1/2]

+ +
+
+ + + + + + + +
Tgstation.Server.Host.Models.WatchdogReattachInformationBase.WatchdogReattachInformationBase ()
+
+ +

Construct a WatchdogReattachInformationBase

+ +

Definition at line 18 of file WatchdogReattachInformationBase.cs.

+
18 { }
+
+
+ +

◆ WatchdogReattachInformationBase() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + +
Tgstation.Server.Host.Models.WatchdogReattachInformationBase.WatchdogReattachInformationBase (WatchdogReattachInformationBase copy)
+
+protected
+
+ +

Construct a WatchdogReattachInformation from a given copy

+
Parameters
+ + +
copyThe WatchdogReattachInformationBase to copy values from
+
+
+ +

Definition at line 24 of file WatchdogReattachInformationBase.cs.

+
25  {
26  AlphaIsActive = copy?.AlphaIsActive ?? throw new ArgumentNullException(nameof(copy));
27  }
+
+

References Tgstation.Server.Host.Models.WatchdogReattachInformationBase.AlphaIsActive.

+ +
+
+

Property Documentation

+ +

◆ AlphaIsActive

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Models.WatchdogReattachInformationBase.AlphaIsActive
+
+getset
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base.png b/class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base.png new file mode 100644 index 0000000000000000000000000000000000000000..86081ad7cdde086da5047b78626e47f31ba882f1 GIT binary patch literal 1927 zcmchWX;@QN8pkh2q=1NRK^QAwF)S&YWq`D7)fR*p0~$6FC?RYH5^#V7kb;0!3I(kJ zk^%*%vQ;50K@v-d2`Es*R$)j2HwlV`h?uwp3=YKfqBHZg-{w5ez3+R@bN=sn?>+xt z>G7ZdBZIvL000=F0{yT60HZ+p@%LcR8=q#T4+Zn%$3p$JS}l}5e!51!Jop2Yy?yw6 zzHX_+3Yxx`g$)V;piNt2MiA->0D5~+euqPIbQJYqM%%&N+v|Q7Xtnp`ccZiHY$@eP zcZ8=tHT;y~^zRP*t4Xyj_l`}w`ETO`+lLIcZNGC($8Y#A;?n!Nt&4iUHLU(y%X{NU z+I{G9;z^&J{Q25ZC0@hKeT2hRMkJS}(+2!_o0H!R9LkU5z7mDIzFXs^7 z#DfejFO_p*Ma|ks`=0ye!(N?Vx)gwQrqZ*Pc0fbk`+Y2WB}0;(_cWx_>Q!eP#{nBc z;4tFrxXhR*6ZA3f8n9#R)5UPV&UB9PE1`{}p-b|wBMF)EJc;}xVQY-Dg9-oRts^JI z%7TkHfu-$KrIGz6HS)j(leAeqj}WCyVyv1&nnx#1k25MJh!M6YpY?d5msf{I$gKLu z4?TeqF$K8tIf0YKuZ%mJ{CA{md*~mXE6D}ih(2@{QS{Sn)iR}xW=q`DIbIc0uMsEF zCX#BaF3K>-sP0&B*MmtF3`|U#YjX#2zw{&2@BStPNAfFMR6FnVIGX(=R8CVIxl-20~VMApjr^nI!n(DW~RRwOW*lBKDdVOJWGeLn!YwjngkJZ{lU8`XR!h6-qKb*LpZ11!A=${et#MBMn z(a03T=AF!mxcu8kD;YhDyiJ|Y?y_LtjYaBen-=bSByM$3Uc79nvwpx&Qbp3+T@zvu zG;L+#{h)>DRruSQRX=^;o!AMw@c)Uw+06zONoj1*$sX9T{{x!QerKWa{(b+?crKEc+aUi!Kx&Y` zPRDDOavL5EI--tH7k&VPsO9jX0aj(x88L-wVg}6z<3JQPn&^cxC?VOQ{?V;~BlfZC z;X{c%(wm!sg14;RNMAW!48K0&+HTp;`@;81(*k1f_SYVsb&rR=KLW2y{+W>amGA6} zmH_fO0mUqp>rR(Su_aS}R7)FCOFcnOwyY#yomcdMQ9NDWgQB za2uXHIm4TyJQG2J=5DDrMZ$hv9rq%Y5OcJP?#OGWsmZw6(4*aCVh_DeMiUFTMwVQL zJ|*E3)nsFv8&jZ#Q|LMAF@wzK8MM4(9@$@W@^9bi;|){H2=y9-yO{P(QG?lOYt&^d znC3J1x)HT}Z-2v(^K?3MZ_Ax$L05}>tRVF zCN`YTO=@Lb>>#QEt);hh9lMAbYQ9-QM7KBglrp7Z<0MNojhntsJNscw^9hGMSC0!V z(R8X}tx!W0X_k}wU0=Kph*aac5fQJzH3__r6^c*;@@~(sE kIh4SvljnM + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.NativeMethods Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.NativeMethods, including all inherited members.

+ + + + + + + + + + +
CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, CreateSymbolicLinkFlags dwFlags)Tgstation.Server.Host.NativeMethods
CreateSymbolicLinkFlags enum nameTgstation.Server.Host.NativeMethods
EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr lParam)Tgstation.Server.Host.NativeMethods
EnumWindowProc(IntPtr hwnd, IntPtr lParam)Tgstation.Server.Host.NativeMethods
FindWindow(string lpClassName, string lpWindowName)Tgstation.Server.Host.NativeMethods
GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount)Tgstation.Server.Host.NativeMethods
GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId)Tgstation.Server.Host.NativeMethods
LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken)Tgstation.Server.Host.NativeMethods
SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam)Tgstation.Server.Host.NativeMethods
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_native_methods.html b/class_tgstation_1_1_server_1_1_host_1_1_native_methods.html new file mode 100644 index 0000000000..ef71afa0c3 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_native_methods.html @@ -0,0 +1,473 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.NativeMethods Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.NativeMethods Class Reference
+
+
+ +

Native methods used by the code + More...

+ + + + + +

+Public Types

enum  CreateSymbolicLinkFlags : int { CreateSymbolicLinkFlags.None = 0, +CreateSymbolicLinkFlags.Directory = 1, +CreateSymbolicLinkFlags.AllowUnprivilegedCreate = 2 + }
 See https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-createsymboliclinka#parameters More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

static int GetWindowThreadProcessId (IntPtr hWnd, out int lpdwProcessId)
 See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowthreadprocessid More...
 
static IntPtr FindWindow (string lpClassName, string lpWindowName)
 See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-findwindoww More...
 
static int SendMessage (IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam)
 See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-sendmessage More...
 
delegate bool EnumWindowProc (IntPtr hwnd, IntPtr lParam)
 See https://msdn.microsoft.com/en-us/library/ms633493(v=VS.85).aspx More...
 
static bool EnumChildWindows (IntPtr window, EnumWindowProc callback, IntPtr lParam)
 See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-enumchildwindows More...
 
static int GetWindowText (IntPtr hWnd, StringBuilder lpString, int nMaxCount)
 See https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowtextw More...
 
static bool LogonUser (string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken)
 See https://msdn.microsoft.com/en-us/library/windows/desktop/aa378184(v=vs.85).aspx More...
 
static bool CreateSymbolicLink (string lpSymlinkFileName, string lpTargetFileName, CreateSymbolicLinkFlags dwFlags)
 See https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-createsymboliclinkw More...
 
+

Detailed Description

+

Native methods used by the code

+ +

Definition at line 14 of file NativeMethods.cs.

+

Member Enumeration Documentation

+ +

◆ CreateSymbolicLinkFlags

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Host.NativeMethods.CreateSymbolicLinkFlags : int
+
+strong
+
+ +

See https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-createsymboliclinka#parameters

+ + + + +
Enumerator
None 
Directory 
AllowUnprivilegedCreate 
+ +

Definition at line 20 of file NativeMethods.cs.

+
20  : int
21  {
22  None = 0,
23  Directory = 1,
24  AllowUnprivilegedCreate = 2
25  }
+
+
+
+

Member Function Documentation

+ +

◆ CreateSymbolicLink()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
static bool Tgstation.Server.Host.NativeMethods.CreateSymbolicLink (string lpSymlinkFileName,
string lpTargetFileName,
CreateSymbolicLinkFlags dwFlags 
)
+
+
+ +

◆ EnumChildWindows()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
static bool Tgstation.Server.Host.NativeMethods.EnumChildWindows (IntPtr window,
EnumWindowProc callback,
IntPtr lParam 
)
+
+
+ +

◆ EnumWindowProc()

+ +
+
+ + + + + + + + + + + + + + + + + + +
delegate bool Tgstation.Server.Host.NativeMethods.EnumWindowProc (IntPtr hwnd,
IntPtr lParam 
)
+
+
+ +

◆ FindWindow()

+ +
+
+ + + + + + + + + + + + + + + + + + +
static IntPtr Tgstation.Server.Host.NativeMethods.FindWindow (string lpClassName,
string lpWindowName 
)
+
+
+ +

◆ GetWindowText()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
static int Tgstation.Server.Host.NativeMethods.GetWindowText (IntPtr hWnd,
StringBuilder lpString,
int nMaxCount 
)
+
+
+ +

◆ GetWindowThreadProcessId()

+ +
+
+ + + + + + + + + + + + + + + + + + +
static int Tgstation.Server.Host.NativeMethods.GetWindowThreadProcessId (IntPtr hWnd,
out int lpdwProcessId 
)
+
+
+ +

◆ LogonUser()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static bool Tgstation.Server.Host.NativeMethods.LogonUser (string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
out IntPtr phToken 
)
+
+
+ +

◆ SendMessage()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static int Tgstation.Server.Host.NativeMethods.SendMessage (IntPtr hWnd,
int wMsg,
IntPtr wParam,
IntPtr lParam 
)
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_program-members.html b/class_tgstation_1_1_server_1_1_host_1_1_program-members.html new file mode 100644 index 0000000000..1a9fd910ff --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_program-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Program Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Program, including all inherited members.

+ + + +
Main(string[] args)Tgstation.Server.Host.Programstatic
ServerFactoryTgstation.Server.Host.Programprivatestatic
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_program.html b/class_tgstation_1_1_server_1_1_host_1_1_program.html new file mode 100644 index 0000000000..309d774b89 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_program.html @@ -0,0 +1,179 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Program Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Program Class Reference
+
+
+ +

Entrypoint for the Process + More...

+ + + + + +

+Static Public Member Functions

static async Task< int > Main (string[] args)
 Entrypoint for the Program More...
 
+ + + + +

+Static Private Attributes

static internal IServerFactory ServerFactory = new ServerFactory()
 The IServerFactory to use More...
 
+

Detailed Description

+

Entrypoint for the Process

+ +

Definition at line 13 of file Program.cs.

+

Member Function Documentation

+ +

◆ Main()

+ +
+
+ + + + + +
+ + + + + + + + +
static async Task<int> Tgstation.Server.Host.Program.Main (string [] args)
+
+static
+
+ +

Entrypoint for the Program

+
Parameters
+ + +
argsThe command line arguments
+
+
+
Returns
The Process.ExitCode
+ +

Definition at line 27 of file Program.cs.

+
28  {
29  var listArgs = new List<string>(args);
30 
31  // first arg is 100% always the update path, starting it otherwise is solely for debugging purposes
32  string updatePath;
33  if (listArgs.Count > 0)
34  {
35  updatePath = listArgs[0];
36  listArgs.RemoveAt(0);
37  if (listArgs.Remove("--attach-debugger"))
38  Debugger.Launch();
39  }
40  else
41  updatePath = null;
42  try
43  {
44  var server = ServerFactory.CreateServer(listArgs.ToArray(), updatePath);
45  try
46  {
47  using (var cts = new CancellationTokenSource())
48  {
49  void AppDomainHandler(object a, EventArgs b) => cts.Cancel();
50  AppDomain.CurrentDomain.ProcessExit += AppDomainHandler;
51  try
52  {
53  Console.CancelKeyPress += (a, b) =>
54  {
55  b.Cancel = true;
56  cts.Cancel();
57  };
58  await server.RunAsync(cts.Token).ConfigureAwait(false);
59  }
60  finally
61  {
62  AppDomain.CurrentDomain.ProcessExit -= AppDomainHandler;
63  }
64  }
65  }
66  catch (OperationCanceledException) { }
67  return server.RestartRequested ? 1 : 0;
68  }
69  catch (Exception e)
70  {
71  if (updatePath != null)
72  {
73  File.WriteAllText(updatePath, e.ToString());
74  return 2;
75  }
76 
77  throw;
78  }
79  }
Task RunAsync(CancellationToken cancellationToken)
Runs the IServer
+
IServer CreateServer(string[] args, string updatePath)
Create a IServer
+
static internal IServerFactory ServerFactory
The IServerFactory to use
Definition: Program.cs:19
+
+

References Tgstation.Server.Host.ServerFactory.CreateServer(), and Tgstation.Server.Host.IServer.RunAsync().

+ +
+
+

Member Data Documentation

+ +

◆ ServerFactory

+ +
+
+ + + + + +
+ + + + +
internal IServerFactory Tgstation.Server.Host.Program.ServerFactory = new ServerFactory()
+
+staticprivate
+
+ +

The IServerFactory to use

+ +

Definition at line 19 of file Program.cs.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context-members.html b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context-members.html new file mode 100644 index 0000000000..42a1267f33 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context-members.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Security.AuthenticationContext Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html new file mode 100644 index 0000000000..9b861ec4f3 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html @@ -0,0 +1,352 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security.AuthenticationContext Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security.AuthenticationContext Class Reference
+
+
+ +

Manages Api.Models.Users for a scope + More...

+
+Inheritance diagram for Tgstation.Server.Host.Security.AuthenticationContext:
+
+
+ + +Tgstation.Server.Host.Security.IAuthenticationContext +IDisposable + +
+ + + + + + + + + + + + + +

+Public Member Functions

 AuthenticationContext ()
 Construct an empty AuthenticationContext More...
 
 AuthenticationContext (ISystemIdentity systemIdentity, User user, InstanceUser instanceUser)
 Construct an AuthenticationContext More...
 
void Dispose ()
 
ulong GetRight (RightsType rightsType)
 Get the value of a given rightsType More...
 
+ + + + + + + + + + + + + + + + + +

+Properties

User User [get]
 
InstanceUser InstanceUser [get]
 
ISystemIdentity SystemIdentity [get]
 
- Properties inherited from Tgstation.Server.Host.Security.IAuthenticationContext
User User [get]
 The authenticated user More...
 
InstanceUser InstanceUser [get]
 The InstanceUser of User if applicable More...
 
ISystemIdentity SystemIdentity [get]
 The ISystemIdentity of User if applicable More...
 
+

Detailed Description

+

Manages Api.Models.Users for a scope

+ +

Definition at line 11 of file AuthenticationContext.cs.

+

Constructor & Destructor Documentation

+ +

◆ AuthenticationContext() [1/2]

+ +
+
+ + + + + + + +
Tgstation.Server.Host.Security.AuthenticationContext.AuthenticationContext ()
+
+ +

Construct an empty AuthenticationContext

+ +

Definition at line 25 of file AuthenticationContext.cs.

+
25 { }
+
+
+ +

◆ AuthenticationContext() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Security.AuthenticationContext.AuthenticationContext (ISystemIdentity systemIdentity,
User user,
InstanceUser instanceUser 
)
+
+ +

Construct an AuthenticationContext

+
Parameters
+ + + + +
systemIdentityThe value of SystemIdentity
userThe value of User
instanceUserThe value of InstanceUser
+
+
+ +

Definition at line 33 of file AuthenticationContext.cs.

+
34  {
35  User = user ?? throw new ArgumentNullException(nameof(user));
36  if (systemIdentity == null && User.SystemIdentifier != null)
37  throw new ArgumentNullException(nameof(systemIdentity));
38  InstanceUser = instanceUser;
39  SystemIdentity = systemIdentity;
40  }
+ + +
string SystemIdentifier
The SID/UID of the User on Windows/POSIX respectively
Definition: User.cs:32
+
+

References Tgstation.Server.Api.Models.Internal.User.SystemIdentifier, and Tgstation.Server.Host.Security.AuthenticationContext.SystemIdentity.

+ +
+
+

Member Function Documentation

+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Security.AuthenticationContext.Dispose ()
+
+ +

+ +
+
+ +

◆ GetRight()

+ +
+
+ + + + + + + + +
ulong Tgstation.Server.Host.Security.AuthenticationContext.GetRight (RightsType rightsType)
+
+ +

Get the value of a given rightsType

+ +

Implements Tgstation.Server.Host.Security.IAuthenticationContext.

+ +

Definition at line 46 of file AuthenticationContext.cs.

+
47  {
48  var isInstance = RightsHelper.IsInstanceRight(rightsType);
49 
50  if (User == null)
51  throw new InvalidOperationException("Authentication context has no user!");
52 
53  if (isInstance && InstanceUser == null)
54  return 0;
55  var rightsEnum = RightsHelper.RightToType(rightsType);
56 
57  // use the api versions because they're the ones that contain the actual properties
58  var typeToCheck = isInstance ? typeof(InstanceUser) : typeof(User);
59 
60  var nullableType = typeof(Nullable<>);
61  var nullableRightsType = nullableType.MakeGenericType(rightsEnum);
62 
63  var prop = typeToCheck.GetProperties().Where(x => x.PropertyType == nullableRightsType).First();
64 
65  var right = prop.GetMethod.Invoke(isInstance ? (object)InstanceUser : User, Array.Empty<object>());
66 
67  if (right == null)
68  throw new InvalidOperationException("A user right was null!");
69  return (ulong)right;
70  }
static bool IsInstanceRight(RightsType rightsType)
Check if a given rightsType is meant for an Models.Instance
+ + + +
static Type RightToType(RightsType rightsType)
Map a given rightsType to its respective Enum Type
+
+

References Tgstation.Server.Api.Rights.RightsHelper.IsInstanceRight(), and Tgstation.Server.Api.Rights.RightsHelper.RightToType().

+ +

Referenced by Tgstation.Server.Host.Controllers.JobController.Delete(), Tgstation.Server.Host.Controllers.ChatController.GetId(), Tgstation.Server.Host.Controllers.UserController.GetId(), Tgstation.Server.Host.Controllers.ChatController.List(), Tgstation.Server.Host.Controllers.DreamDaemonController.ReadImpl(), Tgstation.Server.Host.Controllers.ByondController.Update(), Tgstation.Server.Host.Controllers.InstanceUserController.Update(), Tgstation.Server.Host.Controllers.DreamMakerController.Update(), Tgstation.Server.Host.Controllers.UserController.Update(), Tgstation.Server.Host.Controllers.DreamDaemonController.Update(), Tgstation.Server.Host.Controllers.ChatController.Update(), and Tgstation.Server.Host.Controllers.RepositoryController.Update().

+ +
+
+

Property Documentation

+ +

◆ InstanceUser

+ +
+
+ + + + + +
+ + + + +
InstanceUser Tgstation.Server.Host.Security.AuthenticationContext.InstanceUser
+
+get
+
+
+ +

◆ SystemIdentity

+ +
+
+ + + + + +
+ + + + +
ISystemIdentity Tgstation.Server.Host.Security.AuthenticationContext.SystemIdentity
+
+get
+
+
+ +

◆ User

+ + +
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.png b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.png new file mode 100644 index 0000000000000000000000000000000000000000..4e78ff2a7bbc4f9b9a322ba06a01e21f41904101 GIT binary patch literal 1539 zcmb`HX;4!K5XWDJu^@`YGhjibfQVcbj1q(*SM?D<49HQ46a^zh4v7!25kV0fMmc=3 zP$Zz%$YDZ^1_M5hA_^3=C?pWBSdjwqVo(|q1ccYvna;HKW4klE``_99urvFc&Gz@( zqo=!G7XSb~aIYsB0B}wk&D7D-#N888jwTuS`viJn7^ac0UaO$I=6sF%)0>)_mShiY z)Ra0W$bJEUX6S?UbOhQ1z!DhrbPG(yDN5wI)m!zw@WoNju}k|>tddq1iD0`CP<@eG z=Vg7t+&{gYNM+GGQ%p$kB@QE`#4JnT1nNdY@S0}S%<|DjF6s8jLJd~HF=t#&K)kzM zM{($6tpH&mzmGUz-D*{7-e9mxzg-*!3wa@wDB7k-pz4*~+Dv$Qr?VfWC_ol0?MH)_ ziCA>&zJruXTX@>S*+=FmvmHR%w}9ynGPm+(oWQv&$)gJgBV94R06y{H*V|s;+*&S+ zqaS1env_=f!He4eT8%{MBo?#jjZ2&8v$!vSlsirtI@Ok}{e&ePz-il4k z7Th_3Q-*$!wth1TxQ7_;*5PXDL_&axrg^UCzcf=t2%ElxIDQI$*US(^zUu+WI)ClV z^Ml>jKr!!|7e!^#NQk!uwiCmR69U*k<<%Q_P07rT6)?3a}nUcTZ1s*XCX5ff&!; zf83F!Px(Yx%Qm)KxRSl8U4f$b0@EFh9bF??x6`5F?MAGcnt@`!jY z&+*7=FzCwvD$FJ}%f`HFzjTraPy3XzhAQHR5c3Jpc}tC$H%R4~x#U}n?g$gWQD!mO zA0Mt>GRhXV6UU1I=faJERwACO#eAzgoC4r9%rrk{%Wy+&C~!8!=>KEspNKN4T#}_Z zi|n0Zf-}fq{1e(o*ZF~Z*EW2>YVzHw)lC0d8ZoFH=lu91TWn`ygsq!yLUU18L znhqY?+sLU_#k~2lywSkV^iXXYX0Uk-l$D!u#y0KGEA!Y!5#KIErPpU)rRtu{by(UJ z{mfO^T6~k3o9XFtz78?s8;9TG8l%^!PZP9DGR~;02Ysn|1~0dZw23sxVd^2%gwXbu zke((pdv}21kZ(U^1v~`wH>i*-6V+^j|3uo#s=)y3MDob4@laHZJ=By=k1M>5Z3u;vz63GgC zO}j80KK`tL^JeR@fa~XB2_F$vs9LIHP_?M6xfij2L`165%}OZm4n;v@G|(yp_=ko` zN4Z{Af;~NQiQWp_hMy0^yDC4ciO;Z@Vh?o+1ej b6Pqzy;fr(}ShSL-`PcyH<>$$F|K{u;VifG> literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory-members.html b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory-members.html new file mode 100644 index 0000000000..8b275e1dc0 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory-members.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Security.AuthenticationContextFactory Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html new file mode 100644 index 0000000000..1150c0f2f3 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html @@ -0,0 +1,380 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security.AuthenticationContextFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security.AuthenticationContextFactory Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Security.AuthenticationContextFactory:
+
+
+ + +Tgstation.Server.Host.Security.IAuthenticationContextFactory +IDisposable + +
+ + + + + + + + + + +

+Public Member Functions

 AuthenticationContextFactory (ISystemIdentityFactory systemIdentityFactory, IDatabaseContext databaseContext, IIdentityCache identityCache)
 Construct an AuthenticationContextFactory More...
 
void Dispose ()
 
async Task CreateAuthenticationContext (long userId, long? instanceId, DateTimeOffset validAfter, CancellationToken cancellationToken)
 Create an IAuthenticationContext to populate CurrentAuthenticationContext More...
 
+ + + + + + + +

+Properties

IAuthenticationContext CurrentAuthenticationContext [get, private set]
 
- Properties inherited from Tgstation.Server.Host.Security.IAuthenticationContextFactory
IAuthenticationContext CurrentAuthenticationContext [get]
 The IAuthenticationContext the IAuthenticationContextFactory created More...
 
+ + + + + + + + + + +

+Private Attributes

readonly ISystemIdentityFactory systemIdentityFactory
 The ISystemIdentityFactory for the AuthenticationContextFactory More...
 
readonly IDatabaseContext databaseContext
 The IDatabaseContext for the AuthenticationContextFactory More...
 
readonly IIdentityCache identityCache
 The IIdentityCache for the AuthenticationContextFactory More...
 
+

Detailed Description

+
+

Definition at line 11 of file AuthenticationContextFactory.cs.

+

Constructor & Destructor Documentation

+ +

◆ AuthenticationContextFactory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Security.AuthenticationContextFactory.AuthenticationContextFactory (ISystemIdentityFactory systemIdentityFactory,
IDatabaseContext databaseContext,
IIdentityCache identityCache 
)
+
+ +

Construct an AuthenticationContextFactory

+
Parameters
+ + + + +
systemIdentityFactoryThe value of systemIdentityFactory
databaseContextThe value of databaseContext
identityCacheThe value of identityCache
+
+
+ +

Definition at line 37 of file AuthenticationContextFactory.cs.

+
38  {
39  this.systemIdentityFactory = systemIdentityFactory ?? throw new ArgumentNullException(nameof(systemIdentityFactory));
40  this.databaseContext = databaseContext ?? throw new ArgumentNullException(nameof(databaseContext));
41  this.identityCache = identityCache ?? throw new ArgumentNullException(nameof(identityCache));
42  }
readonly IIdentityCache identityCache
The IIdentityCache for the AuthenticationContextFactory
+
readonly ISystemIdentityFactory systemIdentityFactory
The ISystemIdentityFactory for the AuthenticationContextFactory
+
readonly IDatabaseContext databaseContext
The IDatabaseContext for the AuthenticationContextFactory
+
+

References Tgstation.Server.Host.Security.AuthenticationContextFactory.databaseContext, Tgstation.Server.Host.Security.AuthenticationContextFactory.identityCache, and Tgstation.Server.Host.Security.AuthenticationContextFactory.systemIdentityFactory.

+ +
+
+

Member Function Documentation

+ +

◆ CreateAuthenticationContext()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Security.AuthenticationContextFactory.CreateAuthenticationContext (long userId,
long? instanceId,
DateTimeOffset validAfter,
CancellationToken cancellationToken 
)
+
+ +

Create an IAuthenticationContext to populate CurrentAuthenticationContext

+ +

Implements Tgstation.Server.Host.Security.IAuthenticationContextFactory.

+ +

Definition at line 48 of file AuthenticationContextFactory.cs.

+
49  {
50  if (CurrentAuthenticationContext != null)
51  throw new InvalidOperationException("Authentication context has already been loaded");
52 
53  var userQuery = databaseContext.Users.Where(x => x.Id == userId)
54  .Include(x => x.CreatedBy)
55  .FirstOrDefaultAsync(cancellationToken);
56 
57  var instanceUserQuery = instanceId.HasValue ? databaseContext.InstanceUsers
58  .Where(x => x.UserId == userId && x.InstanceId == instanceId && x.Instance.Online.Value)
59  .Include(x => x.Instance)
60  .FirstOrDefaultAsync(cancellationToken) : Task.FromResult<InstanceUser>(null);
61 
62  var user = await userQuery.ConfigureAwait(false);
63  if (user == default)
64  {
65  CurrentAuthenticationContext = new AuthenticationContext();
66  return;
67  }
68 
69  ISystemIdentity systemIdentity;
70  if (user.SystemIdentifier != null)
71  systemIdentity = identityCache.LoadCachedIdentity(user);
72  else
73  {
74  if (user.LastPasswordUpdate.HasValue && user.LastPasswordUpdate > validAfter)
75  {
76  CurrentAuthenticationContext = new AuthenticationContext();
77  return;
78  }
79 
80  systemIdentity = null;
81  }
82 
83  try
84  {
85  var instanceUser = await instanceUserQuery.ConfigureAwait(false);
86 
87  CurrentAuthenticationContext = new AuthenticationContext(systemIdentity, user, instanceUser);
88  }
89  catch
90  {
91  systemIdentity?.Dispose();
92  throw;
93  }
94  }
ISystemIdentity LoadCachedIdentity(User user)
Attempt to load a cached ISystemIdentity
+
DbSet< User > Users
The Users in the IDatabaseContext
+ +
readonly IIdentityCache identityCache
The IIdentityCache for the AuthenticationContextFactory
+
readonly IDatabaseContext databaseContext
The IDatabaseContext for the AuthenticationContextFactory
+ +
DbSet< InstanceUser > InstanceUsers
The InstanceUsers in the IDatabaseContext
+
+

References Tgstation.Server.Host.Security.AuthenticationContextFactory.CurrentAuthenticationContext, Tgstation.Server.Host.Security.AuthenticationContextFactory.databaseContext, Tgstation.Server.Host.Security.AuthenticationContextFactory.identityCache, Tgstation.Server.Host.Models.IDatabaseContext.InstanceUsers, Tgstation.Server.Host.Security.IIdentityCache.LoadCachedIdentity(), and Tgstation.Server.Host.Models.IDatabaseContext.Users.

+ +
+
+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Security.AuthenticationContextFactory.Dispose ()
+
+ +

+ +
+
+

Member Data Documentation

+ +

◆ databaseContext

+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContext Tgstation.Server.Host.Security.AuthenticationContextFactory.databaseContext
+
+private
+
+
+ +

◆ identityCache

+ +
+
+ + + + + +
+ + + + +
readonly IIdentityCache Tgstation.Server.Host.Security.AuthenticationContextFactory.identityCache
+
+private
+
+
+ +

◆ systemIdentityFactory

+ +
+
+ + + + + +
+ + + + +
readonly ISystemIdentityFactory Tgstation.Server.Host.Security.AuthenticationContextFactory.systemIdentityFactory
+
+private
+
+
+

Property Documentation

+ +

◆ CurrentAuthenticationContext

+ +
+
+ + + + + +
+ + + + +
IAuthenticationContext Tgstation.Server.Host.Security.AuthenticationContextFactory.CurrentAuthenticationContext
+
+getprivate set
+
+ +

+ +

Definition at line 14 of file AuthenticationContextFactory.cs.

+
14 { get; private set; }
+

Referenced by Tgstation.Server.Host.Security.AuthenticationContextFactory.CreateAuthenticationContext().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.png b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..cd794f18e433bd6fa7380a2471f32054410fef67 GIT binary patch literal 1770 zcmbtVeKgZ+9RJO_a+J4JSCUnvTeMOlN-UG+Wf=1^dFgiZHnimDH7}(Xd2iK3gf`d9 z%!Q~&s8V1jgq3K zA^-qNsAEVB0LbxW+(`i{TNUeDHDsXSWbbOdyu2)<@7~XWS*_VJ_GPl!>|d@9!emk* z0)ut|WTwx9*WtPs0OVs(NQ7%NWU^qASW_vt;&$=Qg~TTT>dEI6^c;ETO>i~%_7!R; zLWXu5J`Vgn{fyrG#IFR2+DkOb!r(uH3Vs)gd!J8aDF2vbQow$x?m8Q(c!AbHf@_5l zDcWAl+VDlm{Q@f$v&oFu7y8qElaXZZm=BJelHe;cD*9lk^;kTTmP6sKrOv%r(#jYT z=^hT0U=MDhSz)8^GIg=(`Uwp1Q2Vy>&S|`4_Z=T6QH$x)r`dcKUEG)$QbK>;$BX@A z>3E`hWm+(ed#N{;Ua*k7hQ8c;mCP@9_hMF`KRNAq)YX1?bbg_|xhQJsw#CF|I2l~T zG>yCo1>Y>j){rP51J~k{zBbhgA^vSA#WTC9BWE_KP!1%Vy51gX=HO~xrtK*tQSYp_ zMu-EaDp-c;#rgcn5#yB3AfZFJhR6{u1z-2Eb(;DLXU!z%x)0IVQ@_r^l5P) z?p||KY~$n~7Oq!&Dw}gz@i-L;{ z?rJy>NhBbWHQJkNs{?k;7Vxp zkY7tdxamiXXi(%VE$l?IuE8W`Afqa3#4gy|=ImBWugxe6YwBE0XAEqhHg`;fDnVe{ z;?!+RD@u;Ln$`RE!#F_!bWE^NU^~Anoa*#9m32RMihy)5>8QJ9mUmjXG8aCU3aaLG z$HK%?|5}&1T1;eHaLrA-p54xY-kBI;!u7(be9A<93ZED;ghAL-@GlVXHN_Yuy&pZW0GOQ8Xy)cCuw0`#(u(y2ieyjQ4I5rb~=;`oGw1FHO&`8o0 zLHvNQi%j`FfJrM3s*$wu1P!v9opFy3$PXR$zynZ%PUZe2NWB_glMM_i;FbQ9T|@1N zg5E_{e>p#3{p&{%z2R(#+nb-@Ec#GLqUD*lg^8~g>7&u=mRU5Mm#IYBkEXB0J}gU1 z-gppfjDHtV|0}P7#n<%Pc9UfplkctH(GnL_ic92m&AhCBi^M0To@vXf&D?%~4d9jT z5#59>r{0N28Z?_o6v;{b`1s~3epE{iJ%CBG#k%4P;1qt`xRLW* zQG$OMz3*A1){0rqAa?G=Ed=-cMELCsOnHyz&Z1AF)!F7Iwp*axPEz|-!shqPtiXXC z{zr7C8u(2p&aqX+2lBW9UM8=(dfW(OVAtn{@w8P>h^aa>s!7xILkH&oW>}rHx?mrz zM!yZ3H&T~-m{+w&v+F8<9C0PjA>g3800*rMD4Gj|hB43!u2ap-Fl|CN%R5I_*zzoTZF&E|EP~ zJ`MJjlR;h)Q~u-Wpqk}PneDYh`|D-&9D5ZS;+}@a zMqyPpDVL60&2+mX!etK=-hlV21-ruopEMG&W_dh^u*s@&KRXe5J=#YVl8|MG3#CCw vJ$llYHjspD{1^4Jz + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Security.ClaimsInjector Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Security.ClaimsInjector, including all inherited members.

+ + + + + +
authenticationContextFactoryTgstation.Server.Host.Security.ClaimsInjectorprivate
ClaimsInjector(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory)Tgstation.Server.Host.Security.ClaimsInjector
databaseContextTgstation.Server.Host.Security.ClaimsInjectorprivate
InjectClaimsIntoContext(TokenValidatedContext tokenValidatedContext, CancellationToken cancellationToken)Tgstation.Server.Host.Security.ClaimsInjector
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_claims_injector.html b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_claims_injector.html new file mode 100644 index 0000000000..2a9c77e478 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_claims_injector.html @@ -0,0 +1,271 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security.ClaimsInjector Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security.ClaimsInjector Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Security.ClaimsInjector:
+
+
+ + +Tgstation.Server.Host.Security.IClaimsInjector + +
+ + + + + + + + +

+Public Member Functions

 ClaimsInjector (IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory)
 Construct a ClaimsInjector More...
 
async Task InjectClaimsIntoContext (TokenValidatedContext tokenValidatedContext, CancellationToken cancellationToken)
 Setup the System.Security.Claims.Claims for a given tokenValidatedContext More...
 
+ + + + + + + +

+Private Attributes

readonly IDatabaseContext databaseContext
 The IDatabaseContext for the ClaimsInjector More...
 
readonly IAuthenticationContextFactory authenticationContextFactory
 The IAuthenticationContextFactory for the ClaimsInjector More...
 
+

Detailed Description

+
+

Definition at line 17 of file ClaimsInjector.cs.

+

Constructor & Destructor Documentation

+ +

◆ ClaimsInjector()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Security.ClaimsInjector.ClaimsInjector (IDatabaseContext databaseContext,
IAuthenticationContextFactory authenticationContextFactory 
)
+
+ +

Construct a ClaimsInjector

+
Parameters
+ + + +
databaseContextThe value of databaseContext
authenticationContextFactoryThe value of authenticationContextFactory
+
+
+ +

Definition at line 34 of file ClaimsInjector.cs.

+
35  {
36  this.databaseContext = databaseContext ?? throw new ArgumentNullException(nameof(databaseContext));
37  this.authenticationContextFactory = authenticationContextFactory ?? throw new ArgumentNullException(nameof(authenticationContextFactory));
38  }
readonly IAuthenticationContextFactory authenticationContextFactory
The IAuthenticationContextFactory for the ClaimsInjector
+
readonly IDatabaseContext databaseContext
The IDatabaseContext for the ClaimsInjector
+
+

References Tgstation.Server.Host.Security.ClaimsInjector.authenticationContextFactory, and Tgstation.Server.Host.Security.ClaimsInjector.databaseContext.

+ +
+
+

Member Function Documentation

+ +

◆ InjectClaimsIntoContext()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Security.ClaimsInjector.InjectClaimsIntoContext (TokenValidatedContext tokenValidatedContext,
CancellationToken cancellationToken 
)
+
+ +

Setup the System.Security.Claims.Claims for a given tokenValidatedContext

+ +

Implements Tgstation.Server.Host.Security.IClaimsInjector.

+ +

Definition at line 41 of file ClaimsInjector.cs.

+
42  {
43  if (tokenValidatedContext == null)
44  throw new ArgumentNullException(nameof(tokenValidatedContext));
45 
46  // Find the user id in the token
47  var userIdClaim = tokenValidatedContext.Principal.FindFirst(JwtRegisteredClaimNames.Sub);
48  if (userIdClaim == default)
49  throw new InvalidOperationException("Missing required claim!");
50 
51  long userId;
52  try
53  {
54  userId = Int64.Parse(userIdClaim.Value, CultureInfo.InvariantCulture);
55  }
56  catch (Exception e)
57  {
58  throw new InvalidOperationException("Failed to parse user ID!", e);
59  }
60 
61  ApiHeaders apiHeaders;
62  try
63  {
64  apiHeaders = new ApiHeaders(tokenValidatedContext.HttpContext.Request.GetTypedHeaders());
65  }
66  catch (InvalidOperationException)
67  {
68  // we are not responsible for handling header validation issues
69  return;
70  }
71 
72  // This populates the CurrentAuthenticationContext field for use by us and subsequent controllers
73  await authenticationContextFactory.CreateAuthenticationContext(userId, apiHeaders.InstanceId, tokenValidatedContext.SecurityToken.ValidFrom, cancellationToken).ConfigureAwait(false);
74 
76 
77  var enumerator = Enum.GetValues(typeof(RightsType));
78  var claims = new List<Claim>();
79  foreach (RightsType I in enumerator)
80  {
81  // if there's no instance user, do a weird thing and add all the instance roles
82  // we need it so we can get to OnActionExecutionAsync where we can properly decide between BadRequest and Forbid
83  // if user is null that means they got the token with an expired password
84  var rightInt = authenticationContext.User == null || (RightsHelper.IsInstanceRight(I) && authenticationContext.InstanceUser == null) ? ~0U : authenticationContext.GetRight(I);
85  var rightEnum = RightsHelper.RightToType(I);
86  var right = (Enum)Enum.ToObject(rightEnum, rightInt);
87  foreach (Enum J in Enum.GetValues(rightEnum))
88  if (right.HasFlag(J))
89  claims.Add(new Claim(ClaimTypes.Role, RightsHelper.RoleName(I, J)));
90  }
91 
92  tokenValidatedContext.Principal.AddIdentity(new ClaimsIdentity(claims));
93  }
static bool IsInstanceRight(RightsType rightsType)
Check if a given rightsType is meant for an Models.Instance
+ +
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
Task CreateAuthenticationContext(long userId, long? instanceId, DateTimeOffset validAfter, CancellationToken cancellationToken)
Create an IAuthenticationContext to populate CurrentAuthenticationContext
+
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
readonly IAuthenticationContextFactory authenticationContextFactory
The IAuthenticationContextFactory for the ClaimsInjector
+
long? InstanceId
The Models.Instance.Id being accessed
Definition: ApiHeaders.cs:61
+
static Type RightToType(RightsType rightsType)
Map a given rightsType to its respective Enum Type
+
IAuthenticationContext CurrentAuthenticationContext
The IAuthenticationContext the IAuthenticationContextFactory created
+
static string RoleName(RightsType rightsType, Enum right)
Gets the role claim name used for a given rightsType and right
Definition: RightsHelper.cs:61
+
+

References Tgstation.Server.Host.Security.ClaimsInjector.authenticationContextFactory, Tgstation.Server.Host.Security.IAuthenticationContextFactory.CreateAuthenticationContext(), Tgstation.Server.Host.Security.IAuthenticationContextFactory.CurrentAuthenticationContext, Tgstation.Server.Api.ApiHeaders.InstanceId, Tgstation.Server.Api.Rights.RightsHelper.IsInstanceRight(), Tgstation.Server.Api.Rights.RightsHelper.RightToType(), and Tgstation.Server.Api.Rights.RightsHelper.RoleName().

+ +
+
+

Member Data Documentation

+ +

◆ authenticationContextFactory

+ +
+
+ + + + + +
+ + + + +
readonly IAuthenticationContextFactory Tgstation.Server.Host.Security.ClaimsInjector.authenticationContextFactory
+
+private
+
+
+ +

◆ databaseContext

+ +
+
+ + + + + +
+ + + + +
readonly IDatabaseContext Tgstation.Server.Host.Security.ClaimsInjector.databaseContext
+
+private
+
+ +

The IDatabaseContext for the ClaimsInjector

+ +

Definition at line 22 of file ClaimsInjector.cs.

+ +

Referenced by Tgstation.Server.Host.Security.ClaimsInjector.ClaimsInjector().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_claims_injector.png b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_claims_injector.png new file mode 100644 index 0000000000000000000000000000000000000000..4964058ff123d2edcac437216087887cf131862d GIT binary patch literal 1093 zcmeAS@N?(olHy`uVBq!ia0y~yVB`m~12~w0q(L0REFdKj;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|z1O9e6N49 z-j^vx+G%s$tgy_!b=%t-4B3}BWypZrJn^PZW%v`bGuC6uz z>tTZvXL8cqx8K;gZ~qr#mks;p9*$X%wk)b<_8EkV--}a>N^!XEu`J#Jc zYIYxfe6V`{OUv%x#arY8x9rW4JO8$}Y;~j84NwOWqx z99=_={rlunpKSbYpsl2RO;uLQ?(UjjEB|M|i8_Ap>5KG7hg=OFD#m?(D!zH$$)cvi zQcqjl=bt=l)26AdnI`5FAKN<1SMU#q)BRm1`UO^;GwAuQXL5>LPVe9~n{%=g4qZDp zZFQ;PF1w>I(vLd-Ir=&1Oh{2&)iRd<<&`?;Pe-udU3AxQ|1&{j#eK6xi^IH6uKsMK z(tf^Q@o3zKidg$+Hg~MlpQnb}H_3E1(v^N?kEs+k$Y4W zU)Q+qWK`4kx{!36su{Jf)7!#*%InWUdis0g(`??w++x_D{hqBn|IPvBYZeXu zo3fJY~bG_f6UNcpP~K=N<7NhcxkGxwfoO-#@Hf7 + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Security.CryptographySuite Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html new file mode 100644 index 0000000000..4113d6ce95 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html @@ -0,0 +1,351 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security.CryptographySuite Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security.CryptographySuite Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Security.CryptographySuite:
+
+
+ + +Tgstation.Server.Host.Security.ICryptographySuite + +
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

 CryptographySuite (IPasswordHasher< User > passwordHasher)
 Construct a CryptographySuite More...
 
byte [] GetSecureBytes (uint amount)
 Generates a secure set of bytes More...
 
void SetUserPassword (User user, string newPassword, bool newUser)
 Sets a User.PasswordHash for a given user More...
 
bool CheckUserPassword (User user, string password)
 Checks a given password matches a given user 's User.PasswordHash. This may result in User.PasswordHash being modified and this should be persisted More...
 
string GetSecureString ()
 Generates a 40-length secure ascii string More...
 
+ + + + + + + +

+Private Attributes

const uint SecureStringLength = 30
 Length in bytes of generated base64 secure string More...
 
readonly IPasswordHasher< UserpasswordHasher
 The IPasswordHasher<TUser> for the CryptographySuite More...
 
+

Detailed Description

+
+

Definition at line 10 of file CryptographySuite.cs.

+

Constructor & Destructor Documentation

+ +

◆ CryptographySuite()

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Security.CryptographySuite.CryptographySuite (IPasswordHasher< UserpasswordHasher)
+
+ +

Construct a CryptographySuite

+
Parameters
+ + +
passwordHasherThe value of passwordHasher
+
+
+ +

Definition at line 26 of file CryptographySuite.cs.

+
27  {
28  this.passwordHasher = passwordHasher ?? throw new ArgumentNullException(nameof(passwordHasher));
29  }
readonly IPasswordHasher< User > passwordHasher
The IPasswordHasher<TUser> for the CryptographySuite
+
+

References Tgstation.Server.Host.Security.CryptographySuite.passwordHasher.

+ +
+
+

Member Function Documentation

+ +

◆ CheckUserPassword()

+ +
+
+ + + + + + + + + + + + + + + + + + +
bool Tgstation.Server.Host.Security.CryptographySuite.CheckUserPassword (User user,
string password 
)
+
+ +

Checks a given password matches a given user 's User.PasswordHash. This may result in User.PasswordHash being modified and this should be persisted

+ +

Implements Tgstation.Server.Host.Security.ICryptographySuite.

+ +

Definition at line 55 of file CryptographySuite.cs.

+
56  {
57  var result = passwordHasher.VerifyHashedPassword(user, user.PasswordHash, password);
58  switch (result)
59  {
60  case PasswordVerificationResult.Failed:
61  return false;
62  case PasswordVerificationResult.SuccessRehashNeeded:
63  SetUserPassword(user, password, false);
64  break;
65  case PasswordVerificationResult.Success:
66  break;
67  default:
68  throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Password hasher return unknown PasswordVerificationResult: {0}", result));
69  }
70 
71  return true;
72  }
string PasswordHash
The hash of the user's password
Definition: User.cs:13
+
readonly IPasswordHasher< User > passwordHasher
The IPasswordHasher<TUser> for the CryptographySuite
+
void SetUserPassword(User user, string newPassword, bool newUser)
Sets a User.PasswordHash for a given user
+
+

References Tgstation.Server.Host.Models.User.PasswordHash, Tgstation.Server.Host.Security.CryptographySuite.passwordHasher, and Tgstation.Server.Host.Security.CryptographySuite.SetUserPassword().

+ +
+
+ +

◆ GetSecureBytes()

+ +
+
+ + + + + + + + +
byte [] Tgstation.Server.Host.Security.CryptographySuite.GetSecureBytes (uint amount)
+
+ +

Generates a secure set of bytes

+ +

Implements Tgstation.Server.Host.Security.ICryptographySuite.

+ +

Definition at line 32 of file CryptographySuite.cs.

+
33  {
34  using (var rng = new RNGCryptoServiceProvider())
35  {
36  var byt = new byte[amount];
37  rng.GetBytes(byt);
38  return byt;
39  }
40  }
+
+
+ +

◆ GetSecureString()

+ +
+
+ + + + + + + +
string Tgstation.Server.Host.Security.CryptographySuite.GetSecureString ()
+
+ +

Generates a 40-length secure ascii string

+ +

Implements Tgstation.Server.Host.Security.ICryptographySuite.

+ +
+
+ +

◆ SetUserPassword()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void Tgstation.Server.Host.Security.CryptographySuite.SetUserPassword (User user,
string newPassword,
bool newUser 
)
+
+ +

Sets a User.PasswordHash for a given user

+ +

Implements Tgstation.Server.Host.Security.ICryptographySuite.

+ +

Definition at line 43 of file CryptographySuite.cs.

+
44  {
45  if (user == null)
46  throw new ArgumentNullException(nameof(user));
47  if (newPassword == null)
48  throw new ArgumentNullException(nameof(newPassword));
49  user.PasswordHash = passwordHasher.HashPassword(user, newPassword);
50  if (!newUser)
51  user.LastPasswordUpdate = DateTimeOffset.Now;
52  }
string PasswordHash
The hash of the user's password
Definition: User.cs:13
+
readonly IPasswordHasher< User > passwordHasher
The IPasswordHasher<TUser> for the CryptographySuite
+
DateTimeOffset? LastPasswordUpdate
When PasswordHash was last changed
Definition: User.cs:29
+
+

References Tgstation.Server.Host.Models.User.LastPasswordUpdate, Tgstation.Server.Host.Models.User.PasswordHash, and Tgstation.Server.Host.Security.CryptographySuite.passwordHasher.

+ +

Referenced by Tgstation.Server.Host.Security.CryptographySuite.CheckUserPassword().

+ +
+
+

Member Data Documentation

+ +

◆ passwordHasher

+ +
+
+ + + + + +
+ + + + +
readonly IPasswordHasher<User> Tgstation.Server.Host.Security.CryptographySuite.passwordHasher
+
+private
+
+
+ +

◆ SecureStringLength

+ +
+
+ + + + + +
+ + + + +
const uint Tgstation.Server.Host.Security.CryptographySuite.SecureStringLength = 30
+
+private
+
+ +

Length in bytes of generated base64 secure string

+ +

Definition at line 15 of file CryptographySuite.cs.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.png b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.png new file mode 100644 index 0000000000000000000000000000000000000000..67016c9c61c37cf9a20d6c9dbcf13f8bf0ee23a5 GIT binary patch literal 1230 zcmeAS@N?(olHy`uVBq!ia0y~yVAKM#12~w0v-d_YPfz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opI;nbUifVa!tqkxC z@{$ex{m0Yje8#>y-{e|_Ju05swad;y}-%aiNZ z4{gu>U9M9%2?yTY^X+}0Ycl_exCDRodjWTkFaQ4df$M*xZ+9nr-y+xi^3#f64%_!_ z`W(CB^`G~CI%Rj){Qj8t!_LXdJ(uPB^v!8+B>0tA6$fNJ3%p!$rp51CUZK2Hy!f^3 zBm>E}IzATsN~<2sjnDX&TjK5?u9zRdt3D^#kV!aYvdKxaShE;i!<&XBweSCh=o-A2 zx%t-PgJSEcJy#CjUijCy9#kzdOvX156pIfxvOf#4A|9j%Ab;x#c zgJsFb4=8WNb zmfbaFeR=GZmgm_O(@uU|#}v2p$r_PuOt+#_yr=1xEj#^GEtt`L-P|`mTTipwyop`E zbMsTL9h)y5{`jHoa9W-Ewp9)POuR4YzdC0ryiMh|&)m;*LXH@(vb^ebN&n@l-DO86)L2V?c*W!ejJ7#kQ&pCRAV=NH)>jsNi%VpVe^h9= ze_7sv^MPk8m%`%x`;%BF1T17a@xpag1f$LB07jM21q?x2Aq>C>Zfi-bw$zDr zLeN4ckCg$8OF~vqD*ekhWbM|lthHO!FEV&Bd`Gv7JM{dg0~Kzczh<8`*~hZsQu-~M zo!jN#>e$@aKe;fo@2X_<+Gm9f-*!qH|FsO;z9OhBOnT={hX(eamKSdruM)rgz2E%N z*_t&X&69cD7}ALlH-_V@Ma zxr)ihcWiel?Q=Hf@BKJ~bMBhRhf*kMOD*J}>Hbr1ZoKHrTleVhVktqM<qgHYddNr~DE_PTCM`I(fyD<;oKv|!2YljlPA)tq@}=llDy z%y+da9l3iSuAO;*#7wjxiS0x4EvxiHY;TN9&lOL4$QDw(iuH%;-N{{tyDQ{QFs>2t zpK4pouzx9gQ1?fP{`}>OW8)kegdWU8O9oX7fsq)Lz1H@H{QFSb2ObM{^a2YX22WQ% Jmvv4FO#o=@LOlQg literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache-members.html b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache-members.html new file mode 100644 index 0000000000..faffcc8072 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache-members.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Security.IdentityCache Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html new file mode 100644 index 0000000000..ca4e3043b9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html @@ -0,0 +1,362 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security.IdentityCache Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security.IdentityCache Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Security.IdentityCache:
+
+
+ + +Tgstation.Server.Host.Security.IIdentityCache +IDisposable + +
+ + + + + + + + + + + + + +

+Public Member Functions

 IdentityCache (IAsyncDelayer asyncDelayer, ILogger< IdentityCache > logger)
 Construct an IdentityCache More...
 
void Dispose ()
 
void CacheSystemIdentity (User user, ISystemIdentity systemIdentity, DateTimeOffset expiry)
 Keep a user 's systemIdentity alive until an expiry time More...
 
ISystemIdentity LoadCachedIdentity (User user)
 Attempt to load a cached ISystemIdentity More...
 
+ + + + + + + + + + +

+Private Attributes

readonly IAsyncDelayer asyncDelayer
 The IAsyncDelayer for the IdentityCache More...
 
readonly ILogger< IdentityCachelogger
 The ILogger for the IdentityCache More...
 
readonly Dictionary< long, IdentityCacheObjectcachedIdentities
 The map of Api.Models.Internal.User.Ids to IdentityCacheObjects More...
 
+

Detailed Description

+
+

Definition at line 11 of file IdentityCache.cs.

+

Constructor & Destructor Documentation

+ +

◆ IdentityCache()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Security.IdentityCache.IdentityCache (IAsyncDelayer asyncDelayer,
ILogger< IdentityCachelogger 
)
+
+ +

Construct an IdentityCache

+
Parameters
+ + + +
asyncDelayerThe value of asyncDelayer
loggerThe value of logger
+
+
+ +

Definition at line 33 of file IdentityCache.cs.

+
34  {
35  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
36  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
37 
38  cachedIdentities = new Dictionary<long, IdentityCacheObject>();
39  }
readonly Dictionary< long, IdentityCacheObject > cachedIdentities
The map of Api.Models.Internal.User.Ids to IdentityCacheObjects
+
readonly ILogger< IdentityCache > logger
The ILogger for the IdentityCache
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the IdentityCache
+
+

References Tgstation.Server.Host.Security.IdentityCache.asyncDelayer, Tgstation.Server.Host.Security.IdentityCache.cachedIdentities, and Tgstation.Server.Host.Security.IdentityCache.logger.

+ +
+
+

Member Function Documentation

+ +

◆ CacheSystemIdentity()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void Tgstation.Server.Host.Security.IdentityCache.CacheSystemIdentity (User user,
ISystemIdentity systemIdentity,
DateTimeOffset expiry 
)
+
+ +

Keep a user 's systemIdentity alive until an expiry time

+ +

Implements Tgstation.Server.Host.Security.IIdentityCache.

+ +

Definition at line 50 of file IdentityCache.cs.

+
51  {
52  if (user == null)
53  throw new ArgumentNullException(nameof(user));
54  if (systemIdentity == null)
55  throw new ArgumentNullException(nameof(systemIdentity));
56  lock (cachedIdentities)
57  {
58  var uid = systemIdentity.Uid;
59  logger.LogDebug("Caching system identity {0} of user {1}", uid, user.Id);
60 
61  if (cachedIdentities.TryGetValue(user.Id, out var identCache))
62  {
63  logger.LogTrace("Expiring previously cached identity...");
64  identCache.Dispose(); // also clears it out
65  }
66 
67  identCache = new IdentityCacheObject(systemIdentity.Clone(), asyncDelayer, () =>
68  {
69  logger.LogDebug("Expiring system identity cache for user {1}", uid, user.Id);
70  lock (cachedIdentities)
71  cachedIdentities.Remove(user.Id);
72  }, expiry);
73  cachedIdentities.Add(user.Id, identCache);
74  }
75  }
readonly Dictionary< long, IdentityCacheObject > cachedIdentities
The map of Api.Models.Internal.User.Ids to IdentityCacheObjects
+
long Id
The ID of the User
Definition: User.cs:15
+
readonly ILogger< IdentityCache > logger
The ILogger for the IdentityCache
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the IdentityCache
+
+

References Tgstation.Server.Host.Security.IdentityCache.asyncDelayer, Tgstation.Server.Host.Security.IdentityCache.cachedIdentities, Tgstation.Server.Host.Security.ISystemIdentity.Clone(), Tgstation.Server.Api.Models.Internal.User.Id, Tgstation.Server.Host.Security.IdentityCache.logger, and Tgstation.Server.Host.Security.ISystemIdentity.Uid.

+ +
+
+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Security.IdentityCache.Dispose ()
+
+ +

+ +

Definition at line 42 of file IdentityCache.cs.

+
43  {
44  logger.LogTrace("Disposing...");
45  foreach (var I in cachedIdentities.Select(x => x.Value).ToList())
46  I.Dispose();
47  }
readonly Dictionary< long, IdentityCacheObject > cachedIdentities
The map of Api.Models.Internal.User.Ids to IdentityCacheObjects
+
readonly ILogger< IdentityCache > logger
The ILogger for the IdentityCache
+
+

References Tgstation.Server.Host.Security.IdentityCache.cachedIdentities, and Tgstation.Server.Host.Security.IdentityCache.logger.

+ +
+
+ +

◆ LoadCachedIdentity()

+ +
+
+ + + + + + + + +
ISystemIdentity Tgstation.Server.Host.Security.IdentityCache.LoadCachedIdentity (User user)
+
+ +

Attempt to load a cached ISystemIdentity

+ +

Implements Tgstation.Server.Host.Security.IIdentityCache.

+ +

Definition at line 78 of file IdentityCache.cs.

+
79  {
80  if (user == null)
81  throw new ArgumentNullException(nameof(user));
82  lock (cachedIdentities)
83  if (cachedIdentities.TryGetValue(user.Id, out var identity))
84  return identity.SystemIdentity.Clone();
85  throw new InvalidOperationException("Cached system identity has expired!");
86  }
readonly Dictionary< long, IdentityCacheObject > cachedIdentities
The map of Api.Models.Internal.User.Ids to IdentityCacheObjects
+
long Id
The ID of the User
Definition: User.cs:15
+
+

References Tgstation.Server.Host.Security.IdentityCache.cachedIdentities, and Tgstation.Server.Api.Models.Internal.User.Id.

+ +
+
+

Member Data Documentation

+ +

◆ asyncDelayer

+ +
+
+ + + + + +
+ + + + +
readonly IAsyncDelayer Tgstation.Server.Host.Security.IdentityCache.asyncDelayer
+
+private
+
+
+ +

◆ cachedIdentities

+ + + +

◆ logger

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<IdentityCache> Tgstation.Server.Host.Security.IdentityCache.logger
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.png b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.png new file mode 100644 index 0000000000000000000000000000000000000000..7d71f269d138cefedc80ba6c9b3f13a7ef1c5cfa GIT binary patch literal 1450 zcmbu9Yc!Nw7{~WSRxWcQw>Z*TdA&7^$fTi2N5rcciC8YVG>SEZGe?G$%StMw$vZ-Z zQ!z+s#<(WK(d3dyA>?+-rCdj@opL>Ioz^-Z&d0OY+WYzMwg1mr&tA`O?|6GVYrKrQ z3;+O+*jPFMumQrf{U!-))x`ZS#KKm4$_cCW^>s{+O)ZA9L^m<@eb(02ZjA5Wj%_!c zbFgy+nCaW-d~w1MfQ=@I znWhH0c83}*KRsVK`6T0TsuS8Wc@0j6N}6d#XSX03-t4y!y0;z{AP_x)N@Lr!r#yq2 znKm+`pE^rWEJx zJu8PB6si+S%*Wm@hC#_AdWL=QmGP%jCKrWE6|gkFL)&>o<8%sFzawKLS5SJ{F_A~2 z7@LOjRs}PIxA=bux)mNN!NV%*MVa9slhsKN<_wPg9 zT1&YZsYJ>YPLXBlUDLK7|s)qG=%EXm5SOOrejc_B1(!Op6RpzFJB=X9DEwY{`R1P#wr z(8(tA@t2%qb5?~!>K?gF=4UCq8DG&EgaUenot>AdAY_d5>YclZ1*Cr9}`;2 z1#eqvUsiM553F?9{sxDYah&5wi>uCd?r05SfKX1N(@j^KBKNI+qV7Ppg}KLcLD4RC z(6~>{gaXGBjd)@^7iL944}Pf9#QI;5?@vY-)<Wf4ETM)L{n%bNCxieF~If z-lV^qD_B$83?#T6#V+_5LaKJcY>@`Qr`G!eih$@U*NnRjle8j~{i0t#o&01o6mc%OYoBflUO(NZ zQI{j>ZKKt8)YnDSBnrJEeKo&T`GCrrTc*#h+g#b6MuG)b&cc1XUB_WFPsevu4M<({ z3r3Ij2sH+J<34!ATnVoX?ioF9juD?|r7os8M7@Ef%_mAq5pV=kN14Q_=g@MEP`$2= zF=T%n;aM**d|~O?*6i2md>zwSr)=aiF>p(af&`n=N9}DDzsQ2=ny+tj2fD@DM5vr4 zf&v3=LLM?ZJbEB-ID%bTofS8knGWeiwFNEZKBA)eD>O7OS{YVrWLDwAuQou(I{BVO zox}OPezJ7(7tcp5mQsOx&OCXUE!sh5v=Z7N5B!7n-Uga}qTnyGt^Rx44F);#AG_Ql z(f)jW8XG9>6>;Zee + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Security.IdentityCacheObject Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.html b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.html new file mode 100644 index 0000000000..73ef5c33a9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.html @@ -0,0 +1,302 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security.IdentityCacheObject Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security.IdentityCacheObject Class Reference
+
+
+ +

For keeping a specific ISystemIdentity alive for a period of time + More...

+
+Inheritance diagram for Tgstation.Server.Host.Security.IdentityCacheObject:
+
+
+ + +IDisposable + +
+ + + + + + + +

+Public Member Functions

 IdentityCacheObject (ISystemIdentity systemIdentity, IAsyncDelayer asyncDelayer, Action onExpiry, DateTimeOffset expiry)
 Construct an IdentityCache More...
 
void Dispose ()
 
+ + + + +

+Properties

ISystemIdentity SystemIdentity [get]
 The ISystemIdentity the IdentityCache manages More...
 
+ + + + + + + +

+Private Attributes

readonly CancellationTokenSource cancellationTokenSource
 The cancellationTokenSource for the IdentityCache More...
 
readonly Task task
 The Task to clean up SystemIdentity More...
 
+

Detailed Description

+

For keeping a specific ISystemIdentity alive for a period of time

+ +

Definition at line 11 of file IdentityCacheObject.cs.

+

Constructor & Destructor Documentation

+ +

◆ IdentityCacheObject()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Security.IdentityCacheObject.IdentityCacheObject (ISystemIdentity systemIdentity,
IAsyncDelayer asyncDelayer,
Action onExpiry,
DateTimeOffset expiry 
)
+
+ +

Construct an IdentityCache

+
Parameters
+ + + + + +
systemIdentityThe value of SystemIdentity
asyncDelayerThe IAsyncDelayer used to delay the expiry
onExpiryThe Action to take on expiry
expiryThe DateTimeOffset
+
+
+ +

Definition at line 35 of file IdentityCacheObject.cs.

+
36  {
37  SystemIdentity = systemIdentity ?? throw new ArgumentNullException(nameof(systemIdentity));
38 
39  if (asyncDelayer == null)
40  throw new ArgumentNullException(nameof(asyncDelayer));
41 
42  if (onExpiry == null)
43  throw new ArgumentNullException(nameof(onExpiry));
44  var now = DateTimeOffset.Now;
45  if (expiry < now)
46  throw new ArgumentOutOfRangeException(nameof(expiry), expiry, "expiry must be greater than DateTimeOffset.Now!");
47 
48  cancellationTokenSource = new CancellationTokenSource();
49 
50  async Task DisposeOnExipiry(CancellationToken cancellationToken)
51  {
52  using (SystemIdentity)
53  try
54  {
55  await asyncDelayer.Delay(expiry - now, cancellationToken).ConfigureAwait(false);
56  }
57  finally
58  {
59  onExpiry();
60  }
61  }
62 
63  task = DisposeOnExipiry(cancellationTokenSource.Token);
64  }
readonly Task task
The Task to clean up SystemIdentity
+
ISystemIdentity SystemIdentity
The ISystemIdentity the IdentityCache manages
+
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+
readonly CancellationTokenSource cancellationTokenSource
The cancellationTokenSource for the IdentityCache
+
+

References Tgstation.Server.Host.Security.IdentityCacheObject.cancellationTokenSource, Tgstation.Server.Host.Core.IAsyncDelayer.Delay(), Tgstation.Server.Host.Security.IdentityCacheObject.SystemIdentity, and Tgstation.Server.Host.Security.IdentityCacheObject.task.

+ +
+
+

Member Function Documentation

+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Security.IdentityCacheObject.Dispose ()
+
+ +

+ +

Definition at line 67 of file IdentityCacheObject.cs.

+
68  {
69  cancellationTokenSource.Cancel();
70  try
71  {
72  task.GetAwaiter().GetResult();
73  }
74  catch (OperationCanceledException) { }
75  cancellationTokenSource.Dispose();
76  }
readonly Task task
The Task to clean up SystemIdentity
+
readonly CancellationTokenSource cancellationTokenSource
The cancellationTokenSource for the IdentityCache
+
+

References Tgstation.Server.Host.Security.IdentityCacheObject.cancellationTokenSource, and Tgstation.Server.Host.Security.IdentityCacheObject.task.

+ +
+
+

Member Data Documentation

+ +

◆ cancellationTokenSource

+ +
+
+ + + + + +
+ + + + +
readonly CancellationTokenSource Tgstation.Server.Host.Security.IdentityCacheObject.cancellationTokenSource
+
+private
+
+
+ +

◆ task

+ +
+
+ + + + + +
+ + + + +
readonly Task Tgstation.Server.Host.Security.IdentityCacheObject.task
+
+private
+
+
+

Property Documentation

+ +

◆ SystemIdentity

+ +
+
+ + + + + +
+ + + + +
ISystemIdentity Tgstation.Server.Host.Security.IdentityCacheObject.SystemIdentity
+
+get
+
+ +

The ISystemIdentity the IdentityCache manages

+ +

Definition at line 16 of file IdentityCacheObject.cs.

+
16 { get; }
+

Referenced by Tgstation.Server.Host.Security.IdentityCacheObject.IdentityCacheObject().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.png b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.png new file mode 100644 index 0000000000000000000000000000000000000000..f1ef53661a07f1435d69bf2ffd4fcb44beeffd0f GIT binary patch literal 937 zcmeAS@N?(olHy`uVBq!ia0y~yVAKb)12~w0WIZ#p7m$(&@CkAK|NlRb`Qpvj(*8pe zfGjXRaNq!I=N)+<-&I#s;#Y1B3(j7vxnfd^ie_W2XOP_QNlR?Lsd`qv@t*Xl z=3IDX&i(q|8&zUA9ZzvmeOdo#^S(Oe1N**}-{+qCk6w|_;qn|W55mwze^@!$Ts>20=D|J;eiHsAL3r8-Tzcc!+cxAp6zsPM8$U*g_v zw5$3zX-W2@1HUS3YySPe{Ccs9Z%xq(&rAI`rmH;NsPB2I*f@StNjAteFp=c=NmHIb zTzxIdckR|Rh8@cB3~UOmwTw%C{@P^Fp!1D&!n1{^4>3%-A$}l#gKmQjP~iAJhEF%d z9prv9ok)&nsC>h%&|k~=WTQSMlH0$AdTB135)>4`z~jJ#YO-aG>}LB5+sb}fL{-m~ zXNuUko%zUHi~ok_uQdP7smkK+nLd5z^1e5Y;+gHgcAfh9DmF=&K|JP{*Hh2muk_a! zulIWV`}rqd@qKdB=J(guFMgN4d)HE%{o&O=eppo})UT}Xe|&6W?bP)A7Y}~cmn<^f z`{J6IXwqT#_r?9XvJcn36u4-0>vz??CLuGfTyDnpdp}b9qI1i4*)lJmQasPKYaM&y z9pAfACAJ)KF6|2pPirN8y87;$?d&+^J(-Mbk21}j*UggnbVTUYI=_9>c5hu@Csvb~ zoVQy3yM9fnYvtSQ|5^*zop%)Su3feM+L1ZWPlcZ-pLXhlY}iwYc-3E0`fWPFe_Gd{ z{%CRj^4uwTvw#|YRdt`!)hc_Ky=I19nW^0L^wqy+U7Kn@YyY)v{@e(Lp4?REWkt1j!h6b2kkT^7%Ecxm1~uGh)c_Z81e3f1~f-TCTT z+1lu@PM3;TN{by7+Y%>#yXnf=_QNtf1;%xkckZv47~bEv@0g{;1HV0<;kT|w&S&`k w`0}o4j|C4foIy + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Security.PosixSystemIdentityFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Security.PosixSystemIdentityFactory, including all inherited members.

+ + + +
CreateSystemIdentity(User user, CancellationToken cancellationToken)Tgstation.Server.Host.Security.PosixSystemIdentityFactory
CreateSystemIdentity(string username, string password, CancellationToken cancellationToken)Tgstation.Server.Host.Security.PosixSystemIdentityFactory
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_posix_system_identity_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_posix_system_identity_factory.html new file mode 100644 index 0000000000..65d2e1529b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_posix_system_identity_factory.html @@ -0,0 +1,186 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security.PosixSystemIdentityFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security.PosixSystemIdentityFactory Class Reference
+
+
+ +

ISystemIdentityFactory for posix systems + More...

+
+Inheritance diagram for Tgstation.Server.Host.Security.PosixSystemIdentityFactory:
+
+
+ + +Tgstation.Server.Host.Security.ISystemIdentityFactory + +
+ + + + + + + + +

+Public Member Functions

Task< ISystemIdentityCreateSystemIdentity (User user, CancellationToken cancellationToken)
 Create a ISystemIdentity for a given user More...
 
Task< ISystemIdentityCreateSystemIdentity (string username, string password, CancellationToken cancellationToken)
 Create a ISystemIdentity for a given username and password More...
 
+

Detailed Description

+

ISystemIdentityFactory for posix systems

+

TODO: Blocked by https://github.com/dotnet/corefx/issues/3187

+ +

Definition at line 12 of file PosixSystemIdentityFactory.cs.

+

Member Function Documentation

+ +

◆ CreateSystemIdentity() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<ISystemIdentity> Tgstation.Server.Host.Security.PosixSystemIdentityFactory.CreateSystemIdentity (User user,
CancellationToken cancellationToken 
)
+
+ +

Create a ISystemIdentity for a given user

+ +

Implements Tgstation.Server.Host.Security.ISystemIdentityFactory.

+ +
+
+ +

◆ CreateSystemIdentity() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<ISystemIdentity> Tgstation.Server.Host.Security.PosixSystemIdentityFactory.CreateSystemIdentity (string username,
string password,
CancellationToken cancellationToken 
)
+
+ +

Create a ISystemIdentity for a given username and password

+ +

Implements Tgstation.Server.Host.Security.ISystemIdentityFactory.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_posix_system_identity_factory.png b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_posix_system_identity_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..0c4ab75d3df72b64ff152f7b32fd6bd0e27f2b94 GIT binary patch literal 1301 zcmcJP`!|~h7{^~CWRA;OJC54Q&RpiW)IB3;t7W9EFqdgbwMVq4sv-I|?pYUgw$fA6 za1a%A2pW>1LX@Cxsgs8E;uW%>7MF(AK~xfCS%0wp1AET-KF{Yl&-2^&IZu8VCdg3V zTps`cLv(OJH~?rxYd8!6)8q=;h^?lWg`JBGRIAk*TwawEe|uJ>p^xhC?}z7$Ej2CT zRyZaC&@BBMZ^k0s06?b>9pE3Cp|wVvPu{XOfd6`UC0iZDoe4o8y;hQC4tSf+$|&uj zDcIC)5gYG-pJCS*giy{LGiW$3GN1%|?fj^nGuvwa=y z8S8RWl1aID_wP-D8$)yU1oTEXiY5C{$gpZs0J z+NM@7xw;8GAr;6r{I|%-er=%RYx(YbjH6yg^EH|z8i@mSp8DgEThGjH z&7&!=oS+87CMumS&n65$mq@#g*+%=2KU*4@dbGk2jnhQJQbevD&N+A8`nk-9 ziG!!RO%e*p&b%#m5a+XBWW zPn-jpR6?yo*Ov-qmAU6qI=z~)MNf587|S-0*8+D)jx=tTkHBT%gbk!f5U|3FUs2u5 zx{2GUt&lc+FCy()nu5Ye^`|8Ejk8>%M;&;ubOo^uNADSszg+R`4fakl+a^$=Nhm7GR1=hO%im=D!xv9 z;=nw78Ld1yEZCctrW@?$$*y!1*BMVN#qTZlY(KO?S2q}sC`lGYbrkE~`U4jaKo8Qm z{gRE3r33o~`&uPHcobIarTqORGMx8gDm)m1C6VF58rnG#8L73Q8UC-5H*~QlW12c9 z!vkSQq#I+*sF>BO~phE;x{&in%&G;g6dLv>=c$c~{Nvf4shX zs=?y_u8$0+yFpK{-T@Il?X^w=a3Egq4$ryE$lWUUis8e|pV?#FZUYM^SCQ*-4okip zoNTGa{}7w_g@5L@-4^uBbFRWMQ?w|BjLSL)e0L4+?69b2b43#f*g{)L*IEn#av zoRhT9wurlVG;SE1vUxJ+$P3k&`y8s8uP`yk*phXzj}%DKTv|ODFFV?L8uTc`($Y`x zSY>EI+}}3FVkzW#p@RS65G1*gV|4bb@rp~A7Ew|tn_25s@y&GcZa7`l;Swc`F~1n0 z?Ge4{=q?d>58u3xQ6>l~jUqVoj2fz`ZhEBWX?`=3Ul|H=T(I~m*v`4$H8HC;bF|+E z;* + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Security.Tests.TestAuthenticationContext Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_tests_1_1_test_authentication_context.html b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_tests_1_1_test_authentication_context.html new file mode 100644 index 0000000000..712890ac88 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_tests_1_1_test_authentication_context.html @@ -0,0 +1,149 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security.Tests.TestAuthenticationContext Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security.Tests.TestAuthenticationContext Class Reference
+
+
+ +

Tests for AuthenticationContext + More...

+ + + + + + +

+Public Member Functions

void TestConstruction ()
 
void TestGetRightsGeneric ()
 
+

Detailed Description

+

Tests for AuthenticationContext

+ +

Definition at line 13 of file TestAuthenticationContext.cs.

+

Member Function Documentation

+ +

◆ TestConstruction()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Security.Tests.TestAuthenticationContext.TestConstruction ()
+
+ +

Definition at line 16 of file TestAuthenticationContext.cs.

+
17  {
18  Assert.ThrowsException<ArgumentNullException>(() => new AuthenticationContext(null, null, null));
19  var mockSystemIdentity = new Mock<ISystemIdentity>();
20 
21  var user = new User();
22 
23  var authContext = new AuthenticationContext(null, user, null);
24  Assert.ThrowsException<ArgumentNullException>(() => new AuthenticationContext(mockSystemIdentity.Object, null, null));
25 
26  var instanceUser = new InstanceUser();
27 
28  Assert.ThrowsException<ArgumentNullException>(() => new AuthenticationContext(null, null, instanceUser));
29  Assert.ThrowsException<ArgumentNullException>(() => new AuthenticationContext(mockSystemIdentity.Object, null, instanceUser));
30  authContext = new AuthenticationContext(mockSystemIdentity.Object, user, null);
31  authContext = new AuthenticationContext(null, user, instanceUser);
32  authContext = new AuthenticationContext(mockSystemIdentity.Object, user, instanceUser);
33  user.SystemIdentifier = "root";
34  Assert.ThrowsException<ArgumentNullException>(() => new AuthenticationContext(null, user, null));
35  }
+ +
+
+
+ +

◆ TestGetRightsGeneric()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Security.Tests.TestAuthenticationContext.TestGetRightsGeneric ()
+
+ +

Definition at line 39 of file TestAuthenticationContext.cs.

+
40  {
41  var user = new User();
42  var instanceUser = new InstanceUser();
43  var authContext = new AuthenticationContext(null, user, instanceUser);
44 
45  user.AdministrationRights = AdministrationRights.WriteUsers;
46  instanceUser.ByondRights = ByondRights.ChangeVersion | ByondRights.ReadActive;
47  Assert.AreEqual((ulong)user.AdministrationRights, authContext.GetRight(RightsType.Administration));
48  Assert.AreEqual((ulong)instanceUser.ByondRights, authContext.GetRight(RightsType.Byond));
49  }
ByondRights
Rights for Models.Byond
Definition: ByondRights.cs:9
+
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
+
AdministrationRights
Rights for Models.Administration
+ + +
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory-members.html b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory-members.html new file mode 100644 index 0000000000..6fcc5d76a1 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory-members.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Security.TokenFactory Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html new file mode 100644 index 0000000000..abbc2e36bc --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html @@ -0,0 +1,370 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security.TokenFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security.TokenFactory Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Security.TokenFactory:
+
+
+ + +Tgstation.Server.Host.Security.ITokenFactory + +
+ + + + + + + + +

+Public Member Functions

 TokenFactory (IAsyncDelayer asyncDelayer, ICryptographySuite cryptographySuite)
 Construct a TokenFactory More...
 
async Task< TokenCreateToken (Models.User user, CancellationToken cancellationToken)
 Create a Token for a given user More...
 
+ + + + + + + +

+Properties

TokenValidationParameters ValidationParameters [get]
 
- Properties inherited from Tgstation.Server.Host.Security.ITokenFactory
TokenValidationParameters ValidationParameters [get]
 The TokenValidationParameters for the ITokenFactory More...
 
+ + + + + + + + + + + + + +

+Private Attributes

const uint TokenExpiryMinutes = 15
 Amount of minutes until generated Tokens expire More...
 
const uint TokenClockSkewMinutes = 1
 Amount of minutes to skew the clock for Token validation More...
 
const uint TokenSigningKeyByteAmount = 256
 Amount of bytes to use in the TokenValidationParameters.IssuerSigningKey More...
 
readonly IAsyncDelayer asyncDelayer
 The IAsyncDelayer for the TokenFactory More...
 
+

Detailed Description

+
+

Definition at line 15 of file TokenFactory.cs.

+

Constructor & Destructor Documentation

+ +

◆ TokenFactory()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Security.TokenFactory.TokenFactory (IAsyncDelayer asyncDelayer,
ICryptographySuite cryptographySuite 
)
+
+ +

Construct a TokenFactory

+
Parameters
+ + + +
asyncDelayerThe value of asyncDelayer
cryptographySuiteThe ICryptographySuite used for generating the ValidationParameters
+
+
+ +

Definition at line 45 of file TokenFactory.cs.

+
46  {
47  ValidationParameters = new TokenValidationParameters
48  {
49  ValidateIssuerSigningKey = true,
50  IssuerSigningKey = new SymmetricSecurityKey(cryptographySuite.GetSecureBytes(TokenSigningKeyByteAmount)),
51 
52  ValidateIssuer = true,
53  ValidIssuer = Assembly.GetExecutingAssembly().GetName().Name,
54 
55  ValidateLifetime = true,
56  ValidateAudience = true,
57  ValidAudience = typeof(Token).Assembly.GetName().Name,
58 
59  ClockSkew = TimeSpan.FromMinutes(TokenClockSkewMinutes),
60 
61  RequireSignedTokens = true,
62 
63  RequireExpirationTime = true
64  };
65 
66  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
67  }
const uint TokenClockSkewMinutes
Amount of minutes to skew the clock for Token validation
Definition: TokenFactory.cs:25
+
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the TokenFactory
Definition: TokenFactory.cs:38
+
Represents a JWT returned by the API
Definition: Token.cs:8
+
const uint TokenSigningKeyByteAmount
Amount of bytes to use in the TokenValidationParameters.IssuerSigningKey
Definition: TokenFactory.cs:30
+
TokenValidationParameters ValidationParameters
Definition: TokenFactory.cs:33
+
+

References Tgstation.Server.Host.Security.TokenFactory.asyncDelayer, Tgstation.Server.Host.Security.ICryptographySuite.GetSecureBytes(), Tgstation.Server.Host.Security.TokenFactory.TokenClockSkewMinutes, Tgstation.Server.Host.Security.TokenFactory.TokenSigningKeyByteAmount, and Tgstation.Server.Host.Security.TokenFactory.ValidationParameters.

+ +
+
+

Member Function Documentation

+ +

◆ CreateToken()

+ +
+
+ + + + + + + + + + + + + + + + + + +
async Task<Token> Tgstation.Server.Host.Security.TokenFactory.CreateToken (Models.User user,
CancellationToken cancellationToken 
)
+
+ +

Create a Token for a given user

+ +

Implements Tgstation.Server.Host.Security.ITokenFactory.

+ +

Definition at line 70 of file TokenFactory.cs.

+
71  {
72  if (user == null)
73  throw new ArgumentNullException(nameof(user));
74 
75  var now = DateTimeOffset.Now;
76  var nowUnix = now.ToUnixTimeSeconds();
77 
78  // this prevents validation conflicts down the line
79  // tldr we can (theoretically) send a token the same second we receive it
80  // since unix time rounds down, it looks like it came from before the user changed their password
81  // this happens occasionally in unit tests
82  // just delay a second so we can force a round up
83  var lpuUnix = user.LastPasswordUpdate?.ToUnixTimeSeconds();
84  if (nowUnix == lpuUnix)
85  await asyncDelayer.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
86 
87  var expiry = now.AddMinutes(TokenExpiryMinutes);
88  var claims = new Claim[]
89  {
90  new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString(CultureInfo.InvariantCulture)),
91  new Claim(JwtRegisteredClaimNames.Exp, expiry.ToUnixTimeSeconds().ToString(CultureInfo.InvariantCulture)),
92  new Claim(JwtRegisteredClaimNames.Nbf, nowUnix.ToString(CultureInfo.InvariantCulture)),
93  new Claim(JwtRegisteredClaimNames.Iss, ValidationParameters.ValidIssuer),
94  new Claim(JwtRegisteredClaimNames.Aud, ValidationParameters.ValidAudience)
95  };
96 
97  var token = new JwtSecurityToken(new JwtHeader(new SigningCredentials(ValidationParameters.IssuerSigningKey, SecurityAlgorithms.HmacSha256)), new JwtPayload(claims));
98  return new Token { Bearer = new JwtSecurityTokenHandler().WriteToken(token), ExpiresAt = expiry };
99  }
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the TokenFactory
Definition: TokenFactory.cs:38
+
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan
+
Represents a JWT returned by the API
Definition: Token.cs:8
+
TokenValidationParameters ValidationParameters
Definition: TokenFactory.cs:33
+
const uint TokenExpiryMinutes
Amount of minutes until generated Tokens expire
Definition: TokenFactory.cs:20
+
+

References Tgstation.Server.Host.Security.TokenFactory.asyncDelayer, Tgstation.Server.Host.Core.IAsyncDelayer.Delay(), Tgstation.Server.Host.Security.TokenFactory.TokenExpiryMinutes, and Tgstation.Server.Host.Security.TokenFactory.ValidationParameters.

+ +
+
+

Member Data Documentation

+ +

◆ asyncDelayer

+ +
+
+ + + + + +
+ + + + +
readonly IAsyncDelayer Tgstation.Server.Host.Security.TokenFactory.asyncDelayer
+
+private
+
+
+ +

◆ TokenClockSkewMinutes

+ +
+
+ + + + + +
+ + + + +
const uint Tgstation.Server.Host.Security.TokenFactory.TokenClockSkewMinutes = 1
+
+private
+
+ +

Amount of minutes to skew the clock for Token validation

+ +

Definition at line 25 of file TokenFactory.cs.

+ +

Referenced by Tgstation.Server.Host.Security.TokenFactory.TokenFactory().

+ +
+
+ +

◆ TokenExpiryMinutes

+ +
+
+ + + + + +
+ + + + +
const uint Tgstation.Server.Host.Security.TokenFactory.TokenExpiryMinutes = 15
+
+private
+
+ +

Amount of minutes until generated Tokens expire

+ +

Definition at line 20 of file TokenFactory.cs.

+ +

Referenced by Tgstation.Server.Host.Security.TokenFactory.CreateToken().

+ +
+
+ +

◆ TokenSigningKeyByteAmount

+ +
+
+ + + + + +
+ + + + +
const uint Tgstation.Server.Host.Security.TokenFactory.TokenSigningKeyByteAmount = 256
+
+private
+
+ +

Amount of bytes to use in the TokenValidationParameters.IssuerSigningKey

+ +

Definition at line 30 of file TokenFactory.cs.

+ +

Referenced by Tgstation.Server.Host.Security.TokenFactory.TokenFactory().

+ +
+
+

Property Documentation

+ +

◆ ValidationParameters

+ +
+
+ + + + + +
+ + + + +
TokenValidationParameters Tgstation.Server.Host.Security.TokenFactory.ValidationParameters
+
+get
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.png b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..d2f4b5d6b1a08a3a48bf8b983daa24319a776702 GIT binary patch literal 1073 zcmeAS@N?(olHy`uVBq!ia0y~yVB`a`12~w0OMsL_fKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+1M>k-7srqa#z!R-d_;<8JU)1-ZauWuFa`#k;j+p_H0@_Cc4eEVa<=eg{d;>jx(Dl?_pRW2Vf zoG0(;S62C7|L$z_Y3(X2H!Y7Yn|EFRv5sWVoZ_!Fp;sd{S6YWHZ*ZO@cKh1>$Az7b z*IG!rM`;y$TuR!1pfLUCkLQggkE?2I!?(YGo5!=~KO6t{<=zop7SDPm_jYaGpK+$QIyK3{xli&PJuh?N5dno9LVg8vHp>zJaUf#BUri))ie2kDz^R4hR z+m3Dgd8i;Mp@?tty}+kB7gN*a+LAeU9@BJc;R*82HJ7pfyuMlN=Df!nJipqX`Swawvrkzf{Cwe)H}h>D+_nfg+>kKcBBp3_i?PhZvw77mOBY!OIk#JcTlm%O z-zh8hU|*Y5dw)gK+Ak lG9(I1jvF46$o>7?e)f3_gE<1{ih=o?!PC{xWt~$(69CB>?!N#4 literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity-members.html b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity-members.html new file mode 100644 index 0000000000..74a5d2d563 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity-members.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Security.WindowsSystemIdentity Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html new file mode 100644 index 0000000000..bf5883d06b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html @@ -0,0 +1,394 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security.WindowsSystemIdentity Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security.WindowsSystemIdentity Class Reference
+
+
+ +

ISystemIdentity for windows systems + More...

+
+Inheritance diagram for Tgstation.Server.Host.Security.WindowsSystemIdentity:
+
+
+ + +Tgstation.Server.Host.Security.ISystemIdentity +IDisposable + +
+ + + + + + + + + + + + + + + + +

+Public Member Functions

 WindowsSystemIdentity (WindowsIdentity identity)
 Construct a WindowsSystemIdentity using a WindowsIdentity More...
 
 WindowsSystemIdentity (UserPrincipal userPrincipal)
 Construct a WindowsSystemIdentity using a UserPrincipal More...
 
void Dispose ()
 
ISystemIdentity Clone ()
 Clone the ISystemIdentity creating another copy that must have IDisposable.Dispose called on it More...
 
Task RunImpersonated (Action action, CancellationToken cancellationToken)
 Runs a given action in the context of the ISystemIdentity More...
 
+ + + + + +

+Public Attributes

string Uid => (userPrincipal?.Sid ?? identity.User).ToString()
 
string Username => userPrincipal?.Name ?? identity.Name
 
+ + + + + + + +

+Private Attributes

readonly WindowsIdentity identity
 The WindowsIdentity for the WindowsSystemIdentity More...
 
readonly UserPrincipal userPrincipal
 The UserPrincipal for the WindowsSystemIdentity More...
 
+ + + + + + + + +

+Additional Inherited Members

- Properties inherited from Tgstation.Server.Host.Security.ISystemIdentity
string Uid [get]
 A unique identifier for the user More...
 
string Username [get]
 The user's name More...
 
+

Detailed Description

+

ISystemIdentity for windows systems

+ +

Definition at line 12 of file WindowsSystemIdentity.cs.

+

Constructor & Destructor Documentation

+ +

◆ WindowsSystemIdentity() [1/2]

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Security.WindowsSystemIdentity.WindowsSystemIdentity (WindowsIdentity identity)
+
+ +

Construct a WindowsSystemIdentity using a WindowsIdentity

+
Parameters
+ + +
identityThe value of identity
+
+
+ +

Definition at line 34 of file WindowsSystemIdentity.cs.

+
35  {
36  this.identity = identity ?? throw new ArgumentNullException(nameof(identity));
37  }
readonly WindowsIdentity identity
The WindowsIdentity for the WindowsSystemIdentity
+
+

References Tgstation.Server.Host.Security.WindowsSystemIdentity.identity.

+ +

Referenced by Tgstation.Server.Host.Security.WindowsSystemIdentity.Clone().

+ +
+
+ +

◆ WindowsSystemIdentity() [2/2]

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Security.WindowsSystemIdentity.WindowsSystemIdentity (UserPrincipal userPrincipal)
+
+ +

Construct a WindowsSystemIdentity using a UserPrincipal

+
Parameters
+ + +
userPrincipalThe value of userPrincipal
+
+
+ +

Definition at line 43 of file WindowsSystemIdentity.cs.

+
44  {
45  this.userPrincipal = userPrincipal ?? throw new ArgumentNullException(nameof(userPrincipal));
46  }
readonly UserPrincipal userPrincipal
The UserPrincipal for the WindowsSystemIdentity
+
+

References Tgstation.Server.Host.Security.WindowsSystemIdentity.userPrincipal.

+ +
+
+

Member Function Documentation

+ +

◆ Clone()

+ +
+
+ + + + + + + +
ISystemIdentity Tgstation.Server.Host.Security.WindowsSystemIdentity.Clone ()
+
+ +

Clone the ISystemIdentity creating another copy that must have IDisposable.Dispose called on it

+ +

Implements Tgstation.Server.Host.Security.ISystemIdentity.

+ +

Definition at line 62 of file WindowsSystemIdentity.cs.

+
63  {
64  if (identity != null)
65  {
66  // var newIdentity = (WindowsIdentity)identity.Clone(); //doesn't work because of https://github.com/dotnet/corefx/issues/31841
67  var newIdentity = new WindowsIdentity(identity.Token); // the handle is cloned internally
68 
69  return new WindowsSystemIdentity(newIdentity);
70  }
71 
72  // can't clone a UP, shouldn't be trying to anyway, cloning is for impersonation
73  throw new InvalidOperationException("Cannot clone a UserPrincipal based WindowsSystemIdentity!");
74  }
WindowsSystemIdentity(WindowsIdentity identity)
Construct a WindowsSystemIdentity using a WindowsIdentity
+
readonly WindowsIdentity identity
The WindowsIdentity for the WindowsSystemIdentity
+
+

References Tgstation.Server.Host.Security.WindowsSystemIdentity.identity, and Tgstation.Server.Host.Security.WindowsSystemIdentity.WindowsSystemIdentity().

+ +
+
+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Security.WindowsSystemIdentity.Dispose ()
+
+ +

+ +

Definition at line 49 of file WindowsSystemIdentity.cs.

+
50  {
51  if (identity != null)
52  identity.Dispose();
53  else
54  {
55  var context = userPrincipal.Context;
56  userPrincipal.Dispose();
57  context.Dispose();
58  }
59  }
readonly WindowsIdentity identity
The WindowsIdentity for the WindowsSystemIdentity
+
readonly UserPrincipal userPrincipal
The UserPrincipal for the WindowsSystemIdentity
+
+

References Tgstation.Server.Host.Security.WindowsSystemIdentity.identity, and Tgstation.Server.Host.Security.WindowsSystemIdentity.userPrincipal.

+ +
+
+ +

◆ RunImpersonated()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Security.WindowsSystemIdentity.RunImpersonated (Action action,
CancellationToken cancellationToken 
)
+
+ +

Runs a given action in the context of the ISystemIdentity

+ +

Implements Tgstation.Server.Host.Security.ISystemIdentity.

+ +
+
+

Member Data Documentation

+ +

◆ identity

+ +
+
+ + + + + +
+ + + + +
readonly WindowsIdentity Tgstation.Server.Host.Security.WindowsSystemIdentity.identity
+
+private
+
+
+ +

◆ Uid

+ +
+
+ + + + +
string Tgstation.Server.Host.Security.WindowsSystemIdentity.Uid => (userPrincipal?.Sid ?? identity.User).ToString()
+
+ +

+ +

Definition at line 15 of file WindowsSystemIdentity.cs.

+ +
+
+ +

◆ Username

+ +
+
+ + + + +
string Tgstation.Server.Host.Security.WindowsSystemIdentity.Username => userPrincipal?.Name ?? identity.Name
+
+ +

+ +

Definition at line 18 of file WindowsSystemIdentity.cs.

+ +
+
+ +

◆ userPrincipal

+ +
+
+ + + + + +
+ + + + +
readonly UserPrincipal Tgstation.Server.Host.Security.WindowsSystemIdentity.userPrincipal
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.png b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.png new file mode 100644 index 0000000000000000000000000000000000000000..020ddf14e597a4903ebdd47c705eba535e748944 GIT binary patch literal 1545 zcmb_cZ8Vf=7=DL{7L7vXvpVmjVSR-{o2d@VU`9)8yzLh%CLo*-8pS& zDWrQ9R(h(-=e1XhR?$N!a%C$EICdL&*VMGG4!4PPCv3|b>a=Q|7Nh-x&1P*hp_E*q4 zjdYNp5}_#keJ#>jiRi(Sfi!i4F8ZoeunZ?RxYjifBZIJhAbS6*xK*`mGjhDVG|rFQ zk!Q-QT*Pv7TM}X?R}{P1<$o%Z#0}mRtmGll=_qP=HUxikV>3Y9cQYK+5|>}+Rt8PA zdJ3~VludBz#`gZX*vx)LUZ<5lqY0kNjnt7O9N!o+RhHrqCJLsrZaaSceX8g@?~`L@gB?g2G|$OCHpdSU@R7YP(k^~9S16Tm6r=Ky6NH78hqQr+ z3b@`ic%j2tLb7^=6pZ%BXh&1!H}>lFD~bAc-{0rkTjL>TSi6*(abUPl=`jT@XC>Q% z)BflE`P1T&%uC>j66Ul#PUT0~-gjfw;Mi5i)1WXSPW_P@T|Y??zQDn1%nyzj3>vxB zPo}AJX7Hv4B42&QzrF%YsH@xb`mK1G=9Mz|tI}{@B)SHyDc_K%0E-5MxP8psGli*ZBsbO`;yJkhW_-tm+* zL)65bX|21aD?-v}PVBf3&5-9k&*j6lZ^yJk9T%8_FNSh6Qmomloun(m3sCMaK6j7|6s&Pb*tQ6^ zX->T6KjJ?1+36;06fq+|6ALLWW<6~?qn>xHpS!yW<}t`bGW&Uqs?$Sd;Cjt$fd#$) zxOq2(F&&Aeb08r+r<_f-$g&v4opcBw4^`P@@hau5iS9k0TBkFLWUTZIQk98aec(Vu zw^7b9gLBY{@dvSj!QwTKwvwsi%mQ + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Security.WindowsSystemIdentityFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Security.WindowsSystemIdentityFactory, including all inherited members.

+ + + + + + +
CreateSystemIdentity(User user, CancellationToken cancellationToken)Tgstation.Server.Host.Security.WindowsSystemIdentityFactory
CreateSystemIdentity(string username, string password, CancellationToken cancellationToken)Tgstation.Server.Host.Security.WindowsSystemIdentityFactory
GetUserAndDomainName(string input, out string username, out string domainName)Tgstation.Server.Host.Security.WindowsSystemIdentityFactoryprivatestatic
loggerTgstation.Server.Host.Security.WindowsSystemIdentityFactoryprivate
WindowsSystemIdentityFactory(ILogger< WindowsSystemIdentityFactory > logger)Tgstation.Server.Host.Security.WindowsSystemIdentityFactory
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.html new file mode 100644 index 0000000000..813ee98d6d --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.html @@ -0,0 +1,317 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security.WindowsSystemIdentityFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security.WindowsSystemIdentityFactory Class Reference
+
+
+ +

ISystemIdentityFactory for windows systems. Uses long running tasks due to potential networked domains + More...

+
+Inheritance diagram for Tgstation.Server.Host.Security.WindowsSystemIdentityFactory:
+
+
+ + +Tgstation.Server.Host.Security.ISystemIdentityFactory + +
+ + + + + + + + + + + +

+Public Member Functions

 WindowsSystemIdentityFactory (ILogger< WindowsSystemIdentityFactory > logger)
 Construct a WindowsSystemIdentityFactory More...
 
Task< ISystemIdentityCreateSystemIdentity (User user, CancellationToken cancellationToken)
 Create a ISystemIdentity for a given user More...
 
Task< ISystemIdentityCreateSystemIdentity (string username, string password, CancellationToken cancellationToken)
 Create a ISystemIdentity for a given username and password More...
 
+ + + + +

+Static Private Member Functions

static void GetUserAndDomainName (string input, out string username, out string domainName)
 Extract the username and domain name from a string in the format "username\\domainname" More...
 
+ + + + +

+Private Attributes

readonly ILogger< WindowsSystemIdentityFactorylogger
 The ILogger for the WindowsSystemIdentityFactory More...
 
+

Detailed Description

+

ISystemIdentityFactory for windows systems. Uses long running tasks due to potential networked domains

+ +

Definition at line 15 of file WindowsSystemIdentityFactory.cs.

+

Constructor & Destructor Documentation

+ +

◆ WindowsSystemIdentityFactory()

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Security.WindowsSystemIdentityFactory.WindowsSystemIdentityFactory (ILogger< WindowsSystemIdentityFactorylogger)
+
+ +

Construct a WindowsSystemIdentityFactory

+
Parameters
+ + +
loggerThe value of logger
+
+
+ +

Definition at line 39 of file WindowsSystemIdentityFactory.cs.

+
40  {
41  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
42  }
readonly ILogger< WindowsSystemIdentityFactory > logger
The ILogger for the WindowsSystemIdentityFactory
+
+

References Tgstation.Server.Host.Security.WindowsSystemIdentityFactory.logger.

+ +
+
+

Member Function Documentation

+ +

◆ CreateSystemIdentity() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<ISystemIdentity> Tgstation.Server.Host.Security.WindowsSystemIdentityFactory.CreateSystemIdentity (User user,
CancellationToken cancellationToken 
)
+
+ +

Create a ISystemIdentity for a given user

+ +

Implements Tgstation.Server.Host.Security.ISystemIdentityFactory.

+ +
+
+ +

◆ CreateSystemIdentity() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<ISystemIdentity> Tgstation.Server.Host.Security.WindowsSystemIdentityFactory.CreateSystemIdentity (string username,
string password,
CancellationToken cancellationToken 
)
+
+ +

Create a ISystemIdentity for a given username and password

+ +

Implements Tgstation.Server.Host.Security.ISystemIdentityFactory.

+ +
+
+ +

◆ GetUserAndDomainName()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void Tgstation.Server.Host.Security.WindowsSystemIdentityFactory.GetUserAndDomainName (string input,
out string username,
out string domainName 
)
+
+staticprivate
+
+ +

Extract the username and domain name from a string in the format "username\\domainname"

+
Parameters
+ + + + +
inputThe input string
usernameThe output username
domainNameThe output domain name. May be null
+
+
+ +

Definition at line 28 of file WindowsSystemIdentityFactory.cs.

+
29  {
30  var splits = input.Split('\\');
31  username = splits.Length > 1 ? splits[1] : splits[0];
32  domainName = splits.Length > 1 ? splits[0] : null;
33  }
+
+
+

Member Data Documentation

+ +

◆ logger

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<WindowsSystemIdentityFactory> Tgstation.Server.Host.Security.WindowsSystemIdentityFactory.logger
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.png b/class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..66a0b3952ff3ebac3bd6c0ad173164efabfbeb42 GIT binary patch literal 1334 zcmeAS@N?(olHy`uVBq!ia0y~yV9W-x12~w0=dPp^M>GkJTUrN@f zW?tC*Kh9wKn*5(UYnI3FJ^t&Mmi_Tx8`uBttjyc|vvkhl=Ld>EpSS4y{J}Iw{?V>K zhhBBRvioeQwyNsi6@|9ududx7-y6>^|I1b8oNV2DNMhGh&r43`k@mGqlV){A88g4S z#wp^;cmK#>ycBiFo>~4*&C2^CsT&P}iR!VEWXtwy$lTz!li`Ly1 zS$tmfwO#GZd#`T9h?!iUov8hF(%02I|I}WemNB|!!hYcS7S-4PSibiMO}sp_x&2nf zw_R^FCgnbE-MIeOgz0O1IVPE0E`RpgGW&SJB)t|aXRnzTc)TE>-FvgdJy}7ri-P)G>dkaI|{C^Bf80^-i@Cq!luNN|NXqjZ{ z&>^=%*vz2;$eJ?A#GwaB(-hZfz7F#8oEmiMxGSRvV@4$A3t8N z@juqjkY@FaF=zF8{n|E;ee?Kw^%>mGs?F@N+m+^gH^n$*`sMBAj}?wfB>)ql+#By} z+iRw+VZ1!e?6T*** z_6hm=XQktrbEUl}*|OYk#AY(yGJV%LtNd@%_n*EZmlyOdTx^(Fdn8r5_1c++U8c@I zbSK?<8o@tp@%bZ%Trb3C%73|;x&2hzCH4zCWqo_kJ1j}IWwBkjG2w2G)Y3%0*;^Zo zR_%YB?mENw;?ExU@>93w%)VM5+b63&v%fBP`~0}-gR;6@7HcDCF94-S^RF& zyYMx>d$vbzUy|;d#gKc6_3YQQ8?$z&>^U+`>I1Tz)~MvdHCS z+;&>a=YBf_PNB7)o1PzWX8+OnYubZ)LF?hQAxvX + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Server Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_server.html b/class_tgstation_1_1_server_1_1_host_1_1_server.html new file mode 100644 index 0000000000..41af373dd6 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_server.html @@ -0,0 +1,805 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Server Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Server Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Server:
+
+
+ + +Tgstation.Server.Host.IServer +Tgstation.Server.Host.Core.IServerControl + +
+ + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 Server (IWebHostBuilder webHostBuilder, string updatePath)
 Construct a Server More...
 
async Task RunAsync (CancellationToken cancellationToken)
 Runs the IServer More...
 
bool ApplyUpdate (Version version, Uri updateZipUrl, IIOManager ioManager)
 Run a new Host assembly and stop the current one. This will likely trigger all active CancellationTokens More...
 
IRestartRegistration RegisterForRestart (IRestartHandler handler)
 Register a given handler to run before stopping the server for a restart More...
 
Task Restart ()
 Restarts the Host More...
 
Task Die (Exception exception)
 Kill the server with a fatal exception More...
 
+ + + +

+Public Attributes

bool WatchdogPresent => updatePath != null
 
+ + + + + + + + + + + +

+Properties

bool RestartRequested [get, private set]
 
- Properties inherited from Tgstation.Server.Host.IServer
bool RestartRequested [get]
 If the IServer should restart More...
 
- Properties inherited from Tgstation.Server.Host.Core.IServerControl
bool WatchdogPresent [get]
 true if live updates are supported, false. ApplyUpdate(Version, Uri, IIOManager) and Restart will fail if this is false More...
 
+ + + + + + + + + + +

+Private Member Functions

void CheckSanity (bool checkWatchdog)
 Throws an InvalidOperationException if the IServerControl cannot be used More...
 
void CheckExceptionPropagation ()
 Re-throw propagatedException if it exists More...
 
async Task Restart (Version newVersion, Exception exception)
 Implements Restart() More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

readonly IWebHostBuilder webHostBuilder
 The IWebHostBuilder for the Server More...
 
readonly List< IRestartHandlerrestartHandlers
 The IRestartHandlers to run when the Server restarts More...
 
readonly string updatePath
 The absolute path to install updates to More...
 
ILogger< Serverlogger
 The ILogger for the Server More...
 
GeneralConfiguration generalConfiguration
 The GeneralConfiguration for the Server More...
 
CancellationTokenSource cancellationTokenSource
 The cancellationTokenSource for the Server More...
 
Exception propagatedException
 The Exception to propagate when the server terminates More...
 
bool updating
 If a server update has been or is being applied More...
 
+

Detailed Description

+
+

Definition at line 19 of file Server.cs.

+

Constructor & Destructor Documentation

+ +

◆ Server()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Server.Server (IWebHostBuilder webHostBuilder,
string updatePath 
)
+
+ +

Construct a Server

+
Parameters
+ + + +
webHostBuilderThe value of webHostBuilder
updatePathThe value of updatePath
+
+
+ +

Definition at line 73 of file Server.cs.

+
74  {
75  this.webHostBuilder = webHostBuilder ?? throw new ArgumentNullException(nameof(webHostBuilder));
76  this.updatePath = updatePath;
77 
78  webHostBuilder.ConfigureServices(serviceCollection => serviceCollection.AddSingleton<IServerControl>(this));
79 
80  restartHandlers = new List<IRestartHandler>();
81  }
readonly List< IRestartHandler > restartHandlers
The IRestartHandlers to run when the Server restarts
Definition: Server.cs:36
+
readonly string updatePath
The absolute path to install updates to
Definition: Server.cs:41
+
readonly IWebHostBuilder webHostBuilder
The IWebHostBuilder for the Server
Definition: Server.cs:31
+
Represents a service that may take an updated Host assembly and run it, stopping the current assembly...
+
+

References Tgstation.Server.Host.Server.restartHandlers, Tgstation.Server.Host.Server.updatePath, and Tgstation.Server.Host.Server.webHostBuilder.

+ +
+
+

Member Function Documentation

+ +

◆ ApplyUpdate()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool Tgstation.Server.Host.Server.ApplyUpdate (Version version,
Uri updateZipUrl,
IIOManager ioManager 
)
+
+ +

Run a new Host assembly and stop the current one. This will likely trigger all active CancellationTokens

+ +

Implements Tgstation.Server.Host.Core.IServerControl.

+ +

Definition at line 140 of file Server.cs.

+
141  {
142  if (version == null)
143  throw new ArgumentNullException(nameof(version));
144  if (updateZipUrl == null)
145  throw new ArgumentNullException(nameof(updateZipUrl));
146  if (ioManager == null)
147  throw new ArgumentNullException(nameof(ioManager));
148 
149  CheckSanity(true);
150 
151  logger.LogTrace("Begin ApplyUpdate...");
152 
153  lock (this)
154  {
155  if (updating || RestartRequested)
156  {
157  logger.LogTrace("Aborted due to concurrency conflict!");
158  return false;
159  }
160 
161  updating = true;
162  }
163 
164  async void RunUpdate()
165  {
166  try
167  {
168  logger.LogInformation("Updating server to version {0} ({1})...", version, updateZipUrl);
169 
170  if (cancellationTokenSource == null)
171  throw new InvalidOperationException("Tried to update a non-running Server!");
172  var cancellationToken = cancellationTokenSource.Token;
173 
174  logger.LogTrace("Downloading zip package...");
175  var updateZipData = await ioManager.DownloadFile(updateZipUrl, cancellationToken).ConfigureAwait(false);
176 
177  try
178  {
179  logger.LogTrace("Exctracting zip package to {0}...", updatePath);
180  await ioManager.ZipToDirectory(updatePath, updateZipData, cancellationToken).ConfigureAwait(false);
181  }
182  catch (Exception e)
183  {
184  updating = false;
185  try
186  {
187  // important to not leave this directory around if possible
188  await ioManager.DeleteDirectory(updatePath, default).ConfigureAwait(false);
189  }
190  catch (Exception e2)
191  {
192  throw new AggregateException(e, e2);
193  }
194 
195  throw;
196  }
197 
198  await Restart(version, null).ConfigureAwait(false);
199  }
200  catch (OperationCanceledException)
201  {
202  logger.LogInformation("Server update cancelled!");
203  }
204  catch (Exception e)
205  {
206  logger.LogError("Error updating server! Exception: {0}", e);
207  }
208  finally
209  {
210  updating = false;
211  }
212  }
213 
214  RunUpdate();
215  return true;
216  }
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory
+
ILogger< Server > logger
The ILogger for the Server
Definition: Server.cs:46
+
Task< byte[]> DownloadFile(Uri url, CancellationToken cancellationToken)
Downloads a file from url
+
Task ZipToDirectory(string path, byte[] zipFileBytes, CancellationToken cancellationToken)
Extract a set of zipFileBytes to a given path
+ +
readonly string updatePath
The absolute path to install updates to
Definition: Server.cs:41
+
CancellationTokenSource cancellationTokenSource
The cancellationTokenSource for the Server
Definition: Server.cs:56
+
Task Restart()
Restarts the Host
+
bool updating
If a server update has been or is being applied
Definition: Server.cs:66
+
void CheckSanity(bool checkWatchdog)
Throws an InvalidOperationException if the IServerControl cannot be used
Definition: Server.cs:87
+
+

References Tgstation.Server.Host.Server.cancellationTokenSource, Tgstation.Server.Host.Server.CheckSanity(), Tgstation.Server.Host.IO.IIOManager.DeleteDirectory(), Tgstation.Server.Host.IO.IIOManager.DownloadFile(), Tgstation.Server.Host.Server.logger, Tgstation.Server.Host.Server.Restart(), Tgstation.Server.Host.Server.RestartRequested, Tgstation.Server.Host.Server.updatePath, Tgstation.Server.Host.Server.updating, and Tgstation.Server.Host.IO.IIOManager.ZipToDirectory().

+ +
+
+ +

◆ CheckExceptionPropagation()

+ +
+
+ + + + + +
+ + + + + + + +
void Tgstation.Server.Host.Server.CheckExceptionPropagation ()
+
+private
+
+ +

Re-throw propagatedException if it exists

+ +

Definition at line 99 of file Server.cs.

+
100  {
101  if (propagatedException != null)
102  throw propagatedException;
103  }
Exception propagatedException
The Exception to propagate when the server terminates
Definition: Server.cs:61
+
+

References Tgstation.Server.Host.Server.propagatedException.

+ +

Referenced by Tgstation.Server.Host.Server.RunAsync().

+ +
+
+ +

◆ CheckSanity()

+ +
+
+ + + + + +
+ + + + + + + + +
void Tgstation.Server.Host.Server.CheckSanity (bool checkWatchdog)
+
+private
+
+ +

Throws an InvalidOperationException if the IServerControl cannot be used

+
Parameters
+ + +
checkWatchdogIf WatchdogPresent should be checked
+
+
+ +

Definition at line 87 of file Server.cs.

+
88  {
89  if (checkWatchdog && !WatchdogPresent && propagatedException == null)
90  throw new InvalidOperationException("Server restarts are not supported");
91 
92  if (cancellationTokenSource == null || logger == null)
93  throw new InvalidOperationException("Tried to control a non-running Server!");
94  }
ILogger< Server > logger
The ILogger for the Server
Definition: Server.cs:46
+ +
CancellationTokenSource cancellationTokenSource
The cancellationTokenSource for the Server
Definition: Server.cs:56
+
Exception propagatedException
The Exception to propagate when the server terminates
Definition: Server.cs:61
+
+

References Tgstation.Server.Host.Server.cancellationTokenSource, Tgstation.Server.Host.Server.logger, Tgstation.Server.Host.Server.propagatedException, and Tgstation.Server.Host.Server.WatchdogPresent.

+ +

Referenced by Tgstation.Server.Host.Server.ApplyUpdate(), Tgstation.Server.Host.Server.RegisterForRestart(), and Tgstation.Server.Host.Server.Restart().

+ +
+
+ +

◆ Die()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Server.Die (Exception exception)
+
+ +

Kill the server with a fatal exception

+ +

Implements Tgstation.Server.Host.Core.IServerControl.

+ +
+
+ +

◆ RegisterForRestart()

+ +
+
+ + + + + + + + +
IRestartRegistration Tgstation.Server.Host.Server.RegisterForRestart (IRestartHandler handler)
+
+ +

Register a given handler to run before stopping the server for a restart

+ +

Implements Tgstation.Server.Host.Core.IServerControl.

+ +

Definition at line 219 of file Server.cs.

+
220  {
221  if (handler == null)
222  throw new ArgumentNullException(nameof(handler));
223 
224  CheckSanity(false);
225 
226  lock (this)
227  if (!RestartRequested)
228  {
229  logger.LogTrace("Registering restart handler {0}...", handler);
230  restartHandlers.Add(handler);
231  return new RestartRegistration(() =>
232  {
233  lock (this)
234  if (!RestartRequested)
235  restartHandlers.Remove(handler);
236  });
237  }
238 
239  return new RestartRegistration(() => { });
240  }
ILogger< Server > logger
The ILogger for the Server
Definition: Server.cs:46
+
readonly List< IRestartHandler > restartHandlers
The IRestartHandlers to run when the Server restarts
Definition: Server.cs:36
+ + +
void CheckSanity(bool checkWatchdog)
Throws an InvalidOperationException if the IServerControl cannot be used
Definition: Server.cs:87
+
+

References Tgstation.Server.Host.Server.CheckSanity(), Tgstation.Server.Host.Server.logger, Tgstation.Server.Host.Server.restartHandlers, and Tgstation.Server.Host.Server.RestartRequested.

+ +
+
+ +

◆ Restart() [1/2]

+ +
+
+ + + + + + + +
Task Tgstation.Server.Host.Server.Restart ()
+
+
+ +

◆ Restart() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Server.Restart (Version newVersion,
Exception exception 
)
+
+private
+
+ +

Implements Restart()

+
Parameters
+ + + +
newVersionThe Version of any potential updates being applied
exceptionThe potential value of propagatedException
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 251 of file Server.cs.

+
252  {
253  CheckSanity(true);
254 
255  logger.LogTrace("Begin Restart...");
256 
257  lock (this)
258  {
259  if ((updating && newVersion == null) || RestartRequested)
260  {
261  logger.LogTrace("Aborted due to concurrency conflict!");
262  return;
263  }
264 
265  RestartRequested = true;
266  propagatedException = exception;
267  }
268 
269  if (exception == null)
270  using (var cts = new CancellationTokenSource())
271  {
272  logger.LogInformation("Restarting server...");
273  var cancellationToken = cts.Token;
274  var eventsTask = Task.WhenAll(restartHandlers.Select(x => x.HandleRestart(newVersion, cancellationToken)).ToList());
275 
276  var expiryTask = Task.Delay(TimeSpan.FromMilliseconds(generalConfiguration.RestartTimeout));
277  await Task.WhenAny(eventsTask, expiryTask).ConfigureAwait(false);
278  logger.LogTrace("Joining restart handlers...");
279  cts.Cancel();
280  try
281  {
282  await eventsTask.ConfigureAwait(false);
283  }
284  catch (OperationCanceledException) { }
285  catch (Exception e)
286  {
287  logger.LogError("Restart handlers error! Exception: {0}", e);
288  }
289  }
290 
291  logger.LogTrace("Stopping host...");
292  cancellationTokenSource.Cancel();
293  }
ILogger< Server > logger
The ILogger for the Server
Definition: Server.cs:46
+
readonly List< IRestartHandler > restartHandlers
The IRestartHandlers to run when the Server restarts
Definition: Server.cs:36
+
GeneralConfiguration generalConfiguration
The GeneralConfiguration for the Server
Definition: Server.cs:51
+ +
int RestartTimeout
The timeout milliseconds for restarting the server
+
CancellationTokenSource cancellationTokenSource
The cancellationTokenSource for the Server
Definition: Server.cs:56
+
bool updating
If a server update has been or is being applied
Definition: Server.cs:66
+
Exception propagatedException
The Exception to propagate when the server terminates
Definition: Server.cs:61
+
void CheckSanity(bool checkWatchdog)
Throws an InvalidOperationException if the IServerControl cannot be used
Definition: Server.cs:87
+
+

References Tgstation.Server.Host.Server.cancellationTokenSource, Tgstation.Server.Host.Server.CheckSanity(), Tgstation.Server.Host.Server.generalConfiguration, Tgstation.Server.Host.Server.logger, Tgstation.Server.Host.Server.propagatedException, Tgstation.Server.Host.Server.restartHandlers, Tgstation.Server.Host.Server.RestartRequested, Tgstation.Server.Host.Configuration.GeneralConfiguration.RestartTimeout, and Tgstation.Server.Host.Server.updating.

+ +
+
+ +

◆ RunAsync()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Host.Server.RunAsync (CancellationToken cancellationToken)
+
+ +

Runs the IServer

+ +

Implements Tgstation.Server.Host.IServer.

+ +

Definition at line 106 of file Server.cs.

+
107  {
108  using (cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken))
109  using (var fsWatcher = updatePath != null ? new FileSystemWatcher(Path.GetDirectoryName(updatePath)) : null)
110  {
111  if (fsWatcher != null)
112  {
113  fsWatcher.Created += (a, b) =>
114  {
115  if (b.FullPath == updatePath && File.Exists(b.FullPath))
116  cancellationTokenSource.Cancel();
117  };
118  fsWatcher.EnableRaisingEvents = true;
119  }
120 
121  using (var webHost = webHostBuilder.Build())
122  try
123  {
124  logger = webHost.Services.GetRequiredService<ILogger<Server>>();
125  var generalConfigurationOptions = webHost.Services.GetRequiredService<IOptions<GeneralConfiguration>>();
126  generalConfiguration = generalConfigurationOptions.Value;
127  await webHost.RunAsync(cancellationTokenSource.Token).ConfigureAwait(false);
128  }
129  catch (OperationCanceledException)
130  {
132  throw;
133  }
134  }
135 
137  }
ILogger< Server > logger
The ILogger for the Server
Definition: Server.cs:46
+
GeneralConfiguration generalConfiguration
The GeneralConfiguration for the Server
Definition: Server.cs:51
+
void CheckExceptionPropagation()
Re-throw propagatedException if it exists
Definition: Server.cs:99
+
readonly string updatePath
The absolute path to install updates to
Definition: Server.cs:41
+
CancellationTokenSource cancellationTokenSource
The cancellationTokenSource for the Server
Definition: Server.cs:56
+
readonly IWebHostBuilder webHostBuilder
The IWebHostBuilder for the Server
Definition: Server.cs:31
+
+

References Tgstation.Server.Host.Server.cancellationTokenSource, Tgstation.Server.Host.Server.CheckExceptionPropagation(), Tgstation.Server.Host.Server.generalConfiguration, Tgstation.Server.Host.Server.logger, Tgstation.Server.Host.Server.updatePath, and Tgstation.Server.Host.Server.webHostBuilder.

+ +
+
+

Member Data Documentation

+ +

◆ cancellationTokenSource

+ +
+
+ + + + + +
+ + + + +
CancellationTokenSource Tgstation.Server.Host.Server.cancellationTokenSource
+
+private
+
+
+ +

◆ generalConfiguration

+ +
+
+ + + + + +
+ + + + +
GeneralConfiguration Tgstation.Server.Host.Server.generalConfiguration
+
+private
+
+ +

The GeneralConfiguration for the Server

+ +

Definition at line 51 of file Server.cs.

+ +

Referenced by Tgstation.Server.Host.Server.Restart(), and Tgstation.Server.Host.Server.RunAsync().

+ +
+
+ +

◆ logger

+ +
+
+ + + + + +
+ + + + +
ILogger<Server> Tgstation.Server.Host.Server.logger
+
+private
+
+
+ +

◆ propagatedException

+ +
+
+ + + + + +
+ + + + +
Exception Tgstation.Server.Host.Server.propagatedException
+
+private
+
+ +

The Exception to propagate when the server terminates

+ +

Definition at line 61 of file Server.cs.

+ +

Referenced by Tgstation.Server.Host.Server.CheckExceptionPropagation(), Tgstation.Server.Host.Server.CheckSanity(), and Tgstation.Server.Host.Server.Restart().

+ +
+
+ +

◆ restartHandlers

+ +
+
+ + + + + +
+ + + + +
readonly List<IRestartHandler> Tgstation.Server.Host.Server.restartHandlers
+
+private
+
+ +

The IRestartHandlers to run when the Server restarts

+ +

Definition at line 36 of file Server.cs.

+ +

Referenced by Tgstation.Server.Host.Server.RegisterForRestart(), Tgstation.Server.Host.Server.Restart(), and Tgstation.Server.Host.Server.Server().

+ +
+
+ +

◆ updatePath

+ +
+
+ + + + + +
+ + + + +
readonly string Tgstation.Server.Host.Server.updatePath
+
+private
+
+ +

The absolute path to install updates to

+ +

Definition at line 41 of file Server.cs.

+ +

Referenced by Tgstation.Server.Host.Server.ApplyUpdate(), Tgstation.Server.Host.Server.RunAsync(), and Tgstation.Server.Host.Server.Server().

+ +
+
+ +

◆ updating

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Server.updating
+
+private
+
+ +

If a server update has been or is being applied

+ +

Definition at line 66 of file Server.cs.

+ +

Referenced by Tgstation.Server.Host.Server.ApplyUpdate(), and Tgstation.Server.Host.Server.Restart().

+ +
+
+ +

◆ WatchdogPresent

+ +
+
+ + + + +
bool Tgstation.Server.Host.Server.WatchdogPresent => updatePath != null
+
+ +

+ +

Definition at line 26 of file Server.cs.

+ +

Referenced by Tgstation.Server.Host.Server.CheckSanity().

+ +
+
+ +

◆ webHostBuilder

+ +
+
+ + + + + +
+ + + + +
readonly IWebHostBuilder Tgstation.Server.Host.Server.webHostBuilder
+
+private
+
+ +

The IWebHostBuilder for the Server

+ +

Definition at line 31 of file Server.cs.

+ +

Referenced by Tgstation.Server.Host.Server.RunAsync(), and Tgstation.Server.Host.Server.Server().

+ +
+
+

Property Documentation

+ +

◆ RestartRequested

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Server.RestartRequested
+
+getprivate set
+
+ +

+ +

Definition at line 23 of file Server.cs.

+
23 { get; private set; }
+

Referenced by Tgstation.Server.Host.Server.ApplyUpdate(), Tgstation.Server.Host.Server.RegisterForRestart(), and Tgstation.Server.Host.Server.Restart().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_server.png b/class_tgstation_1_1_server_1_1_host_1_1_server.png new file mode 100644 index 0000000000000000000000000000000000000000..a10aec421322d13e7219b35b6856109f0393e72c GIT binary patch literal 1134 zcmeAS@N?(olHy`uVBq!ia0y~yU}6EX12~w0WMItP93UkT;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|!2H+K#WAFU@$KB#lQtO$xbXWFF~1Lb zZ!a$1d+dB^4sVbqNuUN{bMR;FHaI}2Ku2`XDX8iM!?yo41TGl+7V^hvQ_fD{y zVznhMVsrZXL|dTxQl5jks_%qz!=rUh7@y_04i_wnYj`l#S!$7U^C3ajHEnsV>qFbS zt}Q&WF!q$m2Nx~RRj&k^q`hstuB186(+rt>|Dz>~qVuKI-}yxF-1Y}!%k)<5^{O6&GbaW^M`lsJ9(tvb!xam$bA%YN~4ypm44 zxp2uRr}b-cX25IB{Wh3LdH%|iEpM_9UZisM%gZta&-?4Q-)>a-s_2}6h{GnHs=IsIsV`adwJUqnAvojv+li}z>#w}#J=I`c94(+6NulexPf=w zJ+mEEw;#O9ZC<^dcby!E`*Q&sx&HR2<%|#9Dj6B9rYkbMh-qV3P%O#Ra4waD1c3)- zyoU`+v>9G=GCC|bVlg`;aD&4+L7Atq*MLP{%J7W5g4LmypW`iW|5Iz2^lXDog{}R3 z_62&*A7%>v{=mZ2FgNb;^JkUZj?QuoyLb+Ya?I0z@+G}WKVJX&H`D%o`{KhdYfcld zhe3pwmo2CS>M{IXeGhnF0#RB^V+w&HYEOzXcyur)4ctO;YupU zI!A$PYC7?LE_;G`92`Hs-1Yi=?otC+h%KcYi&P`U-*Gf8wOnI;^xBTe3!T(Cg10sm)2vYWSz5tEZ2Jb;6oHm0xs?pBj9A1K zW(aWXt;)M_S$pT!XEm4SwNKMN=_b#gds=prOYofY%mrR;4;Bg5A9QdoIN0&+825+& zCk0{*lQQ=)+}DAH6Fkryla3hhIIm~g5&fT`L@t}h;pjDQVBx^v>FVdQ&MBb@0IOr= AS^xk5 literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_server_factory-members.html b/class_tgstation_1_1_server_1_1_host_1_1_server_factory-members.html new file mode 100644 index 0000000000..bb67cc4fce --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_server_factory-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.ServerFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.ServerFactory, including all inherited members.

+ + +
CreateServer(string[] args, string updatePath)Tgstation.Server.Host.ServerFactory
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_server_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_server_factory.html new file mode 100644 index 0000000000..dc15f50839 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_server_factory.html @@ -0,0 +1,149 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.ServerFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.ServerFactory Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.ServerFactory:
+
+
+ + +Tgstation.Server.Host.IServerFactory + +
+ + + + + +

+Public Member Functions

IServer CreateServer (string[] args, string updatePath)
 Create a IServer More...
 
+

Detailed Description

+
+

Definition at line 12 of file ServerFactory.cs.

+

Member Function Documentation

+ +

◆ CreateServer()

+ +
+
+ + + + + + + + + + + + + + + + + + +
IServer Tgstation.Server.Host.ServerFactory.CreateServer (string [] args,
string updatePath 
)
+
+ +

Create a IServer

+ +

Implements Tgstation.Server.Host.IServerFactory.

+ +

Definition at line 15 of file ServerFactory.cs.

+
16  {
17  var webHost = WebHost.CreateDefaultBuilder(args ?? throw new ArgumentNullException(nameof(args)))
18  .ConfigureAppConfiguration((context, configurationBuilder) => configurationBuilder.SetBasePath(Directory.GetCurrentDirectory()))
19  .UseStartup<Application>()
20  .SuppressStatusMessages(true)
21  .UseShutdownTimeout(TimeSpan.FromMinutes(1));
22 
23  if(updatePath != null)
24  webHost.UseContentRoot(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
25 
26  return new Server(webHost, updatePath);
27  }
+ +
+

Referenced by Tgstation.Server.Host.Program.Main(), and Tgstation.Server.Tests.TestingServer.TestingServer().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_server_factory.png b/class_tgstation_1_1_server_1_1_host_1_1_server_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..a0b95ad61069cd618af782018ed7c6f97440e867 GIT binary patch literal 865 zcmeAS@N?(olHy`uVBq!ia0vp^4}ds;gBeJgTXrr3QW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;-BF*deQ%}boVT`R3j?{*B|#v0qyv?Qq3VRJao zD)tKbtTp#SrsSR~W)(lbu_gG*_7>^dYr%0vw&}}OoP4%G+uZf?o08xw zz2(dn9|9*XvAn{n!``9dyP_vxZi3vQNhT|KoL0N2W=ev?NjhLs+BNnM7JbQyjDLdv zGOSs1m9f4~Og%>S!{O~_4?i_jcQKt=%gbS~*-YWUnOhAE#@WnFXVwrB_~Y9uaOjj0 z!guN$T39orOZ{EzWhKJk_INHxu zVJ-<_z8Bw@Kkr=1()rn6|Jcs2x?i5OKW%zv^rwc8j$iEFEjRj{`0M+vhUK~}#eyfM z8+QEkC_KKP*z>q5d&Ewe@5!H|sl$-wB1pBgGGy=eXmgNl*b}2q_-J<`WBWdBhW~r#F`PceKEt=J zV5&(aAM+Uv@%qg!jA0kqSY|{@3nZk~+CNlm*|6>(gXwj>8z$G6KLzFo22WQ%mvv4F FO#q_tkthHF literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program-members.html b/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program-members.html new file mode 100644 index 0000000000..cf18880d15 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program-members.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Service.Program Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html b/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html new file mode 100644 index 0000000000..fd1f0e85cf --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html @@ -0,0 +1,401 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Service.Program Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Service.Program Class Reference
+
+
+ +

Contains the entrypoint for the application + More...

+ + + + + +

+Public Member Functions

async Task OnExecuteAsync ()
 Command line handler, always runs More...
 
+ + + + + + + + + + + + + + + + +

+Properties

bool Uninstall [get]
 The –uninstall or -u option More...
 
bool Install [get, set]
 The –install or -i option More...
 
bool Configure [get, set]
 The –configure or -c option More...
 
bool Trace [get, set]
 The –trace or -t option. Enables trace logs More...
 
bool Debug [get, set]
 The –debug or -d option. Enables debug logs More...
 
+ + + + + + + +

+Static Private Member Functions

static bool IsAdministrator ()
 Check if the running user is a system administrator More...
 
static Task< int > Main (string[] args)
 Entrypoint for the application More...
 
+ + + + +

+Static Private Attributes

static internal IWatchdogFactory WatchdogFactory = new WatchdogFactory()
 The IWatchdogFactory for the Program More...
 
+

Detailed Description

+

Contains the entrypoint for the application

+ +

Definition at line 21 of file Program.cs.

+

Member Function Documentation

+ +

◆ IsAdministrator()

+ +
+
+ + + + + +
+ + + + + + + +
static bool Tgstation.Server.Host.Service.Program.IsAdministrator ()
+
+staticprivate
+
+ +

Check if the running user is a system administrator

+
Returns
true if the running user is a system administrator, false otherwise
+ +

Definition at line 64 of file Program.cs.

+
65  {
66  var user = WindowsIdentity.GetCurrent();
67  var principal = new WindowsPrincipal(user);
68  return principal.IsInRole(WindowsBuiltInRole.Administrator);
69  }
+

Referenced by Tgstation.Server.Host.Service.Program.OnExecuteAsync().

+ +
+
+ +

◆ Main()

+ +
+
+ + + + + +
+ + + + + + + + +
static Task<int> Tgstation.Server.Host.Service.Program.Main (string [] args)
+
+staticprivate
+
+ +

Entrypoint for the application

+ +
+
+ +

◆ OnExecuteAsync()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Host.Service.Program.OnExecuteAsync ()
+
+ +

Command line handler, always runs

+
Returns
A Task representing the running operation
+ +

Definition at line 80 of file Program.cs.

+
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 (Configure)
114  await WatchdogFactory.CreateWatchdog(loggerFactory).RunAsync(true, Array.Empty<string>(), default).ConfigureAwait(false);
115 
116  if (Install)
117  {
118  if (Uninstall)
119  return; // oh no, it's retarded...
120  using (var processInstaller = new ServiceProcessInstaller())
121  using (var installer = new ServiceInstaller())
122  {
123  processInstaller.Account = ServiceAccount.LocalSystem;
124 
125  installer.Context = new InstallContext("tgs-4-install.log", new string[] { String.Format(CultureInfo.InvariantCulture, "/assemblypath={0}", Assembly.GetEntryAssembly().Location) });
126  installer.Description = "/tg/station 13 server v4 running as a windows service";
127  installer.DisplayName = "/tg/station server 4";
128  installer.DelayedAutoStart = true;
129  installer.StartType = ServiceStartMode.Automatic;
130  installer.ServicesDependedOn = new string[] { "Tcpip", "Dhcp", "Dnscache" };
131  installer.ServiceName = ServerService.Name;
132  installer.Parent = processInstaller;
133 
134  var state = new ListDictionary();
135  installer.Install(state);
136  }
137  }
138  else if (Uninstall)
139  using (var installer = new ServiceInstaller())
140  {
141  installer.Context = new InstallContext("tgs-4-uninstall.log", null);
142  installer.ServiceName = ServerService.Name;
143  installer.Uninstall(null);
144  }
145  else if (!Configure)
146  using (var service = new ServerService(WatchdogFactory, loggerFactory, Trace ? LogLevel.Trace : Debug ? LogLevel.Debug : LogLevel.Information))
147  ServiceBase.Run(service);
148  }
149  }
bool Uninstall
The –uninstall or -u option
Definition: Program.cs:34
+
static bool IsAdministrator()
Check if the running user is a system administrator
Definition: Program.cs:64
+
bool Debug
The –debug or -d option. Enables debug logs
Definition: Program.cs:58
+
bool Configure
The –configure or -c option
Definition: Program.cs:46
+ +
IWatchdog CreateWatchdog(ILoggerFactory loggerFactory)
Create a IWatchdog
+
Task RunAsync(bool runConfigure, string[] args, CancellationToken cancellationToken)
Run the IWatchdog
+
bool Install
The –install or -i option
Definition: Program.cs:40
+
bool Trace
The –trace or -t option. Enables trace logs
Definition: Program.cs:52
+ +
+

References Tgstation.Server.Host.Service.Program.Configure, Tgstation.Server.Host.Watchdog.WatchdogFactory.CreateWatchdog(), Tgstation.Server.Host.Service.Program.Debug, Tgstation.Server.Host.Service.Program.Install, Tgstation.Server.Host.Service.Program.IsAdministrator(), Tgstation.Server.Host.Service.ServerService.Name, Tgstation.Server.Host.Watchdog.IWatchdog.RunAsync(), Tgstation.Server.Host.Service.Program.Trace, and Tgstation.Server.Host.Service.Program.Uninstall.

+ +
+
+

Member Data Documentation

+ +

◆ WatchdogFactory

+ +
+
+ + + + + +
+ + + + +
internal IWatchdogFactory Tgstation.Server.Host.Service.Program.WatchdogFactory = new WatchdogFactory()
+
+staticprivate
+
+ +

The IWatchdogFactory for the Program

+ +

Definition at line 27 of file Program.cs.

+ +
+
+

Property Documentation

+ +

◆ Configure

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Service.Program.Configure
+
+getset
+
+ +

The –configure or -c option

+ +

Definition at line 46 of file Program.cs.

+
46 { get; set; }
+

Referenced by Tgstation.Server.Host.Service.Program.OnExecuteAsync().

+ +
+
+ +

◆ Debug

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Service.Program.Debug
+
+getset
+
+ +

The –debug or -d option. Enables debug logs

+ +

Definition at line 58 of file Program.cs.

+
58 { get; set; }
+

Referenced by Tgstation.Server.Host.Service.Program.OnExecuteAsync().

+ +
+
+ +

◆ Install

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Service.Program.Install
+
+getset
+
+ +

The –install or -i option

+ +

Definition at line 40 of file Program.cs.

+
40 { get; set; }
+

Referenced by Tgstation.Server.Host.Service.Program.OnExecuteAsync().

+ +
+
+ +

◆ Trace

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Service.Program.Trace
+
+getset
+
+ +

The –trace or -t option. Enables trace logs

+ +

Definition at line 52 of file Program.cs.

+
52 { get; set; }
+

Referenced by Tgstation.Server.Host.Service.Program.OnExecuteAsync().

+ +
+
+ +

◆ Uninstall

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Service.Program.Uninstall
+
+get
+
+ +

The –uninstall or -u option

+ +

Definition at line 34 of file Program.cs.

+
34 { get; }
+

Referenced by Tgstation.Server.Host.Service.Program.OnExecuteAsync().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service-members.html b/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service-members.html new file mode 100644 index 0000000000..9c1835d72d --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service-members.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Service.ServerService Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html b/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html new file mode 100644 index 0000000000..c572adf341 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html @@ -0,0 +1,464 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Service.ServerService Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Service.ServerService Class Reference
+
+
+ +

Represents a IWatchdog as a ServiceBase + More...

+
+Inheritance diagram for Tgstation.Server.Host.Service.ServerService:
+
+
+ + +ServiceBase + +
+ + + + + +

+Public Member Functions

 ServerService (IWatchdogFactory watchdogFactory, ILoggerFactory loggerFactory, LogLevel minumumLogLevel)
 Construct a ServerService More...
 
+ + + + +

+Public Attributes

const string Name = "tgstation-server-4"
 The canonical windows service name More...
 
+ + + + + + + +

+Protected Member Functions

override void Dispose (bool disposing)
 
override void OnStart (string[] args)
 
override void OnStop ()
 
+ + + + +

+Private Member Functions

async Task RunWatchdog (string[] args, CancellationToken cancellationToken)
 Executes the watchdog, stopping the service if it exits More...
 
+ + + + + + + + + + +

+Private Attributes

readonly IWatchdog watchdog
 The IWatchdog for the ServerService More...
 
Task watchdogTask
 The Task recieved from IWatchdog.RunAsync(bool, string[], CancellationToken) of watchdog More...
 
CancellationTokenSource cancellationTokenSource
 The cancellationTokenSource for the ServerService More...
 
+

Detailed Description

+

Represents a IWatchdog as a ServiceBase

+ +

Definition at line 16 of file ServerService.cs.

+

Constructor & Destructor Documentation

+ +

◆ ServerService()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Tgstation.Server.Host.Service.ServerService.ServerService (IWatchdogFactory watchdogFactory,
ILoggerFactory loggerFactory,
LogLevel minumumLogLevel 
)
+
+ +

Construct a ServerService

+
Parameters
+ + + + +
watchdogFactoryThe IWatchdogFactory to create watchdog with
loggerFactoryThe ILoggerFactory for watchdogFactory
minumumLogLevelThe minimum Microsoft.Extensions.Logging.LogLevel to record in the event log
+
+
+ +

Definition at line 44 of file ServerService.cs.

+
45  {
46  if (watchdogFactory == null)
47  throw new ArgumentNullException(nameof(watchdogFactory));
48  if (loggerFactory == null)
49  throw new ArgumentNullException(nameof(loggerFactory));
50 
51 #pragma warning disable CS0618 // Type or member is obsolete
52  loggerFactory.AddEventLog(new EventLogSettings
53  {
54  LogName = EventLog.Log,
55  MachineName = EventLog.MachineName,
56  SourceName = EventLog.Source,
57  Filter = (message, logLevel) => logLevel >= minumumLogLevel
58  });
59 #pragma warning restore CS0618 // Type or member is obsolete
60 
61  ServiceName = Name;
62  watchdog = watchdogFactory.CreateWatchdog(loggerFactory);
63  }
IWatchdog CreateWatchdog(ILoggerFactory loggerFactory)
Create a IWatchdog
+
readonly IWatchdog watchdog
The IWatchdog for the ServerService
+
const string Name
The canonical windows service name
+
+

References Tgstation.Server.Host.Watchdog.IWatchdogFactory.CreateWatchdog(), Tgstation.Server.Host.Service.ServerService.Name, and Tgstation.Server.Host.Service.ServerService.watchdog.

+ +
+
+

Member Function Documentation

+ +

◆ Dispose()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Service.ServerService.Dispose (bool disposing)
+
+protected
+
+ +

+ +

Definition at line 92 of file ServerService.cs.

+
93  {
94  cancellationTokenSource?.Dispose();
95  base.Dispose(disposing);
96  }
CancellationTokenSource cancellationTokenSource
The cancellationTokenSource for the ServerService
+
+

References Tgstation.Server.Host.Service.ServerService.cancellationTokenSource.

+ +

Referenced by Tgstation.Server.Host.Service.Tests.TestServerService.TestConstructionAndDisposal().

+ +
+
+ +

◆ OnStart()

+ +
+
+ + + + + +
+ + + + + + + + +
override void Tgstation.Server.Host.Service.ServerService.OnStart (string [] args)
+
+protected
+
+ +

+ +

Definition at line 99 of file ServerService.cs.

+
100  {
101  cancellationTokenSource?.Dispose();
102  cancellationTokenSource = new CancellationTokenSource();
104  }
async Task RunWatchdog(string[] args, CancellationToken cancellationToken)
Executes the watchdog, stopping the service if it exits
+
Task watchdogTask
The Task recieved from IWatchdog.RunAsync(bool, string[], CancellationToken) of watchdog
+
CancellationTokenSource cancellationTokenSource
The cancellationTokenSource for the ServerService
+
+

References Tgstation.Server.Host.Service.ServerService.cancellationTokenSource, Tgstation.Server.Host.Service.ServerService.RunWatchdog(), and Tgstation.Server.Host.Service.ServerService.watchdogTask.

+ +
+
+ +

◆ OnStop()

+ +
+
+ + + + + +
+ + + + + + + +
override void Tgstation.Server.Host.Service.ServerService.OnStop ()
+
+protected
+
+ +

+ +

Definition at line 107 of file ServerService.cs.

+
108  {
109  cancellationTokenSource.Cancel();
110  watchdogTask.GetAwaiter().GetResult();
111  }
Task watchdogTask
The Task recieved from IWatchdog.RunAsync(bool, string[], CancellationToken) of watchdog
+
CancellationTokenSource cancellationTokenSource
The cancellationTokenSource for the ServerService
+
+

References Tgstation.Server.Host.Service.ServerService.cancellationTokenSource, and Tgstation.Server.Host.Service.ServerService.watchdogTask.

+ +
+
+ +

◆ RunWatchdog()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Service.ServerService.RunWatchdog (string [] args,
CancellationToken cancellationToken 
)
+
+private
+
+ +

Executes the watchdog, stopping the service if it exits

+
Parameters
+ + + +
argsThe arguments for the watchdog
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Definition at line 71 of file ServerService.cs.

+
72  {
73  await watchdog.RunAsync(false, args, cancellationTokenSource.Token).ConfigureAwait(false);
74 
75  void StopServiceAsync()
76  {
77  try
78  {
79  Task.Run(Stop, cancellationToken);
80  }
81  catch (OperationCanceledException) { }
82  catch (Exception e)
83  {
84  EventLog.WriteEntry(String.Format(CultureInfo.InvariantCulture, "Error stopping service! Exception: {0}", e));
85  }
86  }
87 
88  StopServiceAsync();
89  }
Task RunAsync(bool runConfigure, string[] args, CancellationToken cancellationToken)
Run the IWatchdog
+
readonly IWatchdog watchdog
The IWatchdog for the ServerService
+
CancellationTokenSource cancellationTokenSource
The cancellationTokenSource for the ServerService
+
+

References Tgstation.Server.Host.Service.ServerService.cancellationTokenSource, Tgstation.Server.Host.Watchdog.IWatchdog.RunAsync(), and Tgstation.Server.Host.Service.ServerService.watchdog.

+ +

Referenced by Tgstation.Server.Host.Service.ServerService.OnStart().

+ +
+
+

Member Data Documentation

+ +

◆ cancellationTokenSource

+ +
+
+ + + + + +
+ + + + +
CancellationTokenSource Tgstation.Server.Host.Service.ServerService.cancellationTokenSource
+
+private
+
+
+ +

◆ Name

+ +
+
+ + + + +
const string Tgstation.Server.Host.Service.ServerService.Name = "tgstation-server-4"
+
+ +

The canonical windows service name

+ +

Definition at line 21 of file ServerService.cs.

+ +

Referenced by Tgstation.Server.Host.Service.Program.OnExecuteAsync(), and Tgstation.Server.Host.Service.ServerService.ServerService().

+ +
+
+ +

◆ watchdog

+ +
+
+ + + + + +
+ + + + +
readonly IWatchdog Tgstation.Server.Host.Service.ServerService.watchdog
+
+private
+
+
+ +

◆ watchdogTask

+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Service.ServerService.watchdogTask
+
+private
+
+ +

The Task recieved from IWatchdog.RunAsync(bool, string[], CancellationToken) of watchdog

+ +

Definition at line 31 of file ServerService.cs.

+ +

Referenced by Tgstation.Server.Host.Service.ServerService.OnStart(), and Tgstation.Server.Host.Service.ServerService.OnStop().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.png b/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.png new file mode 100644 index 0000000000000000000000000000000000000000..4f61c8d71061fcee361421de2ad48cf5de9e22c0 GIT binary patch literal 758 zcmeAS@N?(olHy`uVBq!ia0y~yVB`g|12~w0q{-?F%Yl?cfKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+15>M~i(^OyHt}(uWHhra(<5kEcE*(7ik|MW zyX2kyk9l3HF6HdC+$|m~BdP8AKjiwwi1S~_-`?=}cx#@0;zn0ZcSyKLL)znKX zbUL@)e;B^^$g^t`mTZ5uO6%6W-+re5*DhWy{q|Y@VnL(a)2bID^1f*=J-7I@*XyOB zTdJRP_CCI0X1H$Es_B2d%nFk;feO_wV^i2W-(&HVpfz6?Fhra_V*u3V0oJzi(h5`28|T(m z{+}9b{f|@OvK0G^^SA82|6IMJdE4DP7Weo~82D!Wjz9cy%CUy?Cw>&(mhCM)U#l>8 z=eG4r%m2-Lf9%P%@(&W*csOGxy6p|TJO6h}JrX$7MI!F1$GN3eUNW zHJ6v_EqW%oYtqh*tv?Pe_tv>~ + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Service.Tests.TestServerService Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_tests_1_1_test_server_service.html b/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_tests_1_1_test_server_service.html new file mode 100644 index 0000000000..81b1fe223f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_service_1_1_tests_1_1_test_server_service.html @@ -0,0 +1,144 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Service.Tests.TestServerService Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Service.Tests.TestServerService Class Reference
+
+
+ +

Tests for ServerService + More...

+ + + + + + +

+Public Member Functions

void TestConstructionAndDisposal ()
 
void TestRun ()
 
+

Detailed Description

+

Tests for ServerService

+ +

Definition at line 16 of file TestServerService.cs.

+

Member Function Documentation

+ +

◆ TestConstructionAndDisposal()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Service.Tests.TestServerService.TestConstructionAndDisposal ()
+
+ +

Definition at line 19 of file TestServerService.cs.

+
20  {
21  Assert.ThrowsException<ArgumentNullException>(() => new ServerService(null, null, default));
22  var mockWatchdogFactory = new Mock<IWatchdogFactory>();
23  Assert.ThrowsException<ArgumentNullException>(() => new ServerService(mockWatchdogFactory.Object, null, default));
24  var mockLoggerFactory = new LoggerFactory();
25  new ServerService(mockWatchdogFactory.Object, mockLoggerFactory, default).Dispose();
26  }
+

References Tgstation.Server.Host.Service.ServerService.Dispose().

+ +
+
+ +

◆ TestRun()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Service.Tests.TestServerService.TestRun ()
+
+ +

Definition at line 29 of file TestServerService.cs.

+
30  {
31  var type = typeof(ServerService);
32  var onStart = type.GetMethod("OnStart", BindingFlags.Instance | BindingFlags.NonPublic);
33  var onStop = type.GetMethod("OnStop", BindingFlags.Instance | BindingFlags.NonPublic);
34 
35  var mockWatchdog = new Mock<IWatchdog>();
36  var args = Array.Empty<string>();
37  CancellationToken cancellationToken;
38  mockWatchdog.Setup(x => x.RunAsync(false, args, It.IsAny<CancellationToken>())).Callback((bool x, string[] _, CancellationToken token) => cancellationToken = token).Returns(Task.CompletedTask).Verifiable();
39  var mockWatchdogFactory = new Mock<IWatchdogFactory>();
40  var mockLoggerFactory = new LoggerFactory();
41  mockWatchdogFactory.Setup(x => x.CreateWatchdog(mockLoggerFactory)).Returns(mockWatchdog.Object).Verifiable();
42 
43  using (var service = new ServerService(mockWatchdogFactory.Object, mockLoggerFactory, default))
44  {
45  onStart.Invoke(service, new object[] { args });
46 
47  Assert.IsFalse(cancellationToken.IsCancellationRequested);
48 
49  onStop.Invoke(service, Array.Empty<object>());
50  Assert.IsTrue(cancellationToken.IsCancellationRequested);
51  mockWatchdog.VerifyAll();
52  }
53 
54  mockWatchdogFactory.VerifyAll();
55  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_tests_1_1_test_server_factory-members.html b/class_tgstation_1_1_server_1_1_host_1_1_tests_1_1_test_server_factory-members.html new file mode 100644 index 0000000000..5664476f07 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_tests_1_1_test_server_factory-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Tests.TestServerFactory Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_tests_1_1_test_server_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_tests_1_1_test_server_factory.html new file mode 100644 index 0000000000..7e84194411 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_tests_1_1_test_server_factory.html @@ -0,0 +1,142 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Tests.TestServerFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Tests.TestServerFactory Class Reference
+
+
+ +

Tests for ServerFactory + More...

+ + + + + + +

+Public Member Functions

void TestWorksWithoutUpdatePath ()
 
void TestWorksWithUpdatePath ()
 
+

Detailed Description

+

Tests for ServerFactory

+ +

Definition at line 10 of file TestServerFactory.cs.

+

Member Function Documentation

+ +

◆ TestWorksWithoutUpdatePath()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Tests.TestServerFactory.TestWorksWithoutUpdatePath ()
+
+ +

Definition at line 13 of file TestServerFactory.cs.

+
14  {
15  var factory = new ServerFactory();
16 
17  Assert.ThrowsException<ArgumentNullException>(() => factory.CreateServer(null, null));
18  factory.CreateServer(Array.Empty<string>(), null);
19  }
+
+
+ +

◆ TestWorksWithUpdatePath()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Tests.TestServerFactory.TestWorksWithUpdatePath ()
+
+ +

Definition at line 22 of file TestServerFactory.cs.

+
23  {
24  var factory = new ServerFactory();
25  const string Path = "/test";
26 
27  Assert.ThrowsException<ArgumentNullException>(() => factory.CreateServer(null, null));
28  Assert.ThrowsException<ArgumentNullException>(() => factory.CreateServer(null, Path));
29  factory.CreateServer(Array.Empty<string>(), Path);
30  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog-members.html b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog-members.html new file mode 100644 index 0000000000..1369a574a0 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Watchdog.Tests.TestWatchdog Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Watchdog.Tests.TestWatchdog, including all inherited members.

+ + +
TestConstruction()Tgstation.Server.Host.Watchdog.Tests.TestWatchdog
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog.html b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog.html new file mode 100644 index 0000000000..6a0042ff5f --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog.html @@ -0,0 +1,117 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Watchdog.Tests.TestWatchdog Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Watchdog.Tests.TestWatchdog Class Reference
+
+
+ + + + +

+Public Member Functions

void TestConstruction ()
 
+

Detailed Description

+
+

Definition at line 11 of file TestWatchdog.cs.

+

Member Function Documentation

+ +

◆ TestConstruction()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Watchdog.Tests.TestWatchdog.TestConstruction ()
+
+ +

Definition at line 14 of file TestWatchdog.cs.

+
15  {
16  Assert.ThrowsException<ArgumentNullException>(() => new Watchdog(null));
17  var mockLogger = new LoggerFactory().CreateLogger<Watchdog>();
18  var wd = new Watchdog(mockLogger);
19  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog_factory-members.html b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog_factory-members.html new file mode 100644 index 0000000000..4f0d4b35e1 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog_factory-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Watchdog.Tests.TestWatchdogFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Watchdog.Tests.TestWatchdogFactory, including all inherited members.

+ + +
TestCreateWatchdog()Tgstation.Server.Host.Watchdog.Tests.TestWatchdogFactory
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog_factory.html new file mode 100644 index 0000000000..ae7bb9b6d2 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog_factory.html @@ -0,0 +1,121 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Watchdog.Tests.TestWatchdogFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Watchdog.Tests.TestWatchdogFactory Class Reference
+
+
+ +

Tests for WatchdogFactory + More...

+ + + + +

+Public Member Functions

void TestCreateWatchdog ()
 
+

Detailed Description

+

Tests for WatchdogFactory

+ +

Definition at line 10 of file TestWatchdogFactory.cs.

+

Member Function Documentation

+ +

◆ TestCreateWatchdog()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Watchdog.Tests.TestWatchdogFactory.TestCreateWatchdog ()
+
+ +

Definition at line 13 of file TestWatchdogFactory.cs.

+
14  {
15  var factory = new WatchdogFactory();
16  Assert.IsNotNull(factory.CreateWatchdog(new LoggerFactory()));
17  }
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog-members.html b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog-members.html new file mode 100644 index 0000000000..f3a65be9bc --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog-members.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Watchdog.Watchdog Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Watchdog.Watchdog, including all inherited members.

+ + + + + +
GetDotnetPath(bool isWindows)Tgstation.Server.Host.Watchdog.Watchdogprivate
loggerTgstation.Server.Host.Watchdog.Watchdogprivate
RunAsync(bool runConfigure, string[] args, CancellationToken cancellationToken)Tgstation.Server.Host.Watchdog.Watchdog
Watchdog(ILogger< Watchdog > logger)Tgstation.Server.Host.Watchdog.Watchdog
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html new file mode 100644 index 0000000000..4ecc211656 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html @@ -0,0 +1,266 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Watchdog.Watchdog Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Watchdog.Watchdog Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Watchdog.Watchdog:
+
+
+ + +Tgstation.Server.Host.Watchdog.IWatchdog + +
+ + + + + + + + +

+Public Member Functions

 Watchdog (ILogger< Watchdog > logger)
 Construct a Watchdog More...
 
async Task RunAsync (bool runConfigure, string[] args, CancellationToken cancellationToken)
 Run the IWatchdog More...
 
+ + + +

+Private Member Functions

string GetDotnetPath (bool isWindows)
 
+ + + + +

+Private Attributes

readonly ILogger< Watchdoglogger
 The ILogger for the Watchdog More...
 
+

Detailed Description

+
+

Definition at line 16 of file Watchdog.cs.

+

Constructor & Destructor Documentation

+ +

◆ Watchdog()

+ +
+
+ + + + + + + + +
Tgstation.Server.Host.Watchdog.Watchdog.Watchdog (ILogger< Watchdoglogger)
+
+ +

Construct a Watchdog

+
Parameters
+ + +
loggerThe value of logger
+
+
+ +

Definition at line 27 of file Watchdog.cs.

+
28  {
29  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
30  }
readonly ILogger< Watchdog > logger
The ILogger for the Watchdog
Definition: Watchdog.cs:21
+
+

References Tgstation.Server.Host.Watchdog.Watchdog.logger.

+ +
+
+

Member Function Documentation

+ +

◆ GetDotnetPath()

+ +
+
+ + + + + +
+ + + + + + + + +
string Tgstation.Server.Host.Watchdog.Watchdog.GetDotnetPath (bool isWindows)
+
+private
+
+ +

Definition at line 32 of file Watchdog.cs.

+
33  {
34  var enviromentPath = Environment.GetEnvironmentVariable("PATH");
35  var paths = enviromentPath.Split(';');
36 
37  var exeName = "dotnet";
38  IEnumerable<string> enumerator;
39  if (isWindows)
40  {
41  exeName += ".exe";
42  enumerator = paths;
43  }
44  else
45  enumerator = paths.Select(x => x.Split(':')).SelectMany(x => x);
46 
47  enumerator = enumerator.Select(x => Path.Combine(x, exeName));
48 
49  return enumerator
50  .Where(x =>
51  {
52  logger.LogTrace("Checking for dotnet at {0}", x);
53  return File.Exists(x);
54  })
55  .FirstOrDefault();
56  }
readonly ILogger< Watchdog > logger
The ILogger for the Watchdog
Definition: Watchdog.cs:21
+
+

References Tgstation.Server.Host.Watchdog.Watchdog.logger.

+ +

Referenced by Tgstation.Server.Host.Watchdog.Watchdog.RunAsync().

+ +
+
+ +

◆ RunAsync()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
async Task Tgstation.Server.Host.Watchdog.Watchdog.RunAsync (bool runConfigure,
string [] args,
CancellationToken cancellationToken 
)
+
+ +

Run the IWatchdog

+ +

Implements Tgstation.Server.Host.Watchdog.IWatchdog.

+ +

Definition at line 60 of file Watchdog.cs.

+
61  {
62  logger.LogInformation("Host watchdog starting...");
63  logger.LogDebug("PID: {0}", Process.GetCurrentProcess().Id);
64  string updateDirectory = null;
65  try
66  {
67  var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
68  var dotnetPath = GetDotnetPath(isWindows);
69  if (dotnetPath == default)
70  {
71  logger.LogCritical("Unable to locate dotnet executable in PATH! Please ensure the .NET Core runtime is installed and is in your PATH!");
72  return;
73  }
74 
75  logger.LogInformation("Detected dotnet executable at {0}", dotnetPath);
76 
77  var rootLocation = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
78 
79  var assemblyStoragePath = Path.Combine(rootLocation, "lib"); // always always next to watchdog
80 #if DEBUG
81  Directory.CreateDirectory(assemblyStoragePath);
82 #endif
83  var defaultAssemblyPath = Path.GetFullPath(Path.Combine(assemblyStoragePath, "Default"));
84 #if DEBUG
85  // just copy the shit where it belongs
86  Directory.Delete(assemblyStoragePath, true);
87  Directory.CreateDirectory(defaultAssemblyPath);
88 
89  var sourcePath = "../../../Tgstation.Server.Host/bin/Debug/netcoreapp2.1";
90  foreach (string dirPath in Directory.GetDirectories(sourcePath, "*", SearchOption.AllDirectories))
91  Directory.CreateDirectory(dirPath.Replace(sourcePath, defaultAssemblyPath));
92 
93  foreach (string newPath in Directory.GetFiles(sourcePath, "*.*", SearchOption.AllDirectories))
94  File.Copy(newPath, newPath.Replace(sourcePath, defaultAssemblyPath), true);
95 
96  const string AppSettingsJson = "appsettings.json";
97  var rootJson = Path.Combine(rootLocation, AppSettingsJson);
98  File.Delete(rootJson);
99  File.Move(Path.Combine(defaultAssemblyPath, AppSettingsJson), rootJson);
100 #endif
101 
102  var assemblyName = String.Join(".", nameof(Tgstation), nameof(Server), nameof(Host), "dll");
103  var assemblyPath = Path.Combine(defaultAssemblyPath, assemblyName);
104 
105  if (assemblyPath.Contains("\""))
106  {
107  logger.LogCritical("Running from paths with \"'s in the name is not supported!");
108  return;
109  }
110 
111  if (!File.Exists(assemblyPath))
112  {
113  logger.LogCritical("Unable to locate host assembly!");
114  return;
115  }
116 
117  while (!cancellationToken.IsCancellationRequested)
118  using (logger.BeginScope("Host invocation"))
119  {
120  updateDirectory = Path.GetFullPath(Path.Combine(assemblyStoragePath, Guid.NewGuid().ToString()));
121  logger.LogInformation("Update path set to {0}", updateDirectory);
122  using (var process = new Process())
123  {
124  process.StartInfo.FileName = dotnetPath;
125  process.StartInfo.WorkingDirectory = rootLocation; // for appsettings
126 
127  var arguments = new List<string>
128  {
129  '"' + assemblyPath + '"',
130  '"' + updateDirectory + '"'
131  };
132 
133  if (Environment.GetCommandLineArgs().Any(x => x.Equals("--attach-host-debugger", StringComparison.OrdinalIgnoreCase)))
134  arguments.Add("--attach-debugger");
135 
136  if (runConfigure)
137  {
138  logger.LogInformation("Running configuration check and wizard if necessary...");
139  arguments.Add("General:SetupWizardMode=Only");
140  }
141 
142  arguments.AddRange(args);
143 
144  process.StartInfo.Arguments = String.Join(" ", arguments);
145 
146  process.StartInfo.UseShellExecute = false; // runs in the same console
147 
148  var tcs = new TaskCompletionSource<object>();
149  process.Exited += (a, b) =>
150  {
151  tcs.TrySetResult(null);
152  };
153  process.EnableRaisingEvents = true;
154 
155  logger.LogInformation("Launching host...");
156 
157  var killedHostProcess = false;
158  try
159  {
160  process.Start();
161 
162  using (var processCts = new CancellationTokenSource())
163  using (processCts.Token.Register(() => tcs.TrySetResult(null)))
164  using (cancellationToken.Register(() =>
165  {
166  if (!Directory.Exists(updateDirectory))
167  {
168  logger.LogInformation("Cancellation requested! Writing shutdown lock file...");
169  File.WriteAllBytes(updateDirectory, Array.Empty<byte>());
170  }
171  else
172  logger.LogWarning("Cancellation requested while update directory exists!");
173 
174  logger.LogInformation("Will force close host process if it doesn't exit in 10 seconds...");
175 
176  try
177  {
178  processCts.CancelAfter(TimeSpan.FromSeconds(10));
179  }
180  catch (ObjectDisposedException) { } // race conditions
181  }))
182  await tcs.Task.ConfigureAwait(false);
183  }
184  catch (InvalidOperationException) { }
185  finally
186  {
187  try
188  {
189  if (!process.HasExited)
190  {
191  killedHostProcess = true;
192  process.Kill();
193  process.WaitForExit();
194  }
195  }
196  catch (InvalidOperationException) { }
197  logger.LogInformation("Host exited!");
198  }
199 
200  if (runConfigure)
201  {
202  logger.LogInformation("Exiting due to configuration check...");
203  return;
204  }
205 
206  switch (process.ExitCode)
207  {
208  case 0:
209  return;
210  case 1:
211  if (!cancellationToken.IsCancellationRequested)
212  logger.LogInformation("Watchdog will restart host..."); // just a restart
213  else
214  logger.LogWarning("Host requested restart but watchdog shutdown is in progress!");
215  break;
216  case 2:
217  // update path is now an exception document
218  logger.LogCritical("Host crashed, propagating exception dump...");
219  var data = File.ReadAllText(updateDirectory);
220  try
221  {
222  File.Delete(updateDirectory);
223  }
224  catch (Exception e)
225  {
226  logger.LogWarning("Unable to delete exception dump file at {0}! Exception: {1}", updateDirectory, e);
227  }
228 
229 #pragma warning disable CA2201 // Do not raise reserved exception types
230  throw new Exception(String.Format(CultureInfo.InvariantCulture, "Host propagated exception: {0}", data));
231 #pragma warning restore CA2201 // Do not raise reserved exception types
232  default:
233  if (killedHostProcess)
234  {
235  logger.LogWarning("Watchdog forced to kill host process!");
236  cancellationToken.ThrowIfCancellationRequested();
237  }
238 
239 #pragma warning disable CA2201 // Do not raise reserved exception types
240  throw new Exception(String.Format(CultureInfo.InvariantCulture, "Host crashed with exit code {0}!", process.ExitCode));
241 #pragma warning restore CA2201 // Do not raise reserved exception types
242  }
243  }
244 
245  // HEY YOU
246  // BE WARNED THAT IF YOU DEBUGGED THE HOST PROCESS THAT JUST LAUNCHED THE DEBUGGER WILL HOLD A LOCK ON THE DIRECTORY
247  // THIS MEANS THE FIRST DIRECTORY.MOVE WILL THROW
248  if (Directory.Exists(updateDirectory))
249  {
250  logger.LogInformation("Applying server update...");
251  if (isWindows)
252  {
253  // windows dick sucking resource unlocking
254  GC.Collect(Int32.MaxValue, GCCollectionMode.Default, true);
255  await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken).ConfigureAwait(false);
256  }
257 
258  var tempPath = Path.Combine(assemblyStoragePath, Guid.NewGuid().ToString());
259  try
260  {
261  Directory.Move(defaultAssemblyPath, tempPath);
262  try
263  {
264  Directory.Move(updateDirectory, defaultAssemblyPath);
265  logger.LogInformation("Server update complete, deleting old server...");
266  try
267  {
268  Directory.Delete(tempPath, true);
269  }
270  catch (Exception e)
271  {
272  logger.LogWarning("Error deleting old server at {0}! Exception: {1}", tempPath, e);
273  }
274  }
275  catch (Exception e)
276  {
277  logger.LogError("Error moving updated server directory, attempting revert! Exception: {0}", e);
278  Directory.Delete(defaultAssemblyPath, true);
279  Directory.Move(tempPath, defaultAssemblyPath);
280  logger.LogInformation("Revert successful!");
281  }
282  }
283  catch (Exception e)
284  {
285  logger.LogWarning("Failed to move out active host assembly! Exception: {0}", e);
286  }
287  }
288  }
289  }
290  catch (OperationCanceledException)
291  {
292  logger.LogDebug("Exiting due to cancellation...");
293  if (!Directory.Exists(updateDirectory))
294  File.Delete(updateDirectory);
295  else
296  Directory.Delete(updateDirectory, true);
297  }
298  catch (Exception e)
299  {
300  logger.LogCritical("Watchdog error! Exception: {0}", e);
301  }
302  finally
303  {
304  logger.LogInformation("Host watchdog exiting...");
305  }
306  }
readonly ILogger< Watchdog > logger
The ILogger for the Watchdog
Definition: Watchdog.cs:21
+
string GetDotnetPath(bool isWindows)
Definition: Watchdog.cs:32
+ +
+

References Tgstation.Server.Host.Watchdog.Watchdog.GetDotnetPath(), and Tgstation.Server.Host.Watchdog.Watchdog.logger.

+ +
+
+

Member Data Documentation

+ +

◆ logger

+ +
+
+ + + + + +
+ + + + +
readonly ILogger<Watchdog> Tgstation.Server.Host.Watchdog.Watchdog.logger
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.png b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.png new file mode 100644 index 0000000000000000000000000000000000000000..17154bf21b1a231cc26d900d6bfb123592a33a17 GIT binary patch literal 859 zcmeAS@N?(olHy`uVBq!ia0y~yU}OZc12~w0q~3G`O&}!^;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|!1T(~#WAFU@$KB$NpBQ5TKku*`o90k z?YS;L1&uF%e3*91ShPw>@SuN7c+Tx@y1F-9T*SnL6c~jR8od_C)GH;)$?m&K~cU z?_IMAerUY5b+MNJg1Qx}*_rOG-BoOOCD8vt^k*(+>d>a{oK;P_Dtb>wJ}du2TSM7n_9ll9{J3h=e|8o{&3}m^0VwLXZB@X zQD#!VFsn%S{ame+jHQAc5&h;IHQ9Db1(n=;zE3#Q>!2Yj%XmMLXTP+iL1Nu%z9%eq z&P|Fgh-7z*ez7huj$Q4{`YOlO*QzbI?mZBCZ&vljr;$^4e_tk^5o-Ep)$td4+Rr9G zn|Gl9Y`n`8Pb10a4GwFHl$89ZoV56Cbz#=DjuVeljr>f{=QVbmuySHjabQyUptd3R z_O?w72kNJaGwA4^7OvPE=DxwE(Y)cP-~E;TVRaC3vzIw%Kl zD>KxV{HQw}_|=VJ!bwA2zjg0=RrXB|U%w~&b@77vMPJXpsBeF8Ucf^7$@7%&k8|zY zzZG0Pw>NVB$`3QIDFsbc53s*-^|0Qa=+fs&D;9g+ZaI+0E%JGRgS_!Vrs6=0$;*mZ zcBzKun_b>%+*fLnJ6q_&0h4bXhi8d0bRKzYXfSobxxrsT0Wt$e}pgD?5VU5n$Ax2;PR)E|^h zyVG>q%HWo3dG+VrHp$f&xudq;(_ZzKb={9^U%GYAue!6>e6PdmRS&~$-O3|v=Wl$= z@#n@L#s{88!p~;_1D@f7%goN=2==JUOby3R`^>p!wwIM*Lk}cC_izHk?9?azJyE7T UAu|`~0CNI^r>mdKI;Vst0LrX@6aWAK literal 0 HcmV?d00001 diff --git a/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory-members.html b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory-members.html new file mode 100644 index 0000000000..93fd98749c --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Watchdog.WatchdogFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Watchdog.WatchdogFactory, including all inherited members.

+ + +
CreateWatchdog(ILoggerFactory loggerFactory)Tgstation.Server.Host.Watchdog.WatchdogFactory
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory.html new file mode 100644 index 0000000000..e78d09fc54 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory.html @@ -0,0 +1,135 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Watchdog.WatchdogFactory Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Watchdog.WatchdogFactory Class Reference
+
+
+ +

+ More...

+
+Inheritance diagram for Tgstation.Server.Host.Watchdog.WatchdogFactory:
+
+
+ + +Tgstation.Server.Host.Watchdog.IWatchdogFactory + +
+ + + + + +

+Public Member Functions

IWatchdog CreateWatchdog (ILoggerFactory loggerFactory)
 Create a IWatchdog More...
 
+

Detailed Description

+
+

Definition at line 7 of file WatchdogFactory.cs.

+

Member Function Documentation

+ +

◆ CreateWatchdog()

+ +
+
+ + + + + + + + +
IWatchdog Tgstation.Server.Host.Watchdog.WatchdogFactory.CreateWatchdog (ILoggerFactory loggerFactory)
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory.png b/class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..c19084f5a4072abdc00226140a08d7b52bf3342f GIT binary patch literal 1109 zcmeAS@N?(olHy`uVBq!ia0y~yVAKV&12~w0Wc9bpazz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opoFnN@DBkQVo;yuZbeLxwpga$2gU?&(b`N0dBOJ%6oSr0N+ds_S`bRfcC!n5*}s zO;MR!&)a)Gd$oOi{KK2S5)39SnQ3?X(X;n|@7J$Z+ox`S_fhEQ$V=5T+cul#&Du5P z%KGnBeAksTJufW~-V(Rse%=41f_l5v^Ji>(zj5!6-<|)qYrV^VV~`VPkFno z#Sd4RU$RQJYmv{1wG)nd-y38+eb%p3vo!^=+s>s#7j0<^|5iHr>w|L^@5+yT7cKsM zF*(I>zHF2&=l73pd~M;AMMPF7zwR*>zu#}MY4%c~q#tq%w4ZIuwd_{Y%$h$faYNb; z_tQH~w?3bymcDv7$Cfq6xwo8~aofvg(bjjj7neqK+Fc3=kY0P?7F(3!y^kgH7nEMC z3F@4D=tcXtp!>5f7m27%t+=uM+oieNW^K%mHTi#cdtc_wnLB*fevjB_e9?D-oo|it zChv9rGiTmNHd_tRm%P(cE-5Qj=R@H@BgYi!YnmxH&t}WyLviknMy0aVm+!%~&w;esZx_WWv`;-3r zD~^^;`xrOt@lC1kvbM&rEo06vW;J*rvsV1=_SgF_KlxV^W}lclKV|d3x~2PbqrcRi zyc{LJCZAujdi&kE-HCg5Ct4qo%ZW8Aj(WfM!Wq}a@o9&-uDibR*{15AU6C4Z-pT*2 z=W$*6@oRM-CBl5t=7;$&dM+jP?}Hmq=tYCAaV zp`7mXn^)#V&ziILol;7U?YyO>$F7Av64dq1Xup=I`s8$PE zHrZ=VNUM6u()_cTmRys)Y~DmyOZxBjeGx65TmOCS{4H;M?ku}jy$KlcZ2|Hc`y_9w zUSEF3=S`yYwbjR8vDv zzqrOfwBh+Hzd7nTcaLSNGEHG + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Tests.AdministrationTest Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Tests.AdministrationTest, including all inherited members.

+ + + + + +
AdministrationTest(IAdministrationClient client)Tgstation.Server.Tests.AdministrationTest
clientTgstation.Server.Tests.AdministrationTestprivate
Run(CancellationToken cancellationToken)Tgstation.Server.Tests.AdministrationTest
TestRead(CancellationToken cancellationToken)Tgstation.Server.Tests.AdministrationTestprivate
+ + + + diff --git a/class_tgstation_1_1_server_1_1_tests_1_1_administration_test.html b/class_tgstation_1_1_server_1_1_tests_1_1_administration_test.html new file mode 100644 index 0000000000..61bc841cf7 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_administration_test.html @@ -0,0 +1,226 @@ + + + + + + + +tgstation-server: Tgstation.Server.Tests.AdministrationTest Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Tests.AdministrationTest Class Reference
+
+
+ + + + + + +

+Public Member Functions

 AdministrationTest (IAdministrationClient client)
 
async Task Run (CancellationToken cancellationToken)
 
+ + + +

+Private Member Functions

async Task TestRead (CancellationToken cancellationToken)
 
+ + + +

+Private Attributes

readonly IAdministrationClient client
 
+

Detailed Description

+
+

Definition at line 11 of file AdministrationTest.cs.

+

Constructor & Destructor Documentation

+ +

◆ AdministrationTest()

+ +
+
+ + + + + + + + +
Tgstation.Server.Tests.AdministrationTest.AdministrationTest (IAdministrationClient client)
+
+ +

Definition at line 15 of file AdministrationTest.cs.

+
16  {
17  this.client = client ?? throw new ArgumentNullException(nameof(client));
18  }
readonly IAdministrationClient client
+
+

References Tgstation.Server.Tests.AdministrationTest.client.

+ +
+
+

Member Function Documentation

+ +

◆ Run()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Tests.AdministrationTest.Run (CancellationToken cancellationToken)
+
+ +

Definition at line 20 of file AdministrationTest.cs.

+
21  {
22  await TestRead(cancellationToken).ConfigureAwait(false);
23  }
async Task TestRead(CancellationToken cancellationToken)
+
+

References Tgstation.Server.Tests.AdministrationTest.TestRead().

+ +

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

+ +
+
+ +

◆ TestRead()

+ +
+
+ + + + + +
+ + + + + + + + +
async Task Tgstation.Server.Tests.AdministrationTest.TestRead (CancellationToken cancellationToken)
+
+private
+
+ +

Definition at line 25 of file AdministrationTest.cs.

+
26  {
27  Administration model;
28  try
29  {
30  model = await client.Read(cancellationToken).ConfigureAwait(false);
31  }
32  catch (RateLimitException)
33  {
34  Assert.Inconclusive("GitHub rate limit hit while testing administration endpoint. Set environment variable TGS4_TEST_GITHUB_TOKEN to fix this!");
35  return; //c# needs the equivalent of [noreturn]
36  }
37  Assert.AreEqual(RuntimeInformation.IsOSPlatform(OSPlatform.Windows), model.WindowsHost);
38 
39  //we've released a few 4.x versions now, check the release checker is at least somewhat functional
40  Assert.AreEqual(4, model.LatestVersion.Major);
41  }
Occurs when a GitHub rate limit occurs
+
Represents administrative server information
+
bool WindowsHost
If the server is running on a windows operating system
+
Task< Administration > Read(CancellationToken cancellationToken)
Get the Administration represented by the IAdministrationClient
+
Version LatestVersion
The latest available version of the Tgstation.Server.Host assembly from the upstream repository....
+
readonly IAdministrationClient client
+
+

References Tgstation.Server.Tests.AdministrationTest.client, Tgstation.Server.Api.Models.Administration.LatestVersion, Tgstation.Server.Client.IAdministrationClient.Read(), and Tgstation.Server.Api.Models.Administration.WindowsHost.

+ +

Referenced by Tgstation.Server.Tests.AdministrationTest.Run().

+ +
+
+

Member Data Documentation

+ +

◆ client

+ +
+
+ + + + + +
+ + + + +
readonly IAdministrationClient Tgstation.Server.Tests.AdministrationTest.client
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test-members.html b/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test-members.html new file mode 100644 index 0000000000..60ee80fb62 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test-members.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Tests.Instance.ByondTest Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Tests.Instance.ByondTest, including all inherited members.

+ + + + + + + +
byondClientTgstation.Server.Tests.Instance.ByondTestprivate
ByondTest(IByondClient byondClient, IJobsClient jobsClient)Tgstation.Server.Tests.Instance.ByondTest
jobsClientTgstation.Server.Tests.Instance.ByondTestprivate
Run(CancellationToken cancellationToken)Tgstation.Server.Tests.Instance.ByondTest
TestInstall511(CancellationToken cancellationToken)Tgstation.Server.Tests.Instance.ByondTestprivate
TestNoVersion(CancellationToken cancellationToken)Tgstation.Server.Tests.Instance.ByondTestprivate
+ + + + diff --git a/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html b/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html new file mode 100644 index 0000000000..8046c59801 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html @@ -0,0 +1,301 @@ + + + + + + + +tgstation-server: Tgstation.Server.Tests.Instance.ByondTest Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Tests.Instance.ByondTest Class Reference
+
+
+ + + + + + +

+Public Member Functions

 ByondTest (IByondClient byondClient, IJobsClient jobsClient)
 
async Task Run (CancellationToken cancellationToken)
 
+ + + + + +

+Private Member Functions

async Task TestInstall511 (CancellationToken cancellationToken)
 
async Task TestNoVersion (CancellationToken cancellationToken)
 
+ + + + + +

+Private Attributes

readonly IByondClient byondClient
 
readonly IJobsClient jobsClient
 
+

Detailed Description

+
+

Definition at line 9 of file ByondTest.cs.

+

Constructor & Destructor Documentation

+ +

◆ ByondTest()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Tests.Instance.ByondTest.ByondTest (IByondClient byondClient,
IJobsClient jobsClient 
)
+
+ +

Definition at line 14 of file ByondTest.cs.

+
15  {
16  this.byondClient = byondClient ?? throw new ArgumentNullException(nameof(byondClient));
17  this.jobsClient = jobsClient ?? throw new ArgumentNullException(nameof(jobsClient));
18  }
+ +
+

References Tgstation.Server.Tests.Instance.ByondTest.byondClient, and Tgstation.Server.Tests.Instance.ByondTest.jobsClient.

+ +
+
+

Member Function Documentation

+ +

◆ Run()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Tests.Instance.ByondTest.Run (CancellationToken cancellationToken)
+
+ +

Definition at line 20 of file ByondTest.cs.

+
21  {
22  await TestNoVersion(cancellationToken).ConfigureAwait(false);
23  await TestInstall511(cancellationToken).ConfigureAwait(false);
24  }
async Task TestInstall511(CancellationToken cancellationToken)
Definition: ByondTest.cs:26
+
async Task TestNoVersion(CancellationToken cancellationToken)
Definition: ByondTest.cs:57
+
+

References Tgstation.Server.Tests.Instance.ByondTest.TestInstall511(), and Tgstation.Server.Tests.Instance.ByondTest.TestNoVersion().

+ +
+
+ +

◆ TestInstall511()

+ +
+
+ + + + + +
+ + + + + + + + +
async Task Tgstation.Server.Tests.Instance.ByondTest.TestInstall511 (CancellationToken cancellationToken)
+
+private
+
+ +

Definition at line 26 of file ByondTest.cs.

+
27  {
28  var newModel = new Api.Models.Byond
29  {
30  Version = new Version(511, 1385)
31  };
32  var test = await byondClient.SetActiveVersion(newModel, cancellationToken).ConfigureAwait(false);
33  Assert.IsNotNull(test.InstallJob);
34  Assert.IsNull(test.Version);
35  var job = test.InstallJob;
36  var maxWait = 60; //it's 10MB max give me a break
37  do
38  {
39  await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
40  job = await jobsClient.GetId(job, cancellationToken).ConfigureAwait(false);
41  --maxWait;
42  }
43  while (!job.StoppedAt.HasValue && maxWait > 0);
44  if (!job.StoppedAt.HasValue)
45  {
46  await jobsClient.Cancel(job, cancellationToken).ConfigureAwait(false);
47  Assert.Fail("Byond installation job timed out!");
48  }
49 
50  if (job.ExceptionDetails != null)
51  Assert.Fail(job.ExceptionDetails);
52 
53  var currentShit = await byondClient.ActiveVersion(cancellationToken).ConfigureAwait(false);
54  Assert.AreEqual(newModel.Version, currentShit.Version);
55  }
+ +
Task< Byond > ActiveVersion(CancellationToken cancellationToken)
Get the Byond active System.Version information
+
Task< Byond > SetActiveVersion(Byond byond, CancellationToken cancellationToken)
Updates the Byond information
+
Task< Job > GetId(Job job, CancellationToken cancellationToken)
Get a job
+
Task Cancel(Job job, CancellationToken cancellationToken)
Cancels a job
+
+

References Tgstation.Server.Client.Components.IByondClient.ActiveVersion(), Tgstation.Server.Tests.Instance.ByondTest.byondClient, Tgstation.Server.Client.Components.IJobsClient.Cancel(), Tgstation.Server.Client.Components.IJobsClient.GetId(), Tgstation.Server.Tests.Instance.ByondTest.jobsClient, and Tgstation.Server.Client.Components.IByondClient.SetActiveVersion().

+ +

Referenced by Tgstation.Server.Tests.Instance.ByondTest.Run().

+ +
+
+ +

◆ TestNoVersion()

+ +
+
+ + + + + +
+ + + + + + + + +
async Task Tgstation.Server.Tests.Instance.ByondTest.TestNoVersion (CancellationToken cancellationToken)
+
+private
+
+ +

Definition at line 57 of file ByondTest.cs.

+
58  {
59  var allVersionsTask = byondClient.InstalledVersions(cancellationToken);
60  var currentShit = await byondClient.ActiveVersion(cancellationToken).ConfigureAwait(false);
61  Assert.IsNotNull(currentShit);
62  Assert.IsNull(currentShit.InstallJob);
63  Assert.IsNull(currentShit.Version);
64  var otherShit = await allVersionsTask.ConfigureAwait(false);
65  Assert.IsNotNull(otherShit);
66  Assert.AreEqual(0, otherShit.Count);
67  }
Task< IReadOnlyList< Byond > > InstalledVersions(CancellationToken cancellationToken)
Get all installed Byond System.Versions
+ +
Task< Byond > ActiveVersion(CancellationToken cancellationToken)
Get the Byond active System.Version information
+
+

References Tgstation.Server.Client.Components.IByondClient.ActiveVersion(), Tgstation.Server.Tests.Instance.ByondTest.byondClient, and Tgstation.Server.Client.Components.IByondClient.InstalledVersions().

+ +

Referenced by Tgstation.Server.Tests.Instance.ByondTest.Run().

+ +
+
+

Member Data Documentation

+ +

◆ byondClient

+ +
+
+ + + + + +
+ + + + +
readonly IByondClient Tgstation.Server.Tests.Instance.ByondTest.byondClient
+
+private
+
+
+ +

◆ jobsClient

+ +
+
+ + + + + +
+ + + + +
readonly IJobsClient Tgstation.Server.Tests.Instance.ByondTest.jobsClient
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test-members.html b/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test-members.html new file mode 100644 index 0000000000..2dd7dfe38a --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test-members.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Tests.Instance.ConfigurationTest Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Tests.Instance.ConfigurationTest, including all inherited members.

+ + + + + + + +
configurationClientTgstation.Server.Tests.Instance.ConfigurationTestprivate
ConfigurationTest(IConfigurationClient configurationClient, Api.Models.Instance instance)Tgstation.Server.Tests.Instance.ConfigurationTest
FileExists(ConfigurationFile file)Tgstation.Server.Tests.Instance.ConfigurationTestprivate
instanceTgstation.Server.Tests.Instance.ConfigurationTestprivate
Run(CancellationToken cancellationToken)Tgstation.Server.Tests.Instance.ConfigurationTest
TestDeleteDirectory(CancellationToken cancellationToken)Tgstation.Server.Tests.Instance.ConfigurationTestprivate
+ + + + diff --git a/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test.html b/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test.html new file mode 100644 index 0000000000..ea0722d55b --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test.html @@ -0,0 +1,301 @@ + + + + + + + +tgstation-server: Tgstation.Server.Tests.Instance.ConfigurationTest Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Tests.Instance.ConfigurationTest Class Reference
+
+
+ + + + + + +

+Public Member Functions

 ConfigurationTest (IConfigurationClient configurationClient, Api.Models.Instance instance)
 
async Task Run (CancellationToken cancellationToken)
 
+ + + + + +

+Private Member Functions

bool FileExists (ConfigurationFile file)
 
async Task TestDeleteDirectory (CancellationToken cancellationToken)
 
+ + + + + +

+Private Attributes

readonly IConfigurationClient configurationClient
 
readonly Api.Models.Instance instance
 
+

Detailed Description

+
+

Definition at line 13 of file ConfigurationTest.cs.

+

Constructor & Destructor Documentation

+ +

◆ ConfigurationTest()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Tests.Instance.ConfigurationTest.ConfigurationTest (IConfigurationClient configurationClient,
Api.Models.Instance instance 
)
+
+ +

Definition at line 18 of file ConfigurationTest.cs.

+
19  {
20  this.configurationClient = configurationClient ?? throw new ArgumentNullException(nameof(configurationClient));
21  this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
22  }
+ +
+

References Tgstation.Server.Tests.Instance.ConfigurationTest.configurationClient, and Tgstation.Server.Tests.Instance.ConfigurationTest.instance.

+ +
+
+

Member Function Documentation

+ +

◆ FileExists()

+ +
+
+ + + + + +
+ + + + + + + + +
bool Tgstation.Server.Tests.Instance.ConfigurationTest.FileExists (ConfigurationFile file)
+
+private
+
+ +

Definition at line 24 of file ConfigurationTest.cs.

+
25  {
26  var tmp = (file.Path?.StartsWith('/') ?? false) ? '.' + file.Path : file.Path;
27  var path = Path.Combine(instance.Path, "Configuration", tmp);
28  return File.Exists(path);
29  }
+
string Path
The path to where the Instance is located. Can only be changed while the Instance is offline....
Definition: Instance.cs:26
+
string Path
The path to the ConfigurationFile file
+
+

References Tgstation.Server.Tests.Instance.ConfigurationTest.instance, Tgstation.Server.Api.Models.ConfigurationFile.Path, and Tgstation.Server.Api.Models.Instance.Path.

+ +

Referenced by Tgstation.Server.Tests.Instance.ConfigurationTest.TestDeleteDirectory().

+ +
+
+ +

◆ Run()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Tests.Instance.ConfigurationTest.Run (CancellationToken cancellationToken)
+
+ +

Definition at line 58 of file ConfigurationTest.cs.

+
59  {
60  await TestDeleteDirectory(cancellationToken).ConfigureAwait(false);
61  }
async Task TestDeleteDirectory(CancellationToken cancellationToken)
+
+

References Tgstation.Server.Tests.Instance.ConfigurationTest.TestDeleteDirectory().

+ +
+
+ +

◆ TestDeleteDirectory()

+ +
+
+ + + + + +
+ + + + + + + + +
async Task Tgstation.Server.Tests.Instance.ConfigurationTest.TestDeleteDirectory (CancellationToken cancellationToken)
+
+private
+
+ +

Definition at line 31 of file ConfigurationTest.cs.

+
32  {
33  //try to delete non-existent
34  var TestDir = new ConfigurationFile
35  {
36  Path = "/TestDeleteDir"
37  };
38 
39  await configurationClient.DeleteEmptyDirectory(TestDir, cancellationToken).ConfigureAwait(false);
40 
41  //try to delete non-empty
42  var file = await configurationClient.Write(new ConfigurationFile
43  {
44  Content = Encoding.UTF8.GetBytes("Hello world!"),
45  Path = TestDir.Path + "/test.txt"
46  }, cancellationToken).ConfigureAwait(false);
47 
48  Assert.IsTrue(FileExists(file));
49 
50  await Assert.ThrowsExceptionAsync<ConflictException>(() => configurationClient.DeleteEmptyDirectory(TestDir, cancellationToken)).ConfigureAwait(false);
51 
52  file.Content = null;
53  await configurationClient.Write(file, cancellationToken).ConfigureAwait(false);
54 
55  await configurationClient.DeleteEmptyDirectory(TestDir, cancellationToken).ConfigureAwait(false);
56  }
Task< ConfigurationFile > Write(ConfigurationFile file, CancellationToken cancellationToken)
Overwrite a ConfigurationFile file
+ +
string Path
The path to the ConfigurationFile file
+
Task DeleteEmptyDirectory(ConfigurationFile directory, CancellationToken cancellationToken)
Delete an empty directory
+
Represents a game configuration file. Create and delete actions uncerimonuously overwrite/delete file...
+
Occurs when the client performs an action that would result in data conflict
+ +
+

References Tgstation.Server.Tests.Instance.ConfigurationTest.configurationClient, Tgstation.Server.Client.Components.IConfigurationClient.DeleteEmptyDirectory(), Tgstation.Server.Tests.Instance.ConfigurationTest.FileExists(), Tgstation.Server.Api.Models.ConfigurationFile.Path, and Tgstation.Server.Client.Components.IConfigurationClient.Write().

+ +

Referenced by Tgstation.Server.Tests.Instance.ConfigurationTest.Run().

+ +
+
+

Member Data Documentation

+ +

◆ configurationClient

+ +
+
+ + + + + +
+ + + + +
readonly IConfigurationClient Tgstation.Server.Tests.Instance.ConfigurationTest.configurationClient
+
+private
+
+
+ +

◆ instance

+ +
+
+ + + + + +
+ + + + +
readonly Api.Models.Instance Tgstation.Server.Tests.Instance.ConfigurationTest.instance
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_instance_test-members.html b/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_instance_test-members.html new file mode 100644 index 0000000000..44c36f62d9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_instance_test-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Tests.Instance.InstanceTest Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Tests.Instance.InstanceTest, including all inherited members.

+ + + + +
instanceClientTgstation.Server.Tests.Instance.InstanceTestprivate
InstanceTest(IInstanceClient instanceClient)Tgstation.Server.Tests.Instance.InstanceTest
RunTests(CancellationToken cancellationToken)Tgstation.Server.Tests.Instance.InstanceTest
+ + + + diff --git a/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_instance_test.html b/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_instance_test.html new file mode 100644 index 0000000000..8c022a74b3 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_instance_test.html @@ -0,0 +1,186 @@ + + + + + + + +tgstation-server: Tgstation.Server.Tests.Instance.InstanceTest Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Tests.Instance.InstanceTest Class Reference
+
+
+ + + + + + +

+Public Member Functions

 InstanceTest (IInstanceClient instanceClient)
 
async Task RunTests (CancellationToken cancellationToken)
 
+ + + +

+Private Attributes

readonly IInstanceClient instanceClient
 
+

Detailed Description

+
+

Definition at line 8 of file InstanceTest.cs.

+

Constructor & Destructor Documentation

+ +

◆ InstanceTest()

+ +
+
+ + + + + + + + +
Tgstation.Server.Tests.Instance.InstanceTest.InstanceTest (IInstanceClient instanceClient)
+
+ +

Definition at line 12 of file InstanceTest.cs.

+
13  {
14  this.instanceClient = instanceClient ?? throw new ArgumentNullException(nameof(instanceClient));
15  }
+
+

References Tgstation.Server.Tests.Instance.InstanceTest.instanceClient.

+ +
+
+

Member Function Documentation

+ +

◆ RunTests()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Tests.Instance.InstanceTest.RunTests (CancellationToken cancellationToken)
+
+ +

Definition at line 17 of file InstanceTest.cs.

+
18  {
19  var byondTests = new ByondTest(instanceClient.Byond, instanceClient.Jobs);
20  var configTests = new ConfigurationTest(instanceClient.Configuration, instanceClient.Metadata);
21 
22  var byondTest = byondTests.Run(cancellationToken);
23  await configTests.Run(cancellationToken).ConfigureAwait(false);
24  await byondTest.ConfigureAwait(false);
25  }
Instance Metadata
The Instance used to create the IInstanceClient
+
IConfigurationClient Configuration
Access the IConfigurationClient
+
IByondClient Byond
Access the IByondClient
+ + +
+

References Tgstation.Server.Client.Components.IInstanceClient.Byond, Tgstation.Server.Client.Components.IInstanceClient.Configuration, Tgstation.Server.Tests.Instance.InstanceTest.instanceClient, Tgstation.Server.Client.Components.IInstanceClient.Jobs, and Tgstation.Server.Client.Components.IInstanceClient.Metadata.

+ +

Referenced by Tgstation.Server.Tests.InstanceManagerTest.Run().

+ +
+
+

Member Data Documentation

+ +

◆ instanceClient

+ +
+
+ + + + + +
+ + + + +
readonly IInstanceClient Tgstation.Server.Tests.Instance.InstanceTest.instanceClient
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test-members.html b/class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test-members.html new file mode 100644 index 0000000000..ef269c70b9 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test-members.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Tests.InstanceManagerTest Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Tests.InstanceManagerTest, including all inherited members.

+ + + + + + + +
counterTgstation.Server.Tests.InstanceManagerTestprivate
CreateTestInstance(CancellationToken cancellationToken)Tgstation.Server.Tests.InstanceManagerTestprivate
instanceManagerClientTgstation.Server.Tests.InstanceManagerTestprivate
InstanceManagerTest(IInstanceManagerClient instanceManagerClient, string testRootPath)Tgstation.Server.Tests.InstanceManagerTest
Run(CancellationToken cancellationToken)Tgstation.Server.Tests.InstanceManagerTest
testRootPathTgstation.Server.Tests.InstanceManagerTestprivate
+ + + + diff --git a/class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test.html b/class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test.html new file mode 100644 index 0000000000..d61156adfd --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test.html @@ -0,0 +1,297 @@ + + + + + + + +tgstation-server: Tgstation.Server.Tests.InstanceManagerTest Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Tests.InstanceManagerTest Class Reference
+
+
+ + + + + + +

+Public Member Functions

 InstanceManagerTest (IInstanceManagerClient instanceManagerClient, string testRootPath)
 
async Task Run (CancellationToken cancellationToken)
 
+ + + +

+Private Member Functions

Task< Api.Models.InstanceCreateTestInstance (CancellationToken cancellationToken)
 
+ + + + + + + +

+Private Attributes

readonly IInstanceManagerClient instanceManagerClient
 
readonly string testRootPath
 
long counter
 
+

Detailed Description

+
+

Definition at line 14 of file InstanceManagerTest.cs.

+

Constructor & Destructor Documentation

+ +

◆ InstanceManagerTest()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Tgstation.Server.Tests.InstanceManagerTest.InstanceManagerTest (IInstanceManagerClient instanceManagerClient,
string testRootPath 
)
+
+ +

Definition at line 21 of file InstanceManagerTest.cs.

+
22  {
23  this.instanceManagerClient = instanceManagerClient ?? throw new ArgumentNullException(nameof(instanceManagerClient));
24  this.testRootPath = testRootPath ?? throw new ArgumentNullException(nameof(testRootPath));
25 
26  counter = 0;
27  }
+
readonly IInstanceManagerClient instanceManagerClient
+ +
+

References Tgstation.Server.Tests.InstanceManagerTest.counter, Tgstation.Server.Tests.InstanceManagerTest.instanceManagerClient, and Tgstation.Server.Tests.InstanceManagerTest.testRootPath.

+ +
+
+

Member Function Documentation

+ +

◆ CreateTestInstance()

+ +
+
+ + + + + +
+ + + + + + + + +
Task<Api.Models.Instance> Tgstation.Server.Tests.InstanceManagerTest.CreateTestInstance (CancellationToken cancellationToken)
+
+private
+
+
+ +

◆ Run()

+ +
+
+ + + + + + + + +
async Task Tgstation.Server.Tests.InstanceManagerTest.Run (CancellationToken cancellationToken)
+
+ +

Definition at line 36 of file InstanceManagerTest.cs.

+
37  {
38  var firstTest = await CreateTestInstance(cancellationToken).ConfigureAwait(false);
39  //instances always start offline
40  Assert.AreEqual(false, firstTest.Online);
41  //check it exists
42  Assert.IsTrue(Directory.Exists(firstTest.Path));
43 
44  //cant create instances in existent directories
45  var testNonEmpty = Path.Combine(testRootPath, Guid.NewGuid().ToString());
46  Directory.CreateDirectory(testNonEmpty);
47  await Assert.ThrowsExceptionAsync<ConflictException>(() => instanceManagerClient.CreateOrAttach(new Api.Models.Instance
48  {
49  Path = testNonEmpty,
50  Name = "NonEmptyTest"
51  }, cancellationToken)).ConfigureAwait(false);
52  await Assert.ThrowsExceptionAsync<ConflictException>(() => instanceManagerClient.CreateOrAttach(firstTest, cancellationToken)).ConfigureAwait(false);
53 
54  //can't create instances in installation directory
55  await Assert.ThrowsExceptionAsync<ConflictException>(() => instanceManagerClient.CreateOrAttach(new Api.Models.Instance
56  {
57  Path = "./A/Local/Path",
58  Name = "NoInstallDirTest"
59  }, cancellationToken)).ConfigureAwait(false);
60 
61  //can't move to existent directories
62  await Assert.ThrowsExceptionAsync<ConflictException>(() => instanceManagerClient.Update(new Api.Models.Instance
63  {
64  Id = firstTest.Id,
65  Path = testNonEmpty
66  }, cancellationToken)).ConfigureAwait(false);
67 
68  //test basic move
69  Directory.Delete(testNonEmpty);
70  var initialPath = firstTest.Path;
71  firstTest = await instanceManagerClient.Update(new Api.Models.Instance
72  {
73  Id = firstTest.Id,
74  Path = testNonEmpty
75  }, cancellationToken).ConfigureAwait(false);
76 
77  Assert.IsNotNull(firstTest.MoveJob);
78 
79  do
80  {
81  firstTest = await instanceManagerClient.GetId(firstTest, cancellationToken).ConfigureAwait(false);
82  await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
83  } while (firstTest.MoveJob != null);
84 
85 
86  //online it for real for component tests
87  firstTest.Online = true;
88  firstTest.ConfigurationType = ConfigurationType.HostWrite;
89  firstTest = await instanceManagerClient.Update(firstTest, cancellationToken).ConfigureAwait(false);
90  Assert.AreEqual(true, firstTest.Online);
91  Assert.AreEqual(ConfigurationType.HostWrite, firstTest.ConfigurationType);
92 
93  //can't move online instance
94  await Assert.ThrowsExceptionAsync<ConflictException>(() => instanceManagerClient.Update(new Api.Models.Instance
95  {
96  Id = firstTest.Id,
97  Path = initialPath
98  }, cancellationToken)).ConfigureAwait(false);
99 
100  var testSuite1 = new InstanceTest(instanceManagerClient.CreateClient(firstTest));
101  await testSuite1.RunTests(cancellationToken).ConfigureAwait(false);
102 
103  //can regain permissions on instance without instance user
104  var instanceClient = instanceManagerClient.CreateClient(firstTest);
105  var ourInstanceUser = await instanceClient.Users.Read(cancellationToken).ConfigureAwait(false);
106  await instanceClient.Users.Delete(ourInstanceUser, cancellationToken).ConfigureAwait(false);
107 
108  await Assert.ThrowsExceptionAsync<InsufficientPermissionsException>(() => instanceClient.Users.Read(cancellationToken)).ConfigureAwait(false);
109 
110  await instanceManagerClient.Update(new Api.Models.Instance
111  {
112  Id = firstTest.Id
113  }, cancellationToken).ConfigureAwait(false);
114  ourInstanceUser = await instanceClient.Users.Read(cancellationToken).ConfigureAwait(false);
115 
116  //can't detach online instance
117  await Assert.ThrowsExceptionAsync<ConflictException>(() => instanceManagerClient.Detach(firstTest, cancellationToken)).ConfigureAwait(false);
118 
119  firstTest.Online = false;
120  firstTest = await instanceManagerClient.Update(firstTest, cancellationToken).ConfigureAwait(false);
121  await instanceManagerClient.Detach(firstTest, cancellationToken).ConfigureAwait(false);
122 
123  var instanceAttachFileName = (string)typeof(InstanceController).GetField("InstanceAttachFileName", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null);
124  var attachPath = Path.Combine(firstTest.Path, instanceAttachFileName);
125  Assert.IsTrue(File.Exists(attachPath));
126 
127  //can recreate detached instance
128  firstTest = await instanceManagerClient.CreateOrAttach(firstTest, cancellationToken).ConfigureAwait(false);
129 
130  //but only if the attach file exists
131  await instanceManagerClient.Detach(firstTest, cancellationToken).ConfigureAwait(false);
132  File.Delete(attachPath);
133  await Assert.ThrowsExceptionAsync<ConflictException>(() => instanceManagerClient.CreateOrAttach(firstTest, cancellationToken)).ConfigureAwait(false);
134  }
async Task RunTests(CancellationToken cancellationToken)
Definition: InstanceTest.cs:17
+ +
readonly IInstanceManagerClient instanceManagerClient
+
Task< Instance > CreateOrAttach(Instance instance, CancellationToken cancellationToken)
Create or attach an instance
+
IInstanceClient CreateClient(Instance instance)
Create an IInstanceClient for a given Instance
+
ConfigurationType
The type of configuration allowed on an Instance
+
Controller for managing Components.Instances
+
Task< Instance > GetId(Instance instance, CancellationToken cancellationToken)
Get a specific instance
+
Task Detach(Instance instance, CancellationToken cancellationToken)
Deletes an instance
+
Task< Instance > Update(Instance instance, CancellationToken cancellationToken)
Relocates, renamed, and/or on/offlines an instance
+ +
Occurs when the client performs an action that would result in data conflict
+
Occurs when the client attempts to perform an action they do not have the rights for
+
Task< Api.Models.Instance > CreateTestInstance(CancellationToken cancellationToken)
+
+

References Tgstation.Server.Client.IInstanceManagerClient.CreateClient(), Tgstation.Server.Client.IInstanceManagerClient.CreateOrAttach(), Tgstation.Server.Tests.InstanceManagerTest.CreateTestInstance(), Tgstation.Server.Client.IInstanceManagerClient.Detach(), Tgstation.Server.Client.IInstanceManagerClient.GetId(), Tgstation.Server.Tests.InstanceManagerTest.instanceManagerClient, Tgstation.Server.Tests.Instance.InstanceTest.RunTests(), Tgstation.Server.Tests.InstanceManagerTest.testRootPath, and Tgstation.Server.Client.IInstanceManagerClient.Update().

+ +

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

+ +
+
+

Member Data Documentation

+ +

◆ counter

+ +
+
+ + + + + +
+ + + + +
long Tgstation.Server.Tests.InstanceManagerTest.counter
+
+private
+
+
+ +

◆ instanceManagerClient

+ +
+
+ + + + + +
+ + + + +
readonly IInstanceManagerClient Tgstation.Server.Tests.InstanceManagerTest.instanceManagerClient
+
+private
+
+
+ +

◆ testRootPath

+ +
+
+ + + + + +
+ + + + +
readonly string Tgstation.Server.Tests.InstanceManagerTest.testRootPath
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_tests_1_1_integration_test-members.html b/class_tgstation_1_1_server_1_1_tests_1_1_integration_test-members.html new file mode 100644 index 0000000000..1858c2d490 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_integration_test-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Tests.IntegrationTest Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_tests_1_1_integration_test.html b/class_tgstation_1_1_server_1_1_tests_1_1_integration_test.html new file mode 100644 index 0000000000..0044acda80 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_integration_test.html @@ -0,0 +1,203 @@ + + + + + + + +tgstation-server: Tgstation.Server.Tests.IntegrationTest Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Tests.IntegrationTest Class Reference
+
+
+ + + + + + +

+Public Member Functions

async Task TestUpdate ()
 
async Task TestStandardOperation ()
 
+ + + +

+Private Attributes

readonly IServerClientFactory clientFactory = new ServerClientFactory(new ProductHeaderValue(Assembly.GetExecutingAssembly().GetName().Name, Assembly.GetExecutingAssembly().GetName().Version.ToString()))
 
+

Detailed Description

+
+

Definition at line 18 of file IntegrationTest.cs.

+

Member Function Documentation

+ +

◆ TestStandardOperation()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Tests.IntegrationTest.TestStandardOperation ()
+
+ +

Definition at line 99 of file IntegrationTest.cs.

+
100  {
101  var server = new TestingServer(null);
102  using (var serverCts = new CancellationTokenSource())
103  {
104  var cancellationToken = serverCts.Token;
105  var serverTask = server.RunAsync(cancellationToken);
106  try
107  {
108  IServerClient adminClient;
109 
110  var giveUpAt = DateTimeOffset.Now.AddSeconds(60);
111  do
112  {
113  try
114  {
115  adminClient = await clientFactory.CreateServerClient(server.Url, User.AdminName, User.DefaultAdminPassword).ConfigureAwait(false);
116  break;
117  }
119  {
120  // migrating, to be expected
121  if (DateTimeOffset.Now > giveUpAt)
122  throw;
123  await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
124  }
125  } while (true);
126 
127  using (adminClient)
128  {
129  var serverInfo = await adminClient.Version(default).ConfigureAwait(false);
130 
131  Assert.AreEqual(ApiHeaders.Version, serverInfo.ApiVersion);
132  Assert.AreEqual(typeof(IServer).Assembly.GetName().Version, serverInfo.Version);
133 
134  //check that modifying the token even slightly fucks up the auth
135  var newToken = new Token
136  {
137  ExpiresAt = adminClient.Token.ExpiresAt,
138  Bearer = adminClient.Token.Bearer + '0'
139  };
140 
141  var badClient = clientFactory.CreateServerClient(server.Url, newToken);
142  await Assert.ThrowsExceptionAsync<UnauthorizedException>(() => badClient.Version(cancellationToken)).ConfigureAwait(false);
143 
144  await new AdministrationTest(adminClient.Administration).Run(cancellationToken).ConfigureAwait(false);
145  await new InstanceManagerTest(adminClient.Instances, server.Directory).Run(cancellationToken).ConfigureAwait(false);
146  }
147  }
148  finally
149  {
150  serverCts.Cancel();
151  try
152  {
153  await serverTask.ConfigureAwait(false);
154  }
155  catch (OperationCanceledException) { }
156  }
157  }
158  }
Task< ServerInformation > Version(CancellationToken cancellationToken)
The ServerInformation of the IServerClient
+
const string AdminName
The name of the default admin user
Definition: User.cs:9
+
Represents the header that must be present for every server request
Definition: ApiHeaders.cs:16
+
Occurs when the client makes a request while the server is starting or stopping
+
Token Token
The Token used to access the server
+
Main client for communicating with a server
+
Represents the host
Definition: IServer.cs:9
+
readonly IServerClientFactory clientFactory
+
DateTimeOffset? ExpiresAt
When the Token expires
Definition: Token.cs:18
+
Represents a JWT returned by the API
Definition: Token.cs:8
+
const string DefaultAdminPassword
The default admin password
Definition: User.cs:14
+ +
IInstanceManagerClient Instances
Access the IInstanceManagerClient
+
Occurs when the client provides invalid credentials
+
IAdministrationClient Administration
Access the IAdministrationClient
+
string Bearer
The value of the JWT
Definition: Token.cs:13
+
static Version Version
Get the version of the Api the caller is using
Definition: ApiHeaders.cs:56
+
Task< IServerClient > CreateServerClient(Uri host, string username, string password, TimeSpan timeout=default, CancellationToken cancellationToken=default)
Create a IServerClient
+
+

References Tgstation.Server.Client.IServerClient.Administration, Tgstation.Server.Api.Models.User.AdminName, Tgstation.Server.Api.Models.Token.Bearer, Tgstation.Server.Tests.IntegrationTest.clientFactory, Tgstation.Server.Client.IServerClientFactory.CreateServerClient(), Tgstation.Server.Api.Models.User.DefaultAdminPassword, Tgstation.Server.Api.Models.Token.ExpiresAt, Tgstation.Server.Client.IServerClient.Instances, Tgstation.Server.Tests.AdministrationTest.Run(), Tgstation.Server.Tests.InstanceManagerTest.Run(), Tgstation.Server.Client.IServerClient.Token, Tgstation.Server.Client.IServerClient.Version(), and Tgstation.Server.Api.ApiHeaders.Version.

+ +
+
+ +

◆ TestUpdate()

+ +
+
+ + + + + + + +
async Task Tgstation.Server.Tests.IntegrationTest.TestUpdate ()
+
+ +

Definition at line 24 of file IntegrationTest.cs.

+
25  {
26  var updatePathRoot = Path.GetTempFileName();
27  File.Delete(updatePathRoot);
28  Directory.CreateDirectory(updatePathRoot);
29  try
30  {
31  var updatePath = Path.Combine(updatePathRoot, Guid.NewGuid().ToString());
32  var server = new TestingServer(updatePath);
33  using (var serverCts = new CancellationTokenSource())
34  {
35  var cancellationToken = serverCts.Token;
36  var serverTask = server.RunAsync(cancellationToken);
37  try
38  {
39  IServerClient adminClient;
40 
41  var giveUpAt = DateTimeOffset.Now.AddSeconds(60);
42  do
43  {
44  try
45  {
46  adminClient = await clientFactory.CreateServerClient(server.Url, User.AdminName, User.DefaultAdminPassword).ConfigureAwait(false);
47  break;
48  }
50  {
51  //migrating, to be expected
52  if (DateTimeOffset.Now > giveUpAt)
53  throw;
54  await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
55  }
56  } while (true);
57 
58  var testUpdateVersion = new Version(4, 0, 0, 6);
59  using (adminClient)
60  //attempt to update to stable
61  await adminClient.Administration.Update(new Administration
62  {
63  NewVersion = testUpdateVersion
64  }, cancellationToken).ConfigureAwait(false);
65 
66  //wait up to 3 minutes for the dl and install
67  await Task.WhenAny(serverTask, Task.Delay(TimeSpan.FromMinutes(3), cancellationToken)).ConfigureAwait(false);
68 
69  Assert.IsTrue(serverTask.IsCompleted, "Sever still running!");
70 
71  Assert.IsTrue(Directory.Exists(updatePath), "Update directory not present!");
72 
73  var updatedAssemblyPath = Path.Combine(updatePath, "Tgstation.Server.Host.dll");
74  Assert.IsTrue(File.Exists(updatedAssemblyPath), "Updated assembly missing!");
75 
76  var updatedAssemblyVersion = FileVersionInfo.GetVersionInfo(updatedAssemblyPath);
77  Assert.AreEqual(testUpdateVersion, Version.Parse(updatedAssemblyVersion.FileVersion));
78  }
79  finally
80  {
81  serverCts.Cancel();
82  try
83  {
84  await serverTask.ConfigureAwait(false);
85  }
86  catch (OperationCanceledException) { }
87  }
88  Assert.IsTrue(server.RestartRequested, "Server not requesting restart!");
89  }
90  }
91  finally
92  {
93  Directory.Delete(updatePathRoot, true);
94  }
95  }
const string AdminName
The name of the default admin user
Definition: User.cs:9
+
Represents administrative server information
+
Occurs when the client makes a request while the server is starting or stopping
+
Main client for communicating with a server
+
readonly IServerClientFactory clientFactory
+
const string DefaultAdminPassword
The default admin password
Definition: User.cs:14
+ +
Task Update(Administration administration, CancellationToken cancellationToken)
Updates the Administration setttings
+
IAdministrationClient Administration
Access the IAdministrationClient
+
Task< IServerClient > CreateServerClient(Uri host, string username, string password, TimeSpan timeout=default, CancellationToken cancellationToken=default)
Create a IServerClient
+
+

References Tgstation.Server.Client.IServerClient.Administration, Tgstation.Server.Api.Models.User.AdminName, Tgstation.Server.Tests.IntegrationTest.clientFactory, Tgstation.Server.Client.IServerClientFactory.CreateServerClient(), Tgstation.Server.Api.Models.User.DefaultAdminPassword, and Tgstation.Server.Client.IAdministrationClient.Update().

+ +
+
+

Member Data Documentation

+ +

◆ clientFactory

+ +
+
+ + + + + +
+ + + + +
readonly IServerClientFactory Tgstation.Server.Tests.IntegrationTest.clientFactory = new ServerClientFactory(new ProductHeaderValue(Assembly.GetExecutingAssembly().GetName().Name, Assembly.GetExecutingAssembly().GetName().Version.ToString()))
+
+private
+
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_tests_1_1_testing_server-members.html b/class_tgstation_1_1_server_1_1_tests_1_1_testing_server-members.html new file mode 100644 index 0000000000..567271c5f0 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_testing_server-members.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Tests.TestingServer Member List
+
+ + + + + diff --git a/class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html b/class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html new file mode 100644 index 0000000000..fb7227cdc3 --- /dev/null +++ b/class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html @@ -0,0 +1,312 @@ + + + + + + + +tgstation-server: Tgstation.Server.Tests.TestingServer Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Tests.TestingServer Class Reference
+
+
+
+Inheritance diagram for Tgstation.Server.Tests.TestingServer:
+
+
+ + +Tgstation.Server.Host.IServer + +
+ + + + + + + + + +

+Public Member Functions

 TestingServer (string updatePath)
 
void Dispose ()
 
Task RunAsync (CancellationToken cancellationToken)
 Runs the IServer More...
 
+ + + +

+Public Attributes

bool RestartRequested => realServer.RestartRequested
 
+ + + + + + + + + +

+Properties

Uri Url [get]
 
string Directory [get]
 
- Properties inherited from Tgstation.Server.Host.IServer
bool RestartRequested [get]
 If the IServer should restart More...
 
+ + + +

+Private Attributes

readonly IServer realServer
 
+

Detailed Description

+
+

Definition at line 13 of file TestingServer.cs.

+

Constructor & Destructor Documentation

+ +

◆ TestingServer()

+ +
+
+ + + + + + + + +
Tgstation.Server.Tests.TestingServer.TestingServer (string updatePath)
+
+ +

Definition at line 22 of file TestingServer.cs.

+
23  {
24  Directory = Path.GetTempFileName();
25  File.Delete(Directory);
26  System.IO.Directory.CreateDirectory(Directory);
27  Url = new Uri("http://localhost:5001");
28 
29  //so we need a db
30  //we have to rely on env vars
31  var databaseType = Environment.GetEnvironmentVariable("TGS4_TEST_DATABASE_TYPE");
32  var connectionString = Environment.GetEnvironmentVariable("TGS4_TEST_CONNECTION_STRING");
33  var gitHubAccessToken = Environment.GetEnvironmentVariable("TGS4_TEST_GITHUB_TOKEN");
34 
35  if (String.IsNullOrEmpty(databaseType))
36  Assert.Inconclusive("No database type configured in env var TGS4_TEST_DATABASE_TYPE!");
37 
38  if (String.IsNullOrEmpty(connectionString))
39  Assert.Inconclusive("No connection string configured in env var TGS4_TEST_CONNECTION_STRING!");
40 
41  if (String.IsNullOrEmpty(gitHubAccessToken))
42  Console.WriteLine("WARNING: No GitHub access token configured, test may fail due to rate limits!");
43 
44  var args = new List<string>()
45  {
46  String.Format(CultureInfo.InvariantCulture, "Kestrel:EndPoints:Http:Url={0}", Url),
47  String.Format(CultureInfo.InvariantCulture, "Database:DatabaseType={0}", databaseType),
48  String.Format(CultureInfo.InvariantCulture, "Database:ConnectionString={0}", connectionString),
49  String.Format(CultureInfo.InvariantCulture, "Database:DropDatabase={0}", true),
50  String.Format(CultureInfo.InvariantCulture, "General:SetupWizardMode={0}", SetupWizardMode.Never)
51  };
52 
53  if (!String.IsNullOrEmpty(gitHubAccessToken))
54  args.Add(String.Format(CultureInfo.InvariantCulture, "General:GitHubAccessToken={0}", gitHubAccessToken));
55 
56  realServer = new ServerFactory().CreateServer(args.ToArray(), updatePath);
57  }
+
SetupWizardMode
Determines if the Core.ISetupWizard will run
+ + +
IServer CreateServer(string[] args, string updatePath)
Create a IServer
+ +
+

References Tgstation.Server.Host.ServerFactory.CreateServer(), Tgstation.Server.Tests.TestingServer.Directory, Tgstation.Server.Tests.TestingServer.realServer, and Tgstation.Server.Tests.TestingServer.Url.

+ +
+
+

Member Function Documentation

+ +

◆ Dispose()

+ +
+
+ + + + + + + +
void Tgstation.Server.Tests.TestingServer.Dispose ()
+
+ +

Definition at line 59 of file TestingServer.cs.

+
60  {
61  System.IO.Directory.Delete(Directory, true);
62  }
+
+

References Tgstation.Server.Tests.TestingServer.Directory.

+ +
+
+ +

◆ RunAsync()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Tests.TestingServer.RunAsync (CancellationToken cancellationToken)
+
+ +

Runs the IServer

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implements Tgstation.Server.Host.IServer.

+ +
+
+

Member Data Documentation

+ +

◆ realServer

+ +
+
+ + + + + +
+ + + + +
readonly IServer Tgstation.Server.Tests.TestingServer.realServer
+
+private
+
+ +

Definition at line 20 of file TestingServer.cs.

+ +

Referenced by Tgstation.Server.Tests.TestingServer.TestingServer().

+ +
+
+ +

◆ RestartRequested

+ +
+
+ + + + +
bool Tgstation.Server.Tests.TestingServer.RestartRequested => realServer.RestartRequested
+
+ +

Definition at line 18 of file TestingServer.cs.

+ +
+
+

Property Documentation

+ +

◆ Directory

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Tests.TestingServer.Directory
+
+get
+
+
+ +

◆ Url

+ +
+
+ + + + + +
+ + + + +
Uri Tgstation.Server.Tests.TestingServer.Url
+
+get
+
+ +

Definition at line 15 of file TestingServer.cs.

+
15 { get; }
+

Referenced by Tgstation.Server.Tests.TestingServer.TestingServer().

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/class_tgstation_1_1_server_1_1_tests_1_1_testing_server.png b/class_tgstation_1_1_server_1_1_tests_1_1_testing_server.png new file mode 100644 index 0000000000000000000000000000000000000000..a6b81a834f66e65ec1547fd46aa3a3cc83c5b66a GIT binary patch literal 831 zcmeAS@N?(olHy`uVBq!ia0vp^cY!#7gBeJ!GHK8QQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;kxvS$0+m2TG`dQCDiy;%FHTF?#3wTekh~ucaM& z#gfuyJAmf)mMCUiF{?B<{9HwK)Aoxe>o_ig%r3n!)1l7Yza-qU_VPVm5na(Nai=40 zyz5jngZb}fr>pJW)SI;-mg{$}7QF&Q?)hRre!Sk1w>D6=l<5e>? zww5hZ>0R!s?wOo*(eu)bUl($3Z#%2iP`^UHA=A|K?)md)DuOT9K2SS0dv@MgpN7D# zFBpzpS;Q<6+|8E&48;aRf&%v^6`%9fmN~E_s)PY(31g3@|MPSn0Z_1qopbsp;NUow z;XK>U-_K@jD`Pc3nwuiF_G&%%g|rLO#*25~6Ra-l6S*t@{MEEqWf99pwhi_VyV~!nAKWtyEu39oB-fPl3g`HY#7q|D#VBIC~ zVcW@o+{;!A6smsO!-;-+}%d8Q)aZCdt*_asJU?Uk(${v({faeFPCkQ zPgnc+@s0PYB)3PR5AG_+iOCu!?|OBb_d)&Y{Cv$=D?^5Tu79gfXO&+Sd+_?o-t9r@ tOlKClvKuTDlRYrwR{WK7mgXz}F>tf$t=6>o8w*VB44$rjF6*2UngGRvj_Uvb literal 0 HcmV?d00001 diff --git a/classes.html b/classes.html new file mode 100644 index 0000000000..bb367f35e8 --- /dev/null +++ b/classes.html @@ -0,0 +1,186 @@ + + + + + + + +tgstation-server: Class Index + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Class Index
+
+
+
a | b | c | d | e | f | g | h | i | j | k | l | m | n | p | r | s | t | u | v | w
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  a  
+
DiscordProvider (Tgstation.Server.Host.Components.Chat.Providers)   IInstanceFactory (Tgstation.Server.Host.Components)   MethodNotSupportedException (Tgstation.Server.Client)   SessionController (Tgstation.Server.Host.Components.Watchdog)   
DmbFactory (Tgstation.Server.Host.Components.Compiler)   IInstanceManager (Tgstation.Server.Host.Components)   Migration   SessionControllerFactory (Tgstation.Server.Host.Components.Watchdog)   
Administration (Tgstation.Server.Api.Models)   DmbProvider (Tgstation.Server.Host.Components.Compiler)   IInstanceManagerClient (Tgstation.Server.Client)   TestApplication.MockApplicationLifetime (Tgstation.Server.Host.Core.Tests)   SetupWizard (Tgstation.Server.Host.Core)   
AdministrationClient (Tgstation.Server.Client)   DreamDaemon (Tgstation.Server.Api.Models)   IInstanceUserClient (Tgstation.Server.Client.Components)   TestApplication.MockSetupWizard (Tgstation.Server.Host.Core.Tests)   SqlServerDatabaseContext (Tgstation.Server.Host.Models)   
AdministrationController (Tgstation.Server.Host.Controllers)   DreamDaemonClient (Tgstation.Server.Client.Components)   IIOManager (Tgstation.Server.Host.IO)   ModelController (Tgstation.Server.Host.Controllers)   SqlServerDatabaseContextModelSnapshot (Tgstation.Server.Host.Models.Migrations)   
AdministrationTest (Tgstation.Server.Tests)   DreamDaemonController (Tgstation.Server.Host.Controllers)   IJobManager (Tgstation.Server.Host.Core)   ModelSnapshot   SqlServerDesignTimeDbContextFactory (Tgstation.Server.Host.Models.Migrations)   
ApiClient (Tgstation.Server.Client)   DreamDaemonLaunchParameters (Tgstation.Server.Api.Models.Internal)   IJobsClient (Tgstation.Server.Client.Components)   MonitorState (Tgstation.Server.Host.Components.Watchdog)   SynchronousIOManager (Tgstation.Server.Host.IO)   
ApiClientFactory (Tgstation.Server.Client)   DreamDaemonSettings (Tgstation.Server.Api.Models.Internal)   IJsonTrackingContext (Tgstation.Server.Host.Components.Chat)   MSAddMinimumSecurity (Tgstation.Server.Host.Models.Migrations)   
  t  
+
ApiConflictException (Tgstation.Server.Client)   DreamDaemonSettings (Tgstation.Server.Host.Models)   INetworkPromptReaper (Tgstation.Server.Host.Components.Watchdog)   MSFixRevInfoIndex (Tgstation.Server.Host.Models.Migrations)   
ApiController (Tgstation.Server.Host.Controllers)   DreamMaker (Tgstation.Server.Api.Models)   Instance (Tgstation.Server.Host.Components)   MSInitialCreate (Tgstation.Server.Host.Models.Migrations)   TaskExtensions (Tgstation.Server.Host.Core)   
ApiHeaders (Tgstation.Server.Api)   DreamMaker (Tgstation.Server.Host.Components.Compiler)   Instance (Tgstation.Server.Api.Models)   MSNullableAndForeignKeyCleanup (Tgstation.Server.Host.Models.Migrations)   TemporaryDmbProvider (Tgstation.Server.Host.Components.Compiler)   
ApiMismatchException (Tgstation.Server.Client)   DreamMakerClient (Tgstation.Server.Client.Components)   Instance (Tgstation.Server.Host.Models)   MSReattachCompileJobRequired (Tgstation.Server.Host.Models.Migrations)   TestApiClient (Tgstation.Server.Client.Tests)   
Application (Tgstation.Server.Host.Core)   DreamMakerController (Tgstation.Server.Host.Controllers)   InstanceClient (Tgstation.Server.Client.Components)   MSToggleTestmergeComments (Tgstation.Server.Host.Models.Migrations)   TestApiHeaders (Tgstation.Server.Api.Tests)   
ApplicationBuilderExtensions (Tgstation.Server.Host.Core)   DreamMakerSettings (Tgstation.Server.Host.Models)   InstanceController (Tgstation.Server.Host.Controllers)   MYAddMinimumSecurity (Tgstation.Server.Host.Models.Migrations)   TestApplication (Tgstation.Server.Host.Core.Tests)   
AsyncDelayer (Tgstation.Server.Host.Core)   
  e  
+
InstanceFactory (Tgstation.Server.Host.Components)   MYFixRevInfoIndex (Tgstation.Server.Host.Models.Migrations)   TestAsyncDelayer (Tgstation.Server.Host.Core.Tests)   
AuthenticationContext (Tgstation.Server.Host.Security)   InstanceManager (Tgstation.Server.Host.Components)   MYInitialCreate (Tgstation.Server.Host.Models.Migrations)   TestAuthenticationContext (Tgstation.Server.Host.Security.Tests)   
AuthenticationContextFactory (Tgstation.Server.Host.Security)   ErrorMessage (Tgstation.Server.Api.Models)   InstanceManagerClient (Tgstation.Server.Client)   MYNullableAndForeignKeyCleanup (Tgstation.Server.Host.Models.Migrations)   TestConsole (Tgstation.Server.Host.IO.Tests)   
AuthorizeAttribute   EventConsumer (Tgstation.Server.Host.Components)   InstanceManagerTest (Tgstation.Server.Tests)   MYReattachCompileJobRequired (Tgstation.Server.Host.Models.Migrations)   TestDatabaseContextFactory (Tgstation.Server.Host.Core.Tests)   
AutoGeneratedProgram   EventNotification (Tgstation.Server.Host.Components.Interop)   InstanceTest (Tgstation.Server.Tests.Instance)   MySqlDatabaseContext (Tgstation.Server.Host.Models)   TestDBConnectionFactory (Tgstation.Server.Host.Core.Tests)   
  b  
+
ExperimentalWatchdog (Tgstation.Server.Host.Components.Watchdog)   InstanceUser (Tgstation.Server.Api.Models)   MySqlDatabaseContextModelSnapshot (Tgstation.Server.Host.Models.Migrations)   TestDiscordProvider (Tgstation.Server.Host.Components.Chat.Providers.Tests)   
  f  
+
InstanceUser (Tgstation.Server.Host.Models)   MySqlDesignTimeDbContextFactory (Tgstation.Server.Host.Models.Migrations)   TestDreamDaemonClient (Tgstation.Server.Client.Components.Tests)   
TestServiceCollectionExtensions.BadConfig1 (Tgstation.Server.Host.Core.Tests)   InstanceUserClient (Tgstation.Server.Client.Components)   MYToggleTestmergeComments (Tgstation.Server.Host.Models.Migrations)   TestExperimentalWatchdog (Tgstation.Server.Host.Components.Watchdog.Tests)   
TestServiceCollectionExtensions.BadConfig2 (Tgstation.Server.Host.Core.Tests)   FileLoggingConfiguration (Tgstation.Server.Host.Configuration)   InstanceUserController (Tgstation.Server.Host.Controllers)   
  n  
+
TestGitHubClientFactory (Tgstation.Server.Host.Core.Tests)   
TestServiceCollectionExtensions.BadConfig3 (Tgstation.Server.Host.Core.Tests)   
  g  
+
InsufficientPermissionsException (Tgstation.Server.Client)   TestingServer (Tgstation.Server.Tests)   
BasicWatchdog (Tgstation.Server.Host.Components.Watchdog)   IntegrationTest (Tgstation.Server.Tests)   NativeMethods (Tgstation.Server.Host)   TestIrcConnectionStringBuilder (Tgstation.Server.Api.Models.Tests)   
BoolConverter (Tgstation.Server.Host.Components.Chat.Commands)   GeneralConfiguration (Tgstation.Server.Host.Configuration)   IPlatformIdentifier (Tgstation.Server.Host.Core)   
  p  
+
TestJobException (Tgstation.Server.Host.Core.Tests)   
Byond (Tgstation.Server.Api.Models)   GitHubClientFactory (Tgstation.Server.Host.Core)   IPostWriteHandler (Tgstation.Server.Host.IO)   TestJobHandler (Tgstation.Server.Host.Core.Tests)   
ByondClient (Tgstation.Server.Client.Components)   TestServiceCollectionExtensions.GoodConfig (Tgstation.Server.Host.Core.Tests)   IProcess (Tgstation.Server.Host.Core)   PlatformIdentifier (Tgstation.Server.Host.Core)   TestMerge (Tgstation.Server.Host.Components.Interop)   
ByondCommand (Tgstation.Server.Host.Components.Chat.Commands)   
  h  
+
IProcessBase (Tgstation.Server.Host.Core)   PosixByondInstaller (Tgstation.Server.Host.Components.Byond)   TestMerge (Tgstation.Server.Api.Models.Internal)   
ByondController (Tgstation.Server.Host.Controllers)   IProcessExecutor (Tgstation.Server.Host.Core)   PosixNetworkPromptReaper (Tgstation.Server.Host.Components.Watchdog)   TestMerge (Tgstation.Server.Host.Models)   
ByondExecutableLock (Tgstation.Server.Host.Components.Byond)   HomeController (Tgstation.Server.Host.Controllers)   IProvider (Tgstation.Server.Host.Components.Chat.Providers)   PosixPostWriteHandler (Tgstation.Server.Host.IO)   TestMerge (Tgstation.Server.Api.Models)   
ByondManager (Tgstation.Server.Host.Components.Byond)   HttpClient (Tgstation.Server.Client)   IProviderFactory (Tgstation.Server.Host.Components.Chat)   PosixSymlinkFactory (Tgstation.Server.Host.IO)   TestMergeBase (Tgstation.Server.Api.Models.Internal)   
ByondTest (Tgstation.Server.Tests.Instance)   
  i  
+
IrcConnectionStringBuilder (Tgstation.Server.Api.Models)   PosixSystemIdentityFactory (Tgstation.Server.Host.Security)   TestMergeParameters (Tgstation.Server.Api.Models)   
  c  
+
IrcProvider (Tgstation.Server.Host.Components.Chat.Providers)   Process (Tgstation.Server.Host.Core)   TestPlatformIdentifier (Tgstation.Server.Host.Core.Tests)   
IAdministrationClient (Tgstation.Server.Client)   IReattachInfoHandler (Tgstation.Server.Host.Components.Watchdog)   ProcessExecutor (Tgstation.Server.Host.Core)   TestPosixByondInstaller (Tgstation.Server.Host.Components.Byond.Tests)   
Channel (Tgstation.Server.Host.Components.Chat)   IApiClient (Tgstation.Server.Client)   IRepository (Tgstation.Server.Host.Components.Repository)   Program (Tgstation.Server.Host.Console)   TestPostWriteHandler (Tgstation.Server.Host.IO.Tests)   
ChannelMapping (Tgstation.Server.Host.Components.Chat)   IApiClientFactory (Tgstation.Server.Client)   IRepositoryClient (Tgstation.Server.Client.Components)   Program (Tgstation.Server.Host.Service)   TestProgram (Tgstation.Server.Host.Console.Tests)   
Chat (Tgstation.Server.Host.Components.Chat)   IApplication (Tgstation.Server.Host.Core)   IRepositoryManager (Tgstation.Server.Host.Components.Repository)   Program (Tgstation.Server.Host)   TestRights (Tgstation.Server.Api.Rights.Tests)   
ChatBot (Tgstation.Server.Api.Models)   IApplicationLifetime   IRequestLogger (Tgstation.Server.Client)   Program (ReleaseNotes)   TestServerClientFactory (Tgstation.Server.Client.Tests)   
ChatBot (Tgstation.Server.Api.Models.Internal)   IAsyncDelayer (Tgstation.Server.Host.Core)   IRestartHandler (Tgstation.Server.Host.Core)   Provider (Tgstation.Server.Host.Components.Chat.Providers)   TestServerFactory (Tgstation.Server.Host.Tests)   
ChatBot (Tgstation.Server.Host.Models)   IAuthenticationContext (Tgstation.Server.Host.Security)   IRestartRegistration (Tgstation.Server.Host.Core)   ProviderFactory (Tgstation.Server.Host.Components.Chat)   TestServerService (Tgstation.Server.Host.Service.Tests)   
ChatBotsClient (Tgstation.Server.Client.Components)   IAuthenticationContextFactory (Tgstation.Server.Host.Security)   IServer (Tgstation.Server.Host)   PullRequestsCommand (Tgstation.Server.Host.Components.Chat.Commands)   TestServiceCollectionExtensions (Tgstation.Server.Host.Core.Tests)   
ChatChannel (Tgstation.Server.Api.Models)   IByondClient (Tgstation.Server.Client.Components)   IServerClient (Tgstation.Server.Client)   
  r  
+
TestSetupWizard (Tgstation.Server.Host.Core.Tests)   
ChatChannel (Tgstation.Server.Host.Models)   IByondExecutableLock (Tgstation.Server.Host.Components.Byond)   IServerClientFactory (Tgstation.Server.Client)   TestSymlinkFactory (Tgstation.Server.Host.IO.Tests)   
ChatCommand (Tgstation.Server.Host.Components.Interop)   IByondInstaller (Tgstation.Server.Host.Components.Byond)   IServerControl (Tgstation.Server.Host.Core)   RateLimitException (Tgstation.Server.Client)   TestWatchdog (Tgstation.Server.Host.Watchdog.Tests)   
ChatConnectionStringBuilder (Tgstation.Server.Api.Models.Internal)   IByondManager (Tgstation.Server.Host.Components.Byond)   IServerFactory (Tgstation.Server.Host)   ReattachInfoHandler (Tgstation.Server.Host.Components)   TestWatchdogFactory (Tgstation.Server.Host.Watchdog.Tests)   
ChatController (Tgstation.Server.Host.Controllers)   IChat (Tgstation.Server.Host.Components.Chat)   ISessionController (Tgstation.Server.Host.Components.Watchdog)   ReattachInformation (Tgstation.Server.Host.Models)   TgsAuthorizeAttribute (Tgstation.Server.Host.Controllers)   
ChatFactory (Tgstation.Server.Host.Components.Chat)   IChatBotsClient (Tgstation.Server.Client.Components)   ISessionControllerFactory (Tgstation.Server.Host.Components.Watchdog)   ReattachInformation (Tgstation.Server.Host.Components.Watchdog)   Token (Tgstation.Server.Api.Models)   
ClaimsInjector (Tgstation.Server.Host.Security)   IChatFactory (Tgstation.Server.Host.Components.Chat)   ISetupWizard (Tgstation.Server.Host.Core)   ReattachInformationBase (Tgstation.Server.Host.Models)   TokenFactory (Tgstation.Server.Host.Security)   
ClientException (Tgstation.Server.Client)   IClaimsInjector (Tgstation.Server.Host.Security)   ISymlinkFactory (Tgstation.Server.Host.IO)   Repository (Tgstation.Server.Api.Models)   
  u  
+
CommandFactory (Tgstation.Server.Host.Components.Chat.Commands)   ICommand (Tgstation.Server.Host.Components.Chat.Commands)   ISynchronousIOManager (Tgstation.Server.Host.IO)   Repository (Tgstation.Server.Host.Components.Repository)   
CommCommand (Tgstation.Server.Host.Components.Interop)   ICommandFactory (Tgstation.Server.Host.Components.Chat.Commands)   ISystemIdentity (Tgstation.Server.Host.Security)   RepositoryClient (Tgstation.Server.Client.Components)   UnauthorizedException (Tgstation.Server.Client)   
CommContext (Tgstation.Server.Host.Components.Interop)   ICommContext (Tgstation.Server.Host.Components.Interop)   ISystemIdentityFactory (Tgstation.Server.Host.Security)   RepositoryController (Tgstation.Server.Host.Controllers)   UnrecognizedResponseException (Tgstation.Server.Client)   
CompileJob (Tgstation.Server.Api.Models.Internal)   ICommHandler (Tgstation.Server.Host.Components.Interop)   ITokenFactory (Tgstation.Server.Host.Security)   RepositoryManager (Tgstation.Server.Host.Components.Repository)   UpdatesConfiguration (Tgstation.Server.Host.Configuration)   
CompileJob (Tgstation.Server.Api.Models)   ICompileJobConsumer (Tgstation.Server.Host.Components.Compiler)   IUsersClient (Tgstation.Server.Client)   RepositorySettings (Tgstation.Server.Host.Models)   User (Tgstation.Server.Host.Components.Chat)   
CompileJob (Tgstation.Server.Host.Models)   IConfiguration (Tgstation.Server.Host.Components.StaticFiles)   IWatchdog (Tgstation.Server.Host.Watchdog)   RepositorySettings (Tgstation.Server.Api.Models.Internal)   User (Tgstation.Server.Api.Models.Internal)   
Configuration (Tgstation.Server.Host.Components.StaticFiles)   IConfigurationClient (Tgstation.Server.Client.Components)   IWatchdog (Tgstation.Server.Host.Components.Watchdog)   RequestTimeoutException (Tgstation.Server.Client)   User (Tgstation.Server.Api.Models)   
ConfigurationClient (Tgstation.Server.Client.Components)   IConsole (Tgstation.Server.Host.IO)   IWatchdogFactory (Tgstation.Server.Host.Watchdog)   ResolvingIOManager (Tgstation.Server.Host.IO)   User (Tgstation.Server.Host.Models)   
ConfigurationController (Tgstation.Server.Host.Controllers)   ICredentialsProvider (Tgstation.Server.Host.Components.Repository)   IWatchdogFactory (Tgstation.Server.Host.Components.Watchdog)   Response (Tgstation.Server.Host.Components.Chat)   UserController (Tgstation.Server.Host.Controllers)   
ConfigurationFile (Tgstation.Server.Api.Models)   ICryptographySuite (Tgstation.Server.Host.Security)   
  j  
+
RestartRegistration (Tgstation.Server.Host.Core)   UsersClient (Tgstation.Server.Client)   
ConfigurationTest (Tgstation.Server.Tests.Instance)   ICustomCommandHandler (Tgstation.Server.Host.Components.Chat)   RevInfoTestMerge (Tgstation.Server.Host.Models)   UserUpdate (Tgstation.Server.Api.Models)   
ConflictException (Tgstation.Server.Client)   IDatabaseContext (Tgstation.Server.Host.Models)   Job (Tgstation.Server.Api.Models.Internal)   RevisionCommand (Tgstation.Server.Host.Components.Chat.Commands)   
  v  
+
Console (Tgstation.Server.Host.IO)   IDatabaseContextFactory (Tgstation.Server.Host.Core)   Job (Tgstation.Server.Api.Models)   RevisionInformation (Tgstation.Server.Api.Models.Internal)   
Constants (Tgstation.Server.Host.Components.Interop)   IDatabaseSeeder (Tgstation.Server.Host.Models)   Job (Tgstation.Server.Host.Models)   RevisionInformation (Tgstation.Server.Api.Models)   VersionCommand (Tgstation.Server.Host.Components.Chat.Commands)   
Controller   IDBConnectionFactory (Tgstation.Server.Host.Core)   JobController (Tgstation.Server.Host.Controllers)   RevisionInformation (Tgstation.Server.Host.Models)   
  w  
+
ControlPanelConfiguration (Tgstation.Server.Host.Configuration)   IdentityCache (Tgstation.Server.Host.Security)   JobException (Tgstation.Server.Host.Core)   RightsHelper (Tgstation.Server.Api.Rights)   
CredentialsProvider (Tgstation.Server.Host.Components.Repository)   IdentityCacheObject (Tgstation.Server.Host.Security)   JobHandler (Tgstation.Server.Host.Core)   Routes (Tgstation.Server.Api)   Watchdog (Tgstation.Server.Host.Watchdog)   
CryptographySuite (Tgstation.Server.Host.Security)   IDesignTimeDbContextFactory   JobManager (Tgstation.Server.Host.Core)   
  s  
+
WatchdogBase (Tgstation.Server.Host.Components.Watchdog)   
CustomCommand (Tgstation.Server.Host.Components.Chat.Commands)   IDisposable   JobsClient (Tgstation.Server.Client.Components)   WatchdogFactory (Tgstation.Server.Host.Components.Watchdog)   
  d  
+
IDmbFactory (Tgstation.Server.Host.Components.Compiler)   JsonConverter   SemaphoreSlimContext (Tgstation.Server.Host.Core)   WatchdogFactory (Tgstation.Server.Host.Watchdog)   
IDmbProvider (Tgstation.Server.Host.Components)   JsonFile (Tgstation.Server.Host.Components.Interop)   Server (Tgstation.Server.Host)   WatchdogReattachInformation (Tgstation.Server.Host.Models)   
DatabaseConfiguration (Tgstation.Server.Host.Configuration)   IDreamDaemonClient (Tgstation.Server.Client.Components)   JsonSubFileList (Tgstation.Server.Host.Components.Interop)   ServerClient (Tgstation.Server.Client)   WatchdogReattachInformation (Tgstation.Server.Host.Components.Watchdog)   
DatabaseContext (Tgstation.Server.Host.Models)   IDreamMaker (Tgstation.Server.Host.Components.Compiler)   JsonTrackingContext (Tgstation.Server.Host.Components.Chat)   ServerClientFactory (Tgstation.Server.Client)   WatchdogReattachInformationBase (Tgstation.Server.Host.Models)   
DatabaseContextFactory (Tgstation.Server.Host.Core)   IDreamMakerClient (Tgstation.Server.Client.Components)   
  k  
+
ServerErrorException (Tgstation.Server.Client)   WindowsByondInstaller (Tgstation.Server.Host.Components.Byond)   
DatabaseSeeder (Tgstation.Server.Host.Models)   IEventConsumer (Tgstation.Server.Host.Components)   ServerFactory (Tgstation.Server.Host)   WindowsNetworkPromptReaper (Tgstation.Server.Host.Components.Watchdog)   
DBConnectionFactory (Tgstation.Server.Host.Core)   IGitHubClientFactory (Tgstation.Server.Host.Core)   KekCommand (Tgstation.Server.Host.Components.Chat.Commands)   ServerInformation (Tgstation.Server.Api.Models)   WindowsPostWriteHandler (Tgstation.Server.Host.IO)   
DbContext   IHostedService   
  l  
+
ServerService (Tgstation.Server.Host.Service)   WindowsSymlinkFactory (Tgstation.Server.Host.IO)   
DeadSessionController (Tgstation.Server.Host.Components.Watchdog)   IHttpClient (Tgstation.Server.Client)   ServerSideModifications (Tgstation.Server.Host.Components.StaticFiles)   WindowsSystemIdentity (Tgstation.Server.Host.Security)   
DefaultIOManager (Tgstation.Server.Host.IO)   IIdentityCache (Tgstation.Server.Host.Security)   LaunchResult (Tgstation.Server.Host.Components.Watchdog)   ServiceBase   WindowsSystemIdentityFactory (Tgstation.Server.Host.Security)   
DesignTimeDbContextFactoryHelpers (Tgstation.Server.Host.Models.Migrations)   IInstance (Tgstation.Server.Host.Components)   
  m  
+
ServiceCollectionExtensions (Tgstation.Server.Host.Core)   
DiscordConnectionStringBuilder (Tgstation.Server.Api.Models)   IInstanceClient (Tgstation.Server.Client.Components)   ServiceUnavailableException (Tgstation.Server.Client)   
Message (Tgstation.Server.Host.Components.Chat.Providers)   
+
a | b | c | d | e | f | g | h | i | j | k | l | m | n | p | r | s | t | u | v | w
+
+ + + + diff --git a/closed.png b/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/dir_009a3598be1715e27911e1588bdd551c.html b/dir_009a3598be1715e27911e1588bdd551c.html new file mode 100644 index 0000000000..b6230ab329 --- /dev/null +++ b/dir_009a3598be1715e27911e1588bdd551c.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tools/ReleaseNotes/obj/Debug/netcoreapp2.1 Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netcoreapp2.1 Directory Reference
+
+
+ + + + +

+Files

file  ReleaseNotes.AssemblyInfo.cs [code]
 
+
+ + + + diff --git a/dir_019c6d3af924151b681494cc466be1ac.html b/dir_019c6d3af924151b681494cc466be1ac.html new file mode 100644 index 0000000000..50039d6434 --- /dev/null +++ b/dir_019c6d3af924151b681494cc466be1ac.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/obj/Debug Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Debug Directory Reference
+
+
+ + + + +

+Directories

directory  netcoreapp2.1
 
+
+ + + + diff --git a/dir_02f69155ced6ccca99a24744a5273903.html b/dir_02f69155ced6ccca99a24744a5273903.html new file mode 100644 index 0000000000..1093114c4b --- /dev/null +++ b/dir_02f69155ced6ccca99a24744a5273903.html @@ -0,0 +1,132 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Watchdog Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Watchdog Directory Reference
+
+ + + + + diff --git a/dir_08963d262fa9e27215dce7b7c6e97f1b.html b/dir_08963d262fa9e27215dce7b7c6e97f1b.html new file mode 100644 index 0000000000..8c420335fc --- /dev/null +++ b/dir_08963d262fa9e27215dce7b7c6e97f1b.html @@ -0,0 +1,100 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Configuration Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Configuration Directory Reference
+
+ + + + + diff --git a/dir_0b6a380fe7fc1e1d640d1ac854fc3fb6.html b/dir_0b6a380fe7fc1e1d640d1ac854fc3fb6.html new file mode 100644 index 0000000000..7f9d6097b0 --- /dev/null +++ b/dir_0b6a380fe7fc1e1d640d1ac854fc3fb6.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/obj/Debug Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Debug Directory Reference
+
+
+ + + + +

+Directories

directory  netcoreapp2.1
 
+
+ + + + diff --git a/dir_0c9add60ab05c04ed8367ecaedf67c01.html b/dir_0c9add60ab05c04ed8367ecaedf67c01.html new file mode 100644 index 0000000000..cabeec09e4 --- /dev/null +++ b/dir_0c9add60ab05c04ed8367ecaedf67c01.html @@ -0,0 +1,144 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Migrations Directory Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  20180906135553_MSInitialCreate.cs [code]
 
file  20180906135553_MSInitialCreate.Designer.cs [code]
 
file  20180906143029_MYInitialCreate.cs [code]
 
file  20180906143029_MYInitialCreate.Designer.cs [code]
 
file  20180918020726_MYAddMinimumSecurity.cs [code]
 
file  20180918020726_MYAddMinimumSecurity.Designer.cs [code]
 
file  20180918021228_MSAddMinimumSecurity.cs [code]
 
file  20180918021228_MSAddMinimumSecurity.Designer.cs [code]
 
file  20180918204520_MYNullableAndForeignKeyCleanup.cs [code]
 
file  20180918204520_MYNullableAndForeignKeyCleanup.Designer.cs [code]
 
file  20180918205224_MSNullableAndForeignKeyCleanup.cs [code]
 
file  20180918205224_MSNullableAndForeignKeyCleanup.Designer.cs [code]
 
file  20180926033145_MSReattachCompileJobRequired.cs [code]
 
file  20180926033145_MSReattachCompileJobRequired.Designer.cs [code]
 
file  20180926034014_MYReattachCompileJobRequired.cs [code]
 
file  20180926034014_MYReattachCompileJobRequired.Designer.cs [code]
 
file  20181124231534_MSToggleTestmergeComments.cs [code]
 
file  20181124231534_MSToggleTestmergeComments.Designer.cs [code]
 
file  20181124231549_MYToggleTestmergeComments.cs [code]
 
file  20181124231549_MYToggleTestmergeComments.Designer.cs [code]
 
file  20190219041825_MSFixRevInfoIndex.cs [code]
 
file  20190219041825_MSFixRevInfoIndex.Designer.cs [code]
 
file  20190219042440_MYFixRevInfoIndex.cs [code]
 
file  20190219042440_MYFixRevInfoIndex.Designer.cs [code]
 
file  DesignTimeDbContextFactoryHelpers.cs [code]
 
file  MySqlDatabaseContextModelSnapshot.cs [code]
 
file  MySqlDesignTimeDbContextFactory.cs [code]
 
file  SqlServerDatabaseContextModelSnapshot.cs [code]
 
file  SqlServerDesignTimeDbContextFactory.cs [code]
 
+
+ + + + diff --git a/dir_0de875c2ee7edd4009e892c5045f7b3a.html b/dir_0de875c2ee7edd4009e892c5045f7b3a.html new file mode 100644 index 0000000000..7c52c77709 --- /dev/null +++ b/dir_0de875c2ee7edd4009e892c5045f7b3a.html @@ -0,0 +1,148 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Core Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Core Directory Reference
+
+ + + + + diff --git a/dir_0f5073360b9ba6d1522457c65eebe36a.html b/dir_0f5073360b9ba6d1522457c65eebe36a.html new file mode 100644 index 0000000000..e4597866e7 --- /dev/null +++ b/dir_0f5073360b9ba6d1522457c65eebe36a.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Interop Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Interop Directory Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + +

+Files

file  ChatCommand.cs [code]
 
file  CommCommand.cs [code]
 
file  CommContext.cs [code]
 
file  Constants.cs [code]
 
file  EventNotification.cs [code]
 
file  ICommContext.cs [code]
 
file  ICommHandler.cs [code]
 
file  JsonFile.cs [code]
 
file  JsonSubFileList.cs [code]
 
file  TestMerge.cs [code]
 
+
+ + + + diff --git a/dir_103b33cf1ab7043de6f87dfa61afa23f.html b/dir_103b33cf1ab7043de6f87dfa61afa23f.html new file mode 100644 index 0000000000..dfe8735c5e --- /dev/null +++ b/dir_103b33cf1ab7043de6f87dfa61afa23f.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Debug
 
+
+ + + + diff --git a/dir_1083fcf52a7d94a2efffb6ca88246acf.html b/dir_1083fcf52a7d94a2efffb6ca88246acf.html new file mode 100644 index 0000000000..e49824d27c --- /dev/null +++ b/dir_1083fcf52a7d94a2efffb6ca88246acf.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj/Debug/netcoreapp2.1 Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netcoreapp2.1 Directory Reference
+
+ + + + + diff --git a/dir_1302441b003a340c6a16c9bc1b51c94e.html b/dir_1302441b003a340c6a16c9bc1b51c94e.html new file mode 100644 index 0000000000..91b0981e53 --- /dev/null +++ b/dir_1302441b003a340c6a16c9bc1b51c94e.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Core Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Core Directory Reference
+
+ + + + + diff --git a/dir_177c182c6d1f29bec543c3fdad3072d5.html b/dir_177c182c6d1f29bec543c3fdad3072d5.html new file mode 100644 index 0000000000..dbe78e282c --- /dev/null +++ b/dir_177c182c6d1f29bec543c3fdad3072d5.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/obj Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Debug
 
+
+ + + + diff --git a/dir_18f2820c1d411453d7d989b812e41820.html b/dir_18f2820c1d411453d7d989b812e41820.html new file mode 100644 index 0000000000..b4d1bc8c59 --- /dev/null +++ b/dir_18f2820c1d411453d7d989b812e41820.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Service/obj/Debug/net471/win Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
win Directory Reference
+
+ + + + + diff --git a/dir_1cebbc1bce26b60bfb2ee26c80f86b02.html b/dir_1cebbc1bce26b60bfb2ee26c80f86b02.html new file mode 100644 index 0000000000..6ea3acfc41 --- /dev/null +++ b/dir_1cebbc1bce26b60bfb2ee26c80f86b02.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Service/Properties Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Properties Directory Reference
+
+
+ + + + +

+Files

file  AssemblyInfo.cs [code]
 
+
+ + + + diff --git a/dir_2133157f8312226ef9ea4ce42a802cf8.html b/dir_2133157f8312226ef9ea4ce42a802cf8.html new file mode 100644 index 0000000000..c5fb7a5057 --- /dev/null +++ b/dir_2133157f8312226ef9ea4ce42a802cf8.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Components Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Components Directory Reference
+
+
+ + + + + + + + +

+Directories

directory  Byond
 
directory  Chat
 
directory  Watchdog
 
+
+ + + + diff --git a/dir_2553b13cbb871373b0c30fb90d66217c.html b/dir_2553b13cbb871373b0c30fb90d66217c.html new file mode 100644 index 0000000000..1978232120 --- /dev/null +++ b/dir_2553b13cbb871373b0c30fb90d66217c.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/obj/Debug/netcoreapp2.1 Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netcoreapp2.1 Directory Reference
+
+ + + + + diff --git a/dir_26764abc66ddba24c5915db53fd68d23.html b/dir_26764abc66ddba24c5915db53fd68d23.html new file mode 100644 index 0000000000..29c5341f8d --- /dev/null +++ b/dir_26764abc66ddba24c5915db53fd68d23.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Service/obj/Debug Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Debug Directory Reference
+
+
+ + + + +

+Directories

directory  net471
 
+
+ + + + diff --git a/dir_2b9d136d9ffdab429a63a74fca28b300.html b/dir_2b9d136d9ffdab429a63a74fca28b300.html new file mode 100644 index 0000000000..a3a167a310 --- /dev/null +++ b/dir_2b9d136d9ffdab429a63a74fca28b300.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/obj/Debug Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Debug Directory Reference
+
+
+ + + + +

+Directories

directory  netcoreapp2.1
 
+
+ + + + diff --git a/dir_2e39d68cad3f83629c74ea67329dead9.html b/dir_2e39d68cad3f83629c74ea67329dead9.html new file mode 100644 index 0000000000..880d78f25d --- /dev/null +++ b/dir_2e39d68cad3f83629c74ea67329dead9.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tools/ReleaseNotes/obj/Debug Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Debug Directory Reference
+
+
+ + + + +

+Directories

directory  netcoreapp2.1
 
+
+ + + + diff --git a/dir_2e67631cb23401d696bcfdbe81f86f0f.html b/dir_2e67631cb23401d696bcfdbe81f86f0f.html new file mode 100644 index 0000000000..62db505c90 --- /dev/null +++ b/dir_2e67631cb23401d696bcfdbe81f86f0f.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/obj/Debug Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Debug Directory Reference
+
+
+ + + + +

+Directories

directory  netstandard2.0
 
+
+ + + + diff --git a/dir_2ea2465064f3ff030c6dd6700a328d91.html b/dir_2ea2465064f3ff030c6dd6700a328d91.html new file mode 100644 index 0000000000..07d1660ae2 --- /dev/null +++ b/dir_2ea2465064f3ff030c6dd6700a328d91.html @@ -0,0 +1,99 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api Directory Reference
+
+
+ + + + + + + + +

+Directories

directory  Models
 
directory  obj
 
directory  Rights
 
+ + + + + +

+Files

file  ApiHeaders.cs [code]
 
file  Routes.cs [code]
 
+
+ + + + diff --git a/dir_34761767c1c3cd212f9d2f80ea0828a8.html b/dir_34761767c1c3cd212f9d2f80ea0828a8.html new file mode 100644 index 0000000000..6d3c0644e2 --- /dev/null +++ b/dir_34761767c1c3cd212f9d2f80ea0828a8.html @@ -0,0 +1,119 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host Directory Reference
+
+
+ + + + + + + + + + + + + + + + + + +

+Directories

directory  Components
 
directory  Configuration
 
directory  Controllers
 
directory  Core
 
directory  IO
 
directory  Models
 
directory  obj
 
directory  Security
 
+ + + + + + + + + + + + + + + +

+Files

file  AssemblyInfo.cs [code]
 
file  IServer.cs [code]
 
file  IServerFactory.cs [code]
 
file  NativeMethods.cs [code]
 
file  Program.cs [code]
 
file  Server.cs [code]
 
file  ServerFactory.cs [code]
 
+
+ + + + diff --git a/dir_38cec1532eaed7aa1de0b599a76e3e80.html b/dir_38cec1532eaed7aa1de0b599a76e3e80.html new file mode 100644 index 0000000000..81c9a59c4c --- /dev/null +++ b/dir_38cec1532eaed7aa1de0b599a76e3e80.html @@ -0,0 +1,116 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Controllers Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Controllers Directory Reference
+
+ + + + + diff --git a/dir_446bdfc1cd19b69c11765b5665ebfd45.html b/dir_446bdfc1cd19b69c11765b5665ebfd45.html new file mode 100644 index 0000000000..105e122116 --- /dev/null +++ b/dir_446bdfc1cd19b69c11765b5665ebfd45.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/obj Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Debug
 
+
+ + + + diff --git a/dir_48968f849f7ddb061f7130e079fe66a6.html b/dir_48968f849f7ddb061f7130e079fe66a6.html new file mode 100644 index 0000000000..2df0e4e0e9 --- /dev/null +++ b/dir_48968f849f7ddb061f7130e079fe66a6.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/obj/Debug Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Debug Directory Reference
+
+
+ + + + +

+Directories

directory  netstandard2.0
 
+
+ + + + diff --git a/dir_49e56c817e5e54854c35e136979f97ca.html b/dir_49e56c817e5e54854c35e136979f97ca.html new file mode 100644 index 0000000000..c8217ab51c --- /dev/null +++ b/dir_49e56c817e5e54854c35e136979f97ca.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: docs Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
docs Directory Reference
+
+
+
+ + + + diff --git a/dir_4c0c7e2f4fc60f51e2347a2d8dda94ce.html b/dir_4c0c7e2f4fc60f51e2347a2d8dda94ce.html new file mode 100644 index 0000000000..cd6ab8de8e --- /dev/null +++ b/dir_4c0c7e2f4fc60f51e2347a2d8dda94ce.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/obj/Debug/netcoreapp2.1 Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netcoreapp2.1 Directory Reference
+
+ + + + + diff --git a/dir_4ddbd20a555bd1f3bf9569744c8989cc.html b/dir_4ddbd20a555bd1f3bf9569744c8989cc.html new file mode 100644 index 0000000000..d40348233a --- /dev/null +++ b/dir_4ddbd20a555bd1f3bf9569744c8989cc.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/StaticFiles Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
StaticFiles Directory Reference
+
+
+ + + + + + + + +

+Files

file  Configuration.cs [code]
 
file  IConfiguration.cs [code]
 
file  ServerSideModifications.cs [code]
 
+
+ + + + diff --git a/dir_4eeb864c4eec08c7d6b9d3b0352cfdde.html b/dir_4eeb864c4eec08c7d6b9d3b0352cfdde.html new file mode 100644 index 0000000000..f7c5864794 --- /dev/null +++ b/dir_4eeb864c4eec08c7d6b9d3b0352cfdde.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tools Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
tools Directory Reference
+
+
+ + + + +

+Directories

directory  ReleaseNotes
 
+
+ + + + diff --git a/dir_59425e443f801f1f2fd8bbe4959a3ccf.html b/dir_59425e443f801f1f2fd8bbe4959a3ccf.html new file mode 100644 index 0000000000..aab9cb7b86 --- /dev/null +++ b/dir_59425e443f801f1f2fd8bbe4959a3ccf.html @@ -0,0 +1,100 @@ + + + + + + + +tgstation-server: tests Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
tests Directory Reference
+
+
+ + + + + + + + + + + + + + + + +

+Directories

directory  Tgstation.Server.Api.Tests
 
directory  Tgstation.Server.Client.Tests
 
directory  Tgstation.Server.Host.Console.Tests
 
directory  Tgstation.Server.Host.Service.Tests
 
directory  Tgstation.Server.Host.Tests
 
directory  Tgstation.Server.Host.Watchdog.Tests
 
directory  Tgstation.Server.Tests
 
+
+ + + + diff --git a/dir_5d46d0c3fd1cac5ce1ea23751ad25792.html b/dir_5d46d0c3fd1cac5ce1ea23751ad25792.html new file mode 100644 index 0000000000..2b5bd313b0 --- /dev/null +++ b/dir_5d46d0c3fd1cac5ce1ea23751ad25792.html @@ -0,0 +1,98 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Repository Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Repository Directory Reference
+
+ + + + + diff --git a/dir_5d5b300b88421e3050db28dd037f6f39.html b/dir_5d5b300b88421e3050db28dd037f6f39.html new file mode 100644 index 0000000000..5392c8eb55 --- /dev/null +++ b/dir_5d5b300b88421e3050db28dd037f6f39.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Watchdog.Tests Directory Reference
+
+
+ + + + +

+Directories

directory  obj
 
+ + + + + +

+Files

file  TestWatchdog.cs [code]
 
file  TestWatchdogFactory.cs [code]
 
+
+ + + + diff --git a/dir_5e0b464d3b4be546c63c5188ffeb96e4.html b/dir_5e0b464d3b4be546c63c5188ffeb96e4.html new file mode 100644 index 0000000000..b2f8f7e3b3 --- /dev/null +++ b/dir_5e0b464d3b4be546c63c5188ffeb96e4.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Providers Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Providers Directory Reference
+
+
+ + + + + + + + + + +

+Files

file  DiscordProvider.cs [code]
 
file  IProvider.cs [code]
 
file  IrcProvider.cs [code]
 
file  Provider.cs [code]
 
+
+ + + + diff --git a/dir_61d7974a657c30011f457b376d274ee7.html b/dir_61d7974a657c30011f457b376d274ee7.html new file mode 100644 index 0000000000..4b257001b3 --- /dev/null +++ b/dir_61d7974a657c30011f457b376d274ee7.html @@ -0,0 +1,145 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Models Directory Reference
+
+
+ + + + +

+Directories

directory  Internal
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  Administration.cs [code]
 
file  Byond.cs [code]
 
file  ChatBot.cs [code]
 
file  ChatChannel.cs [code]
 
file  ChatProvider.cs [code]
 
file  CompileJob.cs [code]
 
file  ConfigurationFile.cs [code]
 
file  ConfigurationType.cs [code]
 
file  DiscordConnectionStringBuilder.cs [code]
 
file  DreamDaemon.cs [code]
 
file  DreamDaemonSecurity.cs [code]
 
file  DreamDaemonStatus.cs [code]
 
file  DreamMaker.cs [code]
 
file  ErrorMessage.cs [code]
 
file  Instance.cs [code]
 
file  InstanceUser.cs [code]
 
file  IrcConnectionStringBuilder.cs [code]
 
file  IrcPasswordType.cs [code]
 
file  Job.cs [code]
 
file  Repository.cs [code]
 
file  RevisionInformation.cs [code]
 
file  ServerInformation.cs [code]
 
file  TestMerge.cs [code]
 
file  TestMergeParameters.cs [code]
 
file  Token.cs [code]
 
file  User.cs [code]
 
file  UserUpdate.cs [code]
 
+
+ + + + diff --git a/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/dir_68267d1309a1af8e8297ef4c3efbcdba.html new file mode 100644 index 0000000000..2b0fa683b4 --- /dev/null +++ b/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -0,0 +1,98 @@ + + + + + + + +tgstation-server: src Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
src Directory Reference
+
+
+ + + + + + + + + + + + + + +

+Directories

directory  Tgstation.Server.Api
 
directory  Tgstation.Server.Client
 
directory  Tgstation.Server.Host
 
directory  Tgstation.Server.Host.Console
 
directory  Tgstation.Server.Host.Service
 
directory  Tgstation.Server.Host.Watchdog
 
+
+ + + + diff --git a/dir_685b5aa2d8a661ab5bc3f68b331887b0.html b/dir_685b5aa2d8a661ab5bc3f68b331887b0.html new file mode 100644 index 0000000000..a6126c4dcf --- /dev/null +++ b/dir_685b5aa2d8a661ab5bc3f68b331887b0.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Console/obj Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Debug
 
+
+ + + + diff --git a/dir_689f0584ee97ae9ca308532531d9c5d2.html b/dir_689f0584ee97ae9ca308532531d9c5d2.html new file mode 100644 index 0000000000..3c5c554b6a --- /dev/null +++ b/dir_689f0584ee97ae9ca308532531d9c5d2.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/obj Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Debug
 
+
+ + + + diff --git a/dir_6c60df807dd2523776d391746c262b4d.html b/dir_6c60df807dd2523776d391746c262b4d.html new file mode 100644 index 0000000000..4aa4e0b5d0 --- /dev/null +++ b/dir_6c60df807dd2523776d391746c262b4d.html @@ -0,0 +1,122 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/Components Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Components Directory Reference
+
+ + + + + diff --git a/dir_71f5cbd840fdd1dea9f035c7b1a066ee.html b/dir_71f5cbd840fdd1dea9f035c7b1a066ee.html new file mode 100644 index 0000000000..b4d5bff78a --- /dev/null +++ b/dir_71f5cbd840fdd1dea9f035c7b1a066ee.html @@ -0,0 +1,97 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Tests Directory Reference
+
+
+ + + + + + +

+Directories

directory  Components
 
directory  obj
 
+ + + + + +

+Files

file  TestApiClient.cs [code]
 
file  TestServerClientFactory.cs [code]
 
+
+ + + + diff --git a/dir_74017a19412e2f90cc6ad11fcac82495.html b/dir_74017a19412e2f90cc6ad11fcac82495.html new file mode 100644 index 0000000000..94b7020e03 --- /dev/null +++ b/dir_74017a19412e2f90cc6ad11fcac82495.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/obj Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Debug
 
+
+ + + + diff --git a/dir_78e87f8f095a8e3bb6ef1faef94cdb78.html b/dir_78e87f8f095a8e3bb6ef1faef94cdb78.html new file mode 100644 index 0000000000..91f2e780d2 --- /dev/null +++ b/dir_78e87f8f095a8e3bb6ef1faef94cdb78.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Service.Tests/obj/Debug Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Debug Directory Reference
+
+
+ + + + +

+Directories

directory  net471
 
+
+ + + + diff --git a/dir_7916dda968fadc8673161597975e4c5d.html b/dir_7916dda968fadc8673161597975e4c5d.html new file mode 100644 index 0000000000..d13e086d24 --- /dev/null +++ b/dir_7916dda968fadc8673161597975e4c5d.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/Rights Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Rights Directory Reference
+
+
+ + + + +

+Files

file  TestRights.cs [code]
 
+
+ + + + diff --git a/dir_7a3fd032a1362a6005a1fc9227a8dd86.html b/dir_7a3fd032a1362a6005a1fc9227a8dd86.html new file mode 100644 index 0000000000..d3af05448b --- /dev/null +++ b/dir_7a3fd032a1362a6005a1fc9227a8dd86.html @@ -0,0 +1,125 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Components Directory Reference
+
+
+ + + + + + + + + + + + + + + + +

+Directories

directory  Byond
 
directory  Chat
 
directory  Compiler
 
directory  Interop
 
directory  Repository
 
directory  StaticFiles
 
directory  Watchdog
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  EventConsumer.cs [code]
 
file  EventType.cs [code]
 
file  IDmbProvider.cs [code]
 
file  IEventConsumer.cs [code]
 
file  IInstance.cs [code]
 
file  IInstanceFactory.cs [code]
 
file  IInstanceManager.cs [code]
 
file  Instance.cs [code]
 
file  InstanceFactory.cs [code]
 
file  InstanceManager.cs [code]
 
file  ReattachInfoHandler.cs [code]
 
+
+ + + + diff --git a/dir_7a9487ad1984d08627fcf919e6f3d801.html b/dir_7a9487ad1984d08627fcf919e6f3d801.html new file mode 100644 index 0000000000..e5f468dcda --- /dev/null +++ b/dir_7a9487ad1984d08627fcf919e6f3d801.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Components/Watchdog Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Watchdog Directory Reference
+
+
+ + + + +

+Files

file  TestExperimentalWatchdog.cs [code]
 
+
+ + + + diff --git a/dir_7cd79c49f3850abc2141fa4adfdd1950.html b/dir_7cd79c49f3850abc2141fa4adfdd1950.html new file mode 100644 index 0000000000..a0cc013832 --- /dev/null +++ b/dir_7cd79c49f3850abc2141fa4adfdd1950.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat/Commands Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Commands Directory Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + +

+Files

file  BoolConverter.cs [code]
 
file  ByondCommand.cs [code]
 
file  CommandFactory.cs [code]
 
file  CustomCommand.cs [code]
 
file  ICommand.cs [code]
 
file  ICommandFactory.cs [code]
 
file  KekCommand.cs [code]
 
file  PullRequestsCommand.cs [code]
 
file  RevisionCommand.cs [code]
 
file  VersionCommand.cs [code]
 
+
+ + + + diff --git a/dir_860acef72838dce8d3d54c8f98bc464b.html b/dir_860acef72838dce8d3d54c8f98bc464b.html new file mode 100644 index 0000000000..37f6b656a4 --- /dev/null +++ b/dir_860acef72838dce8d3d54c8f98bc464b.html @@ -0,0 +1,108 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Rights Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Rights Directory Reference
+
+ + + + + diff --git a/dir_87039fa7b841d848ca75981d64237477.html b/dir_87039fa7b841d848ca75981d64237477.html new file mode 100644 index 0000000000..adb323dadf --- /dev/null +++ b/dir_87039fa7b841d848ca75981d64237477.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/obj/Debug Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Debug Directory Reference
+
+
+ + + + +

+Directories

directory  netcoreapp2.1
 
+
+ + + + diff --git a/dir_87a4f2035ed18e30422f4b60aebc4381.html b/dir_87a4f2035ed18e30422f4b60aebc4381.html new file mode 100644 index 0000000000..7f058037c9 --- /dev/null +++ b/dir_87a4f2035ed18e30422f4b60aebc4381.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/obj Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Debug
 
+
+ + + + diff --git a/dir_9257d56e926145e494a5aa5279887044.html b/dir_9257d56e926145e494a5aa5279887044.html new file mode 100644 index 0000000000..7b3fc71854 --- /dev/null +++ b/dir_9257d56e926145e494a5aa5279887044.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/obj/Debug/netcoreapp2.1 Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netcoreapp2.1 Directory Reference
+
+ + + + + diff --git a/dir_9826fb2d31585a830723e6d7089b5d0e.html b/dir_9826fb2d31585a830723e6d7089b5d0e.html new file mode 100644 index 0000000000..f06042c8fa --- /dev/null +++ b/dir_9826fb2d31585a830723e6d7089b5d0e.html @@ -0,0 +1,153 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client Directory Reference
+
+ + + + + diff --git a/dir_9aa5991638c9344778d807333cc0bd50.html b/dir_9aa5991638c9344778d807333cc0bd50.html new file mode 100644 index 0000000000..a598538b69 --- /dev/null +++ b/dir_9aa5991638c9344778d807333cc0bd50.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Service/obj/Debug/net471 Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
net471 Directory Reference
+
+
+ + + + +

+Directories

directory  win
 
+
+ + + + diff --git a/dir_a01d946a2e1b048dc542232ffcdcf572.html b/dir_a01d946a2e1b048dc542232ffcdcf572.html new file mode 100644 index 0000000000..890430073a --- /dev/null +++ b/dir_a01d946a2e1b048dc542232ffcdcf572.html @@ -0,0 +1,99 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Service Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Service Directory Reference
+
+
+ + + + + + +

+Directories

directory  obj
 
directory  Properties
 
+ + + + + + + +

+Files

file  GlobalSuppressions.cs [code]
 
file  Program.cs [code]
 
file  ServerService.cs [code]
 
+
+ + + + diff --git a/dir_a24b8c5f308a77f73e7a9e43c0f243d1.html b/dir_a24b8c5f308a77f73e7a9e43c0f243d1.html new file mode 100644 index 0000000000..2d7b70f7d5 --- /dev/null +++ b/dir_a24b8c5f308a77f73e7a9e43c0f243d1.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/Models Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Models Directory Reference
+
+
+ + + + +

+Files

file  TestIrcConnectionStringBuilder.cs [code]
 
+
+ + + + diff --git a/dir_a3714ab037275c284988fc90b4d045a5.html b/dir_a3714ab037275c284988fc90b4d045a5.html new file mode 100644 index 0000000000..d1b23ad2cb --- /dev/null +++ b/dir_a3714ab037275c284988fc90b4d045a5.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/obj/Debug/netstandard2.0 Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netstandard2.0 Directory Reference
+
+ + + + + diff --git a/dir_a3831f1c39821b3669f8a3808652203f.html b/dir_a3831f1c39821b3669f8a3808652203f.html new file mode 100644 index 0000000000..7b7c9052f8 --- /dev/null +++ b/dir_a3831f1c39821b3669f8a3808652203f.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Service.Tests/obj/Debug/net471 Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
net471 Directory Reference
+
+ + + + + diff --git a/dir_a44a562b5a12ef1c8495ac1a63e915ea.html b/dir_a44a562b5a12ef1c8495ac1a63e915ea.html new file mode 100644 index 0000000000..64ce775e6a --- /dev/null +++ b/dir_a44a562b5a12ef1c8495ac1a63e915ea.html @@ -0,0 +1,121 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Chat Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Chat Directory Reference
+
+
+ + + + + + +

+Directories

directory  Commands
 
directory  Providers
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  Channel.cs [code]
 
file  ChannelMapping.cs [code]
 
file  Chat.cs [code]
 
file  ChatFactory.cs [code]
 
file  IChat.cs [code]
 
file  IChatFactory.cs [code]
 
file  ICustomCommandHandler.cs [code]
 
file  IJsonTrackingContext.cs [code]
 
file  IProviderFactory.cs [code]
 
file  JsonTrackingContext.cs [code]
 
file  Message.cs [code]
 
file  ProviderFactory.cs [code]
 
file  Response.cs [code]
 
file  User.cs [code]
 
+
+ + + + diff --git a/dir_a51095d0142a80f0e979ff5bf5b861be.html b/dir_a51095d0142a80f0e979ff5bf5b861be.html new file mode 100644 index 0000000000..64dc14f790 --- /dev/null +++ b/dir_a51095d0142a80f0e979ff5bf5b861be.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Service/obj Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Debug
 
+
+ + + + diff --git a/dir_a536e49cdf631f66733cf2c9791144ce.html b/dir_a536e49cdf631f66733cf2c9791144ce.html new file mode 100644 index 0000000000..487722ebd8 --- /dev/null +++ b/dir_a536e49cdf631f66733cf2c9791144ce.html @@ -0,0 +1,112 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/IO Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IO Directory Reference
+
+ + + + + diff --git a/dir_a8807eef6592489c6a360d587f5b1a66.html b/dir_a8807eef6592489c6a360d587f5b1a66.html new file mode 100644 index 0000000000..3f18e8c613 --- /dev/null +++ b/dir_a8807eef6592489c6a360d587f5b1a66.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Console/obj/Debug/netcoreapp2.1 Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netcoreapp2.1 Directory Reference
+
+ + + + + diff --git a/dir_a99ad55e4d1fa76955df2299f3783cf0.html b/dir_a99ad55e4d1fa76955df2299f3783cf0.html new file mode 100644 index 0000000000..a8d44f39d5 --- /dev/null +++ b/dir_a99ad55e4d1fa76955df2299f3783cf0.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Components/Chat/Providers Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Providers Directory Reference
+
+
+ + + + +

+Files

file  TestDiscordProvider.cs [code]
 
+
+ + + + diff --git a/dir_b0d0d898ef448ca0a6a170a2896fa60e.html b/dir_b0d0d898ef448ca0a6a170a2896fa60e.html new file mode 100644 index 0000000000..e93fd6e967 --- /dev/null +++ b/dir_b0d0d898ef448ca0a6a170a2896fa60e.html @@ -0,0 +1,100 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Compiler Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Compiler Directory Reference
+
+
+ + + + + + + + + + + + + + + + +

+Files

file  DmbFactory.cs [code]
 
file  DmbProvider.cs [code]
 
file  DreamMaker.cs [code]
 
file  ICompileJobConsumer.cs [code]
 
file  IDmbFactory.cs [code]
 
file  IDreamMaker.cs [code]
 
file  TemporaryDmbProvider.cs [code]
 
+
+ + + + diff --git a/dir_b524b00ec2259c3c83b44909fd47f6e3.html b/dir_b524b00ec2259c3c83b44909fd47f6e3.html new file mode 100644 index 0000000000..e363a2e25d --- /dev/null +++ b/dir_b524b00ec2259c3c83b44909fd47f6e3.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Debug
 
+
+ + + + diff --git a/dir_b551a02288ef39e099594710382363a0.html b/dir_b551a02288ef39e099594710382363a0.html new file mode 100644 index 0000000000..a2e7d0fe5c --- /dev/null +++ b/dir_b551a02288ef39e099594710382363a0.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj/Debug/netcoreapp2.1 Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netcoreapp2.1 Directory Reference
+
+ + + + + diff --git a/dir_b6324197f7ac56e30d6189c3a45eec56.html b/dir_b6324197f7ac56e30d6189c3a45eec56.html new file mode 100644 index 0000000000..0cdc6c1325 --- /dev/null +++ b/dir_b6324197f7ac56e30d6189c3a45eec56.html @@ -0,0 +1,100 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Components/Byond Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Byond Directory Reference
+
+ + + + + diff --git a/dir_b87cbb2c60cf682b61fbfcceb9bced43.html b/dir_b87cbb2c60cf682b61fbfcceb9bced43.html new file mode 100644 index 0000000000..4104daeb6c --- /dev/null +++ b/dir_b87cbb2c60cf682b61fbfcceb9bced43.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/obj/Debug/netcoreapp2.1 Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netcoreapp2.1 Directory Reference
+
+ + + + + diff --git a/dir_b92573f47b933d7a3661c26d1af2098b.html b/dir_b92573f47b933d7a3661c26d1af2098b.html new file mode 100644 index 0000000000..be9864d555 --- /dev/null +++ b/dir_b92573f47b933d7a3661c26d1af2098b.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj/Debug Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Debug Directory Reference
+
+
+ + + + +

+Directories

directory  netcoreapp2.1
 
+
+ + + + diff --git a/dir_ba6c75cd9bd8b7a0d2af20e1cd5a80ab.html b/dir_ba6c75cd9bd8b7a0d2af20e1cd5a80ab.html new file mode 100644 index 0000000000..e6ab97830b --- /dev/null +++ b/dir_ba6c75cd9bd8b7a0d2af20e1cd5a80ab.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Components/Byond Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Byond Directory Reference
+
+
+ + + + +

+Files

file  TestPosixByondInstaller.cs [code]
 
+
+ + + + diff --git a/dir_be6161819238d55fa660c07ade960e53.html b/dir_be6161819238d55fa660c07ade960e53.html new file mode 100644 index 0000000000..66e47a7779 --- /dev/null +++ b/dir_be6161819238d55fa660c07ade960e53.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Console Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Console Directory Reference
+
+
+ + + + +

+Directories

directory  obj
 
+ + + + + +

+Files

file  AssemblyInfo.cs [code]
 
file  Program.cs [code]
 
+
+ + + + diff --git a/dir_be9f3ed3485a880e3213506a311823d1.html b/dir_be9f3ed3485a880e3213506a311823d1.html new file mode 100644 index 0000000000..492f3388b0 --- /dev/null +++ b/dir_be9f3ed3485a880e3213506a311823d1.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests/obj/Debug Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Debug Directory Reference
+
+
+ + + + +

+Directories

directory  netcoreapp2.1
 
+
+ + + + diff --git a/dir_bf23e1e49f40264f2966f02ed35d8142.html b/dir_bf23e1e49f40264f2966f02ed35d8142.html new file mode 100644 index 0000000000..c05ed6bf1e --- /dev/null +++ b/dir_bf23e1e49f40264f2966f02ed35d8142.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tools/ReleaseNotes/obj Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Debug
 
+
+ + + + diff --git a/dir_c037ac41e54cca303e35165acb6e013d.html b/dir_c037ac41e54cca303e35165acb6e013d.html new file mode 100644 index 0000000000..c91f66dc83 --- /dev/null +++ b/dir_c037ac41e54cca303e35165acb6e013d.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: tools/ReleaseNotes Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ReleaseNotes Directory Reference
+
+
+ + + + +

+Directories

directory  obj
 
+ + + +

+Files

file  Program.cs [code]
 
+
+ + + + diff --git a/dir_c2c4d4ee47e55233c6ea5db8b96422c6.html b/dir_c2c4d4ee47e55233c6ea5db8b96422c6.html new file mode 100644 index 0000000000..b618cbfddc --- /dev/null +++ b/dir_c2c4d4ee47e55233c6ea5db8b96422c6.html @@ -0,0 +1,137 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Models Directory Reference
+
+ + + + + diff --git a/dir_c50f9bd139317d744e2ee08ea9a734cc.html b/dir_c50f9bd139317d744e2ee08ea9a734cc.html new file mode 100644 index 0000000000..6934619a09 --- /dev/null +++ b/dir_c50f9bd139317d744e2ee08ea9a734cc.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Service.Tests/obj Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Debug
 
+
+ + + + diff --git a/dir_c5451d9d233744a5b09a29938f0cda9a.html b/dir_c5451d9d233744a5b09a29938f0cda9a.html new file mode 100644 index 0000000000..0f42e1b484 --- /dev/null +++ b/dir_c5451d9d233744a5b09a29938f0cda9a.html @@ -0,0 +1,122 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Security Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Security Directory Reference
+
+ + + + + diff --git a/dir_c5f98c05147bcbba78e71856485f5049.html b/dir_c5f98c05147bcbba78e71856485f5049.html new file mode 100644 index 0000000000..8b0b361e42 --- /dev/null +++ b/dir_c5f98c05147bcbba78e71856485f5049.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/obj/Debug/netcoreapp2.1 Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netcoreapp2.1 Directory Reference
+
+ + + + + diff --git a/dir_c648ff9d1a57dd8752f4ab2a7c68712c.html b/dir_c648ff9d1a57dd8752f4ab2a7c68712c.html new file mode 100644 index 0000000000..76feb121fc --- /dev/null +++ b/dir_c648ff9d1a57dd8752f4ab2a7c68712c.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Client.Tests/Components Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Components Directory Reference
+
+
+ + + + +

+Files

file  TestDreamDaemonClient.cs [code]
 
+
+ + + + diff --git a/dir_c9d0608eee53bfffcc33d03463bbe2db.html b/dir_c9d0608eee53bfffcc33d03463bbe2db.html new file mode 100644 index 0000000000..62ee6c7436 --- /dev/null +++ b/dir_c9d0608eee53bfffcc33d03463bbe2db.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/Instance Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Instance Directory Reference
+
+
+ + + + + + + + +

+Files

file  ByondTest.cs [code]
 
file  ConfigurationTest.cs [code]
 
file  InstanceTest.cs [code]
 
+
+ + + + diff --git a/dir_d8869fc9da5c696ed284d5c470b7210f.html b/dir_d8869fc9da5c696ed284d5c470b7210f.html new file mode 100644 index 0000000000..9a3029625a --- /dev/null +++ b/dir_d8869fc9da5c696ed284d5c470b7210f.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Components/Chat Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Chat Directory Reference
+
+
+ + + + +

+Directories

directory  Providers
 
+
+ + + + diff --git a/dir_d88de13ae4b64d4d0766b0c06f1a9edf.html b/dir_d88de13ae4b64d4d0766b0c06f1a9edf.html new file mode 100644 index 0000000000..64b41696a0 --- /dev/null +++ b/dir_d88de13ae4b64d4d0766b0c06f1a9edf.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/Security Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Security Directory Reference
+
+
+ + + + +

+Files

file  TestAuthenticationContext.cs [code]
 
+
+ + + + diff --git a/dir_d8a279f7113e0073f6cd65dd050c1475.html b/dir_d8a279f7113e0073f6cd65dd050c1475.html new file mode 100644 index 0000000000..a82f12013e --- /dev/null +++ b/dir_d8a279f7113e0073f6cd65dd050c1475.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/obj/Debug/netstandard2.0 Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netstandard2.0 Directory Reference
+
+
+ + + + +

+Files

file  Tgstation.Server.Api.AssemblyInfo.cs [code]
 
+
+ + + + diff --git a/dir_dbb0c65ea012faeef2906502dd42dfec.html b/dir_dbb0c65ea012faeef2906502dd42dfec.html new file mode 100644 index 0000000000..3705c7f713 --- /dev/null +++ b/dir_dbb0c65ea012faeef2906502dd42dfec.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Service.Tests Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Service.Tests Directory Reference
+
+
+ + + + +

+Directories

directory  obj
 
+ + + +

+Files

file  TestServerService.cs [code]
 
+
+ + + + diff --git a/dir_df215ce6792635a450ba5a94b5a17942.html b/dir_df215ce6792635a450ba5a94b5a17942.html new file mode 100644 index 0000000000..0c800ec45b --- /dev/null +++ b/dir_df215ce6792635a450ba5a94b5a17942.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests/IO Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
IO Directory Reference
+
+
+ + + + + + + + +

+Files

file  TestConsole.cs [code]
 
file  TestPostWriteHandler.cs [code]
 
 
+
+ + + + diff --git a/dir_e0c1bccb03249d93bc42ac0968ce43fd.html b/dir_e0c1bccb03249d93bc42ac0968ce43fd.html new file mode 100644 index 0000000000..fb0ddd3187 --- /dev/null +++ b/dir_e0c1bccb03249d93bc42ac0968ce43fd.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/obj Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Debug
 
+
+ + + + diff --git a/dir_e2ec88631ea78d6df8b37d27efa9bfe2.html b/dir_e2ec88631ea78d6df8b37d27efa9bfe2.html new file mode 100644 index 0000000000..c159a386eb --- /dev/null +++ b/dir_e2ec88631ea78d6df8b37d27efa9bfe2.html @@ -0,0 +1,97 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Api.Tests Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Api.Tests Directory Reference
+
+
+ + + + + + + + +

+Directories

directory  Models
 
directory  obj
 
directory  Rights
 
+ + + +

+Files

file  TestApiHeaders.cs [code]
 
+
+ + + + diff --git a/dir_e97d380c3eebaf0856a4ec180d749620.html b/dir_e97d380c3eebaf0856a4ec180d749620.html new file mode 100644 index 0000000000..be67b52590 --- /dev/null +++ b/dir_e97d380c3eebaf0856a4ec180d749620.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj/Debug Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Debug Directory Reference
+
+
+ + + + +

+Directories

directory  netcoreapp2.1
 
+
+ + + + diff --git a/dir_e9975c2f0de13509bd9fb4e31ae732ab.html b/dir_e9975c2f0de13509bd9fb4e31ae732ab.html new file mode 100644 index 0000000000..a439cf68a8 --- /dev/null +++ b/dir_e9975c2f0de13509bd9fb4e31ae732ab.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Console.Tests Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Console.Tests Directory Reference
+
+
+ + + + +

+Directories

directory  obj
 
+ + + +

+Files

file  TestProgram.cs [code]
 
+
+ + + + diff --git a/dir_ea36b5ab01ad6e8b607438a02ae91964.html b/dir_ea36b5ab01ad6e8b607438a02ae91964.html new file mode 100644 index 0000000000..9c70d2d3ff --- /dev/null +++ b/dir_ea36b5ab01ad6e8b607438a02ae91964.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/obj/Debug Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Debug Directory Reference
+
+
+ + + + +

+Directories

directory  netstandard2.0
 
+
+ + + + diff --git a/dir_eb7c70823ae63176c38851687b13349d.html b/dir_eb7c70823ae63176c38851687b13349d.html new file mode 100644 index 0000000000..6fd1a5e0fa --- /dev/null +++ b/dir_eb7c70823ae63176c38851687b13349d.html @@ -0,0 +1,101 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Tests Directory Reference
+
+
+ + + + + + +

+Directories

directory  Instance
 
directory  obj
 
+ + + + + + + + + +

+Files

file  AdministrationTest.cs [code]
 
file  InstanceManagerTest.cs [code]
 
file  IntegrationTest.cs [code]
 
file  TestingServer.cs [code]
 
+
+ + + + diff --git a/dir_ed78ff3b0fc4a7f5234cdb0b34617476.html b/dir_ed78ff3b0fc4a7f5234cdb0b34617476.html new file mode 100644 index 0000000000..448057961b --- /dev/null +++ b/dir_ed78ff3b0fc4a7f5234cdb0b34617476.html @@ -0,0 +1,101 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Host.Tests Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Tests Directory Reference
+
+
+ + + + + + + + + + + + +

+Directories

directory  Components
 
directory  Core
 
directory  IO
 
directory  obj
 
directory  Security
 
+ + + +

+Files

file  TestServerFactory.cs [code]
 
+
+ + + + diff --git a/dir_f0581cdd528a911f791df57d0f438bcb.html b/dir_f0581cdd528a911f791df57d0f438bcb.html new file mode 100644 index 0000000000..c042387231 --- /dev/null +++ b/dir_f0581cdd528a911f791df57d0f438bcb.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: tests/Tgstation.Server.Tests/obj Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Debug
 
+
+ + + + diff --git a/dir_f0d41009ce252337feb2b68822c4cfba.html b/dir_f0d41009ce252337feb2b68822c4cfba.html new file mode 100644 index 0000000000..97a05b044a --- /dev/null +++ b/dir_f0d41009ce252337feb2b68822c4cfba.html @@ -0,0 +1,101 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Watchdog Directory Reference
+
+
+ + + + +

+Directories

directory  obj
 
+ + + + + + + + + + + +

+Files

file  AssemblyInfo.cs [code]
 
file  IWatchdog.cs [code]
 
file  IWatchdogFactory.cs [code]
 
file  Watchdog.cs [code]
 
file  WatchdogFactory.cs [code]
 
+
+ + + + diff --git a/dir_f2a82faa4c4beef364292694cefca86d.html b/dir_f2a82faa4c4beef364292694cefca86d.html new file mode 100644 index 0000000000..9178cced29 --- /dev/null +++ b/dir_f2a82faa4c4beef364292694cefca86d.html @@ -0,0 +1,108 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Api/Models/Internal Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Internal Directory Reference
+
+ + + + + diff --git a/dir_f88948f9bde0555374e8a59a663bdfc9.html b/dir_f88948f9bde0555374e8a59a663bdfc9.html new file mode 100644 index 0000000000..c0d95efec3 --- /dev/null +++ b/dir_f88948f9bde0555374e8a59a663bdfc9.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Client/obj/Debug/netstandard2.0 Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
netstandard2.0 Directory Reference
+
+ + + + + diff --git a/dir_fab1362e86740a2c573ef875dd474a67.html b/dir_fab1362e86740a2c573ef875dd474a67.html new file mode 100644 index 0000000000..df65210da7 --- /dev/null +++ b/dir_fab1362e86740a2c573ef875dd474a67.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Console/obj/Debug Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Debug Directory Reference
+
+
+ + + + +

+Directories

directory  netcoreapp2.1
 
+
+ + + + diff --git a/dir_fb12273b841438c2f2c9b5bc5398c636.html b/dir_fb12273b841438c2f2c9b5bc5398c636.html new file mode 100644 index 0000000000..20f1d9da91 --- /dev/null +++ b/dir_fb12273b841438c2f2c9b5bc5398c636.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Watchdog/obj Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
obj Directory Reference
+
+
+ + + + +

+Directories

directory  Debug
 
+
+ + + + diff --git a/doc.png b/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/doxygen.css b/doxygen.css new file mode 100644 index 0000000000..e2515926c8 --- /dev/null +++ b/doxygen.css @@ -0,0 +1,1764 @@ +/* The standard CSS for doxygen 1.8.15 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #FFFFFF; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +/* +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTableHead tr { +} + +table.markdownTableBodyLeft td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft { + text-align: left +} + +th.markdownTableHeadRight { + text-align: right +} + +th.markdownTableHeadCenter { + text-align: center +} +*/ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doxygen.png b/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff17d807fd8aa003bed8bb2a69e8f0909592fd1 GIT binary patch literal 3779 zcmV;!4m|ORP)tMIv#Q0*~7*`IBSO7_x;@a8#Zk6_PeKR_s92J&)(m+);m9Iz3blw)z#Gi zP!9lj4$%+*>Hz@HCmM9L9|8c+0u=!H$O3?R0Kgx|#WP<6fKfC8fM-CQZT|_r@`>VO zX^Hgb|9cJqpdJA5$MCEK`F_2@2Y@s>^+;pF`~jdI0Pvr|vl4`=C)EH@1IFe7pdJ8F zH(qGi004~QnF)Ggga~8v08kGAs2hKTATxr7pwfNk|4#_AaT>w8P6TV+R2kbS$v==} zAjf`s0g#V8lB+b3)5oEI*q+{Yt$MZDruD2^;$+(_%Qn+%v0X-bJO=;@kiJ^ygLBnC z?1OVv_%aex1M@jKU|Z~$eI?PoF4Vj>fDzyo zAiLfpXY*a^Sj-S5D0S3@#V$sRW)g)_1e#$%8xdM>Jm7?!h zu0P2X=xoN>^!4DoPRgph2(2va07yfpXF+WH7EOg1GY%Zn z7~1A<(z7Q$ktEXhW_?GMpHp9l_UL18F3KOsxu81pqoBiNbFSGsof-W z6~eloMoz=4?OOnl2J268x5rOY`dCk0us(uS#Ud4yqOr@?=Q57a}tit|BhY>}~frH1sP`ScHS_d)oqH^lYy zZ%VP`#10MlE~P?cE(%(#(AUSv_T{+;t@$U}El}(1ig`vZo`Rm;+5&(AYzJ^Ae=h2X z@Re%vHwZU>|f0NI&%$*4eJweC5OROQrpPMA@*w|o z()A==l}(@bv^&>H1Ob3C=<^|hob?0+xJ?QQ3-ueQC}zy&JQNib!OqSO@-=>XzxlSF zAZ^U*1l6EEmg3r};_HY>&Jo_{dOPEFTWPmt=U&F#+0(O59^UIlHbNX+eF8UzyDR*T z(=5X$VF3!gm@RooS-&iiUYGG^`hMR(07zr_xP`d!^BH?uD>Phl8Rdifx3Af^Zr`Ku ztL+~HkVeL#bJ)7;`=>;{KNRvjmc}1}c58Sr#Treq=4{xo!ATy|c>iRSp4`dzMMVd@ zL8?uwXDY}Wqgh4mH`|$BTXpUIu6A1-cSq%hJw;@^Zr8TP=GMh*p(m(tN7@!^D~sl$ zz^tf4II4|};+irE$Fnm4NTc5%p{PRA`%}Zk`CE5?#h3|xcyQsS#iONZ z6H(@^i9td!$z~bZiJLTax$o>r(p}3o@< zyD7%(>ZYvy=6$U3e!F{Z`uSaYy`xQyl?b{}eg|G3&fz*`QH@mDUn)1%#5u`0m$%D} z?;tZ0u(mWeMV0QtzjgN!lT*pNRj;6510Wwx?Yi_=tYw|J#7@(Xe7ifDzXuK;JB;QO z#bg~K$cgm$@{QiL_3yr}y&~wuv=P=#O&Tj=Sr)aCUlYmZMcw?)T?c%0rUe1cS+o!qs_ zQ6Gp)-{)V!;=q}llyK3|^WeLKyjf%y;xHku;9(vM!j|~<7w1c*Mk-;P{T&yG) z@C-8E?QPynNQ<8f01D`2qexcVEIOU?y}MG)TAE6&VT5`rK8s(4PE;uQ92LTXUQ<>^ ztyQ@=@kRdh@ebUG^Z6NWWIL;_IGJ2ST>$t!$m$qvtj0Qmw8moN6GUV^!QKNK zHBXCtUH8)RY9++gH_TUV4^=-j$t}dD3qsN7GclJ^Zc&(j6&a_!$jCf}%c5ey`pm~1)@{yI3 zTdWyB+*X{JFw#z;PwRr5evb2!ueWF;v`B0HoUu4-(~aL=z;OXUUEtG`_$)Oxw6FKg zEzY`CyKaSBK3xt#8gA|r_|Kehn_HYVBMpEwbn9-fI*!u*eTA1ef8Mkl1=!jV4oYwWYM}i`A>_F4nhmlCIC6WLa zY%;4&@AlnaG11ejl61Jev21|r*m+?Kru3;1tFDl}#!OzUp6c>go4{C|^erwpG*&h6bspUPJag}oOkN2912Y3I?(eRc@U9>z#HPBHC?nps7H5!zP``90!Q1n80jo+B3TWXp!8Pe zwuKuLLI6l3Gv@+QH*Y}2wPLPQ1^EZhT#+Ed8q8Wo z1pTmIBxv14-{l&QVKxAyQF#8Q@NeJwWdKk>?cpiJLkJr+aZ!Me+Cfp!?FWSRf^j2k z73BRR{WSKaMkJ>1Nbx5dan5hg^_}O{Tj6u%iV%#QGz0Q@j{R^Ik)Z*+(YvY2ziBG)?AmJa|JV%4UT$k`hcOg5r9R?5>?o~JzK zJCrj&{i#hG>N7!B4kNX(%igb%kDj0fOQThC-8mtfap82PNRXr1D>lbgg)dYTQ(kbx z`Ee5kXG~Bh+BHQBf|kJEy6(ga%WfhvdQNDuOfQoe377l#ht&DrMGeIsI5C<&ai zWG$|hop2@@q5YDa)_-A?B02W;#fH!%k`daQLEItaJJ8Yf1L%8x;kg?)k)00P-lH+w z)5$QNV6r2$YtnV(4o=0^3{kmaXn*Dm0F*fU(@o)yVVjk|ln8ea6BMy%vZAhW9|wvA z8RoDkVoMEz1d>|5(k0Nw>22ZT){V<3$^C-cN+|~hKt2)){+l-?3m@-$c?-dlzQ)q- zZ)j%n^gerV{|+t}9m1_&&Ly!9$rtG4XX|WQ8`xYzGC~U@nYh~g(z9)bdAl#xH)xd5a=@|qql z|FzEil{P5(@gy!4ek05i$>`E^G~{;pnf6ftpLh$h#W?^#4UkPfa;;?bsIe&kz!+40 zI|6`F2n020)-r`pFaZ38F!S-lJM-o&inOw|66=GMeP@xQU5ghQH{~5Uh~TMTd;I9` z>YhVB`e^EVj*S7JF39ZgNf}A-0DwOcTT63ydN$I3b?yBQtUI*_fae~kPvzoD$zjX3 zoqBe#>12im4WzZ=f^4+u=!lA|#r%1`WB0-6*3BL#at`47#ebPpR|D1b)3BjT34nYY z%Ds%d?5$|{LgOIaRO{{oC&RK`O91$fqwM0(C_TALcozu*fWHb%%q&p-q{_8*2Zsi^ zh1ZCnr^UYa;4vQEtHk{~zi>wwMC5o{S=$P0X681y`SXwFH?Ewn{x-MOZynmc)JT5v zuHLwh;tLfxRrr%|k370}GofLl7thg>ACWWY&msqaVu&ry+`7+Ss>NL^%T1|z{IGMA zW-SKl=V-^{(f!Kf^#3(|T2W47d(%JVCI4JgRrT1pNz>+ietmFToNv^`gzC@&O-)+i zPQ~RwK8%C_vf%;%e>NyTp~dM5;!C|N0Q^6|CEb7Bw=Vz~$1#FA;Z*?mKSC)Hl-20s t8QyHj(g6VK0RYbl8UjE)0O0w=e*@m04r>stuEhWV002ovPDHLkV1hl;dM*F} literal 0 HcmV?d00001 diff --git a/dynsections.js b/dynsections.js new file mode 100644 index 0000000000..9bff51b8b4 --- /dev/null +++ b/dynsections.js @@ -0,0 +1,127 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + + +tgstation-server: File List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
File List
+
+
+
Here is a list of all files with brief descriptions:
+
[detail level 1234567]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 docs
  src
  Tgstation.Server.Api
  Tgstation.Server.Client
  Tgstation.Server.Host
  Tgstation.Server.Host.Console
  Tgstation.Server.Host.Service
  Tgstation.Server.Host.Watchdog
  tests
  Tgstation.Server.Api.Tests
  Tgstation.Server.Client.Tests
  Tgstation.Server.Host.Console.Tests
  Tgstation.Server.Host.Service.Tests
  Tgstation.Server.Host.Tests
  Tgstation.Server.Host.Watchdog.Tests
  Tgstation.Server.Tests
  tools
  ReleaseNotes
+
+
+ + + + diff --git a/folderclosed.png b/folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/functions.html b/functions.html new file mode 100644 index 0000000000..0831760331 --- /dev/null +++ b/functions.html @@ -0,0 +1,368 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- a -

+
+ + + + diff --git a/functions_b.html b/functions_b.html new file mode 100644 index 0000000000..631f9f5ab8 --- /dev/null +++ b/functions_b.html @@ -0,0 +1,218 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- b -

+
+ + + + diff --git a/functions_c.html b/functions_c.html new file mode 100644 index 0000000000..cc0b7261ed --- /dev/null +++ b/functions_c.html @@ -0,0 +1,719 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- c -

+
+ + + + diff --git a/functions_d.html b/functions_d.html new file mode 100644 index 0000000000..0d7dd6db4c --- /dev/null +++ b/functions_d.html @@ -0,0 +1,495 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- d -

+
+ + + + diff --git a/functions_e.html b/functions_e.html new file mode 100644 index 0000000000..c06480dd39 --- /dev/null +++ b/functions_e.html @@ -0,0 +1,139 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- e -

+
+ + + + diff --git a/functions_enum.html b/functions_enum.html new file mode 100644 index 0000000000..ca31ccb536 --- /dev/null +++ b/functions_enum.html @@ -0,0 +1,79 @@ + + + + + + + +tgstation-server: Class Members - Enumerations + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/functions_f.html b/functions_f.html new file mode 100644 index 0000000000..14fb4d9fde --- /dev/null +++ b/functions_f.html @@ -0,0 +1,108 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_func.html b/functions_func.html new file mode 100644 index 0000000000..54180474c3 --- /dev/null +++ b/functions_func.html @@ -0,0 +1,135 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_func_b.html b/functions_func_b.html new file mode 100644 index 0000000000..27dbe613dc --- /dev/null +++ b/functions_func_b.html @@ -0,0 +1,120 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- b -

+
+ + + + diff --git a/functions_func_c.html b/functions_func_c.html new file mode 100644 index 0000000000..56962fb2c2 --- /dev/null +++ b/functions_func_c.html @@ -0,0 +1,427 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- c -

+
+ + + + diff --git a/functions_func_d.html b/functions_func_d.html new file mode 100644 index 0000000000..e9bccf85fc --- /dev/null +++ b/functions_func_d.html @@ -0,0 +1,267 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- d -

+
+ + + + diff --git a/functions_func_e.html b/functions_func_e.html new file mode 100644 index 0000000000..072603a3e0 --- /dev/null +++ b/functions_func_e.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_func_f.html b/functions_func_f.html new file mode 100644 index 0000000000..df4c92b8d9 --- /dev/null +++ b/functions_func_f.html @@ -0,0 +1,100 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_func_g.html b/functions_func_g.html new file mode 100644 index 0000000000..1d2d127cee --- /dev/null +++ b/functions_func_g.html @@ -0,0 +1,218 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- g -

+
+ + + + diff --git a/functions_func_h.html b/functions_func_h.html new file mode 100644 index 0000000000..1ad73d7c57 --- /dev/null +++ b/functions_func_h.html @@ -0,0 +1,128 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- h -

+
+ + + + diff --git a/functions_func_i.html b/functions_func_i.html new file mode 100644 index 0000000000..278606675c --- /dev/null +++ b/functions_func_i.html @@ -0,0 +1,179 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- i -

+
+ + + + diff --git a/functions_func_j.html b/functions_func_j.html new file mode 100644 index 0000000000..1322f937d5 --- /dev/null +++ b/functions_func_j.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_func_k.html b/functions_func_k.html new file mode 100644 index 0000000000..988e04f83f --- /dev/null +++ b/functions_func_k.html @@ -0,0 +1,83 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_func_l.html b/functions_func_l.html new file mode 100644 index 0000000000..551e05410c --- /dev/null +++ b/functions_func_l.html @@ -0,0 +1,164 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- l -

+
+ + + + diff --git a/functions_func_m.html b/functions_func_m.html new file mode 100644 index 0000000000..80758c46dd --- /dev/null +++ b/functions_func_m.html @@ -0,0 +1,130 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- m -

+
+ + + + diff --git a/functions_func_n.html b/functions_func_n.html new file mode 100644 index 0000000000..0156aafdb9 --- /dev/null +++ b/functions_func_n.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_func_o.html b/functions_func_o.html new file mode 100644 index 0000000000..1ba0effd8e --- /dev/null +++ b/functions_func_o.html @@ -0,0 +1,108 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_func_p.html b/functions_func_p.html new file mode 100644 index 0000000000..7f810ff898 --- /dev/null +++ b/functions_func_p.html @@ -0,0 +1,129 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_func_r.html b/functions_func_r.html new file mode 100644 index 0000000000..fe383f95ce --- /dev/null +++ b/functions_func_r.html @@ -0,0 +1,294 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- r -

+
+ + + + diff --git a/functions_func_s.html b/functions_func_s.html new file mode 100644 index 0000000000..28ed472de7 --- /dev/null +++ b/functions_func_s.html @@ -0,0 +1,275 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- s -

+
+ + + + diff --git a/functions_func_t.html b/functions_func_t.html new file mode 100644 index 0000000000..7c8a6382b9 --- /dev/null +++ b/functions_func_t.html @@ -0,0 +1,296 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- t -

+
+ + + + diff --git a/functions_func_u.html b/functions_func_u.html new file mode 100644 index 0000000000..0b24b39f1b --- /dev/null +++ b/functions_func_u.html @@ -0,0 +1,170 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- u -

+
+ + + + diff --git a/functions_func_v.html b/functions_func_v.html new file mode 100644 index 0000000000..b61d3bf4bc --- /dev/null +++ b/functions_func_v.html @@ -0,0 +1,97 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_func_w.html b/functions_func_w.html new file mode 100644 index 0000000000..634fd3e6e8 --- /dev/null +++ b/functions_func_w.html @@ -0,0 +1,139 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- w -

+
+ + + + diff --git a/functions_func_z.html b/functions_func_z.html new file mode 100644 index 0000000000..cc9b01e92f --- /dev/null +++ b/functions_func_z.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_func_~.html b/functions_func_~.html new file mode 100644 index 0000000000..6fcf368135 --- /dev/null +++ b/functions_func_~.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- ~ -

+
+ + + + diff --git a/functions_g.html b/functions_g.html new file mode 100644 index 0000000000..c9277b5d7d --- /dev/null +++ b/functions_g.html @@ -0,0 +1,259 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- g -

+
+ + + + diff --git a/functions_h.html b/functions_h.html new file mode 100644 index 0000000000..7527636f6b --- /dev/null +++ b/functions_h.html @@ -0,0 +1,174 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- h -

+
+ + + + diff --git a/functions_i.html b/functions_i.html new file mode 100644 index 0000000000..5f0ff123bd --- /dev/null +++ b/functions_i.html @@ -0,0 +1,397 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- i -

+
+ + + + diff --git a/functions_j.html b/functions_j.html new file mode 100644 index 0000000000..47d2f6c4c9 --- /dev/null +++ b/functions_j.html @@ -0,0 +1,145 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- j -

+
+ + + + diff --git a/functions_k.html b/functions_k.html new file mode 100644 index 0000000000..8ea17f622c --- /dev/null +++ b/functions_k.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_l.html b/functions_l.html new file mode 100644 index 0000000000..4a3cb016f0 --- /dev/null +++ b/functions_l.html @@ -0,0 +1,254 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- l -

+
+ + + + diff --git a/functions_m.html b/functions_m.html new file mode 100644 index 0000000000..5d7ed0bcaf --- /dev/null +++ b/functions_m.html @@ -0,0 +1,183 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- m -

+
+ + + + diff --git a/functions_n.html b/functions_n.html new file mode 100644 index 0000000000..1f4eff3ea3 --- /dev/null +++ b/functions_n.html @@ -0,0 +1,143 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- n -

+
+ + + + diff --git a/functions_o.html b/functions_o.html new file mode 100644 index 0000000000..00c4560938 --- /dev/null +++ b/functions_o.html @@ -0,0 +1,146 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- o -

+
+ + + + diff --git a/functions_p.html b/functions_p.html new file mode 100644 index 0000000000..979c8cc400 --- /dev/null +++ b/functions_p.html @@ -0,0 +1,268 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- p -

+
+ + + + diff --git a/functions_prop.html b/functions_prop.html new file mode 100644 index 0000000000..2bc77f1e2e --- /dev/null +++ b/functions_prop.html @@ -0,0 +1,198 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- a -

+
+ + + + diff --git a/functions_prop_b.html b/functions_prop_b.html new file mode 100644 index 0000000000..b1402a2341 --- /dev/null +++ b/functions_prop_b.html @@ -0,0 +1,114 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_prop_c.html b/functions_prop_c.html new file mode 100644 index 0000000000..e56fc30c95 --- /dev/null +++ b/functions_prop_c.html @@ -0,0 +1,230 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- c -

+
+ + + + diff --git a/functions_prop_d.html b/functions_prop_d.html new file mode 100644 index 0000000000..03080ef07b --- /dev/null +++ b/functions_prop_d.html @@ -0,0 +1,166 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- d -

+
+ + + + diff --git a/functions_prop_e.html b/functions_prop_e.html new file mode 100644 index 0000000000..c207f5db60 --- /dev/null +++ b/functions_prop_e.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_prop_f.html b/functions_prop_f.html new file mode 100644 index 0000000000..87dbac364d --- /dev/null +++ b/functions_prop_f.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_prop_g.html b/functions_prop_g.html new file mode 100644 index 0000000000..d43243778c --- /dev/null +++ b/functions_prop_g.html @@ -0,0 +1,99 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_prop_h.html b/functions_prop_h.html new file mode 100644 index 0000000000..048281a16d --- /dev/null +++ b/functions_prop_h.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_prop_i.html b/functions_prop_i.html new file mode 100644 index 0000000000..7617f5c81a --- /dev/null +++ b/functions_prop_i.html @@ -0,0 +1,197 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- i -

+
+ + + + diff --git a/functions_prop_j.html b/functions_prop_j.html new file mode 100644 index 0000000000..748a1c122e --- /dev/null +++ b/functions_prop_j.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_prop_l.html b/functions_prop_l.html new file mode 100644 index 0000000000..5d1cc1a531 --- /dev/null +++ b/functions_prop_l.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_prop_m.html b/functions_prop_m.html new file mode 100644 index 0000000000..eb5de91f53 --- /dev/null +++ b/functions_prop_m.html @@ -0,0 +1,111 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_prop_n.html b/functions_prop_n.html new file mode 100644 index 0000000000..601daec9f4 --- /dev/null +++ b/functions_prop_n.html @@ -0,0 +1,100 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_prop_o.html b/functions_prop_o.html new file mode 100644 index 0000000000..570caac28f --- /dev/null +++ b/functions_prop_o.html @@ -0,0 +1,99 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_prop_p.html b/functions_prop_p.html new file mode 100644 index 0000000000..194b1c0e08 --- /dev/null +++ b/functions_prop_p.html @@ -0,0 +1,155 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- p -

+
+ + + + diff --git a/functions_prop_r.html b/functions_prop_r.html new file mode 100644 index 0000000000..49a8da63f5 --- /dev/null +++ b/functions_prop_r.html @@ -0,0 +1,161 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- r -

+
+ + + + diff --git a/functions_prop_s.html b/functions_prop_s.html new file mode 100644 index 0000000000..25af7e9bcc --- /dev/null +++ b/functions_prop_s.html @@ -0,0 +1,154 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- s -

+
+ + + + diff --git a/functions_prop_t.html b/functions_prop_t.html new file mode 100644 index 0000000000..fef775174e --- /dev/null +++ b/functions_prop_t.html @@ -0,0 +1,131 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_prop_u.html b/functions_prop_u.html new file mode 100644 index 0000000000..c830ce0cad --- /dev/null +++ b/functions_prop_u.html @@ -0,0 +1,124 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_prop_v.html b/functions_prop_v.html new file mode 100644 index 0000000000..4e638c0336 --- /dev/null +++ b/functions_prop_v.html @@ -0,0 +1,100 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_prop_w.html b/functions_prop_w.html new file mode 100644 index 0000000000..8242de84c0 --- /dev/null +++ b/functions_prop_w.html @@ -0,0 +1,98 @@ + + + + + + + +tgstation-server: Class Members - Properties + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_q.html b/functions_q.html new file mode 100644 index 0000000000..a25675a34a --- /dev/null +++ b/functions_q.html @@ -0,0 +1,81 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- q -

+
+ + + + diff --git a/functions_r.html b/functions_r.html new file mode 100644 index 0000000000..24f4a190ba --- /dev/null +++ b/functions_r.html @@ -0,0 +1,446 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- r -

+
+ + + + diff --git a/functions_s.html b/functions_s.html new file mode 100644 index 0000000000..3ab5c3683f --- /dev/null +++ b/functions_s.html @@ -0,0 +1,422 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- s -

+
+ + + + diff --git a/functions_t.html b/functions_t.html new file mode 100644 index 0000000000..1cc1a971bd --- /dev/null +++ b/functions_t.html @@ -0,0 +1,390 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- t -

+
+ + + + diff --git a/functions_u.html b/functions_u.html new file mode 100644 index 0000000000..9c6788c163 --- /dev/null +++ b/functions_u.html @@ -0,0 +1,239 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- u -

+
+ + + + diff --git a/functions_v.html b/functions_v.html new file mode 100644 index 0000000000..c057f7fcce --- /dev/null +++ b/functions_v.html @@ -0,0 +1,124 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- v -

+
+ + + + diff --git a/functions_vars.html b/functions_vars.html new file mode 100644 index 0000000000..174c1ca618 --- /dev/null +++ b/functions_vars.html @@ -0,0 +1,199 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- a -

+
+ + + + diff --git a/functions_vars_b.html b/functions_vars_b.html new file mode 100644 index 0000000000..29b6be0fc7 --- /dev/null +++ b/functions_vars_b.html @@ -0,0 +1,146 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- b -

+
+ + + + diff --git a/functions_vars_c.html b/functions_vars_c.html new file mode 100644 index 0000000000..68de04608e --- /dev/null +++ b/functions_vars_c.html @@ -0,0 +1,219 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- c -

+
+ + + + diff --git a/functions_vars_d.html b/functions_vars_d.html new file mode 100644 index 0000000000..94c71f94da --- /dev/null +++ b/functions_vars_d.html @@ -0,0 +1,236 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- d -

+
+ + + + diff --git a/functions_vars_e.html b/functions_vars_e.html new file mode 100644 index 0000000000..7ce569cb2e --- /dev/null +++ b/functions_vars_e.html @@ -0,0 +1,95 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_vars_f.html b/functions_vars_f.html new file mode 100644 index 0000000000..b80b98e0d6 --- /dev/null +++ b/functions_vars_f.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- f -

+
+ + + + diff --git a/functions_vars_g.html b/functions_vars_g.html new file mode 100644 index 0000000000..92ad11dacb --- /dev/null +++ b/functions_vars_g.html @@ -0,0 +1,98 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_vars_h.html b/functions_vars_h.html new file mode 100644 index 0000000000..31ca76a601 --- /dev/null +++ b/functions_vars_h.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_vars_i.html b/functions_vars_i.html new file mode 100644 index 0000000000..30921f5f36 --- /dev/null +++ b/functions_vars_i.html @@ -0,0 +1,179 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- i -

+
+ + + + diff --git a/functions_vars_j.html b/functions_vars_j.html new file mode 100644 index 0000000000..e081026eb2 --- /dev/null +++ b/functions_vars_j.html @@ -0,0 +1,106 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_vars_k.html b/functions_vars_k.html new file mode 100644 index 0000000000..1235f63296 --- /dev/null +++ b/functions_vars_k.html @@ -0,0 +1,81 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_vars_l.html b/functions_vars_l.html new file mode 100644 index 0000000000..c8ff6081e5 --- /dev/null +++ b/functions_vars_l.html @@ -0,0 +1,129 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- l -

+
+ + + + diff --git a/functions_vars_m.html b/functions_vars_m.html new file mode 100644 index 0000000000..9ed0743e76 --- /dev/null +++ b/functions_vars_m.html @@ -0,0 +1,98 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_vars_n.html b/functions_vars_n.html new file mode 100644 index 0000000000..eb521a5ae4 --- /dev/null +++ b/functions_vars_n.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_vars_o.html b/functions_vars_o.html new file mode 100644 index 0000000000..bd8854ad8c --- /dev/null +++ b/functions_vars_o.html @@ -0,0 +1,99 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_vars_p.html b/functions_vars_p.html new file mode 100644 index 0000000000..c3005b94fe --- /dev/null +++ b/functions_vars_p.html @@ -0,0 +1,142 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- p -

+
+ + + + diff --git a/functions_vars_q.html b/functions_vars_q.html new file mode 100644 index 0000000000..9dec73cbf1 --- /dev/null +++ b/functions_vars_q.html @@ -0,0 +1,81 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- q -

+
+ + + + diff --git a/functions_vars_r.html b/functions_vars_r.html new file mode 100644 index 0000000000..7cad470f19 --- /dev/null +++ b/functions_vars_r.html @@ -0,0 +1,161 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- r -

+
+ + + + diff --git a/functions_vars_s.html b/functions_vars_s.html new file mode 100644 index 0000000000..37082b8972 --- /dev/null +++ b/functions_vars_s.html @@ -0,0 +1,153 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- s -

+
+ + + + diff --git a/functions_vars_t.html b/functions_vars_t.html new file mode 100644 index 0000000000..f41f3538c7 --- /dev/null +++ b/functions_vars_t.html @@ -0,0 +1,125 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_vars_u.html b/functions_vars_u.html new file mode 100644 index 0000000000..8df5161c4f --- /dev/null +++ b/functions_vars_u.html @@ -0,0 +1,111 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_vars_v.html b/functions_vars_v.html new file mode 100644 index 0000000000..900e177079 --- /dev/null +++ b/functions_vars_v.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_vars_w.html b/functions_vars_w.html new file mode 100644 index 0000000000..70b4458066 --- /dev/null +++ b/functions_vars_w.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/functions_w.html b/functions_w.html new file mode 100644 index 0000000000..b1a9eed60e --- /dev/null +++ b/functions_w.html @@ -0,0 +1,177 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- w -

+
+ + + + diff --git a/functions_z.html b/functions_z.html new file mode 100644 index 0000000000..487912f26a --- /dev/null +++ b/functions_z.html @@ -0,0 +1,82 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- z -

+
+ + + + diff --git a/functions_~.html b/functions_~.html new file mode 100644 index 0000000000..4011a3fb89 --- /dev/null +++ b/functions_~.html @@ -0,0 +1,84 @@ + + + + + + + +tgstation-server: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- ~ -

+
+ + + + diff --git a/hierarchy.html b/hierarchy.html new file mode 100644 index 0000000000..ff321b2a89 --- /dev/null +++ b/hierarchy.html @@ -0,0 +1,482 @@ + + + + + + + +tgstation-server: Class Hierarchy + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Class Hierarchy
+
+
+
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.Api.ApiHeadersRepresents the header that must be present for every server request
 CTgstation.Server.Host.Core.ApplicationBuilderExtensionsExtensions for IApplicationBuilder
 CAuthorizeAttribute
 CAutoGeneratedProgram
 CTgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.BadConfig1
 CTgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.BadConfig2
 CTgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.BadConfig3
 CTgstation.Server.Api.Models.ByondRepresents a BYOND installation
 CTgstation.Server.Tests.Instance.ByondTest
 CTgstation.Server.Host.Components.Chat.ChannelRepresents a Providers.IProvider channel
 CTgstation.Server.Host.Components.Chat.ChannelMappingRepresents a mapping of a Channel.RealId
 CTgstation.Server.Api.Models.Internal.ChatBotManage the server chat bots
 CTgstation.Server.Api.Models.ChatChannelIndicates a chat channel
 CTgstation.Server.Host.Components.Interop.ChatCommandRepresents a chat command to be handled by DD
 CTgstation.Server.Api.Models.Internal.ChatConnectionStringBuilderHelper for building ChatBot.ConnectionStrings
 CTgstation.Server.Host.Components.Interop.CommCommandRepresents a command from DD
 CTgstation.Server.Api.Models.Internal.CompileJobRepresents a run of DreamMaker
 CTgstation.Server.Api.Models.ConfigurationFileRepresents a game configuration file. Create and delete actions uncerimonuously overwrite/delete files
 CTgstation.Server.Tests.Instance.ConfigurationTest
 CTgstation.Server.Host.Components.Interop.ConstantsConstants used for communication with the DMAPI
 CController
 CTgstation.Server.Host.Configuration.ControlPanelConfigurationConfiguration options for the web control panel
 CTgstation.Server.Host.Configuration.DatabaseConfigurationConfiguration options for the Models.DatabaseContext<TParentContext>
 CTgstation.Server.Host.Models.DatabaseContext< MySqlDatabaseContext >
 CTgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >
 CDbContext
 CTgstation.Server.Host.Models.Migrations.DesignTimeDbContextFactoryHelpersContains helpers for creating design time DatabaseContext<TParentContext>s
 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.Api.Models.ErrorMessageRepresents an error message returned by the server
 CTgstation.Server.Host.Components.Interop.EventNotificationFor notifying DD of EventTypes
 CTgstation.Server.Host.Configuration.FileLoggingConfigurationFile logging configuration options
 CTgstation.Server.Host.Configuration.GeneralConfigurationGeneral configuration options
 CTgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.GoodConfig
 CTgstation.Server.Client.IAdministrationClientFor managing server administration
 CTgstation.Server.Client.IApiClientFactoryFor creating IApiClients
 CTgstation.Server.Host.Core.IApplicationConfigures the ASP.NET Core web application
 CIApplicationLifetime
 CTgstation.Server.Host.Core.IAsyncDelayerFor waiting asynchronously
 CTgstation.Server.Host.Security.IAuthenticationContextFactoryFor creating and accessing authentication contexts
 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.Client.Components.IChatBotsClientFor managing the chat bots
 CTgstation.Server.Host.Components.Chat.IChatFactoryFor creating IChats
 CTgstation.Server.Host.Security.IClaimsInjectorFor injecting 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.Host.Components.Interop.ICommHandlerHandles CommCommands
 CTgstation.Server.Client.Components.IConfigurationClientFor managing ConfigurationFile files
 CTgstation.Server.Host.IO.IConsoleAbstraction for 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 IJsonTrackingContext
 CTgstation.Server.Host.Models.IDatabaseContextRepresents the database
 CTgstation.Server.Host.Core.IDatabaseContextFactoryFactory for scoping usage of IDatabaseContexts. Meant for use by Components
 CTgstation.Server.Host.Models.IDatabaseSeederFor initially seeding a database
 CTgstation.Server.Host.Core.IDBConnectionFactoryFor creating DbConnection
 CIDesignTimeDbContextFactory
 CIDisposable
 CTgstation.Server.Host.Components.Compiler.IDmbFactoryFactory for IDmbProviders
 CTgstation.Server.Client.Components.IDreamDaemonClientFor managing DreamDaemon
 CTgstation.Server.Host.Components.Compiler.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.Host.Components.IInstanceManagerFor managing IInstances
 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.Watchdog.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
 CTgstation.Server.Host.Core.IPlatformIdentifierFor identifying the current platform
 CTgstation.Server.Host.IO.IPostWriteHandlerHandles changing file modes/permissions after writing
 CTgstation.Server.Host.Core.IProcessExecutorFor launching IProcess'
 CTgstation.Server.Host.Components.Chat.IProviderFactoryFactory for IProviders
 CTgstation.Server.Host.Components.Watchdog.IReattachInfoHandlerHandles saving and loading WatchdogReattachInformation
 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
 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.Components.Watchdog.ISessionControllerFactoryFactory for ISessionControllers
 CTgstation.Server.Host.Core.ISetupWizardThe command line Configuration setup wizard
 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.Api.Models.Internal.JobRepresents a long running job
 CJsonConverter
 CTgstation.Server.Host.Components.Interop.JsonFileRepresentation of the initial json passed to DreamDaemon
 CTgstation.Server.Host.Components.Interop.JsonSubFileListInformation used in for reattaching and interop
 CTgstation.Server.Host.Components.Watchdog.LaunchResultRepresents the result of trying to start a DD process
 CTgstation.Server.Host.Components.Chat.Providers.MessageRepresents a message recieved by a IProvider
 CMigration
 CTgstation.Server.Host.Controllers.ModelController< Administration >
 CTgstation.Server.Host.Controllers.ModelController< Api.Models.Byond >
 CTgstation.Server.Host.Controllers.ModelController< Api.Models.ChatBot >
 CTgstation.Server.Host.Controllers.ModelController< Api.Models.Instance >
 CTgstation.Server.Host.Controllers.ModelController< Api.Models.InstanceUser >
 CTgstation.Server.Host.Controllers.ModelController< Api.Models.Job >
 CTgstation.Server.Host.Controllers.ModelController< ConfigurationFile >
 CTgstation.Server.Host.Controllers.ModelController< DreamDaemon >
 CTgstation.Server.Host.Controllers.ModelController< DreamMaker >
 CTgstation.Server.Host.Controllers.ModelController< Repository >
 CTgstation.Server.Host.Controllers.ModelController< UserUpdate >
 CModelSnapshot
 CTgstation.Server.Host.Components.Watchdog.MonitorStateThe (absolute) state of the ExperimentalWatchdog
 CTgstation.Server.Host.NativeMethodsNative 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
 CReleaseNotes.ProgramContains the application entrypoint
 CTgstation.Server.Api.Models.Internal.RepositorySettingsRepresents configurable settings for a Repository
 CTgstation.Server.Host.Components.Chat.ResponseRepresents a chat message requested by DD
 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.ServerInformationRepresents basic server information
 CTgstation.Server.Host.Components.StaticFiles.ServerSideModificationsRepresents code modifications via configuration
 CServiceBase
 CTgstation.Server.Host.Core.ServiceCollectionExtensionsExtensions for IServiceCollection
 CTgstation.Server.Host.Core.TaskExtensionsExtensions for the Task class
 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.Core.Tests.TestDatabaseContextFactory
 CTgstation.Server.Host.Core.Tests.TestDBConnectionFactory
 CTgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider
 CTgstation.Server.Client.Components.Tests.TestDreamDaemonClient
 CTgstation.Server.Host.Components.Watchdog.Tests.TestExperimentalWatchdog
 CTgstation.Server.Host.Core.Tests.TestGitHubClientFactory
 CTgstation.Server.Api.Models.Tests.TestIrcConnectionStringBuilder
 CTgstation.Server.Host.Core.Tests.TestJobException
 CTgstation.Server.Host.Core.Tests.TestJobHandler
 CTgstation.Server.Api.Models.TestMergeParametersParameters for creating a TestMerge
 CTgstation.Server.Host.Core.Tests.TestPlatformIdentifier
 CTgstation.Server.Host.Components.Byond.Tests.TestPosixByondInstaller
 CTgstation.Server.Host.IO.Tests.TestPostWriteHandler
 CTgstation.Server.Host.Console.Tests.TestProgram
 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.Core.Tests.TestServiceCollectionExtensions
 CTgstation.Server.Host.Core.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.Host.Components.Chat.UserRepresents a tgs_chat_user datum
 CTgstation.Server.Api.Models.Internal.UserRepresents a server User
 CTgstation.Server.Host.Models.WatchdogReattachInformationBaseBase class for WatchdogReattachInformation
 CException
+
+
+ + + + diff --git a/index.html b/index.html new file mode 100644 index 0000000000..43ca0f744d --- /dev/null +++ b/index.html @@ -0,0 +1,292 @@ + + + + + + + +tgstation-server: tgstation-server v4: + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
tgstation-server v4:
+
+
+

Build status + Build Status + +/> + Waffle.io - Columns and their card count +

+

+/> + +/> + +/> + +/> +

+

+/> + forinfinityandbyond +

+

+/> + +/> +

+

This is a toolset to manage production BYOND servers. It includes the ability to update the server without having to stop or shutdown the server (the update will take effect on a "reboot" of the server) the ability start the server and restart it if it crashes, as well as systems for managing code and game files, and merging GitHub Pull Requests for test deployments.

+

Legacy Servers

+

Older server versions can be found in the V# branches of this repository. Note that V4 is nearly fully incompatible with existing installations. Only some static files may be copied over: https://github.com/tgstation/tgstation-server#static-files

+

Setup

+

Pre-Requisites

+
    +
  • .NET Core Runtime (>= v2.1) If you plan to install tgstation-server as a Windows service, you should also ensure that your .NET Framework runtime version is >= v4.7.1 (Download can be found on same page). On Windows, ensure that the dotnet executable file is in your system's PATH variable (or the user's that will be running the server).
  • +
  • A MariaDB, MySQL, or Microsoft SQL Server database engine is required
  • +
+

Installation

+
    +
  1. Download the latest V4 release .zip. The ServerService package will only work on Windows. Choose ServerConsole if that is not your target OS or you prefer not to use the Windows service.
  2. +
  3. Extract the .zip file to where you want the server to run from. Note the account running the server must have write and delete access to the lib subdirectory.
  4. +
+

Windows

+

If you wish to install the TGS as a service, run Tgstation.Server.Host.Service.exe. It should prompt you to install it. Click Yes and accept a potential UAC elevation prompt and the setup wizard should run.

+

REFER TO ISSUE #798 BEFORE DECIDING TO USE A LINUX DEPLOYMENT

+

Linux (Native)

+

We recommend using Docker for Linux installations, see below. The content of this parent section may be skipped if you choose to do so.

+

The following dependencies are required to run tgstation-server on Linux alongside the .NET Core runtime

+
    +
  • gcc-multilib (on 64-bit systems for running BYOND)
  • +
+

Note that tgstation-server has only ever been tested on Linux via it's docker environment. If you are having trouble with something in a native installation, or figure out a required workaround, please contact project maintainers so this documentation may be better updated.

+

Docker (Linux)

+

tgstation-server supports running in a docker container and is the recommended deployment method for Linux systems. The official image repository is located at https://hub.docker.com/r/tgstation/server. It can also be built locally by running docker build . -f build/Dockerfile -t <your tag name> in the repository root.

+

To create a container run

docker run \
-ti \ #start interactive for manual configuration
--restart=always \ #if you want maximum uptime
--network="host" \ #if your sql server is on the same machine
--name="tgs" \ #or whatever else you wanna call it
--cap-add=sys_nice \ #allows tgs to schedule DreamDaemon as a higher priority process
--init \ #reaps potential zombie processes
-p <tgs port>:80 \
-p 0.0.0.0:<public game port>:<public game port> \
-v /path/to/your/configfile/directory:/config_data \ #only if you want to use manual configuration
-v /path/to/store/instances:/tgs4_instances \
-v /path/to/your/log/folder:/tgs_logs \
tgstation/server #replace this with <your tag name> if you built the image locally

with any additional options you desire (i.e. You'll have to expose more game ports in order to host more than one instance).

+

Note although /app/lib is specified as a volume mount point in the Dockerfile, unless you REALLY know what you're doing. Do not mount any volumes over this for fear of breaking your container.

+

If using manual configuration, before starting your container make sure the aforemention appsettings.Production.json is setup properly. See below

+

Configuring

+

The first time you run TGS4 you should be prompted with a configuration wizard which will guide you through setting up your appsettings.Production.json

+

This wizard will, generally, run whenever the server is launched without detecting the config json. Follow the instructions below to perform this process manually.

+

Manual Configuration

+

Create an appsettings.Production.json file next to appsettings.json. This will override the default settings in appsettings.json with your production settings. There are a few keys meant to be changed by hosts. Modifying any config files while the server is running will trigger a safe restart (Keeps DreamDaemon's running). Note these are all case-sensitive:

+
    +
  • General:MinimumPasswordLength: Minimum password length requirement for database users
  • +
  • General:GitHubAccessToken: Specify a GitHub personal access token with no scopes here to highly mitigate the possiblity of 429 response codes from GitHub requests
  • +
  • FileLogging:Directory: Override the default directory where server logs are stored. Default is C:/ProgramData/tgstation-server/logs on Windows, /usr/share/tgstation-server/logs otherwise
  • +
  • FileLogging:LogLevel: Can be one of Trace, Debug, Information, Warning, Error, or Critical. Restricts what is put into the log files. Currently Debug is reccommended for help with error reporting.
  • +
  • Kestrel:Endpoints:Http:Url: The URL (i.e. interface and ports) your application should listen on. General use case should be http://localhost:<port> for restricted local connections. See the Remote Access section for configuring public access to the World Wide Web. This doesn't need to be changed using the docker setup and should be mapped with the -p option instead
  • +
  • Database:DatabaseType: Can be one of SqlServer, MariaDB, or MySql
  • +
  • Database:MySqlServerVersion: The version of MySql/MariaDB the database resides on, can be left as null for attempted auto detection. Used by the MySQL/MariaDB provider for selection of certain features ignore at your own risk. A string in the form <major>.<minor>.<patch>
  • +
  • Database:ConnectionString: Connection string for your database. Click here for an SQL Server generator or see here for a MySQL guide (You should probably use '127.0.0.1' instead of 'localhost').
  • +
  • ControlPanel:Enable: Enable the javascript based control panel to be served from the server via /index.html
  • +
  • ControlPanel:AllowAnyOrigin: Set the Access-Control-Allow-Origin header to * for all responses (also enables all headers and methods)
  • +
  • ControlPanel:AllowedOrigins: Set the Access-Control-Allow-Origin headers to this list of origins for all responses (also enables all headers and methods). This is overridden by ControlPanel:AllowAnyOrigin
  • +
+

Database Configuration

+

If using a MariaDB/MySQL server, our client library recommends you set 'utf8mb4' as your default charset disregard at your own risk.

+

The user created for the application will need the privilege to create databases on the first run, do not create the database for it. Once the initial set of migrations is run, the create right may be revoked. The user should maintain DDL rights though for applying future migrations

+

Note that the ratio of application installations to databases is 1:1. Do not attempt to share a database amongst multiple TGS installations. (We know SQLite would be perfect for this, but it does not handle the high level of concurrency the server uses)

+

Starting

+

For the Windows service version start the tgstation-server-4 service. If it fails to start, check the Windows event log under Windows/Application for entries from tgstation-server-4 for errors.

+

For the console version run dotnet Tgstation.Server.Host.Console.dll in the installation directory. The tgs.bat and tgs.sh shell scripts are shortcuts for this. If on Windows, you must do this as admin to give the server permission to install the required DirectX dependency for certain 512 BYOND versions as well as create symlinks.

+

For the docker version run docker start <your container name>

+

Test your server is running by visiting the local port in your browser. You should receive a 401 Unauthorized response (You may need to view the developer console). Otherwise an error page will be present.

+

Stopping

+

Note that the live detach for DreamDaemon servers is only supported for updates or restarts via the API at this time. Stopping tgstation-server will TERMINATE ALL CHILD DREAMDAEMON SERVERS.

+

For the Windows service version stop the tgstation-server-4 service

+

For the console version press Ctrl+C or send a SIGQUIT to the ORIGINAL dotnet process

+

For the docker version run docker stop <your container name>

+

Integrating

+

tgstation-server 4 now REQUIRES the DMAPI to be integrated into any BYOND codebase which plans on being used by it. The integration process is a fairly simple set of code changes.

+
    +
  1. Copy the DMAPI files anywhere in your code base. tgs.dm can be seperated from the tgs folder, but do not modify or move the contents of the tgs folder
  2. +
  3. Modify your .dme(s) to include the tgs.dm and tgs/includes.dm files (ORDER OF APPEARANCE IS MANDATORY)
  4. +
  5. Follow the instructions in tgs.dm to integrate the API with your codebase.
  6. +
+

The DMAPI is fully backwards compatible and should function with any tgstation-server version to date. Updates can be performed in the same manner. Using the TGS_EXTERNAL_CONFIGURATION is recommended in order to make the process as easy as replacing tgs.dm and the tgs folder with a newer version

+

Example

+

Here is a bare minimum example project that implements the essential code changes for integrating the DMAPI

+

Before tgs.dm:

//Remember, every codebase is different, you probably have better methods for these defines than the ones given here
#define TGS_EXTERNAL_CONFIGURATION
#define TGS_DEFINE_AND_SET_GLOBAL(Name, Value) var/global/##Name = ##Value
#define TGS_READ_GLOBAL(Name) global.##Name
#define TGS_WRITE_GLOBAL(Name, Value) global.##Name = ##Value
#define TGS_WORLD_ANNOUNCE(message) world << ##message
#define TGS_INFO_LOG(message) world.log << "TGS Info: [##message]"
#define TGS_ERROR_LOG(message) world.log << "TGS Error: [##message]"
#define TGS_NOTIFY_ADMINS(event) world.log << "TGS Admin Message: [##event]"
#define TGS_CLIENT_COUNT global.client_cout
#define TGS_PROTECT_DATUM(Path) // Leave blank if your codebase doesn't give administrators code reflection capabilities

Anywhere else:

var/global/client_count = 0
/world/New()
..()
TgsNew()
TgsInitializationsComplete()
/world/Reboot()
TgsReboot()
..()
/world/Topic()
TGS_TOPIC
..()
/client/New()
..()
++global.client_count
/client/Del()
..()
--global.client_count

Remote Access

+

tgstation-server is an ASP.Net Core app based on the Kestrel web server. This section is meant to serve as a general use case overview, but the entire Kestrel configuration can be modified to your liking with the configuration JSON. See the official documentation for details.

+

Exposing the builtin Kestrel server to the internet directly over HTTP is highly not reccommended due to the lack of security. The recommended way to expose tgstation-server to the internet is to host it through a reverse proxy with HTTPS support. Here are some step by step examples to achieve this for major web servers.

+

System administrators will most likely have their own configuration plans, but here are some basic guides for beginners.

+

Once complete, test that your configuration worked by visiting your proxy site from a browser on a different computer. You should recieve a 401 Unauthorized response.

+

IIS (Reccommended for Windows)

+
    +
  1. Acquire an HTTPS certificate. The easiet free way for Windows is win-acme (requires you to set up the website first)
  2. +
  3. Install the Web Platform Installer
  4. +
  5. Open the web platform installer in the IIS Manager and install the Application Request Routing 3.0 module
  6. +
  7. Create a new website, bind it to HTTPS only with your chosen certificate and exposed port. The physical path won't matter since it won't be used. Use Require Server Name Indication if you want to limit requests to a specific URL prefix.
  8. +
  9. Close and reopen the IIS Manager
  10. +
+
    +
  1. Open the site and navigate to the URL Rewrite module
  2. +
  3. In the Actions Pane on the right click Add Rule(s)...
  4. +
  5. For the rule template, select Reverse Proxy under Inbound and Outbound Rules and click OK
  6. +
  7. You may get a prompt about enabling proxy functionality. Click OK
  8. +
  9. In the window that appears set the Inbound Rules textbox to the URL of your tgstation-server i.e. http://localhost:5000. Ensure Enable SSL Offloading is checked, then click OK
  10. +
+

Caddy (Reccommended for Linux, or those unfamilar with configuring NGINX or Apache)

+
    +
  1. Setup a basic website configuration. Instructions on how to do so are out of scope.
  2. +
  3. In your Caddyfile, under a server entry, add the following (replace 8080 with the port TGS is hosted on):
    proxy /tgs localhost:8080 {
    transparent
    }
  4. +
+

See https://caddyserver.com/docs/proxy

+

NGINX (Reccommended for Linux)

+
    +
  1. Setup a basic website configuration. Instructions on how to do so are out of scope.
  2. +
  3. Acquire an HTTPS certificate, likely via Let's Encrypt, and configure NGINX to use it.
  4. +
  5. Setup a path under a server like the following (replace 8080 with the port TGS is hosted on):
    location /tgs {
    proxy_pass http://127.0.0.1:8080;
    break;
    }
  6. +
+

See https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/

+

Apache

+
    +
  1. Ensure the mod_proxy extension is installed.
  2. +
  3. Setup a basic website configuration. Instructions on how to do so are out of scope.
  4. +
  5. Acquire an HTTPS certificate, likely via Let's Encrypt, and configure Apache to use it.
  6. +
  7. Under a VirtualHost entry, setup the following (replace 8080 with the port TGS is hosted on):
    ProxyPass / http://127.0.0.1:8080
    ProxyPassReverse / http://127.0.0.1:8080
  8. +
+

See https://httpd.apache.org/docs/2.4/howto/reverse_proxy.html

+

Example VirtualHost Entry

<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName tgs_subdomain.example.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>
</IfModule>

Usage

+

tgstation-server v4 is controlled via a RESTful HTTP json API. Documentation on this API can be found here. This section serves to document the concepts of the server.

+

Users

+

All actions apart from logging in must be taken by a user. TGS installs with one default user whose credentials can be found here. It is recommended to disable this user ASAP as it is used to create Jobs that are started by the system. If access to all users is lost, the default user can be reset using the Database:ResetAdminPassword configuration setting.

+

Users can be enabled/disabled and have a very granular set of rights associated to them that determine the actions they are allowed to take (i.e. Modify the user list or create instances). Users can be database based or system based. Database users are your standard web users with a username and password. System users, on the otherhand, are authenticated with the host OS. These users cannot have their password or names changed by TGS as they are managed by the system (and in reverse, login tokens don't expire when their password changes). The benefit to having these users is it allows the use of system ACLs for static file control. More on that later.

+

Instances

+

A TGS deployment is made up with a set of instances, which each represent a production BYOND server. As many instances as desired can be created. Be aware, however, due to the nature of BYOND, this will quickly result in system resource exhaustion.

+

An instance is stored in a single folder anywhere on a system and is made up of several components: The source code git repository, the BYOND installations, the compiler, the watchdog, chat bots, and static file management systems.

+
Instance Users
+

All users with access to an instance have an InstanceUser object associated with the two that defines more rights specific to that instance (i.e. Deploy code, modify bots, edit other InstanceUsers).

+

Repository

+

The Repository folder is a git repository containing the code of the game you wish to host. It can be cloned from any public or private remote repository and has capabilities to affect changes back to it. All the standard benefits of git are utilized (i.e. check out any revision or reference).

+

Additional features become available if the remote repository is hosted on https://github.com/. Namely the Test Merge feature, which allows you to take a pull request opened on the repository and compile it into a game deployment for testing. Information about test merges is available in game via the DMAPI and via the main API as well.

+

Manual operations on the repository while an instance is running may lead to git data corruption. Thankfully, it's simple enough to delete and reclone the repository via the API.

+

Byond

+

The Byond folder contains installations of BYOND versions. The version which is used by your game code can be changed on a whim (Note that only versions >= 511.1385 have been thouroughly tested. Lower versions should work but if one doesn't function, please open an issue report) and the server will take care of installing it.

+

Compiler

+

The compiler deploys code from the Repository folder to the Game folder and compiles it either by autodetecting the .dme or having it set by configuration. Several other step are also run such as validating the DMAPI version and creating symlinks for static files are done at this point. The compiler also applies server side code modifications and duplicates compiled code for the watchdog as well (See following section).

+

Watchdog

+

The watchdog is responsible for starting and keeping your server running. It functions by launching two servers which are hot-swapped on /world/Reboots and during crashes to prevent downtime. This hot swapping feature is also what allows TGS to deploy updates to live servers without bringing them down.

+

DreamDaemon can be finicky and will crash with several high load games or bad DM code. The watchdog has several failure prevention methods to keep at least one server running while these issues are sorted out.

+

Chat Bots

+

TGS supports creating infinite chat bots for notifying staff or players of things like code deployments and uptime in. Currently the following providers are supported

+
    +
  • Internet Relay Chat (IRC)
  • +
  • Discord
  • +
+

More can be added by providing a new implementation of the IProvider interface

+

Bots have a set of built-in commands that can be triggered via !tgs, mentioning, or private messaging them. Along with these, custom commands can be defined using the DMAPI by creating a subtype of the /datum/tgs_chat_command type (See tgs.dm for details). Invocation for custom commands can be restricted to certain channels.

+

Static Files

+

All files in game code deployments are considered transient by default, meaning when new code is deployed, changes will be lost. Static files allow you to specify which files and folders stick around throughout all deployments.

+

The StaticFiles folder contains 3 root folders which cannot be deleted and operate under special rules

    +
  • CodeModifications
  • +
  • EventScripts
  • +
  • GameStaticFiles
  • +
+

These files can be modified either in host mode or system user mode. In host mode, TGS itself is responsible for reading and writing the files. In system user mode read and write actions are performed using the system account of the logged on User, enabling the use of ACLs to control access to files. Database users will not be able to use the static file system if this mode is configured for an instance.

+

This folder may be freely modified manually just beware this may cause in-progress deployments to error if done on Windows systems.

+

CodeModifications

+

When a deployment is made by the compiler, all the contents of this folder are copied over the repository contents. Then one of two code change modes are selected based on the prescense of certain files.

+

If <target dme>.dm is present, that .dme will be used instead of the repository's .dme

+

Otherwise the files HeadInclude.dm and TailInclude.dm are searched for and added as include lines to the top and bottom of the target .dme repsectively if they exist. These files can contain any valid DreamMaker code (Including #includeing other .dm files!) allowing you to modify the a repository's code on a per instance basis

+

EventScripts

+

This folder can contain anything. But, when certain events occur in the instance, TGS will look here for .bat or .sh files with the same name and run those with corresponding arguments. List of supported events can be found here (subject to expansion) list of event parameters can be found here

+

GameStaticFiles

+

Any files and folders contained in this root level of this folder will be symbolically linked to all deployments at the time they are created. This allows persistent game data (BYOND .savs or code configuration files for example) to persist across all deployments. This folder contains a .tgsignore file which can be used to prevent symlinks from being generated by entering the names of files and folders (1 per line)

+

Updating

+

TGS 4 can self update without stopping your DreamDaemon servers. Any V4 release made to this repository is bound by a contract that allows changes of the runtime assemblies without stopping your servers. Database migrations are automatically applied as well. Because of this REVERTING TO LOWER VERSIONS IS NOT OFFICIALLY SUPPORTED, do so at your own risk (check changes made to /src/Tgstation.Server.Host/Models/Migrations).

+

Clients

+

Here are tools for interacting with the TGS 4 web API

+
    +
  • Tgstation.Server.ControlPanel: Official client. A cross platform GUI for using tgstation-server
  • +
  • Tgstation.Server.Client: A nuget .NET Standard 2.0 TAP based library for communicating with tgstation-server
  • +
  • Tgstation.Server.Api: A nuget .NET Standard 2.0 library containing API definitions for tgstation-server
  • +
  • Postman: This repository contains TGS.postman_collection.json which is used during development for testing. Contains example requests for all endpoints but takes some knowledge to use (Note that the pre-request script is configured to login the default admin user for every request)
  • +
+

Contact project maintainers to get your client added to this list

+

Backup/Restore

+

Note that tgstation-server is NOT a backup solution, the onus is on the server runners.

+

The Repository folder should, by the nature of git, not need to be backed up or should be done so on the remote server if necessary.

+

The BYOND and Game folders should never be backed up due.

+

The Configuration folder should and database be fully backed up

+

To restore an installation from backups, first restore the instance Configuration folders in their new homes. Then restore the database, modifying the Path column in the Instances table where necessary to point to the new instances. Then start the server pointed at the new database.

+

Should you end up with a lost database for some reason or want to reattach a detached instance you can reattach an existing folder by creating an empty file named TGS4_ALLOW_INSTANCE_ATTACH inside it (This is automatically created when detaching instances). Then create a new instance with that path, this will bypass the empty folder check. Note that this will not restore things such as user permissions, server config options, or deployment metadata. Those must be reconfigured manually

+

Troubleshooting

+

Feel free to ask for help at the coderbus discord in #tooling-questions: https://discord.gg/Vh8TJp9. Cyberboss#8246 can answer most questions.

+

Contributing

+ +

Licensing

+
    +
  • The DMAPI for the project is licensed under the MIT license.
  • +
  • The /tg/station 13 icon is licensed under Creative Commons 3.0 BY-SA.
  • +
  • The remainder of the project is licensed under GNU AGPL v3
  • +
+

See the files in the /src/DMAPI tree for the MIT license

+
+
+ + + + 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 new file mode 100644 index 0000000000..63c952880f --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Components.IByondClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.Components.IByondClient, including all inherited members.

+ + + + +
ActiveVersion(CancellationToken cancellationToken)Tgstation.Server.Client.Components.IByondClient
InstalledVersions(CancellationToken cancellationToken)Tgstation.Server.Client.Components.IByondClient
SetActiveVersion(Byond byond, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IByondClient
+ + + + 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 new file mode 100644 index 0000000000..3cd3e5bea3 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client.html @@ -0,0 +1,222 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components.IByondClient Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components.IByondClient Interface Reference
+
+
+ +

For managing the Byond installation + More...

+
+Inheritance diagram for Tgstation.Server.Client.Components.IByondClient:
+
+
+ + +Tgstation.Server.Client.Components.ByondClient + +
+ + + + + + + + + + + +

+Public Member Functions

Task< ByondActiveVersion (CancellationToken cancellationToken)
 Get the Byond active System.Version information More...
 
Task< IReadOnlyList< Byond > > InstalledVersions (CancellationToken cancellationToken)
 Get all installed Byond System.Versions More...
 
Task< ByondSetActiveVersion (Byond byond, CancellationToken cancellationToken)
 Updates the Byond information More...
 
+

Detailed Description

+

For managing the Byond installation

+ +

Definition at line 11 of file IByondClient.cs.

+

Member Function Documentation

+ +

◆ ActiveVersion()

+ +
+
+ + + + + + + + +
Task<Byond> Tgstation.Server.Client.Components.IByondClient.ActiveVersion (CancellationToken cancellationToken)
+
+ +

Get the Byond active System.Version information

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the Byond active System.Version information
+ +

Implemented in Tgstation.Server.Client.Components.ByondClient.

+ +

Referenced by Tgstation.Server.Tests.Instance.ByondTest.TestInstall511(), and Tgstation.Server.Tests.Instance.ByondTest.TestNoVersion().

+ +
+
+ +

◆ InstalledVersions()

+ +
+
+ + + + + + + + +
Task<IReadOnlyList<Byond> > Tgstation.Server.Client.Components.IByondClient.InstalledVersions (CancellationToken cancellationToken)
+
+ +

Get all installed Byond System.Versions

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in an IReadOnlyList<T> of installed Byond System.Versions
+ +

Implemented in Tgstation.Server.Client.Components.ByondClient.

+ +

Referenced by Tgstation.Server.Tests.Instance.ByondTest.TestNoVersion().

+ +
+
+ +

◆ SetActiveVersion()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<Byond> Tgstation.Server.Client.Components.IByondClient.SetActiveVersion (Byond byond,
CancellationToken cancellationToken 
)
+
+ +

Updates the Byond information

+
Parameters
+ + + +
byondThe Byond information to update
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the updated Byond information
+ +

Implemented in Tgstation.Server.Client.Components.ByondClient.

+ +

Referenced by Tgstation.Server.Tests.Instance.ByondTest.TestInstall511().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client.png b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client.png new file mode 100644 index 0000000000000000000000000000000000000000..7291b857d5ba67c4aebb8f2ffe59bc55171acd52 GIT binary patch literal 1111 zcmeAS@N?(olHy`uVBq!ia0y~yU{nOM12~w0Wa25~pFm0?z$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opd$}m z`*#?dTUr%1BreqauJX}&OMmLdrCYCgt=(FtAmzZR5F*HQBBX`ENK~=G$CX1NSpCXt zvkhC{KK~x=QxwA@kUdlSXq0tbC;N}#PfddPEYBD^3RlNA+ z-uKfh8giKzZVup{Y3$FuQ2)~YrJprt)EB>(DYKQS{$?9fzv<o-YrW|kt%Wx(_gaYv z7Zn_j-e!H}#;XXMn2Q$sQ?GO0ob&(bw43EOqb^nNjmh3y?L6apm$k?3tIu~xC-$z7 zF8bK>J@&gJ$L_~+r*0aCKIu~TKXFa8!TjaKrRl$K3f~G(Y!H9ZxwQSZWYLP{Y6q&n z9JqY>t;=?v1;F55w}OK)Mazj{W|x4&GW~_uqO`YOi_&Qbf5{xcWDy|9_h1@T8PM1x5^Dm{(TK3X6Y0{EODy>>hlcucX@C;g} zq~bZVYl2E@6zA5T{*y9qpMSsoZiKvqm}k(M)I5>ww?9&u{5HNhh9N zkhmx~X^G?KW|fyQwRt9czyB5TpOicALgbv*GbxvVEoEaBBHQcr`GdsE0i1XP`lsoL2vEg+<&_Cf8r zdnXn?-V)D!Bh+c)!ri4BYEK^YZOrU$lZQ}g@Sar!>e^~<04wruyA + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Components.IChatBotsClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.Components.IChatBotsClient, including all inherited members.

+ + + + + + +
Create(ChatBot settings, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IChatBotsClient
Delete(ChatBot settings, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IChatBotsClient
GetId(ChatBot settings, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IChatBotsClient
List(CancellationToken cancellationToken)Tgstation.Server.Client.Components.IChatBotsClient
Update(ChatBot settings, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IChatBotsClient
+ + + + 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 new file mode 100644 index 0000000000..2dad4bb1a4 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html @@ -0,0 +1,313 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components.IChatBotsClient Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components.IChatBotsClient Interface Reference
+
+
+ +

For managing the chat bots + More...

+
+Inheritance diagram for Tgstation.Server.Client.Components.IChatBotsClient:
+
+
+ + +Tgstation.Server.Client.Components.ChatBotsClient + +
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

Task< IReadOnlyList< ChatBot > > List (CancellationToken cancellationToken)
 List the ChatBots More...
 
Task< ChatBotCreate (ChatBot settings, CancellationToken cancellationToken)
 Create a ChatBot More...
 
Task< ChatBotUpdate (ChatBot settings, CancellationToken cancellationToken)
 Updates a ChatBot's setttings More...
 
Task< ChatBotGetId (ChatBot settings, CancellationToken cancellationToken)
 Get a ChatBot's setttings More...
 
Task Delete (ChatBot settings, CancellationToken cancellationToken)
 Delete a ChatBot More...
 
+

Detailed Description

+

For managing the chat bots

+ +

Definition at line 11 of file IChatBotsClient.cs.

+

Member Function Documentation

+ +

◆ Create()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<ChatBot> Tgstation.Server.Client.Components.IChatBotsClient.Create (ChatBot settings,
CancellationToken cancellationToken 
)
+
+ +

Create a ChatBot

+
Parameters
+ + + +
settingsThe ChatBot to create
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the new ChatBot
+ +

Implemented in Tgstation.Server.Client.Components.ChatBotsClient.

+ +
+
+ +

◆ Delete()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.Components.IChatBotsClient.Delete (ChatBot settings,
CancellationToken cancellationToken 
)
+
+ +

Delete a ChatBot

+
Parameters
+ + + +
settingsThe ChatBot to delete
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Client.Components.ChatBotsClient.

+ +
+
+ +

◆ GetId()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<ChatBot> Tgstation.Server.Client.Components.IChatBotsClient.GetId (ChatBot settings,
CancellationToken cancellationToken 
)
+
+ +

Get a ChatBot's setttings

+
Parameters
+ + + +
settingsThe ChatBot to get
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the ChatBot
+ +

Implemented in Tgstation.Server.Client.Components.ChatBotsClient.

+ +
+
+ +

◆ List()

+ +
+
+ + + + + + + + +
Task<IReadOnlyList<ChatBot> > Tgstation.Server.Client.Components.IChatBotsClient.List (CancellationToken cancellationToken)
+
+ +

List the ChatBots

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in a IReadOnlyList<T> of the ChatBot of the server
+ +

Implemented in Tgstation.Server.Client.Components.ChatBotsClient.

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<ChatBot> Tgstation.Server.Client.Components.IChatBotsClient.Update (ChatBot settings,
CancellationToken cancellationToken 
)
+
+ +

Updates a ChatBot's setttings

+
Parameters
+ + + +
settingsThe ChatBot to update
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the updated ChatBot
+ +

Implemented in Tgstation.Server.Client.Components.ChatBotsClient.

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.png b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.png new file mode 100644 index 0000000000000000000000000000000000000000..7ca2595a8171460f4303b1c8363caad1620a7912 GIT binary patch literal 1140 zcmeAS@N?(olHy`uVBq!ia0y~yVAKb)12~w0WIZ#p7m$(&@CkAK|NlRb`Qpvj(*8pe zfGjXRaNq!I=N)+-h5iG@4kv*$4DH@K$9Fw76l zwf$`Mz1RLgU+eV!@pC^Eal7pJP{ml6UpBA#=leOf%$diN-@BHECz}Q@UKwjwd-b!~ z!s}OO{eGImkx-cU*yy+9>sg-s3-?QO7d$E5o6X*8*W-9J`}}6TulBm_nzJrWPcB|N z@2BME*~<@3v^-@hY`#6Bg?s%ztDJq4432OaoV2_5L26QT#oM)e?d$fNI>w|e+jvtv zS#Z}Lp4QL%-c{-|3h;y>2wj~-nncil%U-_JHr=}YC^YmW;OoC~H+zkbU7 z_~+Vx59{tuJF;ot)2*xB)ep)4ntndpVehrYTkkI2m#@2UQ_Q42nzw!P0?z!1>Hqfo zh8@q=*W2`u)to$g{6f{M;HzmGjJKVmq?+x8f1B(rG`#bDqwh?gWxl`KzdE-l>)-BY zn78D3i^=C%)s_dCzeL1s?P8Ey^86E%2jdR(I1pbS)00c1(laRLr1vDCrISR$KTTS)Lu!4|zsV_X^)-KIU3+!t($EB$4%Pu!dBjA!>y`krSE_$-b9?Rn0=K~f1^hQ-+J-K z=1)IsoT-2QrjqGx%bUFx^YsrGW|?d~y?lMu6SZHvswCs1`xtff=ImIL>AU#-{rg=l z&p+&n+wSaIE79Dwoi)I4w(stvG8bN)-ncXDyh!iOvy-2n@I36RBQ)>)YUwX$pU1Y( zR#>@aQ@{D1Hl+w~g7KRBBTHM~Dts#|-x z+}#g(6`%x@*6e)xboSH5kAK?zFWCQ0b)!yR<=a<@u>HC+%Q&PlS6O%R!TFr^v+nKqV3xfsUFtI5 z-_^eq_q1NWrK9>%vdYVYd;QMo-j^VWMdhVqm7cz*m*=GAPgFgDS=O^l8x|E+AFcWx gd&nLybos)+-Nx=`P+`w!U=hLK>FVdQ&MBb@06A(VQ2+n{ literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000..5ab9c1d163 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client-members.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Components.IConfigurationClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.Components.IConfigurationClient, including all inherited members.

+ + + + + + +
CreateDirectory(ConfigurationFile directory, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IConfigurationClient
DeleteEmptyDirectory(ConfigurationFile directory, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IConfigurationClient
List(string directory, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IConfigurationClient
Read(ConfigurationFile file, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IConfigurationClient
Write(ConfigurationFile file, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IConfigurationClient
+ + + + 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 new file mode 100644 index 0000000000..be376f8f23 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.html @@ -0,0 +1,328 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components.IConfigurationClient Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components.IConfigurationClient Interface Reference
+
+
+ +

For managing ConfigurationFile files + More...

+
+Inheritance diagram for Tgstation.Server.Client.Components.IConfigurationClient:
+
+
+ + +Tgstation.Server.Client.Components.ConfigurationClient + +
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

Task< IReadOnlyList< ConfigurationFile > > List (string directory, CancellationToken cancellationToken)
 List configuration files More...
 
Task< ConfigurationFileRead (ConfigurationFile file, CancellationToken cancellationToken)
 Read a ConfigurationFile file More...
 
Task< ConfigurationFileWrite (ConfigurationFile file, CancellationToken cancellationToken)
 Overwrite a ConfigurationFile file More...
 
Task DeleteEmptyDirectory (ConfigurationFile directory, CancellationToken cancellationToken)
 Delete an empty directory More...
 
Task< ConfigurationFileCreateDirectory (ConfigurationFile directory, CancellationToken cancellationToken)
 Creates an empty directory More...
 
+

Detailed Description

+

For managing ConfigurationFile files

+ +

Definition at line 11 of file IConfigurationClient.cs.

+

Member Function Documentation

+ +

◆ CreateDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<ConfigurationFile> Tgstation.Server.Client.Components.IConfigurationClient.CreateDirectory (ConfigurationFile directory,
CancellationToken cancellationToken 
)
+
+ +

Creates an empty directory

+
Parameters
+ + + +
directoryThe ConfigurationFile representing the directory to create
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the new ConfigurationFile
+ +

Implemented in Tgstation.Server.Client.Components.ConfigurationClient.

+ +
+
+ +

◆ DeleteEmptyDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.Components.IConfigurationClient.DeleteEmptyDirectory (ConfigurationFile directory,
CancellationToken cancellationToken 
)
+
+ +

Delete an empty directory

+
Parameters
+ + + +
directoryThe ConfigurationFile representing the directory to delete
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Client.Components.ConfigurationClient.

+ +

Referenced by Tgstation.Server.Tests.Instance.ConfigurationTest.TestDeleteDirectory().

+ +
+
+ +

◆ List()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<IReadOnlyList<ConfigurationFile> > Tgstation.Server.Client.Components.IConfigurationClient.List (string directory,
CancellationToken cancellationToken 
)
+
+ +

List configuration files

+
Parameters
+ + + +
directoryThe path to the directory to list files in
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A IReadOnlyList<T> of ConfigurationFiles in the directory
+ +

Implemented in Tgstation.Server.Client.Components.ConfigurationClient.

+ +
+
+ +

◆ Read()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<ConfigurationFile> Tgstation.Server.Client.Components.IConfigurationClient.Read (ConfigurationFile file,
CancellationToken cancellationToken 
)
+
+ +

Read a ConfigurationFile file

+
Parameters
+ + + +
fileThe ConfigurationFile file to read
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Client.Components.ConfigurationClient.

+ +
+
+ +

◆ Write()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<ConfigurationFile> Tgstation.Server.Client.Components.IConfigurationClient.Write (ConfigurationFile file,
CancellationToken cancellationToken 
)
+
+ +

Overwrite a ConfigurationFile file

+
Parameters
+ + + +
fileThe ConfigurationFile file to write
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the new ConfigurationFile
+ +

Implemented in Tgstation.Server.Client.Components.ConfigurationClient.

+ +

Referenced by Tgstation.Server.Tests.Instance.ConfigurationTest.TestDeleteDirectory().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.png b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.png new file mode 100644 index 0000000000000000000000000000000000000000..36a3d1f2b8d5bac965ea7875548d8339cd028c39 GIT binary patch literal 1190 zcmeAS@N?(olHy`uVBq!ia0y~yVDtpC12~w0oVjmbIGG<3CoALC;H!sblOT09ndIvHDF~n4wZ@(L~zVf~2y0V*Pdhss)(J` z=6{#JTIKr7O!cC(H%l#5q92|2^wYd^w|3@}x|P@W{8r&FFW(-sd;TVsy{DJ>+q`S! zzxL#zSylfNN1$wdf!{Bc-JUbd`+DzgwR&><)>2P**3Udf+=y9b;94&lHAuZBM2n8kVSWi5#!gV!!yWuv6!BQTbn;)0^(Z z>P(t4Y03I2Dyo`Jous8m>=;JcqbDCC@CYijvS-PGq3h2OqvhsWBdy?S-qwBql{dk3Z@eS3Oji_+|i&kyI# z4ezm53Af(1G9z1ULDTx=+blEW?<%=D*XpUK)$SJCYkuPMYjvqrk}`5vDv$2)FXFzD z)9bd&b9zYH&Ew3I?jD=T@W#Db{#<5B;)2qO2XCJ|mGeBjJg?Js(rccr&O6^dUw2yZ zrck|Kk=MgHR^guSu2&xY!FclU-MhNi^%knWj8&_BRLEbmLGAnYi`6Rpul6MUxm@xX*4n9Ah*ijzx%dq)$_XD+umpQGe2C4?AEEilRdW0 Qz(R$=)78&qol`;+00=-WbpQYW literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000..ca36e3c02e --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client-members.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Components.IDreamDaemonClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.Components.IDreamDaemonClient, including all inherited members.

+ + + + + + +
Read(CancellationToken cancellationToken)Tgstation.Server.Client.Components.IDreamDaemonClient
Restart(CancellationToken cancellationToken)Tgstation.Server.Client.Components.IDreamDaemonClient
Shutdown(CancellationToken cancellationToken)Tgstation.Server.Client.Components.IDreamDaemonClient
Start(CancellationToken cancellationToken)Tgstation.Server.Client.Components.IDreamDaemonClient
Update(DreamDaemon dreamDaemon, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IDreamDaemonClient
+ + + + 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 new file mode 100644 index 0000000000..59e9c88458 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html @@ -0,0 +1,280 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components.IDreamDaemonClient Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components.IDreamDaemonClient Interface Reference
+
+
+ +

For managing DreamDaemon + More...

+
+Inheritance diagram for Tgstation.Server.Client.Components.IDreamDaemonClient:
+
+
+ + +Tgstation.Server.Client.Components.DreamDaemonClient + +
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

Task< DreamDaemonRead (CancellationToken cancellationToken)
 Get the DreamDaemon represented by the IDreamDaemonClient More...
 
Task< JobStart (CancellationToken cancellationToken)
 Start DreamDaemon More...
 
Task< JobRestart (CancellationToken cancellationToken)
 Restart DreamDaemon More...
 
Task Shutdown (CancellationToken cancellationToken)
 Shutdown DreamDaemon More...
 
Task< DreamDaemonUpdate (DreamDaemon dreamDaemon, CancellationToken cancellationToken)
 Update DreamDaemon. This may trigger Api.Models.Internal.DreamDaemonSettings.SoftRestart More...
 
+

Detailed Description

+

For managing DreamDaemon

+ +

Definition at line 10 of file IDreamDaemonClient.cs.

+

Member Function Documentation

+ +

◆ Read()

+ +
+
+ + + + + + + + +
Task<DreamDaemon> Tgstation.Server.Client.Components.IDreamDaemonClient.Read (CancellationToken cancellationToken)
+
+ +

Get the DreamDaemon represented by the IDreamDaemonClient

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the DreamDaemon information
+ +

Implemented in Tgstation.Server.Client.Components.DreamDaemonClient.

+ +
+
+ +

◆ Restart()

+ +
+
+ + + + + + + + +
Task<Job> Tgstation.Server.Client.Components.IDreamDaemonClient.Restart (CancellationToken cancellationToken)
+
+ +

Restart DreamDaemon

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the Job of the running operation
+ +

Implemented in Tgstation.Server.Client.Components.DreamDaemonClient.

+ +
+
+ +

◆ Shutdown()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Client.Components.IDreamDaemonClient.Shutdown (CancellationToken cancellationToken)
+
+ +

Shutdown DreamDaemon

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the DreamDaemon information
+ +

Implemented in Tgstation.Server.Client.Components.DreamDaemonClient.

+ +
+
+ +

◆ Start()

+ +
+
+ + + + + + + + +
Task<Job> Tgstation.Server.Client.Components.IDreamDaemonClient.Start (CancellationToken cancellationToken)
+
+ +

Start DreamDaemon

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the Job of the running operation
+ +

Implemented in Tgstation.Server.Client.Components.DreamDaemonClient.

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<DreamDaemon> Tgstation.Server.Client.Components.IDreamDaemonClient.Update (DreamDaemon dreamDaemon,
CancellationToken cancellationToken 
)
+
+ +

Update DreamDaemon. This may trigger Api.Models.Internal.DreamDaemonSettings.SoftRestart

+
Parameters
+ + + +
dreamDaemonThe DreamDaemon to update
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the DreamDaemon information
+ +

Implemented in Tgstation.Server.Client.Components.DreamDaemonClient.

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.png b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.png new file mode 100644 index 0000000000000000000000000000000000000000..e43e25c3fff7bfef6a839a337723cb49f84c5f02 GIT binary patch literal 1209 zcmeAS@N?(olHy`uVBq!ia0y~yU40lTxuoWM8IQ3eT_SS1reHjd@4LqU&4KB#Ibiv;)roJ*8yZ_w> z&+9WDxs{~6e(z&h`vWH5Z~eD?7jc)XDx33J%eiBG8V8o_|2JFm>kW-P-}gRdzhTC> zH~H(c8uMuejJ59$+?QKZom01V@9TeWc4zsAZNI(kLfOv%>pfLplatCe^yeMCJ;ko^ zQoH49fohCF<^D`|Z{I7k{HZFMX0%`TEKAE6MHJm+lweJO9M4WPZdA(Q@tT*zZqS z9RGg%JU_+$;cC^21>a_KeDM8sXbJ;UufuU}_6OWwb~{vOGSp10lhAPBd|-?mH6XTa zfm+8GX;{XX@7*52t`|$I&J^} literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000..f9f0339595 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client-members.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Components.IDreamMakerClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.Components.IDreamMakerClient, including all inherited members.

+ + + + + + +
Compile(CancellationToken cancellationToken)Tgstation.Server.Client.Components.IDreamMakerClient
GetCompileJob(CompileJob compileJob, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IDreamMakerClient
GetJobIds(CancellationToken cancellationToken)Tgstation.Server.Client.Components.IDreamMakerClient
Read(CancellationToken cancellationToken)Tgstation.Server.Client.Components.IDreamMakerClient
Update(DreamMaker dreamMaker, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IDreamMakerClient
+ + + + 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 new file mode 100644 index 0000000000..b2946972d7 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html @@ -0,0 +1,291 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components.IDreamMakerClient Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components.IDreamMakerClient Interface Reference
+
+
+ +

For managing the compiler + More...

+
+Inheritance diagram for Tgstation.Server.Client.Components.IDreamMakerClient:
+
+
+ + +Tgstation.Server.Client.Components.DreamMakerClient + +
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

Task< DreamMakerRead (CancellationToken cancellationToken)
 Get the DreamMaker information More...
 
Task< DreamMakerUpdate (DreamMaker dreamMaker, CancellationToken cancellationToken)
 Updates the DreamMaker setttings More...
 
Task< JobCompile (CancellationToken cancellationToken)
 Compile the current repository revision More...
 
Task< IReadOnlyList< CompileJob > > GetJobIds (CancellationToken cancellationToken)
 Gets the Api.Models.Internal.CompileJob.Ids of all CompileJobs for the instance More...
 
Task< CompileJobGetCompileJob (CompileJob compileJob, CancellationToken cancellationToken)
 Get a compileJob More...
 
+

Detailed Description

+

For managing the compiler

+ +

Definition at line 11 of file IDreamMakerClient.cs.

+

Member Function Documentation

+ +

◆ Compile()

+ +
+
+ + + + + + + + +
Task<Job> Tgstation.Server.Client.Components.IDreamMakerClient.Compile (CancellationToken cancellationToken)
+
+ +

Compile the current repository revision

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the Job for the compile
+ +

Implemented in Tgstation.Server.Client.Components.DreamMakerClient.

+ +
+
+ +

◆ GetCompileJob()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<CompileJob> Tgstation.Server.Client.Components.IDreamMakerClient.GetCompileJob (CompileJob compileJob,
CancellationToken cancellationToken 
)
+
+ +

Get a compileJob

+
Parameters
+ + + +
compileJobThe CompileJob to get
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the CompileJob
+ +

Implemented in Tgstation.Server.Client.Components.DreamMakerClient.

+ +
+
+ +

◆ GetJobIds()

+ +
+
+ + + + + + + + +
Task<IReadOnlyList<CompileJob> > Tgstation.Server.Client.Components.IDreamMakerClient.GetJobIds (CancellationToken cancellationToken)
+
+ +

Gets the Api.Models.Internal.CompileJob.Ids of all CompileJobs for the instance

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in a IReadOnlyList<T> of CompileJobs with only the Api.Models.Internal.CompileJob.Id field populated
+ +

Implemented in Tgstation.Server.Client.Components.DreamMakerClient.

+ +
+
+ +

◆ Read()

+ +
+
+ + + + + + + + +
Task<DreamMaker> Tgstation.Server.Client.Components.IDreamMakerClient.Read (CancellationToken cancellationToken)
+
+ +

Get the DreamMaker information

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the DreamMaker information
+ +

Implemented in Tgstation.Server.Client.Components.DreamMakerClient.

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<DreamMaker> Tgstation.Server.Client.Components.IDreamMakerClient.Update (DreamMaker dreamMaker,
CancellationToken cancellationToken 
)
+
+ +

Updates the DreamMaker setttings

+
Parameters
+ + + +
dreamMakerThe DreamMaker to update
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Client.Components.DreamMakerClient.

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.png b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.png new file mode 100644 index 0000000000000000000000000000000000000000..367feacbdd064c5b804dc705fde97a16f627beb7 GIT binary patch literal 1207 zcmeAS@N?(olHy`uVBq!ia0y~yU~~hr12~w0WY9;Q4?s#Hz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-op1A&^?uWLKNTCc_T88oKKsWJeuKld-@eP1ugPkN)@-=^`-rdUIkxN1a{oQs zmHo!(qW&KSYqg&8HGCJ^zCY@e?(~<4@B4q^{qM}Wx0`>j+j9Mu)~d4O$8KuMXXU?- z+nRSK>(yQ59~Dde6EHP3ysOzft~5cx?y2uPR&n!6UV5x-L{EDA!z;%oX6?yYkg6IaaqL5v;m_*M`j5FW$tBhs-f?QA zopEv7Z?o9o3S&kPvyd*L|Pv zeawG;#0}B#)oC&RXZ(`B8>Rc}YmE9k!&~{X2PS_xFr~rHt>^Ja#t#gC&3d-ZVw77F z-!7=Y`k@mPC!K-{YmRUTge9?Xyl&k%B`9d=6d{2Fm%lPkVCv8?WODiXd9n;+6EGG7 z_iCuQH_Q-HK2RUv#KNI%$kc)!zer|LCjHtx;m)?)>K%34a&OPmHS_fHy!73xXOc)* z(v&3|gchr`PL)vAT+_Dkjs2uEFQ%{m-&Xzg*p~?^YfF!;+jHxPdflWm1^v2W%ARqi z2Xuoc&3TuSySnh(j&J#&&9BEMPv2ShQ2iud|Hr=bjJH0-*%Ye3W<56jrTvfk`6c_m z-K#S_iUT`!+)`;bt|sVGdyyg$I30d=y1}#)V&8P zo+Pz*{W4(8bCl37 + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Components.IInstanceClient Member List
+
+ + + + + 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 new file mode 100644 index 0000000000..64afc492b2 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html @@ -0,0 +1,378 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components.IInstanceClient Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components.IInstanceClient Interface Reference
+
+
+ +

For managing a single Instance + More...

+
+Inheritance diagram for Tgstation.Server.Client.Components.IInstanceClient:
+
+
+ + +Tgstation.Server.Client.Components.InstanceClient + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

Instance Metadata [get]
 The Instance used to create the IInstanceClient More...
 
IByondClient Byond [get]
 Access the IByondClient More...
 
IRepositoryClient Repository [get]
 Access the IRepositoryClient More...
 
IDreamDaemonClient DreamDaemon [get]
 Access the IDreamDaemonClient More...
 
IConfigurationClient Configuration [get]
 Access the IConfigurationClient More...
 
IInstanceUserClient Users [get]
 Access the IInstanceUserClient More...
 
IChatBotsClient ChatBots [get]
 Access the IChatBotsClient More...
 
IDreamMakerClient DreamMaker [get]
 Access the IDreamMakerClient More...
 
IJobsClient Jobs [get]
 Access the IJobsClient More...
 
+

Detailed Description

+

For managing a single Instance

+ +

Definition at line 9 of file IInstanceClient.cs.

+

Property Documentation

+ +

◆ Byond

+ +
+
+ + + + + +
+ + + + +
IByondClient Tgstation.Server.Client.Components.IInstanceClient.Byond
+
+get
+
+ +

Access the IByondClient

+ +

Definition at line 19 of file IInstanceClient.cs.

+
19 { get; }
+

Referenced by Tgstation.Server.Tests.Instance.InstanceTest.RunTests().

+ +
+
+ +

◆ ChatBots

+ +
+
+ + + + + +
+ + + + +
IChatBotsClient Tgstation.Server.Client.Components.IInstanceClient.ChatBots
+
+get
+
+ +

Access the IChatBotsClient

+ +

Definition at line 44 of file IInstanceClient.cs.

+
44 { get; }
+
+
+ +

◆ Configuration

+ +
+
+ + + + + +
+ + + + +
IConfigurationClient Tgstation.Server.Client.Components.IInstanceClient.Configuration
+
+get
+
+ +

Access the IConfigurationClient

+ +

Definition at line 34 of file IInstanceClient.cs.

+
34 { get; }
+

Referenced by Tgstation.Server.Tests.Instance.InstanceTest.RunTests().

+ +
+
+ +

◆ DreamDaemon

+ +
+
+ + + + + +
+ + + + +
IDreamDaemonClient Tgstation.Server.Client.Components.IInstanceClient.DreamDaemon
+
+get
+
+ +

Access the IDreamDaemonClient

+ +

Definition at line 29 of file IInstanceClient.cs.

+
29 { get; }
+
+
+ +

◆ DreamMaker

+ +
+
+ + + + + +
+ + + + +
IDreamMakerClient Tgstation.Server.Client.Components.IInstanceClient.DreamMaker
+
+get
+
+ +

Access the IDreamMakerClient

+ +

Definition at line 49 of file IInstanceClient.cs.

+
49 { get; }
+
+
+ +

◆ Jobs

+ +
+
+ + + + + +
+ + + + +
IJobsClient Tgstation.Server.Client.Components.IInstanceClient.Jobs
+
+get
+
+ +

Access the IJobsClient

+ +

Definition at line 54 of file IInstanceClient.cs.

+
54 { get; }
+

Referenced by Tgstation.Server.Tests.Instance.InstanceTest.RunTests().

+ +
+
+ +

◆ Metadata

+ +
+
+ + + + + +
+ + + + +
Instance Tgstation.Server.Client.Components.IInstanceClient.Metadata
+
+get
+
+ +

The Instance used to create the IInstanceClient

+ +

Definition at line 14 of file IInstanceClient.cs.

+
14 { get; }
+

Referenced by Tgstation.Server.Tests.Instance.InstanceTest.RunTests().

+ +
+
+ +

◆ Repository

+ +
+
+ + + + + +
+ + + + +
IRepositoryClient Tgstation.Server.Client.Components.IInstanceClient.Repository
+
+get
+
+ +

Access the IRepositoryClient

+ +

Definition at line 24 of file IInstanceClient.cs.

+
24 { get; }
+
+
+ +

◆ Users

+ +
+
+ + + + + +
+ + + + +
IInstanceUserClient Tgstation.Server.Client.Components.IInstanceClient.Users
+
+get
+
+ +

Access the IInstanceUserClient

+ +

Definition at line 39 of file IInstanceClient.cs.

+
39 { get; }
+
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.png b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.png new file mode 100644 index 0000000000000000000000000000000000000000..49a5ddcda9f1de39b5419f2e405d23b48f4cd19d GIT binary patch literal 1114 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!12~w0z$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-op}?T`uf46UP}`iA&nI?ZNq&7n`Ps76d%x!W zV9xm+AJO2o_yc`ews`1cKQCdpO%$Xe7<_=;C7h=fZhZPKbFGd^ zZRYQ(r9W-mF3bLxz4jz&S6lk*joET@zdu}?7#rtY?)NT6XHDqaZ+**)Yv)ClPk)$V z{CU>K5B~x-U)vCq@!53Cw&kM9AIi5}$eojQt@*SJ=lfTtZ}c6tH$Qv$p)+@$-RqYx zvdrF{y1{f^>C-=-H;+$mE!%kKTBjr zVR(PhJCSh-LmDisIk^>9w6F?XVGq+>y2MNKX&8h46@CY<2XR1&W%K7RVHF5E#MJTf zuvR9c3oxDzd4(Y2392{b5EF-1A|uOGv}hzxdap>>+O7Ni?YCb0WfiEZsp?to6){O9 z&sjIck6DhI}?3hxPDU3Z~cggH^esBHSF)GPu~?E{l0Dg{C#IT-d3A` ziM@A)FMnT@)y&J8i+6wAw}d~TDDkmX&l|tCoqIpqZDUv}t+#3cE`jcq&UZjAi0 zL4x_yJ~6Z3FUow5y?J!nQfl}0;`WwZ9l5-(4GgsP!#3>bTH^TaGt;#0vZm6!y}yjF z-uUX*#(F-Hw>fYxM^1l~>~Qzv{X}2AKc+UfJ7Yh**wg)%>Dp7% z68EPvQ4ys!&a1!}q`udT)H?8hB5|M_1_N=&88Q*#=#9V_eA{(Srxwfn>DxOXWPt8a6c%HC$lUZCc= z{-U + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Components.IInstanceUserClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.Components.IInstanceUserClient, including all inherited members.

+ + + + + + + +
Create(InstanceUser instanceUser, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IInstanceUserClient
Delete(InstanceUser instanceUser, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IInstanceUserClient
GetId(InstanceUser instanceUser, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IInstanceUserClient
List(CancellationToken cancellationToken)Tgstation.Server.Client.Components.IInstanceUserClient
Read(CancellationToken cancellationToken)Tgstation.Server.Client.Components.IInstanceUserClient
Update(InstanceUser instanceUser, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IInstanceUserClient
+ + + + 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 new file mode 100644 index 0000000000..1b5b4d24d5 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html @@ -0,0 +1,345 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components.IInstanceUserClient Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components.IInstanceUserClient Interface Reference
+
+
+ +

For managing InstanceUsers + More...

+
+Inheritance diagram for Tgstation.Server.Client.Components.IInstanceUserClient:
+
+
+ + +Tgstation.Server.Client.Components.InstanceUserClient + +
+ + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Task< InstanceUserRead (CancellationToken cancellationToken)
 Get the InstanceUser associated with the logged on user More...
 
Task< InstanceUserGetId (InstanceUser instanceUser, CancellationToken cancellationToken)
 Get a specific instanceUser More...
 
Task< IReadOnlyList< InstanceUser > > List (CancellationToken cancellationToken)
 Get the InstanceUsers in the Instance More...
 
Task< InstanceUserUpdate (InstanceUser instanceUser, CancellationToken cancellationToken)
 Update a instanceUser More...
 
Task< InstanceUserCreate (InstanceUser instanceUser, CancellationToken cancellationToken)
 Create a instanceUser More...
 
Task Delete (InstanceUser instanceUser, CancellationToken cancellationToken)
 Delete a instanceUser More...
 
+

Detailed Description

+

For managing InstanceUsers

+ +

Definition at line 11 of file IInstanceUserClient.cs.

+

Member Function Documentation

+ +

◆ Create()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<InstanceUser> Tgstation.Server.Client.Components.IInstanceUserClient.Create (InstanceUser instanceUser,
CancellationToken cancellationToken 
)
+
+ +

Create a instanceUser

+
Parameters
+ + + +
instanceUserThe InstanceUser to create
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> reulting in the new InstanceUser
+ +

Implemented in Tgstation.Server.Client.Components.InstanceUserClient.

+ +
+
+ +

◆ Delete()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.Components.IInstanceUserClient.Delete (InstanceUser instanceUser,
CancellationToken cancellationToken 
)
+
+ +

Delete a instanceUser

+
Parameters
+ + + +
instanceUserThe InstanceUser to delete
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Client.Components.InstanceUserClient.

+ +
+
+ +

◆ GetId()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<InstanceUser> Tgstation.Server.Client.Components.IInstanceUserClient.GetId (InstanceUser instanceUser,
CancellationToken cancellationToken 
)
+
+ +

Get a specific instanceUser

+
Parameters
+ + + +
instanceUserThe InstanceUser to get
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the requested instanceUser
+ +

Implemented in Tgstation.Server.Client.Components.InstanceUserClient.

+ +
+
+ +

◆ List()

+ +
+
+ + + + + + + + +
Task<IReadOnlyList<InstanceUser> > Tgstation.Server.Client.Components.IInstanceUserClient.List (CancellationToken cancellationToken)
+
+ +

Get the InstanceUsers in the Instance

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in a IReadOnlyList<T> of InstanceUsers in the instance
+ +

Implemented in Tgstation.Server.Client.Components.InstanceUserClient.

+ +
+
+ +

◆ Read()

+ +
+
+ + + + + + + + +
Task<InstanceUser> Tgstation.Server.Client.Components.IInstanceUserClient.Read (CancellationToken cancellationToken)
+
+ +

Get the InstanceUser associated with the logged on user

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the InstanceUser associated with the logged on user
+ +

Implemented in Tgstation.Server.Client.Components.InstanceUserClient.

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<InstanceUser> Tgstation.Server.Client.Components.IInstanceUserClient.Update (InstanceUser instanceUser,
CancellationToken cancellationToken 
)
+
+ +

Update a instanceUser

+
Parameters
+ + + +
instanceUserThe InstanceUser to update
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Client.Components.InstanceUserClient.

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.png b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.png new file mode 100644 index 0000000000000000000000000000000000000000..fb3cfa025ce02ae608760176532cdca66ddd46fb GIT binary patch literal 1184 zcmeAS@N?(olHy`uVBq!ia0y~yU~~hr12~w0WY9;Q4?s#Hz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opT=<1ozW;w> z`)!saX3xvN>VmW?kG{z}FykT1qy1BYyjD#KQd-2YgkfKJ5(|g6Aydm#3C2TSJq(GV zJzF0zRNt1L|Nm@Z|73<|x02F#MjcoG$#D73mXlKXm-e;sC*6}aUtW0Tp#c+*RkTdO z+GFPqW#0#?xcyJ|822&u9{+dxpXx8)S--WsR{QOd8^Ix$bM?=a{S2_)^K6y-g+1G? zcCqGrS1~(ty?%W)YtCIC^Sz~JwNz!n^vS2l@tD<=IW=PJ>U1OIu|S>&b3?8 z{O+I3)V=r5?=0-USofOY-4f|2rf=7h-<)PY!22az;&mq5j)`@A$_`u)gjL-dHV7#@ zM05%&tU1CVa7{Q_bLkQ!dEipYcGH>1SO**Id9#!(x^!ydq88``;awds{B~4kfL1?i`>s5nk zU)?8V{(k&vYSetuC#Z`K>Q^w6xs$|!E45ZPT;8S1;;T zL|>AY2#ScWo^aRGe0!JQ ze~MmzK6TgB#lIGsm!7>Z5_~5|?fK%PWv1uDb?2YI@t*s&P3!$HCF*(WeqKIRwSQ*u zb>?Gz%T?~WnQuv{XX~l`Ibn(Pi|Yp0m~}nPFP%@EvSf-%?Sdm3o{6e%o?P07UO^F{ mc&bW@nU?CQdwLVg7x~-D&PyA72 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000..b453a84a52 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client-members.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Components.IJobsClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.Components.IJobsClient, including all inherited members.

+ + + + + +
Cancel(Job job, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IJobsClient
GetId(Job job, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IJobsClient
List(CancellationToken cancellationToken)Tgstation.Server.Client.Components.IJobsClient
ListActive(CancellationToken cancellationToken)Tgstation.Server.Client.Components.IJobsClient
+ + + + 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 new file mode 100644 index 0000000000..c1c46d0716 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client.html @@ -0,0 +1,263 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components.IJobsClient Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components.IJobsClient Interface Reference
+
+
+ +

Access to running jobs + More...

+
+Inheritance diagram for Tgstation.Server.Client.Components.IJobsClient:
+
+
+ + +Tgstation.Server.Client.Components.JobsClient + +
+ + + + + + + + + + + + + + +

+Public Member Functions

Task< IReadOnlyList< Job > > List (CancellationToken cancellationToken)
 List the Api.Models.Internal.Job.Ids in the Instance More...
 
Task< IReadOnlyList< Job > > ListActive (CancellationToken cancellationToken)
 List the active Jobs in the Instance More...
 
Task< JobGetId (Job job, CancellationToken cancellationToken)
 Get a job More...
 
Task Cancel (Job job, CancellationToken cancellationToken)
 Cancels a job More...
 
+

Detailed Description

+

Access to running jobs

+ +

Definition at line 12 of file IJobsClient.cs.

+

Member Function Documentation

+ +

◆ Cancel()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.Components.IJobsClient.Cancel (Job job,
CancellationToken cancellationToken 
)
+
+ +

Cancels a job

+
Parameters
+ + + +
jobThe Job to cancel
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Client.Components.JobsClient.

+ +

Referenced by Tgstation.Server.Tests.Instance.ByondTest.TestInstall511().

+ +
+
+ +

◆ GetId()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<Job> Tgstation.Server.Client.Components.IJobsClient.GetId (Job job,
CancellationToken cancellationToken 
)
+
+ +

Get a job

+
Parameters
+ + + +
jobThe Job to get
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the Job
+ +

Implemented in Tgstation.Server.Client.Components.JobsClient.

+ +

Referenced by Tgstation.Server.Tests.Instance.ByondTest.TestInstall511().

+ +
+
+ +

◆ List()

+ +
+
+ + + + + + + + +
Task<IReadOnlyList<Job> > Tgstation.Server.Client.Components.IJobsClient.List (CancellationToken cancellationToken)
+
+ +

List the Api.Models.Internal.Job.Ids in the Instance

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in a IReadOnlyList<T> of the Api.Models.Internal.Job.Ids in the Instance
+ +

Implemented in Tgstation.Server.Client.Components.JobsClient.

+ +
+
+ +

◆ ListActive()

+ +
+
+ + + + + + + + +
Task<IReadOnlyList<Job> > Tgstation.Server.Client.Components.IJobsClient.ListActive (CancellationToken cancellationToken)
+
+ +

List the active Jobs in the Instance

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in a IReadOnlyList<T> of the active Jobs in the Instance
+ +

Implemented in Tgstation.Server.Client.Components.JobsClient.

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client.png b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client.png new file mode 100644 index 0000000000000000000000000000000000000000..b940f4108059a6193199ef6698d4a83193fbd65d GIT binary patch literal 1058 zcmeAS@N?(olHy`uVBq!ia0y~yV3Yu|12~w0%_KVf$AUZ2aK$@D&wQ`A`6>g?>_`RA4#-}T|%cRxFY zZRH2V^GE(i=WA^$Sa{2W_Y)`F`^o*dM zeQD?S2INJYOxX5j<3)=oju$fJ>~qt9JQ6hAb#kZA8M9q_o*cU?W(mcz|4m9|D(+eK z@zX)c#|M|>pO4l&Ht%fV zner{s)>^(rYt}tHe8K5=t@hFAO#7w31$W5b-)Qofb>cMLvad5jzI}9f)mOCdLG24W z&xr?qb+4)3y=l_HId^_C#9#lv-K0s9KdgcM#qWeFMkX5%eg@_MEdz!yq|g$NDM1Ib^Q1DH+#r8n2rb@3cn!o+Ow`smUV3_Tznt*r3)U}8=PNnq&V;%NwMWHbOu zB1abKk}m=irlm&CTQom4a$0+b>m;v9zyvTUB_u)RUw>Q|O$ zHn;xH+}88^gslAYghM6QrEJ+ZGv4Rlvad2|y5SaZB1pR9wXWj*j~xufJEsO2E^QI) zu?{bOw9(0a#f;BN+uQzz&8n%XI#yxu^7H4gu8qr8ZJt=)S}U9S-16LuY5lK(@xKBX z|MMSgv_gshWkvfE>VffJsMERs=&p_0^1?GFXU9+4x9)#lCX=z;nn_<6YUO>_J9<`4 zkYjM0 + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.Components.IRepositoryClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.Components.IRepositoryClient, including all inherited members.

+ + + + + +
Clone(Repository repository, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IRepositoryClient
Delete(CancellationToken cancellationToken)Tgstation.Server.Client.Components.IRepositoryClient
Read(CancellationToken cancellationToken)Tgstation.Server.Client.Components.IRepositoryClient
Update(Repository repository, CancellationToken cancellationToken)Tgstation.Server.Client.Components.IRepositoryClient
+ + + + 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 new file mode 100644 index 0000000000..348a2c7977 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.html @@ -0,0 +1,259 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components.IRepositoryClient Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components.IRepositoryClient Interface Reference
+
+
+ +

For managing the Repository + More...

+
+Inheritance diagram for Tgstation.Server.Client.Components.IRepositoryClient:
+
+
+ + +Tgstation.Server.Client.Components.RepositoryClient + +
+ + + + + + + + + + + + + + +

+Public Member Functions

Task< RepositoryRead (CancellationToken cancellationToken)
 Get the Repository represented by the IRepositoryClient More...
 
Task< RepositoryUpdate (Repository repository, CancellationToken cancellationToken)
 Update the Repository More...
 
Task< RepositoryClone (Repository repository, CancellationToken cancellationToken)
 Clones a repository More...
 
Task< RepositoryDelete (CancellationToken cancellationToken)
 Deletes the Repository More...
 
+

Detailed Description

+

For managing the Repository

+ +

Definition at line 10 of file IRepositoryClient.cs.

+

Member Function Documentation

+ +

◆ Clone()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<Repository> Tgstation.Server.Client.Components.IRepositoryClient.Clone (Repository repository,
CancellationToken cancellationToken 
)
+
+ +

Clones a repository

+
Parameters
+ + + +
repositoryThe Repository to clone
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the updated Repository
+ +

Implemented in Tgstation.Server.Client.Components.RepositoryClient.

+ +
+
+ +

◆ Delete()

+ +
+
+ + + + + + + + +
Task<Repository> Tgstation.Server.Client.Components.IRepositoryClient.Delete (CancellationToken cancellationToken)
+
+ +

Deletes the Repository

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the updated Repository
+ +

Implemented in Tgstation.Server.Client.Components.RepositoryClient.

+ +
+
+ +

◆ Read()

+ +
+
+ + + + + + + + +
Task<Repository> Tgstation.Server.Client.Components.IRepositoryClient.Read (CancellationToken cancellationToken)
+
+ +

Get the Repository represented by the IRepositoryClient

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the Repository
+ +

Implemented in Tgstation.Server.Client.Components.RepositoryClient.

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<Repository> Tgstation.Server.Client.Components.IRepositoryClient.Update (Repository repository,
CancellationToken cancellationToken 
)
+
+ +

Update the Repository

+
Parameters
+ + + +
repositoryThe Repository to update
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the updated Repository
+ +

Implemented in Tgstation.Server.Client.Components.RepositoryClient.

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.png b/interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.png new file mode 100644 index 0000000000000000000000000000000000000000..9df7781436cc3290801b63760a45698924874517 GIT binary patch literal 1179 zcmeAS@N?(olHy`uVBq!ia0y~yV6+6X12~w0Wa#EkPl1#~fKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+1B;fYi(^Oy5$*S@Rvwpv+?zta)_uQ+_@ZjQFA$Pt7m;L`AUU}_C zV8z?$lk7LHO{|{sO6@`8^}ajoU-{qEUOlsZZ+U!2v0?7oD<#LHZtBTr#lPQ~RXSto zs{H;3$sYL&yc28ZK5@JMhW~!;^%uu}8?T>t$8b-s$htHptrwRQS@YcXC`FmuT~~Nk zv3vbY&e=9QUAE=?%3mX&FioE)hIamAc)P8xi4)on!Z2V!!yEyIIDT!s$81@jtzfKR3QN``v7jx?}tAul=^|i>vkbS0`^4 zb3gF?RqyR@Y$LZ)_4>Sj4Eh)5Ppq~J2rqVj$+X9#-Zd|A&c!@d55_Z7o-inR6)_0H zqDH=G>6A%YOQ)DJ?g@(r#+fTnqG8`YA=v}FfHCJFU(m^y5DARGWlz`y0w*zdXq;qp zK{o>yy%b4b+FGBK=-5djfs-aL>6kP}#kFLT_V0d` z%j=GxuRpu{*P`DZla5&>x$ivJH??MxPw{+SHRY3AZ)@5bXJxND|M-Mw(DM2J+Jo0_ zT>RnI_DTMea_8MyY-7&o-@|vJHsk+?fB!E1y;c2vtHt%p*G~PbVfh73M2$#^=wa>G zzST=_mGkEI*c)0Yl=I}z?t&zt6xKYpy-HEeNJ+@FGtYiPSElmg{gSeicQffpzdf)!uw$E2F!^SPLIN zS*m#_&s5Frc7n$_-`u1Ur@UR!v6j19rrmk*;d|%q(zx|Ie*=@yC7*L|dGc%0OsdZH z%38&PlF;_q3vB1FYpvfAefasDooD7r%)P(%d2Z18m!D^SynXQQTC>TY3y+zFPupKo zW0$=Djg7E?>HQUcBw)iLJ}`tL$~Ccg{ + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.IAdministrationClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.IAdministrationClient, including all inherited members.

+ + + + +
Read(CancellationToken cancellationToken)Tgstation.Server.Client.IAdministrationClient
Restart(CancellationToken cancellationToken)Tgstation.Server.Client.IAdministrationClient
Update(Administration administration, CancellationToken cancellationToken)Tgstation.Server.Client.IAdministrationClient
+ + + + 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 new file mode 100644 index 0000000000..5979e02764 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client.html @@ -0,0 +1,220 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.IAdministrationClient Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.IAdministrationClient Interface Reference
+
+
+ +

For managing server administration + More...

+
+Inheritance diagram for Tgstation.Server.Client.IAdministrationClient:
+
+
+ + +Tgstation.Server.Client.AdministrationClient + +
+ + + + + + + + + + + +

+Public Member Functions

Task< AdministrationRead (CancellationToken cancellationToken)
 Get the Administration represented by the IAdministrationClient More...
 
Task Update (Administration administration, CancellationToken cancellationToken)
 Updates the Administration setttings More...
 
Task Restart (CancellationToken cancellationToken)
 Restarts the TGS server More...
 
+

Detailed Description

+

For managing server administration

+ +

Definition at line 10 of file IAdministrationClient.cs.

+

Member Function Documentation

+ +

◆ Read()

+ +
+
+ + + + + + + + +
Task<Administration> Tgstation.Server.Client.IAdministrationClient.Read (CancellationToken cancellationToken)
+
+ +

Get the Administration represented by the IAdministrationClient

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the Administration represented by the IAdministrationClient
+ +

Implemented in Tgstation.Server.Client.AdministrationClient.

+ +

Referenced by Tgstation.Server.Tests.AdministrationTest.TestRead().

+ +
+
+ +

◆ Restart()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Client.IAdministrationClient.Restart (CancellationToken cancellationToken)
+
+ +

Restarts the TGS server

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Client.AdministrationClient.

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.IAdministrationClient.Update (Administration administration,
CancellationToken cancellationToken 
)
+
+ +

Updates the Administration setttings

+
Parameters
+ + + +
administrationThe Administration to update
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Client.AdministrationClient.

+ +

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

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client.png b/interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client.png new file mode 100644 index 0000000000000000000000000000000000000000..2f8fdb2c94ff3870e3e08f9338fa5ed2a8f8150a GIT binary patch literal 935 zcmeAS@N?(olHy`uVBq!ia0y~yU}Ofe12{mWR?-6zASDst6XN>+|9>F!#hb6C{f8z1 zSzvtNzya3IJMus-M@f)hFauB#2wXiCV#L6}Z070W7*fIbcJ9r-*9IJI^&75yuYYn` zE$+sfif3tkS#ANTIXq98Cr1ki%C1vju!x%MXyn0m@_u+V`CAK(AhOnb`D=&GJPZG!kcc-CLJ_VWpG}m`a3g3ctf48{Tsc8zt7|L zPW*PO|M2%q$JYc+_uf`@Ej(MT_CeJO`>zq&D^I+?HA8Kuc&PD?Z45$8hXfKY2<4_% zXDL0}u;FG#{2{j&b2Hi>8hsW_?~`9-#g<&2lGb=4+lhf`>VG|n6@ID=Zk!X8=FR!t z`nY|CBJ<6Xu6^kN2fv-XT(fFvgJXG)WJfWJ#Kfoaoo6QB>6S8%xW{UK~j0-&QJW4)jhcUY9=DIi2Cym|;Nb9@C-KI0ZoT-g4>`#z{X;9$ zUwz4!XMCBd)7iIG_}2cnJNj58E|xF6sXwWvYn9}h{hJv+EX|U@;pkwXpkx)z_#po)D?@v>(Sg@f1tuM2Klo8#lH<7}DHC`mIT|r2s7R_b zL)ac{3@r%uNrr|AF!7TQ?2`k$H0xKb5AymM?3$Qn2a74g1;6`ew)WKD_fK1&yTkd+ znT=t$PfYK6GVf66{Ok!Q{5)>5-*cVQzxhVXg&gJLk7=8yr=+P~uKH`TB>ls)vWdUv zgxG(7<-7HIol1>)3xaOF_Xi4C-fcMdfLZnMn#7~ z#?EbY00%$3;=C#2+qV(W~|ia+HC9n4pM7YslA zJFYS||D42$eZj0Bc(iWY)kN8^2F2AHi4Nx@IWE)cQw+}+Xg`^A@RQyOvBFXjWygKh z0V21{wTy(L1APs$XO_zEn6Q5?yCHMy`TMMy)~CZRs;4RYta;LT(C0WLi(AS(ep`k*3vU*z6`%E2>F{!(2Yv;gKJ#bpD~TJG$ItwE`s(+B vG6Un!icbP0l+XkK4{xWa literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_api_client-members.html b/interface_tgstation_1_1_server_1_1_client_1_1_i_api_client-members.html new file mode 100644 index 0000000000..0313655be9 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_api_client-members.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.IApiClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.IApiClient, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + +
AddRequestLogger(IRequestLogger requestLogger)Tgstation.Server.Client.IApiClient
Create< TBody, TResult >(string route, TBody body, CancellationToken cancellationToken)Tgstation.Server.Client.IApiClient
Create< TBody, TResult >(string route, TBody body, long instanceId, CancellationToken cancellationToken)Tgstation.Server.Client.IApiClient
Create< TResult >(string route, CancellationToken cancellationToken)Tgstation.Server.Client.IApiClient
Create< TResult >(string route, long instanceId, CancellationToken cancellationToken)Tgstation.Server.Client.IApiClient
Delete(string route, CancellationToken cancellationToken)Tgstation.Server.Client.IApiClient
Delete(string route, long instanceId, CancellationToken cancellationToken)Tgstation.Server.Client.IApiClient
Delete< TBody >(string route, TBody body, long instanceId, CancellationToken cancellationToken)Tgstation.Server.Client.IApiClient
Delete< TResult >(string route, long instanceId, CancellationToken cancellationToken)Tgstation.Server.Client.IApiClient
HeadersTgstation.Server.Client.IApiClient
Patch< TResult >(string route, long instanceId, CancellationToken cancellationToken)Tgstation.Server.Client.IApiClient
Read< TResult >(string route, CancellationToken cancellationToken)Tgstation.Server.Client.IApiClient
Read< TResult >(string route, long instanceId, CancellationToken cancellationToken)Tgstation.Server.Client.IApiClient
TimeoutTgstation.Server.Client.IApiClient
Update< TBody >(string route, TBody body, CancellationToken cancellationToken)Tgstation.Server.Client.IApiClient
Update< TBody, TResult >(string route, TBody body, CancellationToken cancellationToken)Tgstation.Server.Client.IApiClient
Update< TBody, TResult >(string route, TBody body, long instanceId, CancellationToken cancellationToken)Tgstation.Server.Client.IApiClient
Update< TResult >(string route, CancellationToken cancellationToken)Tgstation.Server.Client.IApiClient
UrlTgstation.Server.Client.IApiClient
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html b/interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html new file mode 100644 index 0000000000..6166998d24 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html @@ -0,0 +1,1060 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.IApiClient Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.IApiClient Interface Reference
+
+
+ +

Web interface for the API + More...

+
+Inheritance diagram for Tgstation.Server.Client.IApiClient:
+
+
+ + +IDisposable +Tgstation.Server.Client.ApiClient + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

void AddRequestLogger (IRequestLogger requestLogger)
 Adds a requestLogger to the request pipeline More...
 
Task< TResult > Create< TBody, TResult > (string route, TBody body, CancellationToken cancellationToken)
 Run an HTTP PUT request More...
 
Task< TResult > Create< TResult > (string route, CancellationToken cancellationToken)
 Run an HTTP PUT request More...
 
Task< TResult > Read< TResult > (string route, CancellationToken cancellationToken)
 Run an HTTP GET request More...
 
Task< TResult > Update< TBody, TResult > (string route, TBody body, CancellationToken cancellationToken)
 Run an HTTP POST request More...
 
Task< TResult > Update< TResult > (string route, CancellationToken cancellationToken)
 Run an HTTP POST request More...
 
Task Update< TBody > (string route, TBody body, CancellationToken cancellationToken)
 Run an HTTP POST request More...
 
Task Delete (string route, CancellationToken cancellationToken)
 Run an HTTP DELETE request More...
 
Task< TResult > Create< TBody, TResult > (string route, TBody body, long instanceId, CancellationToken cancellationToken)
 Run an HTTP PUT request More...
 
Task< TResult > Create< TResult > (string route, long instanceId, CancellationToken cancellationToken)
 Run an HTTP PUT request More...
 
Task< TResult > Patch< TResult > (string route, long instanceId, CancellationToken cancellationToken)
 Run an HTTP PATCH request More...
 
Task< TResult > Read< TResult > (string route, long instanceId, CancellationToken cancellationToken)
 Run an HTTP GET request More...
 
Task< TResult > Update< TBody, TResult > (string route, TBody body, long instanceId, CancellationToken cancellationToken)
 Run an HTTP POST request More...
 
Task Delete (string route, long instanceId, CancellationToken cancellationToken)
 Run an HTTP DELETE request More...
 
Task Delete< TBody > (string route, TBody body, long instanceId, CancellationToken cancellationToken)
 Run an HTTP DELETE request More...
 
Task< TResult > Delete< TResult > (string route, long instanceId, CancellationToken cancellationToken)
 Run an HTTP DELETE request More...
 
+ + + + + + + + + + +

+Properties

ApiHeaders Headers [get, set]
 The ApiHeaders the IApiClient uses More...
 
Uri Url [get]
 The Uri pointing the tgstation-server More...
 
TimeSpan Timeout [get, set]
 The request timeout More...
 
+

Detailed Description

+

Web interface for the API

+ +

Definition at line 11 of file IApiClient.cs.

+

Member Function Documentation

+ +

◆ AddRequestLogger()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Client.IApiClient.AddRequestLogger (IRequestLogger requestLogger)
+
+ +

Adds a requestLogger to the request pipeline

+
Parameters
+ + +
requestLoggerThe IRequestLogger to add
+
+
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +

◆ Create< TBody, TResult >() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Create< TBody, TResult > (string route,
TBody body,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP PUT request

+
Template Parameters
+ + + +
TBodyThe type to of the request body
TResultThe type of the response body
+
+
+
Parameters
+ + + + +
routeThe server route to make the request to
bodyThe request body
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the response body as a TResult
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +

◆ Create< TBody, TResult >() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Create< TBody, TResult > (string route,
TBody body,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP PUT request

+
Template Parameters
+ + + +
TBodyThe type to of the request body
TResultThe type of the response body
+
+
+
Parameters
+ + + + + +
routeThe server route to make the request to
bodyThe request body
instanceIdThe Api.Models.Instance.Id to make the request to
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the response body as a TResult
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +

◆ Create< TResult >() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Create< TResult > (string route,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP PUT request

+
Template Parameters
+ + +
TResultThe type of the response body
+
+
+
Parameters
+ + + +
routeThe server route to make the request to
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the response body as a TResult
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +

◆ Create< TResult >() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Create< TResult > (string route,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP PUT request

+
Template Parameters
+ + +
TResultThe type of the response body
+
+
+
Parameters
+ + + + +
routeThe server route to make the request to
instanceIdThe Api.Models.Instance.Id to make the request to
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the response body as a TResult
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +

◆ Delete() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.IApiClient.Delete (string route,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP DELETE request

+
Parameters
+ + + +
routeThe server route to make the request to
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +

◆ Delete() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.IApiClient.Delete (string route,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP DELETE request

+
Parameters
+ + + + +
routeThe server route to make the request to
instanceIdThe Api.Models.Instance.Id to make the request to
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +

◆ Delete< TBody >()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.IApiClient.Delete< TBody > (string route,
TBody body,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP DELETE request

+
Template Parameters
+ + +
TBodyThe type to of the request body
+
+
+
Parameters
+ + + + + +
routeThe server route to make the request to
bodyThe request body
instanceIdThe Api.Models.Instance.Id to make the request to
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +

◆ Delete< TResult >()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Delete< TResult > (string route,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP DELETE request

+
Template Parameters
+ + +
TResultThe type of the response body
+
+
+
Parameters
+ + + + +
routeThe server route to make the request to
instanceIdThe Api.Models.Instance.Id to make the request to
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the response body as a TResult
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +

◆ Patch< TResult >()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Patch< TResult > (string route,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP PATCH request

+
Template Parameters
+ + +
TResultThe type of the response body
+
+
+
Parameters
+ + + + +
routeThe server route to make the request to
instanceIdThe Api.Models.Instance.Id to make the request to
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the response body as a TResult
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +

◆ Read< TResult >() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Read< TResult > (string route,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP GET request

+
Template Parameters
+ + +
TResultThe type of the response body
+
+
+
Parameters
+ + + +
routeThe server route to make the request to
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the response body as a TResult
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +

◆ Read< TResult >() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Read< TResult > (string route,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP GET request

+
Template Parameters
+ + +
TResultThe type of the response body
+
+
+
Parameters
+ + + + +
routeThe server route to make the request to
instanceIdThe Api.Models.Instance.Id to make the request to
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the response body as a TResult
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +

◆ Update< TBody >()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.IApiClient.Update< TBody > (string route,
TBody body,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP POST request

+
Template Parameters
+ + +
TBodyThe type to of the request body
+
+
+
Parameters
+ + + + +
routeThe server route to make the request to
bodyThe request body
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +

◆ Update< TBody, TResult >() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Update< TBody, TResult > (string route,
TBody body,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP POST request

+
Template Parameters
+ + + +
TBodyThe type to of the request body
TResultThe type of the response body
+
+
+
Parameters
+ + + + +
routeThe server route to make the request to
bodyThe request body
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the response body as a TResult
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +

◆ Update< TBody, TResult >() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Update< TBody, TResult > (string route,
TBody body,
long instanceId,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP POST request

+
Template Parameters
+ + + +
TBodyThe type to of the request body
TResultThe type of the response body
+
+
+
Parameters
+ + + + + +
routeThe server route to make the request to
bodyThe request body
instanceIdThe Api.Models.Instance.Id to make the request to
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the response body as a TResult
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+ +

◆ Update< TResult >()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<TResult> Tgstation.Server.Client.IApiClient.Update< TResult > (string route,
CancellationToken cancellationToken 
)
+
+ +

Run an HTTP POST request

+
Template Parameters
+ + +
TResultThe type of the response body
+
+
+
Parameters
+ + + +
routeThe server route to make the request to
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the response body as a TResult
+ +

Implemented in Tgstation.Server.Client.ApiClient.

+ +
+
+

Property Documentation

+ +

◆ Headers

+ +
+
+ + + + + +
+ + + + +
ApiHeaders Tgstation.Server.Client.IApiClient.Headers
+
+getset
+
+ +

The ApiHeaders the IApiClient uses

+ +

Definition at line 16 of file IApiClient.cs.

+
16 { get; set; }
+

Referenced by Tgstation.Server.Client.ServerClient.ServerClient().

+ +
+
+ +

◆ Timeout

+ +
+
+ + + + + +
+ + + + +
TimeSpan Tgstation.Server.Client.IApiClient.Timeout
+
+getset
+
+ +

The request timeout

+ +

Definition at line 26 of file IApiClient.cs.

+
26 { get; set; }
+
+
+ +

◆ Url

+ +
+
+ + + + + +
+ + + + +
Uri Tgstation.Server.Client.IApiClient.Url
+
+get
+
+ +

The Uri pointing the tgstation-server

+ +

Definition at line 21 of file IApiClient.cs.

+
21 { get; }
+
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.png b/interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.png new file mode 100644 index 0000000000000000000000000000000000000000..ad1af9a4226e2daa727689475e1b82460449b64c GIT binary patch literal 1092 zcmeAS@N?(olHy`uVBq!ia0vp^$AP$mgBeJsT;=x#QW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;dzpo{; zV$L4&#e7%)~5ASAC zkDvOH)xzi66p!tDR#{&Aq~MwV!dm97+nX<;w^cm%Uw{7k>ech@d+qyPU;XlYQ=Dhe za{haKlS6 za!=S@;IfzL!;%LK9~KjjEmlqm+STa6Fg?70;YT14Up%#OUe$svpFaOIdG>ZL!?CCw z_hMaHZ=Jg*B+utA>0kbc;f2Y5)(7{aa^0UzTkJnEcpmTZpw9R|mz8qrk^$Bbu{XA$vl>DG_KaX=JT0J-?zAD+RbQ<*+rZZC;r(ySTW6pvG<#$)Op4B&OE<0wSB3D+a~Wg7g@?{v8^+j z@3HwaiRwN}zR#ZfwH|2F*a=jcy~;t=l(&!=v+J+b;w;7v!P zxA!YkUtbLqSavBvyY=k;rCMu`o;(+_i*38ZT-&n?=gIjjldFDr=eb?pkNK__i?*ao zJjnkdcf4#P!=IJ+o-piK(8PS8AB5w!`+8}{#xdN##{7V77w7TEh5Qp{7uXo)F&2sU ztq5nBCnCd8M*>!#T6`}4n)35G`*k*{#Ks*|^aSdj^u%4-eU|+sA8q^j{%3DkU9j}L z6w&=QW8EuX-|v#SejJPz)9PdF4P>3MQXFgOl`m%U2pMven<$GHw= zTbHv>UUoe1_xGPKyL~6^TRgw*LgAM5h)Mq(@{4EecAfOk>wU4urLW+?0fo|+CnqeQ czkY51i7C)U`n0DtFv~M|y85}Sb4q9e0FxpX_y7O^ literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_api_client_factory-members.html b/interface_tgstation_1_1_server_1_1_client_1_1_i_api_client_factory-members.html new file mode 100644 index 0000000000..9f10bb4bed --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_api_client_factory-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.IApiClientFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.IApiClientFactory, including all inherited members.

+ + +
CreateApiClient(Uri url, ApiHeaders apiHeaders)Tgstation.Server.Client.IApiClientFactory
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_api_client_factory.html b/interface_tgstation_1_1_server_1_1_client_1_1_i_api_client_factory.html new file mode 100644 index 0000000000..5d0e60e311 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_api_client_factory.html @@ -0,0 +1,152 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.IApiClientFactory Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.IApiClientFactory Interface Reference
+
+
+ +

For creating IApiClients + More...

+
+Inheritance diagram for Tgstation.Server.Client.IApiClientFactory:
+
+
+ + +Tgstation.Server.Client.ApiClientFactory + +
+ + + + + +

+Public Member Functions

IApiClient CreateApiClient (Uri url, ApiHeaders apiHeaders)
 Create an IApiClient More...
 
+

Detailed Description

+

For creating IApiClients

+ +

Definition at line 9 of file IApiClientFactory.cs.

+

Member Function Documentation

+ +

◆ CreateApiClient()

+ +
+
+ + + + + + + + + + + + + + + + + + +
IApiClient Tgstation.Server.Client.IApiClientFactory.CreateApiClient (Uri url,
ApiHeaders apiHeaders 
)
+
+ +

Create an IApiClient

+
Parameters
+ + + +
urlThe base Uri
apiHeadersThe ApiHeaders for the IApiClient
+
+
+
Returns
A new IApiClient
+ +

Implemented in Tgstation.Server.Client.ApiClientFactory.

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_api_client_factory.png b/interface_tgstation_1_1_server_1_1_client_1_1_i_api_client_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..660bd0476edd51a786d257589b63d515c317b948 GIT binary patch literal 958 zcmeAS@N?(olHy`uVBq!ia0vp^pMf}lgBeKvUa;90NJ#|vgt-3y{~ySF@#br3|Dg#$ z78oBmaDcV*jy#adQ4-`A%m7pb0#{Fk7%?y~`+B-KhEy=Vo%^=$wE+j~arI04{wv?# z_R}EY&APCwYoAn1-JB((z;o=0{?aK$#(@lZOONsx>=!dW@W*QA`A)VgtMA#>J>8l) zm!U{@TjZMLhbNX+8htwx^!};zx1FX%XBc|F^)TFfz2)o~-QwF-`8L+O87HhtwA&YV ze%Icv^1rvkzZb=au08kr(&aZd1b092ef!w<+D_kV4=cJ;UsafS{&-Rw#`*cQK-W%< zE2kyqs9M#o51RRAmFt;1$BoPsLr&kRxW(I{d3=r48B?FLDq;t=)iMg*yv?}z_9-To zuQOjaS)S7iV_fv>Oj}C+B)iSkYcu_}PcevZRNnmY^vuP}-@X+rKC6;0_pQvh#Ab%I z&End;OB-d)?mXY3mbqqwaJ}7m%gx&1w{Kr7yKsBz&H0{OUr%LUvOk}kX1)Dv0#EVn zd5p%|e`Pj!pA5fNULfJIUjEq@9^1Qj_AT2w`}V?%Zu3(c@?SoVESdSZhUrJ2-Q3on zmyX;heZyQ6DDQW;<#d&FLYi(`!_TcV7@uALd^+AsbGy)i@-NH<#&;+DeEz)df_X}v z!hOD9eP^=snD01tOD5F8l_#;yh$kfQBmdU6+}~Yw+j4L3Q!?}1HC1f0%Gvctbv!@6 zPSX25U#0l!?c?h|ys5ch;Tg2y?R=fJ#JHE-(q%i8)G2Mz?HOXGJ&!kqSNpmOM-sjhWbWqV_s_^a6#FbOf45l1 zH_bWo589ba-ZcOI-Eys`@QJtUWqa$b!7+C!_}I4V;FuG=s=eOxzs>&CZN<0G95dMd zR?^_{rSputr_^NB3P(3w=PwRv%gf7)zkKWL+YcW%o!S3uhv%jG3&(>c43Ga*@r=K) zJb1&$Tea&Z$4}a~l>hmILreGSdJ1P7dSChzb!L*uez`NZx8;7nWWUhK=;Vpgo+H4_ O#^CAd=d#Wzp$Py_z3hYl literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_http_client-members.html b/interface_tgstation_1_1_server_1_1_client_1_1_i_http_client-members.html new file mode 100644 index 0000000000..751675faef --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_http_client-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.IHttpClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.IHttpClient, including all inherited members.

+ + + +
SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)Tgstation.Server.Client.IHttpClient
TimeoutTgstation.Server.Client.IHttpClient
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_http_client.html b/interface_tgstation_1_1_server_1_1_client_1_1_i_http_client.html new file mode 100644 index 0000000000..280cd9fc2b --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_http_client.html @@ -0,0 +1,189 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.IHttpClient Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.IHttpClient Interface Reference
+
+
+ +

For sending HTTP requests + More...

+
+Inheritance diagram for Tgstation.Server.Client.IHttpClient:
+
+
+ + +IDisposable +Tgstation.Server.Client.HttpClient + +
+ + + + + +

+Public Member Functions

Task< HttpResponseMessage > SendAsync (HttpRequestMessage request, CancellationToken cancellationToken)
 Send an HTTP request More...
 
+ + + + +

+Properties

TimeSpan Timeout [get, set]
 The request timeout More...
 
+

Detailed Description

+

For sending HTTP requests

+ +

Definition at line 11 of file IHttpClient.cs.

+

Member Function Documentation

+ +

◆ SendAsync()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<HttpResponseMessage> Tgstation.Server.Client.IHttpClient.SendAsync (HttpRequestMessage request,
CancellationToken cancellationToken 
)
+
+ +

Send an HTTP request

+
Parameters
+ + + +
requestThe HttpRequestMessage
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the HttpResponseMessage of the request
+ +

Implemented in Tgstation.Server.Client.HttpClient.

+ +

Referenced by Tgstation.Server.Client.ApiClient.RunRequest< TResult >().

+ +
+
+

Property Documentation

+ +

◆ Timeout

+ +
+
+ + + + + +
+ + + + +
TimeSpan Tgstation.Server.Client.IHttpClient.Timeout
+
+getset
+
+ +

The request timeout

+ +

Definition at line 16 of file IHttpClient.cs.

+
16 { get; set; }
+
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_http_client.png b/interface_tgstation_1_1_server_1_1_client_1_1_i_http_client.png new file mode 100644 index 0000000000000000000000000000000000000000..2fd4a5e9814d265c7b81a5b83bb0b24c14542160 GIT binary patch literal 1082 zcmeAS@N?(olHy`uVBq!ia0vp^r+~PFgBeIp)Nc6;q$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IZ0PkOpIhEy=Vo%?XwW-T69^Y*R3{`J>H zi*kBht&@G95;61P7B0_IZ36!$6`xD)(D78(2v9jWo5^+3o|o+bmp1SHH!a=M>Pk}a z(U3`cFWCd_X5N-}(B!}TZ^_TsTjM{6*G9IbU6yCs#h#k^dh(>K>~^k+Dz(dR2b`K^ z9^d=%zJuY*VD;T<5#2$nT2*S7&JNgi`{T0pH+4LJxtWJ-U_95gH@r{##+Ub7n>;W1 z*;i$IT-pe<+Rs#=OXY7rmx$-5WeyWn@~aj-ne$nIX-7PNgP{rEsmF#qr!6%6Cj~~Z zIdyWeJ@9X2df-bu{?HiYmB}-a!7X3`Lq#wMJ8HTztXR9xZvL+m)#?rV#BRr}S(+?6 zOMcBw(dVTp_Dk7V6PB<1ujIY)?acX$Vv6o9(0TfEE6Zi8HS)#p_ZYqQ3wgftb?P>q zd2h3P-+qu;owL?4a(&k(N%1++Q!+UwWvXNuv$gK|u}(XoZevtV`sHI)yS3l`=={vL zl=H^1T=mQZp$!vjZ5=W{rNuq|8S&=Kxw*SF(whG6INKSc7LY7*TzQJ=hmY&N1pYc# zJLND-w%MAWn%$cmU+BCs<6gJ;%iRAD*L(?_6?#K`##URe4eug%KKrw;Y3o%*Hv7oZ)nOZgpPO(0`_!8ML0YZBblp?mJedD1+vgCeFT=q8 zi;eX`zE%Lk9!(&AS<1R}$|Vl!1$@!DpJlc{B5$HcBbANx!0Usy9yS`1g(XZI=#ug#5M)}8&?DEiv@vaQR?D*8gVZL87K-1O&y=y|?VCR(bOr-aNl)Od2V zJeKkE;;Tv43(dmn!*3mQK5yq`y25_L(@i_4tCXh1^9Rhj66ycu+_N*EZM$YB*q0P* zOt-uuar7fcDsRmO?b<2xo->|GY|1^i@~n9?Fb3AVHRIM>^u^}?S9lE6&Q7?yx#;NU zB~5EpleEOPm7&Cdlv!AD+w<>H2mNgC-~TrKy^ZItV0qt^_D!~zCVk2N#dq|M<)kmW te+jux`nLp>1vNo=ah`_dbDNfb%$9yZWzAtKb-;|y;OXk;vd$@?2>@8B|4sk^ literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client-members.html b/interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client-members.html new file mode 100644 index 0000000000..ad495b0553 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client-members.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.IInstanceManagerClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.IInstanceManagerClient, including all inherited members.

+ + + + + + + +
CreateClient(Instance instance)Tgstation.Server.Client.IInstanceManagerClient
CreateOrAttach(Instance instance, CancellationToken cancellationToken)Tgstation.Server.Client.IInstanceManagerClient
Detach(Instance instance, CancellationToken cancellationToken)Tgstation.Server.Client.IInstanceManagerClient
GetId(Instance instance, CancellationToken cancellationToken)Tgstation.Server.Client.IInstanceManagerClient
List(CancellationToken cancellationToken)Tgstation.Server.Client.IInstanceManagerClient
Update(Instance instance, CancellationToken cancellationToken)Tgstation.Server.Client.IInstanceManagerClient
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html b/interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html new file mode 100644 index 0000000000..c044d655c2 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html @@ -0,0 +1,355 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.IInstanceManagerClient Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.IInstanceManagerClient Interface Reference
+
+
+ +

For managing Instances + More...

+
+Inheritance diagram for Tgstation.Server.Client.IInstanceManagerClient:
+
+
+ + +Tgstation.Server.Client.InstanceManagerClient + +
+ + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Task< IReadOnlyList< Instance > > List (CancellationToken cancellationToken)
 Get all IInstanceClients for Instances the user can view More...
 
Task< InstanceCreateOrAttach (Instance instance, CancellationToken cancellationToken)
 Create or attach an instance More...
 
Task< InstanceUpdate (Instance instance, CancellationToken cancellationToken)
 Relocates, renamed, and/or on/offlines an instance More...
 
Task< InstanceGetId (Instance instance, CancellationToken cancellationToken)
 Get a specific instance More...
 
Task Detach (Instance instance, CancellationToken cancellationToken)
 Deletes an instance More...
 
IInstanceClient CreateClient (Instance instance)
 Create an IInstanceClient for a given Instance More...
 
+

Detailed Description

+

For managing Instances

+ +

Definition at line 12 of file IInstanceManagerClient.cs.

+

Member Function Documentation

+ +

◆ CreateClient()

+ +
+
+ + + + + + + + +
IInstanceClient Tgstation.Server.Client.IInstanceManagerClient.CreateClient (Instance instance)
+
+ +

Create an IInstanceClient for a given Instance

+
Parameters
+ + +
instanceThe Instance to create an IInstanceClient for
+
+
+
Returns
A new IInstanceClient
+ +

Implemented in Tgstation.Server.Client.InstanceManagerClient.

+ +

Referenced by Tgstation.Server.Tests.InstanceManagerTest.Run().

+ +
+
+ +

◆ CreateOrAttach()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<Instance> Tgstation.Server.Client.IInstanceManagerClient.CreateOrAttach (Instance instance,
CancellationToken cancellationToken 
)
+
+ +

Create or attach an instance

+
Parameters
+ + + +
instanceThe Instance to create. Instance.Id will be ignored
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the created or attached Instance
+ +

Implemented in Tgstation.Server.Client.InstanceManagerClient.

+ +

Referenced by Tgstation.Server.Tests.InstanceManagerTest.Run().

+ +
+
+ +

◆ Detach()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.IInstanceManagerClient.Detach (Instance instance,
CancellationToken cancellationToken 
)
+
+ +

Deletes an instance

+
Parameters
+ + + +
instanceThe Instance to delete
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Client.InstanceManagerClient.

+ +

Referenced by Tgstation.Server.Tests.InstanceManagerTest.Run().

+ +
+
+ +

◆ GetId()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<Instance> Tgstation.Server.Client.IInstanceManagerClient.GetId (Instance instance,
CancellationToken cancellationToken 
)
+
+ +

Get a specific instance

+
Parameters
+ + + +
instanceThe Instance to get
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the Instance
+ +

Implemented in Tgstation.Server.Client.InstanceManagerClient.

+ +

Referenced by Tgstation.Server.Tests.InstanceManagerTest.Run().

+ +
+
+ +

◆ List()

+ +
+
+ + + + + + + + +
Task<IReadOnlyList<Instance> > Tgstation.Server.Client.IInstanceManagerClient.List (CancellationToken cancellationToken)
+
+ +

Get all IInstanceClients for Instances the user can view

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in a IReadOnlyList<T> of all Instances the user can view
+ +

Implemented in Tgstation.Server.Client.InstanceManagerClient.

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<Instance> Tgstation.Server.Client.IInstanceManagerClient.Update (Instance instance,
CancellationToken cancellationToken 
)
+
+ +

Relocates, renamed, and/or on/offlines an instance

+
Parameters
+ + + +
instanceThe Instance to update
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the updated Instance
+ +

Implemented in Tgstation.Server.Client.InstanceManagerClient.

+ +

Referenced by Tgstation.Server.Tests.InstanceManagerTest.Run().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.png b/interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.png new file mode 100644 index 0000000000000000000000000000000000000000..ed8169f3deeaae6b8413ff4cbb81491bb891825d GIT binary patch literal 1066 zcmeAS@N?(olHy`uVBq!ia0y~yU=#zg12~w0#zUw zYlPxAv>bT$Lo@U0Q4?MctDKgKrBi}}mWo{0V9-3U_54{zSKxhZGPNWM(oxyR+5P0ZI#5pMae)wyjE?}S#n^&C31Byd|vkIf3*TAe)e zzjIoXZv9oAb^HC<9o`Ewl^;)EaqZbwuiK06E?c$oOPOl=qGM+K2R>*twLfcpU72}k z+tj<>CW%LqGww~rXP>JbQl~vSrs%k zGO(zMH7pRH7UbnQH3+Cet9Up;^R6Q&D51zV~DJ@pvkI$0MiZb69_G&4}+ zj6}&Vo)ObhBkf%5PjAwhuPEl}xj^CPFT+gfLm$d+&ZyR4F`AM$U^dHk8(`1zvt zr(f;EX1t&I?)tUejqBWAIaOcUbNJil4Y77t`0}%5HMjGV=tZ?@3_}4v||Eqg8%m1EtEb-Wc&$Uk%^*`k?NV8t1Gec=5 zI3+ACxo!C3UBbu2!l2jBP92r#zWHX_$z&btcTp!+Mc=+^7$W{I>7~Sm!edt}rSIfe zpR|}+SlIaVlaQ(DrF)vqsb6BYTwm7zRB!dUAQO)6-Lfg(1s}I;`?7Hd@7K#=TFdUn zEZX_^Ue9ikStW&^g|2?uBbF7t{dSJ&(R=Hj)LgmojJL!6qUi;jd|PGT8{5`YcdEs( z=zRP+ZAt$1#b;S`axJGWS%3BM*&{hOh5aV&i}yFbyw_#Ym+ey{R5Ue^!&+Yl7zrz% bJ(uq-w0zpNqN)a%u^BvF{an^LB{Ts5)MNRT literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_request_logger-members.html b/interface_tgstation_1_1_server_1_1_client_1_1_i_request_logger-members.html new file mode 100644 index 0000000000..73d76f3bd8 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_request_logger-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.IRequestLogger Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.IRequestLogger, including all inherited members.

+ + + +
LogRequest(HttpRequestMessage requestMessage, CancellationToken cancellationToken)Tgstation.Server.Client.IRequestLogger
LogResponse(HttpResponseMessage responseMessage, CancellationToken cancellationToken)Tgstation.Server.Client.IRequestLogger
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_request_logger.html b/interface_tgstation_1_1_server_1_1_client_1_1_i_request_logger.html new file mode 100644 index 0000000000..3bf9c28795 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_request_logger.html @@ -0,0 +1,182 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.IRequestLogger Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.IRequestLogger Interface Reference
+
+
+ +

For logging HTTP requests and responses + More...

+ + + + + + + + +

+Public Member Functions

Task LogRequest (HttpRequestMessage requestMessage, CancellationToken cancellationToken)
 Log a request More...
 
Task LogResponse (HttpResponseMessage responseMessage, CancellationToken cancellationToken)
 Log a response More...
 
+

Detailed Description

+

For logging HTTP requests and responses

+ +

Definition at line 11 of file IRequestLogger.cs.

+

Member Function Documentation

+ +

◆ LogRequest()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.IRequestLogger.LogRequest (HttpRequestMessage requestMessage,
CancellationToken cancellationToken 
)
+
+ +

Log a request

+
Parameters
+ + + +
requestMessageThe HttpRequestMessage representing the request
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +
+
+ +

◆ LogResponse()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Client.IRequestLogger.LogResponse (HttpResponseMessage responseMessage,
CancellationToken cancellationToken 
)
+
+ +

Log a response

+
Parameters
+ + + +
responseMessageThe HttpResponseMessage representing the request
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_server_client-members.html b/interface_tgstation_1_1_server_1_1_client_1_1_i_server_client-members.html new file mode 100644 index 0000000000..23df9d3b5c --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_server_client-members.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.IServerClient Member List
+
+ + + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html b/interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html new file mode 100644 index 0000000000..b8e77fafb8 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html @@ -0,0 +1,360 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.IServerClient Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.IServerClient Interface Reference
+
+
+ +

Main client for communicating with a server + More...

+
+Inheritance diagram for Tgstation.Server.Client.IServerClient:
+
+
+ + +IDisposable +Tgstation.Server.Client.ServerClient + +
+ + + + + + + + +

+Public Member Functions

Task< ServerInformationVersion (CancellationToken cancellationToken)
 The ServerInformation of the IServerClient More...
 
void AddRequestLogger (IRequestLogger requestLogger)
 Adds a requestLogger to the request pipeline More...
 
+ + + + + + + + + + + + + + + + + + + +

+Properties

Uri Url [get]
 The connected server Uri More...
 
Token Token [get, set]
 The Token used to access the server More...
 
TimeSpan Timeout [get, set]
 The connection timeout More...
 
IInstanceManagerClient Instances [get]
 Access the IInstanceManagerClient More...
 
IAdministrationClient Administration [get]
 Access the IAdministrationClient More...
 
IUsersClient Users [get]
 Access the IUsersClient More...
 
+

Detailed Description

+

Main client for communicating with a server

+ +

Definition at line 11 of file IServerClient.cs.

+

Member Function Documentation

+ +

◆ AddRequestLogger()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Client.IServerClient.AddRequestLogger (IRequestLogger requestLogger)
+
+ +

Adds a requestLogger to the request pipeline

+
Parameters
+ + +
requestLoggerThe IRequestLogger to add
+
+
+ +

Implemented in Tgstation.Server.Client.ServerClient.

+ +
+
+ +

◆ Version()

+ +
+
+ + + + + + + + +
Task<ServerInformation> Tgstation.Server.Client.IServerClient.Version (CancellationToken cancellationToken)
+
+ +

The ServerInformation of the IServerClient

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the ServerInformation of the target server
+ +

Implemented in Tgstation.Server.Client.ServerClient.

+ +

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

+ +
+
+

Property Documentation

+ +

◆ Administration

+ +
+
+ + + + + +
+ + + + +
IAdministrationClient Tgstation.Server.Client.IServerClient.Administration
+
+get
+
+
+ +

◆ Instances

+ +
+
+ + + + + +
+ + + + +
IInstanceManagerClient Tgstation.Server.Client.IServerClient.Instances
+
+get
+
+ +

Access the IInstanceManagerClient

+ +

Definition at line 31 of file IServerClient.cs.

+
31 { get; }
+

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

+ +
+
+ +

◆ Timeout

+ +
+
+ + + + + +
+ + + + +
TimeSpan Tgstation.Server.Client.IServerClient.Timeout
+
+getset
+
+ +

The connection timeout

+ +

Definition at line 26 of file IServerClient.cs.

+
26 { get; set; }
+
+
+ +

◆ Token

+ +
+
+ + + + + +
+ + + + +
Token Tgstation.Server.Client.IServerClient.Token
+
+getset
+
+ +

The Token used to access the server

+ +

Definition at line 21 of file IServerClient.cs.

+
21 { get; set; }
+

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

+ +
+
+ +

◆ Url

+ +
+
+ + + + + +
+ + + + +
Uri Tgstation.Server.Client.IServerClient.Url
+
+get
+
+ +

The connected server Uri

+ +

Definition at line 16 of file IServerClient.cs.

+
16 { get; }
+
+
+ +

◆ Users

+ +
+
+ + + + + +
+ + + + +
IUsersClient Tgstation.Server.Client.IServerClient.Users
+
+get
+
+ +

Access the IUsersClient

+ +

Definition at line 41 of file IServerClient.cs.

+
41 { get; }
+
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.png b/interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.png new file mode 100644 index 0000000000000000000000000000000000000000..82e88da4d4140bccd1212672d96b971eba78ad3c GIT binary patch literal 1068 zcmeAS@N?(olHy`uVBq!ia0vp^w}H5WgBeIhy60&FDTx4|5ZC|z{{xvX-h3_XKQsZz z0^Aiv*#*R&5E|P?6vndsMnq?^SY$|<*e1t$G^ko=dXYLa%lu zf{q*Rd9mYBS#M7tuk?Whi|YmT&d>GL&sp8)ohKV@B`RlV$yEH;+t7CYN&czr=hq$I zB64=u>bX(;^W!R4zuLO5ET%a7W}hNQsB%D*sbc#huVpfmUWuRXsWV+0K6$csUv?gI zv}CSP>Yv^&J%+ijZj0xf&5K>h+~`<)y?VQ5^wWB^r^VYuHoQK2Zl3S;6w~P+4{Uq1 z*wN;lYoux;N{0jC>54E4*U4=lSi<89e(@x0`1*0;75SZ}VJ%d$Zuoq2;g@%Tqa zQqRZpCEbR{?1cj-ZJV;$bCRv)Y?YgrkBXh^U$ScI?cbs1)7abERWjF^ls}tl9rjji z&8%8!UuiQ>sgf`Hho0`-{BmXf)x3jQ$IAMT3r;*f`RxA9-+Qi!-Z`yt^tYid>y~#} z%dZ_?9)54F>u%B2oVN|NT32bV*plVM=UVrT%k%5vRJZ*LuDwn#^9~E%X0&k4D)zOP zO+99<*jIb-n)>ywyR)tuZ+oSFZb{9#X-Q>!?^trrUU#xd@A1E*mHFG#zD{|Y>er`V z&m3@X;xd-LgYQ14T+KWBYWw@!bJlX6wrN}vu+?xP$jSGvoLv1*Ms$Uq2Qb(_OSq5*I@z-(PukKr$9EDiIjWqT h_b$iq*pB7@7^})6ZG8Qzgn?O`!PC{xWt~$(69CHc1JD2f literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_server_client_factory-members.html b/interface_tgstation_1_1_server_1_1_client_1_1_i_server_client_factory-members.html new file mode 100644 index 0000000000..d9acb1fbbb --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_server_client_factory-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.IServerClientFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.IServerClientFactory, including all inherited members.

+ + + +
CreateServerClient(Uri host, string username, string password, TimeSpan timeout=default, CancellationToken cancellationToken=default)Tgstation.Server.Client.IServerClientFactory
CreateServerClient(Uri host, Token token, TimeSpan timeout=default)Tgstation.Server.Client.IServerClientFactory
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_server_client_factory.html b/interface_tgstation_1_1_server_1_1_client_1_1_i_server_client_factory.html new file mode 100644 index 0000000000..e2bb1fb679 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_server_client_factory.html @@ -0,0 +1,225 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.IServerClientFactory Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.IServerClientFactory Interface Reference
+
+
+ +

Factory for creating IServerClients + More...

+
+Inheritance diagram for Tgstation.Server.Client.IServerClientFactory:
+
+
+ + +Tgstation.Server.Client.ServerClientFactory + +
+ + + + + + + + +

+Public Member Functions

Task< IServerClientCreateServerClient (Uri host, string username, string password, TimeSpan timeout=default, CancellationToken cancellationToken=default)
 Create a IServerClient More...
 
IServerClient CreateServerClient (Uri host, Token token, TimeSpan timeout=default)
 Create a IServerClient More...
 
+

Detailed Description

+

Factory for creating IServerClients

+ +

Definition at line 11 of file IServerClientFactory.cs.

+

Member Function Documentation

+ +

◆ CreateServerClient() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<IServerClient> Tgstation.Server.Client.IServerClientFactory.CreateServerClient (Uri host,
string username,
string password,
TimeSpan timeout = default,
CancellationToken cancellationToken = default 
)
+
+ +

Create a IServerClient

+
Parameters
+ + + + + + +
hostThe URL to access TGS
usernameThe username to for the IServerClient
passwordThe password for the IServerClient
timeoutThe TimeSpan representing timeout for the connection
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in a new IServerClient
+ +

Implemented in Tgstation.Server.Client.ServerClientFactory.

+ +

Referenced by Tgstation.Server.Tests.IntegrationTest.TestStandardOperation(), and Tgstation.Server.Tests.IntegrationTest.TestUpdate().

+ +
+
+ +

◆ CreateServerClient() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
IServerClient Tgstation.Server.Client.IServerClientFactory.CreateServerClient (Uri host,
Token token,
TimeSpan timeout = default 
)
+
+ +

Create a IServerClient

+
Parameters
+ + + + +
hostThe URL to access TGS
tokenThe Token to access the API with
timeoutThe TimeSpan representing timeout for the connection
+
+
+
Returns
A new IServerClient
+ +

Implemented in Tgstation.Server.Client.ServerClientFactory.

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_server_client_factory.png b/interface_tgstation_1_1_server_1_1_client_1_1_i_server_client_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..8ed81be40048b588bc333e779ac250468376934a GIT binary patch literal 934 zcmV;X16lluP)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d0009uNkl`sE^9au=>l~PJc6$-$|D>)>GAv@&)w%cb(PwPJOApd`|s@U8iKHe5ieVdex(|8<;z;+y)!JA@3V- zcm+Z+gF+i7pklidy5cjdYZ3j*y_c(t9mkcMJ*a*gz3&5uX5+GTT#q49fKK-7goDe1 zJ0+nosGpj-+4kW43()JCgIUX&OwSzL&zeebQ^Cq_)>G1UYK@$S?at%)udylUOQdjCHYVx3F6G zhb0GlUzq;e-50igOiT8C#ZJ{2yE5x_=k=c5!phwj_buV>i|!(|9JVf6NqQH}IP^VG zlHOEyn`1t-8%L7fSZHX39LJIR56G%E* + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Client.IUsersClient Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Client.IUsersClient, including all inherited members.

+ + + + + + +
Create(UserUpdate user, CancellationToken cancellationToken)Tgstation.Server.Client.IUsersClient
GetId(User user, CancellationToken cancellationToken)Tgstation.Server.Client.IUsersClient
List(CancellationToken cancellationToken)Tgstation.Server.Client.IUsersClient
Read(CancellationToken cancellationToken)Tgstation.Server.Client.IUsersClient
Update(UserUpdate user, CancellationToken cancellationToken)Tgstation.Server.Client.IUsersClient
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.html b/interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.html new file mode 100644 index 0000000000..0defac9b03 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.html @@ -0,0 +1,302 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.IUsersClient Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.IUsersClient Interface Reference
+
+
+ +

For managing Users + More...

+
+Inheritance diagram for Tgstation.Server.Client.IUsersClient:
+
+
+ + +Tgstation.Server.Client.UsersClient + +
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

Task< UserRead (CancellationToken cancellationToken)
 Read the current user's information and general rights More...
 
Task< UserGetId (User user, CancellationToken cancellationToken)
 Get a specific user More...
 
Task< IReadOnlyList< User > > List (CancellationToken cancellationToken)
 List all Users More...
 
Task< UserCreate (UserUpdate user, CancellationToken cancellationToken)
 Create a new user More...
 
Task< UserUpdate (UserUpdate user, CancellationToken cancellationToken)
 Update a user More...
 
+

Detailed Description

+

For managing Users

+ +

Definition at line 11 of file IUsersClient.cs.

+

Member Function Documentation

+ +

◆ Create()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<User> Tgstation.Server.Client.IUsersClient.Create (UserUpdate user,
CancellationToken cancellationToken 
)
+
+ +

Create a new user

+
Parameters
+ + + +
userThe UserUpdate used to create the new User
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
The new User
+ +

Implemented in Tgstation.Server.Client.UsersClient.

+ +
+
+ +

◆ GetId()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<User> Tgstation.Server.Client.IUsersClient.GetId (User user,
CancellationToken cancellationToken 
)
+
+ +

Get a specific user

+
Parameters
+ + + +
userThe User to get
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the requested user
+ +

Implemented in Tgstation.Server.Client.UsersClient.

+ +
+
+ +

◆ List()

+ +
+
+ + + + + + + + +
Task<IReadOnlyList<User> > Tgstation.Server.Client.IUsersClient.List (CancellationToken cancellationToken)
+
+ +

List all Users

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in a IReadOnlyList<T> of all Users
+ +

Implemented in Tgstation.Server.Client.UsersClient.

+ +
+
+ +

◆ Read()

+ +
+
+ + + + + + + + +
Task<User> Tgstation.Server.Client.IUsersClient.Read (CancellationToken cancellationToken)
+
+ +

Read the current user's information and general rights

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the current User
+ +

Implemented in Tgstation.Server.Client.UsersClient.

+ +
+
+ +

◆ Update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<User> Tgstation.Server.Client.IUsersClient.Update (UserUpdate user,
CancellationToken cancellationToken 
)
+
+ +

Update a user

+
Parameters
+ + + +
userThe UserUpdate used to update the User
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
The updated User
+ +

Implemented in Tgstation.Server.Client.UsersClient.

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.png b/interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.png new file mode 100644 index 0000000000000000000000000000000000000000..6262d660d67bfa47e32e28f0665b6d76f06584e1 GIT binary patch literal 855 zcmeAS@N?(olHy`uVBq!ia0vp^SAaNxgBeJMDXxA3q$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IZ0o_V@BhEy=VoqN0QwE~Z;xOLF~|C9Z1 z7Z^T>IcF16bVOtKWueWFS&vn!E}b$@P3XYpEejZwG8`FQ0vfe)nKQzF|NQst@cGFM zHBTeXYx7TuUOufn=hfVsE1Q{Sl*~OO^Sbpv`xV{Uj9TVD&nMM{FR6R8__x&6yP1=} zFZ7RybF;qEe(Uz`@SAzuQ`4m|p5W~guLFr0la``${u zRp(!}on^WDuB?C7Wzz^wiIn{-IzGmiOvlRc}K&b#p?V7k6)gMie+V`>Zn zewY2Gic2_zR6b=Fh~nl_Xc7}~V5z;gT65_a9mYQ%`VGrpb_T4!&b)FS$JewfxvR|3Sba~h3kbTrj7+@3ifB;-uBkKD);ubzb-kGzUb&`cy=vd zRrM4MS$OH6`pKBL&wt-8Sbt}Rn&+hTGOsJ2Hoo55`WZ9iG1Y z78JDG$04$LmPaJ_=L=$nYFDaxt*^Fz;f$^N5um%kHcMs8)R`)lo9z7;>?(S-I@@IL z^Fp4~pu4Z%OK9nb*&bN>V3(r$!mKwAPmh-`^ZU6|PCa1xQ}g+6^gfrZ(dpTIDmnFr zo8c_EsrR3Jyl(u|nK#sE+Wh(izSH>zTl;Ol?|4zSb!E-%?zd*!eA?Yo=iUnF+?W}$ zKFalKUeStW>2ktXo_c#uQp#wOn%$t{dU;RqTUj+v#i!HetGHfknzRHMsFOq-^H%@^ ct^K9^&NDi-v-f@N0OkS)Pgg&ebxsLQ026qR3jhEB literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock-members.html new file mode 100644 index 0000000000..78950b7896 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock-members.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Byond.IByondExecutableLock Member List
+
+ + + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock.html new file mode 100644 index 0000000000..5c2235e6d2 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock.html @@ -0,0 +1,232 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Byond.IByondExecutableLock Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Byond.IByondExecutableLock Interface Reference
+
+
+ +

Represents usage of the two primary BYOND server executables + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Byond.IByondExecutableLock:
+
+
+ + +IDisposable +Tgstation.Server.Host.Components.Byond.ByondExecutableLock + +
+ + + + + +

+Public Member Functions

void DoNotDeleteThisSession ()
 Call if, during a detach, this version should not be deleted More...
 
+ + + + + + + + + + +

+Properties

Version Version [get]
 The System.Version of the locked executables More...
 
string DreamDaemonPath [get]
 The path to the DreamDaemon executable More...
 
string DreamMakerPath [get]
 The path to the dm/DreamMaker executable More...
 
+

Detailed Description

+

Represents usage of the two primary BYOND server executables

+ +

Definition at line 8 of file IByondExecutableLock.cs.

+

Member Function Documentation

+ +

◆ DoNotDeleteThisSession()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.Byond.IByondExecutableLock.DoNotDeleteThisSession ()
+
+ +

Call if, during a detach, this version should not be deleted

+ +

Implemented in Tgstation.Server.Host.Components.Byond.ByondExecutableLock.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.Release().

+ +
+
+

Property Documentation

+ +

◆ DreamDaemonPath

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Byond.IByondExecutableLock.DreamDaemonPath
+
+get
+
+ +

The path to the DreamDaemon executable

+ +

Definition at line 18 of file IByondExecutableLock.cs.

+
18 { get; }
+
+
+ +

◆ DreamMakerPath

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Byond.IByondExecutableLock.DreamMakerPath
+
+get
+
+ +

The path to the dm/DreamMaker executable

+ +

Definition at line 23 of file IByondExecutableLock.cs.

+
23 { get; }
+

Referenced by Tgstation.Server.Host.Components.Compiler.DreamMaker.RunCompileJob().

+ +
+
+ +

◆ Version

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Host.Components.Byond.IByondExecutableLock.Version
+
+get
+
+ +

The System.Version of the locked executables

+ +

Definition at line 13 of file IByondExecutableLock.cs.

+
13 { get; }
+

Referenced by Tgstation.Server.Host.Components.Compiler.DreamMaker.SendDeploymentMessage().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..8e7db7827748a8b0c1d11659bd731acf25972ab3 GIT binary patch literal 1702 zcmb`Ic~Fx_7{)(f5ELPZiU<`@19)(#6)`~)==kUVtcx1cFEicvL))ND5Lp z8WmCs1`r}=%m;{6j*_Sa6iEok5ipQwIMVPD($N2EXZlaOGrRljJUh?4Gy8jIZ~6In z=&mqc0RVt5=Ac^u0H`IY^i6FI)w(m2g;Z@ueqMp@N~KaI$0ujwDKGA+)L*lysY&w| z&rEgHjtlTP45%(Gjh>FcT>!Am9^U;{k29^6W=aHSSGQ$eq~9JtvFHe9YRwrEeo+hI`0`HEOON=iQtlUvoA zzdRcrOm0>2%E14pc{vk+(y3HrrZJ9f!;@??z-i z;fV{jmV0@J-YSLWLL*iZr&2t<$_A4&@{U()viOig(xb+?lUvzcQ<)Nr3EW{T$~NI- z)LHgOo={1>Z41s;h(oE!a+(i(!eS_tO4625M_POva*9$?mnyuTgpqFK9iqaPygHWe zR=PPo3)F3r#A;{*pii9^eu$_e2TZRg0qew{Tv4eSL#9o4cEAQ*>$E;^~a*+OIUF(zTd z1A332nbgs~??rav2_wercQ|hm$jColFFVJ_P5+{!Ll0C-EFseSA{^;w1qml|?RnTr zZ}QBTI3}z;)bsr#C_J*dDEV|S`soqwR;*`n0ra*bomqRV51V>pzBhl1Rz>711T6-g zm?w$Q%_X6yl3?dHc_b)KuGDx^ugA};h!BH$9zKroJz;{J;O7!Br4?cl6#uXDe7fkC{o3H z_C;hHf=NOj1T7~(4#J8LlPavc=Ps|2o(0j!=-SP;DW^n3`7jir=^Zu%(c$e&?>Nt8 zW8(KZYzSgTmO>X9h3BcX4Q|bSi#TO7g2s^~01zr4dlv$^V zO@Sq^0mt17+t0h zkP1|Yy_hnTs_j#;XUpqJBLP|}M%IP@AN2hj+GYu~08ezM4Lyr&NQG-sXU_bs;g{Me zJfV@Hga^@i11a`g>9z7q_}!x|9|jeRBoC_B&aP$5dx6cwW4CHv|6QB){=fF>z*-_$7Xk0YNTk^1fcEejK7z&&g%-XZf;^)}^uw7O{6xSwpyWjCF zQI`fxc`~`gBVC}RVRv+0hQ62c5*Xo{z}zl7kL1&uPr(1Xf7ob z+mD6Ych`=&AuhQ)cFWTtdH+6CG=5JES9W1!yd0Yz9+n-K!OMe1iouo4nM@O7S=W}% z?E?t{n~z(B-;_F;1Y30PqBRp^mJy6D^(uA?R~GvTWE?GVF+w;Bq8AUyPLqCBRn0}z zD4Mk?>Y^6OGzm?_MLVm4z`+z>0BNm#uM6)vOe;nh{EWJV2W3J6>W|;n zV^i>>yB(aew=tb$mOVqfxIpis67j3bj4BM7s2`NejEXj{9fe9omyd6|Zl66E#Lstz!@KYgmr2W;Y`see_AeZ(Sej?RZi;z4!oWB`!1+EDC$72tP iQS_{ + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Byond.IByondInstaller Member List
+
+ + + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.html new file mode 100644 index 0000000000..6440023bb7 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.html @@ -0,0 +1,306 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Byond.IByondInstaller Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Byond.IByondInstaller Interface Reference
+
+
+ +

For downloading and installing BYOND extractions for a given system + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Byond.IByondInstaller:
+
+
+ + +Tgstation.Server.Host.Components.Byond.PosixByondInstaller +Tgstation.Server.Host.Components.Byond.WindowsByondInstaller + +
+ + + + + + + + + + + +

+Public Member Functions

Task< byte[]> DownloadVersion (Version version, CancellationToken cancellationToken)
 Download a given BYOND version More...
 
Task InstallByond (string path, Version version, CancellationToken cancellationToken)
 Does actions necessary to get an extracted BYOND installation working More...
 
Task CleanCache (CancellationToken cancellationToken)
 Attempts to cleans the BYOND cache folder for the system More...
 
+ + + + + + + +

+Properties

string DreamDaemonName [get]
 Get the file name of the DreamDaemon executable More...
 
string DreamMakerName [get]
 Get the file name of the DreamMaker executable More...
 
+

Detailed Description

+

For downloading and installing BYOND extractions for a given system

+ +

Definition at line 10 of file IByondInstaller.cs.

+

Member Function Documentation

+ +

◆ CleanCache()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.Byond.IByondInstaller.CleanCache (CancellationToken cancellationToken)
+
+ +

Attempts to cleans the BYOND cache folder for the system

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Byond.WindowsByondInstaller, and Tgstation.Server.Host.Components.Byond.PosixByondInstaller.

+ +
+
+ +

◆ DownloadVersion()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<byte[]> Tgstation.Server.Host.Components.Byond.IByondInstaller.DownloadVersion (Version version,
CancellationToken cancellationToken 
)
+
+ +

Download a given BYOND version

+
Parameters
+ + + +
versionThe Version of BYOND to download
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the bytes of the zipfile
+ +

Implemented in Tgstation.Server.Host.Components.Byond.WindowsByondInstaller, and Tgstation.Server.Host.Components.Byond.PosixByondInstaller.

+ +

Referenced by Tgstation.Server.Host.Components.Byond.ByondManager.InstallVersion().

+ +
+
+ +

◆ InstallByond()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Byond.IByondInstaller.InstallByond (string path,
Version version,
CancellationToken cancellationToken 
)
+
+ +

Does actions necessary to get an extracted BYOND installation working

+
Parameters
+ + + + +
pathThe path to the BYOND installation
versionThe Version of BYOND being installed
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Byond.WindowsByondInstaller, and Tgstation.Server.Host.Components.Byond.PosixByondInstaller.

+ +

Referenced by Tgstation.Server.Host.Components.Byond.ByondManager.InstallVersion().

+ +
+
+

Property Documentation

+ +

◆ DreamDaemonName

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Byond.IByondInstaller.DreamDaemonName
+
+get
+
+ +

Get the file name of the DreamDaemon executable

+ +

Definition at line 15 of file IByondInstaller.cs.

+
15 { get; }
+

Referenced by Tgstation.Server.Host.Components.Byond.ByondManager.UseExecutables().

+ +
+
+ +

◆ DreamMakerName

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Byond.IByondInstaller.DreamMakerName
+
+get
+
+ +

Get the file name of the DreamMaker executable

+ +

Definition at line 20 of file IByondInstaller.cs.

+
20 { get; }
+

Referenced by Tgstation.Server.Host.Components.Byond.ByondManager.UseExecutables().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.png new file mode 100644 index 0000000000000000000000000000000000000000..17519977d35754af519961f5118dc82afbbb1113 GIT binary patch literal 1789 zcmcgtdpOg382^psGD|Jhh?Ji#8OyzNTskqa)I!WHcXG?^$kL5jJ>=TjFv4*kfEm4K1bW|b~|G29jfSlBKA zMxi@U9dj_oO$X5uw{DOL1nlb&v`>CYasK%QC$=yMAXbDpZa*3tGbqd;060@6s@4n+ zHUHIA0<7y*MCgdn?Yh}iwggO%GD5XyU0M(0XLeekUYm7wRd;P%Y}q>4aP9Nr_fvsE z;{%`U%|8fS8e9C>Z*$`P!}aYNN*XF1A8W1$yQ_wzHiX6==&Iupw$T zhfjkw6A!?jXWh-jYgwVzmV^e5o<@1c1tg7*pZK6Zb9ap_Hf$Goe+w+Y4-OcK@hI84 zrP-M+z9~3b`0!r%MCWId-EDDrv!cAvq?isN4$O(r2n9wVF*0eUGkiGKm=}k#CV7rY zq>n@gF4a~sTZ;>n!KiLardy;vPT~aaoDyu4r3pBl z_CHw^S8{&mEkw-z;xlu^C^fu-wQ+XPc_1~IfEm&Frw`l8b5>EZ)DThG;`fz-%Q8K{ zqGuH9$Y?|e=?W|#5F_>6I}eS(p786QRJtoez3U`{KzOnYMxy@f&>%a^%fhs?0RTyb z$qRI;Fmu2ck`AGSasvS%`7TXr5c=GS=i?yn;NLOygEbIm-Cxf8uUMVJ6DCS2JYhIg z3TFEScw@T~@ccjRw|VP=Fi`jT&pyOh`;UmGS7&oACKAo};z+E5IPV?XssZ$B#cCEvB1P^~wj z^{mJ=+$5^{R(RIhWVgdMD?{S)x_x}r+o79{iNg1GnAj2ZDd8D>!KyrQUV8|=nH#dd zyGU)CcJj;Tva-|rTbUo~aRa=_6ThlTgO2N$qVwlpzlqAll6u6V0a+;O`s>_;U@Wb( z{QmR#=t04ab$0#_xC@yCI2xf?e|7YGq@_-iK$4@?k8W>?dubgL|B#AJ7{19dj`uCi z5k!{ursW=wzFtyach5sYu;kb!()$Bv<%& zzzj2fMUC-pThpW@tW+!==d?E0r|4kQrl;(^)f0Ti6Z`sC=zevGxx!_d`rTKY&lk6? zQrLm=V5i{x&|4t-qr1jYMvkeX&|XF!XR$n&M%nJ~VJJ6eQE))4tOh~8$sGgbBWJ4Z z=Y0JmXSru(d7F8sMBUEP-Iqc1@tE`%e`Mz%QZMvX#o%v|4QN-eZ{L-akS3vaJ^pO-AW8dijjt{T8=ljW3(f>fvq1v{Mxi&qdYks-oAbA#B{d?5n@d zTJhw2Oas8=8SDhGEBcNZjRIrUXge-QS~k4P=eM(Jf-?GMNmxHY5vGcIplWB63I&&S z#*Aq9twypD<;J*B)9@6Xh0!5?Sz)R~%)1BDYm$FJra|ql6l-YY+YW%V6g^j~qA~f` ZZ_50nYDY^ + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Byond.IByondManager Member List
+
+ + + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_manager.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_manager.html new file mode 100644 index 0000000000..bac0d8cd54 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_manager.html @@ -0,0 +1,264 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Byond.IByondManager Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Byond.IByondManager Interface Reference
+
+
+ +

For managing the BYOND installation + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Byond.IByondManager:
+
+
+ + +IHostedService +IDisposable +Tgstation.Server.Host.Components.Byond.ByondManager + +
+ + + + + + + + +

+Public Member Functions

Task ChangeVersion (Version version, CancellationToken cancellationToken)
 Change the active BYOND version More...
 
Task< IByondExecutableLockUseExecutables (Version requiredVersion, CancellationToken cancellationToken)
 Lock the current installation's location and return a IByondExecutableLock More...
 
+ + + + + + + +

+Properties

Version ActiveVersion [get]
 The currently active BYOND version More...
 
IReadOnlyList< Version > InstalledVersions [get]
 The installed BYOND versions More...
 
+

Detailed Description

+

For managing the BYOND installation

+ +

Definition at line 12 of file IByondManager.cs.

+

Member Function Documentation

+ +

◆ ChangeVersion()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Byond.IByondManager.ChangeVersion (Version version,
CancellationToken cancellationToken 
)
+
+ +

Change the active BYOND version

+
Parameters
+ + + +
versionThe new Version
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Byond.ByondManager.

+ +
+
+ +

◆ UseExecutables()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<IByondExecutableLock> Tgstation.Server.Host.Components.Byond.IByondManager.UseExecutables (Version requiredVersion,
CancellationToken cancellationToken 
)
+
+ +

Lock the current installation's location and return a IByondExecutableLock

+
Parameters
+ + + +
requiredVersionThe BYOND Version required
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the requested IByondExecutableLock
+ +

Implemented in Tgstation.Server.Host.Components.Byond.ByondManager.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DreamMaker.Compile(), Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew(), and Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.Reattach().

+ +
+
+

Property Documentation

+ +

◆ ActiveVersion

+ +
+
+ + + + + +
+ + + + +
Version Tgstation.Server.Host.Components.Byond.IByondManager.ActiveVersion
+
+get
+
+ +

The currently active BYOND version

+ +

Definition at line 17 of file IByondManager.cs.

+
17 { get; }
+

Referenced by Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.Invoke().

+ +
+
+ +

◆ InstalledVersions

+ +
+
+ + + + + +
+ + + + +
IReadOnlyList<Version> Tgstation.Server.Host.Components.Byond.IByondManager.InstalledVersions
+
+get
+
+ +

The installed BYOND versions

+ +

Definition at line 22 of file IByondManager.cs.

+
22 { get; }
+
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_manager.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..1b8fb3bca408de4e63c1d0ba50872c9ecb8921b2 GIT binary patch literal 2278 zcmb7Gc~Dbn5=STpE5PcEa*W`hPS`;%(Pe_1aY2QI(-=Syg2yOifB;bgh9js0io*Z~ z0Ywo5IRpd*A4Ux!3{ep>E0TyzZjejGX9Si63?ch)|8RC|tJZl{@4fD>{<`}6^{@N; z3d2JK%wX$b1_lOZsK8wq0|P?O*zJ(%Bx={+v6(AC`AFm)@1flzjX!Vm*849#7g7xd z-}n;*nsrA|eANYf71JnPA1rb+7rBKPA4XF*qyAD?jzC?2dlXR-sA48P zgnH-_fFiotrBF@lAgyi-zU&7pNV5q+U4`@Kv+!GMdgf~2f`J;!wKxS5)i(a?IDEkb zw@*?+PyNz&?eDUQM{Pb=fG}1yoYFUi)|RablEB4`GIgYJ^KP0C&pjz7XGxZIkFC>Q zia#K+yPb4CB^m6^ZtO*%aCt*i(%$#EvLy~Hn@5h|E8$$_3aUrhL8`3%l^XCEb@6Lf>D@+y zxS5(wYOT!Vrw?z0@1pvng)fvF@MU8y9_N77h&$D9w0_;4w*W9*->eamHmO)OaLU7^ zAStT@MfQk}52Qv7x6^gMpKF$i7Lz<`R0>iH+ z#M$CDK97R%T;fev3IEz#U@2WF8#{oOz&)xUYr$T~HUOc#{UhcRyC79;59N{wd3?PG zf;nIxWODr<{uy}IzpFT!NUvt%9iW;P8-;dTuX8tZg^CPG~w$6_8f~^ZOhbPzf!RIZvG6}*Zu9*IiZ3eBdd7dus2QIo!zf{0*bwVEeCY) zib)b(*MN5f73(VQkrd{z9oKM@Q#1+x5z);|vL0~C);`f;z5|(pIe4?b(~IOiifc`t zlHgkWLbycEWVa0Sx14C{AV=8`ry+zcuoEU7gRKMVGv?sy*eYM&)#qL@z5*w+1MZG>o#MD^p6I*yjd z7Y9lsUf2dod*>4cvMC~~ZalN^a=9-4a;9T%SfF%paO-15M=r|5|20Fm|Ljp!=eum% zMzV4y%JZrAWj3pk3^JNGDs1nYZDSKWe~gWdQ#>8@6lmQE?^stK&cr52H6cT15xMdm5)g^Lx?&X2rh*-%YjI zgEBFK=JeS9<()(GqXz@AdwG0RKzL!GS<-q5LMd7zm@A`y?2kwd!5y*MuJ@avV^fbc zvy)zE;Rg8;uhfflkBO`O07tH$?to%F!Qk0RA}FA>Zwr!rGd@UrwwQV%U@MrRlhJc( z<;ipXykI+L(;u8c?N>RAv#pq#_E$?&I^?~s6SR2Eqx>3|KIkJWeX#IUZh|J%R z{5X{BDMNvr1_6ibQf7}ov{5TWI4E{y!NJ&c3uD61f9w%%-}mPKq?PsG<(!f}y6tm- zmk81M)J8C}O7)`CN7?t_Tku$velH`Z!%;@?wgaQU^?07+yxa={nc4)z9o3x%s*9v? z$DLDntu3B0#VmTXSf5|SrY;6^T9Os1(Co>K6y`ed+cM(ac_sPW)CI>4lTGQJq6n@U z6SYQFA}hFjzFMS?qzX4u`9luXhdyFWO>5p5H!m9cc<(N(@lDLw7a%9X#_dR2zrG literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command-members.html new file mode 100644 index 0000000000..15fc51df54 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command-members.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.Commands.ICommand Member List
+
+ + + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command.html new file mode 100644 index 0000000000..45b51b93f1 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command.html @@ -0,0 +1,256 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Commands.ICommand Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Commands.ICommand Interface Reference
+
+
+ +

Represents a command that can be invoked by talking to chat bots + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.Commands.ICommand:
+
+
+ + +Tgstation.Server.Host.Components.Chat.Commands.ByondCommand +Tgstation.Server.Host.Components.Chat.Commands.CustomCommand +Tgstation.Server.Host.Components.Chat.Commands.KekCommand +Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand +Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand +Tgstation.Server.Host.Components.Chat.Commands.VersionCommand + +
+ + + + + +

+Public Member Functions

Task< string > Invoke (string arguments, User user, CancellationToken cancellationToken)
 Invoke the ICommand More...
 
+ + + + + + + + + + +

+Properties

string Name [get]
 The text to invoke the command. May not be "?" or "help" (case-insensitive) More...
 
string HelpText [get]
 The help text to display when queires are made about the command More...
 
bool AdminOnly [get]
 If the command should only be available to Users who's User.Channel has Channel.IsAdminChannel set More...
 
+

Detailed Description

+

Represents a command that can be invoked by talking to chat bots

+ +

Definition at line 9 of file ICommand.cs.

+

Member Function Documentation

+ +

◆ Invoke()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<string> Tgstation.Server.Host.Components.Chat.Commands.ICommand.Invoke (string arguments,
User user,
CancellationToken cancellationToken 
)
+
+ +

Invoke the ICommand

+
Parameters
+ + + + +
argumentsThe text after Name with leading whitespace trimmed
userThe User who invoked the command
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in a string to send to the invoker
+ +

Implemented in Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand, Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand, Tgstation.Server.Host.Components.Chat.Commands.ByondCommand, Tgstation.Server.Host.Components.Chat.Commands.CustomCommand, Tgstation.Server.Host.Components.Chat.Commands.VersionCommand, and Tgstation.Server.Host.Components.Chat.Commands.KekCommand.

+ +
+
+

Property Documentation

+ +

◆ AdminOnly

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Commands.ICommand.AdminOnly
+
+get
+
+ +

If the command should only be available to Users who's User.Channel has Channel.IsAdminChannel set

+ +

Definition at line 24 of file ICommand.cs.

+
24 { get; }
+
+
+ +

◆ HelpText

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.ICommand.HelpText
+
+get
+
+ +

The help text to display when queires are made about the command

+ +

Definition at line 19 of file ICommand.cs.

+
19 { get; }
+
+
+ +

◆ Name

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.Commands.ICommand.Name
+
+get
+
+ +

The text to invoke the command. May not be "?" or "help" (case-insensitive)

+ +

Definition at line 14 of file ICommand.cs.

+
14 { get; }
+
+
+
The documentation for this interface was generated from the following file:
    +
  • src/Tgstation.Server.Host/Components/Chat/Commands/ICommand.cs
  • +
+
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command.png new file mode 100644 index 0000000000000000000000000000000000000000..813e0c89a3652f0aae12e69841de9d2c8177a0de GIT binary patch literal 3441 zcmeHKc~nzZ9tIIC^gjQOpxS(O* zEeME6LQx1IkbqcYga{ZQEFtU(kc2HHA*}P*TIx*CoS8F!&Uenc_xIkt_ucQ^`~B{B z-tBV^c515HstO7UYS1&MoD>vPflJ}sM@m46NQ^ZEs?X1zbw0hcv;>61LJ2zVu7?EkoF+OLa=*aKiD%_}WGE#FI9Y5N-HuWj3Y_feqjDr#v5ZEHW$)>?1e z`kyq`DzZj2iUv@#e6}b}s!?lH;KBZ}kx$?Ml26)4q7DrLk zi|^=r@kC?jll%@0v9}0ab29seI!4`Ek_nj4Zhrd-N=XKI*g35N6`fFZzpXPdeRLBa4FV=9V*B+4(}37y?q? zhvyKMK1zeDSWVonc(jJzy@nRNvf=DFFOP^6_xr7EUMi`lpnlwyy~~&s;=+A0jN*7> zWoS~)NhU|Xzg$V67*VN?5pG-8m~HL(vjGi-!=}}XGh*~?3fwq@=+JI)`6fjSr@O(D z?Ts}v{WC#W|Ni3Xr#Y-v_Q2>A6;uF+r*&!_cR|roWe{qjjZH-AJ@FURZ&a+N|G;hL zG0{rNrq5iWjB8)&2>5xGb#HP??>6|`Na@a*y|hB(iMqwc=&j1DpuO6heF&C~+l+fl z9Q|be+0ygA6KmOEeCWT=hChyEnZnFqEYmHkieDCex$?T`R8^%retW*B{bJIF7J^az zrZt{G<(iaiv!UlD_~QDmJbKjIxuIj&*7YpezFlZ^?l+W>zFNz4TiaUh|6ss8-Kf5_ zrSyRPpH=hM&K->2vcSIflt#V7b?VG@T3hySes8(63tt@mEj5AR7Wx^Ahk*yW~sw zyH6Oq7(b=CZwPK6uRssqhm?VL{w>}f56r$HXy(-5uj*d*{&239N#(gU`78v!HPCWF zEEwgElEGM^v#@ePK94yKJwitpIBNP4ak;6mNuBtFtLQ53yr)6-MQ^4N6iL1ufv*pI z{`&flq2ckq(NI)Of-)L~Xp{0_?_kyTm;BbkX?t_GvF?TcU#$u$mWAVQCbtZ+2bZT=$ zHTx3YH**O=ZGJPE*T%sQmUp%8ChL;+gDhbJ@mz`>wX#HOm>%BOg@XdaCnSK z9~t#RL@soiqAJBGL6w9E@uSb-0G|@k=waK&#~;XEf-YB$;ehYW z*?VU|&&bgjt5@~=jR=KQ|)@;eM8XHR9@9!1FMT z7+F5o_W)lpd+S(e#=`!kyd}Q8y{zgO#ibd&1Tqs#zjc*RXS+WS&7-|PgBKom_hyO$ zkOEcd`Jh6+WuM*|!cH8dj)^h$k0~%JKgKY7MD)GSPiFD@Ey+4}Cd2F}YSVmvLg4Cl zu}0f%q}}U`>Jxlnj9Cm0Y0QY2zZs?>df$8P31w$R%VK9!!r3=`eS z+DGnbz)Bs48XXay11)V`;`BrC#6=GSXsI}$(2Qh2F5chX$dXEAk0;c@>`zRFP*#`1 z_?MR|A6{QoaIRve|1)-r=am9Tx2_P2qV5=pGGl+L5nZ8OH~X@fdfZFVnq!pS{gA|& zYe9Z3i(g)>8HqHY9)_n4nM-ythGy*b!YW$Q-0<@!vY~{Xh7A8ebMlr1aL-gww{;~? z+XFvuNMAX;X!LM!Npuoewor_V@Qn9GLZ{qxd%)>`$It774B6k|2fJ{DE;~RhXYoC} zc4UVTKNy+{qH^;`T$wCmH4zalXm|1fhEa4KmS-}a3Ph>xfl>wh%7`1wr*f<3e!rPJr z9vF7|&^K0`gsFA_`nnmgtKU89ce7%Ot=LwL;?KXa_simwdDyI&ra_>zYx$>g+Q#pD XgZrABUM2zmM+(r>4yOnwuH5 + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.Commands.ICommandFactory Member List
+
+ + + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command_factory.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command_factory.html new file mode 100644 index 0000000000..9d24597e58 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command_factory.html @@ -0,0 +1,136 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Commands.ICommandFactory Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Commands.ICommandFactory Interface Reference
+
+
+ +

Factory for built in ICommands + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.Commands.ICommandFactory:
+
+
+ + +Tgstation.Server.Host.Components.Chat.Commands.CommandFactory + +
+ + + + + +

+Public Member Functions

IReadOnlyList< ICommandGenerateCommands ()
 Generate builtin ICommands More...
 
+

Detailed Description

+

Factory for built in ICommands

+ +

Definition at line 8 of file ICommandFactory.cs.

+

Member Function Documentation

+ +

◆ GenerateCommands()

+ +
+
+ + + + + + + +
IReadOnlyList<ICommand> Tgstation.Server.Host.Components.Chat.Commands.ICommandFactory.GenerateCommands ()
+
+ +

Generate builtin ICommands

+
Returns
A IReadOnlyList<T> of ICommands
+ +

Implemented in Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.StartAsync().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command_factory.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..ae867f2eed23edd9b89cf71c4954405e7c6543e8 GIT binary patch literal 1360 zcmeAS@N?(olHy`uVBq!ia0y~yV4MMD2XHV0Nny>&API>8pAgso|NjG-FW!7D?LRaD z$O7X72M(}y-jN4#IZA^3f*F8{K;Y`B5F-W#miwMAjv*C{Z|A-)`mDv{Dt_Cz_P@K` z&#Yt>y}rrkW@bc{-Y7i~Arz(XFUU)CWsp~=DwhM7!XzOc2M1M&h6XPK2F9rg3{0z< zG=Iw{M7_4FJImN7&v>Tf2V;))@9(^f>%Ka^Z~OCt|IUt=_vdcUIrC|^S5|q_F;708 z0}E^e8kX;3``n~>U@K=+qWs?jXBnQ^N_W@t8eC;~=J@sYZ@!y#Jre2h0&mfzX(_`yEA&4y_|RHdDl)wI>VQcLJ_z2&yh z)Ocah7VDM!vigeypC386h)8m zGj>N;?rhGN+dJLw%$56ZKJ3j(4mzbab?L*3*L^daUxpb@*|gevnYoGf$LmXTa$iiF zof_0`{j65n|J{sigX4cougu(=^JjL+wB`GhCS!3lsJe*N+? zVt6%Oq(J$t75a@oJ9d6Vvhx*ZobK3ANel6m3#kG&4-5AI3un3OHda@g)y z0VJHGdK)}3fxslTdpKkKUQI=+_B5ybUuAQyv)u_dW3Ih-Eg?!qcUI!mvezD3i*v5uP2v`> zePKL(_3v}F!APSsuV4H!^`}y4Zq|Wm zo3ssdS9=>wU%JLSqdaVP(N31)a&7(c4`&yDztlPN*Y53&^Vn_N9{YLi?Y+N0`B}oQ zP@bi4UiH1?J?r(SR5Mz7*VD9_;q}M&LHDYg8a+q%0myi)r1oIS?Rb0etiO48(e|02F69Fz8& zWVgm+qsOKHtF#UN9@X=leG^98mKbMDyS+_! fYwm3^um6mEjUm44AMxq{i$4ZWS3j3^P6 + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.IChat Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Chat.IChat, including all inherited members.

+ + + + + + + + + + +
ChangeChannels(long connectionId, IEnumerable< Api.Models.ChatChannel > newChannels, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.IChat
ChangeSettings(ChatBot newSettings, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.IChat
Connected(long connectionId)Tgstation.Server.Host.Components.Chat.IChat
DeleteConnection(long connectionId, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.IChat
RegisterCommandHandler(ICustomCommandHandler customCommandHandler)Tgstation.Server.Host.Components.Chat.IChat
SendMessage(string message, IEnumerable< ulong > channelIds, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.IChat
SendUpdateMessage(string message, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.IChat
SendWatchdogMessage(string message, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.IChat
TrackJsons(string basePath, string channelsJsonName, string commandsJsonName, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.IChat
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html new file mode 100644 index 0000000000..0b4a04be13 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html @@ -0,0 +1,511 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.IChat Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.IChat Interface Reference
+
+
+ +

For managing connected chat services + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.IChat:
+
+
+ + +IHostedService +IDisposable +Tgstation.Server.Host.Components.Chat.Chat + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

bool Connected (long connectionId)
 If a given set of ChatBot is connected More...
 
void RegisterCommandHandler (ICustomCommandHandler customCommandHandler)
 Registers a customCommandHandler to use More...
 
Task ChangeSettings (ChatBot newSettings, CancellationToken cancellationToken)
 Change chat settings. If the ChatBot.Id is not currently in use, a new connection will be made instead More...
 
Task DeleteConnection (long connectionId, CancellationToken cancellationToken)
 Disconnects and deletes a given connection More...
 
Task ChangeChannels (long connectionId, IEnumerable< Api.Models.ChatChannel > newChannels, CancellationToken cancellationToken)
 Change chat channels More...
 
Task SendMessage (string message, IEnumerable< ulong > channelIds, CancellationToken cancellationToken)
 Send a chat message to a given set of channelIds More...
 
Task SendWatchdogMessage (string message, CancellationToken cancellationToken)
 Send a chat message to configured watchdog channels More...
 
Task SendUpdateMessage (string message, CancellationToken cancellationToken)
 Send a chat message to configured update channels More...
 
Task< IJsonTrackingContextTrackJsons (string basePath, string channelsJsonName, string commandsJsonName, CancellationToken cancellationToken)
 Start tracking json files for commands and channels More...
 
+

Detailed Description

+

For managing connected chat services

+ +

Definition at line 13 of file IChat.cs.

+

Member Function Documentation

+ +

◆ ChangeChannels()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Chat.IChat.ChangeChannels (long connectionId,
IEnumerable< Api.Models.ChatChannelnewChannels,
CancellationToken cancellationToken 
)
+
+ +

Change chat channels

+
Parameters
+ + + + +
connectionIdThe ChatBot.Id of the connection
newChannelsAn IEnumerable<T> of the new list of Api.Models.ChatChannels
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Chat.Chat.

+ +
+
+ +

◆ ChangeSettings()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Chat.IChat.ChangeSettings (ChatBot newSettings,
CancellationToken cancellationToken 
)
+
+ +

Change chat settings. If the ChatBot.Id is not currently in use, a new connection will be made instead

+
Parameters
+ + + +
newSettingsThe new ChatBot
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation. Will complete immediately if the ChatBot.Enabled property of newSettings is false
+ +

Implemented in Tgstation.Server.Host.Components.Chat.Chat.

+ +
+
+ +

◆ Connected()

+ +
+
+ + + + + + + + +
bool Tgstation.Server.Host.Components.Chat.IChat.Connected (long connectionId)
+
+ +

If a given set of ChatBot is connected

+
Parameters
+ + +
connectionIdThe ChatBot.Id of the connection
+
+
+
Returns
true if it is connected, false otherwise
+ +

Implemented in Tgstation.Server.Host.Components.Chat.Chat.

+ +
+
+ +

◆ DeleteConnection()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Chat.IChat.DeleteConnection (long connectionId,
CancellationToken cancellationToken 
)
+
+ +

Disconnects and deletes a given connection

+
Parameters
+ + + +
connectionIdThe ChatBot.Id of the connection
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Chat.Chat.

+ +
+
+ +

◆ RegisterCommandHandler()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.Components.Chat.IChat.RegisterCommandHandler (ICustomCommandHandler customCommandHandler)
+
+ +

Registers a customCommandHandler to use

+
Parameters
+ + +
customCommandHandlerA ICustomCommandHandler
+
+
+ +

Implemented in Tgstation.Server.Host.Components.Chat.Chat.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.WatchdogBase.WatchdogBase().

+ +
+
+ +

◆ SendMessage()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Chat.IChat.SendMessage (string message,
IEnumerable< ulong > channelIds,
CancellationToken cancellationToken 
)
+
+ +

Send a chat message to a given set of channelIds

+
Parameters
+ + + + +
messageThe message being sent
channelIdsThe Models.ChatChannel.Ids of the Host.Models.ChatChannels to send to
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Chat.Chat.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.HandleInterop().

+ +
+
+ +

◆ SendUpdateMessage()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Chat.IChat.SendUpdateMessage (string message,
CancellationToken cancellationToken 
)
+
+ +

Send a chat message to configured update channels

+
Parameters
+ + + +
messageThe message being sent
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Chat.Chat.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DreamMaker.CleanupFailedCompile(), Tgstation.Server.Host.Components.Compiler.DreamMaker.RunCompileJob(), and Tgstation.Server.Host.Components.Compiler.DreamMaker.SendDeploymentMessage().

+ +
+
+ +

◆ SendWatchdogMessage()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Chat.IChat.SendWatchdogMessage (string message,
CancellationToken cancellationToken 
)
+
+ +

Send a chat message to configured watchdog channels

+
Parameters
+ + + +
messageThe message being sent
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Chat.Chat.

+ +
+
+ +

◆ TrackJsons()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<IJsonTrackingContext> Tgstation.Server.Host.Components.Chat.IChat.TrackJsons (string basePath,
string channelsJsonName,
string commandsJsonName,
CancellationToken cancellationToken 
)
+
+ +

Start tracking json files for commands and channels

+
Parameters
+ + + + + +
basePathThe base path of the .jsons
channelsJsonNameThe name of the chat channels json
commandsJsonNameThe name of the chat commands json
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in a IDisposable tied to the lifetime of the json trackings
+ +

Implemented in Tgstation.Server.Host.Components.Chat.Chat.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew(), and Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.Reattach().

+ +
+
+
The documentation for this interface was generated from the following file:
    +
  • src/Tgstation.Server.Host/Components/Chat/IChat.cs
  • +
+
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.png new file mode 100644 index 0000000000000000000000000000000000000000..800c27bee1e1e5b44a91df98210a12d899d60ea4 GIT binary patch literal 1917 zcmbVNX;4#F6b=E6LIIUl1i@gzFfK(cA<8ZgMJg|}%EJv2#)!tUC`|$wlAzSuI6|r! zr6hnw6eK}WcEXY%R7w$oVq^(nX=y-~Ab~&wN$8~=f3)L|j&J6D_nh;c`|h3dzH=|@ zOM<_tv9&P*fiMl&k3Wb&AThxHeuW{xp^WwhFs%DBFnI6c;vz6d#?=(|(;tBK_bV2Q zm$7=$z+FK;NH~N5NlTCP*Wk|)2-HUbc%R?|g9-UyoS<^;vOx)Ni)hh4XpPu+h2KGn z#X{S*HYEpf&FDbtOeYpPbi|x}ikr9DBQAr_f0`8KQouL<+KFY)4TiJUKzu%oE#OR##wbSFX7Xar`6$-0Gib)qu;90tQvS#F^!rVD= zD^!fz?hmG8UlQjoo3Fn}a}&HiAg^=YULvY)uWQY7#>}c!I%{owb(;y+HEiSB&&r?K zoIMDuc{O1iN0W(qVVd!ptz7s@d4u7;$;|F;i zZcdyE)qg$QBBw-0oA@7iTzwQ)Zv``(1Qk%eUFbtANW%LVcNxcc%n%dfv<{t5XA8V&55 zmpxpA`X9t7L)71(V~8e`5tIA!mLoG)L3ZMmFN{9S=u4MPP))`R45$tn-x^rH51u#o zDhzq&^3ft&$KCqXHczgnM0>W0`d15kyk~m9Vp3ce<}Y+3kmXX0v6~wd9^Pi_Z<&&iOv_E93}q z3~IT@z@Io?9xuXa{hs8sFwQ1bbQP(L^!QkrF0k|XMANC|)vQrruXm$IV^k#V$C8rV zv{{MwS=BuQqmgx3QUPT!4H<>6ifEc8YtDJI^ZjPHHs+e~rg~+i)jSImWDUOR2jMs( z!h|z)+ngpxZIA`VzX^9C`DsHr^%c3$nK`Wl+r29pVcW#bjB%@eBUk#Yhp0O9B`;mj zJbf#+GLavEv#pG5Cw8es1p&KsC|(I0}yc#`DlaTy#j|`jI{UiwEND@izPiw?X zCv$cx(NSDnvMpY?oklBI7(p|O&7PF@kxMgl@;|0r75Pzqsn9TiYM*L)ccn)}pdzby z{`WI1%z6Bs=Tu(uVGC%$v};pIq3*32-Xg*9X5iCgllMVPh3vCJlu<&Ea+RHUCs2mR zFoW&5YGCuv=kEBf@w+dZpk-f{uV?mn4cM}Is9 z*2-yN=wEM)be1(_X4z6onfkHn7e;ATE~NUh^H+l_?l58bzViH*s|$%9ws$*+5`H=3 zZANWsZI?v%#`=KF-LHwxnz2`29YoFJPWr%;R&u&o2nW|Faj{Br?;%qqO!_XacxMpS zRZgaMRLfIv+;L1y`w+RKDiq2tN@{5Bh$!ZYH|1g)ZZATR@QrsDnaZ7!{ro65q`!wo zaG%$M%3K}CYBJNy?Vp=yhgEO8_EVAD+*{)E7m6#=g>3zlM%LEmO$ho$=z5wMqlf8-l}`7g$0o#Frh literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat_factory-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat_factory-members.html new file mode 100644 index 0000000000..f22ad6d724 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat_factory-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.IChatFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Chat.IChatFactory, including all inherited members.

+ + +
CreateChat(IIOManager ioManager, ICommandFactory commandFactory, IEnumerable< Models.ChatBot > initialChatBots)Tgstation.Server.Host.Components.Chat.IChatFactory
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat_factory.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat_factory.html new file mode 100644 index 0000000000..21ab3b98a4 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat_factory.html @@ -0,0 +1,161 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.IChatFactory Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.IChatFactory Interface Reference
+
+
+ +

For creating IChats + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.IChatFactory:
+
+
+ + +Tgstation.Server.Host.Components.Chat.ChatFactory + +
+ + + + + +

+Public Member Functions

IChat CreateChat (IIOManager ioManager, ICommandFactory commandFactory, IEnumerable< Models.ChatBot > initialChatBots)
 Create a IChat More...
 
+

Detailed Description

+

For creating IChats

+ +

Definition at line 10 of file IChatFactory.cs.

+

Member Function Documentation

+ +

◆ CreateChat()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
IChat Tgstation.Server.Host.Components.Chat.IChatFactory.CreateChat (IIOManager ioManager,
ICommandFactory commandFactory,
IEnumerable< Models.ChatBotinitialChatBots 
)
+
+ +

Create a IChat

+
Parameters
+ + + + +
ioManagerThe IIOManager for the IChat
commandFactoryThe ICommandFactory for the IChat
initialChatBotsThe initial Models.ChatBot for the IChat
+
+
+
Returns
A new IChat
+ +

Implemented in Tgstation.Server.Host.Components.Chat.ChatFactory.

+ +

Referenced by Tgstation.Server.Host.Components.InstanceFactory.CreateInstance().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat_factory.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..07a2fd125a723ac661525d07b373d3aac9eb36cc GIT binary patch literal 1195 zcmeAS@N?(olHy`uVBq!ia0y~yV6+0V12~w0igH+zKTDB2YjZ>AK140|4zjNTkT$4o*=)ss$PCIt1;8+ExUuw^@?6Fu+81b zu;;4WU1sNoY+;YXe$pkUS-Uqg8eDC7cl7W1gFAVj-M6f=+HZbbZdTU1W9e-+yQ~7& z{`Os^m$j($52{O^949G6|f=HXl3dTys__!VAXzu4lBGIuwyZ|1&zbiY%&@RruJ&UHIyExsLh zV_ypI`oA4HO?lOc_vh{U${QK8n|0UQ*131)v*~=fcJ`vB%4F`{)vv3Z*VdNgZ*OzE z@jH5d-Ro~Ja$5ItN7Qb9f9jfid2q{`rDjj~+E;E^`=r9T&BNU0*hQ^1rYY0omi{=) z6rT8g*DI}@_`{5IjtMrre=$8tavqC(Ogt0AzLoQx)4MChW3(?Y#9v>((D>sSJsk(G zgw-zW0zr$IIbe}gwGbG0A(~5VL=L=vCGWuXV5N|(gUkPas@4q+AeMg7Nxla=fvf;d zK7}P{nqe^vl=kSPSo*$Oxy02|{yKTBp2F(Olx9?x}e9 z#i^g_C%0Uyt$qFM)sYX%p0i%YT+`q8d%pCfCsFcWGEek>%WJzC`D^u@{2n^LixugLHf-bhwj*|RD3`z*bfFALAdtg}G)po*$dPVr&1q zx7RMXZ+?G&*LI}DG`}La9cN;yFn_J}CN?~_we=f(woV1c&Rck-s9Je)X + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.ICustomCommandHandler Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Chat.ICustomCommandHandler, including all inherited members.

+ + +
HandleChatCommand(string commandName, string arguments, User sender, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.ICustomCommandHandler
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_custom_command_handler.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_custom_command_handler.html new file mode 100644 index 0000000000..d3f5ba14c1 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_custom_command_handler.html @@ -0,0 +1,168 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.ICustomCommandHandler Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.ICustomCommandHandler Interface Reference
+
+
+ +

Handles Commands.ICommands that map to those defined in a IJsonTrackingContext + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.ICustomCommandHandler:
+
+
+ + +Tgstation.Server.Host.Components.Watchdog.WatchdogBase +Tgstation.Server.Host.Components.Watchdog.BasicWatchdog +Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog + +
+ + + + + +

+Public Member Functions

Task< string > HandleChatCommand (string commandName, string arguments, User sender, CancellationToken cancellationToken)
 Handle a chat command More...
 
+

Detailed Description

+

Handles Commands.ICommands that map to those defined in a IJsonTrackingContext

+ +

Definition at line 9 of file ICustomCommandHandler.cs.

+

Member Function Documentation

+ +

◆ HandleChatCommand()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<string> Tgstation.Server.Host.Components.Chat.ICustomCommandHandler.HandleChatCommand (string commandName,
string arguments,
User sender,
CancellationToken cancellationToken 
)
+
+ +

Handle a chat command

+
Parameters
+ + + + + +
commandNameThe command name
argumentsEverything typed after commandName minus leading spaces
senderThe sending User
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the response text to send back
+ +

Referenced by Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.Invoke().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_custom_command_handler.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_custom_command_handler.png new file mode 100644 index 0000000000000000000000000000000000000000..aee37a8c6810899b731273dad21c4e403c5b3e8d GIT binary patch literal 2698 zcmchZdsLFy7QlTBnHKrTMx9J+q7g?^GtGQrh2>|8Vx}`?_=?N|-)3flc6~&e7GWla z7%A#hn!N}KHD}bq8ZAsiR5Ha!h?Z|hgZp8vb=SJLd;hrWuKTU^?X&mU=X`6QefIC1 zkK}{e2i5pNLrF;q3b-SEm6TNBpniU(DkvTM5O={w-^bI>O)i&%>d4qkLSEw~P+NW* z8X6#^9%Im48Sjfapac$5Ja2e@)=Ekm1^{xG-)UuOZ?FIDCpvrk%Y&Lf$}E#^L7~d8 z5w%M%Ft-dn^Igdr2e;d2)MvJeV@)jzTCpojQeRbcG{F6K1iSxiYo(D7)hByEb9Q4@ zGfRC{Z~6#QH&uRhQ#%5y5N`t|(naEMq0^~z+pDUjL3OjpBwZ)BP9?qUNNU zCs7Q#c>402p{|EBhfc6)r;;}YP7Lb_nf?^ zBLdU?qDM2rxrkbL2z|yoQB;OZyKKJ>Yf&o|hjMpVnqxNn7J27cS*5nv>gZunt8N^Y z_VVmw$MwgJiTfy5n($^ar&6ysb|E;oQRiM_fevIZ)5L>gSxmYojEb?p$EC4EdGvAJ zxz;%u-OFZCbwC~c=Vz|o>ySV0=ucU<(T(c&lT6u6ajqMQBqA1dMd=}c5O`V`*~DZsz5 zEQWvPPkj7X2j}Lyd@n}fyss0sXe=Sx*OuAu!f2IMK1tz6KsG=f{l$Nyo((Ozd8p;7 zqnXs8L;Zv^XWZ$_3WoeBdGQ2h%tFEf?(suRdo-R(x8W>4suave9l2^c#IjSxUx?{C zn=|l(*x}8mH_Cfx_p$82OeGEYyS%9t5M7^!%Q_IyxXxl( zD_Y7IE76;$3ol9C?xBztW$L;4znABL+kBwi7ViUS4itZEvZ z#*f;*)ZdT<=jkm*A{q%HKr9NZ*vV4(OZCZfa4*_eQ7*$K;j!^?uF-s~enr5TbTNxF zF)eK(1YP~Ia2IQN;efbHe80c*4Dk9}$b7(mK}JycIGr%UT@^OblAVIsT@PWexc^rH zOw9w_2sOr74nP(SBS>P$D`(kJiXd{}l42^XzAdk1k_I74!t&u(FmD>Xpw+#2N$oWu z{HbX4up)1rpb% zX8oCp_Nz4x6oSx1?_EZx%;vvDhX^9dV!fA2rFff?)J+v<8&ds3gAIQ+w%VAlub;(J zTkXDOMe~hGWmR8NTFn34{VeFpwFoM+K9#jBJzjt-PyK@2+Y4lv8+o-Wi3}U?0kf4# zfdkfS!2GRt|JSZ(&S;A+I;`j4`J_~~0OAzDmku23KdN1xLXEmq z%I+Qy+TZ}JF+^6v%tadkhiUqTx{iRb)6opW#p`QmN4YLS`r@Oxxame$fGTMdkHi=e z{3#xd0p)TCx(_cil!sL*?lOltuLUV4o=XqH6?GeK)x7#j=w^PvToQ;G?|rFUJXmp& zC`{IC?pg3RDN-uJ5>rNC_U(G&An(SldeXpFUSt}r$;x|)reCa$#Z1idwn!c(g#Zy# z5mXBn^QV1Tn~DNO%*V~#6>$@h>)U19X?3E^nzdNtcca18P#R3Fma#Mi96yxUdR)bk z)PJ|OE9|r{C86o$Sa=BTemrn5j5y0pUi`$TFw^V8!ki5%juyvqqYm%q zOcRs9kfOaQL`QWyR$Fe?;63&!;v;BKZa)OQBg8`VFi5Fuv$QkJexBuJQY3I_lGr=I zl6%>9qVV;99k8$Eb}&C6DFIn1vT7c3A@R!HL?S0=|2>S!w%dx2tV53%|JBlcLTB4> z#q*ayE@)}m-T$+hV<5ZRW%t*B)9v=9_RzX_F|_QV{t`_JUY=XbB}VpQ#{%5u?er9mVR({hpHx&u$y8MdU`J< zub^x5!kOA5s>Pa*db{Xte=Gp^Yj8zW=iyFlVW_i_-2wBiss;TPTi$)?Y4y+T;0}$a z(j6n$$QM=-V!(XdG~*%Y=?k2#&PCVAz%rUH_xhpJZEm@%=pcHWwTAQb1TjsmzG)WNIhsC#BK9N~*vg OM + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.IJsonTrackingContext Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Chat.IJsonTrackingContext, including all inherited members.

+ + + + +
ActiveTgstation.Server.Host.Components.Chat.IJsonTrackingContext
GetCustomCommands(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.IJsonTrackingContext
SetChannels(IEnumerable< Channel > channels, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.IJsonTrackingContext
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_json_tracking_context.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_json_tracking_context.html new file mode 100644 index 0000000000..19449c5e65 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_json_tracking_context.html @@ -0,0 +1,221 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.IJsonTrackingContext Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.IJsonTrackingContext Interface Reference
+
+
+ +

Represents a tracking of dynamic chat json files + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.IJsonTrackingContext:
+
+
+ + +IDisposable +Tgstation.Server.Host.Components.Chat.JsonTrackingContext + +
+ + + + + + + + +

+Public Member Functions

Task< IReadOnlyList< CustomCommand > > GetCustomCommands (CancellationToken cancellationToken)
 Read CustomCommands from the IJsonTrackingContext More...
 
Task SetChannels (IEnumerable< Channel > channels, CancellationToken cancellationToken)
 Writes information about connected channels to the IJsonTrackingContext More...
 
+ + + + +

+Properties

bool Active [get, set]
 If the IJsonTrackingContext should be used for GetCustomCommands(CancellationToken) More...
 
+

Detailed Description

+

Represents a tracking of dynamic chat json files

+ +

Definition at line 12 of file IJsonTrackingContext.cs.

+

Member Function Documentation

+ +

◆ GetCustomCommands()

+ +
+
+ + + + + + + + +
Task<IReadOnlyList<CustomCommand> > Tgstation.Server.Host.Components.Chat.IJsonTrackingContext.GetCustomCommands (CancellationToken cancellationToken)
+
+ +

Read CustomCommands from the IJsonTrackingContext

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in a IReadOnlyList<T> of CustomCommands in the IJsonTrackingContext
+ +

Implemented in Tgstation.Server.Host.Components.Chat.JsonTrackingContext.

+ +
+
+ +

◆ SetChannels()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Chat.IJsonTrackingContext.SetChannels (IEnumerable< Channelchannels,
CancellationToken cancellationToken 
)
+
+ +

Writes information about connected channels to the IJsonTrackingContext

+
Parameters
+ + + +
channelsThe Channels to write out
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Chat.JsonTrackingContext.

+ +
+
+

Property Documentation

+ +

◆ Active

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.IJsonTrackingContext.Active
+
+getset
+
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_json_tracking_context.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_json_tracking_context.png new file mode 100644 index 0000000000000000000000000000000000000000..9fa3262af77e34e28fb5b8bc3cae1647b2c46659 GIT binary patch literal 1709 zcmb_ddo0NHEoQ>ZhKt?-eIQ7JYSiN74`~?c#Ijd z!99{6r{u(?(>3Vy`Hpw-G@5Wx>}%2Oy}PeORkjLZpF5-qa%CvJ^OY%LOYq2}1Vc)M zT+pHxwZ62I;Cu|4-+rz#NNfbQAALDE&Y&=+?sk!8sr@l>(eMF}C))W0t21<(_(R*X zb0wxyFOp~X-PD*9#*~pSsnHnG*oClvXL}iaU$;~@oMr`-wd-WS-yaON&QJ;sok9wL z0JX4Ncj|5;lAL%*fr^e=*l`YG>n#%e!Y~NK#Y2Gny1*JaeT6)%C@257@a+gt-AK_a zQ{$x?OaM!=_)0XNBy`cL=7u=7avS!gsf1yQl_P`rX=&@rW5S=bJ1-3#h0=kzAamQC zR2|8IJTLz;huYfrM`U&wAsDKw@^)aCsPOy8)vaVxfdDOvAUP$BnW0*llgsN8>6xgY ze$)L1TZF_ToPg5w2h7=$VwQVqPw-ObBuO=1wR#ebE6}msyivxb7X}zNXr(li=44F2 zGZF8GP!si<)!ecC#45!y2~-EhL=(MTq*>G2QP!Ly76)<;|JWju9QUYK%h@>JgX;%F zlw8Z}^F#~dTdo_a{j#+uB;iWD6~=Jp*u$arif(JaL&V3I)iJze-e%7p#6bn~f|N)~%pJ8oWoqN4uNb}&FW zR5pi&@jFFJdX0fg2cP@<=a(}oJ$%qJ_YUb()v66{u$!zwAya9X&iC8o+!Jypmgr!R45W8BkYo?L3!$+* zpb>7}oyjBBH9xfaC%2cZ%qs-w-ko#_>LDi78 zVDV=NaBGbGA6@t@4?Fr%b1l=>g<9U9i_$RZI9oaUPgQ*?_**1T#tID8b{QK@ZlTfi z(*AJ5t;TkrX1;jN4|a0OujJ+JG=xhMOE^pD9hx=pS0|e(VI@!meR9*s!F2pnzDNhb z=)G~W7iG1D6w38wAf6eul`mZLb;64E<7S18DaN?|t{o`)c<;3~i1Wy4^y#8kmtSRT z6ff;BskxG^Qg1?BkHyu4WUu9*#q+Zp8nluc&gVoUwQZObPxvZUdlf}4= zOX(-w>C#Re97iP@=6LksS_ls9cErX5vjfF-&s+9yH|f|yvQenLR4S^w(zTa(+RLWz z0z@&k053^nNzPewtWOqAc}sHx@UFaFVaNXl&37)& literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_provider_factory-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_provider_factory-members.html new file mode 100644 index 0000000000..ec8b15294e --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_provider_factory-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.IProviderFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Chat.IProviderFactory, including all inherited members.

+ + +
CreateProvider(ChatBot settings)Tgstation.Server.Host.Components.Chat.IProviderFactory
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_provider_factory.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_provider_factory.html new file mode 100644 index 0000000000..47cd899584 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_provider_factory.html @@ -0,0 +1,141 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.IProviderFactory Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.IProviderFactory Interface Reference
+
+
+ +

Factory for IProviders + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.IProviderFactory:
+
+
+ + +Tgstation.Server.Host.Components.Chat.ProviderFactory + +
+ + + + + +

+Public Member Functions

IProvider CreateProvider (ChatBot settings)
 Create a IProvider More...
 
+

Detailed Description

+

Factory for IProviders

+ +

Definition at line 9 of file IProviderFactory.cs.

+

Member Function Documentation

+ +

◆ CreateProvider()

+ +
+
+ + + + + + + + +
IProvider Tgstation.Server.Host.Components.Chat.IProviderFactory.CreateProvider (ChatBot settings)
+
+ +

Create a IProvider

+
Parameters
+ + +
settingsThe ChatBot containing settings for the new provider
+
+
+
Returns
A new IProvider
+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ChangeSettings().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_provider_factory.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_provider_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..921ac87d4b79dbf4721525adcc8688aeafddc29f GIT binary patch literal 1284 zcmeAS@N?(olHy`uVBq!ia0y~yUiLMGZkam$Sn6yUAu#Yl4dh+i_cuUH7I+nYA0I&lSiN+>xmF#tbXgah{3TLcK@O# z&$nlac=>_(M&Y@5bCw-~&G&eJEc{N8uhR z`{!wQ=gsltU$pziceAFQv)A$*{h_`nc*Sv!jkh;wu2DuIs=I-*U zeW-M7Z&Bsf%^LoB{j064+IQ{XwSBj8?h#l2PAR{+heQL#m!B;Do>A!D-aTJ4=Nth&_pZ6l>E@NF}y{1@$cdSrv zEc*lVubM9Ib1uuitz`JX{zcKncgE^9>>7-F7AtX0Sc#0;FJ6n%-g+&nkHO9KWFPtZ*7Cnczf4qFyG6gd`~1(>Z7MsV$u4K(@f}W+B(=4| zHJ({ptuJ;_&Ajye^L39q!hahTJ@a&K_=+F+wCih8KI>)M2 zd(rWmv+4?-^<@iw?Bf%+SGSTqtM%IX&+F~VcQWqg8_$Z2nXe8^d3AbU7alyLA`WE! zdnvp3-12Ul+PN=kPNy65?OeG%|Jp^WRdXtotisDZf2ICi8ljT8)_T##*B+PhUnzIoQh08CE7)<;zXrR;72Sn1zfKC7 zw8T8bMO8D{HDr=eD2(w{VOQ?$uv^=5PhYgRT + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Chat.Providers.IProvider Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Chat.Providers.IProvider, including all inherited members.

+ + + + + + + + +
BotMentionTgstation.Server.Host.Components.Chat.Providers.IProvider
Connect(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.IProvider
ConnectedTgstation.Server.Host.Components.Chat.Providers.IProvider
Disconnect(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.IProvider
MapChannels(IEnumerable< Api.Models.ChatChannel > channels, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.IProvider
NextMessage(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.IProvider
SendMessage(ulong channelId, string message, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Chat.Providers.IProvider
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.html new file mode 100644 index 0000000000..23ecf30d2d --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.html @@ -0,0 +1,369 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Providers.IProvider Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Providers.IProvider Interface Reference
+
+
+ +

For interacting with a chat service + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Chat.Providers.IProvider:
+
+
+ + +IDisposable +Tgstation.Server.Host.Components.Chat.Providers.Provider +Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider +Tgstation.Server.Host.Components.Chat.Providers.IrcProvider + +
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

Task< MessageNextMessage (CancellationToken cancellationToken)
 Get a Task<TResult> resulting in the next Message the IProvider recieves or null on a disconnect More...
 
Task< bool > Connect (CancellationToken cancellationToken)
 Attempt to connect the IProvider More...
 
Task Disconnect (CancellationToken cancellationToken)
 Gracefully disconnects the provider. Implies a call to IDisposable.Dispose More...
 
Task< IReadOnlyList< Channel > > MapChannels (IEnumerable< Api.Models.ChatChannel > channels, CancellationToken cancellationToken)
 Get the Channels for given channels More...
 
Task SendMessage (ulong channelId, string message, CancellationToken cancellationToken)
 Send a message to the IProvider More...
 
+ + + + + + + +

+Properties

bool Connected [get]
 If the IProvider More...
 
string BotMention [get]
 The string that indicates the IProvider was mentioned More...
 
+

Detailed Description

+

For interacting with a chat service

+ +

Definition at line 11 of file IProvider.cs.

+

Member Function Documentation

+ +

◆ Connect()

+ +
+
+ + + + + + + + +
Task<bool> Tgstation.Server.Host.Components.Chat.Providers.IProvider.Connect (CancellationToken cancellationToken)
+
+ +

Attempt to connect the IProvider

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in true on success, false otherwise
+ +

Implemented in Tgstation.Server.Host.Components.Chat.Providers.IrcProvider, Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider, and Tgstation.Server.Host.Components.Chat.Providers.Provider.

+ +
+
+ +

◆ Disconnect()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.Chat.Providers.IProvider.Disconnect (CancellationToken cancellationToken)
+
+ +

Gracefully disconnects the provider. Implies a call to IDisposable.Dispose

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Chat.Providers.IrcProvider, Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider, and Tgstation.Server.Host.Components.Chat.Providers.Provider.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ChangeSettings().

+ +
+
+ +

◆ MapChannels()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<IReadOnlyList<Channel> > Tgstation.Server.Host.Components.Chat.Providers.IProvider.MapChannels (IEnumerable< Api.Models.ChatChannelchannels,
CancellationToken cancellationToken 
)
+
+ +

Get the Channels for given channels

+
Parameters
+ + + +
channelsThe Api.Models.ChatChannels to map
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in a IReadOnlyList<T> of the Channels representing channels
+ +
+
+ +

◆ NextMessage()

+ +
+
+ + + + + + + + +
Task<Message> Tgstation.Server.Host.Components.Chat.Providers.IProvider.NextMessage (CancellationToken cancellationToken)
+
+ +

Get a Task<TResult> resulting in the next Message the IProvider recieves or null on a disconnect

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the next available Message
+

Note that private messages will come in the form of Channels not returned in MapChannels(IEnumerable<Api.Models.ChatChannel>, CancellationToken)

+ +

Implemented in Tgstation.Server.Host.Components.Chat.Providers.Provider.

+ +
+
+ +

◆ SendMessage()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Chat.Providers.IProvider.SendMessage (ulong channelId,
string message,
CancellationToken cancellationToken 
)
+
+ +

Send a message to the IProvider

+
Parameters
+ + + + +
channelIdThe Channel.RealId to send to
messageThe message contents
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Chat.Providers.IrcProvider, Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider, and Tgstation.Server.Host.Components.Chat.Providers.Provider.

+ +
+
+

Property Documentation

+ +

◆ BotMention

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Chat.Providers.IProvider.BotMention
+
+get
+
+ +

The string that indicates the IProvider was mentioned

+ +

Definition at line 21 of file IProvider.cs.

+
21 { get; }
+

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ProcessMessage().

+ +
+
+ +

◆ Connected

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Chat.Providers.IProvider.Connected
+
+get
+
+ +

If the IProvider

+ +

Definition at line 16 of file IProvider.cs.

+
16 { get; }
+

Referenced by Tgstation.Server.Host.Components.Chat.Chat.ProcessMessage().

+ +
+
+
The documentation for this interface was generated from the following file:
    +
  • src/Tgstation.Server.Host/Components/Chat/Providers/IProvider.cs
  • +
+
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.png new file mode 100644 index 0000000000000000000000000000000000000000..1982058e11c10ee24c2d5514e58de886dd02f545 GIT binary patch literal 3182 zcmc(idr(t%7ROPF6h+b1TGSx5gl83mDiEH&X~Ym-wsiwa1%xe-KtLjo@DNI*V!!|f zMFd4bR6wK{ULjB(A;cINlz<_;0)z+&CI|!w$^Js^?9OaEv-`(RGjo%3&%N`zzjN;Q zbIwV+yPM0#^*h(Asi|#*e{;-JO-&sF?B-9^!FL@icNYBUx}Wksu2d?4IXOLdG4t0f zV67g_&CMF=1Nz|f(hq?{+e%Gs!wUS^Ved<8L_98bv~m0Kkxb#EMy0__ zRPz_RjFX+@CJjc^6I+>fcOUHG{i@VtKHD33=EivYq2!qFN%x@)*D}cd9k~YZv&iuz z#zP2P8f&I`>csdrB#sx%&&te&)Oe?BO}4~f%$7>8WRK547fG%KE{}{D+TNS;GV~4T zUpG*(hmxH~To_dfNd)2c%X2hw&MZeXB7NsG7i8iIR!O)AA=fH$z0g(o8aooyOSN*s zL&y~M>Ec`O3W)nKZZRDjKcH<7dl@*RJcqtEH7E7Rf<~_1cOSC+6+inK>n9R)>#8FM zl8;EN`|^1pnSeh`dVv7@mRVxuOFkN~nMK!@r5dMrIjX$25kV?b#pZm32(9A>g)Tv3 zQb8mhFw)qZYU^Fsp_QfB<^Z`5@F)p?bjh0tjd9FXH!8+L8B?mY{*}D7iC1k*+>5+7 znYa&Mp-|qg(O8f6fE68T**t@O4V-40+f3e@o>pJKEo0TKoBLOr&F99W>f5Y-^bq4%*!y+IE$QB%kIA4JoS&=epXJ%E}^_-GljlD zBXS3AE*rdjGoM?@&cvl6rj7C9U{q|3o$T83&hWO%&txmTy2T)&@i%jp$-7{~#7rsO zbEO7?j7mj7g2M&U+L%J0RG#F0T)E{5@X{`QQ9TpHr?v#wHOpm5Ym> z5vX5s{qa@vO>e^WMm-m-dZWiALaUYrt!t-kS_hVBXDz4v_?13WkWNW>i0wVqGcD+W z&KVvF(HjXW zArQuDMORo&wL|kMyN#!H^(|avmF&`^q2so@rPY-`ST_(m@c5gpCnoR~4e1!Wg!+RJ zm8f^$@b8mOr72DkSxt2xs;mb(s~TYFqYf7Ifk{c2Arj3spUS>k*r-p)-bUFrl(JGSW8`6})4+k9M+ec|Tyjs3Sr z{ktcUXx3*4wXb*E?VOia$P#u7&J3p2SH_A1XjD#&ws|HETV72)UKp~`MU@IV$;#`U z!kOZsV#>*MDtW`#?y#a}=ZWO|x81w~D*)(;r?S^pmc}G8f<1@l4(ROP@h3v+5k{Gn z_6R?mFFKS=Yu~l)HzdN_xF}K5S`ErWh%3jfDSnF}eMHD;_L6Frj_4VO9!eq8S22-$&o7XV~ACybfocxxB#ia3b>;@{RhBsj&Hm zxWJe2hgWK7*2)4`HbFY4t*4`yoqaI+Joqd6(s>d7@rYg9199LJQ76AA@G@@e&d2Dq zy17K^`QDa}b9KG_Oi6eT6n0-Fu`gBJT=zm-dVlX*FS^Bj%;j8+^Zjb@VjZt%YO_ET zo&VxHq>G+NK;wx$rRq2MDZJsrhP4B;J#1e>Z{innX~mdM}Z zyu9;5^;Ga?Y{Bo~pnnnEGGbV&Akc!P?W3V5*<-bkd_j4n&_As9x<4**AnnpwqCK<1 zWv&21c|^cqdUy*7i~9<3a^K&#Yd~L_aLDlwtL{I-*;n0v`aki}KY$>qgBI42f(=Fg zY&_N%x`gkhLMY}scJ=KxM2A=1IBW(YZG#Y*|8X~4U=`vX@ejgRXx!LJG~c9 z;(XoXLmI=lt4hRmf5-6bfOVi5$VwfeA^}4pIuN(QREKdLY6w^C`1j`Wr%m`q;F&I< z$E(R}H5A)1?nQ^n06fiGFqj$u&cHnY<>fttyoY)p+mY9!b=yopB?fLwRU7*6Oj=Vc0xn71@q z;X#5#R6MVY$0sxvL-YHPO9S1{KS-nA?^-xW8oLtGGjm}vq%0vQ4>J~gxyjX?v`0}? zTAa^sl3oyHj}ZyanFb-sV=i#(h^JjRRG?3$h09{BNdM-r-F$Uxd}8E*!|YDUvLoJ{ z-hkFWTd31KLW>mkFFwxZ*I^Tyya%?2aS~Kbj3xa;8Xa3c(ugUzcrk6Ls?4cN@_s+E zv-=bLog&}IrIA?y8B_>)q@&Z6qHFe~te!PG|8D+b!AdmlnlG9hsyF(KO+3*QXZJ4H zSt)uu#G3tEL;8%plcE1~qM+86tv#CxLA?50>upV}ohH1)Hj8gP9M;z=+W$mh${+$* zkH}T9MvF2D^68K~RzT#%LtWe)A(Pl0sY++zOlG*)< zp5f$GE$5sRsDHc>olKcWujd;&Jy}5?6!$8asAX=7aQ5g2@pyFztw1&r0udv}`^wqb z*aL?(wPOEHq*lSxY_t3$H#=6%=O1*et-*!Rs2H3cZ}cv6nMrIyEmtwZ2lWoF{CKc} z(2dcay$vD{(pnNHEt!MR`W gaLEB + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Compiler.ICompileJobConsumer Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Compiler.ICompileJobConsumer, including all inherited members.

+ + +
LoadCompileJob(CompileJob job, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Compiler.ICompileJobConsumer
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_compile_job_consumer.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_compile_job_consumer.html new file mode 100644 index 0000000000..891fb23c66 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_compile_job_consumer.html @@ -0,0 +1,156 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Compiler.ICompileJobConsumer Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Compiler.ICompileJobConsumer Interface Reference
+
+
+ +

Sink for CompileJobs + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Compiler.ICompileJobConsumer:
+
+
+ + +IHostedService +IDisposable +Tgstation.Server.Host.Components.Compiler.DmbFactory + +
+ + + + + +

+Public Member Functions

Task LoadCompileJob (CompileJob job, CancellationToken cancellationToken)
 Load a new job into the ICompileJobConsumer More...
 
+

Detailed Description

+

Sink for CompileJobs

+ +

Definition at line 12 of file ICompileJobConsumer.cs.

+

Member Function Documentation

+ +

◆ LoadCompileJob()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Compiler.ICompileJobConsumer.LoadCompileJob (CompileJob job,
CancellationToken cancellationToken 
)
+
+ +

Load a new job into the ICompileJobConsumer

+
Parameters
+ + + +
jobThe CompileJob to load
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Compiler.DmbFactory.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_compile_job_consumer.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_compile_job_consumer.png new file mode 100644 index 0000000000000000000000000000000000000000..61d3ecdd338b53eca93a8f41551d9fd77f7bd264 GIT binary patch literal 2302 zcmbtWeN>WJ8dnT0Q@2iPZ<^W`shJ<)T7H!1Oe#ZdO6sZ!iXo2LT7D)vnnsOQ3Q=TI z)|fh_Ifmvb!!MF7WRZWOWiM@WcK_HpXV30E=e_Uq+~;@i``qXA zy?_lxo15C08Wo}5Mv#=j-{+o!#t(%tsQo5o@}b+&RK()`d(W;#Hz>o~(g+?nyh=%?WpHvO-Gz4{ z_6}5-CaaD~6Ep_zVUS3uAS&)Ufxal(?I99BKneC*>lma!6po5>$<1m*?asA9g;15r ze;U*9ig1@k#^$d8&5O^opr##!yYp=w?PSq_tmVSOs3i=Y^hr3bF-zz z5ms9JZwrLfl&uMtKvXR?G_G4iS)XG43Hh1*b>siUE-o!Cxe&nk-T-c@Js2B?t%)>q z#wHx(orc{Z22x-+7h_9jDuecgdYHM_#-`3FTbyc>g5zS0M+`2 zHV7MUf~hu;ayaFHB&7-tmDR7hSbyYn?QgKz2SR1Pv*xoFr$t5YA9+8qXUY=t@uMv! zz3_~{9q;;LR!}nC+y*Hx_%3x0NYT&V`Vq8u zPi~St!jp{#S%WXdU70FJ_RbI6@Z;Il6@UKw@=p|)(S7U5aFXC@|7;9?SHVMkmMnr@ zEUJpTDsh=w-ZDh@>B_Tx{$K=0ndi@oY17_EXcGCysKexB6H_y82o=YO-hSV0vBbt{ ztTipZ@-K5Qo}%xSAJbi?uegOMHGu_*1?oQZ(~k1{MK3l8CW}^K6U=gXF%=s8bNaLP zd*22y2a!@+c4H60Rd*e-eJU+c4=;%?&T?$W*Cn=P?XxwsgwCEqR$Cb52KxPQegzxtZ|)_U8hR=2%sln3qm7nvV?bc$elI38hIjhO%X-pn z#Byt^b}~>mm=Ay^X#JI+|jp(Q7Zx4zCIs%#CtS{og2DSPc?qy|EsxRR`>H*{BnSR9# z*NZr%sHH2rT*H`B-}LC}S$I|Ck7W#J2K?MWnJ17mADAQJd;6-&5cwcIYx7e1FY61o zhcMC>-W9V#tIOpfH3*O;b+?RPZAcUblwU^Jx)^KCyMN!;qLOR)YR|<7QSm)PoPhCw zWbd^r9j7`nUbk5%qL669PM?4`S+j4COgnktn1(0f#O7XXd+KqSLZxBJl9qch3Tm0* zet9Rv+={dJeVgm*e$BsgM1!9xU+Ri$b$vYb&}ZaKoI_@=e9yIH78~YoH#(Hf{IPO> zPw~WOZ4Xj$UyKb%#f;&Bn^O;ye(H98G=A$Gy}gCYL8F$~(BPcWEbX|mI=V&bKRfg| zf>FSj+60XB<~Y*&Eo!538!`%>a{)QNaCc#Zo=2e4jtbtN3Z^#ukrIk8LpkfZhVm2GNY#aW3>kH#pz)tiw4 zkxN1I)`AQPBm6+*nkYJ>7qJY=rkw~2h8??M!B0KYp&&+n%qc3>3zMrfC% zzVXx(xmbPQsRG9x2E8f8#n>zuw5IR%0HN2Rq^kONSV@aSXONQci;-aB%MS3fVt@$_ L4Ql=};mkh(Im%00 literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory-members.html new file mode 100644 index 0000000000..4b2bc1c201 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory-members.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Compiler.IDmbFactory Member List
+
+ + + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory.html new file mode 100644 index 0000000000..b852340359 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory.html @@ -0,0 +1,299 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Compiler.IDmbFactory Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Compiler.IDmbFactory Interface Reference
+
+
+ +

Factory for IDmbProviders + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Compiler.IDmbFactory:
+
+
+ + +Tgstation.Server.Host.Components.Compiler.DmbFactory + +
+ + + + + + + + + + + +

+Public Member Functions

IDmbProvider LockNextDmb (int lockCount)
 Gets the next IDmbProvider More...
 
Task< IDmbProviderFromCompileJob (CompileJob compileJob, CancellationToken cancellationToken)
 Gets a IDmbProvider for a given CompileJob More...
 
Task CleanUnusedCompileJobs (CompileJob exceptThisOne, CancellationToken cancellationToken)
 Deletes all compile jobs that are inactive in the Game folder exceptThisOne More...
 
+ + + + + + + +

+Properties

Task OnNewerDmb [get]
 Get a Task that completes when the result of a call to LockNextDmb will be different than the previous call if any More...
 
bool DmbAvailable [get]
 If LockNextDmb will succeed More...
 
+

Detailed Description

+

Factory for IDmbProviders

+ +

Definition at line 11 of file IDmbFactory.cs.

+

Member Function Documentation

+ +

◆ CleanUnusedCompileJobs()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Compiler.IDmbFactory.CleanUnusedCompileJobs (CompileJob exceptThisOne,
CancellationToken cancellationToken 
)
+
+ +

Deletes all compile jobs that are inactive in the Game folder exceptThisOne

+
Parameters
+ + + +
exceptThisOneAn optional compile job to not delete
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Compiler.DmbFactory.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.StartAsync().

+ +
+
+ +

◆ FromCompileJob()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<IDmbProvider> Tgstation.Server.Host.Components.Compiler.IDmbFactory.FromCompileJob (CompileJob compileJob,
CancellationToken cancellationToken 
)
+
+ +

Gets a IDmbProvider for a given CompileJob

+
Parameters
+ + + +
compileJobThe CompileJob to make the IDmbProvider for
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in a new IDmbProvider representing the CompileJob on success, null on failure
+ +

Implemented in Tgstation.Server.Host.Components.Compiler.DmbFactory.

+ +

Referenced by Tgstation.Server.Host.Components.ReattachInfoHandler.Load().

+ +
+
+ +

◆ LockNextDmb()

+ +
+
+ + + + + + + + +
IDmbProvider Tgstation.Server.Host.Components.Compiler.IDmbFactory.LockNextDmb (int lockCount)
+
+ +

Gets the next IDmbProvider

+
Parameters
+ + +
lockCountThe amount of locks to give the resulting IDmbProvider. It's IDisposable.Dispose must be called this many times to properly clean the job
+
+
+
Returns
A new IDmbProvider
+ +

Implemented in Tgstation.Server.Host.Components.Compiler.DmbFactory.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.LatestCompileJob().

+ +
+
+

Property Documentation

+ +

◆ DmbAvailable

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Compiler.IDmbFactory.DmbAvailable
+
+get
+
+ +

If LockNextDmb will succeed

+ +

Definition at line 22 of file IDmbFactory.cs.

+
22 { get; }
+

Referenced by Tgstation.Server.Host.Components.Instance.LatestCompileJob().

+ +
+
+ +

◆ OnNewerDmb

+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Components.Compiler.IDmbFactory.OnNewerDmb
+
+get
+
+ +

Get a Task that completes when the result of a call to LockNextDmb will be different than the previous call if any

+
Returns
A Task representing the running operation
+ +

Definition at line 17 of file IDmbFactory.cs.

+
17 { get; }
+
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..d5ce5cbdfd7c4c47c82dc4f8c0af78119171a150 GIT binary patch literal 1251 zcmeAS@N?(olHy`uVBq!ia0y~yUcC_(S`>#Dux@>t{BsOpO81JR28tSF#xQJm1gVPijMy07pIJEPc73-F3yZV<~ z{`{!iF!Nj~!|iqdYMmRh_g;>6{@h#B&v$?BUdb7vy?SoPJ^M5cEO`FIR;YSWz64Xu z?1CFoQ3A4Yp^F%r? zw)Mzsf!W5p??tyg+h_V+%{#jJ+V8sa+>6fDMdzoa&JbHL`R%URRU2L2f6qC2b^pn) zTg*&8pOvpD&wDFXsvh1Dm%XShcInVB(h&lrX^F2q7qIPn{DY-d_IP1UlZA?=s;8pYqDdkvRkS>Tu7)yp zbxgZHU*&St_m5ZhuGVksSIJy}%xDd@flx|N4v1-+z{IYz+TD=S92C#b1k} zzNd#zw|G7;`{&f$_ay~9O)D4PivD3X^WFF7JAd$=@0@q<=CVb|=`3RX(xh4TGqXFd zE1IR3?cL6kTRVGA_S(qnzj@bpntA8$m0RD<>X|wPn$CV9(pm0}=cNk3bap&UYqLqJi5tom4e9=?t76mM(l*=pE#Yo@+<7=9>vYy^D4e9zWPhL?N`+O*y)pBuDup7dhcr0 zbjf)yDt3EclGi>ny?)n9*^B#Ld0dKrrQ8v9JGp1xMIF!o?6pjR=~c77PMR`lNxVj< wSJ0A4D^y&yV2oFeUo85ROJ$A=F8MF0Q* literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dream_maker-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dream_maker-members.html new file mode 100644 index 0000000000..1311ef94e6 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dream_maker-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Compiler.IDreamMaker Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Compiler.IDreamMaker, including all inherited members.

+ + +
Compile(Models.RevisionInformation revisionInformation, Api.Models.DreamMaker dreamMakerSettings, uint apiValidateTimeout, IRepository repository, Action< int > progressReporter, TimeSpan? estimatedDuration, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Compiler.IDreamMaker
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dream_maker.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dream_maker.html new file mode 100644 index 0000000000..82e29a729d --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dream_maker.html @@ -0,0 +1,187 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Compiler.IDreamMaker Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Compiler.IDreamMaker Interface Reference
+
+
+ +

For managing the compiler + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Compiler.IDreamMaker:
+
+
+ + +Tgstation.Server.Host.Components.Compiler.DreamMaker + +
+ + + + + +

+Public Member Functions

Task< Models.CompileJobCompile (Models.RevisionInformation revisionInformation, Api.Models.DreamMaker dreamMakerSettings, uint apiValidateTimeout, IRepository repository, Action< int > progressReporter, TimeSpan? estimatedDuration, CancellationToken cancellationToken)
 Starts a compile More...
 
+

Detailed Description

+

For managing the compiler

+ +

Definition at line 11 of file IDreamMaker.cs.

+

Member Function Documentation

+ +

◆ Compile()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<Models.CompileJob> Tgstation.Server.Host.Components.Compiler.IDreamMaker.Compile (Models.RevisionInformation revisionInformation,
Api.Models.DreamMaker dreamMakerSettings,
uint apiValidateTimeout,
IRepository repository,
Action< int > progressReporter,
TimeSpan? estimatedDuration,
CancellationToken cancellationToken 
)
+
+ +

Starts a compile

+
Parameters
+ + + + + + + + +
revisionInformationThe Models.RevisionInformation being compiled from the repository
dreamMakerSettingsThe Api.Models.DreamMaker for the compile
apiValidateTimeoutThe time in seconds to wait while validating the API
repositoryThe IRepository to copy from
progressReporterThe Action<T1> to report compilation progress
estimatedDurationThe estimated amount of time the compile will take
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the partially populated Models.CompileJob for the operation. In particular, note the Models.CompileJob.RevisionInformation field will only have it's Api.Models.Internal.RevisionInformation.CommitSha field populated
+ +

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dream_maker.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dream_maker.png new file mode 100644 index 0000000000000000000000000000000000000000..353697dba8b9aef0a6c5ed252c30a316518b5162 GIT binary patch literal 1259 zcmeAS@N?(olHy`uVBq!ia0y~yUFz4Tg?w+Qb7mI=!iaZOl@jQzImk3A51?$zUX zpZa+$0-5pb8=kJXZ_cvA$f`C|16L>mm0ISav*0 z-)pvILDlibxw{Y6Pkxnr?D_ojo$>AEHMY_F_xW!&yRvKNbAjtmR(|WtyE{KVK1qJ} z`lsRBw%$ExDd6P1*X(E7o!idlMoBBat-CRA`L5~=?%vHa7~g&2ODOC5dgS+epIw(N zr&Y*3d3h%Et*-ON{BIYI+s<+0`DXWM!_zmuA%CR=uPUlFn4J!beHN$lF!6}@y1FLm zon|6GpCw-{H8Xg+Aj`>MlX#Hn8mmsx(CM$w+7|dau9@e($G_BSo`Py@(A-+-_jl|L zyx-Ss8fzQK^DSxBbjgGTiNZ|_rS{Fv`*rkat>o(0)uqN^?DwBV^!Apl3TFH8?VrN> zV}3xv zZ!Dj&JkcP<`LOxa{5Ct=FRFG1PU~F?ca_YOP{8`Rj+q z8it)9R+WS98itiX)=#Zv3^#!^P4O?!knOp*>)PzLfyf&wD^)x*wN_1%Uc-tXsJ+(PNT!-L-6I!K>D*-{0Z=_d7&>vfclhbAPS&KYo4l*Vo#pZ41Ax zdCy!sdHF5tU8VJPwVkzZ_Dzewd9957xdR99*ISpiuNOS5ReR2JYq{$&rd7M!x2<@o zlh$B;fO*E;q`8*1^HI}V_&!!?3tfpfwMP<9uok*}{qixU*yT-@qH zQVq91xHLw(tLF1U!Th@crXS6vql3Z8?dsish3b7zbAts|KNor*JhxBX!*hB__`b^X zf3I0bT)ryYYFy^{)rgtLB*)1h>&5LI+tq#=Npze2T3%_o z>{UkWolRf=HJwwOyw3PQt@COggQ~q2)2F{wS+Fbp*}qF)pa0Luoiyi8^~?Dom!CMj znvoROesDrB-+i0kiSHg|J3rq1R`^EdqW?2q$jDkKU42`-1en%5f2A$``N`beG*C8P z$@3RDvCUC^8Gk{4p_Zqr=dWVXP|s6gfm4^{z!|nH@@{XN3XI=RU*yHEx^29=xrhf? PGBJ3%`njxgN@xNAT7hiP literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider-members.html new file mode 100644 index 0000000000..c4fe8345dc --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider-members.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.IDmbProvider Member List
+
+ + + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.html new file mode 100644 index 0000000000..4152975e9c --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.html @@ -0,0 +1,264 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.IDmbProvider Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.IDmbProvider Interface Reference
+
+
+ +

Provides absolute paths to the latest compiled .dmbs + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.IDmbProvider:
+
+
+ + +IDisposable +Tgstation.Server.Host.Components.Compiler.DmbProvider +Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider + +
+ + + + + +

+Public Member Functions

void KeepAlive ()
 Disposing the IDmbProvider won't cause a cleanup of the working directory More...
 
+ + + + + + + + + + + + + +

+Properties

string DmbName [get]
 The file name of the .dmb More...
 
string PrimaryDirectory [get]
 The primary game directory with a trailing directory separator More...
 
string SecondaryDirectory [get]
 The secondary game directory with a trailing directory separator More...
 
CompileJob CompileJob [get]
 The CompileJob of the .dmb More...
 
+

Detailed Description

+

Provides absolute paths to the latest compiled .dmbs

+ +

Definition at line 9 of file IDmbProvider.cs.

+

Member Function Documentation

+ +

◆ KeepAlive()

+ +
+
+ + + + + + + +
void Tgstation.Server.Host.Components.IDmbProvider.KeepAlive ()
+
+ +

Disposing the IDmbProvider won't cause a cleanup of the working directory

+ +

Implemented in Tgstation.Server.Host.Components.Compiler.DmbProvider, and Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.

+ +
+
+

Property Documentation

+ +

◆ CompileJob

+ + + +

◆ DmbName

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.IDmbProvider.DmbName
+
+get
+
+ +

The file name of the .dmb

+ +

Definition at line 14 of file IDmbProvider.cs.

+
14 { get; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew().

+ +
+
+ +

◆ PrimaryDirectory

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.IDmbProvider.PrimaryDirectory
+
+get
+
+ +

The primary game directory with a trailing directory separator

+ +

Definition at line 19 of file IDmbProvider.cs.

+
19 { get; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew(), and Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.Reattach().

+ +
+
+ +

◆ SecondaryDirectory

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.IDmbProvider.SecondaryDirectory
+
+get
+
+ +

The secondary game directory with a trailing directory separator

+ +

Definition at line 24 of file IDmbProvider.cs.

+
24 { get; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew(), and Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.Reattach().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.png new file mode 100644 index 0000000000000000000000000000000000000000..aecedc6633f0bf076ccd8f7a1676c8421db20420 GIT binary patch literal 2278 zcmcImX;4#H7S2FJBLmVk1F{5zEpZD%BQPvI2r8h4B@-bJRKg|(7i{*OV2qZ40}b6_ z3CO;~3lISzvLiG}5s;{WG`kQWwjpehK-e-bc2`$TRnMQPnN#)Nz4zR6?mOq+?|kXLghsRIoa!kjTKFvv(MBW#=zqzXsdp2tP~Nia3x++Yv0olPxgZ<6L~7QZ-P%T3ux z9S_btAUjZXZ9sn)u^64-Z^;pAoFmU>rIjN46mV)9X&?pJg9W@DL3@gl4M09qg+d!C z0dmYz5ZPxaH7F=%f4V+x#hO8fP`Q6AXf{D#ECRc-c98%gT0~P+jrxnVQ^rv0<{sf& zV!OaBf!_aeZFu%=fvzL8nz#tm?iah2?8q{55mhKiVIWofTn0jJt)Jbfpw!7(>f`|`s-Ar2 z0Q}#L-{)kN-$4zTIQhcl;!DQ53{4Jdr1{DAyf*iCe5$Nu!+mh(j;W#2_p;2=-zFv0 zS7BS;R}2#9olO&+?FX97@ey%r;w_=F58%pZSN>F9#eKt6qSGJnq}#h6Y06Np#*yLE zeCttR9Dum3Knp2hyDspyD^aWbXbOtHGR4pdq|a`h}vk=#XpgDYG%UuhW@Y$@M^kjLJA;hK3-g)Ok z>bV0gmJg^dRJzcmE$U(RAwtb$b5c)QtmZ&_31CA_G1VH=T&TOJ1n;;2;W7FtipCPG zZ%x@h`+?A{*5AX$tcu12H)_}s)L5^iH`RG<&ipptrRQ~L?rkYbL0AQz{=)q1bSzk% z-|Y*pfV+Ws0g7sXa9dzD3lTwX88l4Fy(SOfJ#`%q1QgUe0hrBdqPcY(EqJQ3zHM#I zV`2H=76}*qHpCT*yrQap+zx>yly!xV)S#%x&9qw5Rg#+nK78_z3z!;>xt)}+?hXKC zFLo#{Iu<`&kUrG;OZy!D?>@anAEW#>;=NpJJokC-7!Pf_r^$1}_uzJfcES|{oh=6r z?V>A~d$G>Y-+~3obf)tN#?EYO(Gwa3XilHshUhT~DoL4taM5FqL)fp~)K0FN{PD^E zJ1nw)$BiOU_8Tk&TK&(UW%WCFNMTzk#W;dqJ}j+>94WLXi;DjntgjM1Az}AJ5_FDy z=JpZ8qfYYj#pJF;6HSdoc^TceH@%N&DI{M`Ba{D^lk5JJY+m%fa@&B=QX=zo0OH8R zUkUOwLozNFc+jGJ-9^AejHTtMy;B!9o+lr0m_iK`Os9_e1ETSjPiI& z4n+7*N1vVQlhzu4R?slf8<7tHn7Jn^(2^+gT92s7uqx+_-NqfW~_x8W1q7UQOz`({VSwFet; zVqbrf*4D^PM*d=N9<3~kLJ)@pdATf1|9LhhTV2@3b&0q|w917sh6AU*y5O;6i za__vqDWGrFr}n}{n&9rs#u@w`f6(}tUM6U%|AK{!_MfY_(J`%J_~e<1_&z#d$}QKx zY{JM#xv-9f;ocje?P0+vw-E-{JUOH>ZN)6?dLgYYFR-PZsL7ixwma8P5YK?SuNu8n zqAP^`+jK@fPk!?bP@9XUkT^q3qruW9+%MxNu4SmKh~qP295XiFWg#V*ou&4p`{dXT z-y*~$fQbbtN?irxK#QoLgXeze<9UDr-TIMrbbCrVQf&4+a;4Ybe}Z=#_}kr=;9bPF h + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.IEventConsumer Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.IEventConsumer, including all inherited members.

+ + +
HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)Tgstation.Server.Host.Components.IEventConsumer
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_event_consumer.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_event_consumer.html new file mode 100644 index 0000000000..80a4ac396b --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_event_consumer.html @@ -0,0 +1,167 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.IEventConsumer Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.IEventConsumer Interface Reference
+
+
+ +

Consumes EventTypes and takes the appropriate actions + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.IEventConsumer:
+
+
+ + +Tgstation.Server.Host.Components.EventConsumer +Tgstation.Server.Host.Components.StaticFiles.IConfiguration +Tgstation.Server.Host.Components.Watchdog.IWatchdog +Tgstation.Server.Host.Components.StaticFiles.Configuration +Tgstation.Server.Host.Components.Watchdog.WatchdogBase +Tgstation.Server.Host.Components.Watchdog.BasicWatchdog +Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog + +
+ + + + + +

+Public Member Functions

Task< bool > HandleEvent (EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
 Handle a given eventType More...
 
+

Detailed Description

+

Consumes EventTypes and takes the appropriate actions

+ +

Definition at line 10 of file IEventConsumer.cs.

+

Member Function Documentation

+ +

◆ HandleEvent()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<bool> Tgstation.Server.Host.Components.IEventConsumer.HandleEvent (EventType eventType,
IEnumerable< string > parameters,
CancellationToken cancellationToken 
)
+
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_event_consumer.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_event_consumer.png new file mode 100644 index 0000000000000000000000000000000000000000..07a277744734659b2b894aa4b767d29c71fd6375 GIT binary patch literal 4960 zcmdUzc~nzZx4@x@1ESR7LmLrl8vzGEF#?JZ6j4)z&_YF-;s``$&_WC(N^5y7joP53 zG6l6JtrV!BVK5MeNBClpDGZH)1Pu^nNPs{_lDu<4`}M82*8Agiy|v!EYu)U#@40vH zbI(5eclOP90sco4cGv6`K2%X1C78<(9!!m$l1tftqgVeU{IRz`##iL`zq9!i=VC-&AB)E;d~=gwQxE z(N%6+C2xmg@UnFSwCQAPN=~Zua#6?I`*K}B+E^J4^9G|=N5EKig7lO`exzMN6aH?x z+_yc;63hH3`NuIys8x#G`R+}HrAcXbnrwKk&MJ&Cq6_}l!(YKLYh!*)6ciMWOdIcz z4~lUK$l!#>H#+M=BeZ++U%Wj+b;IGCdbLD#sSD{In2`BnunuR%?b!Zq75OS*u*^ME@i3XEOtWps+V30`36a0J`I>rks3PMQJ3A=UM)UEMVrgxx>mi&+=YhBl z@{=7p%`SY02=Q%ZW@dgpgFBzhO|Xy%qSu#M+wC4Q|mjjGPQ_>w@YUkj(&EFRTTMd7~_Wil6>~m zo_As68?u@MjJp@SvhM%6NS+wZtS?;(MPGsZ;ePMc%uGqQKI`)*Feui4t~lFvY87oc3}shxANp-&0eQi)SEx{rr>Ofk{X=BZT}fxM(;{!{+IY zop=a8!&S@3JQ~)^p$*~3yE;VOy%n{UV>IeVh2MdjM4us__wp0Ne}${DaT@qX0V{Lh zCKq9L;1+ZY&yI67nM`}B8J6oM%RZ|BaG3O9&$N|`>`~HLKFtsuVZavb2t;~}+>xk@ zJq??+iG*NL0C_@n2xi#h;9M#HP+wYWjUr-#jZ%aTvkq~5%3DV7qL_LNz7CS}IQJxvqLXuc|p2MsFg> zX5cmVu*`XB21YG$$O>cdSJ3a&n6uPdCEnQ&86PD-KHpK5mcXoYPf##S9PA#urDQy? zO6KRfVmuC!2P8s-e!QIMa&Pcgr?aU^?ENHVLQUGg_ll*gdvN|V38B~S4WW-o)%jKR zu_aF7MQ~RHiQ+r?MYT^(?1rw`$D7H&wWW$!zhQ`F!n5>&e28Jx7o)b?sCabs6}fvo zKW8Vy>E~%GK__1^x%GLHnRZP^iKqKE#tq6Kc%@AuUok8ELBBbXJN>1LC~ch5!Ai%G z2Rac#$EW-c_B-4hFIP@-Wdo6|$)&3&)2GV?ilT=Mzk!kPzMSg2?CfvvW;8n4Y(Yuo zEeL&OIWZ}xx2I|vm-l*Rst`N>9dNNjgch?xADk*^r|YjH>XnN#R@uXNSRYb|Tla$U za=VSIZ(O+_($K>CO(*oq_nG}1uyMlnbX^h7g!2%^OuAS=Oy8 z?~B&^G0Iw^x>cJfcAQmy;@*mVa5)qMi`l(p{Y*H8vquyIN zbyDC>uR)8`cg^8wZIQ`E;`ofn3wefpg{dQ}wsQU$Hx%t8X*D^+ zkEnPLV31zY)1HH6ZGje*hJW(cr|9N%w}XK}i1| zEHMyqb5n~;58hg|QsI@86^K}>>lRESTzT$Jm9Wm) z_)EtUK?>$z=gWgef_`l2sj`y_$4dI8%o>P=kikz$srWOge7l<1gjQtLC{n6*UkdgI zmkgHK&<;sNoUV}VPrfI) zRpP@8$E@58B2*<-H2PP$%?&M9iDCY4G(8>k(#YgEm?WuPHoDfr6@w;E)Vh)k*B)XbZZyeoCW-LT^&_{qF7B_^uglIo6_)Jzl zt?YR>(d#<8LdxU|3Ol7e8?a0_@pHrpNvZWj-#Ciw0jfAr`SY34;C2ynOcsVGB)QAB zqZA8M>q%u(9BUCHw%v}tn$nons1u{lTIE6lz%yT|tzs&ox=u@0Opb6N64$wtN{9?p zrS=N>{J0*W7kr6(F;!)S85t)9>k4Dg4~woRgR)1@lKP5Ixl*spT^VT0)oVA>R|emE zYWB^Ai$b0<-)Nt5@U?BpuLR7EjPPVpy( zafj_VM}S4^H|+?aVlcj>pzIVvi5Hcxjpr%x+ti$T(d=vCH!gu9+Vl*cb&Ks90VY#( z7G~&u)W)jsOE5&jh|@3Cz9*3<$rCXP^XN&k$T|5GwN61f_%^ijIR7E{lFdS^K_VmKRs zm9J?`O^Jdb!@sPTH;AsB0_AC1F`AaNI_t-mgkQ|x^Cq7Mytt;0<$NYWhs|&~q3WdGcDtmv$&{Umd4p?i-dIVkvlI5os zW$8Qp?@1#2ebxK}NLMp`+hk**@Rxn>W!)#Cl52k*zueWE!74TtD#|v z+LQ|UhtK+V3J;Q77|i(+Z#xd#mK6F8&;1yAM;VcU3&a$9FJ#~qn9Q+la4vtiqHePx z%!FvQB-Q-(`Nz7j4+r8Et+b@O1Pj;N$ZG*(= z-gGaccym8?%SeP}@VC)J3-aDxnt58MTp?Z3n5>tV1oP5ZDyt)vD;%x07A{ckz#>je4DS`uqd7BnTDlL$h>BXzE~qhR8j!1$e-gd~o-^ONN+-i{xPq-UQ? z3A2@V3DXaaM+|rn_mRGYmD^Rj|B(S1?L`nYpX|I*W_@n=+uJkcW4$7o_nV=Yp;Jku{Q?&!%?m(eg;-PZ|_1y`O5oBg|dIM|L+!+ERfmvln= zt0o8pg_F+RLYX{r^+jGXE_%}v?$4pCF7e}s8zYNj{HhNSE0wRTT(;qqov4cG&tb^a zHI5>CuGzqR9*8LM?COQ}CBV+tej>`1yzPHA*`R*2h0`?MskM`Te9~%v>ez+bdg`{Ba+1j*D_ zUCKwj3*+2H3VvJwfX8yCEE5h35%FutVGImmCFGq6dAFu+Uv8~xsQR`(kL}Q8*g}d* z0spf!nhg4jtyX_J(%|$&Y+|EgcLwvSeN@Pwr(+ifj{Z3b + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.IInstance Member List
+
+ + + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html new file mode 100644 index 0000000000..7d6989bc21 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html @@ -0,0 +1,418 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.IInstance Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.IInstance Interface Reference
+
+
+ +

For interacting with the instance services + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.IInstance:
+
+
+ + +IHostedService +IDisposable +Tgstation.Server.Host.Components.Instance + +
+ + + + + + + + + + + + + + +

+Public Member Functions

CompileJob LatestCompileJob ()
 The latest staged CompileJob More...
 
void Rename (string newName)
 Rename the IInstance More...
 
Task SetAutoUpdateInterval (uint newInterval)
 Change the Api.Models.Instance.AutoUpdateInterval for the IInstance More...
 
Task CompileProcess (Job job, IDatabaseContext databaseContext, Action< int > progressReporter, CancellationToken cancellationToken)
 Run the compile job and insert it into the database. Meant to be called by a Core.IJobManager More...
 
+ + + + + + + + + + + + + + + + +

+Properties

IRepositoryManager RepositoryManager [get]
 The IRepositoryManager for the IInstance More...
 
IByondManager ByondManager [get]
 The IByondManager for the IInstance More...
 
IWatchdog Watchdog [get]
 The IWatchdog for the IInstance More...
 
IChat Chat [get]
 The IChat for the IInstance More...
 
IConfiguration Configuration [get]
 The IConfiguration for the IInstance More...
 
+

Detailed Description

+

For interacting with the instance services

+ +

Definition at line 17 of file IInstance.cs.

+

Member Function Documentation

+ +

◆ CompileProcess()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.IInstance.CompileProcess (Job job,
IDatabaseContext databaseContext,
Action< int > progressReporter,
CancellationToken cancellationToken 
)
+
+ +

Run the compile job and insert it into the database. Meant to be called by a Core.IJobManager

+
Parameters
+ + + + + +
jobThe running Job
databaseContextThe IDatabaseContext for the operation
progressReporterThe Action<T1> to report compilation progress
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Instance.

+ +

Referenced by Tgstation.Server.Host.Controllers.DreamMakerController.Create().

+ +
+
+ +

◆ LatestCompileJob()

+ +
+
+ + + + + + + +
CompileJob Tgstation.Server.Host.Components.IInstance.LatestCompileJob ()
+
+ +

The latest staged CompileJob

+
Returns
The latest CompileJob if it exists
+ +

Implemented in Tgstation.Server.Host.Components.Instance.

+ +
+
+ +

◆ Rename()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.Components.IInstance.Rename (string newName)
+
+ +

Rename the IInstance

+
Parameters
+ + +
newNameThe new name for the IInstance
+
+
+ +

Implemented in Tgstation.Server.Host.Components.Instance.

+ +
+
+ +

◆ SetAutoUpdateInterval()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.IInstance.SetAutoUpdateInterval (uint newInterval)
+
+ +

Change the Api.Models.Instance.AutoUpdateInterval for the IInstance

+
Parameters
+ + +
newIntervalThe new auto update inteval
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Instance.

+ +
+
+

Property Documentation

+ +

◆ ByondManager

+ +
+
+ + + + + +
+ + + + +
IByondManager Tgstation.Server.Host.Components.IInstance.ByondManager
+
+get
+
+ +

The IByondManager for the IInstance

+ +

Definition at line 27 of file IInstance.cs.

+
27 { get; }
+

Referenced by Tgstation.Server.Host.Controllers.ByondController.Update().

+ +
+
+ +

◆ Chat

+ +
+
+ + + + + +
+ + + + +
IChat Tgstation.Server.Host.Components.IInstance.Chat
+
+get
+
+ +

The IChat for the IInstance

+ +

Definition at line 37 of file IInstance.cs.

+
37 { get; }
+

Referenced by Tgstation.Server.Host.Controllers.ChatController.Create(), and Tgstation.Server.Host.Controllers.ChatController.Update().

+ +
+
+ +

◆ Configuration

+ + + +

◆ RepositoryManager

+ +
+
+ + + + + +
+ + + + +
IRepositoryManager Tgstation.Server.Host.Components.IInstance.RepositoryManager
+
+get
+
+
+ +

◆ Watchdog

+ + +
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.png new file mode 100644 index 0000000000000000000000000000000000000000..2109440ac97f03f9239f79307801cff960a8c4bb GIT binary patch literal 1824 zcmbW2Yfw{16vso5hoD3-R7D#E;v*Ch1T{i6LMU=EDpf%xflMVt3{tH|YTk@IyIGOgSb8WE`1>k;$C`1CQ>FXf2!t_y`i zli~q;WNCgBpoF6kCqt9okJy4jnO+SE_%tHdNIlpOsQ5O4ip^^0Aw7Hhj%Pr>RS9_0 z{O!3_v~OoN<{u*8x#=RAQZ>^n_wQx+RKjpVuS*~(-Mj$^fM7U?dlCzROtLirhV9sn zKm@q8odQXC8bA0@guFc?ZpaS=gD;FXX7T6Z_}h;)d#T>E4({{Ts(@J>q04e8fyQ`{r=+IduZ3S(<}tB#C9Pi; zrZ*nWpLo?16{?5f1s}Py$b1Cf$at}9XYOgNHca*GuQJ@uiymWaeHuY#+1mZr+WUnG z&|q3RT^@JPiq|Hy$l?$?GG4v4mWbUO`*&&crq`*&Y4t?=dCcMieiZH{Sm)dx1#PH! z-aS5vc8GTs?Q0%*D)IgNz}B*ZAUL1g9t>T$?{KEMS^fn$eVQKxsrWe@EBl1xIqK2# zo5WnVtTeMGcwxuYs-*nU=7QHtTA2OvXfWP=Z^3yaXnNcDPmn;KSixHYf`$0^!a2Fq za6KUaB7Xr&Ph#1%FlW9p^)!{d+6rRs|lJ%WQ&yqHr7W)^A%o z%ZYALfbdc$731KJw+cOtb#tbYvWm)yr_eR0kipa78#F?;ct~CoVq{nBMDTZ_;!RTV zWn2`qla2k6P0S$h1p>i$YGb2z&Qa4vr4V+Rn={}qyhJuKs&h2?@C_krB^-xeQ~>?yPLEaYUYSWkz37bkufP{H3_~lN{8A65Py(*uxj zZh-&uSO`c)#S3uXl0SllpGi$$AMciRdYxf4 z{iGRC`}&IK3FoZovnw;33ybCtn<_lZIoL;O7uErZS8(@8in}?>3B#k~=vCRy1>S6Q zJmtSXgfIUJ#gvR@%})Claei67$efKvkLTr=*e*j*ASwonqm3K@|Dy2PMIR2v|6u98 zBY)OKSMHyUA3{{AeT8`il208qSsz;gJ2WcNdJQX zJE5G`DZLJ7Cg;rEnGn$BWjIqEeU6$Wm)1vPF6T_>c)Llx^c&Kc3#~W|G3;R594D^r z<{Cnxm;wb0v!(SxyEk06N~a5scSdJCeMj24*qG%x81dbL8`6v$aymmjkjfRt1`~oh z!ykqj3vzVz@bR8=tc!W`r1aWd)S*AF7p9-jU$F4DbTX--x{97i(}H~~M%+58Gb5 zQtUP5M$x{;1umB7L8)XZNsJpWH;Nh}*-w8jyp9gEAYQ95kf!+;X(@{LNaG-+;RgR9 z4dZcFVf%*1>UKo%auD^F!SKZMb-&sW-1;ccHeMu1_dpnX!1$@UK?=i}>j7cYj=jDx z%&=vnvjZU{Es;|4BcgRCo`$dN`q@Qt)r^7G8*8WP_B?o6x(z93sE|NPz?IJuzy2Hg CLtoth literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_factory-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_factory-members.html new file mode 100644 index 0000000000..8a1f383404 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_factory-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.IInstanceFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.IInstanceFactory, including all inherited members.

+ + +
CreateInstance(Models.Instance metadata)Tgstation.Server.Host.Components.IInstanceFactory
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_factory.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_factory.html new file mode 100644 index 0000000000..fc45a892c3 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_factory.html @@ -0,0 +1,144 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.IInstanceFactory Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.IInstanceFactory Interface Reference
+
+
+ +

Factory for creating IInstances + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.IInstanceFactory:
+
+
+ + +IHostedService +Tgstation.Server.Host.Components.InstanceFactory + +
+ + + + + +

+Public Member Functions

IInstance CreateInstance (Models.Instance metadata)
 Create an IInstance More...
 
+

Detailed Description

+

Factory for creating IInstances

+ +

Definition at line 8 of file IInstanceFactory.cs.

+

Member Function Documentation

+ +

◆ CreateInstance()

+ +
+
+ + + + + + + + +
IInstance Tgstation.Server.Host.Components.IInstanceFactory.CreateInstance (Models.Instance metadata)
+
+ +

Create an IInstance

+
Parameters
+ + +
metadataThe Models.Instance
+
+
+
Returns
A new IInstance
+ +

Implemented in Tgstation.Server.Host.Components.InstanceFactory.

+ +

Referenced by Tgstation.Server.Host.Components.InstanceManager.OnlineInstance().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_factory.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..57542e8e4514e83cd79f12de45aecf7b2c84ab5a GIT binary patch literal 1530 zcmeAS@N?(olHy`uVBq!ia0y~yU^E1>J2;qu7U1?6P{aD{#MV+&RP3og|w&C&lMYM1#4^9Pk;L_BQ0ue zy*t1A?fKJwc_!=rTYP2pSKI*n9rcv`ftSy<^35F|)!+V*b&M`;SDVzYuur zYIShysoXQR)_G`An*t_IzIQwHd{~xzBHmT$jVS`Pr$`<2z$Ad;iXh z(e(VEe`$t_t4H!A5yf85pcWG~PeBxc?HhxYP_AWk@knM61PZnQxr)71M}PC34zRH5~@d1G;FotlBt> zy&>$@+uvDvWi^}$$L#nLP8ZhiS3V&6{Z`7N`z6-ge_p9>K6cFQoWy|xQT6(lvXdM8 z7{dQulQ`gT;70WK>qn=54gLFZ>(zDlUtdn_yz*|F+PYKHtNF9u|J%OO`AzQkjekyj z%bUNz_}ZG zS@$l+eX{!J>whQ7WT_j@mB_yPBa%n2XEW=I4cp%>v5{Of|9fP~=K8;l)pD-iwR5#s zMlak~Du1HW@bN;o%Cs}Q+20nfp0#G9naiCU3+ir6O%IIFTzl!syx`>AmYo|<$KG_k zrJK9|?fKr=cc=2N-zfk6P^GKz%*l0gawa`{*?(^1PDAsvC)e$Uz5}bm!89qSVt$`;>*V=U;ED+!AwBT58b?b%Q6T zriJCMdsEhEJ8_pT(}zSkH-@SJBPKD&3f<<=1H4~23@lE%F^*Rgmoq%ARQ z;K<}raFSx~m~f0iX-}{2=}ju9H|cz5s8G>wV0oYhlsxcy>M4eIlaDbl?P*$t}>YrctRp97KXd3FxK}tjW z_^aibre4zWePn5R?U1c$*-q`<9=osJefuXkdHU{8w}ArkeohkXbKaaf$+yz||4$t|Z+P}( zuSt#e{AJ-kqi6Qvl5j6z^a!IAKcMpH-Z4nATK$LpuxNESYZRL}u%Kq}boFyt=akR{ E0Dp+dPyhe` literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager-members.html new file mode 100644 index 0000000000..962834234e --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager-members.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.IInstanceManager Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.IInstanceManager, including all inherited members.

+ + + + + +
GetInstance(Models.Instance metadata)Tgstation.Server.Host.Components.IInstanceManager
MoveInstance(Models.Instance metadata, string newPath, CancellationToken cancellationToken)Tgstation.Server.Host.Components.IInstanceManager
OfflineInstance(Models.Instance metadata, User user, CancellationToken cancellationToken)Tgstation.Server.Host.Components.IInstanceManager
OnlineInstance(Models.Instance metadata, CancellationToken cancellationToken)Tgstation.Server.Host.Components.IInstanceManager
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.html new file mode 100644 index 0000000000..ab49f6ff83 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.html @@ -0,0 +1,284 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.IInstanceManager Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.IInstanceManager Interface Reference
+
+
+ +

For managing IInstances + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.IInstanceManager:
+
+
+ + +Tgstation.Server.Host.Components.InstanceManager + +
+ + + + + + + + + + + + + + +

+Public Member Functions

IInstance GetInstance (Models.Instance metadata)
 Get the IInstance associated with given metadata More...
 
Task OnlineInstance (Models.Instance metadata, CancellationToken cancellationToken)
 Online an IInstance More...
 
Task OfflineInstance (Models.Instance metadata, User user, CancellationToken cancellationToken)
 Offline an IInstance More...
 
Task MoveInstance (Models.Instance metadata, string newPath, CancellationToken cancellationToken)
 Move an IInstance More...
 
+

Detailed Description

+

For managing IInstances

+ +

Definition at line 10 of file IInstanceManager.cs.

+

Member Function Documentation

+ +

◆ GetInstance()

+ +
+
+ + + + + + + + +
IInstance Tgstation.Server.Host.Components.IInstanceManager.GetInstance (Models.Instance metadata)
+
+ +

Get the IInstance associated with given metadata

+
Parameters
+ + +
metadataThe Models.Instance of the desired IInstance
+
+
+
Returns
The IInstance associated with the given metadata
+ +

Implemented in Tgstation.Server.Host.Components.InstanceManager.

+ +

Referenced by Tgstation.Server.Host.Controllers.DreamDaemonController.Create(), Tgstation.Server.Host.Controllers.ChatController.Create(), Tgstation.Server.Host.Controllers.DreamMakerController.Create(), Tgstation.Server.Host.Controllers.RepositoryController.Create(), Tgstation.Server.Host.Controllers.ConfigurationController.Create(), Tgstation.Server.Host.Controllers.ChatController.Delete(), Tgstation.Server.Host.Controllers.DreamDaemonController.Delete(), Tgstation.Server.Host.Controllers.ConfigurationController.Delete(), Tgstation.Server.Host.Controllers.RepositoryController.Delete(), Tgstation.Server.Host.Controllers.ConfigurationController.Directory(), Tgstation.Server.Host.Controllers.ConfigurationController.File(), Tgstation.Server.Host.Controllers.DreamMakerController.Read(), Tgstation.Server.Host.Controllers.RepositoryController.Read(), Tgstation.Server.Host.Controllers.DreamDaemonController.ReadImpl(), Tgstation.Server.Host.Controllers.DreamDaemonController.Restart(), Tgstation.Server.Host.Controllers.ByondController.Update(), Tgstation.Server.Host.Controllers.ConfigurationController.Update(), Tgstation.Server.Host.Controllers.DreamDaemonController.Update(), Tgstation.Server.Host.Controllers.ChatController.Update(), and Tgstation.Server.Host.Controllers.RepositoryController.Update().

+ +
+
+ +

◆ MoveInstance()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.IInstanceManager.MoveInstance (Models.Instance metadata,
string newPath,
CancellationToken cancellationToken 
)
+
+ +

Move an IInstance

+
Parameters
+ + + + +
metadataThe Models.Instance of the desired IInstance
newPathThe new path of the IInstance. metadata will have this set on Api.Models.Instance.Path if the operation completes successfully
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.InstanceManager.

+ +
+
+ +

◆ OfflineInstance()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.IInstanceManager.OfflineInstance (Models.Instance metadata,
User user,
CancellationToken cancellationToken 
)
+
+ +

Offline an IInstance

+
Parameters
+ + + + +
metadataThe Models.Instance of the desired IInstance
userThe User performing the operation
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +
+
+ +

◆ OnlineInstance()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.IInstanceManager.OnlineInstance (Models.Instance metadata,
CancellationToken cancellationToken 
)
+
+ +

Online an IInstance

+
Parameters
+ + + +
metadataThe Models.Instance of the desired IInstance
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.InstanceManager.

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..c89cf79777406b15f0ffc82838e4ca25e2836cae GIT binary patch literal 1197 zcmeAS@N?(olHy`uVBq!ia0y~yV6*_T12~w0ragv!`^udzPL}Qo0n=zetH4OQ!?{EuB*2E7BlxKvdPDp+QK-!GV)cVF3%fKmcp_ zdaecA|NZ*2mCeSVDI)Vb^Nnlw_M5Zpc(zQJ>2Jcex_vM1hTO5a+{irR%d7wAo?7nU zZezIqPc&w&Ov8KA#%ie_zdxow4`qJ)@m;O$Zt-Y?t9Pn9UVnP=>kZNOqVj&74Eq~VIKS+;qu6GD=6AuBze||X??}z*E(^V_o_;4|#rE|#v+~8f$1k?O;>bFc#Iu0G z@A8Jfi=>Q89=w^!TEKl*d77(;@{W%W*ncdolRwQkapj|LT`W7A^90V!I+3-SX$gbh zlm`q=R*HTN%jpptoM z^?&R2&mZVXOnP$5zVY_rU-AcRbN~GPVf=MfG3@4R8}6@i*NiAoTc37VeEM9I zCq+!}N>=l6-kzI%Kv!SS{BO$Yx-~m4-z}VQ=*@+O-yygEY4pu4%r4M-a5T);`mvky z-rA{C?H{ju|1J3T{oK&%)!V99&b#vVk)-ym80%|6?~7U!^RCuitZ-I)y|B7(@%>eN zSEd|#vDc$$R@>X{S7zMf$Wzep+<%=nDYDI=QJTNb^ViZknbV4WJ0E>pG-ZkPi|Yqv z9!BJadU|}jU70m@K>Yl(f<;nGeGw=2`-L1el^!(4bkHg_?e`N1&VA;ap M>FVdQ&MBb@0D#Ify8r+H literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_context-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_context-members.html new file mode 100644 index 0000000000..e664ea43cb --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_context-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Interop.ICommContext Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Interop.ICommContext, including all inherited members.

+ + +
RegisterHandler(ICommHandler handler)Tgstation.Server.Host.Components.Interop.ICommContext
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_context.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_context.html new file mode 100644 index 0000000000..6762e7b2dd --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_context.html @@ -0,0 +1,143 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Interop.ICommContext Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Interop.ICommContext Interface Reference
+
+
+ +

Represents a registration of an interop session + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Interop.ICommContext:
+
+
+ + +IDisposable +Tgstation.Server.Host.Components.Interop.CommContext + +
+ + + + + +

+Public Member Functions

void RegisterHandler (ICommHandler handler)
 Register a handler with the ICommContext More...
 
+

Detailed Description

+

Represents a registration of an interop session

+ +

Definition at line 8 of file ICommContext.cs.

+

Member Function Documentation

+ +

◆ RegisterHandler()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.Components.Interop.ICommContext.RegisterHandler (ICommHandler handler)
+
+ +

Register a handler with the ICommContext

+
Parameters
+ + +
handlerThe ICommHandler to register
+
+
+ +

Implemented in Tgstation.Server.Host.Components.Interop.CommContext.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.SessionController().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_context.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_context.png new file mode 100644 index 0000000000000000000000000000000000000000..f4a233f0b81b5f3174e06d016eb24e324293d890 GIT binary patch literal 1534 zcmcJPX;4#F6vq=p5m`jj23aI7p@Je}C{M$x6dE2v214o>D6#|;1|DMAlmbJGf~Yb2 zM8fn@H#Qqlgb>0OngK-z2o%E-6ELV1%|JjTh(JpE?354v;J5b9+;h)==FFM@-1D1L z7(}I*tg~E)!C*{4KOY(fgAGLUb8A>z*~E2c zmX8`{8g7lV<>pir(E{u%hzG6^w}S*G0vDZy{Au_GdypZkB*vb!K%^qA7OAmSU2c-> z3ba+}UeEw#KU!E%5is`H+)d3~)>g~k^kq7GWdfq}(!27~ZdL`DP{`rY!9}KHBL9Bt zJDjDWk_grErFk{6RTRYKH274>VjzFs9{JVi&|!GF=+JoT4FuL0s*64PR2*He3f8!q z%OAq2=U3c(k9Nq$t@w&sF`9u?6h-^nzfQrlj`@M9Ox?*V$ z0(0FbH*PUf=s#%(uyv?(NW}e@^1_K)a-cM(GXCd{k$O%T^cOJ<*;fbf4ThJ`LV7X5 z&`_yj?|bRIEjQ#6 z)YiYjtZN6*S1_71!;>uexaTi0*f09{A1vBQVd|&6(Lp(9vtoyx`%i0EVlgWc?wpQuJKqie%EX@rJzTHmvF6`^Vf6CfyB)vh-I* zGkMfR;1cgg4`jAzko`bo!2^blnRkW(1@S83w3dbQZj;CtjDYnSna6L9eq>ATx#J?d zWU8u!*XLdjL`%UoJA)G23glcS^l=J|}-w8=w4b8tK@u zdOWwAMixBV&s*~$v6p{%zP(QP&0we8_)2ShN=b2}l*>iTU})%i1pjoSwB?+ft(1*) zInT`Hg=aJa>*s@yzseXIZ**Q(kBl@}I6#w{vK0Pw-0nTl$K@r{^u=Aw&YBUo&~Z&D zf099sARY0z#vK?+8V0&MHKX*iwgZ1?<|d*kl6`4|OzQ+HA%$+`{Y3Sc={RG$+q-XY z{4jO8-v6oc>gMj697QC*&k5FWvxJgnGEucIt0@p9!5YucZ>Hr{WOe=>n6Ln&%Nhgv LQhn}wNB;B|G$!M! literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_handler-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_handler-members.html new file mode 100644 index 0000000000..d2d4405de4 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_handler-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Interop.ICommHandler Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Interop.ICommHandler, including all inherited members.

+ + +
HandleInterop(CommCommand command, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Interop.ICommHandler
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_handler.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_handler.html new file mode 100644 index 0000000000..994ca68762 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_handler.html @@ -0,0 +1,152 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Interop.ICommHandler Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Interop.ICommHandler Interface Reference
+
+
+ +

Handles CommCommands + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Interop.ICommHandler:
+
+
+ + +Tgstation.Server.Host.Components.Watchdog.SessionController + +
+ + + + + +

+Public Member Functions

Task HandleInterop (CommCommand command, CancellationToken cancellationToken)
 Handle a command More...
 
+

Detailed Description

+

Handles CommCommands

+ +

Definition at line 9 of file ICommHandler.cs.

+

Member Function Documentation

+ +

◆ HandleInterop()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Interop.ICommHandler.HandleInterop (CommCommand command,
CancellationToken cancellationToken 
)
+
+ +

Handle a command

+
Parameters
+ + + +
commandThe CommCommand to handle
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.SessionController.

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_handler.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_handler.png new file mode 100644 index 0000000000000000000000000000000000000000..28fb74a5a9d992fb9e8725a8c7768834666b20f9 GIT binary patch literal 1280 zcmeAS@N?(olHy`uVBq!ia0y~yU@Qi*12~w0=^v+$t_ur%DQb8&bxIJ|(kYW>doU<6sIwL`#3N(hna|b5G}e~9ukRKA z*3IB{Yx&m6=l^|fW4L_ANZ9B=Oh0FM-toZoGZ{*w=YIZox|FH<4#V^){au6f6YkyZ8<&bgxh@kl-FXRWfK=ZIl1|sU;^(Uw)ty$ zlj3)-HA|iFn=fU8TEkV<&&vOHP1IOBYr^&wcE&%0MGMb;oO5HQNp<-yi%n9M@2ZYX zkbJjjQ?Pg*_tnnx_t+iQr_YcMKbq{ndC|NEx6hlh+`sO5^0RLzUuK_PHE(;HT4?da zA3c@T=XUE#@7|ks?^KYH_CL3?*LZ$AR=nd+-~0vLOO3AFyYxxmiT<^K zsl~>3j&F3o8Gly!hjB}?uWjkWvXJOi(lK!nlPw)qi+*OaJMjDK-Hm$`w|hT(oz3)M z_5a4oeOe6r9sjcyHwYXk*POxpLkkJNI%l(Vij(HjC#ntmS4ul@9Pm9Tb0Bnkv;+Hx z5CisttFo02>;*v9hcE&551~MsmiVfC+P>V|-_%QQZ_E8XIcf5e2`ZMFGrT9QZ`!Hy zQwz>8_Wy0~8LEBvcl_Dye-=iocq+fWeCuTT|4QdcKE|i*tRkCL+Op?)q#4-Exx*~8 zX3e>urw;KPPyS;WmiHg%uT^Pl&%kAeM6?w_x()OwN&r~CYTJ4v3U#;W?rymVfVEob_Fyk55C z(kjl%Zl6_YCoNNEl&ksfTHZa^l{4+?YUWMn)IaA+JWiQ(Ws6#i+5@MGp0{6&6XJZt z6yCDUsGT;YYU}ntHHK<>Ib6xpH~;s!dZPU7I|uO_sYYkNzL|cu*KdY@R`<=xkK@+N zl)qgQx2&f9%msytV)yuzd%1Cy=d_-czVJ8NesadGPpr>)J0(A-=4M9RoLy@qzjspE z&qdo}=6yancg>md>kqmrXP@agl76mI_R;cJKP`L?7X?IzecfYvCG6hoTSZ6rtbR~y zJO7x$VypWHr)POrUiqB;LBha)@5P_T=2wb&r=E~GUhMhxfl1q{irEkC`fN{K^gX+< zeD!RDG@#v=BwjMFGrznf@u9@Cv%Qm+d_S!!_Pizf+1trVp6{>pAOF + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Repository.ICredentialsProvider Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Repository.ICredentialsProvider, including all inherited members.

+ + +
GenerateHandler(string username, string password)Tgstation.Server.Host.Components.Repository.ICredentialsProvider
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_credentials_provider.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_credentials_provider.html new file mode 100644 index 0000000000..9771324dce --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_credentials_provider.html @@ -0,0 +1,154 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Repository.ICredentialsProvider Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Repository.ICredentialsProvider Interface Reference
+
+
+ +

For generating CredentialsHandlers + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Repository.ICredentialsProvider:
+
+
+ + +Tgstation.Server.Host.Components.Repository.CredentialsProvider + +
+ + + + + +

+Public Member Functions

CredentialsHandler GenerateHandler (string username, string password)
 Generate a CredentialsHandler from a given username and password More...
 
+

Detailed Description

+

For generating CredentialsHandlers

+ +

Definition at line 8 of file ICredentialsProvider.cs.

+

Member Function Documentation

+ +

◆ GenerateHandler()

+ +
+
+ + + + + + + + + + + + + + + + + + +
CredentialsHandler Tgstation.Server.Host.Components.Repository.ICredentialsProvider.GenerateHandler (string username,
string password 
)
+
+ +

Generate a CredentialsHandler from a given username and password

+
Parameters
+ + + +
usernameThe optional username to use in the CredentialsHandler
passwordThe optional password to use in the CredentialsHandler
+
+
+
Returns
A new CredentialsHandler
+ +

Implemented in Tgstation.Server.Host.Components.Repository.CredentialsProvider.

+ +

Referenced by Tgstation.Server.Host.Components.Repository.Repository.AddTestMerge(), and Tgstation.Server.Host.Components.Repository.RepositoryManager.CloneRepository().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_credentials_provider.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_credentials_provider.png new file mode 100644 index 0000000000000000000000000000000000000000..25432859fc69f9a7cf2044749f733f8b70976348 GIT binary patch literal 1402 zcmeAS@N?(olHy`uVBq!ia0y~yU~C7n12~w0|ze;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|z{=_A;uuoF_;&8=yf0cjuHt=HzSlo7 zp4*a;JlXTN=i`?XwacP8er((EXX(~!UTe2b(~@%FR0urEs1T2g=Q`JKZM^9A{bT%@ z)A~#uB|jKTtbc#!Wn4Bh)lsY=^K^_~GPiWznFynqIx;ec4~Cb@{keXCbHQynvjg6- z#XlMq515>OIBjk=pSHAMdxra7o`-zx?5EOo?yot!zP6%IcrZ z+>JAC)U=9rviV$!{mi5r6T!Ff^i}!dId|B;=q>+n?fJuX>31#fw-@|eWo5`7dN*#j zXgl*qkNxr`wjy)bOFQb%9Aq^8KIxO(+_Mv!qwEVew54rc=AyRrrt6GD-h9))Ukb6G z-S+8aeA4bekK(E-<*ucd8>XH*m2)Dn^@EK?%<5G)zD}2kDXsfxcO-Lm%Hql8AMJKj z*Y5I;zt6Y7PF{vxeqX)(qg6iBpFB}A+VaF;-sgW8Y}n5z=U;h$s8DrP^`-Y05?yz` z*#0VF>7-e0wKCOHZgtN~I&AD+bEH_OEc40E{+Fw6_SVMC{Pp#k>j#-Lg)Bc<{wC{` zPhY;=rg+Bvga)6z?ap<_-r0O9X8FKa#of+-!eZBS1}}#9!G#Pb!jbUxX6Nj+Q=_tV zgBj{$;~7*NLPXgcN@{CGIT~_6EL#H+j)oK<%Re9xRVT73)M8)%-*k9e?rr(&*FmKC z><$l47nQ)HjxH+kXoPzEw*MU+S&M)F$p3ZCeut})(!_6>pPy{5zdxa4M%pyi$c_$R zqSa$AOg`4*nVk4nf^Yw;&kxjD>Rep5KmW1!7dXud8lElMk@`I8&?$!_insjq|K5M{ zVZqP8=gqIE-~4>t?$@8ce_nk%c+Xz#mg4D!^)IgJeth?6M)i+P^Ge@y6s&XJlJLH! zpZB`eqs-SUJ?;MPR9XJ4EHZs_N+zo=0@`zq|{h7j|>I=K) z9EzUPzB{ks_@~?==AL)(-)AOgT6aGysMOzU!~c5o?iog@so$RLSn;>AU`?3n zM)l8=nv1{f{;ueETSfYgcli6}-Pf1D{_>UeRl$3s=5mf~@w&iN)-rkn_%Kq@vfSWSujyHe>C4;A{pUXO@geCxG;ji%k literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository-members.html new file mode 100644 index 0000000000..dec1428aed --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository-members.html @@ -0,0 +1,101 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Repository.IRepository Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Repository.IRepository, including all inherited members.

+ + + + + + + + + + + + + + + + + +
AddTestMerge(TestMergeParameters testMergeParameters, string committerName, string committerEmail, string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.IRepository
CheckoutObject(string committish, Action< int > progressReporter, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.IRepository
CopyTo(string path, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.IRepository
FetchOrigin(string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.IRepository
GitHubOwnerTgstation.Server.Host.Components.Repository.IRepository
GitHubRepoNameTgstation.Server.Host.Components.Repository.IRepository
HeadTgstation.Server.Host.Components.Repository.IRepository
IsGitHubRepositoryTgstation.Server.Host.Components.Repository.IRepository
IsSha(string committish, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.IRepository
MergeOrigin(string committerName, string committerEmail, Action< int > progressReporter, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.IRepository
OriginTgstation.Server.Host.Components.Repository.IRepository
ReferenceTgstation.Server.Host.Components.Repository.IRepository
ResetToOrigin(Action< int > progressReporter, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.IRepository
ResetToSha(string sha, Action< int > progressReporter, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.IRepository
Sychronize(string username, string password, string committerName, string committerEmail, Action< int > progressReporter, bool synchronizeTrackedBranch, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.IRepository
TrackingTgstation.Server.Host.Components.Repository.IRepository
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html new file mode 100644 index 0000000000..a8ee087164 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html @@ -0,0 +1,823 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Repository.IRepository Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Repository.IRepository Interface Reference
+
+
+ +

Represents an on-disk git repository + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Repository.IRepository:
+
+
+ + +IDisposable +Tgstation.Server.Host.Components.Repository.Repository + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Task< bool > IsSha (string committish, CancellationToken cancellationToken)
 Checks if a given committish is a sha More...
 
Task CheckoutObject (string committish, Action< int > progressReporter, CancellationToken cancellationToken)
 Checks out a given committish More...
 
Task< bool?> AddTestMerge (TestMergeParameters testMergeParameters, string committerName, string committerEmail, string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)
 Attempt to merge a GitHub pull request into HEAD More...
 
Task FetchOrigin (string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)
 Fetch commits from the origin repository More...
 
Task ResetToOrigin (Action< int > progressReporter, CancellationToken cancellationToken)
 Requires the current HEAD to be a tracked reference. Hard resets the reference to what it tracks on the origin repository More...
 
Task ResetToSha (string sha, Action< int > progressReporter, CancellationToken cancellationToken)
 Requires the current HEAD to be a reference. Hard resets the reference to the given sha More...
 
Task< bool?> MergeOrigin (string committerName, string committerEmail, Action< int > progressReporter, CancellationToken cancellationToken)
 Requires the current HEAD to be a tracked reference. Merges the reference to what it tracks on the origin repository More...
 
Task< bool > Sychronize (string username, string password, string committerName, string committerEmail, Action< int > progressReporter, bool synchronizeTrackedBranch, CancellationToken cancellationToken)
 Runs the synchronize event script and attempts to push any changes made to the IRepository if on a tracked branch More...
 
Task CopyTo (string path, CancellationToken cancellationToken)
 Copies the current working directory to a given path More...
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Properties

bool IsGitHubRepository [get]
 If the IRepository was cloned from GitHub.com More...
 
string GitHubOwner [get]
 The Octokit.Repository.Owner if this IsGitHubRepository More...
 
string GitHubRepoName [get]
 The Octokit.Repository.Name if this IsGitHubRepository More...
 
bool Tracking [get]
 If Reference tracks an upstream branch More...
 
string Head [get]
 The SHA of the IRepository HEAD More...
 
string Reference [get]
 The current reference the IRepository HEAD is using. This can be a branch or tag More...
 
string Origin [get]
 The current origin remote the IRepository is using More...
 
+

Detailed Description

+

Represents an on-disk git repository

+ +

Definition at line 11 of file IRepository.cs.

+

Member Function Documentation

+ +

◆ AddTestMerge()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<bool?> Tgstation.Server.Host.Components.Repository.IRepository.AddTestMerge (TestMergeParameters testMergeParameters,
string committerName,
string committerEmail,
string username,
string password,
Action< int > progressReporter,
CancellationToken cancellationToken 
)
+
+ +

Attempt to merge a GitHub pull request into HEAD

+
Parameters
+ + + + + + + + +
testMergeParametersThe TestMergeParameters of the pull request
committerNameThe name of the merge committer
committerEmailThe e-mail of the merge committer
usernameThe username to fetch from the origin repository
passwordThe password to fetch from the origin repository
progressReporterAction<T1> to report 0-100 int progress of the operation
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in a Nullable<T> bool representing the merge result that is true after a fast forward or up to date, false on a non-fast-forward, null on a conflict
+ +

Implemented in Tgstation.Server.Host.Components.Repository.Repository.

+ +
+
+ +

◆ CheckoutObject()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Repository.IRepository.CheckoutObject (string committish,
Action< int > progressReporter,
CancellationToken cancellationToken 
)
+
+ +

Checks out a given committish

+
Parameters
+ + + + +
committishThe sha or reference to checkout
progressReporterAction<T1> to report 0-100 int progress of the operation
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Repository.Repository.

+ +
+
+ +

◆ CopyTo()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Repository.IRepository.CopyTo (string path,
CancellationToken cancellationToken 
)
+
+ +

Copies the current working directory to a given path

+
Parameters
+ + + +
pathThe path to copy repository contents to
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Repository.Repository.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DreamMaker.RunCompileJob().

+ +
+
+ +

◆ FetchOrigin()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Repository.IRepository.FetchOrigin (string username,
string password,
Action< int > progressReporter,
CancellationToken cancellationToken 
)
+
+ +

Fetch commits from the origin repository

+
Parameters
+ + + + + +
usernameThe username to fetch from the origin repository
passwordThe password to fetch from the origin repository
progressReporterAction<T1> to report 0-100 int progress of the operation
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Repository.Repository.

+ +
+
+ +

◆ IsSha()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<bool> Tgstation.Server.Host.Components.Repository.IRepository.IsSha (string committish,
CancellationToken cancellationToken 
)
+
+ +

Checks if a given committish is a sha

+
Parameters
+ + + +
committishThe git object to check
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in true if committish is a sha, false otherwise
+ +

Implemented in Tgstation.Server.Host.Components.Repository.Repository.

+ +
+
+ +

◆ MergeOrigin()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<bool?> Tgstation.Server.Host.Components.Repository.IRepository.MergeOrigin (string committerName,
string committerEmail,
Action< int > progressReporter,
CancellationToken cancellationToken 
)
+
+ +

Requires the current HEAD to be a tracked reference. Merges the reference to what it tracks on the origin repository

+
Parameters
+ + + + + +
committerNameThe name of the merge committer
committerEmailThe e-mail of the merge committer
progressReporterAction<T1> to report 0-100 int progress of the operation
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in a Nullable<T> bool representing the merge result that is true after a fast forward, false on a merge or up to date, null on a conflict
+ +

Implemented in Tgstation.Server.Host.Components.Repository.Repository.

+ +
+
+ +

◆ ResetToOrigin()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Repository.IRepository.ResetToOrigin (Action< int > progressReporter,
CancellationToken cancellationToken 
)
+
+ +

Requires the current HEAD to be a tracked reference. Hard resets the reference to what it tracks on the origin repository

+
Parameters
+ + + +
progressReporterAction<T1> to report 0-100 int progress of the operation
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the SHA of the new HEAD
+ +

Implemented in Tgstation.Server.Host.Components.Repository.Repository.

+ +
+
+ +

◆ ResetToSha()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Repository.IRepository.ResetToSha (string sha,
Action< int > progressReporter,
CancellationToken cancellationToken 
)
+
+ +

Requires the current HEAD to be a reference. Hard resets the reference to the given sha

+
Parameters
+ + + + +
shaThe sha hash to reset to
progressReporterAction<T1> to report 0-100 int progress of the operation
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the SHA of the new HEAD
+ +

Implemented in Tgstation.Server.Host.Components.Repository.Repository.

+ +
+
+ +

◆ Sychronize()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<bool> Tgstation.Server.Host.Components.Repository.IRepository.Sychronize (string username,
string password,
string committerName,
string committerEmail,
Action< int > progressReporter,
bool synchronizeTrackedBranch,
CancellationToken cancellationToken 
)
+
+ +

Runs the synchronize event script and attempts to push any changes made to the IRepository if on a tracked branch

+
Parameters
+ + + + + + + + +
usernameThe username to fetch from the origin repository
passwordThe password to fetch from the origin repository
committerNameThe name of the potential committer
committerEmailThe e-mail of the potential committer
progressReporterAction<T1> to report 0-100 int progress of the operation
synchronizeTrackedBranchIf the synchronizations should be made to the tracked reference as opposed to a temporary branch
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in true if commits were pushed to the tracked origin reference, false otherwise
+ +

Implemented in Tgstation.Server.Host.Components.Repository.Repository.

+ +
+
+

Property Documentation

+ +

◆ GitHubOwner

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Repository.IRepository.GitHubOwner
+
+get
+
+ +

The Octokit.Repository.Owner if this IsGitHubRepository

+ +

Definition at line 21 of file IRepository.cs.

+
21 { get; }
+
+
+ +

◆ GitHubRepoName

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Repository.IRepository.GitHubRepoName
+
+get
+
+ +

The Octokit.Repository.Name if this IsGitHubRepository

+ +

Definition at line 26 of file IRepository.cs.

+
26 { get; }
+
+
+ +

◆ Head

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Repository.IRepository.Head
+
+get
+
+ +

The SHA of the IRepository HEAD

+ +

Definition at line 36 of file IRepository.cs.

+
36 { get; }
+

Referenced by Tgstation.Server.Host.Components.Repository.Repository.AddTestMerge().

+ +
+
+ +

◆ IsGitHubRepository

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Repository.IRepository.IsGitHubRepository
+
+get
+
+ +

If the IRepository was cloned from GitHub.com

+ +

Definition at line 16 of file IRepository.cs.

+
16 { get; }
+
+
+ +

◆ Origin

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Repository.IRepository.Origin
+
+get
+
+ +

The current origin remote the IRepository is using

+ +

Definition at line 46 of file IRepository.cs.

+
46 { get; }
+

Referenced by Tgstation.Server.Host.Components.Compiler.DreamMaker.RunCompileJob().

+ +
+
+ +

◆ Reference

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Components.Repository.IRepository.Reference
+
+get
+
+ +

The current reference the IRepository HEAD is using. This can be a branch or tag

+ +

Definition at line 41 of file IRepository.cs.

+
41 { get; }
+
+
+ +

◆ Tracking

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Repository.IRepository.Tracking
+
+get
+
+ +

If Reference tracks an upstream branch

+ +

Definition at line 31 of file IRepository.cs.

+
31 { get; }
+
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9e32d60354c42b60df3cb1a8591485fcb82f44 GIT binary patch literal 1535 zcmcJPdr;C@6vuyBTI>3t_ohQ=D+-ZYrrG++G++EOR3gnx(Mk=o%p@#_khJkJo4S!; z;)BYNP{Y(U6Ec`>wR|g$`Jlqpj4;t2;G-1wSF_t6&Fo)0duPr)=ic+3Gw05H?#T(l z`I#7*8vy`dg7x>t1Arc6K=$$_(4IbY#S(Hq1O*U$bUGarzMj;a$^ZRVDEeX&iNql1 z83H;kC*yJZ07&$C^|uqY0f0ds*4vYCR!>zLT~}@iGc3-pe5QL`?7hOU*V?6F3!feF z(Pu?wt={~eZs%prib;bohCcSaRRPGrTqiINeaB_I1W`=u&QTrsYwr4@2g>vtYx(=HEA?-#OEAhu!9ucg|0(Vckvw`$K1 zN6fSE*x{JCF$(M2R?vZ9u z2g+DC3oqiar;(rgk_!k7+NGdPSi#q;&#g9Lx||i3ijq=b&g3MZM_+e+wd9J-u0;Rm zm7tzmlZ6Qnpk2fRab74o21+r5j7C6|!6{^c{yj(ly%d1z0ij;#|C$z;J8}!s3-IsL zm%@NK*f+I(NY2&tgA=O7cmZv4>DD9gWyd-wI+~?q^^+6t*V56VY5ayr(_o^JB&tB) z*zJvcUsAO?V;3DAq6|;UV@8_xp_>DH$42b~d)kJzn;Uw>J-mk-F@LgbD%v;MnSo^2 zb1~TsDi;>KsX2VrB(vLP^NxI>3%NLnrzS72BJZuSvyLa37px!LhGNIZa@$dGFE)QD z^FVB^O)`1FU|0q4(dS!Br5~&ex!XM*I#E@Z+4Q`br_|dinRh_N?y1GAJ}+z>wZ=OW z*j!h_O|Vb4 zTFNz6{bAQ7s;RBEGz)%6QOnWpZWTP>nvF`3+F4#UH@#s%_KRjc(JY#ISME!%89DsZ zG{xiCY*Kb4DNPM5Aa#Dq;QIXC##Q8qPCzb63r-!J7=zX4n!$jQjo&aZ1?~gU{%E8v zK+CY$1&sKh4Boz^e9r^&AVLDCd>^9e2neAf*#Cvl-+Z=Dqada^Bdp|ZG4L-R(}_!( zx8gL+97!Ybne;)g?UE{OnUPZ}fn2*#+yO z!^{V36uXoyS_kf|bLt_tiV0_;jKiIopPeTkINGr|+#3?c9rw&RX=W5BYmaa9ONqGl z+!P-Va%%l_O;UCgydpn=#k}b#eZj8Lbi+cF)W^+;`p2@1tsKvsy&vLr=efDJZbSzv zU5d9~sarK%*|zESZmNKM)uR4gabKKkY~>$Sx(m{WxgK)cuEkrYZ>Ud=i4SoY;AP^GX8skE5e0?vk)zV>)N$5`zzUGK%WZdwT<+nE2%sBwX#q9mgvnKFvFD$B0W T@Qj?GX$@d~aNYv1sPw-836 + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Repository.IRepositoryManager Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Repository.IRepositoryManager, including all inherited members.

+ + + + + + +
CloneInProgressTgstation.Server.Host.Components.Repository.IRepositoryManager
CloneRepository(Uri url, string initialBranch, string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.IRepositoryManager
DeleteRepository(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.IRepositoryManager
InUseTgstation.Server.Host.Components.Repository.IRepositoryManager
LoadRepository(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Repository.IRepositoryManager
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository_manager.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository_manager.html new file mode 100644 index 0000000000..784f39e054 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository_manager.html @@ -0,0 +1,310 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Repository.IRepositoryManager Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Repository.IRepositoryManager Interface Reference
+
+
+ +

Factory for creating and loading IRepositorys + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Repository.IRepositoryManager:
+
+
+ + +IDisposable +Tgstation.Server.Host.Components.Repository.RepositoryManager + +
+ + + + + + + + + + + +

+Public Member Functions

Task< IRepositoryLoadRepository (CancellationToken cancellationToken)
 Attempt to load the IRepository from the default location More...
 
Task< IRepositoryCloneRepository (Uri url, string initialBranch, string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)
 Clone the repository at url More...
 
Task DeleteRepository (CancellationToken cancellationToken)
 Delete the current repository More...
 
+ + + + + + + +

+Properties

bool InUse [get]
 If something is holding a lock on the repository More...
 
bool CloneInProgress [get]
 If a CloneRepository(Uri, string, string, string, Action<int>, CancellationToken) operation is in progress More...
 
+

Detailed Description

+

Factory for creating and loading IRepositorys

+ +

Definition at line 10 of file IRepositoryManager.cs.

+

Member Function Documentation

+ +

◆ CloneRepository()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<IRepository> Tgstation.Server.Host.Components.Repository.IRepositoryManager.CloneRepository (Uri url,
string initialBranch,
string username,
string password,
Action< int > progressReporter,
CancellationToken cancellationToken 
)
+
+ +

Clone the repository at url

+
Parameters
+ + + + + + + +
urlThe Uri of the remote repository to clone
initialBranchThe branch to clone
usernameThe username to clone from url
passwordThe password to clone from url
progressReporterA function to report 0-100 progress of the clone
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
The newly cloned IRepository, null if one already exists
+ +

Implemented in Tgstation.Server.Host.Components.Repository.RepositoryManager.

+ +
+
+ +

◆ DeleteRepository()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.Repository.IRepositoryManager.DeleteRepository (CancellationToken cancellationToken)
+
+ +

Delete the current repository

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Repository.RepositoryManager.

+ +
+
+ +

◆ LoadRepository()

+ +
+
+ + + + + + + + +
Task<IRepository> Tgstation.Server.Host.Components.Repository.IRepositoryManager.LoadRepository (CancellationToken cancellationToken)
+
+ +

Attempt to load the IRepository from the default location

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
The loaded IRepository if it exists, null otherwise
+ +

Implemented in Tgstation.Server.Host.Components.Repository.RepositoryManager.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.Invoke(), and Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.Invoke().

+ +
+
+

Property Documentation

+ +

◆ CloneInProgress

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Repository.IRepositoryManager.CloneInProgress
+
+get
+
+ +

If a CloneRepository(Uri, string, string, string, Action<int>, CancellationToken) operation is in progress

+ +

Definition at line 20 of file IRepositoryManager.cs.

+
20 { get; }
+
+
+ +

◆ InUse

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Repository.IRepositoryManager.InUse
+
+get
+
+ +

If something is holding a lock on the repository

+ +

Definition at line 15 of file IRepositoryManager.cs.

+
15 { get; }
+
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository_manager.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..9844cc94fd09ee03bb453163cf26e5c33ee090bc GIT binary patch literal 1698 zcmb`Ido6ODdv5?u^SXk;^m<60vH8 z$YsW5U4}uWA@?QIxa88fXWSCj%#Paj?Doh0v-_U&zR&kP&vVZEyyyKq&l_uLZn#5Y zj|2b!J1|BDSO5?L1^TAAh+x%|+a@hA-&mSjo#ylT0y#Om;+ND&6sV7r!C;8S4!{Ik zabK+Y89)%UHF{gDGyy>DFvj4dRe;dkeGk%@;@4tqn6(dI*;{6BRDiCO#pyBix$Zmq z`cCB$^%OFeh&4_m!qtdyRAVGOP! zOS$IuO_A_T9Tu9m*uSfF{p#?68N+-}y(bREZ${&w71Z#a2iRE)yBqLLyv8M^`YBG6 zuOx)DoNj6kzcaCEK!q;mXkfxqP3$kA8Ypd^J2C6Dvn`Qykx@q?W&S6adT(qQ3_W95 zbexwOH7&s&k%7YV$M(l0z<)S^Fe0JwCrPzcMWUGXbK(%vxS1^x?)_Kd=^z;^fi-4I z5pFGsNCUbuP#|M%ZTk+OE?N|D_mV-25Dwvm7+F_>QQW#t4>LZab@$C+<&0m{-&aphcWh6_X$?YTY_ntcpX z39KSlb(3tI`Lv1?ycD}>o1-zfn!731G%=Za8MsB4`H)y3~ciCX9=JM z+Eu}@DW+-)L3Y$j8`JplQh8VX}xqV=4MNzAB!HL zgK~jbd--tAL#vY~a(*+5qFX)+7)IyzWEl0%J`6o-ir40u-b6II78S2l?Z)XIzkP3( z6>|{z^bN1PNy?m(8;q~>R&}_St6A*AMEmTg?|ne!ddjm0Lard=VXq5)%4Q_rf$zTa zGVhvD?QULe%m)2W?aOqH3dTEUpB-I$9eCt!!C=YoX7IELrQ6k!6>8*1(~fwodimal zUtxhK_E-PXR;^R(yRsy^G^p2Tk2>MkT(eJ12=TsBeYH5vjS8!m7S3z=#l<6=9w>Bt zEfIX^RWChyF{p-KGPjFR&#*!4d%q4!Tl9Q?>^2}w@ZR|aQ7A|&712ON+=2n}6Watd zz!8A%(vs{RAVdIO`v5#z46qTPr#Axp59s|H*Zc;wv6@4A78zTu1II|fnF*gOUFCCS zvD6VWdKhc9UUns?^7m6HBhrtBgRk3zH&^sYriYuvER>k!DO!d?7H&8!F$lRFl^}|l z4k)YFnJEQP!WhkG_5o_`5uofCDs;Zyj1J=BH&TQ1nsKFkI~**$)nKKdwy!d=f@%Lk zZ+x=PKht@prp?X0$b&7+MkIcQbAh?Ah2}|TF=&O8U)KZdW69_Iy7xgZhFlT8N(pVD zaehp~)`DGgmmvN*v_&g9xxDLT>!FKN`2`$KnkimAJ~t!u?h`9y z9)FU0AvN%Ph+9MTtYf_jsP!k8I?Zkif!cmOPDrxaP-W-T5ml`A#)Wf|v=4j7XySJ& z>iSeTjK-1JBSQ>pdIxVyF8d;1uFg?RmaI4l2*c&Hg=Ekj*FOYi4MKWc%G!d)17m9(0h8>(l5_mOFLiK0)cGx$fV+ + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.StaticFiles.IConfiguration Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.StaticFiles.IConfiguration, including all inherited members.

+ + + + + + + + + +
CopyDMFilesTo(string dmeFile, string destination, CancellationToken cancellationToken)Tgstation.Server.Host.Components.StaticFiles.IConfiguration
CreateDirectory(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)Tgstation.Server.Host.Components.StaticFiles.IConfiguration
DeleteDirectory(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)Tgstation.Server.Host.Components.StaticFiles.IConfiguration
HandleEvent(EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)Tgstation.Server.Host.Components.IEventConsumer
ListDirectory(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)Tgstation.Server.Host.Components.StaticFiles.IConfiguration
Read(string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)Tgstation.Server.Host.Components.StaticFiles.IConfiguration
SymlinkStaticFilesTo(string destination, CancellationToken cancellationToken)Tgstation.Server.Host.Components.StaticFiles.IConfiguration
Write(string configurationRelativePath, ISystemIdentity systemIdentity, byte[] data, string previousHash, CancellationToken cancellationToken)Tgstation.Server.Host.Components.StaticFiles.IConfiguration
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.html new file mode 100644 index 0000000000..a62aa44442 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.html @@ -0,0 +1,473 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.StaticFiles.IConfiguration Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.StaticFiles.IConfiguration Interface Reference
+
+
+ +

For managing the Configuration directory + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.StaticFiles.IConfiguration:
+
+
+ + +IHostedService +Tgstation.Server.Host.Components.IEventConsumer +IDisposable +Tgstation.Server.Host.Components.StaticFiles.Configuration + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Task< ServerSideModificationsCopyDMFilesTo (string dmeFile, string destination, CancellationToken cancellationToken)
 Copies all files in the CodeModifications directory to destination More...
 
Task SymlinkStaticFilesTo (string destination, CancellationToken cancellationToken)
 Symlinks all directories in the GameData directory to destination More...
 
Task< IReadOnlyList< ConfigurationFile > > ListDirectory (string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
 Get ConfigurationFile for all items in a given configurationRelativePath More...
 
Task< ConfigurationFileRead (string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
 Reads a given configurationRelativePath More...
 
Task< bool > CreateDirectory (string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
 Create an empty directory at configurationRelativePath More...
 
Task< bool > DeleteDirectory (string configurationRelativePath, ISystemIdentity systemIdentity, CancellationToken cancellationToken)
 Attempt to delete an empty directory at configurationRelativePath More...
 
Task< ConfigurationFileWrite (string configurationRelativePath, ISystemIdentity systemIdentity, byte[] data, string previousHash, CancellationToken cancellationToken)
 Writes to a given configurationRelativePath More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Components.IEventConsumer
Task< bool > HandleEvent (EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
 Handle a given eventType More...
 
+

Detailed Description

+

For managing the Configuration directory

+ +

Definition at line 14 of file IConfiguration.cs.

+

Member Function Documentation

+ +

◆ CopyDMFilesTo()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<ServerSideModifications> Tgstation.Server.Host.Components.StaticFiles.IConfiguration.CopyDMFilesTo (string dmeFile,
string destination,
CancellationToken cancellationToken 
)
+
+ +

Copies all files in the CodeModifications directory to destination

+
Parameters
+ + + + +
dmeFileThe .dme file being compiled
destinationPath to the destination folder
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the ServerSideModifications if any
+ +

Implemented in Tgstation.Server.Host.Components.StaticFiles.Configuration.

+ +
+
+ +

◆ CreateDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<bool> Tgstation.Server.Host.Components.StaticFiles.IConfiguration.CreateDirectory (string configurationRelativePath,
ISystemIdentity systemIdentity,
CancellationToken cancellationToken 
)
+
+ +

Create an empty directory at configurationRelativePath

+
Parameters
+ + + + +
configurationRelativePathThe relative path in the Configuration directory
systemIdentityThe ISystemIdentity for the operation. If null, the operation will be performed as the user of the Core.Application
cancellationTokenThe CancellationToken for the operation. Usage may result in partial writes
+
+
+
Returns
A Task<TResult> resulting in true if the directory already existed, false otherwise
+ +

Implemented in Tgstation.Server.Host.Components.StaticFiles.Configuration.

+ +
+
+ +

◆ DeleteDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<bool> Tgstation.Server.Host.Components.StaticFiles.IConfiguration.DeleteDirectory (string configurationRelativePath,
ISystemIdentity systemIdentity,
CancellationToken cancellationToken 
)
+
+ +

Attempt to delete an empty directory at configurationRelativePath

+
Parameters
+ + + + +
configurationRelativePathThe path of the empty directory to delete
systemIdentityThe ISystemIdentity for the operation. If null, the operation will be performed as the user of the Core.Application
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
true if the directory was empty and deleted, false otherwise
+ +

Implemented in Tgstation.Server.Host.Components.StaticFiles.Configuration.

+ +
+
+ +

◆ ListDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<IReadOnlyList<ConfigurationFile> > Tgstation.Server.Host.Components.StaticFiles.IConfiguration.ListDirectory (string configurationRelativePath,
ISystemIdentity systemIdentity,
CancellationToken cancellationToken 
)
+
+ +

Get ConfigurationFile for all items in a given configurationRelativePath

+
Parameters
+ + + + +
configurationRelativePathThe relative path in the Configuration directory
systemIdentityThe ISystemIdentity for the operation. If null, the operation will be performed as the user of the Core.Application
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the ConfigurationFiles for the items in the directory. ConfigurationFile.Content and ConfigurationFile.LastReadHash will both be null
+ +

Implemented in Tgstation.Server.Host.Components.StaticFiles.Configuration.

+ +
+
+ +

◆ Read()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<ConfigurationFile> Tgstation.Server.Host.Components.StaticFiles.IConfiguration.Read (string configurationRelativePath,
ISystemIdentity systemIdentity,
CancellationToken cancellationToken 
)
+
+ +

Reads a given configurationRelativePath

+
Parameters
+ + + + +
configurationRelativePathThe relative path in the Configuration directory
systemIdentityThe ISystemIdentity for the operation. If null, the operation will be performed as the user of the Core.Application
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the Api.Models.ConfigurationFile of the file
+ +

Implemented in Tgstation.Server.Host.Components.StaticFiles.Configuration.

+ +
+
+ +

◆ SymlinkStaticFilesTo()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.StaticFiles.IConfiguration.SymlinkStaticFilesTo (string destination,
CancellationToken cancellationToken 
)
+
+ +

Symlinks all directories in the GameData directory to destination

+
Parameters
+ + + +
destinationPath to the destination folder
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.StaticFiles.Configuration.

+ +
+
+ +

◆ Write()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<ConfigurationFile> Tgstation.Server.Host.Components.StaticFiles.IConfiguration.Write (string configurationRelativePath,
ISystemIdentity systemIdentity,
byte [] data,
string previousHash,
CancellationToken cancellationToken 
)
+
+ +

Writes to a given configurationRelativePath

+
Parameters
+ + + + + + +
configurationRelativePathThe relative path in the Configuration directory
systemIdentityThe ISystemIdentity for the operation. If null, the operation will be performed as the user of the Core.Application
dataThe data to write. If null, the file is deleted
previousHashThe hash any existing file must match in order for the write to succeed
cancellationTokenThe CancellationToken for the operation. Usage may result in partial writes
+
+
+
Returns
A Task<TResult> resulting in the updated ConfigurationFile or null if the write failed due to ConfigurationFile.LastReadHash conflicts
+ +

Implemented in Tgstation.Server.Host.Components.StaticFiles.Configuration.

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..f17d731696ff5bf5f753df9ac5ad9fd0a15701c3 GIT binary patch literal 3004 zcmcIm2~?8l8rIBe9J^l2NhQ;JlgKiclu@T#GA;eVEi)}K(a?&_+-)S(Y_S>z6UHsq zCXr?c%hGTgwJc0gnQ+o_LjyCy7F=>exF2}Wxt+V6Irp6Vo%8?y`+e{7ZO`-m?=>GU zx3wBD4HXrYwUE23uZqe_B#^JJQ3G#_v*<(Mqvzw{w@)sY1M%&|OhVS<>p)UIEiEnT z*9MJ1cTK#n*FhCvq-ZZX{H#<|zD7f?&VJvkz8?}N_It2gN3Zbon&jx=s_#UXPEST| z%V!yQUcK}-_~`VFg$TX$o0_eb6Bh^gmYOd5>7g&LARIJXqgSTGw?X$;3z$XlEzsvO zXluK+9}K#0Jk$ZjuJqgmk;{1QluaUkFN*O=9vI5mPnmFM#ZnBMsbJ_fk`m@tpFc*JlQOeYk{slpTwt`pZQRYnPGzsP|mxpNYKSy1n>@Yx>B9thDUu%md8qgKe~ z6&+zj>E+5hVT36@HwP|myoanTkj7JkKO{X}lJ2HS1VXBiKh^0UTzP6U34Y|0tHFS( zT&vE!JR6=hHz_l09?d`t3bq8mph>g!_@H9qhUqzCqjA(5Sv_&-ZQ{oaxU3P`%_(Ba zrpB5Yo#ds{3j_lJ`XIhjt>m3(*VCFuZPzM`k7@*=aDi=0Z*uC+%nYV-Fm%s=Y&b)@ z0zYUg+T2m|qnpzqN~7jo6H>#9Gi@`etS4=|V?UFgV<=KwNiI9QAcE0cnz=j9l)SiM z6B@Tu=<3MYW=;t%Op3A5KZzjK6pqJ@{kXWZIQ8KV@FQch?t-QQRw_TQ|Cz;h(iA`J zE;A!U>I$=tOyir9+TV?zi>%ABd7VEvZ#i-Zf5&_NZKPjU!cRtnjg6zDQog*X83ohY z(0qIbWeoKm&VItwufRm#xBggc(>1in3g~fTfgya_z&Z>s_Msc z^t!BXe-U8t9uu~Nzj!P6Xo&CB-K7z&{ep8^h}}$jWw)9D-T=+n+nf=b`pU(Ol zK7}Tu<~HJka_6g&xiNR1;Ub^StlV1Q6yHWHYxgqh+j)0MVi_S${TlC~TQ6BO_b-K8 zw3?y>-p9wUa^*&)SjS(BhEuLeqO9gEA(@#sTF}(_{GD9dV3tyGu`R~KJaRR$?i}*B zlLOu67Gk@Aq|&jta_HNs!o0YlJmL}2?GtR5E$wQ-K`?>4Iio}t&7yL+4o8v|7YVSG zgqEE$ZRR;9{pwH%HwD0>ggv_Zl?{YY62LoZOl*vRg44heCn`ulfm@gGJLo;=NctB; zDFc8SeCS`v;0(@hHxJOt?YDBkkL@J*tL!sl@b4}lis5cPcz8QG-V~4xDFQ=IJiYW# zlU7U32Fv~q@CgT9-5b-EnyuO`cVDY%On6Y!0sZb7uhk=$L9NNLB(Ypo5y9>PV(o6;d4&>iIeinp zMd7aqPez6)l)y984Q8oO{?puFg#E|NUxuBONF)awLF;G(4Wpv2Aq}q2xw$88MWG+e zr)*D}=k~QGK4mS4oK-p|J|R?;nud0Qjer}gtO1sIOR_g@_U0cDMjIL4<4&36MNz4o`B65O7eeCL>lv}8O0_Pv z?_BB+FIr8*2F!;zVEcMa=i?$DG`W3s2<9`AT+1@^$d5PNVRu%a$a#n?(OW~sO)|xH zS}3DpdkUMdg`fMd;LkcHpTq@_VA6GoVBj6x9l(uDIH$vJCN@nc4b)8S&#U0orbKT_ z{)H~q>D$mWEPXrSJ5pWNM&q9;JY>~m&k)-DZdNj|uGuRkR}qU*fD-V|3tHQk^oF7n zI_I>L#Y_?H8ghe6cZQvJ44zw4pnHO$&dhbJY88^}kiGPx9Wf6FUt9tw|H*Mjc}!F> zWNMaR`Hr{#c&4|7)(39$m4hCbgyaslC~9}(H`NGw+*e}6kvukgfalCvcDsYZm0yUs zqEXtTtwv}2Easy@t{dwX<{+5h1iAq=mx^$OH(w?Rw`XK$75Q2 zyp>r|JLmvA`TOMu9L}!pL*!NRis>qy{W*iDg8ZziUYnIPgcvFp$2wNWz~W1rL%0qB zz98`M6;Y+36L}OnbI#^^8zkm<3S%5dom_=OXZO zRN(nfZxm4X8PQ%wenwVSpc4De%h-RNWqnG?4BRq7Z2k2ApLF>jS@vJtMvOqx`cyav z64=~6u;Hjj*Ohez;PgiqkP#aWC=hWIq|>3>$g-A2MIt-{a>7WmqLi>zf-|T*W|w@6 z{-)U;CwXCV;!=o&20tPo4oKe&%yUf+M%uaxSR?rLWMKWg{au(ioQUZYY*fzDNsCFko#H^=YBA0jr_a5| z6UDh4wS}pN;)^Nq`0XU|>b~c6LcLc^-K~GGs zV@mY#L|x@tudL=Bwt0LiAgI||RG)!7PO81m4z!m0z%sgnO-~+J@P+l%$S)(CuF(~j z_QV%PbsJyL%YPPdPPGDO{RfL5q5zoZ?(U?rPdE|ZFNirJ z@#FXJwzdCzN?!evlDhkI>`ib#J;B(ps%(^-DvZfvcN#*IACqW-vWgP$XK2*2#(Nl2 zp~HYSjHoGAn-6xBe6M08)L@ iL-jtZYD{#=RoxsA3+JvErhrmg1={E3TDdpm!ruVX53SJv literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_network_prompt_reaper-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_network_prompt_reaper-members.html new file mode 100644 index 0000000000..180bb7405e --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_network_prompt_reaper-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.INetworkPromptReaper Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Watchdog.INetworkPromptReaper, including all inherited members.

+ + +
RegisterProcess(IProcess process)Tgstation.Server.Host.Components.Watchdog.INetworkPromptReaper
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_network_prompt_reaper.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_network_prompt_reaper.html new file mode 100644 index 0000000000..e8a34f15e2 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_network_prompt_reaper.html @@ -0,0 +1,143 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.INetworkPromptReaper Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.INetworkPromptReaper Interface Reference
+
+
+ +

On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort(). This looks out for those prompts and immediately clicks "Yes" if the owning process has registered for it + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Watchdog.INetworkPromptReaper:
+
+
+ + +Tgstation.Server.Host.Components.Watchdog.PosixNetworkPromptReaper +Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper + +
+ + + + + +

+Public Member Functions

void RegisterProcess (IProcess process)
 Register a given process for network prompt reaping More...
 
+

Detailed Description

+

On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort(). This looks out for those prompts and immediately clicks "Yes" if the owning process has registered for it

+ +

Definition at line 8 of file INetworkPromptReaper.cs.

+

Member Function Documentation

+ +

◆ RegisterProcess()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.Components.Watchdog.INetworkPromptReaper.RegisterProcess (IProcess process)
+
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_network_prompt_reaper.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_network_prompt_reaper.png new file mode 100644 index 0000000000000000000000000000000000000000..c4b2bbcf89830bb38dd13ea7f7c1ef04907ce46a GIT binary patch literal 2005 zcmcIkc{tl!8vc=9q$p_z!Js6ry_UALL#kJUCR|%-BK8!uBxtRr#pviwNs81(Z!1c} zj5SqjYiLSJEv+SuAe7p2QPeKhN$)c=f6Q~|kNIQ1=Q-!R?|0tweCIjO`%+rCA^i2rMs!ANrV#x$m`vt(_ea%) zR3gg7;R+xWeG5*Ps|f&z`=gLQxW~o((kPH-LLg7t!@J4hSmx zFM&g`{hHdz&|QAV;Rt&H1sKfw%}gxr?pR$6@*ClIpkepfHA7T_gUDt*xk+}NUvx-& zOp!2xDpW~jHl!=8j;NeBo0OCkDZEn-Nk2z}u2}VzHytvv2*_mh#z0m^`F3;`Ki6V6 zbSd9Zu*u|qM?CNrYp;rn<*E&GrZ_$gSn0ZB7j|%>1gLR)LGP(n?Dt7TcZU!1bpT~JoM`tlp|ve6s4Mp#^V!+yc&kZ z(?-FYZKzEfiD$WsHtwkWk`v6$3Kv&C)X})(?Jgp9aoqFlWMbu-ByOBOng-T>XPKLu zbjnEF0|~2du-MVEBUWMR49c1F{>P^&$l;?reel`aK2XFT21^VWr66A*epU_^xQTlo z>Cc+4s+`eS4sm7ON#|0q=i?b#k05J(4CNcN=I|SVERB%kg+HI*o&fhNbR6kxwK)P! z$tB0RD$X}4qg}#ScwQH&*w(w8B+fDSXwl6xR5V_|JyFq1H0q6n(eB-FR{=nMr!f@l zRng-K=EisiA6tgqO*NRZp46KREnsVH zs(KIGYO0YeLh^iQQrtk@Il0VkORsz09nNUBfzl3OZUUvCuh(!HpXj%l9PNrz1_VFAM!EAW zEe|kzIqx6R`8{o2Z+Kf9sqj?!k~@hNXQ)9Rz}HXe)FPNu9QYzpF;=~x_tJhttsV^5 zVq|uZ2p!s|n(E;ZyLb|}9)Vd+6`tIzMAQCub#D(@Cn=~fo874Okn3M{i!4xDi9tD% zw;`h#)0&2w*R!9_v)``@($6Isg05kD0{8vA5UTC3-o}?LOgv*~GVduFAKZ?Cw42;A zZ`Eg>-P5g}8S^NZ$V@!dG1`v~L40fs$e)c#!H~B*W_Wt|&?s3#_o4$TgVM;#Gt*o& zP|if?x?2gdEA_P94HUyz^>3fBReOdps!pSOzPF{G8Q~QtN(d`!Ehzh>gq-dZr4P#* zD%hipxk%VSfPj{9ETuV>{#TpP-T=#4m%*=MX!KbDe^tK6@xvQ==g!R>+e3e|=)^Z6 z#4_PWkh47xa6fI%oVq#Y-LkQ0ZdW$+qSVh#rkApPeWrVsw*0egQVrdak~ddFJIJDP zmKOY`y(n7Iv<$Bc$6#Gt#bvqlf@$_|B+Q8)Hkuo{3j!x~($#|@K_2dzT@`_{E zRvKj7dVp_Z5wC}fHA`UM)V!M_t=WAkaS?@xJE)l{SJ-lcp>^u5>%Khl$j;!vN7wmf z`8H6OrZCoPZJ#FzM)8b>aP_%TNO!{zs04Fo6Kz+_XP3^1ca${`$^Dm4Iaapl_7x7M zjTG7)cHP(+71DoH3zd-WY=*X(a$+d0^mfJivj|akbPr90=_H@r9M$`FeNDcq8Rg=; zgi8eXdVG@eZXu#$q~2P+l)=ZUbo?=(T)UzWQ4z@6W;Vz(Fr6*;t50P$- zWz(AkE7+yW+kA4606r(yGDZqr%%;aq@bA7<|EyL)%5kJ77A%_;!4*;Q*B%Hvz=ryY zX_HM)tcGX?0|X>$UP0NJD)u|6i8d1Z%#VS;l$6? + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.IReattachInfoHandler Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Watchdog.IReattachInfoHandler, including all inherited members.

+ + + +
Load(CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.IReattachInfoHandler
Save(WatchdogReattachInformation reattachInformation, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.IReattachInfoHandler
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_reattach_info_handler.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_reattach_info_handler.html new file mode 100644 index 0000000000..39ce7a15ec --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_reattach_info_handler.html @@ -0,0 +1,188 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.IReattachInfoHandler Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.IReattachInfoHandler Interface Reference
+
+
+ +

Handles saving and loading WatchdogReattachInformation + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Watchdog.IReattachInfoHandler:
+
+
+ + +Tgstation.Server.Host.Components.ReattachInfoHandler + +
+ + + + + + + + +

+Public Member Functions

Task Save (WatchdogReattachInformation reattachInformation, CancellationToken cancellationToken)
 Save some reattachInformation More...
 
Task< WatchdogReattachInformationLoad (CancellationToken cancellationToken)
 Load a saved WatchdogReattachInformation More...
 
+

Detailed Description

+

Handles saving and loading WatchdogReattachInformation

+ +

Definition at line 9 of file IReattachInfoHandler.cs.

+

Member Function Documentation

+ +

◆ Load()

+ +
+
+ + + + + + + + +
Task<WatchdogReattachInformation> Tgstation.Server.Host.Components.Watchdog.IReattachInfoHandler.Load (CancellationToken cancellationToken)
+
+ +

Load a saved WatchdogReattachInformation

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the stored WatchdogReattachInformation if any
+ +

Implemented in Tgstation.Server.Host.Components.ReattachInfoHandler.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StartAsync().

+ +
+
+ +

◆ Save()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Watchdog.IReattachInfoHandler.Save (WatchdogReattachInformation reattachInformation,
CancellationToken cancellationToken 
)
+
+ +

Save some reattachInformation

+
Parameters
+ + + +
reattachInformationThe WatchdogReattachInformation to save
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.ReattachInfoHandler.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StopAsync().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_reattach_info_handler.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_reattach_info_handler.png new file mode 100644 index 0000000000000000000000000000000000000000..fa1d64fc47195c4c9f0829e95a71e512d983a996 GIT binary patch literal 1338 zcmcJP|5MTj7{@H!5Q1 zO87cB001k=Aw&uQ!15uETHyfY+u7yN09YFp7DKYz?GR2*Te5h{3lRM)g+k%P9o_)7 zD>5k&Q~+9f8>;&;J^G<(6GZ7BE5hnFC}@@?`9{Uw!UAS80?=isk=_J)BW@l%ymf>rkj<>e8;o?Z1`PPOlA&3E2 zn>t}nF)68QTlGK}74O@KT5t66e)27YtMSUZ7ri#juR_)7YVMg$OL8zjK$&c~@8E%F z*`a_>Q4A< zXK~YEZ0&03Ix=2=z}G{Al*|Wgy)l^D(|mbsc(k-Tx?#d!v3rttcTII#WNl45P+)x- zJF;o47WIGzJGOi=7iYRKGfn&`1h#;2cRG>$p#nS@8i_!{)I4*XDK$8_Ik{Zr11>@y z?=IkS{Vgp&1<^H##QOmk5mf(I*&XuPqw^iRH`wH+BJG45n~D7+9U;=7R_{s%HL zecKY*=f^hof-1n*2I{5f2d$-sMfQ%uVVxwrG4|APY?(!pjy7bug9qzvw{R;tZ+e8I zXQwKZh|{37n_8xpl5U%SyE60IEztgY0V|hZvmOz07A4{?&i%g@-&~3}m;bT6Qzj;* zr^|n_nyZak*L{(-egxVf5K2rM9PZa8B@!B-d;KL-jb7r zMSM?oky6L)|Dg{Zby~?-vKmoeJ$g)woj00K#vA33AK!4!D`%y+NHwqJB~ey^D4NYZ zx+)&2v%K?S0lzM%KuJLMjX#^b)yHeA_E`k*ygqYHQ-6sSo9ZC&e|b7gC)0g%{)Oony1h57C!o)5YV( zd7uE)vo>QwD9wd=Aj$JR7=r1e^8qa;8@kR8$OogH9OFDw+xO-D1E$`O A5dZ)H literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller-members.html new file mode 100644 index 0000000000..29847455ba --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller-members.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.ISessionController Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Watchdog.ISessionController, including all inherited members.

+ + + + + + + + + + + + + + + + + + +
ApiValidationStatusTgstation.Server.Host.Components.Watchdog.ISessionController
ClosePortOnRebootTgstation.Server.Host.Components.Watchdog.ISessionController
DmbTgstation.Server.Host.Components.Watchdog.ISessionController
EnableCustomChatCommands()Tgstation.Server.Host.Components.Watchdog.ISessionController
IsPrimaryTgstation.Server.Host.Components.Watchdog.ISessionController
LaunchResultTgstation.Server.Host.Components.Watchdog.ISessionController
LifetimeTgstation.Server.Host.Core.IProcessBase
OnRebootTgstation.Server.Host.Components.Watchdog.ISessionController
PortTgstation.Server.Host.Components.Watchdog.ISessionController
RebootStateTgstation.Server.Host.Components.Watchdog.ISessionController
Release()Tgstation.Server.Host.Components.Watchdog.ISessionController
ResetRebootState()Tgstation.Server.Host.Components.Watchdog.ISessionController
SendCommand(string command, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.ISessionController
SetHighPriority()Tgstation.Server.Host.Core.IProcessBase
SetPort(ushort newPort, CancellationToken cancellatonToken)Tgstation.Server.Host.Components.Watchdog.ISessionController
SetRebootState(RebootState newRebootState, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.ISessionController
TerminationWasRequestedTgstation.Server.Host.Components.Watchdog.ISessionController
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html new file mode 100644 index 0000000000..c5ea30c891 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html @@ -0,0 +1,610 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.ISessionController Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.ISessionController Interface Reference
+
+
+ +

Handles communication with a DreamDaemon IProcess + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Watchdog.ISessionController:
+
+
+ + +Tgstation.Server.Host.Core.IProcessBase +IDisposable +Tgstation.Server.Host.Components.Watchdog.DeadSessionController +Tgstation.Server.Host.Components.Watchdog.SessionController + +
+ + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

ReattachInformation Release ()
 Releases the IProcess without terminating it. Also calls System.IDisposable.Dispose More...
 
Task< string > SendCommand (string command, CancellationToken cancellationToken)
 Sends a command to DreamDaemon through /world/Topic() More...
 
Task< bool > SetPort (ushort newPort, CancellationToken cancellatonToken)
 Causes the world to start listening on a newPort More...
 
Task< bool > SetRebootState (RebootState newRebootState, CancellationToken cancellationToken)
 Attempts to change the current RebootState to newRebootState More...
 
void ResetRebootState ()
 Changes RebootState to Components.Watchdog.RebootState.Normal without telling the DMAPI More...
 
void EnableCustomChatCommands ()
 Enables the reading of custom chat commands from the ISessionController More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Core.IProcessBase
void SetHighPriority ()
 Set's the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass.AboveNormal More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

Task< LaunchResultLaunchResult [get]
 A Task that completes when DreamDaemon starts pumping the windows message queue after loading a .dmb or when it crashes More...
 
bool IsPrimary [get]
 If the IDmbProvider.PrimaryDirectory of Dmb is being used More...
 
bool TerminationWasRequested [get]
 If the DreamDaemon instance sent a More...
 
ApiValidationStatus ApiValidationStatus [get]
 The DMAPI Components.Watchdog.ApiValidationStatus More...
 
IDmbProvider Dmb [get]
 The IDmbProvider being used More...
 
ushort? Port [get]
 The current port DreamDaemon is listening on More...
 
bool ClosePortOnReboot [get, set]
 If the port should be rotated off when the world reboots More...
 
RebootState RebootState [get]
 The current RebootState More...
 
Task OnReboot [get]
 A Task that completes when the server calls /world/Reboot() More...
 
- Properties inherited from Tgstation.Server.Host.Core.IProcessBase
Task< int > Lifetime [get]
 The Task<TResult> resulting in the exit code of the process More...
 
+

Detailed Description

+

Handles communication with a DreamDaemon IProcess

+ +

Definition at line 10 of file ISessionController.cs.

+

Member Function Documentation

+ +

◆ EnableCustomChatCommands()

+ + + +

◆ Release()

+ +
+
+ + + + + + + +
ReattachInformation Tgstation.Server.Host.Components.Watchdog.ISessionController.Release ()
+
+ +

Releases the IProcess without terminating it. Also calls System.IDisposable.Dispose

+
Returns
ReattachInformation which can be used to create a new ISessionController similar to this one
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.SessionController, and Tgstation.Server.Host.Components.Watchdog.DeadSessionController.

+ +
+
+ +

◆ ResetRebootState()

+ + + +

◆ SendCommand()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<string> Tgstation.Server.Host.Components.Watchdog.ISessionController.SendCommand (string command,
CancellationToken cancellationToken 
)
+
+ +

Sends a command to DreamDaemon through /world/Topic()

+
Parameters
+ + + +
commandThe sanitized command to send
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the result of /world/Topic()
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.SessionController, and Tgstation.Server.Host.Components.Watchdog.DeadSessionController.

+ +
+
+ +

◆ SetPort()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<bool> Tgstation.Server.Host.Components.Watchdog.ISessionController.SetPort (ushort newPort,
CancellationToken cancellatonToken 
)
+
+ +

Causes the world to start listening on a newPort

+
Parameters
+ + + +
newPortThe port to change to
cancellatonTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in true if the operation succeeded, false otherwise
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.SessionController, and Tgstation.Server.Host.Components.Watchdog.DeadSessionController.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.HandlerMonitorWakeup().

+ +
+
+ +

◆ SetRebootState()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<bool> Tgstation.Server.Host.Components.Watchdog.ISessionController.SetRebootState (RebootState newRebootState,
CancellationToken cancellationToken 
)
+
+ +

Attempts to change the current RebootState to newRebootState

+
Parameters
+ + + +
newRebootStateThe new RebootState
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in true if the operation succeeded, false otherwise
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.SessionController, and Tgstation.Server.Host.Components.Watchdog.DeadSessionController.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.HandleMonitorWakeup().

+ +
+
+

Property Documentation

+ +

◆ ApiValidationStatus

+ +
+
+ + + + + +
+ + + + +
ApiValidationStatus Tgstation.Server.Host.Components.Watchdog.ISessionController.ApiValidationStatus
+
+get
+
+ +

The DMAPI Components.Watchdog.ApiValidationStatus

+ +

Definition at line 30 of file ISessionController.cs.

+
30 { get; }
+
+
+ +

◆ ClosePortOnReboot

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.ISessionController.ClosePortOnReboot
+
+getset
+
+ +

If the port should be rotated off when the world reboots

+ +

Definition at line 45 of file ISessionController.cs.

+
45 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.HandlerMonitorWakeup().

+ +
+
+ +

◆ Dmb

+ +
+
+ + + + + +
+ + + + +
IDmbProvider Tgstation.Server.Host.Components.Watchdog.ISessionController.Dmb
+
+get
+
+
+ +

◆ IsPrimary

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.ISessionController.IsPrimary
+
+get
+
+ +

If the IDmbProvider.PrimaryDirectory of Dmb is being used

+ +

Definition at line 20 of file ISessionController.cs.

+
20 { get; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.HandlerMonitorWakeup().

+ +
+
+ +

◆ LaunchResult

+ +
+
+ + + + + +
+ + + + +
Task<LaunchResult> Tgstation.Server.Host.Components.Watchdog.ISessionController.LaunchResult
+
+get
+
+ +

A Task that completes when DreamDaemon starts pumping the windows message queue after loading a .dmb or when it crashes

+ +

Definition at line 15 of file ISessionController.cs.

+
15 { get; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.WatchdogBase.CheckLaunchResult().

+ +
+
+ +

◆ OnReboot

+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Components.Watchdog.ISessionController.OnReboot
+
+get
+
+ +

A Task that completes when the server calls /world/Reboot()

+ +

Definition at line 55 of file ISessionController.cs.

+
55 { get; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.MonitorLifetimes().

+ +
+
+ +

◆ Port

+ +
+
+ + + + + +
+ + + + +
ushort? Tgstation.Server.Host.Components.Watchdog.ISessionController.Port
+
+get
+
+ +

The current port DreamDaemon is listening on

+ +

Definition at line 40 of file ISessionController.cs.

+
40 { get; }
+
+
+ +

◆ RebootState

+ +
+
+ + + + + +
+ + + + +
RebootState Tgstation.Server.Host.Components.Watchdog.ISessionController.RebootState
+
+get
+
+
+ +

◆ TerminationWasRequested

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.ISessionController.TerminationWasRequested
+
+get
+
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..30af8dd04ec8e2e8f8b3cfeabb68ea85e5274e4a GIT binary patch literal 3139 zcmd6pc~nzZ9>*z*RjArl3l=Ph31T&X1!Pf3tbh=fh^#)4U?pi}haeylpooeNm1s(W zh!B)bDqsmk0t5nz0(l|KR1nz$3IW+fp{#*q?xS;h=FD{Fk2$C3%sVIV-rsw_n|JT; ze!lnjyXH!;->j;ss-U2-8Sh~0rl6pN0sY2}O5pxCtOg949j?wEc5=BKbl*(PN7EnQ z0KN5JV`HPrwSFC7Zan8ka903M$kiqAFji1d`vq_Nwa57nrU%BohOMgYUg^UD5%Nsh zuChAr5bct;hrwT+&p=+oWhHAGGVP+k+X7RU=ev$1zrV#OK(~GDp}r$Sz(5bXLZ@B# zIWfMsAt!%bg25YaVXAB>Q$>}g z!6&f#=uzpGehpZvNHQ52Ssxv^5}#3mIk1=S$qKHK3%;atc+pXN@K=gCjd`nQps=`r z_f=<4L3xd_?|jLYlyoL0vv#o~*sG?P9c9P({y3P(auui4UGPJ#-D5nXY5l(ltjo&X z+c~9m#M1o?5^bN_M}mh8$?%M!@M&`J)9J~WNEsiZ)@P%ixFZw1j=^(YEjrvlv+shh zda%%+rwSBP+#m*NCo*(~rH7Xpf}SH8&xpJaCd<^rKl?*hQy2HFqCidMy{5DHWeVHmUU7``} zoZPn|X%Box-(SkL=H4JPA#EEgrljH(r6%M!tIsv_6=hpZyWGdpWG}uU4f%o+CuHp< zQ?ej@eDwiF4Ie{-#;yzqIfO08O<>Wkjtx$X@IpWy&x>WZXZa!~Eum&$HWzwf!JONxSuD(|BCUO+4sA@;ne&o>l6oa=^AJ;tkZ^93zs zo!}ck{@>ufuDV9pB8N~+J(NQLt9X{*lpJ~1>a?ro&K;@Glr|Lpu^DqQs&@4oFYU}3 z{sO8tVdDbV)YrVhKdAwQ5xlOTr)eEdv*^zq8_OjOw>hP#^u;cPxlNr{0=a z32J0f6jTmtx!Mg0OcbL&tlKioeQkrdsQJkq@SI z-O&k};@6~ho(IQP3KatfpfH5~vJEDFgp)ud+Wd8qgz?sN*$M6H=h{Mjqs_MU8II=q z#Ex;LBXf!DRz)p@EH*hSG;3Wl^B&gbb@P$&5xQ^?Y<*>^7Na$(t-s*RTJFRd!Bp$+ zbQuNmGE%BUV8!afF_qXs|H|ut?t?FnvF5QdpKs$BDwKinPdoHU(8IAFcu7uT;dpU- z52&|rFve{fB*@{X@?HU_GA$-dM19iKEqdVxb3*tvy*DMzk3!U?oelNo-q28N9vLBx9aw$`MH;X3bUerTIOEzMkP@ky#RA7|$hP?$;pAxzGlm zj*y~kC}hk^BeH@akv82!0*q6p6uew(Jtdn|@djqfkd=tMG!wUc>e$H$pdm|D(YUF{ z8zL_21NBp2Y5$$9f4r5PJCq|BKX+)eBFG%7Vjvzx>AHF>!^5i(fjJ^MB6sesDz!_4W1FKit0K(lO;L1$UEgp0z#gpsBgz+MjBU%xr20rN&@m zA96opW8(7M6kP;PC1d3%=(pMfkKF_H$BllH zrJsx;6b#Ru$Li9b7e+i#338IwjpLyW4oBG%rrzXCHm|e==aNMN;d7+r{9)e^Nhcyoj zLkOp1=$~lMP`;pFeuyXdz6f0K>!tIHZ7|+H<3=hU+VwW%WWnEs?0MuTyzoOv`KXiM z7mxc0?5)e_Ba2sQKCC1&H{54w=($;2mYw6_Elr-?@n&^;6?R=>uRDWlXEvHu&~~a+ zek?4O9fZQ%*;^~?E$Kb-kMp|XSMFitq=LkKAXbtrOln)g`~<6HUi;$H2ZPqtTNzTF zjtBab$x>;10dCy5((<&Xl66b+xn3n>Ck}{#ZT76;fxK>wgpXVtTnJ-FGaWzK~XE=q3-k zI!$GX+SO}l(dB#`7qfP+S9gsrX7ND*hmr1@|RO0;H^m>ysEAV!aG0?~c`G>LgwuXNh!0iGRzXINl LU|W9l^u@meMJ2)n literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller_factory-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller_factory-members.html new file mode 100644 index 0000000000..6b8e88cdff --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller_factory-members.html @@ -0,0 +1,88 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory, including all inherited members.

+ + + + +
CreateDeadSession(IDmbProvider dmbProvider)Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory
LaunchNew(DreamDaemonLaunchParameters launchParameters, IDmbProvider dmbProvider, IByondExecutableLock currentByondLock, bool primaryPort, bool primaryDirectory, bool apiValidate, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory
Reattach(ReattachInformation reattachInformation, CancellationToken cancellationToken)Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller_factory.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller_factory.html new file mode 100644 index 0000000000..87f2b4d7af --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller_factory.html @@ -0,0 +1,264 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory Interface Reference
+
+
+ +

Factory for ISessionControllers + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory:
+
+
+ + +Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory + +
+ + + + + + + + + + + +

+Public Member Functions

Task< ISessionControllerLaunchNew (DreamDaemonLaunchParameters launchParameters, IDmbProvider dmbProvider, IByondExecutableLock currentByondLock, bool primaryPort, bool primaryDirectory, bool apiValidate, CancellationToken cancellationToken)
 Create a ISessionController from a freshly launch DreamDaemon instance More...
 
Task< ISessionControllerReattach (ReattachInformation reattachInformation, CancellationToken cancellationToken)
 Create a ISessionController from an existing DreamDaemon instance More...
 
ISessionController CreateDeadSession (IDmbProvider dmbProvider)
 Creates a ISessionController that appears to have started and died with exit code -1 More...
 
+

Detailed Description

+

Factory for ISessionControllers

+ +

Definition at line 11 of file ISessionControllerFactory.cs.

+

Member Function Documentation

+ +

◆ CreateDeadSession()

+ +
+
+ + + + + + + + +
ISessionController Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory.CreateDeadSession (IDmbProvider dmbProvider)
+
+ +

Creates a ISessionController that appears to have started and died with exit code -1

+
Parameters
+ + +
dmbProviderThe IDmbProvider for the ISessionController
+
+
+
Returns
A dead ISessionController
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.

+ +
+
+ +

◆ LaunchNew()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<ISessionController> Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory.LaunchNew (DreamDaemonLaunchParameters launchParameters,
IDmbProvider dmbProvider,
IByondExecutableLock currentByondLock,
bool primaryPort,
bool primaryDirectory,
bool apiValidate,
CancellationToken cancellationToken 
)
+
+ +

Create a ISessionController from a freshly launch DreamDaemon instance

+
Parameters
+ + + + + + + + +
launchParametersThe DreamDaemonLaunchParameters to use. DreamDaemonLaunchParameters.SecurityLevel will be updated with the minumum required security level for the launch
dmbProviderThe IDmbProvider to use
currentByondLockThe current IByondExecutableLock if any
primaryPortIf the DreamDaemonLaunchParameters.PrimaryPort of launchParameters should be used
primaryDirectoryIf the IDmbProvider.PrimaryDirectory of dmbProvider should be used
apiValidateIf the ISessionController should only validate the DMAPI then exit
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in a new ISessionController
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DreamMaker.VerifyApi().

+ +
+
+ +

◆ Reattach()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<ISessionController> Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory.Reattach (ReattachInformation reattachInformation,
CancellationToken cancellationToken 
)
+
+ +

Create a ISessionController from an existing DreamDaemon instance

+
Parameters
+ + + +
reattachInformationThe ReattachInformation to use
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in a new ISessionController on success or null on failure to reattach
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller_factory.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..e7c5bcbece53e8c400ea88275cc87378353c5311 GIT binary patch literal 1436 zcmbu9X;70_6ox;RI1pK_iUu$-B8&^N$)d>q0YM-_2unpp3L<5z1zcEyAVt4ak{EDM zKunvE0TLELf||&xAXGr3VKacr8f1xxECwR|bf!PrzdbYe-1p9X&&>PdnM3x$yQ?En zNB{uTJ#Zia02G+8_EAxSd(2A4DtvA8@glmeudl;WGP8J|)^Y<@-%nFh6M{U5hMy{l z1iT*ro4!@gUqo{NKj;dMfT{nzWhGFN~uvu|3{ zlUC^}idcE11~r7!Z_%PRY~AK_HUpC{sml4M*nLD{PuxDG7xR6D6pBRMB|Z7;ZsvnQ z$ms1Z#dFC@!c1ve!QF=?w6wM*%f0vIk!lI(;W*McB|=Qyk^72~ycsD+ckRMt~bpSCym|SUGz@ivm8hk^~N82s{#{l<^0v{F=ArW@Qe)wGh&q zUXT@ObyYS}anD$&p%6?#j+r%oA6Q~*#(eH}mTBI~wVgr<&#(j)OxM<96DR5Q>FsUz zkG2JJa3$6%Zf19En|0=x+vrD0FC~?8*y#3Q)G}pGgDxPo2qLH2kSzsY_`;!K*FH#Q zJQST`B7EWDzEC5tS?-x1wjH zvpI;FQ7TH`Q5BPg)OL*8f=w6g1%Wbu2p~*nl=6CyR`BwOK%*xb*qvSu|Ku;u`(^{1 zxLOL~y_r5{itSt&oD&Ebod1r)mVcA={|#wqW~{g_giV9{TLUX?dJcrcZ^3HQ;mlYp z92x`(TrDzG+?!E4dl_qPH#t4(upnM(Hr}L7u03`?m$uxePKJ_2H7{=ciGj{_ZERM4 z@;;p5XuGL6X`EWcEl|1?*sO@?ghuSqgiwvUvYU#zCh zy+==;K5#`|e@x_p60U>>^(E;AXA@~1+y`@~({ZZ~RaSAITMyh`c#S~Yq{b|LCUu(U ze@ux)`)>#X?FPTl4JR$Uw}Jix~Q$5m&Yw|f)6$Ufem8Z>k$XuIkavsUS? z3JQ$z{_hy?B8&Cr*cl{V{&`7{V(rSg)_42P@*YEC`T~&{E)yBI4AOJ z!NdWHSCqHBAcFr*#&IKk=W~++!!JTHrd+R7_V0;tnYhhQrn+S#CpWvZ3Fw1-uAm)N z^Pr8y61a@Tp)czglY*RrltQfeVu56p0a|Ly?Sbi%8XQfb}1M`)O-K@Z)H{j?x6X$VL5 zCyi+hi2cAZqs7^V@QwYhv)t0YLI}5k)M(M6c){r!1rHV*U~`&bDDo(k|EUvsd4S1I7(iU%v5Pha^P=4GwR literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog-members.html new file mode 100644 index 0000000000..1fc701c511 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog-members.html @@ -0,0 +1,97 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.IWatchdog Member List
+
+ + + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html new file mode 100644 index 0000000000..f765a0db63 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html @@ -0,0 +1,496 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.IWatchdog Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.IWatchdog Interface Reference
+
+
+ +

Runs and monitors the twin server controllers + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Watchdog.IWatchdog:
+
+
+ + +IHostedService +IDisposable +Tgstation.Server.Host.Components.IEventConsumer +Tgstation.Server.Host.Components.Watchdog.WatchdogBase +Tgstation.Server.Host.Components.Watchdog.BasicWatchdog +Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog + +
+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Task Launch (CancellationToken cancellationToken)
 Start the IWatchdog More...
 
Task ChangeSettings (DreamDaemonLaunchParameters launchParameters, CancellationToken cancellationToken)
 Changes the ActiveLaunchParameters. If currently Running triggers a graceful restart More...
 
Task Restart (bool graceful, CancellationToken cancellationToken)
 Restarts the watchdog More...
 
Task Terminate (bool graceful, CancellationToken cancellationToken)
 Stops the watchdog More...
 
Task ResetRebootState (CancellationToken cancellationToken)
 Cancels pending graceful actions More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Components.IEventConsumer
Task< bool > HandleEvent (EventType eventType, IEnumerable< string > parameters, CancellationToken cancellationToken)
 Handle a given eventType More...
 
+ + + + + + + + + + + + + + + + + + + +

+Properties

bool Running [get]
 If the watchdog is running More...
 
bool AlphaIsActive [get]
 If the alpha server is the active server More...
 
Models.CompileJob ActiveCompileJob [get]
 The CompileJob currently running on the server More...
 
DreamDaemonLaunchParameters ActiveLaunchParameters [get]
 The DreamDaemonLaunchParameters the active server is using More...
 
DreamDaemonLaunchParameters LastLaunchParameters [get]
 The DreamDaemonLaunchParameters to be applied More...
 
RebootStateRebootState [get]
 The Components.Watchdog.RebootState of the active server More...
 
+

Detailed Description

+

Runs and monitors the twin server controllers

+ +

Definition at line 12 of file IWatchdog.cs.

+

Member Function Documentation

+ +

◆ ChangeSettings()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Watchdog.IWatchdog.ChangeSettings (DreamDaemonLaunchParameters launchParameters,
CancellationToken cancellationToken 
)
+
+ +

Changes the ActiveLaunchParameters. If currently Running triggers a graceful restart

+
Parameters
+ + + +
launchParametersThe new DreamDaemonLaunchParameters. May be modified
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.WatchdogBase.

+ +
+
+ +

◆ Launch()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.Watchdog.IWatchdog.Launch (CancellationToken cancellationToken)
+
+ +

Start the IWatchdog

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.WatchdogBase.

+ +
+
+ +

◆ ResetRebootState()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Components.Watchdog.IWatchdog.ResetRebootState (CancellationToken cancellationToken)
+
+ +

Cancels pending graceful actions

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.WatchdogBase.

+ +
+
+ +

◆ Restart()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Watchdog.IWatchdog.Restart (bool graceful,
CancellationToken cancellationToken 
)
+
+ +

Restarts the watchdog

+
Parameters
+ + + +
gracefulIf true the restart will be delayed until a reboot is detected in the active server's DMAPI and this function will retrun immediately
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.WatchdogBase.

+ +
+
+ +

◆ Terminate()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Components.Watchdog.IWatchdog.Terminate (bool graceful,
CancellationToken cancellationToken 
)
+
+ +

Stops the watchdog

+
Parameters
+ + + +
gracefulIf true the termination will be delayed until a reboot is detected in the active server's DMAPI and this function will return immediately
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.WatchdogBase.

+ +

Referenced by Tgstation.Server.Host.Controllers.DreamDaemonController.Delete().

+ +
+
+

Property Documentation

+ +

◆ ActiveCompileJob

+ +
+
+ + + + + +
+ + + + +
Models.CompileJob Tgstation.Server.Host.Components.Watchdog.IWatchdog.ActiveCompileJob
+
+get
+
+
+ +

◆ ActiveLaunchParameters

+ +
+
+ + + + + +
+ + + + +
DreamDaemonLaunchParameters Tgstation.Server.Host.Components.Watchdog.IWatchdog.ActiveLaunchParameters
+
+get
+
+ +

The DreamDaemonLaunchParameters the active server is using

+ +

Definition at line 32 of file IWatchdog.cs.

+
32 { get; }
+
+
+ +

◆ AlphaIsActive

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.IWatchdog.AlphaIsActive
+
+get
+
+ +

If the alpha server is the active server

+ +

Definition at line 22 of file IWatchdog.cs.

+
22 { get; }
+
+
+ +

◆ LastLaunchParameters

+ +
+
+ + + + + +
+ + + + +
DreamDaemonLaunchParameters Tgstation.Server.Host.Components.Watchdog.IWatchdog.LastLaunchParameters
+
+get
+
+ +

The DreamDaemonLaunchParameters to be applied

+ +

Definition at line 37 of file IWatchdog.cs.

+
37 { get; }
+
+
+ +

◆ RebootState

+ +
+
+ + + + + +
+ + + + +
RebootState? Tgstation.Server.Host.Components.Watchdog.IWatchdog.RebootState
+
+get
+
+ +

The Components.Watchdog.RebootState of the active server

+ +

Definition at line 42 of file IWatchdog.cs.

+
42 { get; }
+
+
+ +

◆ Running

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Components.Watchdog.IWatchdog.Running
+
+get
+
+
+
The documentation for this interface was generated from the following file:
    +
  • src/Tgstation.Server.Host/Components/Watchdog/IWatchdog.cs
  • +
+
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.png new file mode 100644 index 0000000000000000000000000000000000000000..28aa0003d5eb06b213e1d9958b0fff95b6d58579 GIT binary patch literal 4253 zcmcIo2~?BUw#G+5BPw1&WD@K(48DT!m_(+CiV$T|R8SD2BA|egc?d})h`bgA3`i^~ zQ?XJ@A)#0%ArMe01wpEiAVW~V2nmycgph>X^M`te)vk5#yLY{;^(W_F=bU}^Ip_QK zw|Bnq_H^C4S$ngBg2Gmm+tE`B3NQv}w{21c-*#HJz5qX(-tMPeWHK3Oe&8*~<+SI5 zmi%dJYg77SL?66viaq7&qW}g$pMhUaTPP@OH$feBKApH>c9a`W>Cu3-ovJNh%kFwb zj5fGEk0$ZAM%m}@-o8Z<8_%U)Eqqw`@TxX(xX;SN$K#dN*0S`kzaLacI2($ z#0~UB$9APiB{y<;qY*VrRc|%r{Prf80l!+_~{M4XZa=$CX{bV@as2{5*s} z3ij^wqG3^buOmeLD^n{f@H)I=N%J@1UGnpE-7(ZWmW#}+dH80p5xaQJf z+KOg!@sems3yjk8kn5jRfc9c8OI}K`5{7A@7cKJW3oOrRFhcJMye?3y+hrkbN5pdR zdo61$HV54FZGkF+HE~uV$#g_L7j&vcQ1$>H_;D?M177x1I`F#Ls-c=VqNC=@MWSQM z*s>3z>+@_fS~XC*tb@KQq^u%WuAd;)=-M(0mPHR7nHx#Li3AIV24*}RHeAi!h!TYT z+*!5o;8Y(yLJz@eTF7if>c8*j%WlEM%j28_F>A6E*~jTCLcw_sCUNm1DQmhE9*-5( zuYN5vxhAOLFV5Fpb2aM>a-)fpi%chS5~2xvRlpA4z2p={AH>?cG;uzgQO~#S`-ms! zME8Z(IwfJL;=Mt|u^K`AGSZ}Vnvow#V!Y9vh8VJSw=n4PmGrk~EyZUCJ~H$pWt9W$ zE3RHnPa;@)&=4ZaLNv-E8+2^>(6{q_toF>56@&DEH0ibCyTb&vw(p7i{<*H)<2-gnSg*RZWv-A#n(D;>=hczH9Q6mHp_|Sq`Vj8jLvAKDvhVt|N0{l6Q(_o_Ae(Czs80hiFa zRU08wfZFESgNl$TXeC$f2B;Iv%qm~L33dLX8xvuUe`IzHd}d~6XRAInW_`T9y=eo- zQi(+3L>ST8*_jb##V9Q;9k(q+gRUF89_Gfz#^dUpwT?pbNHSeKT;ANW{%*X}VNy zP*M`Vu{8hktm5X)0^Cobo*ez2I`JG;=BRfS`zMEJr%2q#NEui0VvXs3EW0szVS5R^ zp!*137|oJ9hBI605xmYA%@hlwB;mpp2S%XgrpzkHby+@HjTdWIzkszj!x!Zg4~r-I zF0Js5=JiK?#_?fap_!`H46E)|QRMaQt{+Z(MB(}uMWDD>^`A{33sLQ)L;w5ZxN}SKA2I^wX4>XtooI=3-H$8mSg>cN;f#ZrC$7 zQaM?}xto6gi-il)yD!SIAZRH>&r4VOzh(wix z34ec`@Xn8m3lA8P}U z&&S#o&4A~&0>Cbkp#wmuu6tMx=xr0TReypY?Ya)>j+LG0J96Cr?>g>Le3gG2_x~nc z{8@8k(tE=f_4%jIXVc)$+2~^Kyl9nIt*|rq+oUV zK;b!JQ7;k|GK>>4WoJuXRG%Q>IIjkc*n(CkZ_=~61|E(x!#Lv5{62w-TX;_jUWWv( z0Im9D^`fFtBSycob+Dzxh@}Fh6fztU7e2Rc`CFKMQSSu_mw9!Oo3b?WR-d4O!>&zA z%dy)>R87@*tBkm%E2jf6Q672Ru0FwjwUpe$-J(8fpvOe?Vgj|rfW>3X`KA>k^+RxGo4=Lp9cj4C<*!m7n;6S^F_v<;n}R$DXvl6B2;S*6S0a*rfTDqz zejhD#Xz1*=>kWA!>X%g@KIf0}lk|~Zm>PFlXMKtwRAc9Sqwp@S(*2D)kI|9Bf72cF zLahm!On9mSx9R>ie8%Af%|$Kfc|%}BR>rvuv+Ik=#K>ALg&yvv76=o-&EE5Te~lcjW62qiARH4Y~;PG7B=hv8$dMDGx_f1Pgm)?K_ybXyaNH zdEnE!UwiIVV#z-9AaGI%oHy$mI7Ku-8FU4$`}RkW`$KI0CcH2pL@V$yAWo&@+t<}e z6N6dj>6egwb=~Jwh45RDh&iu|m|J1ce=1@t8$M}eq}6X)3FOw>d*P^#5>R8HTWXQ& zkXS1zc|AS}iLSc3L;o>Iu>XGt5jy`y@t5uHppw|M`Iseiz6$R_igXX57)E5|LIuQ^ zPwTm{fe=muX2}aNTGE zL5f)(;x!?L5p;$89DXe%(!ttd(jA~pNY^#Ou z*At767@N_s-Ee0UXezJpJG7QEocqMR;N)Nj}y^t$rw8}|sYIa&0Ak}^PM z>)D}foKDb6F5L3};FOrBygdIFhucSusg>yx$>htLMCgrG18T zWYlE}Up)+p{rTG@4G(^4(qQ<^PgL2|;gM{b_RKvPc4-?v2JDaJLDToYwb5%W_7a5> zkV7DB^Dx)^mAoTjF-~@vZ&G*(7dGtB9qYH%N?agq&ahE*^lyMNfs)>fc_wD6MF^b| z16JSucE@z`PS%}4GX!hbd&q%VBNlci@_4c|Zq@dNee&@iZ#cz@f)~#?ARn(3&@V){ zJe%ST9jdi%vTH8tOe&x}Eb_p`fF!FvH6*5Co1H!X3E19VFEw80uD2h@s(ttCUDgU3 zK9~})gdKo@>g4gah}4>x=d1REi(52%tq%jRw|Cf!Cf?;sk_gvU1J>Rt&To}kG0xwT z?O}w(K+F)RnN+-TYvB|8+6jxP3Agcu0E~oObnQVa2HFi&FQ5_^af?AMa+)MD`W;99 pRbu^C?;lpN1hvDSl~9T5<+3@~YQ&Y7;J*X~l#A!l>ceQ_UjX-J{9yn9 literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog_factory-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog_factory-members.html new file mode 100644 index 0000000000..543b28070d --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog_factory-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Components.Watchdog.IWatchdogFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Components.Watchdog.IWatchdogFactory, including all inherited members.

+ + +
CreateWatchdog(IChat chat, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IEventConsumer eventConsumer, ISessionControllerFactory sessionControllerFactory, Api.Models.Instance instance, DreamDaemonSettings settings)Tgstation.Server.Host.Components.Watchdog.IWatchdogFactory
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog_factory.html b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog_factory.html new file mode 100644 index 0000000000..79af67e43c --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog_factory.html @@ -0,0 +1,189 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.IWatchdogFactory Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.IWatchdogFactory Interface Reference
+
+
+ +

For creating IWatchdogs + More...

+
+Inheritance diagram for Tgstation.Server.Host.Components.Watchdog.IWatchdogFactory:
+
+
+ + +Tgstation.Server.Host.Components.Watchdog.WatchdogFactory + +
+ + + + + +

+Public Member Functions

IWatchdog CreateWatchdog (IChat chat, IDmbFactory dmbFactory, IReattachInfoHandler reattachInfoHandler, IEventConsumer eventConsumer, ISessionControllerFactory sessionControllerFactory, Api.Models.Instance instance, DreamDaemonSettings settings)
 Creates a IWatchdog More...
 
+

Detailed Description

+

For creating IWatchdogs

+ +

Definition at line 10 of file IWatchdogFactory.cs.

+

Member Function Documentation

+ +

◆ CreateWatchdog()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IWatchdog Tgstation.Server.Host.Components.Watchdog.IWatchdogFactory.CreateWatchdog (IChat chat,
IDmbFactory dmbFactory,
IReattachInfoHandler reattachInfoHandler,
IEventConsumer eventConsumer,
ISessionControllerFactory sessionControllerFactory,
Api.Models.Instance instance,
DreamDaemonSettings settings 
)
+
+ +

Creates a IWatchdog

+
Parameters
+ + + + + + + + +
chatThe IChat for the IWatchdog
dmbFactoryThe IDmbFactory for the IWatchdog with
reattachInfoHandlerThe IReattachInfoHandler for the IWatchdog
eventConsumerThe IEventConsumer for the IWatchdog
sessionControllerFactoryThe ISessionControllerFactory for the IWatchdog
instanceThe Instance for the IWatchdog
settingsThe initial DreamDaemonSettings for the IWatchdog
+
+
+
Returns
A new IWatchdog
+ +

Implemented in Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.

+ +

Referenced by Tgstation.Server.Host.Components.InstanceFactory.CreateInstance().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog_factory.png b/interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..1e396ce86d82bec9259bbb78f8202a551d0fbfc9 GIT binary patch literal 1282 zcmeAS@N?(olHy`uVBq!ia0y~yU@QZ&12~w0q!rV;6F^ELz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-ope__Hu&A%!a`)LT z=1f>tDz`vC`tR39hTxvJ%Y#fKk6d{yR(aHJ@%HvJbH8o8T;jE0YW45z9eo?;OK=!G z^-o}zC}H}Yd;Z<$e@7DR7jr*abocGAlqK(e%T!0VSh6Z#;HzPr^QZQ1T>o56HE;Q4cYde8tGA6P6HfEF zll01Tcf$MN-Gw3tvgNDUH!r$%IB(h8OI?|>=6o|dTKVSizpc;LJigXm$M{>adVWgZ z26KtxH|?Is9u`eMleV!I$b9xP^Zw46cRw6XtziA_`dj6s&%2uXUcD#ZEX$gUC#Cci z?Up~W{Ni)ZXOiDCt>lV)E^a@>kg%<}*8`9|$Un@jwArB^I| zIqSHET;REP*}Sy{yA6IBSDn45KGT%9?2n8@_ulhY8S0%BH}0`K`TASzn}0i5e)!hf zOfwg+Id#v9Z+Y!r5r%rl`TWn$vd-U7E}QPjroj5aP_?X~02$xiFg?g?)s!G6)(`Pt zStl@cge0+dT)Q4##Lf{0V)a%Pv3Gr9$5 zX^DkunI~6x()1-jXG0meH%>qH4+;mSy|aJA>Lq+8nOt5x`~9A)@$w#%G>?4?UO7uA z=~d-*Yv=99vu)lc?|->wQq<1v``cbi{O)X2nfdAW4b{vGmT$J_?)Lv%yzlJs#a{)l zZQK4gvG&UKzHKLy*4tmX`1aQ;5mCptd%~lc=PcO#@q3>5v8;WsWECvdFEl#7Pj8{V zR@Tzj0p%xMa&)36AGG7i+?GE(DfUv%vxV2#Q`GOj%s*Ul`SrG%58tNMzR4Br?Yz%i zY@<3g@ZYJt^~cYN*nPP+`IcJF-g7L@Ef%TsUb6y|%*SD%^wVwvR4r{B8oJ>U6P^V_$O>&qY9 zOOPx0{%HI4+w=D9J1KMO?4`YCc? + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.IApplication Member List
+
+ + + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_application.html b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_application.html new file mode 100644 index 0000000000..59b8e52d29 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_application.html @@ -0,0 +1,238 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.IApplication Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.IApplication Interface Reference
+
+
+ +

Configures the ASP.NET Core web application + More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.IApplication:
+
+
+ + +Tgstation.Server.Host.Core.Application + +
+ + + + + +

+Public Member Functions

void Ready (Exception initializationError)
 Mark the IApplication as ready to run More...
 
+ + + + + + + + + + +

+Properties

string VersionPrefix [get]
 Prefix to VersionString More...
 
string VersionString [get]
 A more verbose version of Version More...
 
Version Version [get]
 The version of the Application More...
 
+

Detailed Description

+

Configures the ASP.NET Core web application

+ +

Definition at line 8 of file IApplication.cs.

+

Member Function Documentation

+ +

◆ Ready()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.Core.IApplication.Ready (Exception initializationError)
+
+ +

Mark the IApplication as ready to run

+
Parameters
+ + +
initializationErrorThe Exception that put the application in a corrupted state if any
+
+
+ +

Implemented in Tgstation.Server.Host.Core.Application.

+ +
+
+

Property Documentation

+ +

◆ Version

+ + + +

◆ VersionPrefix

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Core.IApplication.VersionPrefix
+
+get
+
+
+ +

◆ VersionString

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Core.IApplication.VersionString
+
+get
+
+ +

A more verbose version of Version

+ +

Definition at line 18 of file IApplication.cs.

+
18 { get; }
+

Referenced by Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.IrcProvider().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_application.png b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_application.png new file mode 100644 index 0000000000000000000000000000000000000000..b0a8a62fb0509113ff1467d0ccba4fe0a060ca81 GIT binary patch literal 921 zcmeAS@N?(olHy`uVBq!ia0vp^Z-6*}gBeKbvSw-kDTx4|5ZC|z{{xvX-h3_XKQsZz z0^q8SL)d@w}t<4a?j`KQ-XGNdoX;z(84MaC@hxXl6oU%UBjhQuRm+@dF|#< zxU`Kw;r73}9F4d;pVvHJYk9Nm&Os)VsNd@^${n63ajUJFb1nmeNmj!4{)^gYve$f{ zU;h5r?mjd2$!GU2-=W7pn|)KMeAwnyGTXLp$=(0|vswS%uNz*+cr2T!an|R=#+#Bx z4TTHOXl&^96yI`f!fQQeS#!@RVU^Mc#NIr>&uVndv*_`Yf zmf!n#bZ&2=tjmOB?&W4CPrhruuCGY{y#d18Qb>#3@LWK5~UUUu5VUW%qjPj z6*j*o+paq%n{R!8UG{z7hWNm_KN+rv9KLpx{lV!kmJy#7*?+jz3Wz0y_(n7cnkF*3 zU3twtC&=r&zybXij0NI%Ilq0}A^3J~!u&Pg7w#2(v*s8>a@HZHo)w(j28+~m4s^`g zz@SV};D6ZZO*;SM`%@#Q{nr!o+|{nOMx}QJr?#hZR=e+ed(UN4uRjkqoyI=Pb&|+S z+qLud?4K{y<)*xS*ScMkbC+90cxG++7QfiG&DM0vqKkeEDw+Y@zkA-lekl6P^xE(9 zyUYK^y3cMtsfQd-r{un+rQNRn|D0EDr__OUmzSo@n&f3HT$EGR#*?r|! + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.IAsyncDelayer Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.IAsyncDelayer, including all inherited members.

+ + +
Delay(TimeSpan timeSpan, CancellationToken cancellationToken)Tgstation.Server.Host.Core.IAsyncDelayer
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_async_delayer.html b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_async_delayer.html new file mode 100644 index 0000000000..22523013ec --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_async_delayer.html @@ -0,0 +1,154 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.IAsyncDelayer Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.IAsyncDelayer Interface Reference
+
+
+ +

For waiting asynchronously + More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.IAsyncDelayer:
+
+
+ + +Tgstation.Server.Host.Core.AsyncDelayer + +
+ + + + + +

+Public Member Functions

Task Delay (TimeSpan timeSpan, CancellationToken cancellationToken)
 Create a Task that completes after a given timeSpan More...
 
+

Detailed Description

+

For waiting asynchronously

+ +

Definition at line 10 of file IAsyncDelayer.cs.

+

Member Function Documentation

+ +

◆ Delay()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Core.IAsyncDelayer.Delay (TimeSpan timeSpan,
CancellationToken cancellationToken 
)
+
+ +

Create a Task that completes after a given timeSpan

+
Parameters
+ + + +
timeSpanThe TimeSpan that must elapse
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Core.AsyncDelayer.

+ +

Referenced by Tgstation.Server.Host.Core.SetupWizard.CheckRunWizard(), Tgstation.Server.Host.Security.TokenFactory.CreateToken(), Tgstation.Server.Host.Security.IdentityCacheObject.IdentityCacheObject(), Tgstation.Server.Host.Components.Chat.Chat.MonitorMessages(), Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.Run(), and Tgstation.Server.Host.Core.SetupWizard.SaveConfiguration().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_async_delayer.png b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_async_delayer.png new file mode 100644 index 0000000000000000000000000000000000000000..11ec76c124d8887c35e3408fe2be040d99455800 GIT binary patch literal 972 zcmeAS@N?(olHy`uVBq!ia0vp^|A07vgBeKj#aa9XQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;Sj=~ z{mby{)%oXbkB&0986W=2B+Ae*@gRGF)v@@;_Q&@de5t8@nz`+h-M`PlKc*j1p8WT@ zVbveG{Me7Pb{-coPWgDdJMFGo)LN;fTc+)57xeBv^J~VtMGJKPJrwEMrP1TQ(T{UWJQtg%w0(_|ezU>s_lN%>0etswNIu)cJGFty=TiT&-8wNXbGU1sr_N2X zPiX4;C>p|D+4^6n=~nIE1uJ-8I!o(K`>}Z9%;Vb%PHp|T&}c0~(}JWwm(SX_u07v$ zsDIY%*t%^$WBH3^pNQ1!{We(%GG%0qH9d1k(vX?v%ckEi!{W^GBt+ro`=<3rt!OV)eG|L$Y13C(Yl^qc?j z`8Ku>vwyMdU0;{Kjlq6R|AqG1@(P`1b`D{=H4STaJ)R!q6~$N+Y~HZvRB!$6rO(dy z)-OMQX1+{)d0oSvTR#xtfAtvqiB-M)6GEls6;{Laqbc|?D{Jl7?p;@-UVnEH6+F4B zS6^vTsC2xG%4(~+%0HbQyN*5nn^$!`ZilOq(nPt-&rbgRdFjH^*^&=hca(hnThgqr z^r)m~|FQbM`pgwEyJq_S5&vh~SZ`imX*20&z1-sC?>}A>UC;V+MpBzjUG>E^w_R3; z?wWPi$K0MNGcl6=^4xxn1NL*eL`pp;7Ovz}mU`=;|I(T5{!Ek1FKurs1Uiad$o{Bb zT%own&{U_&Sc}osMeU{gnad(H`2Y>VbBHQe^x$Lv@%6{H_)_-e;-e1XoG2dKW{#SoX zuGwvV`0Z{RU<7WrE)n@R<7}MspYB($&)u*7d@-@vZI#{iy(_c4lTXYk-P~J!r*UE7 zdU1F4tMf!}{|t>RnPB|STHZ%+;`&!-CB!ew{=0L{#icG_{zCp$_OsS@oale${N>{_ nalw-d5uy9;$JT4J!u~VZ<(sm$m%ZQsW<3T^S3j3^P6 + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.IDBConnectionFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.IDBConnectionFactory, including all inherited members.

+ + +
CreateConnection(string connectionString, DatabaseType databaseType)Tgstation.Server.Host.Core.IDBConnectionFactory
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_d_b_connection_factory.html b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_d_b_connection_factory.html new file mode 100644 index 0000000000..f344aa5d2c --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_d_b_connection_factory.html @@ -0,0 +1,154 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.IDBConnectionFactory Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.IDBConnectionFactory Interface Reference
+
+
+ +

For creating DbConnection + More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.IDBConnectionFactory:
+
+
+ + +Tgstation.Server.Host.Core.DBConnectionFactory + +
+ + + + + +

+Public Member Functions

DbConnection CreateConnection (string connectionString, DatabaseType databaseType)
 Create a DbConnection More...
 
+

Detailed Description

+

For creating DbConnection

+ +

Definition at line 9 of file IDBConnectionFactory.cs.

+

Member Function Documentation

+ +

◆ CreateConnection()

+ +
+
+ + + + + + + + + + + + + + + + + + +
DbConnection Tgstation.Server.Host.Core.IDBConnectionFactory.CreateConnection (string connectionString,
DatabaseType databaseType 
)
+
+ +

Create a DbConnection

+
Parameters
+ + + +
connectionStringThe DbConnection.ConnectionString
databaseTypeThe DatabaseType to create
+
+
+
Returns
A new DbConnection
+ +

Implemented in Tgstation.Server.Host.Core.DBConnectionFactory.

+ +

Referenced by Tgstation.Server.Host.Core.SetupWizard.ConfigureDatabase().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_d_b_connection_factory.png b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_d_b_connection_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..75f5ebabc24087f0a56146edd785e1cb38bd2627 GIT binary patch literal 1155 zcmeAS@N?(olHy`uVBq!ia0y~yVAKM#12~w0v-d_YPfz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opaeh@#LwbdFXz~x!n|C{Yttncaux?ea>XcApLF>?ci*!P_GM)*|6;CifqBrv| zSN!T*`VRK8|DC74u2`Nmt$tfhPRQKvt9EKFPuRpzUVU}T;*(5s!VX+!iaAn$Z}qoT zIjn0;U&R{buzu`5BC2;gc=yw9YQc=roij?WoO^ri(zT`a=^E+>Ir zW3PX`{$SD)mr382XnAr?T&1GvvTD*2ft6m9oI*mM{+pZvN;9wL+48qdSIInfcTIlG z`tPz=A4E<0|K;hzr#U-T8}>z-ZYy4;lKFryep26?P+6;0{l|qpZy9HAol)T#Ww5Gh zWu5ycYteVWB-6L)T)S`A?_ZZM-2b#HtLaLxwdS+6X79INO8Z$gsWZR-%+m+FKj@{#*W6U%9>BRWh+(_HF3T8BuTAAH0?MqMHtk>8h;w^Qx=$q{R6TiR z!&;X!R$0$Wb+@^`jF-sjtTp4j7kVJ-dkpKBsW(@?n&Wxt`sU!P`8Owh*&8989JWgTe~DWM4f DqyQXb literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_database_context_factory-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_database_context_factory-members.html new file mode 100644 index 0000000000..9585d9da76 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_database_context_factory-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.IDatabaseContextFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.IDatabaseContextFactory, including all inherited members.

+ + +
UseContext(Func< IDatabaseContext, Task > operation)Tgstation.Server.Host.Core.IDatabaseContextFactory
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_database_context_factory.html b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_database_context_factory.html new file mode 100644 index 0000000000..af719943e0 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_database_context_factory.html @@ -0,0 +1,143 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.IDatabaseContextFactory Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.IDatabaseContextFactory Interface Reference
+
+
+ +

Factory for scoping usage of IDatabaseContexts. Meant for use by Components + More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.IDatabaseContextFactory:
+
+
+ + +Tgstation.Server.Host.Core.DatabaseContextFactory + +
+ + + + + +

+Public Member Functions

Task UseContext (Func< IDatabaseContext, Task > operation)
 Run an operation in the scope of an IDatabaseContext More...
 
+

Detailed Description

+

Factory for scoping usage of IDatabaseContexts. Meant for use by Components

+ +

Definition at line 10 of file IDatabaseContextFactory.cs.

+

Member Function Documentation

+ +

◆ UseContext()

+ + +
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_database_context_factory.png b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_database_context_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..c162458c40f830db95ff3b5f3f49c7ae61f48f70 GIT binary patch literal 1216 zcmeAS@N?(olHy`uVBq!ia0y~yV6*_T12~w0i(^Oy(4$BF}tDj^RTgkC+U zTFH<$yFNbO@IkGR!;4Y`m1?_D_m>vX}qVup=QyASFq{eSN>yJPp}`qT$+{`cLn z-4W08wb@vCAG7%F-UEy|RSfT3|2}`p{;!hh@yBbyTJ9Q2fy;)-L*U+ z?W};ryxyOm4ZkJ7Ip=@xUG)k>gQlX-DUnBZiZxiXI~n&L%Sm&1Zu94*!Lr4BPdDE7 z*~NT=ckP2aHTx5#Ht)2!)wXVNu7*qZ8|zyKem>rNqu17J!P`yscXg{a9$`9nzHj>z z&vz3g8@MaiglA;b-VWqA_u$33xW?ksv!0a1IvzQzs&~*g{#wY}v^Sn#tUgqp3F$ew z^J4VWT`cBzI}hGn_Uh3Gp%?%3cCeMtUlpyo!}IFPNqweg>>Vj>n`nXE2DMg2F|1x9g@u*p`)uCIw&+tU1 z^_G`&_Ue8$5B9K^@!eZiru%AVN%{GR_m6W!W1Vi?3-hjFp3-nr@8DW-dk4*qmAa48 z0@*YeH}5P8ox>ov8X7xV1q_^`77Z10-HyI=N&VoLKo37NSKv`O;sOACx^__$TzQb>HJ3iyuu` zGD*cYuyOK|7Opuesv!?lG#4_ddvfv?y!|^l<<_6yRnhyt^50hR?D`_NjZg0Xd)~FP zi>)UwiCB0sfqUZT@5^$J+|?~ieGE%iYv=E07MJcl;CX3T`h&O!^>KAS=C>Qjy}$Rl zvhFU^v%mk1FO*jn{B_>`&T&ShG1s({pAF5Ddw_}R1td`wCr2LnDcWp(-0Q4~>De^4 zl5>Zb@+HqpdSA3JU+pgAo3?f8zwfTfG!u8feW7%V?fi_1rPhW!GBe**-JW3U>zO~VrL970EJFdR4x*oDHzW7%-C{ZbuOj8CXDxR5FL5b?$ zFGJP~;oD2ERm_jH{&xAkkK*3~lcTpJx2|};>#lk7-u~^OSFhKx=P7D + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.IGitHubClientFactory Member List
+
+ + + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_git_hub_client_factory.html b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_git_hub_client_factory.html new file mode 100644 index 0000000000..c5961322f3 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_git_hub_client_factory.html @@ -0,0 +1,168 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.IGitHubClientFactory Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.IGitHubClientFactory Interface Reference
+
+
+ +

For creating IGitHubClients + More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.IGitHubClientFactory:
+
+
+ + +Tgstation.Server.Host.Core.GitHubClientFactory + +
+ + + + + + + + +

+Public Member Functions

IGitHubClient CreateClient ()
 Create a client with anonymous authentication. Low rate limit More...
 
IGitHubClient CreateClient (string accessToken)
 Create a client with authentication using a personal access token More...
 
+

Detailed Description

+

For creating IGitHubClients

+ +

Definition at line 8 of file IGitHubClientFactory.cs.

+

Member Function Documentation

+ +

◆ CreateClient() [1/2]

+ +
+
+ + + + + + + +
IGitHubClient Tgstation.Server.Host.Core.IGitHubClientFactory.CreateClient ()
+
+ +

Create a client with anonymous authentication. Low rate limit

+
Returns
A new IGitHubClient
+ +

Implemented in Tgstation.Server.Host.Core.GitHubClientFactory.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess(), and Tgstation.Server.Host.Controllers.RepositoryController.Update().

+ +
+
+ +

◆ CreateClient() [2/2]

+ +
+
+ + + + + + + + +
IGitHubClient Tgstation.Server.Host.Core.IGitHubClientFactory.CreateClient (string accessToken)
+
+ +

Create a client with authentication using a personal access token

+
Parameters
+ + +
accessTokenThe GitHub personal access token
+
+
+
Returns
A new IGitHubClient
+ +

Implemented in Tgstation.Server.Host.Core.GitHubClientFactory.

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_git_hub_client_factory.png b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_git_hub_client_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..2e9a02f149f8c65b625d4df39bd7630206a4337f GIT binary patch literal 1143 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y^412~w0r1*!%A|NFZ;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O0Ct93?@1!3;n}AaM0mh!Fz=3!A5lV@L(#+qoC}9vg7D_UAA8_g_7K z`N~{{3G1F^F4=TyZmx{1+qJ ztmiHUB~KrJI&MAnOqb%#+M2z~q~m|YY%*_r$|oZcelz^~!!BJW`Te)j4*&K%bG7DM zL#F+^3O0ez&xV1~^NsBCqJsnTG)~Hg^IOiB_4b&dQ(t5^F)`z@>ioB*=bmrd=M2b!)t^6pcT zd(E4_sk7>K?62Y7k$pVsmh-y%Gk#}(|8?fVzrAtd0@>&8#Gek>vHy=z@)=esr4KbZ zM$9#vz3euAXR4Wh=B-TTo7emgte@(&9b*hw`IF&FmL0>^S^N%bpD_o#KAGNQ7?s>J zk@JE6OU4UK9>Cb~vX$fISP=A?QRC~8%MA=%z{s*Tm2HSZi$5xI>-)|Z${d%!^w^^B zF@LA?q^L<#R{Zn`TKi1dbL*^rm8)5HlR~mTN3c+NbRS@@~y zf69x$e@j$ub%hy~*B_fCvHHNepT%>hTPU2gTmSJtbIJMVlNCSzZ96|_s^qHvh)GQ^Lub4_urhw&tI-_-oReIZ@>C4XmVKrOfGNsp8u5U`sY{vvfkvxyLV5oVb}9| zUw7`gX}Hw0ix=w7v~(7?+9sE+)1P*I#+iw?PAppZ z3t)1IxwPZdzFmCbIf6faT-BDo=byCt*=Ba1--YSMDz0}w0n^KNV0uZ1rWYY#dg+Uu z^VI*Gx)D$Ao+q1|wSV5Z7T%$qlDFdFr1Q14KaGFL&X4f*tX18a_v?!OZ~t@0kIubv zJ@&sR@6oFpC!W#atX*92egCiX?snh)8P(d~iQmU|XKS+VTgB`7XZ~)ju1(YU7w51> zx42$c`{BP&r+W;=Qw#ndQg4{Fa6=D oJCwMn`efPnI79Y$VahM|&O6pSV_$f60ZR!6Pgg&ebxsLQ0L;fa%>V!Z literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager-members.html new file mode 100644 index 0000000000..6ac5a4b0d8 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager-members.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.IJobManager Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.IJobManager, including all inherited members.

+ + + + + +
CancelJob(Job job, User user, bool blocking, CancellationToken cancellationToken)Tgstation.Server.Host.Core.IJobManager
JobProgress(Job job)Tgstation.Server.Host.Core.IJobManager
RegisterOperation(Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)Tgstation.Server.Host.Core.IJobManager
WaitForJobCompletion(Job job, User canceller, CancellationToken jobCancellationToken, CancellationToken cancellationToken)Tgstation.Server.Host.Core.IJobManager
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager.html b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager.html new file mode 100644 index 0000000000..94f84f4980 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager.html @@ -0,0 +1,314 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.IJobManager Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.IJobManager Interface Reference
+
+
+ +

Manages the runtime of Jobs + More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.IJobManager:
+
+
+ + +IHostedService +Tgstation.Server.Host.Core.JobManager + +
+ + + + + + + + + + + + + + +

+Public Member Functions

int? JobProgress (Job job)
 Get the Api.Models.Job.Progress for a job More...
 
Task RegisterOperation (Job job, Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation, CancellationToken cancellationToken)
 Registers a given Job and begins running it More...
 
Task WaitForJobCompletion (Job job, User canceller, CancellationToken jobCancellationToken, CancellationToken cancellationToken)
 Wait for a given job to complete More...
 
Task< bool > CancelJob (Job job, User user, bool blocking, CancellationToken cancellationToken)
 Cancels a give job More...
 
+

Detailed Description

+

Manages the runtime of Jobs

+ +

Definition at line 12 of file IJobManager.cs.

+

Member Function Documentation

+ +

◆ CancelJob()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task<bool> Tgstation.Server.Host.Core.IJobManager.CancelJob (Job job,
User user,
bool blocking,
CancellationToken cancellationToken 
)
+
+ +

Cancels a give job

+
Parameters
+ + + + + +
jobThe Job to cancel
userThe User who cancelled the job
blockingIf the operation should wait until the job exits before completing
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in true if the job was cancelled, false if it couldn't be found
+ +

Implemented in Tgstation.Server.Host.Core.JobManager.

+ +

Referenced by Tgstation.Server.Host.Controllers.JobController.Delete(), and Tgstation.Server.Host.Components.InstanceManager.OfflineInstance().

+ +
+
+ +

◆ JobProgress()

+ +
+
+ + + + + + + + +
int? Tgstation.Server.Host.Core.IJobManager.JobProgress (Job job)
+
+ +

Get the Api.Models.Job.Progress for a job

+
Parameters
+ + +
jobThe Job to get Api.Models.Job.Progress for
+
+
+
Returns
The Api.Models.Job.Progress of job
+ +

Implemented in Tgstation.Server.Host.Core.JobManager.

+ +

Referenced by Tgstation.Server.Host.Controllers.JobController.GetId().

+ +
+
+ +

◆ RegisterOperation()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Core.IJobManager.RegisterOperation (Job job,
Func< Job, IDatabaseContext, Action< int >, CancellationToken, Task > operation,
CancellationToken cancellationToken 
)
+
+
+ +

◆ WaitForJobCompletion()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Core.IJobManager.WaitForJobCompletion (Job job,
User canceller,
CancellationToken jobCancellationToken,
CancellationToken cancellationToken 
)
+
+ +

Wait for a given job to complete

+
Parameters
+ + + + + +
jobThe Job to wait for
cancellerThe User to cancel the job
jobCancellationTokenA CancellationToken that will cancel the job
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the Job
+ +

Implemented in Tgstation.Server.Host.Core.JobManager.

+ +

Referenced by Tgstation.Server.Host.Components.Instance.TimerLoop().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager.png b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..8e8bce97140ec00ec310c03e18d56243a1be5675 GIT binary patch literal 1206 zcmeAS@N?(olHy`uVBq!ia0vp^UxB!TgBeJ2T#oesQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM(wq666=m08|75S5Ji)F)*;Wdb&7& z`@c%&HP6i|d!6SmxhGvW(|=OhU!$+Z#`5R?ZoPinz&PuFw%Dy3-`Ss)ue5g7{`&U8 ztA{H$ZZtk)?^!j!uKm{!%k#;TnBy)zyXt>PJdl41?>Y9vtSilSI{!OU5$`4YKK^W) z8Uy22mA%pP_gtTL>*#au_oY(~S1YZz+*7+gns57+`%@3AzTCggRoBxJ?!bVkS3zDU z)f)I;vQ6;QT$#VU=Z5CW_ZK)f76+}D;hW&vEv3*dX6nGFo7Er_b%g<_k+CQvkon1l zMQkS)y7EqNMpIB9bbDLw%Oh+Pd|(oxuV&qDh^zYgPs}}i9*e-soqP%2tK+4s$}HP+ z4)4EXwfXwzGns-6%lH1>s=9tUAE@kjGQP0M)- zedp~e3wbSf{LHJ{`77q~PrGG(U7WM_zAHi zk{7D>&GNl2@}@NY(Ue{3JBqV5Uo=~`&+NBQaQwUv2cxSW@Rm+l|L4nU;djc?5BaX7 z|D9a@|MlL!m9oAitMuNLX1sW{;n(YG$*JOgJI+4TJ^ilo;V8!#@Au_< zKhx0Y%Kf`0vk&jpJ}mwuq0F*o(Z7$6c|Npq6}Y`J3}&p^=vT08Z(gSGgWsZ$UDRbB zyuStu?EdwCx8+6~G1hpPHsRz8X04pBcHg0P`^SpP8MhYSmvevp?+y3OwN|grH|{$be7!I0 zuJFvry5H*TI$OW5SubEA6!1RVbGGKKE8UV09^KuuDL88K;(0#1UYu=fi%zqxnRHI} zY|R4?pSyEk>h)f`^UUK`+Ras`Wz@ZSt{i@2n83XCJ-@qjaQcngq-!!0^1g(pyt?_CLlqDarXsu3Jig Pg$#qItDnm{r-UW|N~%*c literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_platform_identifier-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_platform_identifier-members.html new file mode 100644 index 0000000000..3683a2d981 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_platform_identifier-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.IPlatformIdentifier Member List
+
+ + + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_platform_identifier.html b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_platform_identifier.html new file mode 100644 index 0000000000..f1f7092d1f --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_platform_identifier.html @@ -0,0 +1,169 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.IPlatformIdentifier Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.IPlatformIdentifier Interface Reference
+
+
+ +

For identifying the current platform + More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.IPlatformIdentifier:
+
+
+ + +Tgstation.Server.Host.Core.PlatformIdentifier + +
+ + + + + + + + +

+Properties

bool IsWindows [get]
 If the current platform is a Windows platform More...
 
string ScriptFileExtension [get]
 The extension of executable script files for the system More...
 
+

Detailed Description

+

For identifying the current platform

+ +

Definition at line 6 of file IPlatformIdentifier.cs.

+

Property Documentation

+ +

◆ IsWindows

+ + + +

◆ ScriptFileExtension

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Core.IPlatformIdentifier.ScriptFileExtension
+
+get
+
+ +

The extension of executable script files for the system

+ +

Definition at line 16 of file IPlatformIdentifier.cs.

+
16 { get; }
+
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_platform_identifier.png b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_platform_identifier.png new file mode 100644 index 0000000000000000000000000000000000000000..cc5784923012c905905698cc3892c5fa0bf2ef47 GIT binary patch literal 1029 zcmeAS@N?(olHy`uVBq!ia0y~yVB`U^12~w0DaMN^;w!y>kxK)=SX>(0N8 z=hO9LI#IHY`9*o%ed((8^?e3@xoa5$(~Do&GN07vyDCxrb{9ij_3v_%cZoFyCT53o zPCezjdw55j#sQ0&dpqA-8`k$-OU{2*_o7$!*|Bdc)m|TaA#qK&%rslIyV-D#)!&QR z{eo6go_-NLVQ5=?@z4!*hhY8Qud5iF@Aee3te6wlX~WJonJvpiBvFF9?3CQ+O>%R- zvCZjbJof2gg;1`B3~#}u`OCCobsi?%xVbS+#bD0rYyBnRd%G=pL?3ZH;Bxy?lD1s4 z!p``b&~$^az^gl7%=yJ}IN$NbFOJ9GX6#UyvwT%fi%{nB`?A8^ck~JiebyN(zvPYk zpMCa3;tYk&GJ94^u3Wez?T>()PNKb)+AlN1uh&J=W}kW{bYWW9XkL8A4{3|5&3iKqHF4=9HkaIrar9Mq6t z2$b%*7Nz}`|A71j?gb$R44?PKxh_s%u*lWvay!Vtp(Vn~tgs3ZC0szk4lN1d1?&0U z-tYatFK+Mmf3FvHcTBnG542TDDUfw>LPv*-uf*F57ni-Si+?}=<>o#^MQPGYiD&HR z-&Z>ywtRf?nwFAKsag9ySxnl^xEz_-?;5$m626jX?N_|sFRBldHVg*zZ^<#=}WGxaVhla|EFs3 z%~HvC@1>NzSqBo#lVupS_J``7Z#=l9QHs}6B5jxK{^NUm*!%Y~mR~cHIDP!7XO`Q; z45dd)?0rLbMI1V~VRP(Rj|2<*wZbo_S^Zy^xI)04A>6?4%c+|)7c6`B^Gt+y%%KR^ zQ0a?uwJi^Swy(=ixFa{&r1ooh%Y*|v?A63}7!^SyS?_=UtciyW9Mz6LS(mn?ZPJ;a zoIMfy>#BUdRHtVx@*;fm9OM(>MBgj_*;HFrE6Kfzd$K7% zS<-Q0vPi;@M;c0>M2-TZImYElq*s4u#|dFzM7MQ#fMOaL=F&a)s`cNVujiU$emB=H S + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.IProcess Member List
+
+ + + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.html b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.html new file mode 100644 index 0000000000..96f41292a8 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.html @@ -0,0 +1,287 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.IProcess Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.IProcess Interface Reference
+
+
+ +

Abstraction over a System.Diagnostics.Process + More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.IProcess:
+
+
+ + +Tgstation.Server.Host.Core.IProcessBase +IDisposable +Tgstation.Server.Host.Core.Process + +
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

string GetErrorOutput ()
 Get the stderr output of the IProcess More...
 
string GetStandardOutput ()
 Get the stdout output of the IProcess More...
 
string GetCombinedOutput ()
 Get the stderr and stdout output of the IProcess More...
 
void Terminate ()
 Terminates the process More...
 
- Public Member Functions inherited from Tgstation.Server.Host.Core.IProcessBase
void SetHighPriority ()
 Set's the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass.AboveNormal More...
 
+ + + + + + + + + + + +

+Properties

int Id [get]
 The IProcess' ID More...
 
Task Startup [get]
 The Task representing the time until the IProcess becomes "idle" More...
 
- Properties inherited from Tgstation.Server.Host.Core.IProcessBase
Task< int > Lifetime [get]
 The Task<TResult> resulting in the exit code of the process More...
 
+

Detailed Description

+

Abstraction over a System.Diagnostics.Process

+ +

Definition at line 9 of file IProcess.cs.

+

Member Function Documentation

+ +

◆ GetCombinedOutput()

+ +
+
+ + + + + + + +
string Tgstation.Server.Host.Core.IProcess.GetCombinedOutput ()
+
+ +

Get the stderr and stdout output of the IProcess

+
Returns
The stderr and stdout output of the IProcess
+ +

Implemented in Tgstation.Server.Host.Core.Process.

+ +
+
+ +

◆ GetErrorOutput()

+ +
+
+ + + + + + + +
string Tgstation.Server.Host.Core.IProcess.GetErrorOutput ()
+
+ +

Get the stderr output of the IProcess

+
Returns
The stderr output of the IProcess
+ +

Implemented in Tgstation.Server.Host.Core.Process.

+ +
+
+ +

◆ GetStandardOutput()

+ +
+
+ + + + + + + +
string Tgstation.Server.Host.Core.IProcess.GetStandardOutput ()
+
+ +

Get the stdout output of the IProcess

+
Returns
The stdout output of the IProcess
+ +

Implemented in Tgstation.Server.Host.Core.Process.

+ +
+
+ +

◆ Terminate()

+ + +

Property Documentation

+ +

◆ Id

+ +
+
+ + + + + +
+ + + + +
int Tgstation.Server.Host.Core.IProcess.Id
+
+get
+
+ +

The IProcess' ID

+ +

Definition at line 14 of file IProcess.cs.

+
14 { get; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.RegisterProcess().

+ +
+
+ +

◆ Startup

+ +
+
+ + + + + +
+ + + + +
Task Tgstation.Server.Host.Core.IProcess.Startup
+
+get
+
+ +

The Task representing the time until the IProcess becomes "idle"

+ +

Definition at line 19 of file IProcess.cs.

+
19 { get; }
+

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionController.SessionController().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.png b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.png new file mode 100644 index 0000000000000000000000000000000000000000..1dc85005f147260f6b69e16d94e1216d3a5d5002 GIT binary patch literal 1551 zcma)+YfzGD6o5Z7Ej4X&C)sq<*%h70tTr#LqPAsbWNH#=Ety%X%SfW^Je{_CB2-gDlW_s5y@%sDy70(?!4 zEsX&HFhw0ch}K0&N85UR-7R-CNYI7Pj~&JMXti2hIyI+Eq&>>hWq;Dv)@G0c+UTC^ z6VL(20o|w7GtiCM0{{jr)WQ9jOM3H65&c1vnGZ~Sf~@uRTKjfCH$9o%Kds7d5N)vj z-tkm09)+;W{t87$8t~xDK?Fa#jd~|kcShJc)CgzJxJ)w3=u7%)FQ_#Q%tf}wB3tKZ z7wqR~s^4cuvNhY)A%d_Fa{sL)5$ES!sMfMLqIA@Gqtk~h(BC4YjxH@iGQ3eL11h6& zY%0^Wz>vN~rq;43$gz1jMD`rh#03fMqWWMdOuOmR?T)Ch{17}!Mf|sv8W2%29tfmX ztV{EDn@I6U&OlC_xgVNAnYfx{CPB5EN_;<^g@}qmx_3Uji!R&}>a?h6 zj!MvyNEMv_1&(r>?@+Z*tblz)HN@!lpeNjnY<(J@g{2$f=H+B!FExDIQ#Ed(`h`AZ zSs{JybQ0Uyjf)$VVdeKiSD=`ixH?c^i{)*?M-Di~2*eyskSwu&zT1!@>nX2yW>^eV zZ^`SxsH;MiLFX`rX7>Ic4|(fD_YTF~-{PszrZqO4x7eCvx#)vtzwgK7W!kypk&T{X zqn1RrSb=Nk6<8I|&2Hkw|JoJX?<|tr+tB#ca$G2rAg!1rpMg~y()fXjCI!!bC5sX) zm|J?_!MooqvA%MFA?*l!sZDH=f{{5WRw+|nRo1o4BBV|x^OQ{(uqKVC1SfAHIwpV0 zMZ91Pqiru_%}|8YP$8C5+v9OZ%GftZPk<>wY7e~}89gj7Hl`@9IXwbfVz_X7 z6*m%x{B84$ROLz={Kn{PCH3S!esZZ*5=W~+1DR$JCDs)LGP&=eCO2uz?!tE({RI=* zkQ{WX$0k4j$C2oRSEutS8JJ%qUcdLjj3E!ig=p`PfZIe_4}3?@;{(mbdTvJtN=HuE zJkH%i*d6tDucakF+a>AB@isr1d;bo1bC+?GzAClz=JB&RSH-<}A&K`Sy&pIf7r)n8 zG-Qi^hba(MM%9fa=6K7#>l*RDp>vZ`D1Fiq#Ug3AQDX$*b_O%0Nb1Ukfw0Gl<5Eg5 z?vgz@<;NCwmc5knNPS%~I;cR$^VYl`B$iyM+`ub}E^wpbl#VVxMBZtEz|y;`HUMoX zlL)z(NUR%%<>&)?vhrDvb^Ou{t2Wvy!7^R@QrCQN@C3f-MnLc0dexBK<>8?k(lAH8;?n2(pA~DEjN6?0 zsu7;pAbEZFh#xU3=r1i5t6B>F)=~#{tZ5eLFT}{)1v^L9wa4a_M_^W>wm)k(-^yc# z_L6vQ=}+merafg@_A5!9>LcmNYmY>hRCc8d*_jDqzAjOczFdxHS#4yKy(Ys*X1=eD zATmol%!&`g^loIy-FR=Vk1vasS(XjYvS}Y%#Qu(Yf%}KwPsll*6X9PPH-Rfs_t=wul*Mm_mMyxKI)va@JA^>5Rs + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.IProcessBase Member List
+
+ + + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_base.html b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_base.html new file mode 100644 index 0000000000..9e012ef359 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_base.html @@ -0,0 +1,176 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.IProcessBase Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.IProcessBase Interface Reference
+
+
+ +

Represents process lifetime + More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.IProcessBase:
+
+
+ + +IDisposable +Tgstation.Server.Host.Components.Watchdog.ISessionController +Tgstation.Server.Host.Core.IProcess +Tgstation.Server.Host.Components.Watchdog.DeadSessionController +Tgstation.Server.Host.Components.Watchdog.SessionController +Tgstation.Server.Host.Core.Process + +
+ + + + + +

+Public Member Functions

void SetHighPriority ()
 Set's the owned System.Diagnostics.Process.PriorityClass to System.Diagnostics.ProcessPriorityClass.AboveNormal More...
 
+ + + + +

+Properties

Task< int > Lifetime [get]
 The Task<TResult> resulting in the exit code of the process More...
 
+

Detailed Description

+

Represents process lifetime

+ +

Definition at line 9 of file IProcessBase.cs.

+

Member Function Documentation

+ +

◆ SetHighPriority()

+ + +

Property Documentation

+ +

◆ Lifetime

+ +
+
+ + + + + +
+ + + + +
Task<int> Tgstation.Server.Host.Core.IProcessBase.Lifetime
+
+get
+
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_base.png b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_base.png new file mode 100644 index 0000000000000000000000000000000000000000..f081ace7c27c2d5cfa88059fd861531f067fdeb1 GIT binary patch literal 4025 zcmdT{2~bm67DW-XXqIlV6)_{D1hpFkLADr#p=FCmK%_xri5gIr0Gc#Q2n2;57+MV) zM-VW?ZV^Pb31Nvy2(;2MhNS_Kge-_aSOP=|1OkT4Pqe3IYI>=u>Z-2!Rqwy|?|t{Z zd*8qJ{PT1D;GTLq#yT1r8hS7?1otjtWN)0c#F@a-a`pWmD6 z!(oIlr6WD91+Q3XNfY2h?dfwXPSG#lPmCpmefQEwY2iEuR)KW z_U~rqLmgB;@ls!c*i**7)Y8=8C9!mA$$}Xk1ZFL(H@IEiMZsPQ!=TO!ctY6xh7UqE z#od_{4@(S5mQ%uSfJb8quCDFKlFylVC5~M;n9^KD!-r+Gyklr{B4huxZxImkwFy=^ z80+@SMaLW!cIPQ*4;<@&Xrpy23`861F-ouS!R`APVeW=GGe&pL>Y}0URrFV~hE03h7`x24#(3E`PtSCT1r2 z8~U*&F>@-igEwTjH9RP+u@i%$Oz+Q$KVKO3x^7A2*2EZuBte<;u}MO1nYSZjcB9f? zT^5)(EmQSh8%%1d&;aC^fG0QiZ+5_x_!O!Fh<`4;<2(&+{ zj+Rp=r1H=YEe*79-*VGXxZi~b_QqR4cW1SzWui88{hm1 z0QmHcakfU?e+Sm;^x`D7enooX1Z%!Su&c+4i-!t-wC> z4%!L4;X&o<4{&0Jcy)p^=O(yz3EVUusX#`iGIlv%02UZWh&Vaf6b1$}V~9b$X;egc znz3%+{RoOwY|B`ixH3ZawpnIpDij`&F7=5eYy$gBb~Y`ZR+7$59rO;BPBu&Fh=O%< zV;uB5>Aj#QG>}u?9j=iTxp;MWyOg(Rnedti3o5(3Z2fuNzV$3hmt9hk1x$b89(qRRwQYctpZaohIoMoE zE-2`csF0xZYlU}f|HdZ6P(%$ofTxSX9ZX1&39RRKVwEk)XbYIV>gWnQVt9)`Ax5$` z32^ix#NJ%m@V6!7v&XC1keZE_#%FJ7H+iQyG3`l-={QR?%6Wl_L1A4A3>6Yk$lV4q-W<-}ZhTS>C@D?d(adlwGk3DQkoB^M_LXGL#akh68RF6WqZ7{~cNvOeyZr}Nn zglfrz@X7K8LiJ7$BDe2Da5dC<14yHKfxPFGjw>^odX#+&jaA}oPT?!)j)W|%B(@e2 z2x;VJNMrXh;jAPse@1Yck3$30Lf)hfM>592-!x-g#={AU_?&_XoWhY_l@fwGTKA@T zx-RnV*}~e?%D!0(s&}ZYgcKFX8O-cmR$=+o@yY}ma1P2ruef5c<_hq>)6bZ(HtCzN zH#zWu=#~W$AV56C*&WvIJLe zQYlrIzuU4a&i4z;qF4000lGEp>J1Pt+tU1VMP<=mW#9_%_V3f`zySVze5we%-5+BC z^XOv{!GJHs2rm`)h3)kw0xrRbyX=_62r$V4W>cEK2bTQ;NRS&})qz>pRfc_bOn9x5 z*qP7kL1a`nhB=`0j}i~pKCVv2uPT;vi5B@CXBZiwv;3!X*3w=4?N8XB4GW4QT4&~3 z(p#XOYteP}{^X!5VCnb?0P7Ah4h9p)r~rv=(oEW64t$^iDl^-neDNL_hsQZksVK{o zKP)GYoity>Hh9?}ob8y}wNhnN7Fa%L50RNiAezO=XSSKt#v-7S{kan(ij~#6QS`uk zMVLcqPis}r;^sk1#$1|YF!BI=7zpz^w^h0YFn=O&Vb+4JZcaX7SR zY6P_U_ST`+tuPULaExP=SmILUPUsp;5Owj+6G71=WC6U`3NqfQJKACQDUO`Wa z)+c-10ed#zL{iURr1#@|XXn32p;xLQv}EYeHc^O+Bh)@mDO*qKBFKMq$wv-;+hau) zI7$kY*2#fAQ&|w1srh2C>iAo2n61s-R}S*It>4gsza)Hl08!rlKA9YoWWuO zdWIP^J$VXTXoa|iG<|_hU!a3{wW_s9NCuh9cC0ZeFZeVe))%HGau(}TT4UbY;Gtuw zxojcTu&bm!W-$p=dykLH2+L`Oq}p9=G7Jk8*wayuXBo5st`AC^Mkhsry5rIE$(=nE za%e@*LzU}h5PL7ugh8y-zR35s;31gx?KwzeY8q^Q(K*t>RPZKekGJ_PFj+*!pgOgE zh$B^)85!Xiu{L@6q{ritoV{x8v^N?>d#|-9@Aos9U2fM+dXndxANV=UxgW@l3wlN1 zC)_a=RY|*1TWA3=mwCc}SLOdu&I{&D0C{5oRM4feY(5}zR5T#VUNHF!Uc6;U_j)k! PpRECNhr88$aXRy#yrHZK literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_executor-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_executor-members.html new file mode 100644 index 0000000000..9225681dcf --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_executor-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.IProcessExecutor Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.IProcessExecutor, including all inherited members.

+ + + +
GetProcess(int id)Tgstation.Server.Host.Core.IProcessExecutor
LaunchProcess(string fileName, string workingDirectory, string arguments=null, bool readOutput=false, bool readError=false, bool noShellExecute=false)Tgstation.Server.Host.Core.IProcessExecutor
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_executor.html b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_executor.html new file mode 100644 index 0000000000..5e84942140 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_executor.html @@ -0,0 +1,216 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.IProcessExecutor Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.IProcessExecutor Interface Reference
+
+
+ +

For launching IProcess' + More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.IProcessExecutor:
+
+
+ + +Tgstation.Server.Host.Core.ProcessExecutor + +
+ + + + + + + + +

+Public Member Functions

IProcess LaunchProcess (string fileName, string workingDirectory, string arguments=null, bool readOutput=false, bool readError=false, bool noShellExecute=false)
 Launch a IProcess More...
 
IProcess GetProcess (int id)
 Get a IProcess by id More...
 
+

Detailed Description

+

For launching IProcess'

+ +

Definition at line 6 of file IProcessExecutor.cs.

+

Member Function Documentation

+ +

◆ GetProcess()

+ +
+
+ + + + + + + + +
IProcess Tgstation.Server.Host.Core.IProcessExecutor.GetProcess (int id)
+
+ +

Get a IProcess by id

+
Parameters
+ + +
idThe IProcess.Id
+
+
+
Returns
The IProcess represented by id on success, null on failure
+ +

Implemented in Tgstation.Server.Host.Core.ProcessExecutor.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.Reattach().

+ +
+
+ +

◆ LaunchProcess()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IProcess Tgstation.Server.Host.Core.IProcessExecutor.LaunchProcess (string fileName,
string workingDirectory,
string arguments = null,
bool readOutput = false,
bool readError = false,
bool noShellExecute = false 
)
+
+ +

Launch a IProcess

+
Parameters
+ + + + + + + +
fileNameThe full path to the executable file
workingDirectoryThe working directory for the IProcess
argumentsThe arguments for the IProcess
readOutputIf standard output should be read
readErrorIf standard error should be read
noShellExecuteIf shell execute should not be used. Ignored if readError or readOutput are set
+
+
+
Returns
A new IProcess
+ +

Implemented in Tgstation.Server.Host.Core.ProcessExecutor.

+ +

Referenced by Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.InstallByond(), Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew(), and Tgstation.Server.Host.Components.Compiler.DreamMaker.RunDreamMaker().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_executor.png b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_executor.png new file mode 100644 index 0000000000000000000000000000000000000000..ec442645642b261863bde31cee27032bbd7a92be GIT binary patch literal 1013 zcmeAS@N?(olHy`uVBq!ia0y~yVB`g|12~w0q{-?F%Yl?cfKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+19OX~i(^Oy@F@Rh&t~r8?2xMT`?xW{B`M_{?=Xzw*GI=kFhD zFBg+$OsV?De53l$eCuED{?~;k+c4-)y)tX7V74r8!-Bnk;(DH&=*fJ&xuf@S+e2BY z^Tyw2zve5q>AUoI=k>OgZ{P6=hd;^u()I3cvH99(Z=$5OW!3gR-<+8Lh(u5^GKusP&%N!TWPFE>DfB*RPpzGRB%ATi6 zW~@E-`2U?ip*bph1I)xczxidqz16|i*QUby_UZRSHp>eizUZxcCwXtl$An*hKlYYA zx0Z8%`R`8l;VW|g{hi|xvCG0QwXFseyP=@iW$^j=!uGyre|+UlvEgBh%}9F zzGJ|nCwuk9iOU?aYu@D)?3}AVKX~?~8UNBWX2zdh>=~6(ADdQn@u<_`?Q)$7FBSSL zp72UX8^kl$_#Xc8Qn|u)vHr20ZpYVcI&HS5cgG6m-kIE+f3b$#(fph5cgR0;&buio z*;Vorotz%mEU$Q!Zjv;w&-$qQAHLq#dnR5kSnN}FDiRpMv1{g@-t%zzu^V@nC7z!$ z@#}ZzBl9%tOm{Cn@b=!0nrX(VX;02v{8MJK?);SG;w9;)iZ$N(oXpr$9OHfIe(-{g zX&#=xB#v%1ytG55cE+W-N}lp7fia|_35vH#Q(ihI-`=*iB<4TEtS1(N_V0p@0`n+? Mr>mdKI;Vst0G+Ar8UO$Q literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_handler-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_handler-members.html new file mode 100644 index 0000000000..690697720c --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_handler-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.IRestartHandler Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.IRestartHandler, including all inherited members.

+ + +
HandleRestart(Version updateVersion, CancellationToken cancellationToken)Tgstation.Server.Host.Core.IRestartHandler
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_handler.html b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_handler.html new file mode 100644 index 0000000000..adaa6d7f04 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_handler.html @@ -0,0 +1,156 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.IRestartHandler Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.IRestartHandler Interface Reference
+
+
+ +

Handler for server restarts + More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.IRestartHandler:
+
+
+ + +Tgstation.Server.Host.Components.Chat.Chat +Tgstation.Server.Host.Components.InstanceManager +Tgstation.Server.Host.Components.Watchdog.WatchdogBase +Tgstation.Server.Host.Components.Watchdog.BasicWatchdog +Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog + +
+ + + + + +

+Public Member Functions

Task HandleRestart (Version updateVersion, CancellationToken cancellationToken)
 Handle a restart of the server More...
 
+

Detailed Description

+

Handler for server restarts

+ +

Definition at line 10 of file IRestartHandler.cs.

+

Member Function Documentation

+ +

◆ HandleRestart()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Core.IRestartHandler.HandleRestart (Version updateVersion,
CancellationToken cancellationToken 
)
+
+ +

Handle a restart of the server

+
Parameters
+ + + +
updateVersionThe Version being updated to, null if not being changed
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Components.Chat.Chat, Tgstation.Server.Host.Components.Watchdog.WatchdogBase, and Tgstation.Server.Host.Components.InstanceManager.

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_handler.png b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_handler.png new file mode 100644 index 0000000000000000000000000000000000000000..f1553510d90a904390900827f5f67ecc6c96ed96 GIT binary patch literal 3525 zcmd5LAkDKeqM?cm zg{U>C2vm?U%qTQ6gc2bnfe;OY5W*}Z5R!L-uGRH^z4g|6KYG_X_nx!v*?Zr;zrDYG z?ln*MZ}qex+G=WQddTmNoKREKpn&;5wba2q7XrTs9>$)>Pq`_TN-%vl`93DS`6igH zjmE}CjcWsDV5t>-!u_Ng*rd98U!B?u^qoQ;aXA&YPBJ(i`L^TpPrF@rr7RJLS18=) zSG%pm^gq*eOmGg(BZ+@-~+d80zOpWmtx9p^PvE6=Sj zFyy?cbH`QXfAHp8`m9x;$A$z;isSdPp%Qi)8SXbC8ZmNYOTC}^wfc62=k(-EBAj0Y z`-QJZ1*&3bfD&QV{81vdJ^7DA^x5F-9C)68+#yP4azjmT@QEC_;Kj_Oe0^>GM+*;U z!`hO{qPPO2$n8~_-TR}*!vY6xP_U5cySV&gqV}kwGAQ8*Mi-zm@)bsITP7%-SO{6F z5Y=8LrL`1`ZpA}vV><)ql7vZQ5jQ8{y;p#? zQoba%91K^mNJ$wAG|*689?z^WFA)qHjoJYC{eMNK^vWXRA_2z=M|}3($HY_eGtDC0{Kf^s4=;;f|vX? zRvAF!jhc#p!`8aGkJ6G;62-ifb>+Kv(~LB=r;0*!G+#G2Uhy`zsH!ZsHuls}R}Vf% z6AJzg0>&M16x;0gd^%=X-TN*kn+`sk4M(Y`AOeq4k5bollMA~ITk4~GP=OZYUK%}udWt&W15|(j zd{9tYaZnD+!e*u`SIZALFl>;{vHP(2IobT!`lF@&eHqTW&j%RwosI$# z9FaM*Z+vF($xWDLzEy|+lg7v_{}u6aOVSe05(gA?!`-Qt6(w`Qo2lrE%GLbBrWNsw zj{5eqpQ%Lilp2u)rs`@5T7APyP+Vf#X4hiBSiy^c_srz)lL0sApqtEts9- zvAfPfhW1H#WiVy|-kzd7yvb@uc)4aF#>7@JRXzsKJJjD+*Q>JUUNSEkVO2~r z6N3EeW!uMm$uU)%BR6Lh_?UzwNxE`8IGWxpr3gg8ZV4$uc&5Ie5_9r060@B6?2GBq z*K%R9r?&K2TuEajy)yXs+|jxA1+c+?;P&O)FpfPXWBBLxOupPw&O3m{Q_Q*8P6V`J zyK;4)_GP50U&Ba|@?zOpJ-E+SGboChU+n`?EP0EKJr6+6yxhTg6B_etUsq8~mBq`5>+H1lttAOq!U9l94!^pXQrGtyUZNL;l87`Pg^>9aX8u%&MqHMmH&ZfOE+f&o*vXqj7+3BeipKA%?A}C^Y znCBBkYzRP!VAXG{JZ}t*7x*(OO~>jOFddR_+cq-povip}=8}xcw!U$RrI~#@syy*v zdW)59B`+_*cz6{U2?T%+`K89&6hY77mwc&dofuN`*rx4FFZ`a5X%l*-x3>`U)KyC6 zC~}tLshP~AZXaMXo>f=66G;gEts2H$A>_6exllt_qqT=DI@*5_nmfuC%T*sXGFNvO zrX-f!RlRSIP3O$MY_3IX5at>Y31?LsFqK<&srm1r_@u(hB>E+y!nF8mZTWCAF%rw( z2P%C^;{KtEd;TvKuQ&toV8eR>$7uZ@jR}qZ1|LH|lvc(7fVk4tVPI`v5e+$F5E4 zDmLB-klySGIvMm4Dj)VB2oxkbARH!pQv5bo33KogQ$wLMywz|KZe>P~VPQbg_mFroN;ECA;WP4y1Z)X;(BqDb?~Qa{+eUMLW=W4YGwP z6NjC$k$V~EMRjn3WGlM<`#WDqXF}c@V&vEM!vVg@&h8?jqcFo{0w@XMTUNa$nw|EkS*_!a;t#$;IjoH12Ch6}HeI2NIiBX4h~qnu?CHqxjcr zwJpWgM9vzwTL`+|NbcwVPzVlX1`A=3k{|aY70SH5nd=3^g_wb@u + + + + + + +tgstation-server: Tgstation.Server.Host.Core.IRestartRegistration Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.IRestartRegistration Interface Reference
+
+
+ +

Represents the lifetime of a IRestartHandler registration + More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.IRestartRegistration:
+
+
+ + +IDisposable +Tgstation.Server.Host.Core.RestartRegistration + +
+

Detailed Description

+

Represents the lifetime of a IRestartHandler registration

+ +

Definition at line 8 of file IRestartRegistration.cs.

+

The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_registration.png b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_registration.png new file mode 100644 index 0000000000000000000000000000000000000000..0e952090e99d30aa15010d2ad231bb840344dfbf GIT binary patch literal 1417 zcmeAS@N?(olHy`uVBq!ia0y~yU=#zgJ2;quq-cl9FCZlm;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|z$)SC;uuoF_;zk?k+P-$>ty$qclA%E zs$LAR$++1S8yz>j{mK{i3n5HL-Bazte}=kmA8pG!^>=@NY03Zf_if_tuC7}>Xa1E> z8po%0RduePCF}W%uP(wnn)~7YfS>O(CAWF-|GD83=zaRiq%XXGR!pm$nKQ4|RmJna zt$mqLY943Qt-Ojlp}YV7wodk#)bswH{G=~aV6J$+)#K9biBT#iJ#;6fED`fG0y#5W zck8uTSE7zHeb9?x5K@?Og~_0J=MwRTP7q`3q&Nnpm8=PlUW^7o+zk_>7<#TSB`gtR zP~OTQv6A(Ghc1I#7P(UQJiRrSsw|xnpuxat0JIm$+>EFwCbp`V+pn+QYM0Nl;n7Fg z1fAo5E8XSq$6x)xsK1(bK4aUa?(7I%^|`szue|;Fe9xTh%1eRL|E|5N+`5^Kp)Ipg z=BE6y{9FC=e_y`+{_R@dve)n8RBgJVZgpR)p3|@}bpCh4dpj%hFSc2RR-3%z?c3-7 zs4FV3bRkcxlfH9n+D8fZ-zEHuZMmY>oUWYcFY6oi>{)QP>sF@ZnQS|IvKKDxH|sgc zEO$gCA!!fq&Fs&ep58gOD!s9vmCaV0`8h~jv|HCZP4R}t#3RiNCz^aYx9W zZ|PfY&g*9DD&9G&W_4Qkbl<)i(c7+a^*j~Tee7BCW2)H)vx*=-FxTm z>0i9M@7LF7DpGDY+-mEDTHn6~dTgHDGlu;W#UIVwdgi6b1M|;GHrt~5p74LLf3US8 zY&OS({>dmY8?L)_%A_el#|9)#tlhegb9z*EE&qy1Q#_=+fZ0cRtH&f*vXzNC_1FJW zz^}Jov#PGgMJRhl6|Of6w|jTqI*RAquU`_6H%*;)xO*HJZXZ`MH-=EL_T(s_~ zr~B#avo+>_*|gX8YSGreg&!6Frv3Y|(|+&Yd-rao+9_N&Z`nuBo z(cIhLUgh=#Z*5<5@4<@-=_^jB*X{~wTeK*yjqB_q!ztgs+7-VIypR-o?sd&8jh@^r z>(KZR?Mo5M1lKi3WxZVdHhGq8>&vMjb3U4-tUs%+rn|A!TWa?<_nffYE%I%}Vpsf5 z3*>O8EdzL%qZUv@|uaD&3#U6J${Zp;$ z)${i^)VegyPkrI6Oa+qU-W@@~7N?@YaUF}$cd`{vVW)3@}fU!1rvKeEc_R^iSz z=9D)p?YnO8p08$md9Br}>#HYcNW@8h`spcRw~hPMmYPR4)0e~_^FBCZn&n)tOY5IL zO{m!_b25HXo%MRQ&39ZTecA4bR8)XUwAIt1vVE8BuV<+DE!elt?9U`%xyj(^>gTe~ HDWM4f*yxi3 literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control-members.html new file mode 100644 index 0000000000..869e54eb8f --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control-members.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.IServerControl Member List
+
+ + + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control.html b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control.html new file mode 100644 index 0000000000..180330bd5f --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control.html @@ -0,0 +1,290 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.IServerControl Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.IServerControl Interface Reference
+
+
+ +

Represents a service that may take an updated Host assembly and run it, stopping the current assembly in the process + More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.IServerControl:
+
+
+ + +Tgstation.Server.Host.Server + +
+ + + + + + + + + + + + + + +

+Public Member Functions

bool ApplyUpdate (Version version, Uri updateZipUrl, IIOManager ioManager)
 Run a new Host assembly and stop the current one. This will likely trigger all active CancellationTokens More...
 
IRestartRegistration RegisterForRestart (IRestartHandler handler)
 Register a given handler to run before stopping the server for a restart More...
 
Task Restart ()
 Restarts the Host More...
 
Task Die (Exception exception)
 Kill the server with a fatal exception More...
 
+ + + + +

+Properties

bool WatchdogPresent [get]
 true if live updates are supported, false. ApplyUpdate(Version, Uri, IIOManager) and Restart will fail if this is false More...
 
+

Detailed Description

+

Represents a service that may take an updated Host assembly and run it, stopping the current assembly in the process

+ +

Definition at line 11 of file IServerControl.cs.

+

Member Function Documentation

+ +

◆ ApplyUpdate()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool Tgstation.Server.Host.Core.IServerControl.ApplyUpdate (Version version,
Uri updateZipUrl,
IIOManager ioManager 
)
+
+ +

Run a new Host assembly and stop the current one. This will likely trigger all active CancellationTokens

+
Parameters
+ + + + +
versionThe Version the IServerControl is updating to
updateZipUrlThe Uri that points to the .zip file that contains the new Host assembly
ioManagerThe IIOManager for the operation
+
+
+
Returns
true if the update started successfully, false if there was another update in progress
+ +

Implemented in Tgstation.Server.Host.Server.

+ +

Referenced by Tgstation.Server.Host.Controllers.AdministrationController.CheckReleasesAndApplyUpdate().

+ +
+
+ +

◆ Die()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Core.IServerControl.Die (Exception exception)
+
+ +

Kill the server with a fatal exception

+
Parameters
+ + +
exceptionThe Exception to propagate to the watchdog if any
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Server.

+ +
+
+ +

◆ RegisterForRestart()

+ +
+
+ + + + + + + + +
IRestartRegistration Tgstation.Server.Host.Core.IServerControl.RegisterForRestart (IRestartHandler handler)
+
+ +

Register a given handler to run before stopping the server for a restart

+
Parameters
+ + +
handlerThe IRestartHandler to register
+
+
+
Returns
A new IRestartRegistration representing the scope of the registration
+ +

Implemented in Tgstation.Server.Host.Server.

+ +

Referenced by Tgstation.Server.Host.Components.Chat.Chat.Chat(), Tgstation.Server.Host.Components.InstanceManager.InstanceManager(), and Tgstation.Server.Host.Components.Watchdog.WatchdogBase.WatchdogBase().

+ +
+
+ +

◆ Restart()

+ +
+
+ + + + + + + +
Task Tgstation.Server.Host.Core.IServerControl.Restart ()
+
+ +

Restarts the Host

+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Server.

+ +

Referenced by Tgstation.Server.Host.Core.Application.Configure(), and Tgstation.Server.Host.Controllers.AdministrationController.Delete().

+ +
+
+

Property Documentation

+ +

◆ WatchdogPresent

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.Core.IServerControl.WatchdogPresent
+
+get
+
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control.png b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control.png new file mode 100644 index 0000000000000000000000000000000000000000..3f565acbbea3ab3994c2b755d5bdff614ee8dcff GIT binary patch literal 871 zcmeAS@N?(olHy`uVBq!ia0vp^e}OoFgBeIZ&20V$q$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IZ0zInPhhEy=Vo%?^&Vg;U7`#$5^|L*s~ zT!maNmX+`N-p03l@gI*LP96Uz1$ia9GI6YOs&$;hlfi zKImuPS$4f4z4)}q^`|dCJ8XORI45kX^Ol|E?^bQwl2f)&!;JsM^Fohh6E)8IoH%%E zfl=Vi+;>G^tS9SrRXeL@gvVT+#^t+rk#D?P_iHN=y(12{PVd`ws_4O@Mc-F%-_vr$ zub1^}MDkI?y@gZCYh3ob-AK7o=AAR??YVtBESBhhJ$8^7tF9M*)vW!0Z~IHxQ033(-_>58@V)qIsOfvLy=#9)Z=Lgc+1j6W*0GA) zrj_l!dG$}wim0|zpLxTt?%5S2fA!D1sVLOAmoL_;T85d<;U_NqX0ei2VXxd75ZG5Q}6x$ zk9~jDjIS@^E>F{3clz@4#+<+NWIbQKw*6J<9%SU}xpXF{WrTEynwGh0x#h39C#ylm zZhv`t*{OZ618#UvR54A7k4??oxg*hi(yw0~_uiKZbXYO>-C8)SU$83I + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Core.ISetupWizard Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Core.ISetupWizard, including all inherited members.

+ + +
CheckRunWizard(CancellationToken cancellationToken)Tgstation.Server.Host.Core.ISetupWizard
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_setup_wizard.html b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_setup_wizard.html new file mode 100644 index 0000000000..39e22e51d5 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_setup_wizard.html @@ -0,0 +1,144 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.ISetupWizard Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.ISetupWizard Interface Reference
+
+
+ +

The command line Configuration setup wizard + More...

+
+Inheritance diagram for Tgstation.Server.Host.Core.ISetupWizard:
+
+
+ + +Tgstation.Server.Host.Core.SetupWizard +Tgstation.Server.Host.Core.Tests.TestApplication.MockSetupWizard + +
+ + + + + +

+Public Member Functions

Task< bool > CheckRunWizard (CancellationToken cancellationToken)
 Run the setup wizard if necessary More...
 
+

Detailed Description

+

The command line Configuration setup wizard

+ +

Definition at line 9 of file ISetupWizard.cs.

+

Member Function Documentation

+ +

◆ CheckRunWizard()

+ +
+
+ + + + + + + + +
Task<bool> Tgstation.Server.Host.Core.ISetupWizard.CheckRunWizard (CancellationToken cancellationToken)
+
+ +

Run the setup wizard if necessary

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in true if the wizard ran, false otherwise
+ +

Implemented in Tgstation.Server.Host.Core.SetupWizard, and Tgstation.Server.Host.Core.Tests.TestApplication.MockSetupWizard.

+ +

Referenced by Tgstation.Server.Host.Core.Application.ConfigureServices().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_setup_wizard.png b/interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_setup_wizard.png new file mode 100644 index 0000000000000000000000000000000000000000..341ee71511ebf523f916ea2d9ce6985ee9e6f50a GIT binary patch literal 1739 zcmchWdokRujmaeqsSz1tj5KoTB6CzO6VZiVW3ojv z3S-$dD3?LGY-DIcNND7;5z@%zh&0R&yZ^Um|Jdi8_x*gIbDrlt-#@-@s;37=K~7T+ z000H7ixUn2;7Ez~l!Z&~H>6Qe0)(fVx3gF*mdMFZix<+LK@zob8XFs>QwMb=t?YT6 zhZi6jTCd(0-lhNm`eL2X-Z3yCQ%GMZR+P$)Iyxh!cZL(gq^dF|7|dOtJJjm#Y&~!_ z865{((_`SS?`AX7;RL`m5D%CV^nvd0F{;*Zd``yv%<9TQXe>WUxlt`WaCKz-+ni&A z{qt>2Bj2Dr&(fN9OIZio5-8Zu3?W4r84~;M<$=`4o^^{d+blp>e=`VM-r^Sm^*}c3)xYuJOw2%bi0Y>)4|36CmDJuu?f=R{}<=ZJ4%nIj26&9x`hcSq@+8wfNXf zfH)zm{m2EmsN22dYhY2Prf5s#j`dk1tJcX>ciL;4Kcw5uu8^SUKf|R%Z<@TEY#I;~ zXn;t+#N4G2AtpePb3E4pEt3D)h=f|uzI+bR3kun;*p7~cR#zK%MAgIGG$<@>^t1W{=w_eZe5v101>ZJ1496CLVUph z5&#&r+yCzV8?0{&gwbYPfiQD3 z0H2L2mUb{Tlygx0Ke?ut>(*m_c|SKatDuy(uJvhH`c2g3yKj(m5^AccA4zAxwVdem zK$;6qF>EXLP_n`ftW6mjwOhk71vTCX-p(ia5uy3zjMo*5)1AN0aLFvx{t1&}-KUr0 z9(#(Yh_3>Z@+U8DL>=np%Y$u9-p;P=iv7M9rmbT!#mwxt%-?2@s*(n+WDT(JrL{iB zezh-cj_*1#QyKa0Lquqdx-V_!l*54U1)e$Gd~blbtG+#<)9`wBo7~fcSRN1!TL)se%IAX16eym4WriTS1kvE3?H78M-IWT zw%7b=r1tkKIQ1fm47`e76J@E&;n)%D=CoAQj9GcJy&%4)l6=`fg;U{-!vv_rxr<}A zS8)*rQ)>sb`gZQCoh~p|3&F0$S)00a>Nl2IJkT$K&Pc2 zr#!Dmci@)yfEr4*7eC(3`@%`dQh1h(64qVv4;$U1ctaSsT!^NRKZ?D=Q?4+3Fnpem z>`bo?f{+87y~!9m7}vJB90}{414)j)A`$EodBt^fao*C3DRVm ze^xCzW2_T}D9Wv5vS-=g*LT4jPC9*QdX7C9!T4O$FTGe>5>sHy4)5~jTT@oG<5((7 zF%074)Av}s5`F_Wk<=cBg55Hhcs0G*5sATk@(`qGIN6~`f0ysJai-5Nj2`F8 z&)=ak@{gS|V4?gw8zL?gp&e~9^T$XQt=#b=^pm5VTKPWq*cGtb2Qud8q3RMP={!h3 z892NVU*W%suLwcPDrj5(2U#u19&>kcR>4${NC`H_KAx9rq6J6_>+IoF;z&sR3(}eK AcmMzZ literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console-members.html new file mode 100644 index 0000000000..c549127b5c --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console-members.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.IO.IConsole Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.IO.IConsole, including all inherited members.

+ + + + + +
AvailableTgstation.Server.Host.IO.IConsole
PressAnyKeyAsync(CancellationToken cancellationToken)Tgstation.Server.Host.IO.IConsole
ReadLineAsync(bool usePasswordChar, CancellationToken cancellationToken)Tgstation.Server.Host.IO.IConsole
WriteAsync(string text, bool newLine, CancellationToken cancellationToken)Tgstation.Server.Host.IO.IConsole
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console.html b/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console.html new file mode 100644 index 0000000000..66b7047b94 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console.html @@ -0,0 +1,276 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.IO.IConsole Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IO.IConsole Interface Reference
+
+
+ +

Abstraction for System.Console + More...

+
+Inheritance diagram for Tgstation.Server.Host.IO.IConsole:
+
+
+ + +Tgstation.Server.Host.IO.Console + +
+ + + + + + + + + + + +

+Public Member Functions

Task WriteAsync (string text, bool newLine, CancellationToken cancellationToken)
 Write some text to the IConsole More...
 
Task PressAnyKeyAsync (CancellationToken cancellationToken)
 Wait for a key press on the IConsole More...
 
Task< string > ReadLineAsync (bool usePasswordChar, CancellationToken cancellationToken)
 Read a line from the IConsole More...
 
+ + + + +

+Properties

bool Available [get]
 If the IConsole is visible to the user More...
 
+

Detailed Description

+

Abstraction for System.Console

+ +

Definition at line 9 of file IConsole.cs.

+

Member Function Documentation

+ +

◆ PressAnyKeyAsync()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.IO.IConsole.PressAnyKeyAsync (CancellationToken cancellationToken)
+
+ +

Wait for a key press on the IConsole

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operations
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.IO.Console.

+ +

Referenced by Tgstation.Server.Host.Core.SetupWizard.ConfigureDatabase(), and Tgstation.Server.Host.Core.SetupWizard.SaveConfiguration().

+ +
+
+ +

◆ ReadLineAsync()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<string> Tgstation.Server.Host.IO.IConsole.ReadLineAsync (bool usePasswordChar,
CancellationToken cancellationToken 
)
+
+ +

Read a line from the IConsole

+
Parameters
+ + + +
usePasswordCharIf the input should be retrieved using the '*' character
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the string read by the IConsole
+ +

Implemented in Tgstation.Server.Host.IO.Console.

+ +

Referenced by Tgstation.Server.Host.Core.SetupWizard.ConfigureControlPanel(), Tgstation.Server.Host.Core.SetupWizard.ConfigureDatabase(), Tgstation.Server.Host.Core.SetupWizard.ConfigureGeneral(), Tgstation.Server.Host.Core.SetupWizard.ConfigureLogging(), Tgstation.Server.Host.Core.SetupWizard.PromptForHostingPort(), and Tgstation.Server.Host.Core.SetupWizard.PromptYesNo().

+ +
+
+ +

◆ WriteAsync()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.IConsole.WriteAsync (string text,
bool newLine,
CancellationToken cancellationToken 
)
+
+
+

Property Documentation

+ +

◆ Available

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.IO.IConsole.Available
+
+get
+
+ +

If the IConsole is visible to the user

+ +

Definition at line 14 of file IConsole.cs.

+
14 { get; }
+

Referenced by Tgstation.Server.Host.Core.SetupWizard.CheckRunWizard().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console.png b/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console.png new file mode 100644 index 0000000000000000000000000000000000000000..6d5733769ceea44476555c4bbbec5b61842da68c GIT binary patch literal 837 zcmeAS@N?(olHy`uVBq!ia0vp^XMi|>gBeIBMP&T|QW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;KgWHuBMv1`v?-PN+#x?w@ZCOfC0MpcB{XX8geB{C8Pu)i*8ZNj@Ak$uf4W09%b=T4bH=g-cg}Ek-hG!Nb!xlpoyxb zN&7twk2a`GOzl>aQ;(~iOE~3ep3u{MvQc?P?&G2-!OL#0b4%IODQ%GV zy60~3jLRn4s{Kj%k?a7maN( + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.IO.IIOManager Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.IO.IIOManager, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + +
ConcatPath(params string[] paths)Tgstation.Server.Host.IO.IIOManager
CopyDirectory(string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)Tgstation.Server.Host.IO.IIOManager
CopyFile(string src, string dest, CancellationToken cancellationToken)Tgstation.Server.Host.IO.IIOManager
CreateDirectory(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.IIOManager
DeleteDirectory(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.IIOManager
DeleteFile(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.IIOManager
DirectoryExists(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.IIOManager
DownloadFile(Uri url, CancellationToken cancellationToken)Tgstation.Server.Host.IO.IIOManager
FileExists(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.IIOManager
GetDirectories(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.IIOManager
GetDirectoryName(string path)Tgstation.Server.Host.IO.IIOManager
GetFileName(string path)Tgstation.Server.Host.IO.IIOManager
GetFileNameWithoutExtension(string path)Tgstation.Server.Host.IO.IIOManager
GetFiles(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.IIOManager
GetFilesWithExtension(string path, string extension, CancellationToken cancellationToken)Tgstation.Server.Host.IO.IIOManager
MoveDirectory(string source, string destination, CancellationToken cancellationToken)Tgstation.Server.Host.IO.IIOManager
MoveFile(string source, string destination, CancellationToken cancellationToken)Tgstation.Server.Host.IO.IIOManager
PathContainsParentAccess(string path)Tgstation.Server.Host.IO.IIOManager
ReadAllBytes(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.IIOManager
ResolvePath(string path)Tgstation.Server.Host.IO.IIOManager
WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)Tgstation.Server.Host.IO.IIOManager
ZipToDirectory(string path, byte[] zipFileBytes, CancellationToken cancellationToken)Tgstation.Server.Host.IO.IIOManager
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html b/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html new file mode 100644 index 0000000000..131fb83506 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html @@ -0,0 +1,1080 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.IO.IIOManager Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IO.IIOManager Interface Reference
+
+
+ +

Interface for using filesystems + More...

+
+Inheritance diagram for Tgstation.Server.Host.IO.IIOManager:
+
+
+ + +Tgstation.Server.Host.IO.DefaultIOManager +Tgstation.Server.Host.IO.ResolvingIOManager + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

string ResolvePath (string path)
 Retrieve the full path of some path given a relative path. Must be used before passing relative paths to other APIs. All other operations in this interface call this internally on given paths More...
 
string GetFileName (string path)
 Gets the file name portion of a path More...
 
string GetFileNameWithoutExtension (string path)
 Gets the file name portion of a path with More...
 
bool PathContainsParentAccess (string path)
 Check if a path contains the '..' parent directory accessor More...
 
Task CopyDirectory (string src, string dest, IEnumerable< string > ignore, CancellationToken cancellationToken)
 Copies a directory from src to dest More...
 
Task< bool > FileExists (string path, CancellationToken cancellationToken)
 Check that the file at path exists More...
 
Task< bool > DirectoryExists (string path, CancellationToken cancellationToken)
 Check that the directory at path exists More...
 
Task< byte[]> ReadAllBytes (string path, CancellationToken cancellationToken)
 Returns all the contents of a file at path as a byte array More...
 
Task< IReadOnlyList< string > > GetDirectories (string path, CancellationToken cancellationToken)
 Returns directory names in a given path More...
 
Task< IReadOnlyList< string > > GetFiles (string path, CancellationToken cancellationToken)
 Returns file names in a given path More...
 
Task WriteAllBytes (string path, byte[] contents, CancellationToken cancellationToken)
 Writes some contents to a file at path overwriting previous content More...
 
Task CopyFile (string src, string dest, CancellationToken cancellationToken)
 Copy a file from src to dest More...
 
string GetDirectoryName (string path)
 Gets the directory portion of a given path More...
 
Task< List< string > > GetFilesWithExtension (string path, string extension, CancellationToken cancellationToken)
 Gets a list of files in path with the given extension More...
 
Task DeleteFile (string path, CancellationToken cancellationToken)
 Deletes a file at path More...
 
Task CreateDirectory (string path, CancellationToken cancellationToken)
 Create a directory at path More...
 
Task DeleteDirectory (string path, CancellationToken cancellationToken)
 Recursively delete a directory More...
 
string ConcatPath (params string[] paths)
 Combines an array of strings into a path More...
 
Task MoveFile (string source, string destination, CancellationToken cancellationToken)
 Moves a file at source to destination More...
 
Task MoveDirectory (string source, string destination, CancellationToken cancellationToken)
 Moves a directory at source to destination More...
 
Task< byte[]> DownloadFile (Uri url, CancellationToken cancellationToken)
 Downloads a file from url More...
 
Task ZipToDirectory (string path, byte[] zipFileBytes, CancellationToken cancellationToken)
 Extract a set of zipFileBytes to a given path More...
 
+

Detailed Description

+

Interface for using filesystems

+ +

Definition at line 11 of file IIOManager.cs.

+

Member Function Documentation

+ +

◆ ConcatPath()

+ +
+
+ + + + + + + + +
string Tgstation.Server.Host.IO.IIOManager.ConcatPath (params string [] paths)
+
+ +

Combines an array of strings into a path

+
Parameters
+ + +
pathsThe paths to combine
+
+
+
Returns
The combined path
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +

Referenced by Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.CleanCache(), Tgstation.Server.Host.Core.SetupWizard.ConfigureLogging(), Tgstation.Server.Host.Core.Application.ConfigureServices(), Tgstation.Server.Host.Components.StaticFiles.Configuration.CopyDMFilesTo(), Tgstation.Server.Host.Controllers.InstanceController.Create(), Tgstation.Server.Host.Controllers.InstanceController.Delete(), Tgstation.Server.Host.Components.Compiler.DmbFactory.FromCompileJob(), Tgstation.Server.Host.Components.Byond.PosixByondInstaller.InstallByond(), Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.InstallByond(), Tgstation.Server.Host.Components.Byond.ByondManager.InstallVersion(), Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew(), Tgstation.Server.Host.Components.Compiler.DreamMaker.ModifyDme(), Tgstation.Server.Host.Components.Compiler.DreamMaker.RunCompileJob(), Tgstation.Server.Host.Components.Compiler.DreamMaker.RunDreamMaker(), Tgstation.Server.Host.Components.Byond.ByondManager.StartAsync(), Tgstation.Server.Host.Components.StaticFiles.Configuration.SymlinkStaticFilesTo(), Tgstation.Server.Host.Components.Chat.Chat.TrackJsons(), Tgstation.Server.Host.Components.Byond.ByondManager.UseExecutables(), and Tgstation.Server.Host.Components.Compiler.DreamMaker.VerifyApi().

+ +
+
+ +

◆ CopyDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.IIOManager.CopyDirectory (string src,
string dest,
IEnumerable< string > ignore,
CancellationToken cancellationToken 
)
+
+ +

Copies a directory from src to dest

+
Parameters
+ + + + + +
srcThe source directory path
destThe destination directory path
ignoreFiles and folders to ignore at the root level
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +

Referenced by Tgstation.Server.Host.Components.StaticFiles.Configuration.CopyDMFilesTo(), Tgstation.Server.Host.Components.InstanceManager.MoveInstance(), and Tgstation.Server.Host.Components.Compiler.DreamMaker.RunCompileJob().

+ +
+
+ +

◆ CopyFile()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.IIOManager.CopyFile (string src,
string dest,
CancellationToken cancellationToken 
)
+
+ +

Copy a file from src to dest

+
Parameters
+ + + + +
srcThe source file to copy
destThe destination path
cancellationTokenA CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +
+
+ +

◆ CreateDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.IIOManager.CreateDirectory (string path,
CancellationToken cancellationToken 
)
+
+
+ +

◆ DeleteDirectory()

+ + + +

◆ DeleteFile()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.IIOManager.DeleteFile (string path,
CancellationToken cancellationToken 
)
+
+
+ +

◆ DirectoryExists()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<bool> Tgstation.Server.Host.IO.IIOManager.DirectoryExists (string path,
CancellationToken cancellationToken 
)
+
+ +

Check that the directory at path exists

+
Parameters
+ + + +
pathThe directory to check for existence
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task resulting in true if the directory at path exists, false otherwise
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +

Referenced by Tgstation.Server.Host.Components.Repository.RepositoryManager.CloneRepository(), Tgstation.Server.Host.Controllers.InstanceController.Create(), and Tgstation.Server.Host.Components.StaticFiles.Configuration.SymlinkStaticFilesTo().

+ +
+
+ +

◆ DownloadFile()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<byte[]> Tgstation.Server.Host.IO.IIOManager.DownloadFile (Uri url,
CancellationToken cancellationToken 
)
+
+ +

Downloads a file from url

+
Parameters
+ + + +
urlThe URL to download
cancellationTokenA CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the bytes of the downloaded file
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +

Referenced by Tgstation.Server.Host.Server.ApplyUpdate(), Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DownloadVersion(), and Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.DownloadVersion().

+ +
+
+ +

◆ FileExists()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<bool> Tgstation.Server.Host.IO.IIOManager.FileExists (string path,
CancellationToken cancellationToken 
)
+
+
+ +

◆ GetDirectories()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<IReadOnlyList<string> > Tgstation.Server.Host.IO.IIOManager.GetDirectories (string path,
CancellationToken cancellationToken 
)
+
+ +

Returns directory names in a given path

+
Parameters
+ + + +
pathThe path to search for directories
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the directories in path
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DmbFactory.CleanUnusedCompileJobs(), Tgstation.Server.Host.Components.Byond.ByondManager.StartAsync(), and Tgstation.Server.Host.Components.StaticFiles.Configuration.SymlinkStaticFilesTo().

+ +
+
+ +

◆ GetDirectoryName()

+ +
+
+ + + + + + + + +
string Tgstation.Server.Host.IO.IIOManager.GetDirectoryName (string path)
+
+ +

Gets the directory portion of a given path

+
Parameters
+ + +
pathA path to check
+
+
+
Returns
The directory portion of the given path
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +
+
+ +

◆ GetFileName()

+ +
+
+ + + + + + + + +
string Tgstation.Server.Host.IO.IIOManager.GetFileName (string path)
+
+ +

Gets the file name portion of a path

+
Parameters
+ + +
pathThe path to get the file name of
+
+
+
Returns
The file name portion of path
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DmbFactory.CleanUnusedCompileJobs(), and Tgstation.Server.Host.Components.Compiler.DreamMaker.RunCompileJob().

+ +
+
+ +

◆ GetFileNameWithoutExtension()

+ +
+
+ + + + + + + + +
string Tgstation.Server.Host.IO.IIOManager.GetFileNameWithoutExtension (string path)
+
+ +

Gets the file name portion of a path with

+
Parameters
+ + +
pathThe path to get the file name of
+
+
+
Returns
The file name portion of path
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +
+
+ +

◆ GetFiles()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<IReadOnlyList<string> > Tgstation.Server.Host.IO.IIOManager.GetFiles (string path,
CancellationToken cancellationToken 
)
+
+ +

Returns file names in a given path

+
Parameters
+ + + +
pathThe path to search for files
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in the files in path
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +

Referenced by Tgstation.Server.Host.Components.StaticFiles.Configuration.SymlinkStaticFilesTo().

+ +
+
+ +

◆ GetFilesWithExtension()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<List<string> > Tgstation.Server.Host.IO.IIOManager.GetFilesWithExtension (string path,
string extension,
CancellationToken cancellationToken 
)
+
+ +

Gets a list of files in path with the given extension

+
Parameters
+ + + + +
pathThe directory which contains the files
extensionThe extension to look for without the preceeding "."
cancellationTokenA CancellationToken for the operation
+
+
+
Returns
A Task resulting in a list of paths to files in path with the given extension
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew(), and Tgstation.Server.Host.Components.Compiler.DreamMaker.RunCompileJob().

+ +
+
+ +

◆ MoveDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.IIOManager.MoveDirectory (string source,
string destination,
CancellationToken cancellationToken 
)
+
+ +

Moves a directory at source to destination

+
Parameters
+ + + + +
sourceThe source directory path
destinationThe destination path
cancellationTokenA CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +
+
+ +

◆ MoveFile()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.IIOManager.MoveFile (string source,
string destination,
CancellationToken cancellationToken 
)
+
+ +

Moves a file at source to destination

+
Parameters
+ + + + +
sourceThe source file path
destinationThe destination path
cancellationTokenA CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +
+
+ +

◆ PathContainsParentAccess()

+ +
+
+ + + + + + + + +
bool Tgstation.Server.Host.IO.IIOManager.PathContainsParentAccess (string path)
+
+ +

Check if a path contains the '..' parent directory accessor

+
Parameters
+ + +
pathThe path to check
+
+
+
Returns
true if path contains a '..' accessor, false otherwise
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +

Referenced by Tgstation.Server.Host.Controllers.ConfigurationController.ForbidDueToModeConflicts().

+ +
+
+ +

◆ ReadAllBytes()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<byte[]> Tgstation.Server.Host.IO.IIOManager.ReadAllBytes (string path,
CancellationToken cancellationToken 
)
+
+
+ +

◆ ResolvePath()

+ +
+
+ + + + + + + + +
string Tgstation.Server.Host.IO.IIOManager.ResolvePath (string path)
+
+ +

Retrieve the full path of some path given a relative path. Must be used before passing relative paths to other APIs. All other operations in this interface call this internally on given paths

+
Parameters
+ + +
pathSome path to retrieve the full path of
+
+
+
Returns
path as a full canonical path
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager, and Tgstation.Server.Host.IO.ResolvingIOManager.

+ +

Referenced by Tgstation.Server.Host.Components.Compiler.DreamMaker.CleanupFailedCompile(), Tgstation.Server.Host.Components.Repository.RepositoryManager.CloneRepository(), Tgstation.Server.Host.Components.Interop.CommContext.CommContext(), Tgstation.Server.Host.Controllers.InstanceController.Create(), Tgstation.Server.Host.Components.Byond.ByondManager.InstallVersion(), Tgstation.Server.Host.Components.Repository.RepositoryManager.LoadRepository(), Tgstation.Server.Host.Components.Compiler.DreamMaker.ModifyDme(), Tgstation.Server.Host.Controllers.InstanceController.NormalizeModelPath(), Tgstation.Server.Host.IO.ResolvingIOManager.ResolvingIOManager(), Tgstation.Server.Host.Components.Compiler.DreamMaker.RunCompileJob(), Tgstation.Server.Host.Components.Compiler.DreamMaker.RunDreamMaker(), Tgstation.Server.Host.Components.Byond.ByondManager.StartAsync(), Tgstation.Server.Host.Components.StaticFiles.Configuration.SymlinkStaticFilesTo(), Tgstation.Server.Host.Components.Byond.ByondManager.UseExecutables(), Tgstation.Server.Host.Components.StaticFiles.Configuration.ValidateConfigRelativePath(), and Tgstation.Server.Host.Components.Compiler.DreamMaker.VerifyApi().

+ +
+
+ +

◆ WriteAllBytes()

+ + + +

◆ ZipToDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.IIOManager.ZipToDirectory (string path,
byte [] zipFileBytes,
CancellationToken cancellationToken 
)
+
+ +

Extract a set of zipFileBytes to a given path

+
Parameters
+ + + + +
pathThe path to unzip to
zipFileBytesThe bytes of the System.IO.Compression.ZipArchive
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.IO.DefaultIOManager.

+ +

Referenced by Tgstation.Server.Host.Server.ApplyUpdate(), and Tgstation.Server.Host.Components.Byond.ByondManager.InstallVersion().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.png b/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..91f072b10281f603a8915d383054e75717b87653 GIT binary patch literal 1600 zcmb`Hdo+}39LHZ2A!V^hOyXVIk`@s&k}|XNjv-7FiODsVEXG}u*)ABfg>k=ahZ(7L zYcvz1b=k%>LL7uKY%S7^ks=u;JMHBh`+v_lpXd91&UyZNKF|4)olm2c6tolo08qj} zNE`r2sYrV24jIX=?UzlGgr>6t9<{l-DXFgoE79psG9>M9T3cJUlezmO#~o3)(`Nw5 zrO#{lDc%$Sw)bO@C-HGo3ndeEuMX}+=1rVk+jO!ic%f;oG0|O+A~+uLoY<<{b}H2^ z_o6#)$wvwrHp~R_Rpd$E{uA?B7!1euFiW&??9sq(Y0V)1NDPl(>&855VD#e*$7^ET z!(}km1O!TY2_&|0CKFr#NN0rb37ESq(|y%vvtXTdva^4raVrVQf5j+-b(|#OWU~92snz;3uH*V%$?9C7$@MUZH&kAK-a1{+H;0*}mvtn>0 z1`i!^IefgR%stl8P)zXQOu;SXR94H9CVM_6S>^ql`2r^=H>a29$+es$3ofX`feMkJ z!%BF=Eh3%WtTd4^Pb(kyXX|qY?Kwp$1h9f&2IDfchQJ<|5 z4NR5Si?8b2+rO3G0Gs%$3377NqlfE zRdutG(gO#6+G^lm5nmvh<+>Yd_-?NmHGGkhZw?)ws6qw{wxR|0e1H_nUGHobhWQkO zgiHU~9*!S!e8~2f!R8ggFm;1yOjuV2gfo1Pq|P=X2Wt;T!Ql1!RwCgGVJHrH8CgW9_UC!sMF-bXWv9W5)<}`JtA!YO`b`<|VEEdOH>34#Q_!A1Z>6|2W6I zC-E|xc|{}Z*ztokP2UQ%FeM!u3zLe@>X=);!*#<~(iA~ex*f=i zO>@H?o`as8>M;#~Vm_MRqXaU79(2Lmt*B2KqB4~0%Z?lvBh0LBNnk)7x<15HBe)7& zc4lx-SaRMX(1R;F=wkZ$Pfo^r^cm&5cJ-l*3%HgX&%y0A%&wye?ysS=nT}hLT>0AH zCd)UJGxw9xSXOrgx`F8X2@%pheLE87*87!0!nkE|cxT~6?XK?v`!kM)fb$w}{E4a{ zjYOq;l~UTDmC@TOK{34Ki15#8Xt3oTQV(-?D~8l)!YDotXtvu;!s|)p&o4m+wnpS_ z58i=P2a>ajye(~;w6{G7+(mxj5WzrxV~tm7r{sSeOFc`)tzbZ^zx@^tLb(f>YWCGO zo90tbQ$jPqTg>Q7h{cuBL*rU;W-(aYfq;rDP4m;b_M%L~$Rb5*)O{={HZ@3gnl(cp zh8`zapxzyI?rrkkcfx~jF=vA14p%qFE*qe6HfntJo9Y%kcAwX5Tn^1H$kIp_6vmsw z!4w@}z3_La#-;b`Yr zA?A1VEClkUeCrf5(iL4|t4?TS)HTqEY2=seUqNtl_9Q!AKXCs{Z&_Pa)B}V%t)X(i zN-XD6HO&mHkPFnFD&^5Mb=isG9TOsTs{35us#9e5a#!cjfKD;R)3liw@ID=m9POxR zn2UWi-L`kGLG=O|KD%JC&2Hp&E_`Yo3(mIr_T(OKCdw8Oi! + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.IO.IPostWriteHandler Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.IO.IPostWriteHandler, including all inherited members.

+ + +
HandleWrite(string filePath)Tgstation.Server.Host.IO.IPostWriteHandler
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_post_write_handler.html b/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_post_write_handler.html new file mode 100644 index 0000000000..3a6f147b65 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_post_write_handler.html @@ -0,0 +1,143 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.IO.IPostWriteHandler Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IO.IPostWriteHandler Interface Reference
+
+
+ +

Handles changing file modes/permissions after writing + More...

+
+Inheritance diagram for Tgstation.Server.Host.IO.IPostWriteHandler:
+
+
+ + +Tgstation.Server.Host.IO.PosixPostWriteHandler +Tgstation.Server.Host.IO.WindowsPostWriteHandler + +
+ + + + + +

+Public Member Functions

void HandleWrite (string filePath)
 For handling system specific necessities after a write More...
 
+

Detailed Description

+

Handles changing file modes/permissions after writing

+ +

Definition at line 6 of file IPostWriteHandler.cs.

+

Member Function Documentation

+ +

◆ HandleWrite()

+ +
+
+ + + + + + + + +
void Tgstation.Server.Host.IO.IPostWriteHandler.HandleWrite (string filePath)
+
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_post_write_handler.png b/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_post_write_handler.png new file mode 100644 index 0000000000000000000000000000000000000000..fa490763034174a37084252fab1496591ef657e8 GIT binary patch literal 1579 zcmb7Edo}qVOx5B% z-Mj!S`aJqOysZFGt|vI`^`;{fc`_!~M$-YMC|z7On+dI5P}yjg>=HTS#^12!d)d)P zP8A@i6YI*#DWs|+g29Nm58=Qk1ACGUW23J|u$r^#YH=h&^WY@-jr0SkbUS)W$FgjH?GB1x^no+1~%&xL}h)32Y7fUXy&tH;sv^^C* ze5_P}6Z$7|!rtt|cbb!n*mdzr!|pE9iP^!Ae+)+knnp$?XC`Ig1;g!WzMB26(L*Kl zMH$&gK^?cn2WasUhN9%B8K)B%YiL-8NlTx9$Q58gbgFmqL;NM@s{#Ag`~VqB)ST)A z^jiMgi~f^=Pg?7MiUxfcnX)qkL&%ws|Vh+MQXR^ZV53i}yW#cYV#S)80y+3=9%k$8qOo zpBd>Z?Ketmg*HkY&rw}YWD!KA`+cE+^Qa1)CXQ^rM6b!TY$jazCGe{_Dask>x40@5N~ zwd|3H8d^$G?KOUax1r8%{tjc00!(*VOPTx5Q2Wk=A-KKby;m?YkK2^$=Q)z8QQG7E z#{(j$G3@Gj#`?qW#Wj+?B$sur*n8)ON?nH?F9||9+z8tis zuiM?&pp!xrEEG@*`?a!<ic$fNKjo51^tpe8vs6!+(NnOr0u2-b)H_?se1lIJXEeDYx5XzF zyY%wyPVH082L(^F%r$K7M#FFQ5a@98W}ddMv$`il2?$wcgW>V1!oVTc+jA1HP!4c1siEJBWpUh#2RJ_IEc7uNw$qe=GBn^l zwLwn?z3hduoSEr6OQ5LTS?FW_lFiv@qoX4>rtKF4iqQImNH{f^bU0SXe-9O-Na9Is m&u4pH?1C@_p`Juci!t}!SyaXN>Mr + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.IO.ISymlinkFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.IO.ISymlinkFactory, including all inherited members.

+ + +
CreateSymbolicLink(string targetPath, string linkPath, CancellationToken cancellationToken)Tgstation.Server.Host.IO.ISymlinkFactory
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_symlink_factory.html b/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_symlink_factory.html new file mode 100644 index 0000000000..a2c384f801 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_symlink_factory.html @@ -0,0 +1,162 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.IO.ISymlinkFactory Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IO.ISymlinkFactory Interface Reference
+
+
+ +

For creating filesystem symbolic links + More...

+
+Inheritance diagram for Tgstation.Server.Host.IO.ISymlinkFactory:
+
+
+ + +Tgstation.Server.Host.IO.PosixSymlinkFactory +Tgstation.Server.Host.IO.WindowsSymlinkFactory + +
+ + + + + +

+Public Member Functions

Task CreateSymbolicLink (string targetPath, string linkPath, CancellationToken cancellationToken)
 Create a symbolic link More...
 
+

Detailed Description

+

For creating filesystem symbolic links

+ +

Definition at line 9 of file ISymlinkFactory.cs.

+

Member Function Documentation

+ +

◆ CreateSymbolicLink()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.IO.ISymlinkFactory.CreateSymbolicLink (string targetPath,
string linkPath,
CancellationToken cancellationToken 
)
+
+ +

Create a symbolic link

+
Parameters
+ + + + +
targetPathThe path to the hard target
linkPathThe path to the link
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.IO.PosixSymlinkFactory, and Tgstation.Server.Host.IO.WindowsSymlinkFactory.

+ +

Referenced by Tgstation.Server.Host.Components.StaticFiles.Configuration.SymlinkStaticFilesTo(), Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.TestDirectoryWorks(), Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.TestFailsProperly(), and Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.TestFileWorks().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_symlink_factory.png b/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_symlink_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..f24c773e5632676ec7bf6fa5811d73a1af7c4ad8 GIT binary patch literal 1603 zcmb7Ee>l^59RF^t6Itn$ap6Q|QzVL5c@WxU=DQ!5YP%fyaV?5M(kd5`oyKyNCE3)5 z{J6T|{FsVres#{!E$Pz8kF`p(hT47g=RMEe^W5io-k;a|{eFGk@6YG?d|uDzJdqG! zY-nK!0Dv)W_bw0s;E(}C13hR~P~#&ZKoR$l{d77V+ z?Ak|Xd9L&^Sf9CK4nVQi6`M&`1nAeWXW*!p*}y>Je!zE)iNvGFh>>jz4||vjTb8&B zm|8YtDEGP^qx~>mJyT+RN@@sLa~6H;X=(S(yG$0J9m*@I&Gg1GvdYPM>XO*KX?I4I@^BnmUM z6aE&>wAA;d#iPlMbUE^b$pjx==Gc1M==xbMJnSG&I2geqy22Y)S#nM*Fa=D-{fJg6 zFYXZ=>>diPD4<4h1!#4DkO|fB1xV#eRpPXffN(=0{0Z^e8;6H8BQZJt!nA21C@@+X z=@v0oYT$rKK$qB4n!5Pj!NO176 z{jS{MfOu;;@P5Grqr%HC&8C~Fx+^b6jSSCv3P71a6W?2AO5zjd^TbB&+cSMTvyP0) zHGkb$D0gHb7uzbDm}b)yL^zsd6fUiJCIa3_=q^$`EL}p|ANvce{;N~H_RtQne>|MK z6U&Bez_1)gY<^$@s~l|t&bhB;CHok(Wv=kC2K3$rrUEDkbhRL`@h2ZAXnZr#wK7RwdA!JL(NXI2Y{H_FRsgEpA6;pO` z$Z>7M9YE$*;s~`xD;%doeXDto1RACjFojwhkDfZ zdV*Qr!V@hoV?GaKFV-B_TD{&JnBTt^ExrhfAH~q^kxtDs=nOZp5Nz+7FgcN^jQU=$ zk94Vs&?1RL@1zTQrqDN)PLZmZ97MWlciSx?sKb^87tW)I)&d0aB z;|&(fQR7eKOSkQn1XHuCs`)p9xO0Q%6t$)h-*?gzI-kr;e#`m{q$T=iVz-_-=jj8LNGKg|kjEK$&zj=V2&CAs^gzsrk~`@dh47 zR=*CX85hyaxN}@{9N4L7P;)Uw-{Bg!(_KZ?{Z5^`IkelohidQwZU~3j>y~Fx3ASQv zadBE7=4f6prz>T&z>XwP + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.IO.ISynchronousIOManager Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.IO.ISynchronousIOManager, including all inherited members.

+ + + + + + + + +
CreateDirectory(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.ISynchronousIOManager
DeleteDirectory(string path)Tgstation.Server.Host.IO.ISynchronousIOManager
GetDirectories(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.ISynchronousIOManager
GetFiles(string path, CancellationToken cancellationToken)Tgstation.Server.Host.IO.ISynchronousIOManager
IsDirectory(string path)Tgstation.Server.Host.IO.ISynchronousIOManager
ReadFile(string path)Tgstation.Server.Host.IO.ISynchronousIOManager
WriteFileChecked(string path, byte[] data, ref string sha1InOut, CancellationToken cancellationToken)Tgstation.Server.Host.IO.ISynchronousIOManager
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.html b/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.html new file mode 100644 index 0000000000..8c270e1f30 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.html @@ -0,0 +1,399 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.IO.ISynchronousIOManager Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IO.ISynchronousIOManager Interface Reference
+
+
+ +

For accessing the disk in a synchronous manner + More...

+
+Inheritance diagram for Tgstation.Server.Host.IO.ISynchronousIOManager:
+
+
+ + +Tgstation.Server.Host.IO.SynchronousIOManager + +
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

IEnumerable< string > GetFiles (string path, CancellationToken cancellationToken)
 Enumerate files in a given path More...
 
IEnumerable< string > GetDirectories (string path, CancellationToken cancellationToken)
 Enumerate directories in a given path More...
 
bool CreateDirectory (string path, CancellationToken cancellationToken)
 Create an empty directory at path More...
 
byte [] ReadFile (string path)
 Read the bytes of a file at a given path More...
 
bool DeleteDirectory (string path)
 Deletes a directory at path if it's empty More...
 
bool WriteFileChecked (string path, byte[] data, ref string sha1InOut, CancellationToken cancellationToken)
 Write data to a file at a given path More...
 
bool IsDirectory (string path)
 Checks if a given path is a directory More...
 
+

Detailed Description

+

For accessing the disk in a synchronous manner

+ +

Definition at line 9 of file ISynchronousIOManager.cs.

+

Member Function Documentation

+ +

◆ CreateDirectory()

+ +
+
+ + + + + + + + + + + + + + + + + + +
bool Tgstation.Server.Host.IO.ISynchronousIOManager.CreateDirectory (string path,
CancellationToken cancellationToken 
)
+
+ +

Create an empty directory at path

+
Parameters
+ + + +
pathThe path to create
cancellationTokenThe CancellationToken for the operation. Usage may result in partial writes
+
+
+
Returns
true if the directory already existed, false otherwise
+ +

Implemented in Tgstation.Server.Host.IO.SynchronousIOManager.

+ +
+
+ +

◆ DeleteDirectory()

+ +
+
+ + + + + + + + +
bool Tgstation.Server.Host.IO.ISynchronousIOManager.DeleteDirectory (string path)
+
+ +

Deletes a directory at path if it's empty

+
Parameters
+ + +
pathThe path of the directory to delete
+
+
+
Returns
true if the directory does not exist or is empty and was deleted. false otherwise
+ +

Implemented in Tgstation.Server.Host.IO.SynchronousIOManager.

+ +
+
+ +

◆ GetDirectories()

+ +
+
+ + + + + + + + + + + + + + + + + + +
IEnumerable<string> Tgstation.Server.Host.IO.ISynchronousIOManager.GetDirectories (string path,
CancellationToken cancellationToken 
)
+
+ +

Enumerate directories in a given path

+
Parameters
+ + + +
pathThe path to look for directories in
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A IEnumerable<T> of directory names in path
+ +

Implemented in Tgstation.Server.Host.IO.SynchronousIOManager.

+ +

Referenced by Tgstation.Server.Host.Components.StaticFiles.Configuration.ListDirectory().

+ +
+
+ +

◆ GetFiles()

+ +
+
+ + + + + + + + + + + + + + + + + + +
IEnumerable<string> Tgstation.Server.Host.IO.ISynchronousIOManager.GetFiles (string path,
CancellationToken cancellationToken 
)
+
+ +

Enumerate files in a given path

+
Parameters
+ + + +
pathThe path to look for files in
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A IEnumerable<T> of file names in path
+ +

Implemented in Tgstation.Server.Host.IO.SynchronousIOManager.

+ +

Referenced by Tgstation.Server.Host.Components.StaticFiles.Configuration.ListDirectory().

+ +
+
+ +

◆ IsDirectory()

+ +
+
+ + + + + + + + +
bool Tgstation.Server.Host.IO.ISynchronousIOManager.IsDirectory (string path)
+
+ +

Checks if a given path is a directory

+
Parameters
+ + +
pathThe path to check
+
+
+
Returns
true if path is a directory, false otherwise
+ +

Implemented in Tgstation.Server.Host.IO.SynchronousIOManager.

+ +

Referenced by Tgstation.Server.Host.Components.StaticFiles.Configuration.Read().

+ +
+
+ +

◆ ReadFile()

+ +
+
+ + + + + + + + +
byte [] Tgstation.Server.Host.IO.ISynchronousIOManager.ReadFile (string path)
+
+ +

Read the bytes of a file at a given path

+
Parameters
+ + +
pathThe path of the file to read
+
+
+
Returns
A byte array representing the contents of the file at path
+ +

Implemented in Tgstation.Server.Host.IO.SynchronousIOManager.

+ +

Referenced by Tgstation.Server.Host.Components.StaticFiles.Configuration.Read().

+ +
+
+ +

◆ WriteFileChecked()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
bool Tgstation.Server.Host.IO.ISynchronousIOManager.WriteFileChecked (string path,
byte [] data,
ref string sha1InOut,
CancellationToken cancellationToken 
)
+
+ +

Write data to a file at a given path

+
Parameters
+ + + + + +
pathThe path to the file to write
dataThe new contents of the file
sha1InOutThe function only succeeds if this parameter matches the SHA-1 hash of the contents of the current file. Contains the SHA1 of the file on disk once the function returns
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
true on success, false if the operation failed due to sha1InOut not matching the file's contents
+ +

Implemented in Tgstation.Server.Host.IO.SynchronousIOManager.

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.png b/interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..8aba096937c4625d8d5ecb77ad770d9648f64d9f GIT binary patch literal 1179 zcmeAS@N?(olHy`uVBq!ia0y~yVAKS%12~w0WRYw!FOZT5@CkAK|NlRb`Qpvj(*8pe zfGjXRaNq!I=N)+Sh6`jbIq(D>Optc-9C2azy_@Y3f3j&5APkVD73sCoSP%FZrOW}pLcv` ze)+iGbEd@YcV$b?seGB0zwkzQ_pDcX-V)pWX4}?VC%}EnZwam-p<}rTa4_va;gdcz9k?c^*6ITa}9G z`zO~{tF%7Jng3()%e~59H(k_`%iQsA@BMvulmTK|Co%4Hn(@Sj=A0~O8QqS{xyy2{@rf}NryM0$? zw#R+bmHM3(7<~6=+m#1j`90S9&DYhKZDB9fykD`j`q!~}rm;ti7qYIreL219CwI_k z<9i;q;g5w^KCjO5J=MD1qL%;rm1W<3m$2pU?)6i5)GDfq_*wER=l$+omoLiYY?sKs z_Ju2Z<^H1YlU~+-v)h|vdHC^C12%(F>-z`KteJVOIy=wg>pszyj5Aego9*P!UV7}3 zwP&sB%lWSkAI$k~e?3II%JUaft<8+P|E4eZpApE#tT@IFnGH9xvX + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.IServer Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.IServer, including all inherited members.

+ + + +
RestartRequestedTgstation.Server.Host.IServer
RunAsync(CancellationToken cancellationToken)Tgstation.Server.Host.IServer
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_i_server.html b/interface_tgstation_1_1_server_1_1_host_1_1_i_server.html new file mode 100644 index 0000000000..a31daee087 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_i_server.html @@ -0,0 +1,178 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.IServer Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IServer Interface Reference
+
+
+ +

Represents the host + More...

+
+Inheritance diagram for Tgstation.Server.Host.IServer:
+
+
+ + +Tgstation.Server.Host.Server +Tgstation.Server.Tests.TestingServer + +
+ + + + + +

+Public Member Functions

Task RunAsync (CancellationToken cancellationToken)
 Runs the IServer More...
 
+ + + + +

+Properties

bool RestartRequested [get]
 If the IServer should restart More...
 
+

Detailed Description

+

Represents the host

+ +

Definition at line 9 of file IServer.cs.

+

Member Function Documentation

+ +

◆ RunAsync()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.IServer.RunAsync (CancellationToken cancellationToken)
+
+ +

Runs the IServer

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Server, and Tgstation.Server.Tests.TestingServer.

+ +

Referenced by Tgstation.Server.Host.Program.Main().

+ +
+
+

Property Documentation

+ +

◆ RestartRequested

+ +
+
+ + + + + +
+ + + + +
bool Tgstation.Server.Host.IServer.RestartRequested
+
+get
+
+ +

If the IServer should restart

+ +

Definition at line 14 of file IServer.cs.

+
14 { get; }
+
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_i_server.png b/interface_tgstation_1_1_server_1_1_host_1_1_i_server.png new file mode 100644 index 0000000000000000000000000000000000000000..47ff4069e03ced01a0117f60341eae84823c271f GIT binary patch literal 1132 zcmeAS@N?(olHy`uVBq!ia0y~yU_1h32XHV0$qkHO&j2Zj0G|-o|Ns93nJ?aaE$u%v z0muU50|ySUcHWT(ayd$Z{DK*Pia_A%sSqOu2Ik+ME{-7;jBn>=Pg-oi!#4YT=$-#3 zX0!0rF@8IjqNQ|eQM&MBj~l&D_A}Isyia!1N`!l{?qk(JsjeRpcSyoi^e$Tx>^+;m?gQ%Y2&8L~V-Qk%k_1BUr zeeZasaqkGbSbWP!Rr-|bF=@l9z?at-GHAslMTM?E>#L{sO?#%m-2A*nGh)4DPN{?` ze(sb7OJ9@PzV~cZ?B3;_$2c`S_NOg>=hy`{f8&%HZ_@AlQ0~kwJm$B%bZ^dzz|QKf znjm+Ob0R!#a+e={w*0Q?&7Vr?sv9$wGlNWfbYtd?X){h{Zn@lTT&N)8(CU5W+|s?* zb??57TcfQn?B=gK_`Q}_i?A|=U5ZC zQ33`MP;=f-wD7%L63!sga6g5ufZ@#}A;uiz^Lc^?O!Nc~nDMs*Sw=vX%{qYt7C@Q+ zeqcWHdF4MghP>0$r?h&r81#{W&&BH-w+Q^}vjh?Ok!cf_%%0>mWy$PELaHY%^a3aK zJccof^$Mf@d3vq;`}%Qkq5jXgDzTe=wAGKl|68cCa@nLG-&kW+EanBYzmNZus%q9W z|Bm-DYw=pOLWMq+t6Q`_p5?akzhItdlD_=NaqEwNKGc}Ty+8gfU9$FX?cKBUGi#^M zyF5+vW`LgIy^f2=A9)0w-FRfXZifE^ef5>Ap0$J<<~e6(#yx*Cd54`#RpzBSRpCcs zxp|M8-^D8Pr3$T{kPLLhvw%mx#imTTpdxzxXv>?+4(IYZe<#1W9iQiLYlfO9@1^xO z1uuFT3b;?oI;XNP(~+HXQ}V|Ir>Wb`pHDcVl6B|DV$=2dAvr$LZ_}N7z3v3}9G$pi zmUd@;M8F=&c4^(kmJ8=@*MC0a$mMsF_g=0H_xU8g+(*^$??VR}&s968{P@l7CA5Tf zp6r^noT2v`=j^Xg+jf0UZusK4^X7IkgIt%M{-|E}g?joUyAY2(CvK{Llq_BUcj>YD z`A5UY+e-U`!t?cQ`r@AlS@#%+o4{Dt17WL@<3rb21p7iFz zq>LoTVq-PIVW)_-kItGChIw#$M$UNoXig_8W=oX{an^LB{Ts5=$Hb~ literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_i_server_factory-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_i_server_factory-members.html new file mode 100644 index 0000000000..2df9ab7f60 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_i_server_factory-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.IServerFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.IServerFactory, including all inherited members.

+ + +
CreateServer(string[] args, string updatePath)Tgstation.Server.Host.IServerFactory
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_i_server_factory.html b/interface_tgstation_1_1_server_1_1_host_1_1_i_server_factory.html new file mode 100644 index 0000000000..7e189b183a --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_i_server_factory.html @@ -0,0 +1,152 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.IServerFactory Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IServerFactory Interface Reference
+
+
+ +

For creating IServers + More...

+
+Inheritance diagram for Tgstation.Server.Host.IServerFactory:
+
+
+ + +Tgstation.Server.Host.ServerFactory + +
+ + + + + +

+Public Member Functions

IServer CreateServer (string[] args, string updatePath)
 Create a IServer More...
 
+

Detailed Description

+

For creating IServers

+ +

Definition at line 6 of file IServerFactory.cs.

+

Member Function Documentation

+ +

◆ CreateServer()

+ +
+
+ + + + + + + + + + + + + + + + + + +
IServer Tgstation.Server.Host.IServerFactory.CreateServer (string [] args,
string updatePath 
)
+
+ +

Create a IServer

+
Parameters
+ + + +
argsThe arguments for the IServer
updatePathThe directory in which to install server updates
+
+
+
Returns
A new IServer
+ +

Implemented in Tgstation.Server.Host.ServerFactory.

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_i_server_factory.png b/interface_tgstation_1_1_server_1_1_host_1_1_i_server_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..958f35beb8b02ce528b1f802172d70343283d584 GIT binary patch literal 873 zcmeAS@N?(olHy`uVBq!ia0vp^4}ds;gBeJgTXrr3QW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;*}|fFPg`4 z;nGgNg!P{*f15vBC7Q0k;}J`?GCM~=ro6mz4U2&BRA-HVIV|_lQdtypj)GX<>T&$#C0_?6+jv+vF7 zpC!({!e_iI7PE(&xxQ!EeBA6oZkJf2Xy@bX1^hQG8X3cTMRHSoj{OSc-NqREpjV`J z#X-mL^QIO28M|Lxeg17*=I#~xoY#M?S#I+r>s(3T=Go2bV#N1WEq}de-`@Lm{}`Ty zh;PVIU=TiK@>59NJh8zuRUk@}>w}c8L&MCi42)^lzVY%awtVM$5dM|1V)H$|A3yiZ z`S7+OeqXupKDmO@z=oY*RZJ{1BDn<;(%{Mxa*W9-?JFKE&=0X zlF4Sh0|kFPjl%2x{L{L(RQ#%nXVyyt?cU3uXUq?qu=m6(;Wck%7N~^YI)0oZpOO7< ziCN?%t5uBqrMLXO@h$WIn%8AL@4o+C`@J^rOUpD_b+nwB{ z33{wg;Sn;$&zWySk>$JN@3LR6oO7N1%R%AhO4|h z|C(=uPL1a*U$cL|Sc>JREs=csD1X@smA$Uq0h7|MF-=)A^DAqQ;W6>o^8XL$y*=_J S@&_ + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.IDatabaseContext Member List
+
+ + + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html b/interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html new file mode 100644 index 0000000000..884d5a8767 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html @@ -0,0 +1,616 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.IDatabaseContext Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.IDatabaseContext Interface Reference
+
+
+ +

Represents the database + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.IDatabaseContext:
+
+
+ + +Tgstation.Server.Host.Models.DatabaseContext< TParentContext > + +
+ + + + + + + + + + + +

+Public Member Functions

Task Save (CancellationToken cancellationToken)
 Saves changes made to the IDatabaseContext More...
 
Task Initialize (CancellationToken cancellationToken)
 Creates and migrates the IDatabaseContext More...
 
Task SchemaDowngradeForServerVersion (Version version, CancellationToken cancellationToken)
 Attempt to downgrade the schema to the migration used for a given server version More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Properties

DbSet< UserUsers [get]
 The Users in the IDatabaseContext More...
 
DbSet< InstanceInstances [get]
 The Instances in the IDatabaseContext More...
 
DbSet< InstanceUserInstanceUsers [get]
 The InstanceUsers in the IDatabaseContext More...
 
DbSet< JobJobs [get]
 The Jobs in the IDatabaseContext More...
 
DbSet< CompileJobCompileJobs [get]
 The CompileJobs in the IDatabaseContext More...
 
DbSet< RevisionInformationRevisionInformations [get]
 The RevisionInformations in the IDatabaseContext More...
 
DbSet< DreamMakerSettingsDreamMakerSettings [get, set]
 The Models.DreamMakerSettings in the IDatabaseContext More...
 
DbSet< DreamDaemonSettingsDreamDaemonSettings [get, set]
 The Models.DreamDaemonSettings in the IDatabaseContext More...
 
DbSet< ChatBotChatBots [get, set]
 The Models.ChatBot in the IDatabaseContext More...
 
DbSet< ChatChannelChatChannels [get, set]
 The ChatChannel in the IDatabaseContext More...
 
DbSet< RepositorySettingsRepositorySettings [get, set]
 The Models.RepositorySettings in the IDatabaseContext More...
 
DbSet< ReattachInformationReattachInformations [get, set]
 The DbSet<TEntity> for Models.ReattachInformations More...
 
DbSet< WatchdogReattachInformationWatchdogReattachInformations [get, set]
 The DbSet<TEntity> for Models.WatchdogReattachInformations More...
 
+

Detailed Description

+

Represents the database

+ +

Definition at line 11 of file IDatabaseContext.cs.

+

Member Function Documentation

+ +

◆ Initialize()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Models.IDatabaseContext.Initialize (CancellationToken cancellationToken)
+
+ +

Creates and migrates the IDatabaseContext

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.

+ +
+
+ +

◆ Save()

+ +
+
+ + + + + + + + +
Task Tgstation.Server.Host.Models.IDatabaseContext.Save (CancellationToken cancellationToken)
+
+ +

Saves changes made to the IDatabaseContext

+
Parameters
+ + +
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.

+ +

Referenced by Tgstation.Server.Host.Models.DatabaseSeeder.ResetAdminPassword(), and Tgstation.Server.Host.Models.DatabaseSeeder.SeedDatabase().

+ +
+
+ +

◆ SchemaDowngradeForServerVersion()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Models.IDatabaseContext.SchemaDowngradeForServerVersion (Version version,
CancellationToken cancellationToken 
)
+
+ +

Attempt to downgrade the schema to the migration used for a given server version

+
Parameters
+ + + +
versionThe tgstation-server Version that the schema should downgrade for
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Models.DatabaseContext< TParentContext >.

+ +
+
+

Property Documentation

+ +

◆ ChatBots

+ +
+
+ + + + + +
+ + + + +
DbSet<ChatBot> Tgstation.Server.Host.Models.IDatabaseContext.ChatBots
+
+getset
+
+ +

The Models.ChatBot in the IDatabaseContext

+ +

Definition at line 56 of file IDatabaseContext.cs.

+
56 { get; set; }
+
+
+ +

◆ ChatChannels

+ +
+
+ + + + + +
+ + + + +
DbSet<ChatChannel> Tgstation.Server.Host.Models.IDatabaseContext.ChatChannels
+
+getset
+
+ +

The ChatChannel in the IDatabaseContext

+ +

Definition at line 61 of file IDatabaseContext.cs.

+
61 { get; set; }
+
+
+ +

◆ CompileJobs

+ +
+
+ + + + + +
+ + + + +
DbSet<CompileJob> Tgstation.Server.Host.Models.IDatabaseContext.CompileJobs
+
+get
+
+ +

The CompileJobs in the IDatabaseContext

+ +

Definition at line 36 of file IDatabaseContext.cs.

+
36 { get; }
+

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess().

+ +
+
+ +

◆ DreamDaemonSettings

+ +
+
+ + + + + +
+ + + + +
DbSet<DreamDaemonSettings> Tgstation.Server.Host.Models.IDatabaseContext.DreamDaemonSettings
+
+getset
+
+ +

The Models.DreamDaemonSettings in the IDatabaseContext

+ +

Definition at line 51 of file IDatabaseContext.cs.

+
51 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess().

+ +
+
+ +

◆ DreamMakerSettings

+ +
+
+ + + + + +
+ + + + +
DbSet<DreamMakerSettings> Tgstation.Server.Host.Models.IDatabaseContext.DreamMakerSettings
+
+getset
+
+ +

The Models.DreamMakerSettings in the IDatabaseContext

+ +

Definition at line 46 of file IDatabaseContext.cs.

+
46 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess().

+ +
+
+ +

◆ Instances

+ +
+
+ + + + + +
+ + + + +
DbSet<Instance> Tgstation.Server.Host.Models.IDatabaseContext.Instances
+
+get
+
+ +

The Instances in the IDatabaseContext

+ +

Definition at line 21 of file IDatabaseContext.cs.

+
21 { get; }
+

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess().

+ +
+
+ +

◆ InstanceUsers

+ +
+
+ + + + + +
+ + + + +
DbSet<InstanceUser> Tgstation.Server.Host.Models.IDatabaseContext.InstanceUsers
+
+get
+
+
+ +

◆ Jobs

+ +
+
+ + + + + +
+ + + + +
DbSet<Job> Tgstation.Server.Host.Models.IDatabaseContext.Jobs
+
+get
+
+ +

The Jobs in the IDatabaseContext

+ +

Definition at line 31 of file IDatabaseContext.cs.

+
31 { get; }
+
+
+ +

◆ ReattachInformations

+ +
+
+ + + + + +
+ + + + +
DbSet<ReattachInformation> Tgstation.Server.Host.Models.IDatabaseContext.ReattachInformations
+
+getset
+
+ +

The DbSet<TEntity> for Models.ReattachInformations

+ +

Definition at line 71 of file IDatabaseContext.cs.

+
71 { get; set; }
+
+
+ +

◆ RepositorySettings

+ +
+
+ + + + + +
+ + + + +
DbSet<RepositorySettings> Tgstation.Server.Host.Models.IDatabaseContext.RepositorySettings
+
+getset
+
+ +

The Models.RepositorySettings in the IDatabaseContext

+ +

Definition at line 66 of file IDatabaseContext.cs.

+
66 { get; set; }
+

Referenced by Tgstation.Server.Host.Components.Instance.CompileProcess().

+ +
+
+ +

◆ RevisionInformations

+ +
+
+ + + + + +
+ + + + +
DbSet<RevisionInformation> Tgstation.Server.Host.Models.IDatabaseContext.RevisionInformations
+
+get
+
+
+ +

◆ Users

+ +
+
+ + + + + +
+ + + + +
DbSet<User> Tgstation.Server.Host.Models.IDatabaseContext.Users
+
+get
+
+
+ +

◆ WatchdogReattachInformations

+ +
+
+ + + + + +
+ + + + +
DbSet<WatchdogReattachInformation> Tgstation.Server.Host.Models.IDatabaseContext.WatchdogReattachInformations
+
+getset
+
+ +

The DbSet<TEntity> for Models.WatchdogReattachInformations

+ +

Definition at line 76 of file IDatabaseContext.cs.

+
76 { get; set; }
+
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.png b/interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.png new file mode 100644 index 0000000000000000000000000000000000000000..411734d3eb7616ea1cb8ef235caa3a0bca1814d5 GIT binary patch literal 1314 zcmeAS@N?(olHy`uVBq!ia0y~yU~B=h12~w0q~7jNIY3Gxz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opn2FK@cL^zmf1U5!6k{w$pm6tr}TkUEzGmx323qe28SzTXs3ZGB<>zt5j? zYk%zFOjufbbH|T=yZL@+rr+o7KPR__<<90W-wvoYT>pC4$D;WCizl~#6sMh6ypuk^ z&49;_J@M_^{Q`$n`L63+0QFZdnOp2~eWjdq zb#K@F&p0Qk{7vBX+kIDLK15|P`~2c)ne7~K#(ANAT4VP-&XD_$lCF#Sxtrb3pP%-t z;N!u>d(~Wj3t3B}c5Pz%u*;71;QcMl(>HGC(%AgQ|9a^)H8Fu_3i?I|k6yQaZk)!L z$a3R8>jT|dp(f5;-aCRU*EM_@i=4ZC3i4~D<0Lme=sOiS+q@$?awY4zwD(L+(Yznl z*>OGGBD3?sPVY2Dp4{XngV=|vEw17A`tHl!{EQMO7BT3*`d)QNs;TD_(zE6ppiH*PHo{m#5+;d>{E42C5PaTnbcYIYkl{^|cZ(`Us@?g>m4 zp7Pr644MtsrwTAMA>-1<058pzL0+7~2js7d10&QA7@1-5@t%wdAt07G8;}(QWW{tc zphh%M3?<^J!T-<5aeG^CeRMpCjLMlbWzrH2RTfXKFsBJi65xzbj@18?Q|5t^*o@V} zm(@I@GULtk_WfUXxbD`??`Cfg95nKL7rCqILI2j0n_D}2Res+|yT8F8?a%INqR6*{%$i7=k9!5{z z7iK6s9Lt}cU_JkQ#@=iDa(x7rMek|ZuMjxW(ks4?Ui@q3uCjZD8NI>O-HH=6+$>|G3a!B3AbMtk=aCgjJ?S zCi~3WQgBOnU9sBa?ECqPT_;`M8*#1v-IA3nx7zNVd1m6P%grb2yt7*K&H>Zt#eFw- zn(fE}rcqPT#jciF?~UeuUdGCvm{9|YU-|1Ci8-=h)|Dxorj@Fis-E`iLoFvQnWFM{ wl2DThtG1#?&;~d|PheZ_?I2+KNc_d#)Z-u0y?=Equs~z*boFyt=akR{00UJ^mjD0& literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_seeder-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_seeder-members.html new file mode 100644 index 0000000000..a77b515848 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_seeder-members.html @@ -0,0 +1,87 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Models.IDatabaseSeeder Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Models.IDatabaseSeeder, including all inherited members.

+ + + +
ResetAdminPassword(IDatabaseContext databaseContext, CancellationToken cancellationToken)Tgstation.Server.Host.Models.IDatabaseSeeder
SeedDatabase(IDatabaseContext databaseContext, CancellationToken cancellationToken)Tgstation.Server.Host.Models.IDatabaseSeeder
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_seeder.html b/interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_seeder.html new file mode 100644 index 0000000000..8f5adb989f --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_seeder.html @@ -0,0 +1,199 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.IDatabaseSeeder Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.IDatabaseSeeder Interface Reference
+
+
+ +

For initially seeding a database + More...

+
+Inheritance diagram for Tgstation.Server.Host.Models.IDatabaseSeeder:
+
+
+ + +Tgstation.Server.Host.Models.DatabaseSeeder + +
+ + + + + + + + +

+Public Member Functions

Task SeedDatabase (IDatabaseContext databaseContext, CancellationToken cancellationToken)
 Initially seed a given databaseContext More...
 
Task ResetAdminPassword (IDatabaseContext databaseContext, CancellationToken cancellationToken)
 Changes the admin password in IDatabaseContext back to it's default and enables the account More...
 
+

Detailed Description

+

For initially seeding a database

+ +

Definition at line 9 of file IDatabaseSeeder.cs.

+

Member Function Documentation

+ +

◆ ResetAdminPassword()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Models.IDatabaseSeeder.ResetAdminPassword (IDatabaseContext databaseContext,
CancellationToken cancellationToken 
)
+
+ +

Changes the admin password in IDatabaseContext back to it's default and enables the account

+
Parameters
+ + + +
databaseContextThe IDatabaseContext to reset the admin password for
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Models.DatabaseSeeder.

+ +

Referenced by Tgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >.Initialize().

+ +
+
+ +

◆ SeedDatabase()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Models.IDatabaseSeeder.SeedDatabase (IDatabaseContext databaseContext,
CancellationToken cancellationToken 
)
+
+ +

Initially seed a given databaseContext

+
Parameters
+ + + +
databaseContextThe IDatabaseContext to seed
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Models.DatabaseSeeder.

+ +

Referenced by Tgstation.Server.Host.Models.DatabaseContext< SqlServerDatabaseContext >.Initialize().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_seeder.png b/interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_seeder.png new file mode 100644 index 0000000000000000000000000000000000000000..73707dbf547ed689c67a8e6202ad060aa089ac40 GIT binary patch literal 1121 zcmeAS@N?(olHy`uVBq!ia0y~yV3Yu|12~w0S{{KHY zf3{k}VU@Fwr@j)MoZFC4Z17Ec?bfiYwOe(h95_AJ9$=6Vm0(!R#GDY4z|iAokgmn% zCcS=ryxfCdf(@4w**o4=*zf*auxb9T^mP3+rj4;y*;UR*)-1k%_U+&EC+;*`_Ona8 zWjk}_C&!tsoBa>Su>N`b=-hUDyS=}Qa}sL)ysYy7?c*6MdB(C}on52k;fpB?t{vXq z-|t?oC(+rhlHR-UK_1&?=>{>W-iwD?wk&?|=ZDJM<^D0#-sHVGZ%||TGil=++un)?W(oeRQ_#_2uB>bcSG&C@GR^=Bt>NNE*0lmP_E3!^QSxFvYufE?Z|g7K-@7pS@9N z=o^$Xecr8m5{9o^-iv+zm!9(Opv>a)2YhV%55!de5;${u`}h9s-PVu({rK|k{Km$8 zFA8PeXU^ALsoiYJe(tKeL9)dxo-50y9$Q>3rgKDe((+?o->){@%=OSUG3^yoTO!N) z{J46ieeI)7Dc>{d+a8`inYZ-Ku32u~bt&&RO%>S4ccviG!brO3;cXSkqt~Y#-NVV8 zc6ayADV^aPrt2K3*b`BA>#FFC4JUTa)HY!MCa}TQDwyZ|a~q#Ich7mWWUddAKcikB zb4oL`o%OS#@4kBtJNJ48n|7LO%k9^;c=`F|7F`K>mGJPF*ADG^kn)s!#(T?S&7SXO ztS*_K{4W3htmIGP_lwUwdFk3$88)@*?v2TRLzIdx^lgy~mx}#)tbNwR?MA%2SBWs$ zTa^FfYJG8|SjYMD>eXI+XKE9tFOk2*l;*c)(wFWi<+LRQp1&e*u2%8fzYZ4kTsX@2kB0=fLuS!PC{xWt~$(699=p2ZI0r literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context-members.html new file mode 100644 index 0000000000..c378c6864b --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context-members.html @@ -0,0 +1,89 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Security.IAuthenticationContext Member List
+
+ + + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context.html b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context.html new file mode 100644 index 0000000000..b9f8d37088 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context.html @@ -0,0 +1,234 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security.IAuthenticationContext Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security.IAuthenticationContext Interface Reference
+
+
+ +

Represents the currently authenticated Api.Models.User + More...

+
+Inheritance diagram for Tgstation.Server.Host.Security.IAuthenticationContext:
+
+
+ + +IDisposable +Tgstation.Server.Host.Security.AuthenticationContext + +
+ + + + + +

+Public Member Functions

ulong GetRight (RightsType rightsType)
 Get the value of a given rightsType More...
 
+ + + + + + + + + + +

+Properties

User User [get]
 The authenticated user More...
 
InstanceUser InstanceUser [get]
 The InstanceUser of User if applicable More...
 
ISystemIdentity SystemIdentity [get]
 The ISystemIdentity of User if applicable More...
 
+

Detailed Description

+

Represents the currently authenticated Api.Models.User

+ +

Definition at line 10 of file IAuthenticationContext.cs.

+

Member Function Documentation

+ +

◆ GetRight()

+ +
+
+ + + + + + + + +
ulong Tgstation.Server.Host.Security.IAuthenticationContext.GetRight (RightsType rightsType)
+
+ +

Get the value of a given rightsType

+
Parameters
+ + +
rightsTypeThe RightsType of the right to get
+
+
+
Returns
The value of rightsType . Note that if InstanceUser is null all Instance based rights will return 0
+ +

Implemented in Tgstation.Server.Host.Security.AuthenticationContext.

+ +
+
+

Property Documentation

+ +

◆ InstanceUser

+ +
+
+ + + + + +
+ + + + +
InstanceUser Tgstation.Server.Host.Security.IAuthenticationContext.InstanceUser
+
+get
+
+ +

The InstanceUser of User if applicable

+ +

Definition at line 20 of file IAuthenticationContext.cs.

+
20 { get; }
+
+
+ +

◆ SystemIdentity

+ +
+
+ + + + + +
+ + + + +
ISystemIdentity Tgstation.Server.Host.Security.IAuthenticationContext.SystemIdentity
+
+get
+
+ +

The ISystemIdentity of User if applicable

+ +

Definition at line 32 of file IAuthenticationContext.cs.

+
32 { get; }
+
+
+ +

◆ User

+ +
+
+ + + + + +
+ + + + +
User Tgstation.Server.Host.Security.IAuthenticationContext.User
+
+get
+
+ +

The authenticated user

+ +

Definition at line 15 of file IAuthenticationContext.cs.

+
15 { get; }
+
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context.png b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context.png new file mode 100644 index 0000000000000000000000000000000000000000..4cdc4bd1ae1964a97608f8bccbb37b63bb1ae6dd GIT binary patch literal 1544 zcmbu9c`(~)7{`B_?NW8swn`6b8@1Yo(iK#xbNC^lsm77IdT3p7<%e0d%ofY29-*ZY zM~S13BxScM*3oEXX*W6~XbIaYA@Osx6)MQa&U9w`$Ntr4=6&ApGtV>gynlS&Z?+fK zMOAr^G5`RopsN!O02EHhb(RuBp6zCaX!1+j%fs7QCX>nK^z0IJlYL9B{ym+Yom;a< z_2i`z35Puc$cHwA-|KA#09y+{CwuQC1-Mvzxu_F5V(LxJuR+eDUI z|EWm@QG09%WC%@i(6WA^*hcSE&{A;6$C*{mmeNXMG{?k%KNxiQTZ5VCBr40Sn#G_u z@f)-v4TZkUHWn@bIpdjB$ckkJP{oHTkn3C3YnfwWsF*1XB0#yF|#Ha27Tq_DSenT@&_#P1qv_BI8->@taAEJ)v`xFt*n~+Ty5VL+`X}{ENXIP$g*1H&?3E&T3otZTorpe{mO zI<-%L6Es+U2d$U;)gY!H&sjF9@DeKLF0HRmpi+|&9FA~S(h>ky%tea@@Ia+CzwXFx zw~v0*b^8ps0~w3=X<i%S|>rh@1ne2!u#N4#)WO5If!;*Syy>BF}78bVW;uE@rrH}1M z6yPi(<8o4>Ov}YTz9y3@*yzcy8W*@W;)s8c2jz@lY|wky-zU@3r2sF81o!302JV~8 zFLmE%2VTG8TG62OJA05kIEP->L?rF&1Bu=iL;>LW*1n}URA75SLHEzRI10)aKro+v zi9(kicV!ZKhiD7}{(5tN6;^&Ku*iapkAszR} zxJai0d)bRU(RZgT)eQLPQT}8M{5LKD_ENM-{@HpO8CGU9 zn=tU|V5Vg*Y|r%$vL7-C?co;v3)xBa_3;#NC(ryZs(S z3`xqQg(h7`M4`+47%frnwYdiba;i~EWUPRq)3?{ z?$r=Z_t#Qh4B2!G!-Gb|0gf4M+T2@?1XOs2O>JN`G3EzQ{het~F)x?UjI_xXzDp>9 zq_jIU#rI{SRon68>&S-xy40qTW)-lg@n|dInt@EgeIQjUQ1=)`ZrcFpjCG + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Security.IAuthenticationContextFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Security.IAuthenticationContextFactory, including all inherited members.

+ + + +
CreateAuthenticationContext(long userId, long? instanceId, DateTimeOffset validAfter, CancellationToken cancellationToken)Tgstation.Server.Host.Security.IAuthenticationContextFactory
CurrentAuthenticationContextTgstation.Server.Host.Security.IAuthenticationContextFactory
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context_factory.html b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context_factory.html new file mode 100644 index 0000000000..bebd46df5e --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context_factory.html @@ -0,0 +1,204 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security.IAuthenticationContextFactory Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security.IAuthenticationContextFactory Interface Reference
+
+
+ +

For creating and accessing authentication contexts + More...

+
+Inheritance diagram for Tgstation.Server.Host.Security.IAuthenticationContextFactory:
+
+
+ + +Tgstation.Server.Host.Security.AuthenticationContextFactory + +
+ + + + + +

+Public Member Functions

Task CreateAuthenticationContext (long userId, long? instanceId, DateTimeOffset validAfter, CancellationToken cancellationToken)
 Create an IAuthenticationContext to populate CurrentAuthenticationContext More...
 
+ + + + +

+Properties

IAuthenticationContext CurrentAuthenticationContext [get]
 The IAuthenticationContext the IAuthenticationContextFactory created More...
 
+

Detailed Description

+

For creating and accessing authentication contexts

+ +

Definition at line 10 of file IAuthenticationContextFactory.cs.

+

Member Function Documentation

+ +

◆ CreateAuthenticationContext()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Security.IAuthenticationContextFactory.CreateAuthenticationContext (long userId,
long? instanceId,
DateTimeOffset validAfter,
CancellationToken cancellationToken 
)
+
+ +

Create an IAuthenticationContext to populate CurrentAuthenticationContext

+
Parameters
+ + + + + +
userIdThe Api.Models.Internal.User.Id of the IAuthenticationContext.User
instanceIdThe Api.Models.Instance.Id of the operation
validAfterThe DateTimeOffset the resulting IAuthenticationContext.User's password must be valid after
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Security.AuthenticationContextFactory.

+ +

Referenced by Tgstation.Server.Host.Security.ClaimsInjector.InjectClaimsIntoContext().

+ +
+
+

Property Documentation

+ +

◆ CurrentAuthenticationContext

+ +
+
+ + + + + +
+ + + + +
IAuthenticationContext Tgstation.Server.Host.Security.IAuthenticationContextFactory.CurrentAuthenticationContext
+
+get
+
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context_factory.png b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..197d03b465c4223a17ce5da8efd53559e1851473 GIT binary patch literal 1320 zcmeAS@N?(olHy`uVBq!ia0y~yU`zwD12~w0r0g1f1t296;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|z_Q)b#WAFU@$KB#=cKiHT*a%G?E9}g z|IUsZF+!nV1C@5pwT)-%G2~AE7v!b6GRUh_gjIo6VEGXqfpy5ZYiC@CL;bJkZ?9Kb zKXYWz-usO4*z&slUyWTieAwPybamgh*tU%wm9E+CCsIG3{D1D?;=jh{+|S7Wj7-?p z{;@&wKt}$LY4_}&GfbOhaR1wje~)u%w@?P71 zedj8<|Jee@&!nzi&M7f)uaCGmAuR95>#IU_lKJ(K0^Dc#oiz?SFSKuVygPN@xqDat zZ_&+cn|%7_`9rOp2YfQyN-rM{()e<`*C;W^uqX4`ZrcvtXYZEjXNbPwSi#`;c=^hI zt2O7$H$B;Ju>RXg#}*@-cjv3C)|&a79$EX#_F3XZ(X)J;XO>xr(R-fG}QA_8R zCK$+vm7II_HtxN_?1cY|%+?!9*K{u`Ty^$b|JtqciDj-o1KRnuZ?zl7ZI{3L%=lUL zj=v>av~S)${rIGOepztAakb#?+Y>&nDyW-vvZJ!}N)%(26i?yI#DK10mJ7U!{6DQ4`zRvJ>_{$ovQ5t@mKDe`rT{}To2}J z8Zx(NBjML=JEsH%EuA8y(GY)GzCpxciIB0wmVbXd&oLbII>T^rSD@cHhK)eh|7Ia0 zhaEskn&LXa&!w@~`(K_1lKGw9lY%CREI*>-`OxdkB$0J+M%zxC|DICw{#E{d`YY?W ziN~a{s#%qffBn67UW@7S2JS-Rg2dfDiGm-vuJ)aub9T9AnVsC*`Gs~#|4y8@Da)}; zn5MFL@5AV--z}4u^roHJp1bS+j`!D+Pv3fd^H+s^)!O&hzuh}KPi@)Bq;;}af1f&^ zy=c|(|57c7W1OpQ^(=mVf&a8*(J9{gy-|nso8RhtC-(kK)Smha%oWH*~vHH~)+eKGj(~6nfRCcSD%@tHRlJK_-(!UbK}!*wrSy0_)C9mm{ZI1xb$~mZe90J zxk7t|w_#=BpDR8cKYdr^&c>5h9+{==(Va6t%_u2uPV@Bs^!EZ&BvaMy>K#97aIa;p z*_MU5ty_0XpS#|7@J)sHCGl6Qnv_rirMjm6rk_*4Px{jO%lFjlMT(x9 tp1;CT;}sOayAt=Ud+il_y_EHp{j5)3s(cgF-vEm>22WQ%mvv4FO#sJ(i825H literal 0 HcmV?d00001 diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_claims_injector-members.html b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_claims_injector-members.html new file mode 100644 index 0000000000..9e1c2d6d77 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_claims_injector-members.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Security.IClaimsInjector Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Security.IClaimsInjector, including all inherited members.

+ + +
InjectClaimsIntoContext(TokenValidatedContext tokenValidatedContext, CancellationToken cancellationToken)Tgstation.Server.Host.Security.IClaimsInjector
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_claims_injector.html b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_claims_injector.html new file mode 100644 index 0000000000..b848299e87 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_claims_injector.html @@ -0,0 +1,152 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security.IClaimsInjector Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security.IClaimsInjector Interface Reference
+
+
+ +

For injecting System.Security.Claims.Claims that Controllers.TgsAuthorizeAttribute can look for + More...

+
+Inheritance diagram for Tgstation.Server.Host.Security.IClaimsInjector:
+
+
+ + +Tgstation.Server.Host.Security.ClaimsInjector + +
+ + + + + +

+Public Member Functions

Task InjectClaimsIntoContext (TokenValidatedContext tokenValidatedContext, CancellationToken cancellationToken)
 Setup the System.Security.Claims.Claims for a given tokenValidatedContext More...
 
+

Detailed Description

+

For injecting System.Security.Claims.Claims that Controllers.TgsAuthorizeAttribute can look for

+ +

Definition at line 10 of file IClaimsInjector.cs.

+

Member Function Documentation

+ +

◆ InjectClaimsIntoContext()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Security.IClaimsInjector.InjectClaimsIntoContext (TokenValidatedContext tokenValidatedContext,
CancellationToken cancellationToken 
)
+
+ +

Setup the System.Security.Claims.Claims for a given tokenValidatedContext

+
Parameters
+ + + +
tokenValidatedContextThe TokenValidatedContext containing the Microsoft.AspNetCore.Http.HttpContext and Microsoft.IdentityModel.Tokens.SecurityToken of the request and the System.Security.Claims.ClaimsPrincipal to add System.Security.Claims.Claims to
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Security.ClaimsInjector.

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_claims_injector.png b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_claims_injector.png new file mode 100644 index 0000000000000000000000000000000000000000..662305ab506ec42b24929310f7a81be82be5812c GIT binary patch literal 1095 zcmeAS@N?(olHy`uVBq!ia0y~yVB`m~12~w0q(L0REFdKj;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|z1M<{{KH| z?aLG+eP~H+sC1@m>~>+MV=_IJOQ!@~y5-F1VLkr|W5*<4-FNhbfES zfA_&6|AGD+>)+p=XV@;vsJ_WA?;C$NYr&-_l~?$${yyV>`&;p$+Dq@O6E587r7CU7A`o!$uP_sGmdfy+W*vU^>+HFrY zy3ap()}~EUThqaywp29B%=LpZN9}7Rd#43fhYjxSE(knVxq~J8vqiZBSG0BXx@$*Y z{1RC_UzGo&_<3)}sdJ{!(>(Y;R_^p?qic@aGs@4buRP+@u|A+6%=_f>&qgZk=ld0p z+I{#DWB<(Nj#av`?ko2XkGl?<^2?e%G>kvu`gcd+{w>lA#8xbPb6sbu(b{=clUIuu z?f=3g^Jk0RspK;{mXp&Ly#6foPJeGan_PKbPD6cmz2Kd>3n#j-DP-{9w7>JMx=q$U z2Ad0Y(#OB-VfeFtnhitXCkB_3%mS+X4qu)HdTC~UWvpo0%W!ED`+-F#J zKdh~jV4FGf?3)*2*4MxH*Qp84NsgJ4wk)bM7vG5m#xlHaF()v4*luuN> + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Security.ICryptographySuite Member List
+
+ + + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_cryptography_suite.html b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_cryptography_suite.html new file mode 100644 index 0000000000..36eea11a61 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_cryptography_suite.html @@ -0,0 +1,266 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security.ICryptographySuite Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security.ICryptographySuite Interface Reference
+
+
+ +

Contains various cryptographic functions + More...

+
+Inheritance diagram for Tgstation.Server.Host.Security.ICryptographySuite:
+
+
+ + +Tgstation.Server.Host.Security.CryptographySuite + +
+ + + + + + + + + + + + + + +

+Public Member Functions

byte [] GetSecureBytes (uint amount)
 Generates a secure set of bytes More...
 
void SetUserPassword (User user, string newPassword, bool newUser)
 Sets a User.PasswordHash for a given user More...
 
bool CheckUserPassword (User user, string password)
 Checks a given password matches a given user 's User.PasswordHash. This may result in User.PasswordHash being modified and this should be persisted More...
 
string GetSecureString ()
 Generates a 40-length secure ascii string More...
 
+

Detailed Description

+

Contains various cryptographic functions

+ +

Definition at line 8 of file ICryptographySuite.cs.

+

Member Function Documentation

+ +

◆ CheckUserPassword()

+ +
+
+ + + + + + + + + + + + + + + + + + +
bool Tgstation.Server.Host.Security.ICryptographySuite.CheckUserPassword (User user,
string password 
)
+
+ +

Checks a given password matches a given user 's User.PasswordHash. This may result in User.PasswordHash being modified and this should be persisted

+
Parameters
+ + + +
userThe User to check
passwordThe password to check
+
+
+
Returns
true if password matches the hash, false otherwise
+ +

Implemented in Tgstation.Server.Host.Security.CryptographySuite.

+ +

Referenced by Tgstation.Server.Host.Controllers.HomeController.CreateToken().

+ +
+
+ +

◆ GetSecureBytes()

+ +
+
+ + + + + + + + +
byte [] Tgstation.Server.Host.Security.ICryptographySuite.GetSecureBytes (uint amount)
+
+ +

Generates a secure set of bytes

+
Parameters
+ + +
amountThe amount of bytes to generate
+
+
+
Returns
A secure set of bytes
+ +

Implemented in Tgstation.Server.Host.Security.CryptographySuite.

+ +

Referenced by Tgstation.Server.Host.Security.TokenFactory.TokenFactory().

+ +
+
+ +

◆ GetSecureString()

+ +
+
+ + + + + + + +
string Tgstation.Server.Host.Security.ICryptographySuite.GetSecureString ()
+
+ +

Generates a 40-length secure ascii string

+
Returns
A 40-length secure ascii string
+ +

Implemented in Tgstation.Server.Host.Security.CryptographySuite.

+ +

Referenced by Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew().

+ +
+
+ +

◆ SetUserPassword()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void Tgstation.Server.Host.Security.ICryptographySuite.SetUserPassword (User user,
string newPassword,
bool newUser 
)
+
+ +

Sets a User.PasswordHash for a given user

+
Parameters
+ + + + +
userThe User whos User.PasswordHash is to be set
newPasswordThe new password for the User
newUserIf the user is just being created
+
+
+ +

Implemented in Tgstation.Server.Host.Security.CryptographySuite.

+ +

Referenced by Tgstation.Server.Host.Controllers.UserController.Create(), Tgstation.Server.Host.Models.DatabaseSeeder.ResetAdminPassword(), Tgstation.Server.Host.Models.DatabaseSeeder.SeedAdminUser(), and Tgstation.Server.Host.Controllers.UserController.Update().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_cryptography_suite.png b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_cryptography_suite.png new file mode 100644 index 0000000000000000000000000000000000000000..485ebdf659bd07d59ab7eea811e33f7716ca45c4 GIT binary patch literal 1236 zcmeAS@N?(olHy`uVBq!ia0y~yVAKM#12~w0v-d_YPfz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opbZLROulB#z2%2aLjvF(+e-ClWi{a=rt`d_b(>OWXg8B)6-I{xNQy(^{v%GJeo z=Uw|-VO}GzICrsG)9cfb#$`S2f>$j$&f1t9OI9n{RM!3b!jD}W;)I(|W~3(`suT!h zegDU4bN*uMs$E=_%~=)?=X43qP>?n_X%=f1qicB6u%!0=zYtx6_cAx%dVEl9J+R2Q54^!L8 zQFkW^1lha_coYmJijxm^Bz}fRZU+ zzK5@25CTd|?)4DWZb%2l?h-B$NbEYXP6$FX13B`^m)_s`%A)V_^DpHx$3JF2ny_S& z%H7ogooirtA;iM%~^g`Z#RzC?!T&BHW8$V1^S^H(Cng6@D?$+G=-`=Oh z%t|gjCbs%!u;^RskVzsX-=0U@UF3B$GWSUuv+7I7IzN+dJ+F>_`}?@}$CH}cnyT~X zi?7`N{qAJ-t@N(fpH}>G*uHPm=hzjm|Gf7*QoD!EZXNG&cbn%cO8@^VNN z+RbIB+g7WpS+}*lzdL6Y>*KlNyWeu~r3B9WUR7Zoa$i>}d|5pE?X4D}$(XvLG*nHF=g;4nGHcGdIh$8ms=2=l$j#gCxbx=J z{}WeVTOrf*^y2+$VcXKqwAQR!QNg`=K5Hgj>B*WYDX;Y))c0HxdKz1D8<@uS)tq@} z=llDy%y+da9l3iSuAO;*#7wjxNzK!K#oA)E9M5kvt)5$+EMQ(`dDZKZ{>ynGGI2*f zJNQis>so$lo~7q6UE2v!J;y6*tYzPRV)6>|oK(# + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Security.IIdentityCache Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Security.IIdentityCache, including all inherited members.

+ + + +
CacheSystemIdentity(User user, ISystemIdentity systemIdentity, DateTimeOffset expiry)Tgstation.Server.Host.Security.IIdentityCache
LoadCachedIdentity(User user)Tgstation.Server.Host.Security.IIdentityCache
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_identity_cache.html b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_identity_cache.html new file mode 100644 index 0000000000..2e46ecb3cf --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_identity_cache.html @@ -0,0 +1,194 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security.IIdentityCache Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security.IIdentityCache Interface Reference
+
+
+ +

For caching ISystemIdentitys + More...

+
+Inheritance diagram for Tgstation.Server.Host.Security.IIdentityCache:
+
+
+ + +Tgstation.Server.Host.Security.IdentityCache + +
+ + + + + + + + +

+Public Member Functions

void CacheSystemIdentity (User user, ISystemIdentity systemIdentity, DateTimeOffset expiry)
 Keep a user 's systemIdentity alive until an expiry time More...
 
ISystemIdentity LoadCachedIdentity (User user)
 Attempt to load a cached ISystemIdentity More...
 
+

Detailed Description

+

For caching ISystemIdentitys

+ +

Definition at line 9 of file IIdentityCache.cs.

+

Member Function Documentation

+ +

◆ CacheSystemIdentity()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void Tgstation.Server.Host.Security.IIdentityCache.CacheSystemIdentity (User user,
ISystemIdentity systemIdentity,
DateTimeOffset expiry 
)
+
+ +

Keep a user 's systemIdentity alive until an expiry time

+
Parameters
+ + + + +
userThe User the systemIdentity belongs to
systemIdentityThe ISystemIdentity to cache
expiryWhen the systemIdentity should expire
+
+
+ +

Implemented in Tgstation.Server.Host.Security.IdentityCache.

+ +

Referenced by Tgstation.Server.Host.Controllers.HomeController.CreateToken().

+ +
+
+ +

◆ LoadCachedIdentity()

+ +
+
+ + + + + + + + +
ISystemIdentity Tgstation.Server.Host.Security.IIdentityCache.LoadCachedIdentity (User user)
+
+ +

Attempt to load a cached ISystemIdentity

+
Parameters
+ + +
userThe User the ISystemIdentity belongs to
+
+
+
Returns
The cached ISystemIdentity or null if it doesn't exist or expired
+ +

Implemented in Tgstation.Server.Host.Security.IdentityCache.

+ +

Referenced by Tgstation.Server.Host.Security.AuthenticationContextFactory.CreateAuthenticationContext().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_identity_cache.png b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_identity_cache.png new file mode 100644 index 0000000000000000000000000000000000000000..f0efcad5cf01c6ebe103c61b5ea0dcd65b439b01 GIT binary patch literal 1046 zcmeAS@N?(olHy`uVBq!ia0y~yVB`g|12~w0q{-?F%Yl?cfKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+1M^Z(7srqa#BXxLxU=NsnIwe_~04$djtSa%hC4_mx9UsGze zq)GW@iS67kKJVd}8)hpT~Fpo%Q>e?xk^IVbSlWa<7Uk>|(-K2*2}@44zrjC*bd_7c=qZwdduF zw%hk@dikN-MDJW;gZ{<#leJ=YmuF~8A25IEp7>;|;WXX@+h3+9o|wz@!93KYi>)E( zqJ|WMm%kJ!@bwz>FEB3%F=1FF*MBI`gkjP=11|TA3<6qWps2_Y;bmC52q-)SDSn6( zyzh}5Iqm89uMyKyf7WiCF>~s*)j*BL#vtR)oSDKWmAm`QnY)XB{xP$C&3~yMD70;Z z<&N$5e=Xtp7WV6^*o)muw@aN}-@7_~PU^02_YW6(KAv_yS88K)_5H;kkNo)cY0*w4 zTf1%dz82R?*_QuVzd=`} z^zMwBm=n@cI|I&|oZEZ@c8>CSRtPm^b-($c>9{_>Pa%Kb4lIqh5QuRw{a + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Security.ISystemIdentity Member List
+
+ + + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity.html b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity.html new file mode 100644 index 0000000000..21b0290975 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity.html @@ -0,0 +1,249 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security.ISystemIdentity Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security.ISystemIdentity Interface Reference
+
+
+ +

Represents a user on the current System.Runtime.InteropServices.OSPlatform + More...

+
+Inheritance diagram for Tgstation.Server.Host.Security.ISystemIdentity:
+
+
+ + +IDisposable +Tgstation.Server.Host.Security.WindowsSystemIdentity + +
+ + + + + + + + +

+Public Member Functions

ISystemIdentity Clone ()
 Clone the ISystemIdentity creating another copy that must have IDisposable.Dispose called on it More...
 
Task RunImpersonated (Action action, CancellationToken cancellationToken)
 Runs a given action in the context of the ISystemIdentity More...
 
+ + + + + + + +

+Properties

string Uid [get]
 A unique identifier for the user More...
 
string Username [get]
 The user's name More...
 
+

Detailed Description

+

Represents a user on the current System.Runtime.InteropServices.OSPlatform

+ +

Definition at line 11 of file ISystemIdentity.cs.

+

Member Function Documentation

+ +

◆ Clone()

+ +
+
+ + + + + + + +
ISystemIdentity Tgstation.Server.Host.Security.ISystemIdentity.Clone ()
+
+ +

Clone the ISystemIdentity creating another copy that must have IDisposable.Dispose called on it

+
Returns
A new ISystemIdentity mirroring the current one
+ +

Implemented in Tgstation.Server.Host.Security.WindowsSystemIdentity.

+ +

Referenced by Tgstation.Server.Host.Security.IdentityCache.CacheSystemIdentity().

+ +
+
+ +

◆ RunImpersonated()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Security.ISystemIdentity.RunImpersonated (Action action,
CancellationToken cancellationToken 
)
+
+ +

Runs a given action in the context of the ISystemIdentity

+
Parameters
+ + + +
actionThe Action to perform, should be simple and not use any Tasks or threading
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Security.WindowsSystemIdentity.

+ +

Referenced by Tgstation.Server.Host.Components.StaticFiles.Configuration.CreateDirectory(), Tgstation.Server.Host.Components.StaticFiles.Configuration.DeleteDirectory(), Tgstation.Server.Host.Components.StaticFiles.Configuration.ListDirectory(), Tgstation.Server.Host.Components.StaticFiles.Configuration.Read(), and Tgstation.Server.Host.Components.StaticFiles.Configuration.Write().

+ +
+
+

Property Documentation

+ +

◆ Uid

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Security.ISystemIdentity.Uid
+
+get
+
+ +

A unique identifier for the user

+ +

Definition at line 16 of file ISystemIdentity.cs.

+
16 { get; }
+

Referenced by Tgstation.Server.Host.Security.IdentityCache.CacheSystemIdentity(), and Tgstation.Server.Host.Controllers.HomeController.CreateToken().

+ +
+
+ +

◆ Username

+ +
+
+ + + + + +
+ + + + +
string Tgstation.Server.Host.Security.ISystemIdentity.Username
+
+get
+
+ +

The user's name

+ +

Definition at line 21 of file ISystemIdentity.cs.

+
21 { get; }
+

Referenced by Tgstation.Server.Host.Controllers.HomeController.CreateToken().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity.png b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity.png new file mode 100644 index 0000000000000000000000000000000000000000..288a9f853043d11460132c6a7ddce1e127e2de8b GIT binary patch literal 1545 zcmcJPdo+}J7{}k4%oZiFn~HW7qd63lC?qD9tSQ&GuqFnBacSN$@9f*|I%m)Bzq`*l&+~kr^Zfq!o%8*iC&P#A zuB~OD1pt6H=;7)M02mUg)0ZtlYbk&IJG8C!*|XnGtyZJ*!`STU?1mgv{gHe=AD7W< zgpSKj`I0FB`sh=1zS_SH0C3kpSLgj_G2_?APsq(zd{&so>{XkxY<4(f$M7^LLwGsh zNtTsvhywO1uijKGHaKq%X5euijNC5>D$uuhh5*t#SomheGu{aziKL7GcZS8t$rKQN z9@GdCT+kh*h&T7XQm=JR77-S$h8q#uckt;;h4Pw031Ri@0Cjs-?u-TJLq)meyl^|2 zL7cC!p6TWFQ@LmGBVIv5=;`Fj(cY?jwk)<>X)7dw@CvRj72;(>bqv#y%bO#;!2}S_ zW801F%^e8(m4#Ok|Mk0C<%4Q5TO42l1ThVFV^Vg^aM2XIkfqm*|ECK1yv{nQr zORX73Y;|zLyk=kcoE3Li=mZ7cl~h?tAI?^7ryp?Yn!DvjZSHcQ?Me>R6P+J(>}J=L zv~%eif&7hI_?fmU#|9Ux3ogV`XOUyp4IRz_dj{o&y}&rN^@gx%vfN78-X2`4Th@Rr zI}1^buKqL>-qfu)T0L3Y{C*m53E>1th(Fn9DB z2?HdzQY_>RPbv@rB$daE3*!%sL677y>7hm6zmshpQ7kAUkTI3i(kw2q%lkNS52Lfl zJg%RqtkI#R%OgWn-kWQZTEDzFj8tFLH+dUVXiMhBEod8KEMM%brQTWaL;8!Brx2$s zl42@&PfP&L^EWd|RSb+C|LQ-y=l>nq&r5=;>@gf=9*T8r z8VzG=}~t!q8%abefi6*G**J_agSnZ5lWV|Qy6_nc1kUfJj)wenI6g*^fWZO zZR`#eAhQ{~@V6e1oQp3RcWsj`QI0nKoh_M95eUmg+z!|&*&>3 z8 + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Security.ISystemIdentityFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Security.ISystemIdentityFactory, including all inherited members.

+ + + +
CreateSystemIdentity(User user, CancellationToken cancellationToken)Tgstation.Server.Host.Security.ISystemIdentityFactory
CreateSystemIdentity(string username, string password, CancellationToken cancellationToken)Tgstation.Server.Host.Security.ISystemIdentityFactory
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity_factory.html b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity_factory.html new file mode 100644 index 0000000000..1326803619 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity_factory.html @@ -0,0 +1,205 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security.ISystemIdentityFactory Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security.ISystemIdentityFactory Interface Reference
+
+
+ +

Factory for ISystemIdentitys + More...

+
+Inheritance diagram for Tgstation.Server.Host.Security.ISystemIdentityFactory:
+
+
+ + +Tgstation.Server.Host.Security.PosixSystemIdentityFactory +Tgstation.Server.Host.Security.WindowsSystemIdentityFactory + +
+ + + + + + + + +

+Public Member Functions

Task< ISystemIdentityCreateSystemIdentity (User user, CancellationToken cancellationToken)
 Create a ISystemIdentity for a given user More...
 
Task< ISystemIdentityCreateSystemIdentity (string username, string password, CancellationToken cancellationToken)
 Create a ISystemIdentity for a given username and password More...
 
+

Detailed Description

+

Factory for ISystemIdentitys

+ +

Definition at line 10 of file ISystemIdentityFactory.cs.

+

Member Function Documentation

+ +

◆ CreateSystemIdentity() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<ISystemIdentity> Tgstation.Server.Host.Security.ISystemIdentityFactory.CreateSystemIdentity (User user,
CancellationToken cancellationToken 
)
+
+ +

Create a ISystemIdentity for a given user

+
Parameters
+ + + +
userThe user to create a ISystemIdentity for
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A new ISystemIdentity or null if the user has no ISystemIdentity
+ +

Implemented in Tgstation.Server.Host.Security.WindowsSystemIdentityFactory, and Tgstation.Server.Host.Security.PosixSystemIdentityFactory.

+ +

Referenced by Tgstation.Server.Host.Controllers.UserController.Create(), and Tgstation.Server.Host.Controllers.HomeController.CreateToken().

+ +
+
+ +

◆ CreateSystemIdentity() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task<ISystemIdentity> Tgstation.Server.Host.Security.ISystemIdentityFactory.CreateSystemIdentity (string username,
string password,
CancellationToken cancellationToken 
)
+
+ +

Create a ISystemIdentity for a given username and password

+
Parameters
+ + + + +
usernameThe username of the user
passwordThe password of the user
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A new ISystemIdentity
+ +

Implemented in Tgstation.Server.Host.Security.WindowsSystemIdentityFactory, and Tgstation.Server.Host.Security.PosixSystemIdentityFactory.

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity_factory.png b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..81c4a7a3ce09ae9007070adadec988b8797330a7 GIT binary patch literal 1792 zcmb`Idr;F?7RP@Q`vX~mmO3oYMk}Hi7BxHs1z{~HL0-nZkVkkJm;xb)jRs{kkSc`H^3U354;#AGtT`1;K}gWFjK(}%58 zDnBV2MZrgluW^w_0XXQ7HQ0m40079v2LBt+T=TYeBxg=$6I}J2ATw>DD=nPgUZtC^ zC6d_00)}1b^M6g*YJ@^Q59=nPm@9$cbo=`RlpzzIZmO*wZd=ug;T=B8!mL*=8K0_FO?z+N2>!vMP&wl-9ktdy!+@ zYyAAhkVgbTUq4!Qv+t$MwZ~uKS2Pj2({l)W+ml3Fu^eI%hQG2UC{uF*$6*aH;e=T- zP!BX%7U3GKa|5kx(OEweN}NiKy-hK^Sl++9_O;ZD%pLVF8R zNwU;E{iiFuKYM&6u!Gapowh&ZpWiNI(>2l)KIyF&E)MKD9o%t5>TdHG(UOm}-k{zF z-YzMRctD-~(P8GYOj2E=p%(8}3!o8Z1dT(!kx6ErHRtz!pECPpn3)}G`+m&Q>nSm0 zxcVbwC!2flO<@~x8nwB&$V!WB>m#%E5c56yc zbn9h%m@^N5wz_?sh*GcmH@r&VUBp*RSq@2U7MdPQUymABBr%^WK_A~B-$JTMx9Ax) zZHhFO13tdW#S@_m@9M!NAGL-Kw@{GMsy&R-y!XAJpk=d|?)!q)5*;={d-z=eXE z;?WgaA$+UjR zB_ZaQpks)&DgA4bTmIkjBWwtzlIrK&MvbZbC8@uP8dH#T#bpat5l+j-VtBu+hBds6 zY@`Pk`U@xlqx6Sxgr3P2(ovjT7{b2KUVZE7zPzW0w2+_mg) zOnV!BZ~k(uwjs5~mHbI2(L>CqvFpNgH@;MhBfpzIBAF%4(H)m7lH&RJu))m=VbbQU z-^LBz+W(EyWcUFud#|Ze6FCG_3#GGROk#EUy2Y-j?A9DC;hEP`u2AsXz)!>(F1_sh zQ_a@I{*0?l(g2=t-HQCwcsjQ)uh>J)%n7&ZIOy0Vrx+R;8T%gHlU(TAmROa@8`vV| z2e9jcb$QKn3z4usFMm1EK^C?XeNS|zJcx1Bhftm(lB=Hko^4npEx1hXO;n2sJFtwY z`bZq9dS6b|1T-G#u)G#`K6!Sg%#_BS8N1$Fxyc`h&g!}bi3TdO zf(&XNzUsf*CD-2#X6}fiF6KiDiZ1m+EZ7&TLBAUJW-1=?@jV<}X?6M8lltoFAH-58 zZ>Gn5m}CBLdbhiog3wsYHmxeqe%S>_x0mr~{;MYZDvcfJimrNohT#u(%yga$$QYD} zh;s26ee9nD+}Ud_^oaYl_G!E^ff&Q(H(=sNkC9R{Q_)Fdit38PJE*^Cv{%lg&-(N? z9OAsInu|h?`Ni`(%DCn46(j?e#Re6(26zL8J#d#~9qV1DMto}(ZOC(e;;mvW_tm%` zWElJcJKk+vmY*!3gr{S5Mzry?l?V19Z*|Lk_|d}tWM($D7y_$=iGKmpAUp)SRjuxd l2 + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Security.ITokenFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Security.ITokenFactory, including all inherited members.

+ + + +
CreateToken(Models.User user, CancellationToken cancellationToken)Tgstation.Server.Host.Security.ITokenFactory
ValidationParametersTgstation.Server.Host.Security.ITokenFactory
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_token_factory.html b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_token_factory.html new file mode 100644 index 0000000000..9664302d09 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_token_factory.html @@ -0,0 +1,190 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security.ITokenFactory Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security.ITokenFactory Interface Reference
+
+
+ +

For creating Tokens + More...

+
+Inheritance diagram for Tgstation.Server.Host.Security.ITokenFactory:
+
+
+ + +Tgstation.Server.Host.Security.TokenFactory + +
+ + + + + +

+Public Member Functions

Task< TokenCreateToken (Models.User user, CancellationToken cancellationToken)
 Create a Token for a given user More...
 
+ + + + +

+Properties

TokenValidationParameters ValidationParameters [get]
 The TokenValidationParameters for the ITokenFactory More...
 
+

Detailed Description

+

For creating Tokens

+ +

Definition at line 11 of file ITokenFactory.cs.

+

Member Function Documentation

+ +

◆ CreateToken()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Task<Token> Tgstation.Server.Host.Security.ITokenFactory.CreateToken (Models.User user,
CancellationToken cancellationToken 
)
+
+ +

Create a Token for a given user

+
Parameters
+ + + +
userThe Models.User to create the token for. Must have the Api.Models.Internal.User.Id field available
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task<TResult> resulting in a new Token
+ +

Implemented in Tgstation.Server.Host.Security.TokenFactory.

+ +

Referenced by Tgstation.Server.Host.Controllers.HomeController.CreateToken().

+ +
+
+

Property Documentation

+ +

◆ ValidationParameters

+ +
+
+ + + + + +
+ + + + +
TokenValidationParameters Tgstation.Server.Host.Security.ITokenFactory.ValidationParameters
+
+get
+
+ +

The TokenValidationParameters for the ITokenFactory

+ +

Definition at line 16 of file ITokenFactory.cs.

+
16 { get; }
+

Referenced by Tgstation.Server.Host.Core.Application.ConfigureServices(), and Tgstation.Server.Host.Controllers.HomeController.CreateToken().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_token_factory.png b/interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_token_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..4bfd4cf67a6e76a232f7162786f7d3490a14b67c GIT binary patch literal 1081 zcmeAS@N?(olHy`uVBq!ia0y~yVB`a`12~w0OMsL_fKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+1M>+_7srqa#S{fi&t(*TNmirwDG*fx%g?Rk++T=WxB8}zL(j+l<&Y53x?pw3_i@qGuAYm zl#}0|mGjw~VXEwX#y!VAd)o)I^q)vRbM<# zood0L_M5Hm@rzoeyF2D>uPxb~zxm?FkM`3ZE#f)t=$5SM+(=KalD;+D_`&fD_?Q4 z{JESzc2Nz7{v^NfyQ)4(etMzI-lG$RZ)6_`FY@SMZHj$daIjZoT|vwFU2g^3x?Xu) zmHBh$A;&*18P?+YZoP-+T(ihCKmAAF%kZ28m&{JSPs%zh(z#EbrmeiRXJy}mFZxyP zy~;}>bEfUSH}TI7)%ynnt12#9zbpJP`RSX#(X+qB-VWbm&-F<0QJd5H0`=~#o1Q$6 znRF|8)#{Q>GQV@z^%d&KPX3qD$sS$E5ift5VSkRj&>hvjJNFpuPS#C379(3`z*sZu zuR(9oW`;k@uR#JE67pXTY}7e@sVs(JenLD$ZZEUK?d##6Gh`TAZ8J>zk1+;B9cJ)B zi6e?R^P7@muYYBJlMN)l_l8co^=);bhmk3t=dxppC$Ctj%=D8vUFTV}>G<*WCgy6( zrmL*nR2vy*GcW$vNx>xztEaD?vhLH2)yZ+<1s<1DZvUvZ$t&FR^f}j4RX)#IZ>lZi zEauzK3o+mFJXikiyW2TmYX3;jJN->HQR9(>@ZsvG&wpIl@HU@iBC{Raat80^W!)FA zS!~;S>CqBbwe1NPtT)SO?s}2a`fx_fxjHU!#io#;+bxgNUuQ3O-E!UH%w*L`H-FS_ z@z6SB-*z^xR_SLU%i|ZOeKLRJnD_NKn?)^2*lrP1pxml0^YCx)qLRKG|7M6eOMNJE(n?Y&8Dur!cQWyWfl#QPCo0d$z{ + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Watchdog.IWatchdog Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Watchdog.IWatchdog, including all inherited members.

+ + +
RunAsync(bool runConfigure, string[] args, CancellationToken cancellationToken)Tgstation.Server.Host.Watchdog.IWatchdog
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog.html b/interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog.html new file mode 100644 index 0000000000..6abe8ec3f4 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog.html @@ -0,0 +1,161 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Watchdog.IWatchdog Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Watchdog.IWatchdog Interface Reference
+
+
+ +

The watchdog for a Host + More...

+
+Inheritance diagram for Tgstation.Server.Host.Watchdog.IWatchdog:
+
+
+ + +Tgstation.Server.Host.Watchdog.Watchdog + +
+ + + + + +

+Public Member Functions

Task RunAsync (bool runConfigure, string[] args, CancellationToken cancellationToken)
 Run the IWatchdog More...
 
+

Detailed Description

+

The watchdog for a Host

+ +

Definition at line 9 of file IWatchdog.cs.

+

Member Function Documentation

+ +

◆ RunAsync()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Task Tgstation.Server.Host.Watchdog.IWatchdog.RunAsync (bool runConfigure,
string [] args,
CancellationToken cancellationToken 
)
+
+ +

Run the IWatchdog

+
Parameters
+ + + + +
runConfigureIf the IWatchdog should just run the host configuration wizard and exit
argsThe arguments for the IWatchdog
cancellationTokenThe CancellationToken for the operation
+
+
+
Returns
A Task representing the running operation
+ +

Implemented in Tgstation.Server.Host.Watchdog.Watchdog.

+ +

Referenced by Tgstation.Server.Host.Console.Program.Main(), Tgstation.Server.Host.Service.Program.OnExecuteAsync(), and Tgstation.Server.Host.Service.ServerService.RunWatchdog().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog.png b/interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog.png new file mode 100644 index 0000000000000000000000000000000000000000..88064ca38268d26494f06581af6f4074fdbc2d98 GIT binary patch literal 867 zcmeAS@N?(olHy`uVBq!ia0y~yU}OZc12~w0q~3G`O&}!^;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|!1T$}#WAFU@$KBZMMo4kTKg?FzyE*Y zY(EFb&9cWwmnqBMbQ5B+7t9Ov()8x$V$jj?RNz!;R5`%1Lyu{K;^nuRYEOF^6ec}m zZ;;E~_dl7lhP~g-GX37wf3-V!7$n>O<#YVwZM-J`eX?!e_WyHkUG}#xH?#}=oo*`= z7|HafDO{c-V*8_WM-CYKKPWEteqg}TC8aT8p-p(`}PA>@{@K7OL(;^Cs_A9DpzJ-b|(Ky*{_ZPUixJ;ZgzgK?y&wu@@A7pK!p2kMcX8t$1Kvii{;fw!m5AF-x==&0pXJ7ic zILkl$@15V9bVa|NuX0(miRB0Ddb>A=c8Qj&vCZ?n#m2%Hy=W1e=p;}~sBtA<3TpMH^!o);s_c?qbNspW zr?X?8ig96_u*7N^!HdGFYUfUaVnXoZ<5V@jT + + + + + + +tgstation-server: Member List + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Tgstation.Server.Host.Watchdog.IWatchdogFactory Member List
+
+
+ +

This is the complete list of members for Tgstation.Server.Host.Watchdog.IWatchdogFactory, including all inherited members.

+ + +
CreateWatchdog(ILoggerFactory loggerFactory)Tgstation.Server.Host.Watchdog.IWatchdogFactory
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog_factory.html b/interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog_factory.html new file mode 100644 index 0000000000..f49d862a02 --- /dev/null +++ b/interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog_factory.html @@ -0,0 +1,143 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Watchdog.IWatchdogFactory Interface Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Watchdog.IWatchdogFactory Interface Reference
+
+
+ +

Factory for creating IWatchdogs + More...

+
+Inheritance diagram for Tgstation.Server.Host.Watchdog.IWatchdogFactory:
+
+
+ + +Tgstation.Server.Host.Watchdog.WatchdogFactory + +
+ + + + + +

+Public Member Functions

IWatchdog CreateWatchdog (ILoggerFactory loggerFactory)
 Create a IWatchdog More...
 
+

Detailed Description

+

Factory for creating IWatchdogs

+ +

Definition at line 8 of file IWatchdogFactory.cs.

+

Member Function Documentation

+ +

◆ CreateWatchdog()

+ +
+
+ + + + + + + + +
IWatchdog Tgstation.Server.Host.Watchdog.IWatchdogFactory.CreateWatchdog (ILoggerFactory loggerFactory)
+
+ +

Create a IWatchdog

+
Parameters
+ + +
loggerFactoryThe ILoggerFactory to use for error reporting
+
+
+
Returns
A new IWatchdog
+ +

Implemented in Tgstation.Server.Host.Watchdog.WatchdogFactory.

+ +

Referenced by Tgstation.Server.Host.Service.ServerService.ServerService().

+ +
+
+
The documentation for this interface was generated from the following file: +
+ + + + diff --git a/interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog_factory.png b/interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog_factory.png new file mode 100644 index 0000000000000000000000000000000000000000..4983121908a6c99421eaa671d834e17ab7d15954 GIT binary patch literal 1116 zcmeAS@N?(olHy`uVBq!ia0y~yVAKV&12~w0Wc9bpazz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-op|p`sCcgJMVkm8$bKDw0~mn&o>uddG45Q zUTm;O${=G+-&$igJv;rvH1VZIM?P3Oq@T&XT_naUvDN>yL4@(0#ZT|dx>f9b@a8K$ zwy0~5If1t2s@5$|UEGsVyVgbiWk7)R+J#$vx3pC}zg*jJ&GYjDq2@yy+P}Hn@5;2~ za#XE*8(safZEf1SX!W!8-`Bq1^2X=RvTNCEZp?h47BF9JpX5!|>&wshyfKu%w)*(R zSQFv(Gk4Ftq5HBPS?2z&bn=fU=Pcfp zhv&SNmOm^t`R4MglV4Q!y?B$DKZ&WAbyMlF6Gxxhp8M&3v&V4GmaVy`BTYOP@4IBg zbB*VFhUNKX-|hqzY}?hXnEd*q##-fV+l2OCe6{l3rC(8<`>gp{w_cQry6uw9QE7KK zGD)nJ+WV{87~RGG5b3-jl0`FnSJ-K9;&g|nm9pG-<$B<)nY z;73}@^qBcZ#v9vnBi75gmtXYRlkhq%Y5NA_i@mk}*$31-zh9eb@p;?*j9%H8N$*x@ z7s_qgD*b%()#a;H?uLgyvPpPt);3kcQ`J){1Qy_;x}K+2Wq1aK@kgEBq_Y$lL-&8N ZS6#Q8_;IJ=A7D|y;OXk;vd$@?2>?l9A&CG0 literal 0 HcmV?d00001 diff --git a/jquery.js b/jquery.js new file mode 100644 index 0000000000..1ee895ca32 --- /dev/null +++ b/jquery.js @@ -0,0 +1,87 @@ +/*! + * jQuery JavaScript Library v1.7.2 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Wed Mar 21 12:46:34 2012 -0700 + */ +(function(bd,L){var av=bd.document,bu=bd.navigator,bm=bd.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bd.jQuery,bH=bd.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b40){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bd.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bd.attachEvent("onload",bF.ready);var b0=false;try{b0=bd.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0!=null&&b0==b0.window},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bd.JSON&&bd.JSON.parse){return bd.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){if(typeof b2!=="string"||!b2){return null}var b0,b1;try{if(bd.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bd.execScript||function(b1){bd["eval"].call(bd,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b40&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b21?aK.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aK.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv
a";bH=bv.getElementsByTagName("*");bE=bv.getElementsByTagName("a")[0];if(!bH||!bH.length||!bE){return{}}bF=av.createElement("select");bx=bF.appendChild(av.createElement("option"));bD=bv.getElementsByTagName("input")[0];bI={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bE.getAttribute("style")),hrefNormalized:(bE.getAttribute("href")==="/a"),opacity:/^0.55/.test(bE.style.opacity),cssFloat:!!bE.style.cssFloat,checkOn:(bD.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true,pixelMargin:true};b.boxModel=bI.boxModel=(av.compatMode==="CSS1Compat");bD.checked=true;bI.noCloneChecked=bD.cloneNode(true).checked;bF.disabled=true;bI.optDisabled=!bx.disabled;try{delete bv.test}catch(bB){bI.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bI.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bD=av.createElement("input");bD.value="t";bD.setAttribute("type","radio");bI.radioValue=bD.value==="t";bD.setAttribute("checked","checked");bD.setAttribute("name","t");bv.appendChild(bD);bC=av.createDocumentFragment();bC.appendChild(bv.lastChild);bI.checkClone=bC.cloneNode(true).cloneNode(true).lastChild.checked;bI.appendChecked=bD.checked;bC.removeChild(bD);bC.appendChild(bv);if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bA="on"+by;bw=(bA in bv);if(!bw){bv.setAttribute(bA,"return;");bw=(typeof bv[bA]==="function")}bI[by+"Bubbles"]=bw}}bC.removeChild(bv);bC=bF=bx=bv=bD=null;b(function(){var bM,bV,bW,bU,bO,bP,bR,bL,bK,bQ,bN,e,bT,bS=av.getElementsByTagName("body")[0];if(!bS){return}bL=1;bT="padding:0;margin:0;border:";bN="position:absolute;top:0;left:0;width:1px;height:1px;";e=bT+"0;visibility:hidden;";bK="style='"+bN+bT+"5px solid #000;";bQ="
";bM=av.createElement("div");bM.style.cssText=e+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bS.insertBefore(bM,bS.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="
t
";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bI.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);if(bd.getComputedStyle){bv.innerHTML="";bR=av.createElement("div");bR.style.width="0";bR.style.marginRight="0";bv.style.width="2px";bv.appendChild(bR);bI.reliableMarginRight=(parseInt((bd.getComputedStyle(bR,null)||{marginRight:0}).marginRight,10)||0)===0}if(typeof bv.style.zoom!=="undefined"){bv.innerHTML="";bv.style.width=bv.style.padding="1px";bv.style.border=0;bv.style.overflow="hidden";bv.style.display="inline";bv.style.zoom=1;bI.inlineBlockNeedsLayout=(bv.offsetWidth===3);bv.style.display="block";bv.style.overflow="visible";bv.innerHTML="
";bI.shrinkWrapBlocks=(bv.offsetWidth!==3)}bv.style.cssText=bN+e;bv.innerHTML=bQ;bV=bv.firstChild;bW=bV.firstChild;bO=bV.nextSibling.firstChild.firstChild;bP={doesNotAddBorder:(bW.offsetTop!==5),doesAddBorderForTableAndCells:(bO.offsetTop===5)};bW.style.position="fixed";bW.style.top="20px";bP.fixedPosition=(bW.offsetTop===20||bW.offsetTop===15);bW.style.position=bW.style.top="";bV.style.overflow="hidden";bV.style.position="relative";bP.subtractsBorderForOverflowNotVisible=(bW.offsetTop===-5);bP.doesNotIncludeMarginInBodyOffset=(bS.offsetTop!==bL);if(bd.getComputedStyle){bv.style.marginTop="1%";bI.pixelMargin=(bd.getComputedStyle(bv,null)||{marginTop:0}).marginTop!=="1%"}if(typeof bM.style.zoom!=="undefined"){bM.style.zoom=1}bS.removeChild(bM);bR=bv=bM=null;b.extend(bI,bP)});return bI})();var aT=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA1,null,false)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function a6(bx,bw,by){if(by===L&&bx.nodeType===1){var bv="data-"+bw.replace(aA,"-$1").toLowerCase();by=bx.getAttribute(bv);if(typeof by==="string"){try{by=by==="true"?true:by==="false"?false:by==="null"?null:b.isNumeric(by)?+by:aT.test(by)?b.parseJSON(by):by}catch(bz){}b.data(bx,bw,by)}else{by=L}}return by}function S(bv){for(var e in bv){if(e==="data"&&b.isEmptyObject(bv[e])){continue}if(e!=="toJSON"){return false}}return true}function bj(by,bx,bA){var bw=bx+"defer",bv=bx+"queue",e=bx+"mark",bz=b._data(by,bw);if(bz&&(bA==="queue"||!b._data(by,bv))&&(bA==="mark"||!b._data(by,e))){setTimeout(function(){if(!b._data(by,bv)&&!b._data(by,e)){b.removeData(by,bw,true);bz.fire()}},0)}}b.extend({_mark:function(bv,e){if(bv){e=(e||"fx")+"mark";b._data(bv,e,(b._data(bv,e)||0)+1)}},_unmark:function(by,bx,bv){if(by!==true){bv=bx;bx=by;by=false}if(bx){bv=bv||"fx";var e=bv+"mark",bw=by?0:((b._data(bx,e)||1)-1);if(bw){b._data(bx,e,bw)}else{b.removeData(bx,e,true);bj(bx,bv,"mark")}}},queue:function(bv,e,bx){var bw;if(bv){e=(e||"fx")+"queue";bw=b._data(bv,e);if(bx){if(!bw||b.isArray(bx)){bw=b._data(bv,e,b.makeArray(bx))}else{bw.push(bx)}}return bw||[]}},dequeue:function(by,bx){bx=bx||"fx";var bv=b.queue(by,bx),bw=bv.shift(),e={};if(bw==="inprogress"){bw=bv.shift()}if(bw){if(bx==="fx"){bv.unshift("inprogress")}b._data(by,bx+".run",e);bw.call(by,function(){b.dequeue(by,bx)},e)}if(!bv.length){b.removeData(by,bx+"queue "+bx+".run",true);bj(by,bx,"queue")}}});b.fn.extend({queue:function(e,bv){var bw=2;if(typeof e!=="string"){bv=e;e="fx";bw--}if(arguments.length1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,bv){return b.access(this,b.prop,e,bv,arguments.length>1)},removeProp:function(e){e=b.propFix[e]||e;return this.each(function(){try{this[e]=L;delete this[e]}catch(bv){}})},addClass:function(by){var bA,bw,bv,bx,bz,bB,e;if(b.isFunction(by)){return this.each(function(bC){b(this).addClass(by.call(this,bC,this.className))})}if(by&&typeof by==="string"){bA=by.split(ag);for(bw=0,bv=this.length;bw-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.type]||b.valHooks[bw.nodeName.toLowerCase()];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aV,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aZ:bf)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(by,bA){var bz,bB,bw,e,bv,bx=0;if(bA&&by.nodeType===1){bB=bA.toLowerCase().split(ag);e=bB.length;for(;bx=0)}}})});var be=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/(?:^|\s)hover(\.\S+)?\b/,aP=/^key/,bg=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler;by=bv.selector}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bd,bI])}}for(bC=0;bCbC){bv.push({elem:this,matches:bD.slice(bC)})}for(bJ=0;bJ0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aP.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bg.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bRe[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}bE.match.globalPOS=bD;var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="

";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="
";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT0){for(bB=bA;bB=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(B(bx[0])||B(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function B(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||bb.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aH(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aS.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aS="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ah=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,v=/]","i"),o=/checked\s*(?:[^=]|=\s*.checked.)/i,bn=/\/(java|ecma)script/i,aO=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div
","
"]}b.fn.extend({text:function(e){return b.access(this,function(bv){return bv===L?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(bv))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(e){return b.access(this,function(by){var bx=this[0]||{},bw=0,bv=this.length;if(by===L){return bx.nodeType===1?bx.innerHTML.replace(ah,""):null}if(typeof by==="string"&&!ae.test(by)&&(b.support.leadingWhitespace||!ar.test(by))&&!ax[(d.exec(by)||["",""])[1].toLowerCase()]){by=by.replace(R,"<$1>");try{for(;bw1&&bw0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bh(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function D(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function am(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||b.isXMLDoc(by)||!ai.test("<"+by.nodeName+">")?by.cloneNode(true):am(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){aj(by,bz);e=bh(by);bv=bh(bz);for(bx=0;e[bx];++bx){if(bv[bx]){aj(e[bx],bv[bx])}}}if(bA){s(by,bz);if(bw){e=bh(by);bv=bh(bz);for(bx=0;e[bx];++bx){s(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bI,bw,bv,bx){var bA,bH,bD,bJ=[];bw=bw||av;if(typeof bw.createElement==="undefined"){bw=bw.ownerDocument||bw[0]&&bw[0].ownerDocument||av}for(var bE=0,bG;(bG=bI[bE])!=null;bE++){if(typeof bG==="number"){bG+=""}if(!bG){continue}if(typeof bG==="string"){if(!W.test(bG)){bG=bw.createTextNode(bG)}else{bG=bG.replace(R,"<$1>");var bN=(d.exec(bG)||["",""])[1].toLowerCase(),bz=ax[bN]||ax._default,bK=bz[0],bB=bw.createElement("div"),bL=ac.childNodes,bM;if(bw===av){ac.appendChild(bB)}else{a(bw).appendChild(bB)}bB.innerHTML=bz[1]+bG+bz[2];while(bK--){bB=bB.lastChild}if(!b.support.tbody){var by=v.test(bG),e=bN==="table"&&!by?bB.firstChild&&bB.firstChild.childNodes:bz[1]===""&&!by?bB.childNodes:[];for(bD=e.length-1;bD>=0;--bD){if(b.nodeName(e[bD],"tbody")&&!e[bD].childNodes.length){e[bD].parentNode.removeChild(e[bD])}}}if(!b.support.leadingWhitespace&&ar.test(bG)){bB.insertBefore(bw.createTextNode(ar.exec(bG)[0]),bB.firstChild)}bG=bB.childNodes;if(bB){bB.parentNode.removeChild(bB);if(bL.length>0){bM=bL[bL.length-1];if(bM&&bM.parentNode){bM.parentNode.removeChild(bM)}}}}}var bF;if(!b.support.appendChecked){if(bG[0]&&typeof(bF=bG.length)==="number"){for(bD=0;bD1)};b.extend({cssHooks:{opacity:{get:function(bw,bv){if(bv){var e=Z(bw,"opacity");return e===""?"1":e}else{return bw.style.opacity}}}},cssNumber:{fillOpacity:true,fontWeight:true,lineHeight:true,opacity:true,orphans:true,widows:true,zIndex:true,zoom:true},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(bx,bw,bD,by){if(!bx||bx.nodeType===3||bx.nodeType===8||!bx.style){return}var bB,bC,bz=b.camelCase(bw),bv=bx.style,bE=b.cssHooks[bz];bw=b.cssProps[bz]||bz;if(bD!==L){bC=typeof bD;if(bC==="string"&&(bB=I.exec(bD))){bD=(+(bB[1]+1)*+bB[2])+parseFloat(b.css(bx,bw));bC="number"}if(bD==null||bC==="number"&&isNaN(bD)){return}if(bC==="number"&&!b.cssNumber[bz]){bD+="px"}if(!bE||!("set" in bE)||(bD=bE.set(bx,bD))!==L){try{bv[bw]=bD}catch(bA){}}}else{if(bE&&"get" in bE&&(bB=bE.get(bx,false,by))!==L){return bB}return bv[bw]}},css:function(by,bx,bv){var bw,e;bx=b.camelCase(bx);e=b.cssHooks[bx];bx=b.cssProps[bx]||bx;if(bx==="cssFloat"){bx="float"}if(e&&"get" in e&&(bw=e.get(by,true,bv))!==L){return bw}else{if(Z){return Z(by,bx)}}},swap:function(by,bx,bz){var e={},bw,bv;for(bv in bx){e[bv]=by.style[bv];by.style[bv]=bx[bv]}bw=bz.call(by);for(bv in bx){by.style[bv]=e[bv]}return bw}});b.curCSS=b.css;if(av.defaultView&&av.defaultView.getComputedStyle){aJ=function(bA,bw){var bv,bz,e,by,bx=bA.style;bw=bw.replace(y,"-$1").toLowerCase();if((bz=bA.ownerDocument.defaultView)&&(e=bz.getComputedStyle(bA,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(bA.ownerDocument.documentElement,bA)){bv=b.style(bA,bw)}}if(!b.support.pixelMargin&&e&&aE.test(bw)&&a1.test(bv)){by=bx.width;bx.width=bv;bv=e.width;bx.width=by}return bv}}if(av.documentElement.currentStyle){aY=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv==null&&bx&&(by=bx[bw])){bv=by}if(a1.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":bv;bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aJ||aY;function af(by,bw,bv){var bz=bw==="width"?by.offsetWidth:by.offsetHeight,bx=bw==="width"?1:0,e=4;if(bz>0){if(bv!=="border"){for(;bx=1&&b.trim(bw.replace(al,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=al.test(bw)?bw.replace(al,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bv,e){return b.swap(bv,{display:"inline-block"},function(){if(e){return Z(bv,"margin-right")}else{return bv.style.marginRight}})}}}});if(b.expr&&b.expr.filters){b.expr.filters.hidden=function(bw){var bv=bw.offsetWidth,e=bw.offsetHeight;return(bv===0&&e===0)||(!b.support.reliableHiddenOffsets&&((bw.style&&bw.style.display)||b.css(bw,"display"))==="none")};b.expr.filters.visible=function(e){return !b.expr.filters.hidden(e)}}b.each({margin:"",padding:"",border:"Width"},function(e,bv){b.cssHooks[e+bv]={expand:function(by){var bx,bz=typeof by==="string"?by.split(" "):[by],bw={};for(bx=0;bx<4;bx++){bw[e+G[bx]+bv]=bz[bx]||bz[bx-2]||bz[0]}return bw}}});var k=/%20/g,ap=/\[\]$/,bs=/\r?\n/g,bq=/#.*$/,aD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,a0=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aN=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,aR=/^(?:GET|HEAD)$/,c=/^\/\//,M=/\?/,a7=/)<[^<]*)*<\/script>/gi,p=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,z=b.fn.load,aa={},q={},aF,r,aW=["*/"]+["*"];try{aF=bm.href}catch(aw){aF=av.createElement("a");aF.href="";aF=aF.href}r=K.exec(aF.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("
").append(bD.replace(a7,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||p.test(this.nodeName)||a0.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){an(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}an(bv,e);return bv},ajaxSettings:{url:aF,isLocal:aN.test(r[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bd.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(q),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bk(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=F(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,r[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=r[1]||bI[2]!=r[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(r[3]||(r[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aX(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aR.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aW+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aX(q,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){u(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function u(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{u(bw+"["+(typeof bz==="object"?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&b.type(by)==="object"){for(var e in by){u(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bk(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function F(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!ba){ba=av.createElement("iframe");ba.frameBorder=ba.width=ba.height=0}e.appendChild(ba);if(!m||!ba.createElement){m=(ba.contentWindow||ba.contentDocument).document;m.write((b.support.boxModel?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(ba)}Q[bx]=bw}return Q[bx]}var a8,V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){a8=function(by,bH,bw,bB){try{bB=by.getBoundingClientRect()}catch(bF){}if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aL(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{a8=function(bz,bE,bx){var bC,bw=bz.offsetParent,bv=bz,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.fn.offset=function(e){if(arguments.length){return e===L?this:this.each(function(bx){b.offset.setOffset(this,e,bx)})}var bv=this[0],bw=bv&&bv.ownerDocument;if(!bw){return null}if(bv===bw.body){return b.offset.bodyOffset(bv)}return a8(bv,bw,bw.documentElement)};b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(bw,bv){var e=/Y/.test(bv);b.fn[bw]=function(bx){return b.access(this,function(by,bB,bA){var bz=aL(by);if(bA===L){return bz?(bv in bz)?bz[bv]:b.support.boxModel&&bz.document.documentElement[bB]||bz.document.body[bB]:by[bB]}if(bz){bz.scrollTo(!e?bA:b(bz).scrollLeft(),e?bA:b(bz).scrollTop())}else{by[bB]=bA}},bw,bx,arguments.length,null)}});function aL(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each({Height:"height",Width:"width"},function(bw,bx){var bv="client"+bw,e="scroll"+bw,by="offset"+bw;b.fn["inner"+bw]=function(){var bz=this[0];return bz?bz.style?parseFloat(b.css(bz,bx,"padding")):this[bx]():null};b.fn["outer"+bw]=function(bA){var bz=this[0];return bz?bz.style?parseFloat(b.css(bz,bx,bA?"margin":"border")):this[bx]():null};b.fn[bx]=function(bz){return b.access(this,function(bC,bB,bD){var bF,bE,bG,bA;if(b.isWindow(bC)){bF=bC.document;bE=bF.documentElement[bv];return b.support.boxModel&&bE||bF.body&&bF.body[bv]||bE}if(bC.nodeType===9){bF=bC.documentElement;if(bF[bv]>=bF[e]){return bF[bv]}return Math.max(bC.body[e],bF[e],bC.body[by],bF[by])}if(bD===L){bG=b.css(bC,bB);bA=parseFloat(bG);return b.isNumeric(bA)?bA:bG}b(bC).css(bB,bD)},bx,bz,arguments.length,null)}});bd.jQuery=bd.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/*! + * jQuery UI 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*! + * jQuery UI Widget 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Widget + */ +(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*! + * jQuery UI Mouse 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('
').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g
');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(hl.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*! + * jQuery hashchange event - v1.3 - 7/21/2010 + * http://benalman.com/projects/jquery-hashchange-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$(' + + + +
+ +
+
ReleaseNotes Namespace Reference
+
+
+
+ + + + +

+Classes

class  Program
 Contains the application entrypoint More...
 
+ + + + + diff --git a/namespace_tgstation.html b/namespace_tgstation.html new file mode 100644 index 0000000000..b7fbbe8aac --- /dev/null +++ b/namespace_tgstation.html @@ -0,0 +1,86 @@ + + + + + + + +tgstation-server: Tgstation Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
Tgstation Namespace Reference
+
+
+ + + + +

+Namespaces

namespace  Server
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server.html b/namespace_tgstation_1_1_server.html new file mode 100644 index 0000000000..c121bbe0aa --- /dev/null +++ b/namespace_tgstation_1_1_server.html @@ -0,0 +1,96 @@ + + + + + + + +tgstation-server: Tgstation.Server Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server Namespace Reference
+
+
+ + + + + + + + + + +

+Namespaces

namespace  Api
 
namespace  Client
 
namespace  Host
 
namespace  Tests
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_api.html b/namespace_tgstation_1_1_server_1_1_api.html new file mode 100644 index 0000000000..318e278e1c --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_api.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api Namespace Reference
+
+
+ + + + + + + + +

+Namespaces

namespace  Models
 
namespace  Rights
 
namespace  Tests
 
+ + + + + + + +

+Classes

class  ApiHeaders
 Represents the header that must be present for every server request More...
 
class  Routes
 Routes to a server actions More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_api_1_1_models.html b/namespace_tgstation_1_1_server_1_1_api_1_1_models.html new file mode 100644 index 0000000000..5ca48a0f89 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_api_1_1_models.html @@ -0,0 +1,373 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models Namespace Reference
+
+
+ + + + + + +

+Namespaces

namespace  Internal
 
namespace  Tests
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Classes

class  Administration
 Represents administrative server information More...
 
class  Byond
 Represents a BYOND installation More...
 
class  ChatBot
 
class  ChatChannel
 Indicates a chat channel More...
 
class  CompileJob
 
class  ConfigurationFile
 Represents a game configuration file. Create and delete actions uncerimonuously overwrite/delete files More...
 
class  DiscordConnectionStringBuilder
 ChatConnectionStringBuilder for ChatProvider.Discord More...
 
class  DreamDaemon
 Represents an instance of BYOND's DreamDaemon game server. Create action starts the server. Delete action shuts down the server More...
 
class  DreamMaker
 Represents the state of the DreamMaker compiler. Create action starts a new compile. Delete action cancels the current compile More...
 
class  ErrorMessage
 Represents an error message returned by the server More...
 
class  Instance
 Metadata about a server instance More...
 
class  InstanceUser
 Represents a Users permissions in an Instance More...
 
class  IrcConnectionStringBuilder
 ChatConnectionStringBuilder for ChatProvider.Irc More...
 
class  Job
 Represents a long running job on the server. Model is read-only, updates attempt to cancel the job More...
 
class  Repository
 Represents a git repository More...
 
class  RevisionInformation
 
class  ServerInformation
 Represents basic server information More...
 
class  TestMerge
 
class  TestMergeParameters
 Parameters for creating a TestMerge More...
 
class  Token
 Represents a JWT returned by the API More...
 
class  User
 
class  UserUpdate
 For editing a given User. Will never be returned by the API More...
 
+ + + + + + + + + + + + + + + + +

+Enumerations

enum  ChatProvider { ChatProvider.Irc, +ChatProvider.Discord + }
 Represents a chat service provider More...
 
enum  ConfigurationType { ConfigurationType.Disallowed, +ConfigurationType.HostWrite, +ConfigurationType.SystemIdentityWrite + }
 The type of configuration allowed on an Instance More...
 
enum  DreamDaemonSecurity { DreamDaemonSecurity.Trusted, +DreamDaemonSecurity.Safe, +DreamDaemonSecurity.Ultrasafe + }
 DreamDaemon's security level More...
 
enum  DreamDaemonStatus { DreamDaemonStatus.Offline, +DreamDaemonStatus.HardRebooting, +DreamDaemonStatus.Online + }
 The status of DreamDaemon More...
 
enum  IrcPasswordType { IrcPasswordType.Server, +IrcPasswordType.Sasl, +IrcPasswordType.NickServ + }
 Represents the type of a password for a ChatProvider.Irc More...
 
+

Enumeration Type Documentation

+ +

◆ ChatProvider

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Api.Models.ChatProvider
+
+strong
+
+ +

Represents a chat service provider

+ + + +
Enumerator
Irc 

Internet relay chat

+
Discord 

Superior chat service

+
+ +

Definition at line 6 of file ChatProvider.cs.

+
7  {
11  Irc,
12 
16  Discord
17  }
+ +
+
+
+ +

◆ ConfigurationType

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Api.Models.ConfigurationType
+
+strong
+
+ +

The type of configuration allowed on an Instance

+ + + + +
Enumerator
Disallowed 

Configuration editing is not allowed

+
HostWrite 

Configuration editing is allowed by all users on all files

+
SystemIdentityWrite 

Co

+
+ +

Definition at line 6 of file ConfigurationType.cs.

+
7  {
11  Disallowed,
12 
16  HostWrite,
17 
22  }
+ +
Configuration editing is allowed by all users on all files
+
+
+
+ +

◆ DreamDaemonSecurity

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Api.Models.DreamDaemonSecurity
+
+strong
+
+ +

DreamDaemon's security level

+ + + + +
Enumerator
Trusted 

Server is unrestricted in terms of file access and shell commands

+
Safe 

Server will not be able to run shell commands or access files outside it's working directory

+
Ultrasafe 

Server will not be able to run shell commands or access anything but temporary files. Currently unsupported!

+
+ +

Definition at line 6 of file DreamDaemonSecurity.cs.

+
7  {
11  Trusted,
12 
16  Safe,
17 
21  Ultrasafe
22  }
Server will not be able to run shell commands or access files outside it's working directory
+
Server will not be able to run shell commands or access anything but temporary files....
+
Server is unrestricted in terms of file access and shell commands
+
+
+
+ +

◆ DreamDaemonStatus

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Api.Models.DreamDaemonStatus
+
+strong
+
+ +

The status of DreamDaemon

+ + + + +
Enumerator
Offline 

Server is not running

+
HardRebooting 

Server is being rebooted

+
Online 

Server is running

+
+ +

Definition at line 7 of file DreamDaemonStatus.cs.

+ +
+
+ +

◆ IrcPasswordType

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Api.Models.IrcPasswordType
+
+strong
+
+ +

Represents the type of a password for a ChatProvider.Irc

+ + + + +
Enumerator
Server 

Use server authentication

+
Sasl 

Use PLAIN sasl authentication

+
NickServ 

Use NickServ authentication

+
+ +

Definition at line 6 of file IrcPasswordType.cs.

+
7  {
11  Server,
12 
16  Sasl,
17 
21  NickServ
22  }
+ + +
+
+
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal.html b/namespace_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal.html new file mode 100644 index 0000000000..46d22ee231 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal.html @@ -0,0 +1,121 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Internal Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Internal Namespace Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Classes

class  ChatBot
 Manage the server chat bots More...
 
class  ChatConnectionStringBuilder
 Helper for building ChatBot.ConnectionStrings More...
 
class  CompileJob
 Represents a run of DreamMaker More...
 
class  DreamDaemonLaunchParameters
 Launch settings for DreamDaemon More...
 
class  DreamDaemonSettings
 Configurable settings for DreamDaemon More...
 
class  Job
 Represents a long running job More...
 
class  RepositorySettings
 Represents configurable settings for a Repository More...
 
class  RevisionInformation
 Represents information about a current git revison More...
 
class  TestMerge
 Represents a merge of a GitHub pull request More...
 
class  TestMergeBase
 Layer of test merge data required internally More...
 
class  User
 Represents a server User More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests.html b/namespace_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests.html new file mode 100644 index 0000000000..f2bea4e469 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Models.Tests Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Models.Tests Namespace Reference
+
+
+ + + + +

+Classes

class  TestIrcConnectionStringBuilder
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_api_1_1_rights.html b/namespace_tgstation_1_1_server_1_1_api_1_1_rights.html new file mode 100644 index 0000000000..f9081ada4c --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_api_1_1_rights.html @@ -0,0 +1,782 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Rights Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Rights Namespace Reference
+
+
+ + + + +

+Namespaces

namespace  Tests
 
+ + + + +

+Classes

class  RightsHelper
 Helper for RightsTypes More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Enumerations

enum  AdministrationRights : ulong {
+  AdministrationRights.None = 0, +AdministrationRights.WriteUsers = 1, +AdministrationRights.RestartHost = 2, +AdministrationRights.ChangeVersion = 4, +
+  AdministrationRights.EditOwnPassword = 8, +AdministrationRights.ReadUsers = 16 +
+ }
 Rights for Models.Administration More...
 
enum  ByondRights : ulong {
+  ByondRights.None = 0, +ByondRights.ReadActive = 1, +ByondRights.ListInstalled = 2, +ByondRights.ChangeVersion = 4, +
+  ByondRights.CancelInstall = 8 +
+ }
 Rights for Models.Byond More...
 
enum  ChatBotRights : ulong {
+  ChatBotRights.None = 0, +ChatBotRights.WriteEnabled = 1, +ChatBotRights.WriteProvider = 2, +ChatBotRights.WriteChannels = 4, +
+  ChatBotRights.WriteConnectionString = 8, +ChatBotRights.ReadConnectionString = 16, +ChatBotRights.Read = 32, +ChatBotRights.Create = 64, +
+  ChatBotRights.Delete = 128, +ChatBotRights.WriteName = 256 +
+ }
 Rights for Models.ChatBot More...
 
enum  ConfigurationRights : ulong {
+  ConfigurationRights.None = 0, +ConfigurationRights.Read = 1, +ConfigurationRights.Write = 2, +ConfigurationRights.List = 4, +
+  ConfigurationRights.Delete = 8 +
+ }
 Rights for Models.ConfigurationFile More...
 
enum  DreamDaemonRights : ulong {
+  DreamDaemonRights.None = 0, +DreamDaemonRights.ReadRevision = 1, +DreamDaemonRights.SetPorts = 2, +DreamDaemonRights.SetAutoStart = 4, +
+  DreamDaemonRights.SetSecurity = 8, +DreamDaemonRights.ReadMetadata = 16, +DreamDaemonRights.SetWebClient = 32, +DreamDaemonRights.SoftRestart = 64, +
+  DreamDaemonRights.SoftShutdown = 128, +DreamDaemonRights.Restart = 256, +DreamDaemonRights.Shutdown = 512, +DreamDaemonRights.Start = 1024, +
+  DreamDaemonRights.SetStartupTimeout = 2048 +
+ }
 Rights for Models.DreamDaemon More...
 
enum  DreamMakerRights : ulong {
+  DreamMakerRights.None = 0, +DreamMakerRights.Read = 1, +DreamMakerRights.Compile = 2, +DreamMakerRights.CancelCompile = 4, +
+  DreamMakerRights.SetDme = 8, +DreamMakerRights.SetApiValidationPort = 16, +DreamMakerRights.CompileJobs = 32, +DreamMakerRights.SetSecurityLevel = 64 +
+ }
 Rights for Models.DreamMaker More...
 
enum  InstanceManagerRights : ulong {
+  InstanceManagerRights.None = 0, +InstanceManagerRights.Read = 1, +InstanceManagerRights.Create = 2, +InstanceManagerRights.Rename = 4, +
+  InstanceManagerRights.Relocate = 8, +InstanceManagerRights.SetOnline = 16, +InstanceManagerRights.Delete = 32, +InstanceManagerRights.List = 64, +
+  InstanceManagerRights.SetConfiguration = 128, +InstanceManagerRights.SetAutoUpdate = 256 +
+ }
 Rights for managing Models.Instances More...
 
enum  InstanceUserRights : ulong { InstanceUserRights.None = 0, +InstanceUserRights.ReadUsers = 1, +InstanceUserRights.WriteUsers = 2, +InstanceUserRights.CreateUsers = 4 + }
 Rights for an Models.Instance More...
 
enum  RepositoryRights : ulong {
+  RepositoryRights.None = 0, +RepositoryRights.CancelPendingChanges = 1, +RepositoryRights.SetOrigin = 2, +RepositoryRights.SetSha = 4, +
+  RepositoryRights.MergePullRequest = 8, +RepositoryRights.UpdateBranch = 16, +RepositoryRights.ChangeCommitter = 32, +RepositoryRights.ChangeTestMergeCommits = 64, +
+  RepositoryRights.ChangeCredentials = 128, +RepositoryRights.SetReference = 256, +RepositoryRights.Read = 512, +RepositoryRights.ChangeAutoUpdateSettings = 1024, +
+  RepositoryRights.Delete = 2048, +RepositoryRights.CancelClone = 4096 +
+ }
 Rights for a Models.Repository More...
 
enum  RightsType : ulong {
+  RightsType.Administration, +RightsType.InstanceManager, +RightsType.Repository, +RightsType.Byond, +
+  RightsType.DreamMaker, +RightsType.DreamDaemon, +RightsType.ChatBots, +RightsType.Configuration, +
+  RightsType.InstanceUser +
+ }
 The type of rights a model uses More...
 
+

Enumeration Type Documentation

+ +

◆ AdministrationRights

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Api.Rights.AdministrationRights : ulong
+
+strong
+
+ +

Rights for Models.Administration

+ + + + + + + +
Enumerator
None 

User has no rights

+
WriteUsers 

User can edit themself and other Models.Users and also create others

+
RestartHost 

User can gracefully restart the host

+
ChangeVersion 

User can change Models.Administration.NewVersion

+
EditOwnPassword 

User can change their password

+
ReadUsers 

User can read info and rights of other users

+
+ +

Definition at line 9 of file AdministrationRights.cs.

+
9  : ulong
10  {
14  None = 0,
15 
19  WriteUsers = 1,
20 
24  RestartHost = 2,
25 
29  ChangeVersion = 4,
30 
34  EditOwnPassword = 8,
35 
39  ReadUsers = 16
40  }
User can edit themself and other Models.Users and also create others
+ + +
User can read info and rights of other users
+
User can change Models.Administration.NewVersion
+ +
+
+
+ +

◆ ByondRights

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Api.Rights.ByondRights : ulong
+
+strong
+
+ +

Rights for Models.Byond

+ + + + + + +
Enumerator
None 

User has no rights

+
ReadActive 

User may check the active installed BYOND version

+
ListInstalled 

User may list all installed BYOND versions

+
ChangeVersion 

User may change the active BYOND version

+
CancelInstall 

User may cancel version installations

+
+ +

Definition at line 9 of file ByondRights.cs.

+
9  : ulong
10  {
14  None = 0,
15 
19  ReadActive = 1,
20 
24  ListInstalled = 2,
25 
29  ChangeVersion = 4,
30 
34  CancelInstall = 8
35  }
User may list all installed BYOND versions
+
User may check the active installed BYOND version
+ +
User may cancel version installations
+
User can change Models.Administration.NewVersion
+
+
+
+ +

◆ ChatBotRights

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Api.Rights.ChatBotRights : ulong
+
+strong
+
+ +

Rights for Models.ChatBot

+ + + + + + + + + + + +
Enumerator
None 

User has no rights

+
WriteEnabled 

User can change Models.Internal.ChatBot.Enabled

+
WriteProvider 

User can change Models.Internal.ChatBot.Provider

+
WriteChannels 

User can change Models.ChatBot.Channels

+
WriteConnectionString 

User can change Models.Internal.ChatBot.ConnectionString

+
ReadConnectionString 

User can read Models.Internal.ChatBot.ConnectionString requires Read

+
Read 

User can read all chat settings except Models.Internal.ChatBot.ConnectionString

+
Create 

User can create new Models.ChatBot

+
Delete 

User can delete Models.ChatBot

+
WriteName 

User can change Models.Internal.ChatBot.Name

+
+ +

Definition at line 9 of file ChatBotRights.cs.

+
9  : ulong
10  {
14  None = 0,
15 
19  WriteEnabled = 1,
20 
24  WriteProvider = 2,
25 
29  WriteChannels = 4,
30 
35 
40 
44  Read = 32,
45 
49  Create = 64,
50 
54  Delete = 128,
55 
59  WriteName = 256,
60  }
User can read Models.Internal.ChatBot.ConnectionString requires Read
+
User can change Models.Internal.ChatBot.Name
+
User can change Models.Internal.ChatBot.Provider
+ + +
User can change Models.Internal.ChatBot.ConnectionString
+
User can create new Models.ChatBot
+
User can change Models.Internal.ChatBot.Enabled
+
User can change Models.ChatBot.Channels
+
User can read all chat settings except Models.Internal.ChatBot.ConnectionString
+
+
+
+ +

◆ ConfigurationRights

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Api.Rights.ConfigurationRights : ulong
+
+strong
+
+ +

Rights for Models.ConfigurationFile

+ + + + + + +
Enumerator
None 

User has no rights

+
Read 

User may read files

+
Write 

User may write files

+
List 

User may list files

+
Delete 

User may delete empty folders

+
+ +

Definition at line 9 of file ConfigurationRights.cs.

+
9  : ulong
10  {
14  None = 0,
15 
19  Read = 1,
20 
24  Write = 2,
25 
29  List = 4,
30 
34  Delete = 8
35  }
+ + +
User can read all chat settings except Models.Internal.ChatBot.ConnectionString
+ +
+
+
+ +

◆ DreamDaemonRights

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Api.Rights.DreamDaemonRights : ulong
+
+strong
+
+ +

Rights for Models.DreamDaemon

+ + + + + + + + + + + + + + +
Enumerator
None 

User has no rights

+
ReadRevision 

User can read Models.DreamDaemon.ActiveCompileJob and Models.DreamDaemon.StagedCompileJob

+
SetPorts 

User can change both primary and secondary ports

+
SetAutoStart 

User can change Models.Internal.DreamDaemonSettings.AutoStart

+
SetSecurity 

User set Models.Internal.DreamDaemonLaunchParameters.SecurityLevel

+
ReadMetadata 

User can read all ports, Models.Internal.DreamDaemonSettings.SoftRestart, Models.Internal.DreamDaemonSettings.SoftShutdown, Models.DreamDaemon.Running, Models.Internal.DreamDaemonLaunchParameters.AllowWebClient, and Models.Internal.DreamDaemonSettings.AutoStart

+
SetWebClient 

User can change Models.Internal.DreamDaemonLaunchParameters.AllowWebClient

+
SoftRestart 

User can enable Models.Internal.DreamDaemonSettings.SoftRestart

+
SoftShutdown 

User can enable Models.Internal.DreamDaemonSettings.SoftShutdown

+
Restart 

User can immediately restart Models.DreamDaemon

+
Shutdown 

User can immediately shutdown Models.DreamDaemon

+
Start 

User can start Models.DreamDaemon and disable Models.Internal.DreamDaemonSettings.SoftRestart and Models.Internal.DreamDaemonSettings.SoftShutdown

+
SetStartupTimeout 

User can change Models.Internal.DreamDaemonLaunchParameters.StartupTimeout

+
+ +

Definition at line 9 of file DreamDaemonRights.cs.

+
9  : ulong
10  {
14  None = 0,
15 
19  ReadRevision = 1,
20 
24  SetPorts = 2,
25 
29  SetAutoStart = 4,
30 
34  SetSecurity = 8,
35 
39  ReadMetadata = 16,
40 
44  SetWebClient = 32,
45 
49  SoftRestart = 64,
50 
54  SoftShutdown = 128,
55 
59  Restart = 256,
60 
64  Shutdown = 512,
65 
69  Start = 1024,
70 
74  SetStartupTimeout = 2048
75  }
User can enable Models.Internal.DreamDaemonSettings.SoftRestart
+
User can change Models.Internal.DreamDaemonLaunchParameters.AllowWebClient
+
User can change both primary and secondary ports
+ +
User can change Models.Internal.DreamDaemonLaunchParameters.StartupTimeout
+
User can read all ports, Models.Internal.DreamDaemonSettings.SoftRestart, Models.Internal....
+
User can immediately restart Models.DreamDaemon
+
User can read Models.DreamDaemon.ActiveCompileJob and Models.DreamDaemon.StagedCompileJob
+
User can start Models.DreamDaemon and disable Models.Internal.DreamDaemonSettings....
+
User set Models.Internal.DreamDaemonLaunchParameters.SecurityLevel
+
User can enable Models.Internal.DreamDaemonSettings.SoftShutdown
+
User can change Models.Internal.DreamDaemonSettings.AutoStart
+
User can immediately shutdown Models.DreamDaemon
+
+
+
+ +

◆ DreamMakerRights

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Api.Rights.DreamMakerRights : ulong
+
+strong
+
+ +

Rights for Models.DreamMaker

+ + + + + + + + + +
Enumerator
None 

User has no rights

+
Read 

User may read Models.DreamMaker status

+
Compile 

User may trigger compiles

+
CancelCompile 

User may cancel compiles

+
SetDme 

User may modify Models.DreamMaker.ProjectName

+
SetApiValidationPort 

User may modify Models.DreamMaker.ApiValidationPort

+
CompileJobs 

User may list and read all Models.CompileJobs

+
SetSecurityLevel 

User may modify Models.DreamMaker.ApiValidationSecurityLevel

+
+ +

Definition at line 9 of file DreamMakerRights.cs.

+
9  : ulong
10  {
14  None = 0,
15 
19  Read = 1,
20 
24  Compile = 2,
25 
29  CancelCompile = 4,
30 
34  SetDme = 8,
35 
40 
44  CompileJobs = 32,
45 
49  SetSecurityLevel = 64
50  }
User may modify Models.DreamMaker.ApiValidationPort
+ + +
User may modify Models.DreamMaker.ApiValidationSecurityLevel
+
User may list and read all Models.CompileJobs
+
User may modify Models.DreamMaker.ProjectName
+
User can read all chat settings except Models.Internal.ChatBot.ConnectionString
+ +
+
+
+ +

◆ InstanceManagerRights

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Api.Rights.InstanceManagerRights : ulong
+
+strong
+
+ +

Rights for managing Models.Instances

+ + + + + + + + + + + +
Enumerator
None 

User has no rights

+
Read 

User can view Models.Instances which they have any rights for

+
Create 

User can create Models.Instances

+
Rename 

User can rename Models.Instances they can view

+
Relocate 

User can relocate Models.Instances they can view

+
SetOnline 

User can online Models.Instances they can view

+
Delete 

User can delete Models.Instances they can view

+
List 

User can view all Models.Instances

+
SetConfiguration 

User can change Models.Instance.ConfigurationType

+
SetAutoUpdate 

User can change Models.Instance.AutoUpdateInterval

+
+ +

Definition at line 9 of file InstanceManagerRights.cs.

+
9  : ulong
10  {
14  None = 0,
15 
19  Read = 1,
20 
24  Create = 2,
25 
29  Rename = 4,
30 
34  Relocate = 8,
35 
39  SetOnline = 16,
40 
44  Delete = 32,
45 
49  List = 64,
50 
54  SetConfiguration = 128,
55 
59  SetAutoUpdate = 256
60  }
+
User can change Models.Instance.ConfigurationType
+ + +
User can create new Models.ChatBot
+
User can change Models.Instance.AutoUpdateInterval
+
User can online Models.Instances they can view
+
User can relocate Models.Instances they can view
+
User can read all chat settings except Models.Internal.ChatBot.ConnectionString
+
User can rename Models.Instances they can view
+
+
+
+ +

◆ InstanceUserRights

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Api.Rights.InstanceUserRights : ulong
+
+strong
+
+ +

Rights for an Models.Instance

+ + + + + +
Enumerator
None 

User has no rights

+
ReadUsers 

Allow read access to Models.InstanceUser for the Models.Instance

+
WriteUsers 

Allow write and delete access to Models.InstanceUser for the Models.Instance

+
CreateUsers 

Allow adding additional Models.InstanceUser to the Models.Instance

+
+ +

Definition at line 9 of file InstanceUserRights.cs.

+
9  : ulong
10  {
14  None = 0,
15 
19  ReadUsers = 1,
20 
24  WriteUsers = 2,
25 
29  CreateUsers = 4
30  }
User can edit themself and other Models.Users and also create others
+ +
User can read info and rights of other users
+
Allow adding additional Models.InstanceUser to the Models.Instance
+
+
+
+ +

◆ RepositoryRights

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Api.Rights.RepositoryRights : ulong
+
+strong
+
+ +

Rights for a Models.Repository

+ + + + + + + + + + + + + + + +
Enumerator
None 

User has no rights

+
CancelPendingChanges 

User may cancel synchronize operations

+
SetOrigin 

User may create the Models.Repository if it does not exist

+
SetSha 

User may directly set the sha the Models.Repository's HEAD points to

+
MergePullRequest 

User may fetch and merge GitHub pull requests

+
UpdateBranch 

User may use the update feature

+
ChangeCommitter 

User may change Models.Internal.RepositorySettings.CommitterName and Models.Internal.RepositorySettings.CommitterEmail

+
ChangeTestMergeCommits 

User may change Models.Internal.RepositorySettings.PushTestMergeCommits and Models.Internal.RepositorySettings.PostTestMergeComment

+
ChangeCredentials 

User may read and change Models.Internal.RepositorySettings.AccessUser and Models.Internal.RepositorySettings.AccessToken

+
SetReference 

User may set Models.Repository.Reference to another git reference (not a SHA)

+
Read 

User may read all fields in the Models.Repository with the exception of Models.Internal.RepositorySettings.AccessToken

+
ChangeAutoUpdateSettings 

User may change Models.Internal.RepositorySettings.AutoUpdatesKeepTestMerges and Models.Internal.RepositorySettings.AutoUpdatesSynchronize

+
Delete 

User may delete the Models.Repository

+
CancelClone 

User may cancel clone operations

+
+ +

Definition at line 9 of file RepositoryRights.cs.

+
9  : ulong
10  {
14  None = 0,
15 
20 
24  SetOrigin = 2,
25 
29  SetSha = 4,
30 
34  MergePullRequest = 8,
35 
39  UpdateBranch = 16,
40 
44  ChangeCommitter = 32,
45 
50 
54  ChangeCredentials = 128,
55 
59  SetReference = 256,
60 
64  Read = 512,
65 
70 
74  Delete = 2048,
75 
79  CancelClone = 4096
80  }
+
User may change Models.Internal.RepositorySettings.AutoUpdatesKeepTestMerges and Models....
+
User may fetch and merge GitHub pull requests
+
User may change Models.Internal.RepositorySettings.PushTestMergeCommits and Models....
+ + + +
User may directly set the sha the Models.Repository's HEAD points to
+
User may set Models.Repository.Reference to another git reference (not a SHA)
+ +
User may create the Models.Repository if it does not exist
+
User may read and change Models.Internal.RepositorySettings.AccessUser and Models....
+
User can read all chat settings except Models.Internal.ChatBot.ConnectionString
+
User may change Models.Internal.RepositorySettings.CommitterName and Models.Internal....
+
+
+
+ +

◆ RightsType

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Api.Rights.RightsType : ulong
+
+strong
+
+ +

The type of rights a model uses

+ + + + + + + + + + +
Enumerator
Administration 

AdministrationRights

+
InstanceManager 

InstanceManagerRights

+
Repository 

RepositoryRights

+
Byond 

ByondRights

+
DreamMaker 

DreamMakerRights

+
DreamDaemon 

DreamDaemonRights

+
ChatBots 

ChatBotRights

+
Configuration 

ConfigurationRights

+
InstanceUser 

InstanceUserRights

+
+ +

Definition at line 6 of file RightsType.cs.

+ +
+
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests.html b/namespace_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests.html new file mode 100644 index 0000000000..e1234bbb22 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Rights.Tests Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Rights.Tests Namespace Reference
+
+
+ + + + + +

+Classes

class  TestRights
 Tests for Rights More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_api_1_1_tests.html b/namespace_tgstation_1_1_server_1_1_api_1_1_tests.html new file mode 100644 index 0000000000..6b5e040c83 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_api_1_1_tests.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: Tgstation.Server.Api.Tests Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Api.Tests Namespace Reference
+
+
+ + + + + +

+Classes

class  TestApiHeaders
 Tests for ApiHeaders More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_client.html b/namespace_tgstation_1_1_server_1_1_client.html new file mode 100644 index 0000000000..5d71caa76f --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_client.html @@ -0,0 +1,175 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client Namespace Reference
+
+
+ + + + + + +

+Namespaces

namespace  Components
 
namespace  Tests
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Classes

class  AdministrationClient
 
class  ApiClient
 
class  ApiClientFactory
 
class  ApiConflictException
 Occurs when the server returns an unknown response More...
 
class  ApiMismatchException
 Occurs when the API version of the client is not compatible with the server's More...
 
class  ClientException
 Exceptions thrown by IServerClients More...
 
class  ConflictException
 Occurs when the client performs an action that would result in data conflict More...
 
class  HttpClient
 
interface  IAdministrationClient
 For managing server administration More...
 
interface  IApiClient
 Web interface for the API More...
 
interface  IApiClientFactory
 For creating IApiClients More...
 
interface  IHttpClient
 For sending HTTP requests More...
 
interface  IInstanceManagerClient
 For managing Instances More...
 
class  InstanceManagerClient
 
class  InsufficientPermissionsException
 Occurs when the client attempts to perform an action they do not have the rights for More...
 
interface  IRequestLogger
 For logging HTTP requests and responses More...
 
interface  IServerClient
 Main client for communicating with a server More...
 
interface  IServerClientFactory
 Factory for creating IServerClients More...
 
interface  IUsersClient
 For managing Users More...
 
class  MethodNotSupportedException
 Occurs when the client tries to use a currently unsupported API More...
 
class  RateLimitException
 Occurs when a GitHub rate limit occurs More...
 
class  RequestTimeoutException
 Occurs when the client provides invalid credentials More...
 
class  ServerClient
 
class  ServerClientFactory
 
class  ServerErrorException
 Occurs when an error occurs in the server More...
 
class  ServiceUnavailableException
 Occurs when the client makes a request while the server is starting or stopping More...
 
class  UnauthorizedException
 Occurs when the client provides invalid credentials More...
 
class  UnrecognizedResponseException
 Occurs when a response is received that did not deserialize to one of the expected Api.Models More...
 
class  UsersClient
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_client_1_1_components.html b/namespace_tgstation_1_1_server_1_1_client_1_1_components.html new file mode 100644 index 0000000000..c8566d33d7 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_client_1_1_components.html @@ -0,0 +1,139 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components Namespace Reference
+
+
+ + + + +

+Namespaces

namespace  Tests
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Classes

class  ByondClient
 
class  ChatBotsClient
 
class  ConfigurationClient
 
class  DreamDaemonClient
 
class  DreamMakerClient
 
interface  IByondClient
 For managing the Byond installation More...
 
interface  IChatBotsClient
 For managing the chat bots More...
 
interface  IConfigurationClient
 For managing ConfigurationFile files More...
 
interface  IDreamDaemonClient
 For managing DreamDaemon More...
 
interface  IDreamMakerClient
 For managing the compiler More...
 
interface  IInstanceClient
 For managing a single Instance More...
 
interface  IInstanceUserClient
 For managing InstanceUsers More...
 
interface  IJobsClient
 Access to running jobs More...
 
class  InstanceClient
 
class  InstanceUserClient
 
interface  IRepositoryClient
 For managing the Repository More...
 
class  JobsClient
 
class  RepositoryClient
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests.html b/namespace_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests.html new file mode 100644 index 0000000000..dd12c8c18d --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Components.Tests Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Components.Tests Namespace Reference
+
+
+ + + + +

+Classes

class  TestDreamDaemonClient
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_client_1_1_tests.html b/namespace_tgstation_1_1_server_1_1_client_1_1_tests.html new file mode 100644 index 0000000000..c23ca419f8 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_client_1_1_tests.html @@ -0,0 +1,92 @@ + + + + + + + +tgstation-server: Tgstation.Server.Client.Tests Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Client.Tests Namespace Reference
+
+
+ + + + + + +

+Classes

class  TestApiClient
 
class  TestServerClientFactory
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host.html b/namespace_tgstation_1_1_server_1_1_host.html new file mode 100644 index 0000000000..9cf2b7e267 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host.html @@ -0,0 +1,130 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host Namespace Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +

+Namespaces

namespace  Components
 
namespace  Configuration
 
namespace  Console
 
namespace  Controllers
 
namespace  Core
 
namespace  IO
 
namespace  Models
 
namespace  Security
 
namespace  Service
 
namespace  Tests
 
namespace  Watchdog
 
+ + + + + + + + + + + + + + + + + +

+Classes

interface  IServer
 Represents the host More...
 
interface  IServerFactory
 For creating IServers More...
 
class  NativeMethods
 Native methods used by the code More...
 
class  Program
 Entrypoint for the Process More...
 
class  Server
 
class  ServerFactory
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_components.html b/namespace_tgstation_1_1_server_1_1_host_1_1_components.html new file mode 100644 index 0000000000..4f653d152a --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components.html @@ -0,0 +1,228 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components Namespace Reference
+
+
+ + + + + + + + + + + + + + + + +

+Namespaces

namespace  Byond
 
namespace  Chat
 
namespace  Compiler
 
namespace  Interop
 
namespace  Repository
 
namespace  StaticFiles
 
namespace  Watchdog
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Classes

class  EventConsumer
 
interface  IDmbProvider
 Provides absolute paths to the latest compiled .dmbs More...
 
interface  IEventConsumer
 Consumes EventTypes and takes the appropriate actions More...
 
interface  IInstance
 For interacting with the instance services More...
 
interface  IInstanceFactory
 Factory for creating IInstances More...
 
interface  IInstanceManager
 For managing IInstances More...
 
class  Instance
 
class  InstanceFactory
 
class  InstanceManager
 
class  ReattachInfoHandler
 
+ + + + +

+Enumerations

enum  EventType {
+  EventType.RepoResetOrigin = 0, +EventType.RepoCheckout = 1, +EventType.RepoFetch = 2, +EventType.RepoMergePullRequest = 3, +
+  EventType.RepoPreSynchronize = 4, +EventType.ByondInstallStart = 5, +EventType.ByondInstallFail = 6, +EventType.ByondActiveVersionChange = 7, +
+  EventType.CompileStart = 8, +EventType.CompileCancelled = 9, +EventType.CompileFailure = 10, +EventType.CompileComplete = 11, +
+  EventType.InstanceAutoUpdateStart = 12, +EventType.RepoMergeConflict = 13 +
+ }
 Types of events. Mirror in tgs.dm More...
 
+

Enumeration Type Documentation

+ +

◆ EventType

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Host.Components.EventType
+
+strong
+
+ +

Types of events. Mirror in tgs.dm

+ + + + + + + + + + + + + + + +
Enumerator
RepoResetOrigin 

Parameters: Reference name, commit sha

+
RepoCheckout 

Parameters: Checkout target

+
RepoFetch 

No parameters

+
RepoMergePullRequest 

Parameters: Pull request number, pull request sha, merger message

+
RepoPreSynchronize 

Parameters: Absolute path to repository root

+
ByondInstallStart 

Parameters: Version being installed

+
ByondInstallFail 

Parameters: Error string

+
ByondActiveVersionChange 

Parameters: Old active version, new active version

+
CompileStart 

Parameters: Game directory path, origin commit sha

+
CompileCancelled 

No parameters

+
CompileFailure 

Parameters: Game directory path, "1" if compile succeeded and api validation failed, "0" otherwise

+
CompileComplete 

Parameters: Game directory path

+
InstanceAutoUpdateStart 

No parameters

+
RepoMergeConflict 

Parameters: Base sha, target sha, base reference, target reference

+
+ +

Definition at line 6 of file EventType.cs.

+
7  {
11  RepoResetOrigin = 0,
12 
16  RepoCheckout = 1,
17 
21  RepoFetch = 2,
22 
27 
32 
37 
41  ByondInstallFail = 6,
42 
47 
51  CompileStart = 8,
52 
56  CompileCancelled = 9,
57 
61  CompileFailure = 10,
62 
66  CompileComplete = 11,
67 
72 
76  RepoMergeConflict = 13,
77  }
+ +
Parameters: Base sha, target sha, base reference, target reference
+
Parameters: Pull request number, pull request sha, merger message
+ +
Parameters: Absolute path to repository root
+ + +
Parameters: Game directory path, origin commit sha
+
Parameters: Game directory path, "1" if compile succeeded and api validation failed,...
+
Parameters: Old active version, new active version
+ + + +
+
+
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond.html b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond.html new file mode 100644 index 0000000000..cef62eba49 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond.html @@ -0,0 +1,113 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Byond Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Byond Namespace Reference
+
+
+ + + + +

+Namespaces

namespace  Tests
 
+ + + + + + + + + + + + + + + + + + + + +

+Classes

class  ByondExecutableLock
 
class  ByondManager
 
interface  IByondExecutableLock
 Represents usage of the two primary BYOND server executables More...
 
interface  IByondInstaller
 For downloading and installing BYOND extractions for a given system More...
 
interface  IByondManager
 For managing the BYOND installation More...
 
class  PosixByondInstaller
 IByondInstaller for Posix systems More...
 
class  WindowsByondInstaller
 IByondInstaller for windows systems More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests.html b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests.html new file mode 100644 index 0000000000..9461983bf3 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Byond.Tests Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Byond.Tests Namespace Reference
+
+
+ + + + +

+Classes

class  TestPosixByondInstaller
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat.html b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat.html new file mode 100644 index 0000000000..4bc4de7326 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat.html @@ -0,0 +1,131 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat Namespace Reference
+
+
+ + + + + + +

+Namespaces

namespace  Commands
 
namespace  Providers
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Classes

class  Channel
 Represents a Providers.IProvider channel More...
 
class  ChannelMapping
 Represents a mapping of a Channel.RealId More...
 
class  Chat
 
class  ChatFactory
 
interface  IChat
 For managing connected chat services More...
 
interface  IChatFactory
 For creating IChats More...
 
interface  ICustomCommandHandler
 Handles Commands.ICommands that map to those defined in a IJsonTrackingContext More...
 
interface  IJsonTrackingContext
 Represents a tracking of dynamic chat json files More...
 
interface  IProviderFactory
 Factory for IProviders More...
 
class  JsonTrackingContext
 
class  ProviderFactory
 
class  Response
 Represents a chat message requested by DD More...
 
class  User
 Represents a tgs_chat_user datum More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands.html b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands.html new file mode 100644 index 0000000000..fb3bc63b95 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands.html @@ -0,0 +1,117 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Commands Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Commands Namespace Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Classes

class  BoolConverter
 JsonConverter for decoding bools returned by BYOND More...
 
class  ByondCommand
 For displaying the installed Byond version More...
 
class  CommandFactory
 
class  CustomCommand
 Represents a command made from DM code More...
 
interface  ICommand
 Represents a command that can be invoked by talking to chat bots More...
 
interface  ICommandFactory
 Factory for built in ICommands More...
 
class  KekCommand
 kek More...
 
class  PullRequestsCommand
 Command for reading the active Api.Models.TestMerges More...
 
class  RevisionCommand
 For displaying Api.Models.Internal.RevisionInformation More...
 
class  VersionCommand
 ICommand to return the IApplication.VersionString More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers.html b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers.html new file mode 100644 index 0000000000..428f28a000 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers.html @@ -0,0 +1,108 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Providers Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Providers Namespace Reference
+
+
+ + + + +

+Namespaces

namespace  Tests
 
+ + + + + + + + + + + + + + + +

+Classes

class  DiscordProvider
 IProvider for the Discord app More...
 
interface  IProvider
 For interacting with a chat service More...
 
class  IrcProvider
 IProvider for internet relay chat More...
 
class  Message
 Represents a message recieved by a IProvider More...
 
class  Provider
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests.html b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests.html new file mode 100644 index 0000000000..f5f8167b12 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Chat.Providers.Tests Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Chat.Providers.Tests Namespace Reference
+
+
+ + + + +

+Classes

class  TestDiscordProvider
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler.html b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler.html new file mode 100644 index 0000000000..4a20ae8a6b --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler.html @@ -0,0 +1,107 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Compiler Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Compiler Namespace Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + +

+Classes

class  DmbFactory
 Standard IDmbFactory More...
 
class  DmbProvider
 
class  DreamMaker
 
interface  ICompileJobConsumer
 Sink for CompileJobs More...
 
interface  IDmbFactory
 Factory for IDmbProviders More...
 
interface  IDreamMaker
 For managing the compiler More...
 
class  TemporaryDmbProvider
 Temporary IDmbProvider More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop.html b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop.html new file mode 100644 index 0000000000..a49930ec0d --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop.html @@ -0,0 +1,117 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Interop Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Interop Namespace Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Classes

class  ChatCommand
 Represents a chat command to be handled by DD More...
 
class  CommCommand
 Represents a command from DD More...
 
class  CommContext
 
class  Constants
 Constants used for communication with the DMAPI More...
 
class  EventNotification
 For notifying DD of EventTypes More...
 
interface  ICommContext
 Represents a registration of an interop session More...
 
interface  ICommHandler
 Handles CommCommands More...
 
class  JsonFile
 Representation of the initial json passed to DreamDaemon More...
 
class  JsonSubFileList
 Information used in for reattaching and interop More...
 
class  TestMerge
 This model mirrors /datum/tgs_revision_information/test_merge More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository.html b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository.html new file mode 100644 index 0000000000..0282984df7 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Repository Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Repository Namespace Reference
+
+
+ + + + + + + + + + + + + + + + + +

+Classes

class  CredentialsProvider
 
interface  ICredentialsProvider
 For generating CredentialsHandlers More...
 
interface  IRepository
 Represents an on-disk git repository More...
 
interface  IRepositoryManager
 Factory for creating and loading IRepositorys More...
 
class  Repository
 
class  RepositoryManager
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files.html b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files.html new file mode 100644 index 0000000000..09dba5d537 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files.html @@ -0,0 +1,96 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.StaticFiles Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.StaticFiles Namespace Reference
+
+
+ + + + + + + + + + +

+Classes

class  Configuration
 
interface  IConfiguration
 For managing the Configuration directory More...
 
class  ServerSideModifications
 Represents code modifications via configuration More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html new file mode 100644 index 0000000000..c7cf334635 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html @@ -0,0 +1,368 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog Namespace Reference
+
+
+ + + + +

+Namespaces

namespace  Tests
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Classes

class  BasicWatchdog
 A IWatchdog that manages one server. More...
 
class  DeadSessionController
 Implements a fake "dead" ISessionController More...
 
class  ExperimentalWatchdog
 A IWatchdog that tries to manage 2 servers at once for maximum uptime. More...
 
interface  INetworkPromptReaper
 On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort(). This looks out for those prompts and immediately clicks "Yes" if the owning process has registered for it More...
 
interface  IReattachInfoHandler
 Handles saving and loading WatchdogReattachInformation More...
 
interface  ISessionController
 Handles communication with a DreamDaemon IProcess More...
 
interface  ISessionControllerFactory
 Factory for ISessionControllers More...
 
interface  IWatchdog
 Runs and monitors the twin server controllers More...
 
interface  IWatchdogFactory
 For creating IWatchdogs More...
 
class  LaunchResult
 Represents the result of trying to start a DD process More...
 
class  MonitorState
 The (absolute) state of the ExperimentalWatchdog More...
 
class  PosixNetworkPromptReaper
 
class  ReattachInformation
 Parameters necessary for duplicating a ISessionController session More...
 
class  SessionController
 
class  SessionControllerFactory
 
class  WatchdogBase
 Base class for IWatchdogs. More...
 
class  WatchdogFactory
 
class  WatchdogReattachInformation
 Reattach information for a IWatchdog More...
 
class  WindowsNetworkPromptReaper
 
+ + + + + + + + + + + + + +

+Enumerations

enum  ApiValidationStatus {
+  ApiValidationStatus.NeverValidated, +ApiValidationStatus.UnaskedValidationRequest, +ApiValidationStatus.BadValidationRequest, +ApiValidationStatus.RequiresSafe, +
+  ApiValidationStatus.RequiresTrusted, +ApiValidationStatus.RequiresUltrasafe +
+ }
 Status of DMAPI validation More...
 
enum  MonitorAction {
+  MonitorAction.Continue, +MonitorAction.Skip, +MonitorAction.Restart, +MonitorAction.Break, +
+  MonitorAction.Exit +
+ }
 The action for the monitor loop to take when control is returned to it More...
 
enum  MonitorActivationReason {
+  MonitorActivationReason.ActiveServerCrashed, +MonitorActivationReason.InactiveServerCrashed, +MonitorActivationReason.ActiveServerRebooted, +MonitorActivationReason.InactiveServerRebooted, +
+  MonitorActivationReason.InactiveServerStartupComplete, +MonitorActivationReason.NewDmbAvailable, +MonitorActivationReason.ActiveLaunchParametersUpdated +
+ }
 Reasons for the monitor to wake up More...
 
enum  RebootState : int { RebootState.Normal = 0, +RebootState.Shutdown = 1, +RebootState.Restart = 2 + }
 Represents the action to take when /world/Reboot() is called More...
 
+

Enumeration Type Documentation

+ +

◆ ApiValidationStatus

+ +
+
+ +

Status of DMAPI validation

+ + + + + + + +
Enumerator
NeverValidated 

The DMAPI never contacted the server for validation

+
UnaskedValidationRequest 

The server was contacted for validation but it was never requested

+
BadValidationRequest 

The validation request was malformed

+
RequiresSafe 

Valid API. The game must be run with a minimum security level of Api.Models.DreamDaemonSecurity.Safe

+
RequiresTrusted 

Valid API. The game must be run with a security level of Api.Models.DreamDaemonSecurity.Trusted

+
RequiresUltrasafe 

Valid API. The game must be run with a minimum security level of Api.Models.DreamDaemonSecurity.Ultrasafe

+
+ +

Definition at line 6 of file ApiValidationStatus.cs.

+
7  {
12 
17 
22 
27 
32 
37  }
The DMAPI never contacted the server for validation
+
The server was contacted for validation but it was never requested
+
Valid API. The game must be run with a minimum security level of Api.Models.DreamDaemonSecurity....
+ +
Valid API. The game must be run with a minimum security level of Api.Models.DreamDaemonSecurity....
+
Valid API. The game must be run with a security level of Api.Models.DreamDaemonSecurity....
+
+
+
+ +

◆ MonitorAction

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Host.Components.Watchdog.MonitorAction
+
+strong
+
+ +

The action for the monitor loop to take when control is returned to it

+ + + + + + +
Enumerator
Continue 

The monitor should continue as normal

+
Skip 

Skips the next call to HandleMonitorWakeup action

+
Restart 

The monitor should kill and restart both servers

+
Break 

The monitor should stop checking actions for this iteration and continue its loop

+
Exit 

The monitor should exit. Does not kill servers

+
+ +

Definition at line 6 of file MonitorAction.cs.

+
7  {
11  Continue,
12 
16  Skip,
17 
21  Restart,
22 
26  Break,
27 
31  Exit
32  }
+
Skips the next call to HandleMonitorWakeup action
+
The monitor should stop checking actions for this iteration and continue its loop
+
User can immediately restart Models.DreamDaemon
+
The monitor should exit. Does not kill servers
+
+
+
+ +

◆ MonitorActivationReason

+ +
+
+ +

Reasons for the monitor to wake up

+ + + + + + + + +
Enumerator
ActiveServerCrashed 

The active server crashed or exited

+
InactiveServerCrashed 

The inactive server crashed or exited

+
ActiveServerRebooted 

The active server called /world/Reboot()

+
InactiveServerRebooted 

The inactive server called /world/Reboot()

+
InactiveServerStartupComplete 

The inactive server is past that point where DD hangs when you press "Go"

+
NewDmbAvailable 

A new .dmb was deployed

+
ActiveLaunchParametersUpdated 

Server launch parameters were changed

+
+ +

Definition at line 6 of file MonitorActivationReason.cs.

+ +
+
+ +

◆ RebootState

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Host.Components.Watchdog.RebootState : int
+
+strong
+
+ +

Represents the action to take when /world/Reboot() is called

+ + + + +
Enumerator
Normal 

Run DreamDaemon's normal reboot process

+
Shutdown 

Shutdown DreamDaemon

+
Restart 

Restart the DreamDaemon process

+
+ +

Definition at line 6 of file RebootState.cs.

+
6  : int
7  {
11  Normal = 0,
12 
16  Shutdown = 1,
17 
21  Restart = 2
22  }
+
User can immediately restart Models.DreamDaemon
+
User can immediately shutdown Models.DreamDaemon
+
+
+
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests.html b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests.html new file mode 100644 index 0000000000..9a5b4b804c --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Components.Watchdog.Tests Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Components.Watchdog.Tests Namespace Reference
+
+
+ + + + +

+Classes

class  TestExperimentalWatchdog
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html b/namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html new file mode 100644 index 0000000000..ed8b043a93 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html @@ -0,0 +1,198 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Configuration Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Configuration Namespace Reference
+
+
+ + + + + + + + + + + + + + + + + +

+Classes

class  ControlPanelConfiguration
 Configuration options for the web control panel More...
 
class  DatabaseConfiguration
 Configuration options for the Models.DatabaseContext<TParentContext> More...
 
class  FileLoggingConfiguration
 File logging configuration options More...
 
class  GeneralConfiguration
 General configuration options More...
 
class  UpdatesConfiguration
 Configuration for the automatic update system More...
 
+ + + + + + + +

+Enumerations

enum  DatabaseType { DatabaseType.SqlServer, +DatabaseType.MySql, +DatabaseType.MariaDB + }
 Type of database to user More...
 
enum  SetupWizardMode { SetupWizardMode.Autodetect, +SetupWizardMode.Force, +SetupWizardMode.Only, +SetupWizardMode.Never + }
 Determines if the Core.ISetupWizard will run More...
 
+

Enumeration Type Documentation

+ +

◆ DatabaseType

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Host.Configuration.DatabaseType
+
+strong
+
+ +

Type of database to user

+ + + + +
Enumerator
SqlServer 

Use Microsoft SQL Server

+
MySql 

Use MySQL

+
MariaDB 

Use MariaDB

+
+ +

Definition at line 6 of file DatabaseType.cs.

+ +
+
+ +

◆ SetupWizardMode

+ +
+
+ + + + + +
+ + + + +
enum Tgstation.Server.Host.Configuration.SetupWizardMode
+
+strong
+
+ +

Determines if the Core.ISetupWizard will run

+ + + + + +
Enumerator
Autodetect 

Run the wizard if the appsettings.{Environment}.json is not present or empty

+
Force 

Force run the wizard

+
Only 

Only run the wizard and exit

+
Never 

Never run the wizard

+
+ +

Definition at line 6 of file SetupWizardMode.cs.

+
7  {
11  Autodetect,
12 
16  Force,
17 
21  Only,
22 
26  Never
27  }
+ +
Run the wizard if the appsettings.{Environment}.json is not present or empty
+ +
+
+
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_console.html b/namespace_tgstation_1_1_server_1_1_host_1_1_console.html new file mode 100644 index 0000000000..a8e3ce4c78 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_console.html @@ -0,0 +1,97 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Console Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Console Namespace Reference
+
+
+ + + + +

+Namespaces

namespace  Tests
 
+ + + + +

+Classes

class  Program
 Contains the entrypoint for the application More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests.html b/namespace_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests.html new file mode 100644 index 0000000000..0c240c1e8b --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Console.Tests Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Console.Tests Namespace Reference
+
+
+ + + + +

+Classes

class  TestProgram
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_controllers.html b/namespace_tgstation_1_1_server_1_1_host_1_1_controllers.html new file mode 100644 index 0000000000..d9b72544e1 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_controllers.html @@ -0,0 +1,133 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Controllers Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Controllers Namespace Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Classes

class  AdministrationController
 ModelController<TModel> for Administration More...
 
class  ApiController
 A Controller for API functions More...
 
class  ByondController
 Controller for managing Api.Models.Byond.Versions More...
 
class  ChatController
 ModelController<TModel> for managing Api.Models.ChatBots More...
 
class  ConfigurationController
 The ModelController<TModel> for ConfigurationFiles More...
 
class  DreamDaemonController
 ModelController<TModel> for managing the DreamDaemon More...
 
class  DreamMakerController
 Controller for managing the compiler More...
 
class  HomeController
 Main ApiController for the Application More...
 
class  InstanceController
 Controller for managing Components.Instances More...
 
class  InstanceUserController
 For managing Users More...
 
class  JobController
 ModelController<TModel> for Api.Models.Jobs More...
 
class  ModelController
 An ApiController representing a TModel More...
 
class  RepositoryController
 Controller for managing the Repositorys More...
 
class  TgsAuthorizeAttribute
 Helper for using the AuthorizeAttribute with the Api.Rights system More...
 
class  UserController
 For managing Users More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_core.html b/namespace_tgstation_1_1_server_1_1_host_1_1_core.html new file mode 100644 index 0000000000..33f1fa51e3 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_core.html @@ -0,0 +1,176 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core Namespace Reference
+
+
+ + + + +

+Namespaces

namespace  Tests
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Classes

class  Application
 
class  ApplicationBuilderExtensions
 Extensions for IApplicationBuilder More...
 
class  AsyncDelayer
 
class  DatabaseContextFactory
 
class  DBConnectionFactory
 
class  GitHubClientFactory
 
interface  IApplication
 Configures the ASP.NET Core web application More...
 
interface  IAsyncDelayer
 For waiting asynchronously More...
 
interface  IDatabaseContextFactory
 Factory for scoping usage of IDatabaseContexts. Meant for use by Components More...
 
interface  IDBConnectionFactory
 For creating DbConnection More...
 
interface  IGitHubClientFactory
 For creating IGitHubClients More...
 
interface  IJobManager
 Manages the runtime of Jobs More...
 
interface  IPlatformIdentifier
 For identifying the current platform More...
 
interface  IProcess
 Abstraction over a System.Diagnostics.Process More...
 
interface  IProcessBase
 Represents process lifetime More...
 
interface  IProcessExecutor
 For launching IProcess' More...
 
interface  IRestartHandler
 Handler for server restarts More...
 
interface  IRestartRegistration
 Represents the lifetime of a IRestartHandler registration More...
 
interface  IServerControl
 Represents a service that may take an updated Host assembly and run it, stopping the current assembly in the process More...
 
interface  ISetupWizard
 The command line Configuration setup wizard More...
 
class  JobException
 Operation exceptions thrown from the context of a Models.Job More...
 
class  JobHandler
 Class for pairing Tasks with CancellationTokenSources More...
 
class  JobManager
 
class  PlatformIdentifier
 
class  Process
 
class  ProcessExecutor
 
class  RestartRegistration
 
class  SemaphoreSlimContext
 Async lock context helper More...
 
class  ServiceCollectionExtensions
 Extensions for IServiceCollection More...
 
class  SetupWizard
 
class  TaskExtensions
 Extensions for the Task class. More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests.html b/namespace_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests.html new file mode 100644 index 0000000000..2d8edaee5b --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests.html @@ -0,0 +1,109 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Core.Tests Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Core.Tests Namespace Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +

+Classes

class  TestApplication
 Tests for Application More...
 
class  TestAsyncDelayer
 
class  TestDatabaseContextFactory
 
class  TestDBConnectionFactory
 
class  TestGitHubClientFactory
 
class  TestJobException
 
class  TestJobHandler
 
class  TestPlatformIdentifier
 
class  TestServiceCollectionExtensions
 
class  TestSetupWizard
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_i_o.html b/namespace_tgstation_1_1_server_1_1_host_1_1_i_o.html new file mode 100644 index 0000000000..42edd2e2f4 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_i_o.html @@ -0,0 +1,131 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.IO Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IO Namespace Reference
+
+
+ + + + +

+Namespaces

namespace  Tests
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Classes

class  Console
 
class  DefaultIOManager
 IIOManager that resolves paths to Environment.CurrentDirectory More...
 
interface  IConsole
 Abstraction for System.Console More...
 
interface  IIOManager
 Interface for using filesystems More...
 
interface  IPostWriteHandler
 Handles changing file modes/permissions after writing More...
 
interface  ISymlinkFactory
 For creating filesystem symbolic links More...
 
interface  ISynchronousIOManager
 For accessing the disk in a synchronous manner More...
 
class  PosixPostWriteHandler
 IPostWriteHandler for POSIX systems More...
 
class  PosixSymlinkFactory
 ISymlinkFactory for posix systems More...
 
class  ResolvingIOManager
 An IIOManager that resolve relative paths from another IIOManager to a subdirectory of that More...
 
class  SynchronousIOManager
 
class  WindowsPostWriteHandler
 IPostWriteHandler for Windows systems More...
 
class  WindowsSymlinkFactory
 ISymlinkFactory for windows systems More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests.html b/namespace_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests.html new file mode 100644 index 0000000000..278b5e560a --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.IO.Tests Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.IO.Tests Namespace Reference
+
+
+ + + + + + + + +

+Classes

class  TestConsole
 
class  TestPostWriteHandler
 
class  TestSymlinkFactory
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_models.html b/namespace_tgstation_1_1_server_1_1_host_1_1_models.html new file mode 100644 index 0000000000..315d61ab10 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_models.html @@ -0,0 +1,150 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models Namespace Reference
+
+
+ + + + +

+Namespaces

namespace  Migrations
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Classes

class  ChatBot
 
class  ChatChannel
 
class  CompileJob
 
class  DatabaseContext
 
class  DatabaseSeeder
 
class  DreamDaemonSettings
 
class  DreamMakerSettings
 
interface  IDatabaseContext
 Represents the database More...
 
interface  IDatabaseSeeder
 For initially seeding a database More...
 
class  Instance
 Represents an Api.Models.Instance in the database More...
 
class  InstanceUser
 
class  Job
 
class  MySqlDatabaseContext
 DatabaseContext<TParentContext> for MySQL More...
 
class  ReattachInformation
 Database representation of Components.Watchdog.ReattachInformation More...
 
class  ReattachInformationBase
 Base class for ReattachInformation More...
 
class  RepositorySettings
 
class  RevInfoTestMerge
 Many to many relationship for Models.RevisionInformation and Models.TestMerge More...
 
class  RevisionInformation
 
class  SqlServerDatabaseContext
 DatabaseContext<TParentContext> for Sqlserver More...
 
class  TestMerge
 
class  User
 
class  WatchdogReattachInformation
 Database representation of Components.Watchdog.WatchdogReattachInformation More...
 
class  WatchdogReattachInformationBase
 Base class for WatchdogReattachInformation More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations.html b/namespace_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations.html new file mode 100644 index 0000000000..d6cca1ca79 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations.html @@ -0,0 +1,135 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Models.Migrations Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Models.Migrations Namespace Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Classes

class  DesignTimeDbContextFactoryHelpers
 Contains helpers for creating design time DatabaseContext<TParentContext>s More...
 
class  MSAddMinimumSecurity
 Add the Api.Models.Internal.CompileJob.MinimumSecurityLevel and DreamMaker.ApiValidationSecurityLevel columns for MSSQL More...
 
class  MSFixRevInfoIndex
 Make commit shas non-unique per Instance for MSSQL More...
 
class  MSInitialCreate
 The initial database migration for MSSQL More...
 
class  MSNullableAndForeignKeyCleanup
 Cleans up of nullable columns and foreign keys MSSQL More...
 
class  MSReattachCompileJobRequired
 Marks the CompileJobs of ReattachInformations as non-nullable for MSSQL More...
 
class  MSToggleTestmergeComments
 Add the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MSSQL More...
 
class  MYAddMinimumSecurity
 Add the Api.Models.Internal.CompileJob.MinimumSecurityLevel and DreamMaker.ApiValidationSecurityLevel columns for MySQL/MariaDB More...
 
class  MYFixRevInfoIndex
 Make commit shas non-unique per Instance for MSSQL More...
 
class  MYInitialCreate
 The initial database migration for MySQL/MariaDB More...
 
class  MYNullableAndForeignKeyCleanup
 Cleans up of nullable columns and foreign keys MySQL/MariaDB More...
 
class  MYReattachCompileJobRequired
 Marks the CompileJobs of ReattachInformations as non-nullable for MySQL/MariaDB More...
 
class  MySqlDatabaseContextModelSnapshot
 
class  MySqlDesignTimeDbContextFactory
 
class  MYToggleTestmergeComments
 Add the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MySQL/MariaDB More...
 
class  SqlServerDatabaseContextModelSnapshot
 
class  SqlServerDesignTimeDbContextFactory
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_security.html b/namespace_tgstation_1_1_server_1_1_host_1_1_security.html new file mode 100644 index 0000000000..7e0ec3e015 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_security.html @@ -0,0 +1,143 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security Namespace Reference
+
+
+ + + + +

+Namespaces

namespace  Tests
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Classes

class  AuthenticationContext
 Manages Api.Models.Users for a scope More...
 
class  AuthenticationContextFactory
 
class  ClaimsInjector
 
class  CryptographySuite
 
interface  IAuthenticationContext
 Represents the currently authenticated Api.Models.User More...
 
interface  IAuthenticationContextFactory
 For creating and accessing authentication contexts More...
 
interface  IClaimsInjector
 For injecting System.Security.Claims.Claims that Controllers.TgsAuthorizeAttribute can look for More...
 
interface  ICryptographySuite
 Contains various cryptographic functions More...
 
class  IdentityCache
 
class  IdentityCacheObject
 For keeping a specific ISystemIdentity alive for a period of time More...
 
interface  IIdentityCache
 For caching ISystemIdentitys More...
 
interface  ISystemIdentity
 Represents a user on the current System.Runtime.InteropServices.OSPlatform More...
 
interface  ISystemIdentityFactory
 Factory for ISystemIdentitys More...
 
interface  ITokenFactory
 For creating Tokens More...
 
class  PosixSystemIdentityFactory
 ISystemIdentityFactory for posix systems More...
 
class  TokenFactory
 
class  WindowsSystemIdentity
 ISystemIdentity for windows systems More...
 
class  WindowsSystemIdentityFactory
 ISystemIdentityFactory for windows systems. Uses long running tasks due to potential networked domains More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_security_1_1_tests.html b/namespace_tgstation_1_1_server_1_1_host_1_1_security_1_1_tests.html new file mode 100644 index 0000000000..3180517243 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_security_1_1_tests.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Security.Tests Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Security.Tests Namespace Reference
+
+
+ + + + + +

+Classes

class  TestAuthenticationContext
 Tests for AuthenticationContext More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_service.html b/namespace_tgstation_1_1_server_1_1_host_1_1_service.html new file mode 100644 index 0000000000..4c5d22e90d --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_service.html @@ -0,0 +1,100 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Service Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Service Namespace Reference
+
+
+ + + + +

+Namespaces

namespace  Tests
 
+ + + + + + + +

+Classes

class  Program
 Contains the entrypoint for the application More...
 
class  ServerService
 Represents a IWatchdog as a ServiceBase More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_service_1_1_tests.html b/namespace_tgstation_1_1_server_1_1_host_1_1_service_1_1_tests.html new file mode 100644 index 0000000000..950da97e4c --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_service_1_1_tests.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Service.Tests Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Service.Tests Namespace Reference
+
+
+ + + + + +

+Classes

class  TestServerService
 Tests for ServerService More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_tests.html b/namespace_tgstation_1_1_server_1_1_host_1_1_tests.html new file mode 100644 index 0000000000..890c603307 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_tests.html @@ -0,0 +1,91 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Tests Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Tests Namespace Reference
+
+
+ + + + + +

+Classes

class  TestServerFactory
 Tests for ServerFactory More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_watchdog.html b/namespace_tgstation_1_1_server_1_1_host_1_1_watchdog.html new file mode 100644 index 0000000000..fd46e77bd5 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_watchdog.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Watchdog Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Watchdog Namespace Reference
+
+
+ + + + +

+Namespaces

namespace  Tests
 
+ + + + + + + + + + + +

+Classes

interface  IWatchdog
 The watchdog for a Host More...
 
interface  IWatchdogFactory
 Factory for creating IWatchdogs More...
 
class  Watchdog
 
class  WatchdogFactory
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests.html b/namespace_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests.html new file mode 100644 index 0000000000..aab3c7e9a5 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests.html @@ -0,0 +1,93 @@ + + + + + + + +tgstation-server: Tgstation.Server.Host.Watchdog.Tests Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Host.Watchdog.Tests Namespace Reference
+
+
+ + + + + + + +

+Classes

class  TestWatchdog
 
class  TestWatchdogFactory
 Tests for WatchdogFactory More...
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_tests.html b/namespace_tgstation_1_1_server_1_1_tests.html new file mode 100644 index 0000000000..e83d889b42 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_tests.html @@ -0,0 +1,102 @@ + + + + + + + +tgstation-server: Tgstation.Server.Tests Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Tests Namespace Reference
+
+
+ + + + +

+Namespaces

namespace  Instance
 
+ + + + + + + + + +

+Classes

class  AdministrationTest
 
class  InstanceManagerTest
 
class  IntegrationTest
 
class  TestingServer
 
+
+ + + + diff --git a/namespace_tgstation_1_1_server_1_1_tests_1_1_instance.html b/namespace_tgstation_1_1_server_1_1_tests_1_1_instance.html new file mode 100644 index 0000000000..bdff33efa6 --- /dev/null +++ b/namespace_tgstation_1_1_server_1_1_tests_1_1_instance.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: Tgstation.Server.Tests.Instance Namespace Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Tgstation.Server.Tests.Instance Namespace Reference
+
+
+ + + + + + + + +

+Classes

class  ByondTest
 
class  ConfigurationTest
 
class  InstanceTest
 
+
+ + + + diff --git a/namespacemembers.html b/namespacemembers.html new file mode 100644 index 0000000000..5e0b3078af --- /dev/null +++ b/namespacemembers.html @@ -0,0 +1,142 @@ + + + + + + + +tgstation-server: Package Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all namespace members with links to the namespace documentation for each member:
+
+ + + + diff --git a/namespacemembers_enum.html b/namespacemembers_enum.html new file mode 100644 index 0000000000..d7586bc249 --- /dev/null +++ b/namespacemembers_enum.html @@ -0,0 +1,142 @@ + + + + + + + +tgstation-server: Package Functions + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/namespaces.html b/namespaces.html new file mode 100644 index 0000000000..de6aefa6ab --- /dev/null +++ b/namespaces.html @@ -0,0 +1,129 @@ + + + + + + + +tgstation-server: Packages + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Packages
+
+
+
Here are the packages with brief descriptions (if available):
+
[detail level 1234567]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 NReleaseNotes
 NTgstation
 NServer
 NApi
 NModels
 NInternal
 NTests
 NRights
 NTests
 NTests
 NClient
 NComponents
 NTests
 NTests
 NHost
 NComponents
 NByond
 NTests
 NChat
 NCommands
 NProviders
 NTests
 NCompiler
 NInterop
 NRepository
 NStaticFiles
 NWatchdog
 NTests
 NConfiguration
 NConsole
 NTests
 NControllers
 NCore
 NTests
 NIO
 NTests
 NModels
 NMigrations
 NSecurity
 NTests
 NService
 NTests
 NTests
 NWatchdog
 NTests
 NTests
 NInstance
+
+
+ + + + diff --git a/nav_f.png b/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 HcmV?d00001 diff --git a/nav_g.png b/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_0.js b/search/all_0.js new file mode 100644 index 0000000000..150b7dee32 --- /dev/null +++ b/search/all_0.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['20180906135553_5fmsinitialcreate_2ecs',['20180906135553_MSInitialCreate.cs',['../20180906135553___m_s_initial_create_8cs.html',1,'']]], + ['20180906135553_5fmsinitialcreate_2edesigner_2ecs',['20180906135553_MSInitialCreate.Designer.cs',['../20180906135553___m_s_initial_create_8_designer_8cs.html',1,'']]], + ['20180906143029_5fmyinitialcreate_2ecs',['20180906143029_MYInitialCreate.cs',['../20180906143029___m_y_initial_create_8cs.html',1,'']]], + ['20180906143029_5fmyinitialcreate_2edesigner_2ecs',['20180906143029_MYInitialCreate.Designer.cs',['../20180906143029___m_y_initial_create_8_designer_8cs.html',1,'']]], + ['20180918020726_5fmyaddminimumsecurity_2ecs',['20180918020726_MYAddMinimumSecurity.cs',['../20180918020726___m_y_add_minimum_security_8cs.html',1,'']]], + ['20180918020726_5fmyaddminimumsecurity_2edesigner_2ecs',['20180918020726_MYAddMinimumSecurity.Designer.cs',['../20180918020726___m_y_add_minimum_security_8_designer_8cs.html',1,'']]], + ['20180918021228_5fmsaddminimumsecurity_2ecs',['20180918021228_MSAddMinimumSecurity.cs',['../20180918021228___m_s_add_minimum_security_8cs.html',1,'']]], + ['20180918021228_5fmsaddminimumsecurity_2edesigner_2ecs',['20180918021228_MSAddMinimumSecurity.Designer.cs',['../20180918021228___m_s_add_minimum_security_8_designer_8cs.html',1,'']]], + ['20180918204520_5fmynullableandforeignkeycleanup_2ecs',['20180918204520_MYNullableAndForeignKeyCleanup.cs',['../20180918204520___m_y_nullable_and_foreign_key_cleanup_8cs.html',1,'']]], + ['20180918204520_5fmynullableandforeignkeycleanup_2edesigner_2ecs',['20180918204520_MYNullableAndForeignKeyCleanup.Designer.cs',['../20180918204520___m_y_nullable_and_foreign_key_cleanup_8_designer_8cs.html',1,'']]], + ['20180918205224_5fmsnullableandforeignkeycleanup_2ecs',['20180918205224_MSNullableAndForeignKeyCleanup.cs',['../20180918205224___m_s_nullable_and_foreign_key_cleanup_8cs.html',1,'']]], + ['20180918205224_5fmsnullableandforeignkeycleanup_2edesigner_2ecs',['20180918205224_MSNullableAndForeignKeyCleanup.Designer.cs',['../20180918205224___m_s_nullable_and_foreign_key_cleanup_8_designer_8cs.html',1,'']]], + ['20180926033145_5fmsreattachcompilejobrequired_2ecs',['20180926033145_MSReattachCompileJobRequired.cs',['../20180926033145___m_s_reattach_compile_job_required_8cs.html',1,'']]], + ['20180926033145_5fmsreattachcompilejobrequired_2edesigner_2ecs',['20180926033145_MSReattachCompileJobRequired.Designer.cs',['../20180926033145___m_s_reattach_compile_job_required_8_designer_8cs.html',1,'']]], + ['20180926034014_5fmyreattachcompilejobrequired_2ecs',['20180926034014_MYReattachCompileJobRequired.cs',['../20180926034014___m_y_reattach_compile_job_required_8cs.html',1,'']]], + ['20180926034014_5fmyreattachcompilejobrequired_2edesigner_2ecs',['20180926034014_MYReattachCompileJobRequired.Designer.cs',['../20180926034014___m_y_reattach_compile_job_required_8_designer_8cs.html',1,'']]], + ['20181124231534_5fmstoggletestmergecomments_2ecs',['20181124231534_MSToggleTestmergeComments.cs',['../20181124231534___m_s_toggle_testmerge_comments_8cs.html',1,'']]], + ['20181124231534_5fmstoggletestmergecomments_2edesigner_2ecs',['20181124231534_MSToggleTestmergeComments.Designer.cs',['../20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs.html',1,'']]], + ['20181124231549_5fmytoggletestmergecomments_2ecs',['20181124231549_MYToggleTestmergeComments.cs',['../20181124231549___m_y_toggle_testmerge_comments_8cs.html',1,'']]], + ['20181124231549_5fmytoggletestmergecomments_2edesigner_2ecs',['20181124231549_MYToggleTestmergeComments.Designer.cs',['../20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs.html',1,'']]], + ['20190219041825_5fmsfixrevinfoindex_2ecs',['20190219041825_MSFixRevInfoIndex.cs',['../20190219041825___m_s_fix_rev_info_index_8cs.html',1,'']]], + ['20190219041825_5fmsfixrevinfoindex_2edesigner_2ecs',['20190219041825_MSFixRevInfoIndex.Designer.cs',['../20190219041825___m_s_fix_rev_info_index_8_designer_8cs.html',1,'']]], + ['20190219042440_5fmyfixrevinfoindex_2ecs',['20190219042440_MYFixRevInfoIndex.cs',['../20190219042440___m_y_fix_rev_info_index_8cs.html',1,'']]], + ['20190219042440_5fmyfixrevinfoindex_2edesigner_2ecs',['20190219042440_MYFixRevInfoIndex.Designer.cs',['../20190219042440___m_y_fix_rev_info_index_8_designer_8cs.html',1,'']]] +]; diff --git a/search/all_1.html b/search/all_1.html new file mode 100644 index 0000000000..2f46793669 --- /dev/null +++ b/search/all_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_1.js b/search/all_1.js new file mode 100644 index 0000000000..91790914ac --- /dev/null +++ b/search/all_1.js @@ -0,0 +1,94 @@ +var searchData= +[ + ['accessdenied',['AccessDenied',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html#acb78a02b4881844e9412384563d9d78d',1,'Tgstation::Server::Api::Models::ConfigurationFile']]], + ['accessidentifier',['AccessIdentifier',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html#a2bd99b30ed4d54d87603c04e2feef05b',1,'Tgstation.Server.Host.Components.Interop.JsonFile.AccessIdentifier()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html#a5e04032bcdd57e2008d0072359321aef',1,'Tgstation.Server.Host.Models.ReattachInformationBase.AccessIdentifier()']]], + ['accesstoken',['AccessToken',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#a01d23bbd00ea0d0ef0562690dda05d68',1,'Tgstation.Server.Api.Models.Internal.RepositorySettings.AccessToken()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html#a8f0e23dc0b852a011d12ed8b092e3d95',1,'Tgstation.Server.Host.Models.DreamDaemonSettings.AccessToken()']]], + ['accessuser',['AccessUser',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#abd68bd6a273689244ef32837167a017b',1,'Tgstation::Server::Api::Models::Internal::RepositorySettings']]], + ['active',['Active',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_json_tracking_context.html#a95e3032dfe80bf9b43319cd748e92f43',1,'Tgstation.Server.Host.Components.Chat.IJsonTrackingContext.Active()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#ae49232400fdffefa09614f56ebaf30a3',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext.Active()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#ad884d3e85c000fa8e1e2a38f85205d71',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext.active()']]], + ['activecompilejob',['ActiveCompileJob',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html#a311301ac58f15b03a82b11eb0788a450',1,'Tgstation.Server.Api.Models.DreamDaemon.ActiveCompileJob()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#a81dcb408195dd21a64c7df3f73c5e123',1,'Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.ActiveCompileJob()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#ad92fd5a42c701562bd4ae033b533b9bd',1,'Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.ActiveCompileJob()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#a23f9971c8bc84a87cfaf08744eaaee0d',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.ActiveCompileJob()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a45abee7a1738182e8dc0fd27544dbc79',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ActiveCompileJob()']]], + ['activejob',['ActiveJob',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html#a9f29b34852fb2d6cc5144234b6368295',1,'Tgstation::Server::Api::Models::Repository']]], + ['activelaunchparameters',['ActiveLaunchParameters',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#a19270c2054e4431802fdf5a59f9b3518',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.ActiveLaunchParameters()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a9affc2eeae2903d1bdb0fa81a6550fc4',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ActiveLaunchParameters()']]], + ['activelaunchparametersupdated',['ActiveLaunchParametersUpdated',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#acb2ccc2dc05d01ec3a6448d3d57155c9a5787c2f334905254452c2c362bf5874b',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['activeparametersupdated',['ActiveParametersUpdated',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#afee401fd5e0d23482b77498b6ec23a03',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['activeserver',['ActiveServer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_monitor_state.html#a2dd69b0c4244d5e4bc042c29fda80991',1,'Tgstation::Server::Host::Components::Watchdog::MonitorState']]], + ['activeservercrashed',['ActiveServerCrashed',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#acb2ccc2dc05d01ec3a6448d3d57155c9ab92e148d2dd1c50669d594966a5ec6df',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['activeserverrebooted',['ActiveServerRebooted',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#acb2ccc2dc05d01ec3a6448d3d57155c9ab97165994c837a20e96ed22267cb1a86',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['activetestmerges',['ActiveTestMerges',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information.html#ac2fdbb439533190464a6853975fa5a6c',1,'Tgstation.Server.Api.Models.RevisionInformation.ActiveTestMerges()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html#a25414bdca3caccf6cbb2a9924ee1e51a',1,'Tgstation.Server.Host.Models.RevisionInformation.ActiveTestMerges()']]], + ['activeversion',['ActiveVersion',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a3e62e619b7e50c3b9c990952d7a426be',1,'Tgstation.Server.Host.Components.Byond.ByondManager.ActiveVersion()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_manager.html#a4bbf7c36cfdbbbdc5a87813d0d6959f6',1,'Tgstation.Server.Host.Components.Byond.IByondManager.ActiveVersion()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html#a33ebe5cafb9a3e5cfa0b6a0bf9f6070f',1,'Tgstation.Server.Client.Components.ByondClient.ActiveVersion()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client.html#a98f0743e5c383c7d301a4b436d298c72',1,'Tgstation.Server.Client.Components.IByondClient.ActiveVersion()']]], + ['activeversionfilename',['ActiveVersionFileName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a55d24d297ec0618cf0ecdd6fc0bd5a66',1,'Tgstation::Server::Host::Components::Byond::ByondManager']]], + ['addrequestlogger',['AddRequestLogger',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a139db37d2f5069e2940421a0cd12fd93',1,'Tgstation.Server.Client.ApiClient.AddRequestLogger()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a55853418698889c9f90804d1e9067b51',1,'Tgstation.Server.Client.IApiClient.AddRequestLogger()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html#aa06d2eb21c87b01b2d195e3125cb7ccf',1,'Tgstation.Server.Client.IServerClient.AddRequestLogger()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a5b082a51331accc1d118b549c422169a',1,'Tgstation.Server.Client.ServerClient.AddRequestLogger()']]], + ['address',['Address',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#a742b0cb17d7a59090cac73f8cc147743',1,'Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Address()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a5b89ca154b65b12e53b6dca3ceeb0243',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.address()']]], + ['addtestmerge',['AddTestMerge',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#a05fcb2c19ab0f43a15264431a20790ec',1,'Tgstation.Server.Host.Components.Repository.IRepository.AddTestMerge()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#ab400805727fc1130c18a878f131edce1',1,'Tgstation.Server.Host.Components.Repository.Repository.AddTestMerge()']]], + ['adirectoryname',['ADirectoryName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#af0d17d78c53e4981ffc59049c2c56706',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['administration',['Administration',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_administration.html',1,'Tgstation.Server.Api.Models.Administration'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a1bd414117e790a954bd7bfb83c7d4fc9',1,'Tgstation.Server.Api.Routes.Administration()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html#a170097fe653238823c6a3c5a07c4ec94',1,'Tgstation.Server.Client.IServerClient.Administration()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#af81da913067b74f5e8098c6106fda1af',1,'Tgstation.Server.Client.ServerClient.Administration()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20a7258e7251413465e0a3eb58094430bde',1,'Tgstation.Server.Api.Rights.Administration()']]], + ['administration_2ecs',['Administration.cs',['../_administration_8cs.html',1,'']]], + ['administrationclient',['AdministrationClient',['../class_tgstation_1_1_server_1_1_client_1_1_administration_client.html',1,'Tgstation.Server.Client.AdministrationClient'],['../class_tgstation_1_1_server_1_1_client_1_1_administration_client.html#aa5d48433766cd2f29ee60007767f5387',1,'Tgstation.Server.Client.AdministrationClient.AdministrationClient()']]], + ['administrationclient_2ecs',['AdministrationClient.cs',['../_administration_client_8cs.html',1,'']]], + ['administrationcontroller',['AdministrationController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html',1,'Tgstation.Server.Host.Controllers.AdministrationController'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#aaa8e198cadcd3b26ad60708965fcee60',1,'Tgstation.Server.Host.Controllers.AdministrationController.AdministrationController()']]], + ['administrationcontroller_2ecs',['AdministrationController.cs',['../_administration_controller_8cs.html',1,'']]], + ['administrationrights',['AdministrationRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#ad28e489fcb8df51b4ba2f5cdf5dd5d22',1,'Tgstation.Server.Api.Models.Internal.User.AdministrationRights()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#affda1440f9c5e2dfcca65138d2f89a21',1,'Tgstation.Server.Api.Rights.AdministrationRights()']]], + ['administrationrights_2ecs',['AdministrationRights.cs',['../_administration_rights_8cs.html',1,'']]], + ['administrationtest',['AdministrationTest',['../class_tgstation_1_1_server_1_1_tests_1_1_administration_test.html',1,'Tgstation.Server.Tests.AdministrationTest'],['../class_tgstation_1_1_server_1_1_tests_1_1_administration_test.html#a20ab9f933254691d5334e3a63bb20056',1,'Tgstation.Server.Tests.AdministrationTest.AdministrationTest()']]], + ['administrationtest_2ecs',['AdministrationTest.cs',['../_administration_test_8cs.html',1,'']]], + ['adminname',['AdminName',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user.html#a446a804a6eeed2502879382f46df0b9d',1,'Tgstation::Server::Api::Models::User']]], + ['adminonly',['AdminOnly',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html#a42073a7395ce9de9b0de9d36e4d6f388',1,'Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.AdminOnly()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.html#a32556e6bc56cad31d993e4be70e7ca60',1,'Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.AdminOnly()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command.html#a0872d9ed0ba21f3decc6d5303001fc8e',1,'Tgstation.Server.Host.Components.Chat.Commands.ICommand.AdminOnly()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command.html#ad69632c6b423bea790abde206d926425',1,'Tgstation.Server.Host.Components.Chat.Commands.KekCommand.AdminOnly()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#a63dc4a93cb647e14f40a613101d7335e',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.AdminOnly()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html#a17094a94c993b8bbb5fdda8b7a470707',1,'Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.AdminOnly()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.html#a801fd1e205cb8e006fefcbf8af8e3b30',1,'Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.AdminOnly()']]], + ['allowanyorigin',['AllowAnyOrigin',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_control_panel_configuration.html#a5c0b28cdbd801a02bce701901a060818',1,'Tgstation::Server::Host::Configuration::ControlPanelConfiguration']]], + ['allowedorigins',['AllowedOrigins',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_control_panel_configuration.html#a7f0a8f0d0540bb5832bf61c86a98b202',1,'Tgstation::Server::Host::Configuration::ControlPanelConfiguration']]], + ['allowunprivilegedcreate',['AllowUnprivilegedCreate',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#afecbde132584de6ed7e41c8c7535f556aa5039b48592e4eb0e0bcc4bebf94bdf8',1,'Tgstation::Server::Host::NativeMethods']]], + ['allowwebclient',['AllowWebClient',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.html#a5f96244396a57f351043723b254803bc',1,'Tgstation::Server::Api::Models::Internal::DreamDaemonLaunchParameters']]], + ['alpha',['Alpha',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information.html#ad4200a3bfd73794a43632ca0cc0159db',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.Alpha()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information.html#a3a49df7a56bfa54062a9ff6b71da2390',1,'Tgstation.Server.Host.Models.WatchdogReattachInformation.Alpha()']]], + ['alphabravostartupseperationinterval',['AlphaBravoStartupSeperationInterval',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#a2ff3cf57883f2b63890498b5e6b4821b',1,'Tgstation::Server::Host::Components::Watchdog::ExperimentalWatchdog']]], + ['alphaisactive',['AlphaIsActive',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#aab354486232b251f67b55956510c409b',1,'Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.AlphaIsActive()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#aa3c8cbb203ca8a7c7d7c021929f9179c',1,'Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.AlphaIsActive()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#abbbd1824bcf972a1eb312c12780fc0bc',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.AlphaIsActive()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a39f77bb87d63b1a1a50aac89ad909f29',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.AlphaIsActive()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base.html#a5aedd7a86a8a880e075bc414cba587bf',1,'Tgstation.Server.Host.Models.WatchdogReattachInformationBase.AlphaIsActive()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#a4f66d0dbde98c0e34ee6a57f7b7d2a78',1,'Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.alphaIsActive()']]], + ['alphaserver',['alphaServer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#a0c3dbaa20e0dd6fe267c7030bc5b2b10',1,'Tgstation::Server::Host::Components::Watchdog::ExperimentalWatchdog']]], + ['anyrights',['AnyRights',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.html#a59c0c3cc859620cac6feef11142b561d',1,'Tgstation::Server::Host::Models::InstanceUser']]], + ['api',['API',['../api.html',1,'']]], + ['api_2edox',['API.dox',['../_a_p_i_8dox.html',1,'']]], + ['apiclient',['ApiClient',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html',1,'Tgstation.Server.Client.ApiClient'],['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a26be1a658c69fad22bd229863013f2f7',1,'Tgstation.Server.Client.ApiClient.ApiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_administration_client.html#aa8fcfafea45fc308cd03fc312b49bbc9',1,'Tgstation.Server.Client.AdministrationClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html#a295eaf549628214344fb27e81fba5541',1,'Tgstation.Server.Client.Components.ByondClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#a6d24e075bdc11fb958a8b4621475b662',1,'Tgstation.Server.Client.Components.ChatBotsClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#a42e1a0711dec8d78fc370b30b1aacf80',1,'Tgstation.Server.Client.Components.ConfigurationClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#a877a9f75012ed5a6f8673e6ab152b7b8',1,'Tgstation.Server.Client.Components.DreamDaemonClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#a15b39a0722ab7ba469ea002df87190a7',1,'Tgstation.Server.Client.Components.DreamMakerClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#af73c0e3dbcf9e1bc1f8591f3a6331629',1,'Tgstation.Server.Client.Components.InstanceClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#afe9a85e5c7dfa76fcd2ffdeecc388b34',1,'Tgstation.Server.Client.Components.InstanceUserClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html#acd85788ba2647284a601f7cca2e3d8cb',1,'Tgstation.Server.Client.Components.JobsClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#a34759d9d0d89eab5def2d32cc90b7736',1,'Tgstation.Server.Client.Components.RepositoryClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#a717fb098fea90adf6d93ae860e0420fe',1,'Tgstation.Server.Client.InstanceManagerClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a20ec30223872220ef996f4219888f3cc',1,'Tgstation.Server.Client.ServerClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#a1d983fe53f4fef69d2ba676884d4ce8c',1,'Tgstation.Server.Client.UsersClient.apiClient()']]], + ['apiclient_2ecs',['ApiClient.cs',['../_api_client_8cs.html',1,'']]], + ['apiclientfactory',['ApiClientFactory',['../class_tgstation_1_1_server_1_1_client_1_1_api_client_factory.html',1,'Tgstation.Server.Client.ApiClientFactory'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.html#a1ce05c0c437fca7e62dd764346be53a0',1,'Tgstation.Server.Client.ServerClientFactory.ApiClientFactory()']]], + ['apiclientfactory_2ecs',['ApiClientFactory.cs',['../_api_client_factory_8cs.html',1,'']]], + ['apiconflictexception',['ApiConflictException',['../class_tgstation_1_1_server_1_1_client_1_1_api_conflict_exception.html',1,'Tgstation.Server.Client.ApiConflictException'],['../class_tgstation_1_1_server_1_1_client_1_1_api_conflict_exception.html#ab4f3940b662b24b906bf15d94a0c64b9',1,'Tgstation.Server.Client.ApiConflictException.ApiConflictException()'],['../class_tgstation_1_1_server_1_1_client_1_1_api_conflict_exception.html#ac779b4eb27f674d0c804955a8bb50b4b',1,'Tgstation.Server.Client.ApiConflictException.ApiConflictException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_api_conflict_exception.html#a76b2d08f49a952c5693d785c379328e2',1,'Tgstation.Server.Client.ApiConflictException.ApiConflictException(string message, Exception innerException)']]], + ['apiconflictexception_2ecs',['ApiConflictException.cs',['../_api_conflict_exception_8cs.html',1,'']]], + ['apiconflictexception_3f_3f',['ApiConflictException??',['../class_tgstation_1_1_server_1_1_client_1_1_api_conflict_exception.html#ab1fd0da6e865a2ad994976b56696b977',1,'Tgstation::Server::Client::ApiConflictException']]], + ['apicontroller',['ApiController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html',1,'Tgstation.Server.Host.Controllers.ApiController'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#a1049f4b2b9557ea752177833ef52052e',1,'Tgstation.Server.Host.Controllers.ApiController.ApiController()']]], + ['apicontroller_2ecs',['ApiController.cs',['../_api_controller_8cs.html',1,'']]], + ['apiheaders',['ApiHeaders',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html',1,'Tgstation.Server.Api.ApiHeaders'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#a1934074118a6f4f9044b9da630c91a8e',1,'Tgstation.Server.Host.Controllers.ApiController.ApiHeaders()'],['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#aee584e59a0c6535f1d3c60d620036253',1,'Tgstation.Server.Api.ApiHeaders.ApiHeaders(ProductHeaderValue userAgent, string token)'],['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#ac6a606d30d1bd1cf066cd8f5d917df18',1,'Tgstation.Server.Api.ApiHeaders.ApiHeaders(ProductHeaderValue userAgent, string username, string password)'],['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#aa03245a124379bec7f0eb3fc672a4e43',1,'Tgstation.Server.Api.ApiHeaders.ApiHeaders(RequestHeaders requestHeaders)'],['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a16b461300fbc981ef39230f85b680870',1,'Tgstation.Server.Api.ApiHeaders.ApiHeaders(ProductHeaderValue userAgent, string token, string username, string password)']]], + ['apiheaders_2ecs',['ApiHeaders.cs',['../_api_headers_8cs.html',1,'']]], + ['apimismatchexception',['ApiMismatchException',['../class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception.html',1,'Tgstation.Server.Client.ApiMismatchException'],['../class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception.html#a44a164cea5981471231d38a4f6c24445',1,'Tgstation.Server.Client.ApiMismatchException.ApiMismatchException(ErrorMessage errorMessage)'],['../class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception.html#a0d331471e5b733864bda3a8991cd24f1',1,'Tgstation.Server.Client.ApiMismatchException.ApiMismatchException()'],['../class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception.html#a85117962e2ec4b4bad057bb399eee845',1,'Tgstation.Server.Client.ApiMismatchException.ApiMismatchException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception.html#a8250a76f90fa9a5c5a9e76e0c1775300',1,'Tgstation.Server.Client.ApiMismatchException.ApiMismatchException(string message, Exception innerException)']]], + ['apimismatchexception_2ecs',['ApiMismatchException.cs',['../_api_mismatch_exception_8cs.html',1,'']]], + ['apivalidateonly',['ApiValidateOnly',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html#a4eed58bec180ca4d6b45764fb97459d9',1,'Tgstation::Server::Host::Components::Interop::JsonFile']]], + ['apivalidationport',['ApiValidationPort',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker.html#a4b421130ab4c6b6836f8dfbf4f8df02e',1,'Tgstation::Server::Api::Models::DreamMaker']]], + ['apivalidationsecuritylevel',['ApiValidationSecurityLevel',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker.html#abfa04639a2bfa207aef060ca84a732da',1,'Tgstation::Server::Api::Models::DreamMaker']]], + ['apivalidationstatus',['ApiValidationStatus',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a229bbdc35a064d562a4d8779e89f791e',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.ApiValidationStatus()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#a420a602d40898c12599cba77b1df12af',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.ApiValidationStatus()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a983fd5bf0d56d06d9906c69cbd7a81d7',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.ApiValidationStatus()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a53cf16d968bf052deb39c207f5b63c3c',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.apiValidationStatus()'],['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#af7163ca98f9f5e5c731043ecdace3745',1,'Tgstation.Server.Host.Components.Watchdog.ApiValidationStatus()']]], + ['apivalidationstatus_2ecs',['ApiValidationStatus.cs',['../_api_validation_status_8cs.html',1,'']]], + ['apiversion',['ApiVersion',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a4769bf50b06d55b116a34cd1ffa04809',1,'Tgstation.Server.Api.ApiHeaders.ApiVersion()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_server_information.html#af00e7c69acbf29c56b72db2e9ffdaa73',1,'Tgstation.Server.Api.Models.ServerInformation.ApiVersion()']]], + ['apiversionheader',['ApiVersionHeader',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a99649cb8fbf286c635b109e8373b415e',1,'Tgstation::Server::Api::ApiHeaders']]], + ['application',['Application',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html',1,'Tgstation.Server.Host.Core.Application'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#a50d1d37a5a6445d281a45f26f57b18a7',1,'Tgstation.Server.Host.Core.Application.Application()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#a682d13ef1262bd6a39e7c7c6bcb537cf',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.html#aef8fa9c3e5faf65669f3da8c7ac80a35',1,'Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html#acbd1f85ac20eddcfb169523a8af250f7',1,'Tgstation.Server.Host.Components.Chat.ProviderFactory.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#ac3a97f78be517494b755082b2d36e8ba',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#afdd4f1d47dfe74234cea804859fce88c',1,'Tgstation.Server.Host.Components.InstanceFactory.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a943980988fc2fac07085f98eee0b48d7',1,'Tgstation.Server.Host.Components.InstanceManager.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#ac2d5a6dea1cb8242645f96c5db66c25a',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#acf65dab404b5e87eb467ef80124459ab',1,'Tgstation.Server.Host.Controllers.AdministrationController.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#a45c2a8cb2a11e4354193bb8742b709ff',1,'Tgstation.Server.Host.Controllers.HomeController.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a3d7871cf9a4e751e9a25c4ef0595d778',1,'Tgstation.Server.Host.Controllers.InstanceController.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory.html#a803dc318c868ed697fe5f56d312ed909',1,'Tgstation.Server.Host.Core.GitHubClientFactory.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a7ae637043ea8134553f87c1a105b3ff9',1,'Tgstation.Server.Host.Core.SetupWizard.application()']]], + ['application_2ecs',['Application.cs',['../_application_8cs.html',1,'']]], + ['applicationbuilderextensions',['ApplicationBuilderExtensions',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application_builder_extensions.html',1,'Tgstation::Server::Host::Core']]], + ['applicationbuilderextensions_2ecs',['ApplicationBuilderExtensions.cs',['../_application_builder_extensions_8cs.html',1,'']]], + ['applicationjson',['ApplicationJson',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#ab997bcc41eaf1aec06776846675e4569',1,'Tgstation::Server::Api::ApiHeaders']]], + ['applicationstarted',['ApplicationStarted',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime.html#a7cc39319f18b1498e56e57277581180b',1,'Tgstation::Server::Host::Core::Tests::TestApplication::MockApplicationLifetime']]], + ['applicationstopped',['ApplicationStopped',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime.html#a2c49db7567058a404b13cc6d8d19636e',1,'Tgstation::Server::Host::Core::Tests::TestApplication::MockApplicationLifetime']]], + ['applicationstopping',['ApplicationStopping',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime.html#addc2d6f3ff76480893796bc473362b2c',1,'Tgstation::Server::Host::Core::Tests::TestApplication::MockApplicationLifetime']]], + ['applyupdate',['ApplyUpdate',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control.html#a08e0b784b8a22398a183e759446bf5f3',1,'Tgstation.Server.Host.Core.IServerControl.ApplyUpdate()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a38345c5b5fc217b03e0142dc8513e0cd',1,'Tgstation.Server.Host.Server.ApplyUpdate()']]], + ['architecture_2edox',['Architecture.dox',['../_architecture_8dox.html',1,'']]], + ['assemblyinfo_2ecs',['AssemblyInfo.cs',['../_tgstation_8_server_8_client_2_assembly_info_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_assembly_info_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_8_console_2_assembly_info_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs.html',1,'(Global Namespace)']]], + ['assemblyname',['AssemblyName',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#acc064dcbf2348cfcf44d06acff499977',1,'Tgstation::Server::Api::ApiHeaders']]], + ['asyncdelayer',['AsyncDelayer',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_async_delayer.html',1,'Tgstation.Server.Host.Core.AsyncDelayer'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#abbdc59de3b3556a08bd111264527f369',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.AsyncDelayer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a5afa2c2a7ec36f92a63f64cc18f5504e',1,'Tgstation.Server.Host.Components.Chat.Chat.asyncDelayer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html#a6c8a5a6ecc17361261fcfa92518b4e71',1,'Tgstation.Server.Host.Components.Chat.ChatFactory.asyncDelayer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html#a0c4a5f2e2ff5c7656558c250d1620c11',1,'Tgstation.Server.Host.Components.Chat.ProviderFactory.asyncDelayer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a154b7cf302e0d4b39d338846a851b898',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.asyncDelayer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#a54c74a8ac3780369ed05096391c124a5',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.asyncDelayer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#a5a4d7bd7df9fe84ee7b60df90554a6e8',1,'Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.asyncDelayer()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#ae7d416bf09e0f0b5675ed8ce7d99c99a',1,'Tgstation.Server.Host.Core.SetupWizard.asyncDelayer()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html#a9ae1ecab8e3826302aa8d692c0d659d1',1,'Tgstation.Server.Host.Security.IdentityCache.asyncDelayer()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html#ad5a557224dd5d8eac2a46dec133509fb',1,'Tgstation.Server.Host.Security.TokenFactory.asyncDelayer()']]], + ['asyncdelayer_2ecs',['AsyncDelayer.cs',['../_async_delayer_8cs.html',1,'']]], + ['attachexithandler',['AttachExitHandler',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html#a69445610e0255820d0f9d471198d9bbf',1,'Tgstation::Server::Host::Core::ProcessExecutor']]], + ['authenticationcontext',['AuthenticationContext',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html',1,'Tgstation.Server.Host.Security.AuthenticationContext'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#af37f0d0021bc861bea5444108a4de87d',1,'Tgstation.Server.Host.Controllers.ApiController.AuthenticationContext()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a238c36a23b55ce8e76b471e35600a7e3',1,'Tgstation.Server.Host.Security.AuthenticationContext.AuthenticationContext()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a997a651219197de91ceb799db4a340d2',1,'Tgstation.Server.Host.Security.AuthenticationContext.AuthenticationContext(ISystemIdentity systemIdentity, User user, InstanceUser instanceUser)']]], + ['authenticationcontext_2ecs',['AuthenticationContext.cs',['../_authentication_context_8cs.html',1,'']]], + ['authenticationcontextfactory',['AuthenticationContextFactory',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html',1,'Tgstation.Server.Host.Security.AuthenticationContextFactory'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html#a054bf8ed411f414b4ccbd01db5d3b83b',1,'Tgstation.Server.Host.Security.AuthenticationContextFactory.AuthenticationContextFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_claims_injector.html#a65b9d8be87a72903d74d266180612800',1,'Tgstation.Server.Host.Security.ClaimsInjector.authenticationContextFactory()']]], + ['authenticationcontextfactory_2ecs',['AuthenticationContextFactory.cs',['../_authentication_context_factory_8cs.html',1,'']]], + ['author',['Author',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.html#afcd90fdf59c804fd367867b053a7b075',1,'Tgstation::Server::Api::Models::Internal::TestMergeBase']]], + ['authorizeattribute',['AuthorizeAttribute',['../class_authorize_attribute.html',1,'']]], + ['autodetect',['Autodetect',['../namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html#ac25a13ffb39d53803eca454f2a329fc1aa0f56afccfad0701bc1076f838655233',1,'Tgstation::Server::Host::Configuration']]], + ['autogeneratedprogram',['AutoGeneratedProgram',['../class_auto_generated_program.html',1,'']]], + ['autostart',['AutoStart',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_settings.html#ad042a8ceccbcbed55dfabbdebd45b162',1,'Tgstation.Server.Api.Models.Internal.DreamDaemonSettings.AutoStart()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a410f168d84f80c138450fb42f222ba01',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.autoStart()']]], + ['autoupdateinterval',['AutoUpdateInterval',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html#aebe907c68112eae3f1ac2dfdf384ec5b',1,'Tgstation::Server::Api::Models::Instance']]], + ['autoupdateskeeptestmerges',['AutoUpdatesKeepTestMerges',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#ad376f28c643709a12b1a95196f4fe38f',1,'Tgstation::Server::Api::Models::Internal::RepositorySettings']]], + ['autoupdatessynchronize',['AutoUpdatesSynchronize',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#a771f7bdc30a0f666c1eaba7210dfb690',1,'Tgstation::Server::Api::Models::Internal::RepositorySettings']]], + ['available',['Available',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.html#a7fede11791f3ad6ab39f29cb5ce0075c',1,'Tgstation.Server.Host.IO.Console.Available()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console.html#ab35fa75560527910780645de7dc54ca8',1,'Tgstation.Server.Host.IO.IConsole.Available()']]] +]; diff --git a/search/all_10.html b/search/all_10.html new file mode 100644 index 0000000000..170dc09c6a --- /dev/null +++ b/search/all_10.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_10.js b/search/all_10.js new file mode 100644 index 0000000000..0b2f22a1fe --- /dev/null +++ b/search/all_10.js @@ -0,0 +1,65 @@ +var searchData= +[ + ['parameters',['Parameters',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_command.html#afd33185ed1438ff8f87a1f6729d22210',1,'Tgstation.Server.Host.Components.Interop.CommCommand.Parameters()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_event_notification.html#a43fed96d3312ca1537a6294213396046',1,'Tgstation.Server.Host.Components.Interop.EventNotification.Parameters()']]], + ['params',['Params',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_command.html#adb1c285b5df8ea67d08ccadb7593f959',1,'Tgstation::Server::Host::Components::Interop::ChatCommand']]], + ['password',['Password',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#af420ae2e12b49c480947cc3068f033e6',1,'Tgstation.Server.Api.ApiHeaders.Password()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#a5dc7c8fe9762a68b49b6707498130a8b',1,'Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Password()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user_update.html#a6b66974e72005bfe586a72e8d24940cd',1,'Tgstation.Server.Api.Models.UserUpdate.Password()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a0af57fc7dec5c5f69ae6ba15756031a7',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.password()']]], + ['passwordauthenticationscheme',['PasswordAuthenticationScheme',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#ab5d031ce8e7fba2e1575dde74ba9647a',1,'Tgstation::Server::Api::ApiHeaders']]], + ['passwordhash',['PasswordHash',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#ab5648b7f95630ff37ad8b0ddd72c1f54',1,'Tgstation::Server::Host::Models::User']]], + ['passwordhasher',['passwordHasher',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html#ad519d6aa46f39a52f9a7b50e0f181fd9',1,'Tgstation::Server::Host::Security::CryptographySuite']]], + ['passwordtype',['PasswordType',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#a7291f32770eaa19de8067a41a1f15509',1,'Tgstation.Server.Api.Models.IrcConnectionStringBuilder.PasswordType()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a6d496510a7558d62c26d917a51226264',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.passwordType()']]], + ['patch_3c_20tresult_20_3e',['Patch< TResult >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a2c706947515724ff353a3b1422815ff8',1,'Tgstation.Server.Client.ApiClient.Patch< TResult >()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a28294924cb1336289469fbfa5de2f61f',1,'Tgstation.Server.Client.IApiClient.Patch< TResult >()']]], + ['path',['Path',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html#aefbf190e4363fe3095963d1d40a36fd1',1,'Tgstation.Server.Api.Models.ConfigurationFile.Path()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html#ae390e04ad03e5f6daaefcfa96ed9a6d2',1,'Tgstation.Server.Api.Models.Instance.Path()']]], + ['pathcontainsparentaccess',['PathContainsParentAccess',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#aa2dfcb05f73420f251547ae0108b3222',1,'Tgstation.Server.Host.IO.DefaultIOManager.PathContainsParentAccess()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#af05931d02f5f5d95b87a56c0cc60d855',1,'Tgstation.Server.Host.IO.IIOManager.PathContainsParentAccess()']]], + ['platformidentifier',['PlatformIdentifier',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_platform_identifier.html',1,'Tgstation.Server.Host.Core.PlatformIdentifier'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a3c8f7e67bf286c73dd25994db7ed31a5',1,'Tgstation.Server.Host.Components.InstanceFactory.platformIdentifier()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a9103478c93c69deb31f3549ab04dcc84',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.platformIdentifier()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#a3aa705877f0afe4663cd60c18f790c39',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.platformIdentifier()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#aab5c882433d208418174394df71cfab4',1,'Tgstation.Server.Host.Controllers.AdministrationController.platformIdentifier()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#ac62c0b1b0e346409b20c3054d4a8354a',1,'Tgstation.Server.Host.Controllers.InstanceController.platformIdentifier()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a44d43e1c3e25f89c2e5e50367ee7b00a',1,'Tgstation.Server.Host.Core.SetupWizard.platformIdentifier()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_platform_identifier.html#a5fc0677e82945f0ecd679f95d89e21a7',1,'Tgstation.Server.Host.Core.PlatformIdentifier.PlatformIdentifier()']]], + ['platformidentifier_2ecs',['PlatformIdentifier.cs',['../_platform_identifier_8cs.html',1,'']]], + ['populateapi',['PopulateApi',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#a169541f29e0361eaba0bf8ba85624f10',1,'Tgstation::Server::Host::Controllers::RepositoryController']]], + ['port',['Port',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#a099e5c3fd62567ff0be2526a94943822',1,'Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Port()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a288cb8d3a65cb19797718371c8a488ed',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Port()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#ab21dfb05ca356124194ae5c22b4a778b',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.Port()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a1caf618f26dc4f91986252b92b2b5fd5',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.Port()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html#afcf987dfdf8f483388bfd832582c6a8b',1,'Tgstation.Server.Host.Models.ReattachInformationBase.Port()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a0a16e9a0617d8e75740478a5d68a4420',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.port()']]], + ['portassignmenttcs',['portAssignmentTcs',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a7a37884acc006ceafba6cb4e8b7711a2',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['portclosedforreboot',['portClosedForReboot',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#af0c3b4329beff8ac1d48abad08567378',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['posixbyondinstaller',['PosixByondInstaller',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#a50d25ab6f657fb56ceb74831d6656c60',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.PosixByondInstaller()']]], + ['posixbyondinstaller_2ecs',['PosixByondInstaller.cs',['../_posix_byond_installer_8cs.html',1,'']]], + ['posixnetworkpromptreaper',['PosixNetworkPromptReaper',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_posix_network_prompt_reaper.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['posixnetworkpromptreaper_2ecs',['PosixNetworkPromptReaper.cs',['../_posix_network_prompt_reaper_8cs.html',1,'']]], + ['posixpostwritehandler',['PosixPostWriteHandler',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_post_write_handler.html',1,'Tgstation::Server::Host::IO']]], + ['posixpostwritehandler_2ecs',['PosixPostWriteHandler.cs',['../_posix_post_write_handler_8cs.html',1,'']]], + ['posixsymlinkfactory',['PosixSymlinkFactory',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_symlink_factory.html',1,'Tgstation::Server::Host::IO']]], + ['posixsymlinkfactory_2ecs',['PosixSymlinkFactory.cs',['../_posix_symlink_factory_8cs.html',1,'']]], + ['posixsystemidentityfactory',['PosixSystemIdentityFactory',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_posix_system_identity_factory.html',1,'Tgstation::Server::Host::Security']]], + ['posixsystemidentityfactory_2ecs',['PosixSystemIdentityFactory.cs',['../_posix_system_identity_factory_8cs.html',1,'']]], + ['postcomplete',['PostComplete',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html#ab2680675a7b2124d03a899f45a09e08e',1,'Tgstation::Server::Host::Models::Job']]], + ['posttestmergecomment',['PostTestMergeComment',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#acdaf4f19af7d330bcbf35c3cb240b50c',1,'Tgstation::Server::Api::Models::Internal::RepositorySettings']]], + ['postwritehandler',['postWriteHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#abaa57b4cd2fdf1ea15b08b81ccd88023',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.postWriteHandler()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#aca83a69059579020791c6d62721c08fd',1,'Tgstation.Server.Host.Components.InstanceFactory.postWriteHandler()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a9070bfae5692e48611c410eeef52c7af',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.postWriteHandler()']]], + ['pressanykeyasync',['PressAnyKeyAsync',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.html#ad10bdc2971cb4068b3fe0d46aa7cb167',1,'Tgstation.Server.Host.IO.Console.PressAnyKeyAsync()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console.html#ad674c458bbe343698fb0da3494bf3e37',1,'Tgstation.Server.Host.IO.IConsole.PressAnyKeyAsync()']]], + ['primarydirectory',['PrimaryDirectory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#a2a2e015f0196f86632485bd3dd94bd4e',1,'Tgstation.Server.Host.Components.Compiler.DmbProvider.PrimaryDirectory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html#a0bc97032ff316e913dd373e68a2232c2',1,'Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.PrimaryDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.html#aa3e399fe1533b15a2e0814b3634037bc',1,'Tgstation.Server.Host.Components.IDmbProvider.PrimaryDirectory()']]], + ['primaryport',['PrimaryPort',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.html#affe09fcc79cb191dece8adfb642d8cc0',1,'Tgstation::Server::Api::Models::Internal::DreamDaemonLaunchParameters']]], + ['primaryrevisioninformation',['PrimaryRevisionInformation',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html#a4fb69a83c0ff12c00dc7db7905003709',1,'Tgstation::Server::Host::Models::TestMerge']]], + ['primaryrevisioninformationid',['PrimaryRevisionInformationId',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html#a1f5f380223b363e413f2f8b9ba29a4b2',1,'Tgstation::Server::Host::Models::TestMerge']]], + ['primarytestmerge',['PrimaryTestMerge',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information.html#a628bb81ae3a0621e5e3ad472d0dab742',1,'Tgstation.Server.Api.Models.RevisionInformation.PrimaryTestMerge()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html#adbe03f25ff741698ab92816bf7b511c5',1,'Tgstation.Server.Host.Models.RevisionInformation.PrimaryTestMerge()']]], + ['process',['Process',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html',1,'Tgstation.Server.Host.Core.Process'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#ad5dd4ef0f1bda6f26c3fe9a93223204f',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.process()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a622737e9c97152cfe56a81f2721dca04',1,'Tgstation.Server.Host.Core.Process.Process()']]], + ['process_2ecs',['Process.cs',['../_process_8cs.html',1,'']]], + ['processexecutor',['ProcessExecutor',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html',1,'Tgstation.Server.Host.Core.ProcessExecutor'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a9ddafa8d405709ae20f157c9041b4b01',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.processExecutor()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#ad98d6b773ab4ecc0f65b308c707fc4c2',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.processExecutor()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a5fdcd121985cce7d20f2d61e0ea5eca4',1,'Tgstation.Server.Host.Components.InstanceFactory.processExecutor()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a0eb31611253abc0c887ec46f1e9b8611',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.processExecutor()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#aba8d97c1aedc6bedb85b47b68d652677',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.processExecutor()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html#ade5e5044a7817d2b606e058d0707faf7',1,'Tgstation.Server.Host.Core.ProcessExecutor.ProcessExecutor()']]], + ['processexecutor_2ecs',['ProcessExecutor.cs',['../_process_executor_8cs.html',1,'']]], + ['processid',['ProcessId',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html#aef75179a5df95282951af5c85997578f',1,'Tgstation.Server.Host.Models.DreamDaemonSettings.ProcessId()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html#a6f8d698913ca0c40775eaa9a1ec8a787',1,'Tgstation.Server.Host.Models.ReattachInformationBase.ProcessId()']]], + ['processmessage',['ProcessMessage',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a57210321fe78dea227d4aa8c9764ba9a',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['productheadervalue',['productHeaderValue',['../class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.html#a5db19a315f04b37200db2761f678661b',1,'Tgstation.Server.Client.ServerClientFactory.productHeaderValue()'],['../class_tgstation_1_1_server_1_1_api_1_1_tests_1_1_test_api_headers.html#a380531ccea4ef4d6191490bc6d513ee0',1,'Tgstation.Server.Api.Tests.TestApiHeaders.productHeaderValue()']]], + ['program',['Program',['../class_tgstation_1_1_server_1_1_host_1_1_console_1_1_program.html',1,'Tgstation.Server.Host.Console.Program'],['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html',1,'Tgstation.Server.Host.Service.Program'],['../class_tgstation_1_1_server_1_1_host_1_1_program.html',1,'Tgstation.Server.Host.Program'],['../class_release_notes_1_1_program.html',1,'ReleaseNotes.Program']]], + ['program_2ecs',['Program.cs',['../src_2_tgstation_8_server_8_host_2_program_8cs.html',1,'(Global Namespace)'],['../src_2_tgstation_8_server_8_host_8_console_2_program_8cs.html',1,'(Global Namespace)'],['../src_2_tgstation_8_server_8_host_8_service_2_program_8cs.html',1,'(Global Namespace)'],['../tools_2_release_notes_2_program_8cs.html',1,'(Global Namespace)']]], + ['progress',['Progress',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job.html#a2c9ae1e6331880d2f0f198c16f574e4f',1,'Tgstation.Server.Api.Models.Job.Progress()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html#ac8d74f805cd5f8d259aa37f189d133cc',1,'Tgstation.Server.Host.Core.JobHandler.Progress()']]], + ['progresstask',['ProgressTask',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a64bc3c5708758312281bbcd8a6b54149',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['projectname',['ProjectName',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker.html#ad36bc7e479eaaaeeee6b5d0164296cf0',1,'Tgstation::Server::Api::Models::DreamMaker']]], + ['promptforhostingport',['PromptForHostingPort',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a8768c71828396ea36792de7e1e0d68b0',1,'Tgstation::Server::Host::Core::SetupWizard']]], + ['promptyesno',['PromptYesNo',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a439d28e66cccf8b111c37f7c67135dc3',1,'Tgstation::Server::Host::Core::SetupWizard']]], + ['propagatedexception',['propagatedException',['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a6541983f401f2c25c474573a2d28235c',1,'Tgstation::Server::Host::Server']]], + ['provider',['Provider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html',1,'Tgstation.Server.Host.Components.Chat.Providers.Provider'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html#aa1c996d380be8d91b5042b6e1286b443',1,'Tgstation.Server.Api.Models.Internal.ChatBot.Provider()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#a5e04da11d3a242b4d32ad95c4cf2bb75',1,'Tgstation.Server.Host.Components.Chat.Providers.Provider.Provider()']]], + ['provider_2ecs',['Provider.cs',['../_provider_8cs.html',1,'']]], + ['providerchannelid',['ProviderChannelId',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping.html#af9b20c51cf6dad7a37b048111026abcf',1,'Tgstation::Server::Host::Components::Chat::ChannelMapping']]], + ['providerfactory',['ProviderFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html',1,'Tgstation.Server.Host.Components.Chat.ProviderFactory'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html#aa29104de105fbc85b60b43d6f6a6fa85',1,'Tgstation.Server.Host.Components.Chat.ProviderFactory.ProviderFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ab0fc5acc521bee160dffaf45bdb9afe5',1,'Tgstation.Server.Host.Components.Chat.Chat.providerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html#a524251049a9a7f960681e4f1e6c68b97',1,'Tgstation.Server.Host.Components.Chat.ChatFactory.providerFactory()']]], + ['providerfactory_2ecs',['ProviderFactory.cs',['../_provider_factory_8cs.html',1,'']]], + ['providerid',['ProviderId',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping.html#a647f007fe6e42d97d736747f6069c584',1,'Tgstation::Server::Host::Components::Chat::ChannelMapping']]], + ['providers',['providers',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a01b888e7f83c86acb162c6107c662876',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['pullrequestrevision',['PullRequestRevision',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters.html#adbe0060eb8405c4d27f40031913c5bf0',1,'Tgstation::Server::Api::Models::TestMergeParameters']]], + ['pullrequestscommand',['PullRequestsCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#a96ba3e78b38424740cda93576b897bf6',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.PullRequestsCommand()']]], + ['pullrequestscommand_2ecs',['PullRequestsCommand.cs',['../_pull_requests_command_8cs.html',1,'']]], + ['pushheadtotemporarybranch',['PushHeadToTemporaryBranch',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a96553d378f9b7d9cfc4eb169f12bdba7',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['pushtestmergecommits',['PushTestMergeCommits',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#a80ce424c357f9823d79245f509403807',1,'Tgstation::Server::Api::Models::Internal::RepositorySettings']]] +]; diff --git a/search/all_11.html b/search/all_11.html new file mode 100644 index 0000000000..10fcd0919c --- /dev/null +++ b/search/all_11.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_11.js b/search/all_11.js new file mode 100644 index 0000000000..478829c200 --- /dev/null +++ b/search/all_11.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['querychannelidmap',['queryChannelIdMap',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#aa1d881a293f002c54c639ed5ed6f251d',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]] +]; diff --git a/search/all_12.html b/search/all_12.html new file mode 100644 index 0000000000..0876adf455 --- /dev/null +++ b/search/all_12.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_12.js b/search/all_12.js new file mode 100644 index 0000000000..6b62e23520 --- /dev/null +++ b/search/all_12.js @@ -0,0 +1,132 @@ +var searchData= +[ + ['ratelimit',['RateLimit',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#ae04b510fcc8e0f4cc9e380b3995e2f21',1,'Tgstation::Server::Host::Controllers::AdministrationController']]], + ['ratelimitexception',['RateLimitException',['../class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception.html',1,'Tgstation.Server.Client.RateLimitException'],['../class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception.html#a1bd82db7496764293896d95a761a5b1c',1,'Tgstation.Server.Client.RateLimitException.RateLimitException()'],['../class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception.html#a9dc7a4a7250ba2b88698bdb27d208392',1,'Tgstation.Server.Client.RateLimitException.RateLimitException(string secondsString)'],['../class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception.html#ab30825486f294c98083fb35043f5da0a',1,'Tgstation.Server.Client.RateLimitException.RateLimitException(string message, Exception innerException)']]], + ['ratelimitexception_2ecs',['RateLimitException.cs',['../_rate_limit_exception_8cs.html',1,'']]], + ['rawcheckout',['RawCheckout',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#ace81561f45095dabdd6969b281a2be08',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['rawjson',['RawJson',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_command.html#a2a36d966a4d7a2b7c045d4da6bc84ec9',1,'Tgstation::Server::Host::Components::Interop::CommCommand']]], + ['rawuseragent',['RawUserAgent',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a8e9f868cdb40bcbfb9fb5b8cdee7a5a3',1,'Tgstation::Server::Api::ApiHeaders']]], + ['read',['Read',['../class_tgstation_1_1_server_1_1_client_1_1_administration_client.html#a90fccaf2e24a3793a1c3892365415d63',1,'Tgstation.Server.Client.AdministrationClient.Read()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#adb77f8fd7a46572e3c1d6bd90e3e300c',1,'Tgstation.Server.Client.Components.ConfigurationClient.Read()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#afcc1957f652e164e4f2e9e05ca84bc9d',1,'Tgstation.Server.Client.Components.DreamDaemonClient.Read()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#aa2f286f3f548960f2f9f88f17eb31538',1,'Tgstation.Server.Client.Components.DreamMakerClient.Read()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.html#a8f860a7b9851f7bcffa232fcf82eb109',1,'Tgstation.Server.Client.Components.IConfigurationClient.Read()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html#a1e6a43558dcadc261304053b63476323',1,'Tgstation.Server.Client.Components.IDreamDaemonClient.Read()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html#ac0b3a15957db0648ca8425469e1983b0',1,'Tgstation.Server.Client.Components.IDreamMakerClient.Read()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html#aae3394792a75d2690ff8038cb4e8007f',1,'Tgstation.Server.Client.Components.IInstanceUserClient.Read()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#ad1b39d718a1f3e635cf7ff8e24499d66',1,'Tgstation.Server.Client.Components.InstanceUserClient.Read()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.html#a5ec2d45a88691381a86f02d6a941f912',1,'Tgstation.Server.Client.Components.IRepositoryClient.Read()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#a37e9b08107bacf7d431b64ef3051fdc3',1,'Tgstation.Server.Client.Components.RepositoryClient.Read()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client.html#a2e63dc96c5b580f348e76f014924c85f',1,'Tgstation.Server.Client.IAdministrationClient.Read()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.html#adfc947bf76c50385d043a46732cb1f75',1,'Tgstation.Server.Client.IUsersClient.Read()'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#a7b9ce7489b2a8b3e7c8453580cfe95ff',1,'Tgstation.Server.Client.UsersClient.Read()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#ad62e7c4dde34d7c7d1039bcbf03c5b72',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.Read()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.html#a32086334958bd9009ec8eda200b9a200',1,'Tgstation.Server.Host.Components.StaticFiles.IConfiguration.Read()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#a4d85bad203f0c08f4c8ff09dd783248b',1,'Tgstation.Server.Host.Controllers.AdministrationController.Read()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html#a952241db5593e5fdfe0f8c97122e097f',1,'Tgstation.Server.Host.Controllers.ByondController.Read()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#aea734bbb3778fcaeefa46f3fde7d710b',1,'Tgstation.Server.Host.Controllers.DreamDaemonController.Read()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html#a304cbb23b5628962a7436db2cda0650a',1,'Tgstation.Server.Host.Controllers.DreamMakerController.Read()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html#a756ea65062cf457109384d7ffdac05b6',1,'Tgstation.Server.Host.Controllers.InstanceUserController.Read()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html#ac22a786b37cadeadfee8b49c9f5dfb3c',1,'Tgstation.Server.Host.Controllers.JobController.Read()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html#a653aa0edb4111fe7c8e1aa6eb88f6f7d',1,'Tgstation.Server.Host.Controllers.ModelController.Read()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#ac3004cbeb4a0154b9f563a71d6c5f554',1,'Tgstation.Server.Host.Controllers.RepositoryController.Read()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#a1eacebe83e43999c75bc26be5551f6c9',1,'Tgstation.Server.Host.Controllers.UserController.Read()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72a7a1a5f3e79fdc91edf2f5ead9d66abb4',1,'Tgstation.Server.Api.Rights.Read()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a691a59767073bc7dff0f17b809d07b0ca7a1a5f3e79fdc91edf2f5ead9d66abb4',1,'Tgstation.Server.Api.Rights.Read()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5da7a1a5f3e79fdc91edf2f5ead9d66abb4',1,'Tgstation.Server.Api.Rights.Read()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79a7a1a5f3e79fdc91edf2f5ead9d66abb4',1,'Tgstation.Server.Api.Rights.Read()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39a7a1a5f3e79fdc91edf2f5ead9d66abb4',1,'Tgstation.Server.Api.Rights.Read()']]], + ['read_3c_20tresult_20_3e',['Read< TResult >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a1808561c1ec1ddac56ee78648788214c',1,'Tgstation.Server.Client.ApiClient.Read< TResult >(string route, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a90dffec712d3fea1328dd2b8cb4ce5b7',1,'Tgstation.Server.Client.ApiClient.Read< TResult >(string route, long instanceId, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#ae8bd028857ed8443176c7ac25edd18bd',1,'Tgstation.Server.Client.IApiClient.Read< TResult >(string route, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a95d05b8d2e00d2da463ec7d7e6e4e2ae',1,'Tgstation.Server.Client.IApiClient.Read< TResult >(string route, long instanceId, CancellationToken cancellationToken)']]], + ['readactive',['ReadActive',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a2a217a19e652f117e2324fb79ed838b9a3326023a4750bdbe33075fdad47d2a8d',1,'Tgstation::Server::Api::Rights']]], + ['readallbytes',['ReadAllBytes',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a8b156fb1670e0f2f74bccdf040d2661c',1,'Tgstation.Server.Host.IO.DefaultIOManager.ReadAllBytes()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a6c0856abd25ea8e2096702aae37f2b0c',1,'Tgstation.Server.Host.IO.IIOManager.ReadAllBytes()']]], + ['readconnectionstring',['ReadConnectionString',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72a1696551e4b826946427650d66b0a0c18',1,'Tgstation::Server::Api::Rights']]], + ['readfile',['ReadFile',['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.html#a19577dc573076fd58ac1d55d682d5606',1,'Tgstation.Server.Host.IO.ISynchronousIOManager.ReadFile()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.html#ae7fb6512f77a65454cf2309a1c4eccdf',1,'Tgstation.Server.Host.IO.SynchronousIOManager.ReadFile()']]], + ['readimpl',['ReadImpl',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#a833396fc76a932247c5e86e4887fd197',1,'Tgstation::Server::Host::Controllers::DreamDaemonController']]], + ['readjson',['ReadJson',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_bool_converter.html#af0c58117243eef427efccaaa308c8b02',1,'Tgstation::Server::Host::Components::Chat::Commands::BoolConverter']]], + ['readlineasync',['ReadLineAsync',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.html#ad64d553f84d31d737bd00595fe6a122f',1,'Tgstation.Server.Host.IO.Console.ReadLineAsync()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console.html#a5bdc0f5d449d520355dccb0f01cc0694',1,'Tgstation.Server.Host.IO.IConsole.ReadLineAsync()']]], + ['readme_2emd',['README.md',['../_r_e_a_d_m_e_8md.html',1,'(Global Namespace)'],['../tools_2_release_notes_2_r_e_a_d_m_e_8md.html',1,'(Global Namespace)']]], + ['readmetadata',['ReadMetadata',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49a6ac3e4ef171de3175ef0763a390eea05',1,'Tgstation::Server::Api::Rights']]], + ['readrevision',['ReadRevision',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49ae49f7f612746455ed28b92600f4d973c',1,'Tgstation::Server::Api::Rights']]], + ['readusers',['ReadUsers',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#affda1440f9c5e2dfcca65138d2f89a21a1a27a371ba5487ede2e91059df7cab27',1,'Tgstation.Server.Api.Rights.ReadUsers()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a5f1b5a9225190982810802d7a85bb601a1a27a371ba5487ede2e91059df7cab27',1,'Tgstation.Server.Api.Rights.ReadUsers()']]], + ['ready',['Ready',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#a6f74ea1c4857a9ee311133077e75cbd8',1,'Tgstation.Server.Host.Core.Application.Ready()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_application.html#a45d03e6ca2a677f358c52bc8b4fe1dca',1,'Tgstation.Server.Host.Core.IApplication.Ready()']]], + ['realid',['RealId',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html#a4008cb7e685a82e590a10f673ed23fd3',1,'Tgstation.Server.Host.Components.Chat.Channel.RealId()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user.html#ac4a6e8d71a8d3e48057c40df6e798db4',1,'Tgstation.Server.Host.Components.Chat.User.RealId()']]], + ['realserver',['realServer',['../class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html#a292747ef36a9f260dbe9b62591e2c93d',1,'Tgstation::Server::Tests::TestingServer']]], + ['reattach',['Reattach',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller_factory.html#ac777b68fbfe9c7f37eb054cb1bbe3f42',1,'Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory.Reattach()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#afc88772088200c0924fdfb2373a5a6c8',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.Reattach()']]], + ['reattachinfohandler',['ReattachInfoHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html',1,'Tgstation.Server.Host.Components.ReattachInfoHandler'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a72ff0b6fb336a2d931cf64d795d8a542',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.reattachInfoHandler()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html#a8f936ffcb62ef8c77edba65bf4cfd674',1,'Tgstation.Server.Host.Components.ReattachInfoHandler.ReattachInfoHandler()']]], + ['reattachinfohandler_2ecs',['ReattachInfoHandler.cs',['../_reattach_info_handler_8cs.html',1,'']]], + ['reattachinformation',['ReattachInformation',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information.html',1,'Tgstation.Server.Host.Models.ReattachInformation'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_reattach_information.html',1,'Tgstation.Server.Host.Components.Watchdog.ReattachInformation'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_reattach_information.html#a644624c553fc70200479f14a8baf8b2f',1,'Tgstation.Server.Host.Components.Watchdog.ReattachInformation.ReattachInformation()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_reattach_information.html#a1ed22cba2a3f2732e762802ca4e14e40',1,'Tgstation.Server.Host.Components.Watchdog.ReattachInformation.ReattachInformation(Models.ReattachInformation copy, IDmbProvider dmb)'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a017d1f82539ec09794f736e9ae04e7fd',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.reattachInformation()']]], + ['reattachinformation_2ecs',['ReattachInformation.cs',['../_components_2_watchdog_2_reattach_information_8cs.html',1,'(Global Namespace)'],['../_models_2_reattach_information_8cs.html',1,'(Global Namespace)']]], + ['reattachinformationbase',['ReattachInformationBase',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html',1,'Tgstation.Server.Host.Models.ReattachInformationBase'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html#a662295d2f9dd1746560777809a91eec0',1,'Tgstation.Server.Host.Models.ReattachInformationBase.ReattachInformationBase()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html#adbb46135d2724b48f149ded000511f49',1,'Tgstation.Server.Host.Models.ReattachInformationBase.ReattachInformationBase(ReattachInformationBase copy)']]], + ['reattachinformationbase_2ecs',['ReattachInformationBase.cs',['../_reattach_information_base_8cs.html',1,'']]], + ['reattachinformations',['ReattachInformations',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a7a1cdc4c717337334e3b4dfd51bbd1c8',1,'Tgstation.Server.Host.Models.DatabaseContext.ReattachInformations()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#afee6cf458d92a060f160cbd821a8c1f4',1,'Tgstation.Server.Host.Models.IDatabaseContext.ReattachInformations()']]], + ['rebootinginactiveserver',['RebootingInactiveServer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_monitor_state.html#a37727fb1a18d568d3b85da43088b1ab7',1,'Tgstation::Server::Host::Components::Watchdog::MonitorState']]], + ['rebootstate',['RebootState',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#a9e53440db7666ec16e93e62b19f376d3',1,'Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.RebootState()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a97f00f4296f371039beff6e167b4ff03',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.RebootState()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#a44e42b999b353da3ff1f5899a77ee12c',1,'Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.RebootState()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#af12460cd54ebce65ecf71fb8dad516c4',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.RebootState()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#a0145fd1816a703bcb80fd8e107034f4c',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.RebootState()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#af219e5439d3128b574f162780bc7720b',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.RebootState()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a5bc3f8e6c5569555d358578e612a1920',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.RebootState()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html#aec874c3505b96efeeaf100ce4b7e6eea',1,'Tgstation.Server.Host.Models.ReattachInformationBase.RebootState()'],['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a3b33ca95a6257e0c719adc7b54444ab8',1,'Tgstation.Server.Host.Components.Watchdog.RebootState()']]], + ['rebootstate_2ecs',['RebootState.cs',['../_reboot_state_8cs.html',1,'']]], + ['reboottcs',['rebootTcs',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a92ab8344fdb23d7b4db96f4595ae8054',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['recheckdelayms',['RecheckDelayMs',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#ae04f9adb517fe75c7cf4ea67a67d9c20',1,'Tgstation::Server::Host::Components::Watchdog::WindowsNetworkPromptReaper']]], + ['reference',['Reference',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html#a7409d655bc6993e0eb1d75743160a3b2',1,'Tgstation.Server.Api.Models.Repository.Reference()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#a36f1520633eca12a57b6ed52c60c5257',1,'Tgstation.Server.Host.Components.Repository.IRepository.Reference()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a019e9f75f0129457c1f6f2e44e9736d0',1,'Tgstation.Server.Host.Components.Repository.Repository.Reference()']]], + ['registercommandhandler',['RegisterCommandHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a679bc4e2665f6b95094a15ea006e5f23',1,'Tgstation.Server.Host.Components.Chat.Chat.RegisterCommandHandler()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html#a97c581c9838e82dd45f0f79f7b9b3ee9',1,'Tgstation.Server.Host.Components.Chat.IChat.RegisterCommandHandler()']]], + ['registeredprocesses',['registeredProcesses',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#ae5f1894d3067dde466021e2725886b8a',1,'Tgstation::Server::Host::Components::Watchdog::WindowsNetworkPromptReaper']]], + ['registerforrestart',['RegisterForRestart',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control.html#a35728d66030addfd5551351b8c6db942',1,'Tgstation.Server.Host.Core.IServerControl.RegisterForRestart()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a0664caef3896a16c9f668177c68002d3',1,'Tgstation.Server.Host.Server.RegisterForRestart()']]], + ['registerhandler',['RegisterHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#a5df02d9741c6b3b99d9d47be05c04faa',1,'Tgstation.Server.Host.Components.Interop.CommContext.RegisterHandler()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_context.html#a7f947ca9fe0193e1e6e66eaa31c81a93',1,'Tgstation.Server.Host.Components.Interop.ICommContext.RegisterHandler()']]], + ['registeroperation',['RegisterOperation',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager.html#a9148664a7a0e80dc4c354e5135329ded',1,'Tgstation.Server.Host.Core.IJobManager.RegisterOperation()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a921f3dc614772f50917a0171fcfd657f',1,'Tgstation.Server.Host.Core.JobManager.RegisterOperation()']]], + ['registerprocess',['RegisterProcess',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_network_prompt_reaper.html#a921378833260f01b071581f60c202286',1,'Tgstation.Server.Host.Components.Watchdog.INetworkPromptReaper.RegisterProcess()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_posix_network_prompt_reaper.html#ac45ef1ebf4ef583fa800c83f0d36ff52',1,'Tgstation.Server.Host.Components.Watchdog.PosixNetworkPromptReaper.RegisterProcess()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#a2672a5fe3947a90b600684f57291d19d',1,'Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.RegisterProcess()']]], + ['release',['Release',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a1c7d96b5137c4bcf94803b4807e2c062',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Release()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#a2f2c370c1bbc4e6378dbfe98f18353d3',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.Release()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a275f0854e7df3126d0d3a3fe390b1a13',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.Release()']]], + ['released',['released',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#aa59a34a24d122357d081403d95a76e78',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['releasenotes',['ReleaseNotes',['../namespace_release_notes.html',1,'']]], + ['releasenotes_2eassemblyinfo_2ecs',['ReleaseNotes.AssemblyInfo.cs',['../_release_notes_8_assembly_info_8cs.html',1,'']]], + ['releaseservers',['releaseServers',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a256c7fd5a04870388411185b46ff6fb8',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['relocate',['Relocate',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79aa8642eb657c3ab24f0a52b2ef8115d3f',1,'Tgstation::Server::Api::Rights']]], + ['remotetemporarybranchname',['RemoteTemporaryBranchName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a4ad624c2294a1cc28f47d251ed3a17f8',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['removeprovider',['RemoveProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a42d935d351ce13a9b966c1120d06de8e',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['rename',['Rename',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html#abb631d02974c1e646993ca97d4a2aec4',1,'Tgstation.Server.Host.Components.IInstance.Rename()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a7e74907bfa7882ef479670e2f7102a3f',1,'Tgstation.Server.Host.Components.Instance.Rename()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79a904a8304056d77e4547744781b7ceb50',1,'Tgstation.Server.Api.Rights.Rename()']]], + ['repocheckout',['RepoCheckout',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381ab0586bbc30b26132d29bbc4a69bd0da2',1,'Tgstation::Server::Host::Components']]], + ['repofetch',['RepoFetch',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381ab482b626f1064d696e63b2c62430cdf8',1,'Tgstation::Server::Host::Components']]], + ['repomergeconflict',['RepoMergeConflict',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381a7f72fdbb58d503c2a30b23a72cd1134c',1,'Tgstation::Server::Host::Components']]], + ['repomergepullrequest',['RepoMergePullRequest',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381afc010e2f845e7e0e6b7507a47c17363b',1,'Tgstation::Server::Host::Components']]], + ['repopresynchronize',['RepoPreSynchronize',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381a28b74db9a0a4619b28a21c0573fbc0d8',1,'Tgstation::Server::Host::Components']]], + ['reporesetorigin',['RepoResetOrigin',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381a2d081595fabf6ba0facdc9d1fb7921e6',1,'Tgstation::Server::Host::Components']]], + ['repository',['Repository',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html',1,'Tgstation.Server.Api.Models.Repository'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html',1,'Tgstation.Server.Host.Components.Repository.Repository'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a738817663facf9293a084ab4c5a155ef',1,'Tgstation.Server.Api.Routes.Repository()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#adf8d664f59d973f69aa15c22fba93735',1,'Tgstation.Server.Client.Components.IInstanceClient.Repository()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a507ef7665b72f494e56b997e19835367',1,'Tgstation.Server.Client.Components.InstanceClient.Repository()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#a1c314570d2e4f3c0a6dfb7e8aa6c68a0',1,'Tgstation.Server.Client.Components.RepositoryClient.Repository(Routes.Repository, repository, instance.Id, cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#aa68b503106bfa0f9558c08cc8d79ec1d',1,'Tgstation.Server.Client.Components.RepositoryClient.Repository(Routes.Repository, repository ?? throw new ArgumentNullException(nameof(repository)), instance.Id, cancellationToken)'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#ad21b7cd54ab824159e7828aea9598fe3',1,'Tgstation.Server.Host.Components.Repository.Repository.Repository(LibGit2Sharp.IRepository repository, IIOManager ioMananger, IEventConsumer eventConsumer, ICredentialsProvider credentialsProvider, ILogger< Repository > logger, Action onDispose)'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a46c9b5f872d0225fd0c8f6364ccf3489',1,'Tgstation.Server.Host.Components.Repository.Repository.repository()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20a33fcf2b3ec4686d9cd06051c726d0ba2',1,'Tgstation.Server.Api.Rights.Repository()']]], + ['repository_2ecs',['Repository.cs',['../_tgstation_8_server_8_api_2_models_2_repository_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_components_2_repository_2_repository_8cs.html',1,'(Global Namespace)']]], + ['repositoryclient',['RepositoryClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html',1,'Tgstation.Server.Client.Components.RepositoryClient'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#aa7ff208124be2377aa50b40f63aad06c',1,'Tgstation.Server.Client.Components.RepositoryClient.RepositoryClient()']]], + ['repositoryclient_2ecs',['RepositoryClient.cs',['../_repository_client_8cs.html',1,'']]], + ['repositorycontroller',['RepositoryController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html',1,'Tgstation.Server.Host.Controllers.RepositoryController'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#ac88456f7aa7bbb54f37c6a468c102bed',1,'Tgstation.Server.Host.Controllers.RepositoryController.RepositoryController()']]], + ['repositorycontroller_2ecs',['RepositoryController.cs',['../_repository_controller_8cs.html',1,'']]], + ['repositorylogger',['repositoryLogger',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#a215c5b936673287ad252f01b1b87f9bf',1,'Tgstation::Server::Host::Components::Repository::RepositoryManager']]], + ['repositorymanager',['RepositoryManager',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html#a95e8444e36fb2dde06d9d9f8159d423b',1,'Tgstation.Server.Host.Components.IInstance.RepositoryManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a0ba6b6f63f50a267051c77c15e6c6fcf',1,'Tgstation.Server.Host.Components.Instance.RepositoryManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#a6ce9d92eaf8266ad98a31ee6adbc5c34',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.RepositoryManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#ac6eb0ebb09860c076b09529a92963592',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.repositoryManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#af5857133d7544a45ce4b4e75210830b2',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.repositoryManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html#acdac2dc61b95355e78f8a1b008b7f7b4',1,'Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.repositoryManager()']]], + ['repositorymanager_2ecs',['RepositoryManager.cs',['../_repository_manager_8cs.html',1,'']]], + ['repositoryrights',['RepositoryRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html#a369d2b654bf3c91d4d78e3c758a27757',1,'Tgstation.Server.Api.Models.InstanceUser.RepositoryRights()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39',1,'Tgstation.Server.Api.Rights.RepositoryRights()']]], + ['repositoryrights_2ecs',['RepositoryRights.cs',['../_repository_rights_8cs.html',1,'']]], + ['repositorysettings',['RepositorySettings',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html',1,'Tgstation.Server.Host.Models.RepositorySettings'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html',1,'Tgstation.Server.Api.Models.Internal.RepositorySettings'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#ab33fc190fb7655d0ed75fc400e260d2e',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.repositorySettings()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a4e7be9a13ff81eb52196f1a35172263b',1,'Tgstation.Server.Host.Models.DatabaseContext.RepositorySettings()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#a57e8c3c7a2f1a7f3d34208ab49390096',1,'Tgstation.Server.Host.Models.IDatabaseContext.RepositorySettings()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a389d4c0693f617133a4a8db430c65ab4',1,'Tgstation.Server.Host.Models.Instance.RepositorySettings()']]], + ['repositorysettings_2ecs',['RepositorySettings.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_repository_settings_8cs.html',1,'(Global Namespace)']]], + ['requestloggers',['requestLoggers',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a8c0c69d8203c1af593869613dfb1f8cc',1,'Tgstation::Server::Client::ApiClient']]], + ['requesttimeoutexception',['RequestTimeoutException',['../class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception.html',1,'Tgstation.Server.Client.RequestTimeoutException'],['../class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception.html#a0dd3ecf1238e3cb9c8d76dd749929ead',1,'Tgstation.Server.Client.RequestTimeoutException.RequestTimeoutException()'],['../class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception.html#a85873681c9fb67bfd55b8751ba791e5b',1,'Tgstation.Server.Client.RequestTimeoutException.RequestTimeoutException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception.html#a80635931d781eaab27edcae371a77e7c',1,'Tgstation.Server.Client.RequestTimeoutException.RequestTimeoutException(string message, Exception innerException)']]], + ['requesttimeoutexception_2ecs',['RequestTimeoutException.cs',['../_request_timeout_exception_8cs.html',1,'']]], + ['requireheaders',['requireHeaders',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#a91c58c31f7a3cc51fff3cfc3b236756d',1,'Tgstation::Server::Host::Controllers::ApiController']]], + ['requireinstance',['requireInstance',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#afe4f020656eb2d02def6ff389fd33bcb',1,'Tgstation::Server::Host::Controllers::ApiController']]], + ['requiressafe',['RequiresSafe',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#af7163ca98f9f5e5c731043ecdace3745aa664657b234543e1fc6702e00b784325',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['requirestrusted',['RequiresTrusted',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#af7163ca98f9f5e5c731043ecdace3745a2cb40d93bedc4fe88f33d0fd49c87563',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['requiresultrasafe',['RequiresUltrasafe',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#af7163ca98f9f5e5c731043ecdace3745a6125188ea908d44694f8cdff0eef43f4',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['resetadminpassword',['ResetAdminPassword',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html#a90f97812f033dd9cc418ea1fcffe3ce0',1,'Tgstation.Server.Host.Configuration.DatabaseConfiguration.ResetAdminPassword()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder.html#aa448dafe5d62a4314040526037449ddd',1,'Tgstation.Server.Host.Models.DatabaseSeeder.ResetAdminPassword()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_seeder.html#a753aeccc2026cd9c7c00f11dcf4b9110',1,'Tgstation.Server.Host.Models.IDatabaseSeeder.ResetAdminPassword()']]], + ['resetrebootstate',['ResetRebootState',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a8644c6835b2bff2ec93f7f7609b9fecd',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.ResetRebootState()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#adf354aa2b35f8150bcd12a6338c59956',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.ResetRebootState()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#a2859725d1805d6655be14566f9edcf00',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.ResetRebootState()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a10030d2d9fd76e199bc1ea38627c7422',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.ResetRebootState()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a8def0047dcd40c0dfccd1a58be57f938',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ResetRebootState()']]], + ['resettoorigin',['ResetToOrigin',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#ab03d183168abf3cc19f57bc47e25c5d6',1,'Tgstation.Server.Host.Components.Repository.IRepository.ResetToOrigin()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a1b591fe0be8dbc5636d96d8e9992ddbe',1,'Tgstation.Server.Host.Components.Repository.Repository.ResetToOrigin()']]], + ['resettosha',['ResetToSha',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#aa955f0aaefce1850e40eda99419fdd79',1,'Tgstation.Server.Host.Components.Repository.IRepository.ResetToSha()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a760cc043dfc2bc394b52d9d6717d7843',1,'Tgstation.Server.Host.Components.Repository.Repository.ResetToSha()']]], + ['resolvepath',['ResolvePath',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a287eaf4e73a4d64e50f1dab24c3b0d3e',1,'Tgstation.Server.Host.IO.DefaultIOManager.ResolvePath()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#aef508a4c82215e95c29aa23255fdb01c',1,'Tgstation.Server.Host.IO.IIOManager.ResolvePath()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_resolving_i_o_manager.html#a50b2302533637090939afbb9dee042ee',1,'Tgstation.Server.Host.IO.ResolvingIOManager.ResolvePath()']]], + ['resolvingiomanager',['ResolvingIOManager',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_resolving_i_o_manager.html',1,'Tgstation.Server.Host.IO.ResolvingIOManager'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_resolving_i_o_manager.html#a4e9c20b01d6d66f04eb106365f9d7a1a',1,'Tgstation.Server.Host.IO.ResolvingIOManager.ResolvingIOManager()']]], + ['resolvingiomanager_2ecs',['ResolvingIOManager.cs',['../_resolving_i_o_manager_8cs.html',1,'']]], + ['response',['Response',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_response.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['response_2ecs',['Response.cs',['../_response_8cs.html',1,'']]], + ['restart',['Restart',['../class_tgstation_1_1_server_1_1_client_1_1_administration_client.html#a695a17f5dc134c529d21146c1273c58b',1,'Tgstation.Server.Client.AdministrationClient.Restart()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#ab7598c890869f71b94e6051acbc6790d',1,'Tgstation.Server.Client.Components.DreamDaemonClient.Restart()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html#adb6252aed5c2e88bc48923b1936921fd',1,'Tgstation.Server.Client.Components.IDreamDaemonClient.Restart()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client.html#a9730058c232e1f8d1917137f3445d8a3',1,'Tgstation.Server.Client.IAdministrationClient.Restart()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#a0e80e3751764c584151e51f4395efbf5',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.Restart()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a39d65944835fca058d4a4be46eaf81bd',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Restart()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#af9a8f5a5f43f7f01031650b9319fe953',1,'Tgstation.Server.Host.Controllers.DreamDaemonController.Restart()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control.html#a13dcbb02bca9b289a8bccd07a848b4b9',1,'Tgstation.Server.Host.Core.IServerControl.Restart()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#ab2114beab119e090ece99d97ef0ca9c6',1,'Tgstation.Server.Host.Server.Restart()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a3299866691a7a4ef98a42bd27b03bfba',1,'Tgstation.Server.Host.Server.Restart(Version newVersion, Exception exception)'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49a51cfbcff36da74a9fc47f3a5140f99f2',1,'Tgstation.Server.Api.Rights.Restart()'],['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a97c1a4a168451bd7e3be23c467aa2812a51cfbcff36da74a9fc47f3a5140f99f2',1,'Tgstation.Server.Host.Components.Watchdog.Restart()'],['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a3b33ca95a6257e0c719adc7b54444ab8a51cfbcff36da74a9fc47f3a5140f99f2',1,'Tgstation.Server.Host.Components.Watchdog.Restart()']]], + ['restarthandlers',['restartHandlers',['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a6fd99785ffec475ce3d3835c1206505f',1,'Tgstation::Server::Host::Server']]], + ['restarthost',['RestartHost',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#affda1440f9c5e2dfcca65138d2f89a21a4ebebe34711c9ddafa1eff5faa9a377e',1,'Tgstation::Server::Api::Rights']]], + ['restartnotsupportedexception',['RestartNotSupportedException',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#a69d9c2b017d6ecbc121fef1661528c50',1,'Tgstation::Server::Host::Controllers::AdministrationController']]], + ['restartregistration',['RestartRegistration',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration.html',1,'Tgstation.Server.Host.Core.RestartRegistration'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration.html#a4391d21de43d098a833168620dc24dc4',1,'Tgstation.Server.Host.Core.RestartRegistration.RestartRegistration()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ab1ff05d250d5aa61c90d5b1a1afa2a3b',1,'Tgstation.Server.Host.Components.Chat.Chat.restartRegistration()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#aefe25fd33c4a6dfb4ea27b583a2286ea',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.restartRegistration()']]], + ['restartregistration_2ecs',['RestartRegistration.cs',['../_restart_registration_8cs.html',1,'']]], + ['restartrequested',['RestartRequested',['../interface_tgstation_1_1_server_1_1_host_1_1_i_server.html#ac87902a08c496cd40add682a2ec6c616',1,'Tgstation.Server.Host.IServer.RestartRequested()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#add86891cdb4011d078e94671466ef14e',1,'Tgstation.Server.Host.Server.RestartRequested()'],['../class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html#a61f844c9c2459cc3ab86153678e938db',1,'Tgstation.Server.Tests.TestingServer.RestartRequested()']]], + ['restarttimeout',['RestartTimeout',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html#addf96ec4a3f16bc7d3d2cd94347dd1d3',1,'Tgstation::Server::Host::Configuration::GeneralConfiguration']]], + ['retryafter',['RetryAfter',['../class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception.html#a1aad8b621a8b13f9671908f0bc6b3025',1,'Tgstation::Server::Client::RateLimitException']]], + ['revinfotestmerge',['RevInfoTestMerge',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_rev_info_test_merge.html',1,'Tgstation::Server::Host::Models']]], + ['revinfotestmerge_2ecs',['RevInfoTestMerge.cs',['../_rev_info_test_merge_8cs.html',1,'']]], + ['revinfotestmerges',['RevInfoTestMerges',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a7b31c0d79c7983467cad196f2d647a3e',1,'Tgstation::Server::Host::Models::DatabaseContext']]], + ['revision',['Revision',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html#af6d70d4a20f3176c3c19b2952c9a3ec3',1,'Tgstation.Server.Host.Components.Interop.JsonFile.Revision()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge.html#aaea6dcdb934abf7929b14a051f4d724f',1,'Tgstation.Server.Host.Components.Interop.TestMerge.Revision()']]], + ['revisioncommand',['RevisionCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html',1,'Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html#a7958e83719218e0c15fae6210c1227b7',1,'Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.RevisionCommand()']]], + ['revisioncommand_2ecs',['RevisionCommand.cs',['../_revision_command_8cs.html',1,'']]], + ['revisioninformation',['RevisionInformation',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_revision_information.html',1,'Tgstation.Server.Api.Models.Internal.RevisionInformation'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information.html',1,'Tgstation.Server.Api.Models.RevisionInformation'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html',1,'Tgstation.Server.Host.Models.RevisionInformation'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job.html#a1d1274044dfcbf5e6e69798cc57beab5',1,'Tgstation.Server.Api.Models.CompileJob.RevisionInformation()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html#a0ff964c98b1bd3dac0c2d0d77f223492',1,'Tgstation.Server.Api.Models.Repository.RevisionInformation()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.html#a30c14e7fc4c770ff11cd0f10be4fb4dd',1,'Tgstation.Server.Host.Models.CompileJob.RevisionInformation()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_rev_info_test_merge.html#a84e7e578fe5c0d7c09dc22f9085d7367',1,'Tgstation.Server.Host.Models.RevInfoTestMerge.RevisionInformation()']]], + ['revisioninformation_2ecs',['RevisionInformation.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_revision_information_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_api_2_models_2_revision_information_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_revision_information_8cs.html',1,'(Global Namespace)']]], + ['revisioninformations',['RevisionInformations',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a171b007805a06da662fbbfb5a4508957',1,'Tgstation.Server.Host.Models.DatabaseContext.RevisionInformations()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#a8e78614cd8f6b1c9b29677a631d42604',1,'Tgstation.Server.Host.Models.IDatabaseContext.RevisionInformations()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#ae46b0c821ef239baa662cc6449042428',1,'Tgstation.Server.Host.Models.Instance.RevisionInformations()']]], + ['revisoninformations',['RevisonInformations',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html#a7fe2e5a682458f709e43ff6bab6e6912',1,'Tgstation::Server::Host::Models::TestMerge']]], + ['rightshelper',['RightsHelper',['../class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper.html',1,'Tgstation::Server::Api::Rights']]], + ['rightshelper_2ecs',['RightsHelper.cs',['../_rights_helper_8cs.html',1,'']]], + ['rightstype',['RightsType',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20',1,'Tgstation::Server::Api::Rights']]], + ['rightstype_2ecs',['RightsType.cs',['../_rights_type_8cs.html',1,'']]], + ['righttotype',['RightToType',['../class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper.html#ab694cd1b9b98a6be7d79f236a71b386c',1,'Tgstation::Server::Api::Rights::RightsHelper']]], + ['rolename',['RoleName',['../class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper.html#acbf514eba48e29a2dc177eb5ae34edd7',1,'Tgstation::Server::Api::Rights::RightsHelper']]], + ['rolenames_3c_20tright_20_3e',['RoleNames< TRight >',['../class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper.html#a08d444c5eb8868e931b37f11f9071f92',1,'Tgstation::Server::Api::Rights::RightsHelper']]], + ['root',['Root',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#aa336e9d55df01b49f6d217b48563900a',1,'Tgstation::Server::Api::Routes']]], + ['rootjson',['RootJson',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_design_time_db_context_factory_helpers.html#a1fa8a2aa0e3e9da12ef8889900047067',1,'Tgstation::Server::Host::Models::Migrations::DesignTimeDbContextFactoryHelpers']]], + ['routes',['Routes',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html',1,'Tgstation::Server::Api']]], + ['routes_2ecs',['Routes.cs',['../_routes_8cs.html',1,'']]], + ['run',['Run',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#acada234c8af8eaa1c63a1f77a579f789',1,'Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.Run()'],['../class_tgstation_1_1_server_1_1_tests_1_1_administration_test.html#aa41c1e37002472723f7ecf389377db65',1,'Tgstation.Server.Tests.AdministrationTest.Run()'],['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html#a4d2ae0cc66117b154809223552fec33c',1,'Tgstation.Server.Tests.Instance.ByondTest.Run()'],['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test.html#a55b8c34f57fe7c608de427e277a0bbd6',1,'Tgstation.Server.Tests.Instance.ConfigurationTest.Run()'],['../class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test.html#af686ec03cb0fdb0afbb812e51497b3cf',1,'Tgstation.Server.Tests.InstanceManagerTest.Run()']]], + ['runasync',['RunAsync',['../interface_tgstation_1_1_server_1_1_host_1_1_i_server.html#adbc2845e82b03ae5d2437be1b2659f50',1,'Tgstation.Server.Host.IServer.RunAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#af29679fec3814cbd12e306090e3fcfb1',1,'Tgstation.Server.Host.Server.RunAsync()'],['../interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog.html#abe13ec45a7d7ba7db422ea661156b697',1,'Tgstation.Server.Host.Watchdog.IWatchdog.RunAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html#a3f2e5da2e83854873a9d8f986aff8f17',1,'Tgstation.Server.Host.Watchdog.Watchdog.RunAsync()'],['../class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html#a791305c44a7cad7ba787d7ee8a53019e',1,'Tgstation.Server.Tests.TestingServer.RunAsync()']]], + ['runcompilejob',['RunCompileJob',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a171140f263892237911eae056aa309c5',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['rundreammaker',['RunDreamMaker',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#ad17613397de38dcdca68b3adb1c533a7',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['runimpersonated',['RunImpersonated',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity.html#a9b525a56c704424ce14e78edcb7d003e',1,'Tgstation.Server.Host.Security.ISystemIdentity.RunImpersonated()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html#aaa070f717bb19b6d85f0253d7820bc75',1,'Tgstation.Server.Host.Security.WindowsSystemIdentity.RunImpersonated()']]], + ['runjob',['RunJob',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a8a5878703c7cc9d4686850960f305cb1',1,'Tgstation::Server::Host::Core::JobManager']]], + ['running',['Running',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html#aeb790941d9b1807e1de1f1b869102c01',1,'Tgstation.Server.Api.Models.DreamDaemon.Running()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#a26fc404928f808be57119b4dcd5edbb2',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.Running()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a27e3ca033079704cca1f215e31f4cc0b',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Running()']]], + ['runrequest_3c_20tresult_20_3e',['RunRequest< TResult >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#afe7cf5895d2cbd54c50c27073ffd08af',1,'Tgstation::Server::Client::ApiClient']]], + ['runtask',['runTask',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#a9c208972ecc5b7d3f543c2e33ca745c3',1,'Tgstation::Server::Host::Components::Watchdog::WindowsNetworkPromptReaper']]], + ['runtests',['RunTests',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_instance_test.html#a0f9a172faa4a92e6e50186fe1e2f77fd',1,'Tgstation::Server::Tests::Instance::InstanceTest']]], + ['runwatchdog',['RunWatchdog',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a5ce97a95847cecf3650ae60f0f62d836',1,'Tgstation::Server::Host::Service::ServerService']]], + ['runwizard',['RunWizard',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#ad3c6c2c16eb62a8fc4371752ca3e8de5',1,'Tgstation::Server::Host::Core::SetupWizard']]] +]; diff --git a/search/all_13.html b/search/all_13.html new file mode 100644 index 0000000000..dc6c0496a2 --- /dev/null +++ b/search/all_13.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_13.js b/search/all_13.js new file mode 100644 index 0000000000..51079b06f7 --- /dev/null +++ b/search/all_13.js @@ -0,0 +1,133 @@ +var searchData= +[ + ['server_20architecture',['Server Architecture',['../architecture.html',1,'']]], + ['safe',['Safe',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ad4850e6b78816679602b13d63d2869b5ac6eea0560cd6f377e78dff2c85cc9122',1,'Tgstation::Server::Api::Models']]], + ['sanitizegetpath',['SanitizeGetPath',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#ab946844da209d641f1d29dfb8ff673a9',1,'Tgstation::Server::Client::Components::ConfigurationClient']]], + ['sasl',['Sasl',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a0a41c646f859c99d437373d8e6e0545ba722a094110489086589ef2ca86d2a516',1,'Tgstation::Server::Api::Models']]], + ['save',['Save',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html#aeff147714497ace9d41af9ca0b788833',1,'Tgstation.Server.Host.Components.ReattachInfoHandler.Save()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_reattach_info_handler.html#a16fd365b310e3b5a2079cb8128751507',1,'Tgstation.Server.Host.Components.Watchdog.IReattachInfoHandler.Save()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a1af2fcef1f485fbb45858c4b216d38c2',1,'Tgstation.Server.Host.Models.DatabaseContext.Save()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#a27f06a42dba05daefb2ffe64bcd66070',1,'Tgstation.Server.Host.Models.IDatabaseContext.Save()']]], + ['saveconfiguration',['SaveConfiguration',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a33979a0c479a916c0c3e572f52e2914b',1,'Tgstation::Server::Host::Core::SetupWizard']]], + ['schemadowngradeforserverversion',['SchemaDowngradeForServerVersion',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#ae838bb2dc7f95d7a52682695bf3635b6',1,'Tgstation.Server.Host.Models.DatabaseContext.SchemaDowngradeForServerVersion()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#a9d7b25434b90a7340886f97924e79024',1,'Tgstation.Server.Host.Models.IDatabaseContext.SchemaDowngradeForServerVersion()']]], + ['scopefactory',['scopeFactory',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_database_context_factory.html#a2cce345f61e3614445113964be73e3dc',1,'Tgstation::Server::Host::Core::DatabaseContextFactory']]], + ['scriptfileextension',['ScriptFileExtension',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_platform_identifier.html#a44133d2882a25ade2ab52588c9d1cdb3',1,'Tgstation.Server.Host.Core.IPlatformIdentifier.ScriptFileExtension()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_platform_identifier.html#a6605782a19fe372a97b07270125fa885',1,'Tgstation.Server.Host.Core.PlatformIdentifier.ScriptFileExtension()']]], + ['secondarydirectory',['SecondaryDirectory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#a22d8b0640fe39cb55e644b9a97cbca63',1,'Tgstation.Server.Host.Components.Compiler.DmbProvider.SecondaryDirectory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html#a9b49c370a0335f6fc8966e8fbed630fe',1,'Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.SecondaryDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.html#ab815ba06901d8064ab7451667f1fc58a',1,'Tgstation.Server.Host.Components.IDmbProvider.SecondaryDirectory()']]], + ['secondaryport',['SecondaryPort',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.html#ad45d0d4381f4e8bc4be6e5d050382080',1,'Tgstation::Server::Api::Models::Internal::DreamDaemonLaunchParameters']]], + ['section',['Section',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_control_panel_configuration.html#adbbc553f0fd0f2eb4a69a8361c5a9c80',1,'Tgstation.Server.Host.Configuration.ControlPanelConfiguration.Section()'],['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html#a3c3201b453ffd190158839da139e4a13',1,'Tgstation.Server.Host.Configuration.DatabaseConfiguration.Section()'],['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html#a8450ea7764591aa38857686d8fc70f93',1,'Tgstation.Server.Host.Configuration.FileLoggingConfiguration.Section()'],['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html#a04dc43bd8ff33f4a8a791f750f7eb1d9',1,'Tgstation.Server.Host.Configuration.GeneralConfiguration.Section()'],['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html#aeed3d84cee92ab5e7488d5c5b52493c7',1,'Tgstation.Server.Host.Configuration.UpdatesConfiguration.Section()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_good_config.html#a519b196f2689a69fdf560c2b9daa8cbc',1,'Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.GoodConfig.Section()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config1.html#aadc0a9ff1fa2ee6ef0a51eaf5df45671',1,'Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.BadConfig1.Section()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config2.html#a103b465b4ca8add84af64f2d0692bc91',1,'Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.BadConfig2.Section()']]], + ['securestringlength',['SecureStringLength',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html#a893d5725e799a79d7a3dd172f098edb8',1,'Tgstation::Server::Host::Security::CryptographySuite']]], + ['securitylevel',['SecurityLevel',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.html#aab2ca846e0aade7de3cfcea099f40fa4',1,'Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.SecurityLevel()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html#ab8c25fac824bd44da5b7aa1a1256d793',1,'Tgstation.Server.Host.Components.Interop.JsonFile.SecurityLevel()']]], + ['securityword',['SecurityWord',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#a70fd03d6869f455b343650314076d498',1,'Tgstation::Server::Host::Components::Watchdog::SessionControllerFactory']]], + ['seedadminuser',['SeedAdminUser',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder.html#a33cc018d457e556f1d17f4f781cb2d2b',1,'Tgstation::Server::Host::Models::DatabaseSeeder']]], + ['seeddatabase',['SeedDatabase',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder.html#a3bac7ba8cb5d06787f6f5c79dcbd0b7f',1,'Tgstation.Server.Host.Models.DatabaseSeeder.SeedDatabase()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_seeder.html#a789999e9fefb120b8bd73334832b03eb',1,'Tgstation.Server.Host.Models.IDatabaseSeeder.SeedDatabase()']]], + ['selectfactory',['SelectFactory',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory.html#aab34ee44930736ba24aa1016b26f2d33',1,'Tgstation::Server::Host::IO::Tests::TestSymlinkFactory']]], + ['semaphore',['semaphore',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a192e5a69ce9c2300f588cc65af3a64f2',1,'Tgstation.Server.Host.Components.Byond.ByondManager.semaphore()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#ae6aa8519a6401fc95218f2de88080605',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.semaphore()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#a550982dbdc2ce226e878702a520bbe27',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.semaphore()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#af64bb7e6efa9991a5a3a14993a3277e8',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.semaphore()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a96d8bb542f16398eada0a59c00955005',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Semaphore()']]], + ['semaphoreslimcontext',['SemaphoreSlimContext',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html',1,'Tgstation.Server.Host.Core.SemaphoreSlimContext'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html#a600d8d0a279d2fe17d1f48c1a1bd17d4',1,'Tgstation.Server.Host.Core.SemaphoreSlimContext.SemaphoreSlimContext()']]], + ['semaphoreslimcontext_2ecs',['SemaphoreSlimContext.cs',['../_semaphore_slim_context_8cs.html',1,'']]], + ['sendasync',['SendAsync',['../class_tgstation_1_1_server_1_1_client_1_1_http_client.html#a3564ac1eca649d3318f91116a3123279',1,'Tgstation.Server.Client.HttpClient.SendAsync()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_http_client.html#a7c73a8c52b38c69ed369036d186192de',1,'Tgstation.Server.Client.IHttpClient.SendAsync()']]], + ['sendcommand',['SendCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#aa98e6de498a01067af07754cb5822ecf',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.SendCommand()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#acecb23152cbf86fc4c7e6f0e0a716aca',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.SendCommand()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a89bda875f426c81f2770f2bfc75c0b32',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.SendCommand(string command, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a2f13c5b73a38cd544431c659f6474260',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.SendCommand(string command, ushort? overridePort, CancellationToken cancellationToken)']]], + ['senddeploymentmessage',['SendDeploymentMessage',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a025d41f083d40d158d013ff5450d522e',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['sendmessage',['SendMessage',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a7b0c3e2ccae0567ff35d0c01538e9d6a',1,'Tgstation.Server.Host.Components.Chat.Chat.SendMessage()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html#a7c3b57384b915ad9f1f4c3a7ad13db7d',1,'Tgstation.Server.Host.Components.Chat.IChat.SendMessage()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#ac986f3eaca89e94c1a16d3a6392c44dd',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.SendMessage()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.html#ad0b951bd26aed974f63c3e11971eb009',1,'Tgstation.Server.Host.Components.Chat.Providers.IProvider.SendMessage()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a8bfdc6f40539bde1282c4c8c002ce7e0',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.SendMessage()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#a89fe4a51bf3659db42995a39cc607285',1,'Tgstation.Server.Host.Components.Chat.Providers.Provider.SendMessage()'],['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#a23bd1ebb88ecd7ec9ae0ae7b867a05e7',1,'Tgstation.Server.Host.NativeMethods.SendMessage()']]], + ['sendmessagecount',['SendMessageCount',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#abf165c8b6b3e76716dce9cd6cfe31586',1,'Tgstation::Server::Host::Components::Watchdog::WindowsNetworkPromptReaper']]], + ['sendupdatemessage',['SendUpdateMessage',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ac2371187a677501230d773bb19619b76',1,'Tgstation.Server.Host.Components.Chat.Chat.SendUpdateMessage()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html#a4e5b9e98e5ba0b2cf5daf36c69d89455',1,'Tgstation.Server.Host.Components.Chat.IChat.SendUpdateMessage()']]], + ['sendwatchdogmessage',['SendWatchdogMessage',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ae3b680dea33f561c3873cb1ad89d08fb',1,'Tgstation.Server.Host.Components.Chat.Chat.SendWatchdogMessage()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html#a46a41e93326aa21f8ccefb8428b13eb3',1,'Tgstation.Server.Host.Components.Chat.IChat.SendWatchdogMessage()']]], + ['server',['Server',['../class_tgstation_1_1_server_1_1_host_1_1_server.html',1,'Tgstation.Server.Host.Server'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#a68bc2da7797f5d0d21a7ab153f558099',1,'Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.server()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a49b3292f84ad94251345a9b9ee4fc90a',1,'Tgstation.Server.Host.Server.Server()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a0a41c646f859c99d437373d8e6e0545ba9aa1b03934893d7134a660af4204f2a9',1,'Tgstation.Server.Api.Models.Server()']]], + ['server_2ecs',['Server.cs',['../_server_8cs.html',1,'']]], + ['serverapiversion',['ServerApiVersion',['../class_tgstation_1_1_server_1_1_client_1_1_client_exception.html#a2bc432cbd374898f5a3e65f14aeb606b',1,'Tgstation::Server::Client::ClientException']]], + ['serverclient',['ServerClient',['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html',1,'Tgstation.Server.Client.ServerClient'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#aeb7a24a33819012790a38d5fceb2c8bb',1,'Tgstation.Server.Client.ServerClient.ServerClient()']]], + ['serverclient_2ecs',['ServerClient.cs',['../_server_client_8cs.html',1,'']]], + ['serverclientfactory',['ServerClientFactory',['../class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.html',1,'Tgstation.Server.Client.ServerClientFactory'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.html#ae72794d4ee4b75d442896ef3764d435b',1,'Tgstation.Server.Client.ServerClientFactory.ServerClientFactory()']]], + ['serverclientfactory_2ecs',['ServerClientFactory.cs',['../_server_client_factory_8cs.html',1,'']]], + ['servercommandsjson',['ServerCommandsJson',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html#a1334d58a732afc470443e4c68a1ee405',1,'Tgstation.Server.Host.Components.Interop.JsonFile.ServerCommandsJson()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list.html#ae3409b5ad7f9e915e961427d80376ed1',1,'Tgstation.Server.Host.Components.Interop.JsonSubFileList.ServerCommandsJson()']]], + ['servercontrol',['serverControl',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html#a680fca011bf0ce22e735337fa4b669b2',1,'Tgstation.Server.Host.Components.Chat.ChatFactory.serverControl()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#ac2ba10fddea5448f4c8c08f363a0e391',1,'Tgstation.Server.Host.Components.InstanceManager.serverControl()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#a5af6c1c8d2eb3d485928e889478f0c87',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.serverControl()']]], + ['servererrorexception',['ServerErrorException',['../class_tgstation_1_1_server_1_1_client_1_1_server_error_exception.html',1,'Tgstation.Server.Client.ServerErrorException'],['../class_tgstation_1_1_server_1_1_client_1_1_server_error_exception.html#a3c0883bc41902cff9f2becfdb64c0d97',1,'Tgstation.Server.Client.ServerErrorException.ServerErrorException()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_error_exception.html#a8df6f788200930f5a4408062c8cd1120',1,'Tgstation.Server.Client.ServerErrorException.ServerErrorException(string html)'],['../class_tgstation_1_1_server_1_1_client_1_1_server_error_exception.html#a2426a2796880232113cfd743b1010fdb',1,'Tgstation.Server.Client.ServerErrorException.ServerErrorException(string message, Exception innerException)']]], + ['servererrorexception_2ecs',['ServerErrorException.cs',['../_server_error_exception_8cs.html',1,'']]], + ['serverfactory',['ServerFactory',['../class_tgstation_1_1_server_1_1_host_1_1_server_factory.html',1,'Tgstation.Server.Host.ServerFactory'],['../class_tgstation_1_1_server_1_1_host_1_1_program.html#a7a505b0b21db5eea8c5b144d137c1ae2',1,'Tgstation.Server.Host.Program.ServerFactory()']]], + ['serverfactory_2ecs',['ServerFactory.cs',['../_server_factory_8cs.html',1,'']]], + ['serverinformation',['ServerInformation',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_server_information.html',1,'Tgstation::Server::Api::Models']]], + ['serverinformation_2ecs',['ServerInformation.cs',['../_server_information_8cs.html',1,'']]], + ['serverservice',['ServerService',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html',1,'Tgstation.Server.Host.Service.ServerService'],['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a3f4d7655e24f18f6929e48f48c79b0a2',1,'Tgstation.Server.Host.Service.ServerService.ServerService()']]], + ['serverservice_2ecs',['ServerService.cs',['../_server_service_8cs.html',1,'']]], + ['serversidemodifications',['ServerSideModifications',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_server_side_modifications.html',1,'Tgstation.Server.Host.Components.StaticFiles.ServerSideModifications'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_server_side_modifications.html#a80a1a88d3e1f59d285b91563e86e2ef8',1,'Tgstation.Server.Host.Components.StaticFiles.ServerSideModifications.ServerSideModifications()']]], + ['serversidemodifications_2ecs',['ServerSideModifications.cs',['../_server_side_modifications_8cs.html',1,'']]], + ['serverupdater',['serverUpdater',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#a860fa70ca4b87deb3f9e6f550d57dc72',1,'Tgstation::Server::Host::Controllers::AdministrationController']]], + ['servicebase',['ServiceBase',['../class_service_base.html',1,'']]], + ['servicecollectionextensions',['ServiceCollectionExtensions',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_service_collection_extensions.html',1,'Tgstation::Server::Host::Core']]], + ['servicecollectionextensions_2ecs',['ServiceCollectionExtensions.cs',['../_service_collection_extensions_8cs.html',1,'']]], + ['serviceunavailableexception',['ServiceUnavailableException',['../class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception.html',1,'Tgstation.Server.Client.ServiceUnavailableException'],['../class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception.html#a8969972514222281c1d3e7df4804c046',1,'Tgstation.Server.Client.ServiceUnavailableException.ServiceUnavailableException()'],['../class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception.html#a6a729a7fa03b7a6bfebf6df9935b89a5',1,'Tgstation.Server.Client.ServiceUnavailableException.ServiceUnavailableException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception.html#a49a6d51cf0a76f247c3ea7bcc42f638f',1,'Tgstation.Server.Client.ServiceUnavailableException.ServiceUnavailableException(string message, Exception innerException)']]], + ['serviceunavailableexception_2ecs',['ServiceUnavailableException.cs',['../_service_unavailable_exception_8cs.html',1,'']]], + ['sessioncontroller',['SessionController',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html',1,'Tgstation.Server.Host.Components.Watchdog.SessionController'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#ae5443414944a0987591da095e20a22db',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.SessionController()']]], + ['sessioncontroller_2ecs',['SessionController.cs',['../_session_controller_8cs.html',1,'']]], + ['sessioncontrollerfactory',['SessionControllerFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a83a510422b603a4b745cca929a8f0689',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.sessionControllerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a24eb5f0e32cd79487cd9bd80d5257abb',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.SessionControllerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#a300cbc6914bdd6dfdab7335fcea74b31',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.SessionControllerFactory()']]], + ['sessioncontrollerfactory_2ecs',['SessionControllerFactory.cs',['../_session_controller_factory_8cs.html',1,'']]], + ['setactiveversion',['SetActiveVersion',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html#a798c9e8b4b224f3a78791f765d69b304',1,'Tgstation.Server.Client.Components.ByondClient.SetActiveVersion()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client.html#a76a30723a9370f391d4ca12fb31e5c71',1,'Tgstation.Server.Client.Components.IByondClient.SetActiveVersion()']]], + ['setapivalidationport',['SetApiValidationPort',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5da926d34b9044ba920f715e8e2f6a72c62',1,'Tgstation::Server::Api::Rights']]], + ['setautostart',['SetAutoStart',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49ac73c1c7e96a1b68753840b8502528ab0',1,'Tgstation::Server::Api::Rights']]], + ['setautoupdate',['SetAutoUpdate',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79a2e54e04dba31375a3401f9f300a80d81',1,'Tgstation::Server::Api::Rights']]], + ['setautoupdateinterval',['SetAutoUpdateInterval',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html#a579c48046b16d1e8af0670c89c35d016',1,'Tgstation.Server.Host.Components.IInstance.SetAutoUpdateInterval()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a9c7e2863cce30a01be66c0ce1dd07d9c',1,'Tgstation.Server.Host.Components.Instance.SetAutoUpdateInterval()']]], + ['setchannels',['SetChannels',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_json_tracking_context.html#ac408c1fd7c02c5a3e38e8dd61d81a4bd',1,'Tgstation.Server.Host.Components.Chat.IJsonTrackingContext.SetChannels()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#af8929ecaca85cb7ad4ccf7c9eab75cca',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext.SetChannels()']]], + ['setconfiguration',['SetConfiguration',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79a2e423f35163ade75efce4061c98e1803',1,'Tgstation::Server::Api::Rights']]], + ['setconnectionstringbuilder',['SetConnectionStringBuilder',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html#ad289a7498cd4082d22ccd610107883ea',1,'Tgstation::Server::Api::Models::Internal::ChatBot']]], + ['setdme',['SetDme',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5da14814465c8710a1dd49b3642c172ed36',1,'Tgstation::Server::Api::Rights']]], + ['sethandler',['SetHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.html#a593d81a97b0b00221c098a3c04049800',1,'Tgstation::Server::Host::Components::Chat::Commands::CustomCommand']]], + ['sethighpriority',['SetHighPriority',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#aef4c7c64a5e65b145c8a1bec87ec7dce',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.SetHighPriority()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#af6e7093ca0ba5a23b92753efb585d8cc',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.SetHighPriority()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_base.html#a8b3c3113a6f911d992ec8eaf0f4bc185',1,'Tgstation.Server.Host.Core.IProcessBase.SetHighPriority()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a91e7f308841dadc4e14998d730f10557',1,'Tgstation.Server.Host.Core.Process.SetHighPriority()']]], + ['setid',['SetID',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a0266a146dbc57a7c6168533d7a7b10eb',1,'Tgstation::Server::Api::Routes']]], + ['setonline',['SetOnline',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79a49241bae6f08ea45c321cbee8ce70cda',1,'Tgstation::Server::Api::Rights']]], + ['setorigin',['SetOrigin',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39a4cfe869c65c26d572cd5ab1b98abdb6a',1,'Tgstation::Server::Api::Rights']]], + ['setport',['SetPort',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a96e0eb1ff216d40c57e2c2ceb4690c54',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.SetPort()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#a83d11030bd08b307ea3a6f7bfc05284c',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.SetPort()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a25f0b56359996842163f348a227734b9',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.SetPort()']]], + ['setports',['SetPorts',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49a81a46f4105078d5ddae4991343644468',1,'Tgstation::Server::Api::Rights']]], + ['setrebootstate',['SetRebootState',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#af1b9377a045c1a882e04a513c053e6a4',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.SetRebootState()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#ac0db66caea3d150af0eb64cb9596ee22',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.SetRebootState()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a1076b12f9e7bfa7b7bf89f97d20c6c4e',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.SetRebootState()']]], + ['setreference',['SetReference',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39a177459d00b7f29a44b87c9a5e1cb1f11',1,'Tgstation::Server::Api::Rights']]], + ['setrequestheaders',['SetRequestHeaders',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a5f9f37923fe9811ceb4556af0ebfc8aa',1,'Tgstation::Server::Api::ApiHeaders']]], + ['setsecurity',['SetSecurity',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49ad01c76a7263a2d3af037a139b8563b5a',1,'Tgstation::Server::Api::Rights']]], + ['setsecuritylevel',['SetSecurityLevel',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5dab49667168f82f3007e86f44c40e6322c',1,'Tgstation::Server::Api::Rights']]], + ['setsha',['SetSha',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39ad8c2d7ddc75692573d20ed5254fcd06a',1,'Tgstation::Server::Api::Rights']]], + ['setstartuptimeout',['SetStartupTimeout',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49ae34541119c09d49ca1ba51be76c98aa1',1,'Tgstation::Server::Api::Rights']]], + ['setupwizard',['SetupWizard',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html',1,'Tgstation.Server.Host.Core.SetupWizard'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#ad0affb495878d67188e8b33f3f2f7c0f',1,'Tgstation.Server.Host.Core.SetupWizard.SetupWizard()']]], + ['setupwizard_2ecs',['SetupWizard.cs',['../_setup_wizard_8cs.html',1,'']]], + ['setupwizardmode',['SetupWizardMode',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html#ace6cef6156eebad4a760e3d9f58dcb7e',1,'Tgstation.Server.Host.Configuration.GeneralConfiguration.SetupWizardMode()'],['../namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html#ac25a13ffb39d53803eca454f2a329fc1',1,'Tgstation.Server.Host.Configuration.SetupWizardMode()']]], + ['setupwizardmode_2ecs',['SetupWizardMode.cs',['../_setup_wizard_mode_8cs.html',1,'']]], + ['setuserpassword',['SetUserPassword',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html#a0936b97992a82380047925e656b4bdae',1,'Tgstation.Server.Host.Security.CryptographySuite.SetUserPassword()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_cryptography_suite.html#aeab60aa0a0ee2cb5e2ad5dbde1983430',1,'Tgstation.Server.Host.Security.ICryptographySuite.SetUserPassword()']]], + ['setwatchdog',['SetWatchdog',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#a38465548f0041dfcd4cd148c8452f437',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.SetWatchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.html#a981e8e1ab9868dc2a02b7edbb547c0a5',1,'Tgstation.Server.Host.Components.EventConsumer.SetWatchdog()']]], + ['setwebclient',['SetWebClient',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49aba69275e93f440b20e7bebe7be6f8a7c',1,'Tgstation::Server::Api::Rights']]], + ['severapiversion',['SeverApiVersion',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html#a19535256c75f895fa8d5c0b7cef0424c',1,'Tgstation::Server::Api::Models::ErrorMessage']]], + ['shellscriptextension',['ShellScriptExtension',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#a979586ccac8fef0e0a10b9e2f5bfa339',1,'Tgstation::Server::Host::Components::Byond::PosixByondInstaller']]], + ['showtestmergecommitters',['ShowTestMergeCommitters',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#ad0559033aa2ab7b93c9e63e3b31d2ddd',1,'Tgstation::Server::Api::Models::Internal::RepositorySettings']]], + ['shutdown',['Shutdown',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#a42a57cfe50960559e8d8c2c003cb27f5',1,'Tgstation.Server.Client.Components.DreamDaemonClient.Shutdown()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html#a6dd7bcf744d8804790ece473931f378b',1,'Tgstation.Server.Client.Components.IDreamDaemonClient.Shutdown()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49a1a4ebb180ba59b067782515ffee6e975',1,'Tgstation.Server.Api.Rights.Shutdown()'],['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a3b33ca95a6257e0c719adc7b54444ab8a1a4ebb180ba59b067782515ffee6e975',1,'Tgstation.Server.Host.Components.Watchdog.Shutdown()']]], + ['skip',['Skip',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a97c1a4a168451bd7e3be23c467aa2812a72ef2b9b6965d078e3c7f95487a82d1c',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['softrestart',['SoftRestart',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_settings.html#a8f0524cddb16cbeba06c8efb91099887',1,'Tgstation.Server.Api.Models.Internal.DreamDaemonSettings.SoftRestart()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49a31d920012be69305899466206d2a4823',1,'Tgstation.Server.Api.Rights.SoftRestart()']]], + ['softshutdown',['SoftShutdown',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_settings.html#aad572af1215517120400e46b633afd02',1,'Tgstation.Server.Api.Models.Internal.DreamDaemonSettings.SoftShutdown()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49ae814f60fe597531f5630e0aef1adea94',1,'Tgstation.Server.Api.Rights.SoftShutdown()']]], + ['sqlserver',['SqlServer',['../namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html#acda8f6ee23a9ee8ac298f7b4a7d5617cae86e829e4d4c68b30a4fd26aa2bfca72',1,'Tgstation::Server::Host::Configuration']]], + ['sqlserverdatabasecontext',['SqlServerDatabaseContext',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context.html',1,'Tgstation.Server.Host.Models.SqlServerDatabaseContext'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context.html#a2e40ab7994079110ed29e098aa411179',1,'Tgstation.Server.Host.Models.SqlServerDatabaseContext.SqlServerDatabaseContext()']]], + ['sqlserverdatabasecontext_2ecs',['SqlServerDatabaseContext.cs',['../_sql_server_database_context_8cs.html',1,'']]], + ['sqlserverdatabasecontextmodelsnapshot',['SqlServerDatabaseContextModelSnapshot',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_database_context_model_snapshot.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['sqlserverdatabasecontextmodelsnapshot_2ecs',['SqlServerDatabaseContextModelSnapshot.cs',['../_sql_server_database_context_model_snapshot_8cs.html',1,'']]], + ['sqlserverdesigntimedbcontextfactory',['SqlServerDesignTimeDbContextFactory',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_design_time_db_context_factory.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['sqlserverdesigntimedbcontextfactory_2ecs',['SqlServerDesignTimeDbContextFactory.cs',['../_sql_server_design_time_db_context_factory_8cs.html',1,'']]], + ['stagedcompilejob',['StagedCompileJob',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html#a7554a23c04eba3508897073aeb5150fe',1,'Tgstation::Server::Api::Models::DreamDaemon']]], + ['standardmodelchecks',['StandardModelChecks',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html#ab8afe851bcb7261ecdc2556f1179ba4e',1,'Tgstation::Server::Host::Controllers::InstanceUserController']]], + ['start',['Start',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#a9c62e25db987e4847e6a4a8e04a72b2c',1,'Tgstation.Server.Client.Components.DreamDaemonClient.Start()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html#a97ceb0b52366f1b4ce685ef8399c44e5',1,'Tgstation.Server.Client.Components.IDreamDaemonClient.Start()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49aa6122a65eaa676f700ae68d393054a37',1,'Tgstation.Server.Api.Rights.Start()']]], + ['startasync',['StartAsync',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a7b6d8a1eef58f0e3265a67ebe9036f13',1,'Tgstation.Server.Host.Components.Byond.ByondManager.StartAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a7c9cdcd6b2af7b502269aaf082832cc1',1,'Tgstation.Server.Host.Components.Chat.Chat.StartAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#aadc03e1b2349c02cb4b49d8ed421c7a4',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.StartAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a11cc04923d2557eefd57ad2ded9eb7f2',1,'Tgstation.Server.Host.Components.Instance.StartAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#aabf10dd79c9488de365bb8de0129b74b',1,'Tgstation.Server.Host.Components.InstanceFactory.StartAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#aa2bcc92fca46ad404800304ce4bdd781',1,'Tgstation.Server.Host.Components.InstanceManager.StartAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#af05de18337edc2207b60b080de230802',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.StartAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#ae30d4b582b04eb7c3ef3c5d848429bbd',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StartAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#a1ca59b3d09398b0c4f2dea44c8d06f06',1,'Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.StartAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a9c6fbf500b0a6937d1df3c807feba46f',1,'Tgstation.Server.Host.Core.JobManager.StartAsync()']]], + ['started',['started',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#add2fda12ab0f9d293937b641a266b8a0',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['startedat',['StartedAt',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html#a0988d9930cae8f698a17c20d3e8cec9a',1,'Tgstation::Server::Api::Models::Internal::Job']]], + ['startedby',['StartedBy',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job.html#a85997775934f3449582bcc13f3fdfa52',1,'Tgstation.Server.Api.Models.Job.StartedBy()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html#aeb64c30e0787225682030adf2d2af036',1,'Tgstation.Server.Host.Models.Job.StartedBy()']]], + ['startmonitor',['StartMonitor',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a4a2930b2a0a2ae99537024bb3cd4c397',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['startup',['Startup',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.html#aa185f10c39a857423d715ce9a2d40355',1,'Tgstation.Server.Host.Core.IProcess.Startup()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#aaa8635a40b6cccf556d9ccaacfdb47ec',1,'Tgstation.Server.Host.Core.Process.Startup()']]], + ['startuptcs',['startupTcs',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#a3f49850eb0598fa0627bafcbe46ccf33',1,'Tgstation::Server::Host::Core::Application']]], + ['startuptime',['StartupTime',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_launch_result.html#abd071a9c148f21989c89490106d3f904',1,'Tgstation::Server::Host::Components::Watchdog::LaunchResult']]], + ['startuptimeout',['StartupTimeout',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.html#aa3ac63088b89bf67dd5fdbe67970b03d',1,'Tgstation::Server::Api::Models::Internal::DreamDaemonLaunchParameters']]], + ['staticignorefile',['StaticIgnoreFile',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a3c23fe94867b94fa0833f4a789830fd1',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]], + ['staticignorepath',['StaticIgnorePath',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a4a5436d55e83759de84d17871039d752',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]], + ['statuscode',['StatusCode',['../class_tgstation_1_1_server_1_1_client_1_1_client_exception.html#a443523d368932789a1ec2a332199d5e6',1,'Tgstation::Server::Client::ClientException']]], + ['stopapplication',['StopApplication',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime.html#a52dc12deb9c08610b2f9de382049579f',1,'Tgstation::Server::Host::Core::Tests::TestApplication::MockApplicationLifetime']]], + ['stopasync',['StopAsync',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a691493488b449c0589784dc2f91e039b',1,'Tgstation.Server.Host.Components.Byond.ByondManager.StopAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a45fbff93d02a71183b098029c2ee9249',1,'Tgstation.Server.Host.Components.Chat.Chat.StopAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a214367e1d3118ba0535bbd398743fbec',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.StopAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a1ecc3606d7dab80f458ad0835b7151c4',1,'Tgstation.Server.Host.Components.Instance.StopAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#aad758c3c739d563f51b44b8429acadc9',1,'Tgstation.Server.Host.Components.InstanceFactory.StopAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#aaa1a2f2c9fe345546fd5f8ae27fe466b',1,'Tgstation.Server.Host.Components.InstanceManager.StopAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a33a5cd96e75dae867c113915bd6ebb27',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.StopAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#aec4f16b34fe08499a4aaff0235ecdc76',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StopAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#a484902384f4452c5e42cf529285bd6b6',1,'Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.StopAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#ac9c87738bb92771ec01ff19a1d39e8a0',1,'Tgstation.Server.Host.Core.JobManager.StopAsync()']]], + ['stopmonitor',['StopMonitor',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a565b987a394c375c75b3fe14ca3f75e1',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['stoppedat',['StoppedAt',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html#a2b6b6dbe1243f140d9fb04767ea16c61',1,'Tgstation::Server::Api::Models::Internal::Job']]], + ['subdirectory',['subdirectory',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_resolving_i_o_manager.html#a02d7c98f480664056ad8dbe912003ae9',1,'Tgstation::Server::Host::IO::ResolvingIOManager']]], + ['sychronize',['Sychronize',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#a5f8ea07e50eb3d5d272b956a6e2543b5',1,'Tgstation.Server.Host.Components.Repository.IRepository.Sychronize()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#afd7c7599794e9541d6134a30d5d7e683',1,'Tgstation.Server.Host.Components.Repository.Repository.Sychronize()']]], + ['symlinkfactory',['symlinkFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#ae9583eef7d68626e70fd30097b6db87c',1,'Tgstation.Server.Host.Components.InstanceFactory.symlinkFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a5a52deb2c99db89b8e8dfb4bf1a5fd3f',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.symlinkFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory.html#ab7293877a2fb900634168cfa69663286',1,'Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.symlinkFactory()']]], + ['symlinkstaticfilesto',['SymlinkStaticFilesTo',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#af7ad93cfb1c7c7718a3b1ffe3e12d42d',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.SymlinkStaticFilesTo()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.html#a255b4504ec55e9a4c006463db8aaa61e',1,'Tgstation.Server.Host.Components.StaticFiles.IConfiguration.SymlinkStaticFilesTo()']]], + ['synchronousiomanager',['SynchronousIOManager',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.html',1,'Tgstation.Server.Host.IO.SynchronousIOManager'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a2b14e009e117f22b206bbdf743712809',1,'Tgstation.Server.Host.Components.InstanceFactory.synchronousIOManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a29a360d050eedfecf24a5d7a75331f1d',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.synchronousIOManager()']]], + ['synchronousiomanager_2ecs',['SynchronousIOManager.cs',['../_synchronous_i_o_manager_8cs.html',1,'']]], + ['systemidentifier',['SystemIdentifier',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#afa19e8180a87c821a7b77d27765c1824',1,'Tgstation::Server::Api::Models::Internal::User']]], + ['systemidentity',['SystemIdentity',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a05ce72960f78e0a11148f44292f3fb7b',1,'Tgstation.Server.Host.Security.AuthenticationContext.SystemIdentity()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context.html#a01b4dc318a62fa3b321593418eb1247e',1,'Tgstation.Server.Host.Security.IAuthenticationContext.SystemIdentity()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.html#a86a823a9e7ee94f2497bfae86c1efeed',1,'Tgstation.Server.Host.Security.IdentityCacheObject.SystemIdentity()']]], + ['systemidentityfactory',['systemIdentityFactory',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#a82f9e135570d468d3a0cfbf645e2f0ae',1,'Tgstation.Server.Host.Controllers.HomeController.systemIdentityFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#adcb096909c25a05c74f2714128607c05',1,'Tgstation.Server.Host.Controllers.UserController.systemIdentityFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html#a3d9f7c19ce83603342197d6fd6dffab7',1,'Tgstation.Server.Host.Security.AuthenticationContextFactory.systemIdentityFactory()']]], + ['systemidentitywrite',['SystemIdentityWrite',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ab7bc96f211e450615be8669d10de2440ab027b6d7abbf6c6fa50c64fc51437bce',1,'Tgstation::Server::Api::Models']]] +]; diff --git a/search/all_14.html b/search/all_14.html new file mode 100644 index 0000000000..7fe46634de --- /dev/null +++ b/search/all_14.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_14.js b/search/all_14.js new file mode 100644 index 0000000000..4540aad87e --- /dev/null +++ b/search/all_14.js @@ -0,0 +1,207 @@ +var searchData= +[ + ['api',['Api',['../namespace_tgstation_1_1_server_1_1_api.html',1,'Tgstation::Server']]], + ['byond',['Byond',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond.html',1,'Tgstation::Server::Host::Components']]], + ['chat',['Chat',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat.html',1,'Tgstation::Server::Host::Components']]], + ['client',['Client',['../namespace_tgstation_1_1_server_1_1_client.html',1,'Tgstation::Server']]], + ['commands',['Commands',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['compiler',['Compiler',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler.html',1,'Tgstation::Server::Host::Components']]], + ['components',['Components',['../namespace_tgstation_1_1_server_1_1_client_1_1_components.html',1,'Tgstation.Server.Client.Components'],['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html',1,'Tgstation.Server.Host.Components']]], + ['configuration',['Configuration',['../namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html',1,'Tgstation::Server::Host']]], + ['console',['Console',['../namespace_tgstation_1_1_server_1_1_host_1_1_console.html',1,'Tgstation::Server::Host']]], + ['controllers',['Controllers',['../namespace_tgstation_1_1_server_1_1_host_1_1_controllers.html',1,'Tgstation::Server::Host']]], + ['core',['Core',['../namespace_tgstation_1_1_server_1_1_host_1_1_core.html',1,'Tgstation::Server::Host']]], + ['host',['Host',['../namespace_tgstation_1_1_server_1_1_host.html',1,'Tgstation::Server']]], + ['tgstation_2dserver_20v4_3a',['tgstation-server v4:',['../index.html',1,'']]], + ['instance',['Instance',['../namespace_tgstation_1_1_server_1_1_tests_1_1_instance.html',1,'Tgstation::Server::Tests']]], + ['internal',['Internal',['../namespace_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal.html',1,'Tgstation::Server::Api::Models']]], + ['interop',['Interop',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop.html',1,'Tgstation::Server::Host::Components']]], + ['io',['IO',['../namespace_tgstation_1_1_server_1_1_host_1_1_i_o.html',1,'Tgstation::Server::Host']]], + ['migrations',['Migrations',['../namespace_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations.html',1,'Tgstation::Server::Host::Models']]], + ['models',['Models',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html',1,'Tgstation.Server.Api.Models'],['../namespace_tgstation_1_1_server_1_1_host_1_1_models.html',1,'Tgstation.Server.Host.Models']]], + ['providers',['Providers',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['repository',['Repository',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository.html',1,'Tgstation::Server::Host::Components']]], + ['rights',['Rights',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html',1,'Tgstation::Server::Api']]], + ['security',['Security',['../namespace_tgstation_1_1_server_1_1_host_1_1_security.html',1,'Tgstation::Server::Host']]], + ['server',['Server',['../namespace_tgstation_1_1_server.html',1,'Tgstation']]], + ['service',['Service',['../namespace_tgstation_1_1_server_1_1_host_1_1_service.html',1,'Tgstation::Server::Host']]], + ['staticfiles',['StaticFiles',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files.html',1,'Tgstation::Server::Host::Components']]], + ['tag',['Tag',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html#afbaa58b791797ca845c1b49a0fa758c1',1,'Tgstation.Server.Api.Models.ChatChannel.Tag()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html#a883160d1391d307f9c860f1d67be0d9d',1,'Tgstation.Server.Host.Components.Chat.Channel.Tag()']]], + ['tailincludeline',['TailIncludeLine',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_server_side_modifications.html#ac479bad6bd50784c761ee4ea93ab12e7',1,'Tgstation::Server::Host::Components::StaticFiles::ServerSideModifications']]], + ['task',['task',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html#addccba3eae2415a1f1abd3b4195f5bb9',1,'Tgstation.Server.Host.Core.JobHandler.task()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.html#a2d1a4fc7b7fee56456ccebfb699ad8ee',1,'Tgstation.Server.Host.Security.IdentityCacheObject.task()']]], + ['taskextensions',['TaskExtensions',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_task_extensions.html',1,'Tgstation::Server::Host::Core']]], + ['taskextensions_2ecs',['TaskExtensions.cs',['../_task_extensions_8cs.html',1,'']]], + ['temporarydmbprovider',['TemporaryDmbProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html',1,'Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html#a90a2df2d992af62f3f4d47671b214473',1,'Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.TemporaryDmbProvider()']]], + ['temporarydmbprovider_2ecs',['TemporaryDmbProvider.cs',['../_temporary_dmb_provider_8cs.html',1,'']]], + ['terminate',['Terminate',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#a7fded5c4b8aeb291ad5b1797a25eee14',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.Terminate()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a49a9acdffdc9e7cd176f803b23e97ff4',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Terminate()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.html#ac670c2127fe7373939bf4d28404477b7',1,'Tgstation.Server.Host.Core.IProcess.Terminate()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a31c71a6209f43d3765441d941b177455',1,'Tgstation.Server.Host.Core.Process.Terminate()']]], + ['terminatenolock',['TerminateNoLock',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a6845304123ed975aec4de3dc79bf8551',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['terminationwasrequested',['TerminationWasRequested',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a742d99e0b6bb71d69c2d1da4deab93b9',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.TerminationWasRequested()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#af1deb0ef8ce6a9f45326caa2e7aa78ea',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.TerminationWasRequested()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#ac1af411aad68101ede7a310e2c34ed91',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.TerminationWasRequested()']]], + ['testallpoweroftwo',['TestAllPowerOfTwo',['../class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests_1_1_test_rights.html#ac22b5c3b8908f9c571192d9028b04553',1,'Tgstation::Server::Api::Rights::Tests::TestRights']]], + ['testapiclient',['TestApiClient',['../class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_api_client.html',1,'Tgstation::Server::Client::Tests']]], + ['testapiclient_2ecs',['TestApiClient.cs',['../_test_api_client_8cs.html',1,'']]], + ['testapiheaders',['TestApiHeaders',['../class_tgstation_1_1_server_1_1_api_1_1_tests_1_1_test_api_headers.html',1,'Tgstation::Server::Api::Tests']]], + ['testapiheaders_2ecs',['TestApiHeaders.cs',['../_test_api_headers_8cs.html',1,'']]], + ['testapplication',['TestApplication',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application.html',1,'Tgstation::Server::Host::Core::Tests']]], + ['testapplication_2ecs',['TestApplication.cs',['../_test_application_8cs.html',1,'']]], + ['testasyncdelayer',['TestAsyncDelayer',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_async_delayer.html',1,'Tgstation::Server::Host::Core::Tests']]], + ['testasyncdelayer_2ecs',['TestAsyncDelayer.cs',['../_test_async_delayer_8cs.html',1,'']]], + ['testauthenticationcontext',['TestAuthenticationContext',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_tests_1_1_test_authentication_context.html',1,'Tgstation::Server::Host::Security::Tests']]], + ['testauthenticationcontext_2ecs',['TestAuthenticationContext.cs',['../_test_authentication_context_8cs.html',1,'']]], + ['testbadparameters',['TestBadParameters',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_d_b_connection_factory.html#a5b325eb91434829a6d4942af9e5d30a3',1,'Tgstation::Server::Host::Core::Tests::TestDBConnectionFactory']]], + ['testbasicparseandbuild',['TestBasicParseAndBuild',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests_1_1_test_irc_connection_string_builder.html#a959c6f0f3613155f666b3cf8a45226b8',1,'Tgstation::Server::Api::Models::Tests::TestIrcConnectionStringBuilder']]], + ['testcacheclean',['TestCacheClean',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests_1_1_test_posix_byond_installer.html#a93186b574838ef51135f2e1148578454',1,'Tgstation::Server::Host::Components::Byond::Tests::TestPosixByondInstaller']]], + ['testcancel',['TestCancel',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_async_delayer.html#aecc2560705e5f2758a12c21f740bd196',1,'Tgstation::Server::Host::Core::Tests::TestAsyncDelayer']]], + ['testcancellation',['TestCancellation',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html#ad4df9d6c934563e06a21e9d414068d85',1,'Tgstation::Server::Host::Core::Tests::TestJobHandler']]], + ['testconfigureservicesthrowswhensetupwizardconfigurationdemands',['TestConfigureServicesThrowsWhenSetupWizardConfigurationDemands',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application.html#af70c6d27fbe2bc05775f1349eb64573c',1,'Tgstation::Server::Host::Core::Tests::TestApplication']]], + ['testconnectanddisconnect',['TestConnectAndDisconnect',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests_1_1_test_discord_provider.html#aff4f133b6e583937a541a551518b98d3',1,'Tgstation::Server::Host::Components::Chat::Providers::Tests::TestDiscordProvider']]], + ['testconnectwithfaketokenfails',['TestConnectWithFakeTokenFails',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests_1_1_test_discord_provider.html#ab66eaa7dd23c1546a45d1580a2a370da',1,'Tgstation::Server::Host::Components::Chat::Providers::Tests::TestDiscordProvider']]], + ['testconsole',['TestConsole',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_console.html',1,'Tgstation::Server::Host::IO::Tests']]], + ['testconsole_2ecs',['TestConsole.cs',['../_test_console_8cs.html',1,'']]], + ['testconstruction',['TestConstruction',['../class_tgstation_1_1_server_1_1_api_1_1_tests_1_1_test_api_headers.html#a2d664d4ac4557f482b38df8e806e1f42',1,'Tgstation.Server.Api.Tests.TestApiHeaders.TestConstruction()'],['../class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_server_client_factory.html#a0aed735a759835b91fdbf224cc342432',1,'Tgstation.Server.Client.Tests.TestServerClientFactory.TestConstruction()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests_1_1_test_posix_byond_installer.html#a869d94dba8cff790e2df8217bfaf355d',1,'Tgstation.Server.Host.Components.Byond.Tests.TestPosixByondInstaller.TestConstruction()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests_1_1_test_experimental_watchdog.html#a87e106ec9986ec46c9e6ae90cf9d74b5',1,'Tgstation.Server.Host.Components.Watchdog.Tests.TestExperimentalWatchdog.TestConstruction()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_exception.html#af3a9ba6e5aa81f2db9c2196151d03ef6',1,'Tgstation.Server.Host.Core.Tests.TestJobException.TestConstruction()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_tests_1_1_test_authentication_context.html#ac3732c1a787ae5c0167792f4460882b0',1,'Tgstation.Server.Host.Security.Tests.TestAuthenticationContext.TestConstruction()'],['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog.html#a594221e7157a53ccca141db7c4798911',1,'Tgstation.Server.Host.Watchdog.Tests.TestWatchdog.TestConstruction()']]], + ['testconstructionanddisposal',['TestConstructionAndDisposal',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_tests_1_1_test_server_service.html#a036ab68c3912f73b633f7d4f72084977',1,'Tgstation.Server.Host.Service.Tests.TestServerService.TestConstructionAndDisposal()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests_1_1_test_discord_provider.html#a2b645e425cab8f5dd00dc0ced0f0facb',1,'Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider.TestConstructionAndDisposal()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html#af79bff79c24cf82505c520b97d6a58c4',1,'Tgstation.Server.Host.Core.Tests.TestJobHandler.TestConstructionAndDisposal()']]], + ['testconstructionthrows',['TestConstructionThrows',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_database_context_factory.html#a70e790c7d0a0fc4ddf1643a9e8ac519e',1,'Tgstation.Server.Host.Core.Tests.TestDatabaseContextFactory.TestConstructionThrows()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_setup_wizard.html#a308f384fe6be8b4dc9827cf206b1bb9b',1,'Tgstation.Server.Host.Core.Tests.TestSetupWizard.TestConstructionThrows()']]], + ['testcontruction',['TestContruction',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_git_hub_client_factory.html#a133cc009980bb76619f7f69327b810ec',1,'Tgstation::Server::Host::Core::Tests::TestGitHubClientFactory']]], + ['testcorrectplatform',['TestCorrectPlatform',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_platform_identifier.html#a201e8385b86f70b48a0518c165405af7',1,'Tgstation::Server::Host::Core::Tests::TestPlatformIdentifier']]], + ['testcreatebasicclient',['TestCreateBasicClient',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_git_hub_client_factory.html#aaa4e7d0fc93c9cefa1740e94f99f797f',1,'Tgstation::Server::Host::Core::Tests::TestGitHubClientFactory']]], + ['testcreatetokenclient',['TestCreateTokenClient',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_git_hub_client_factory.html#a22a84d4e879766eb8bbd3d189ce96dd6',1,'Tgstation::Server::Host::Core::Tests::TestGitHubClientFactory']]], + ['testcreatewatchdog',['TestCreateWatchdog',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog_factory.html#a7d6c9da1ecaa6e93ebe104c523d7e705',1,'Tgstation::Server::Host::Watchdog::Tests::TestWatchdogFactory']]], + ['testdatabasecontextfactory',['TestDatabaseContextFactory',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_database_context_factory.html',1,'Tgstation::Server::Host::Core::Tests']]], + ['testdatabasecontextfactory_2ecs',['TestDatabaseContextFactory.cs',['../_test_database_context_factory_8cs.html',1,'']]], + ['testdbconnectionfactory',['TestDBConnectionFactory',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_d_b_connection_factory.html',1,'Tgstation::Server::Host::Core::Tests']]], + ['testdbconnectionfactory_2ecs',['TestDBConnectionFactory.cs',['../_test_d_b_connection_factory_8cs.html',1,'']]], + ['testdelay',['TestDelay',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_async_delayer.html#ac2cad3312d896ef24eabb634cc530361',1,'Tgstation::Server::Host::Core::Tests::TestAsyncDelayer']]], + ['testdeletedirectory',['TestDeleteDirectory',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test.html#ae45683361822c5c2bec81a98f5efcfd4',1,'Tgstation::Server::Tests::Instance::ConfigurationTest']]], + ['testdeserializingbyondmodelswork',['TestDeserializingByondModelsWork',['../class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_api_client.html#ad9d319f434bbf6fe98cfdd7027ee46fe',1,'Tgstation::Server::Client::Tests::TestApiClient']]], + ['testdirectoryworks',['TestDirectoryWorks',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory.html#a45df2f421faf63b25335df35dcd4be86',1,'Tgstation::Server::Host::IO::Tests::TestSymlinkFactory']]], + ['testdiscordprovider',['TestDiscordProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests_1_1_test_discord_provider.html',1,'Tgstation::Server::Host::Components::Chat::Providers::Tests']]], + ['testdiscordprovider_2ecs',['TestDiscordProvider.cs',['../_test_discord_provider_8cs.html',1,'']]], + ['testdownload',['TestDownload',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests_1_1_test_posix_byond_installer.html#a561c149085259cc5056a7be7960cfbf8',1,'Tgstation::Server::Host::Components::Byond::Tests::TestPosixByondInstaller']]], + ['testdreamdaemonclient',['TestDreamDaemonClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests_1_1_test_dream_daemon_client.html',1,'Tgstation::Server::Client::Components::Tests']]], + ['testdreamdaemonclient_2ecs',['TestDreamDaemonClient.cs',['../_test_dream_daemon_client_8cs.html',1,'']]], + ['testexperimentalwatchdog',['TestExperimentalWatchdog',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests_1_1_test_experimental_watchdog.html',1,'Tgstation::Server::Host::Components::Watchdog::Tests']]], + ['testexperimentalwatchdog_2ecs',['TestExperimentalWatchdog.cs',['../_test_experimental_watchdog_8cs.html',1,'']]], + ['testfailsproperly',['TestFailsProperly',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory.html#af41f0fad922e6a596d6d6d6845ba4a41',1,'Tgstation::Server::Host::IO::Tests::TestSymlinkFactory']]], + ['testfileworks',['TestFileWorks',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory.html#a34acc752c1c06d894710b13475d960b6',1,'Tgstation::Server::Host::IO::Tests::TestSymlinkFactory']]], + ['testgetrightsgeneric',['TestGetRightsGeneric',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_tests_1_1_test_authentication_context.html#a23f7177f248769cb2c1c5c0c2bf0275e',1,'Tgstation::Server::Host::Security::Tests::TestAuthenticationContext']]], + ['testgithubclientfactory',['TestGitHubClientFactory',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_git_hub_client_factory.html',1,'Tgstation::Server::Host::Core::Tests']]], + ['testgithubclientfactory_2ecs',['TestGitHubClientFactory.cs',['../_test_git_hub_client_factory_8cs.html',1,'']]], + ['testingserver',['TestingServer',['../class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html',1,'Tgstation.Server.Tests.TestingServer'],['../class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html#af09b16bfab8645d880d43ee3281ddf15',1,'Tgstation.Server.Tests.TestingServer.TestingServer()']]], + ['testingserver_2ecs',['TestingServer.cs',['../_testing_server_8cs.html',1,'']]], + ['testinstall511',['TestInstall511',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html#a4f92da17917c57d69587ca11a12fcadd',1,'Tgstation::Server::Tests::Instance::ByondTest']]], + ['testinstallbyond',['TestInstallByond',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests_1_1_test_posix_byond_installer.html#ac7aa368eed3d5f40353e87e0394be17d',1,'Tgstation::Server::Host::Components::Byond::Tests::TestPosixByondInstaller']]], + ['testircconnectionstringbuilder',['TestIrcConnectionStringBuilder',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests_1_1_test_irc_connection_string_builder.html',1,'Tgstation::Server::Api::Models::Tests']]], + ['testircconnectionstringbuilder_2ecs',['TestIrcConnectionStringBuilder.cs',['../_test_irc_connection_string_builder_8cs.html',1,'']]], + ['testjob',['TestJob',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html#ad434a57ed477eb4bf2051429e29c25ca',1,'Tgstation::Server::Host::Core::Tests::TestJobHandler']]], + ['testjobexception',['TestJobException',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_exception.html',1,'Tgstation::Server::Host::Core::Tests']]], + ['testjobexception_2ecs',['TestJobException.cs',['../_test_job_exception_8cs.html',1,'']]], + ['testjobhandler',['TestJobHandler',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html',1,'Tgstation::Server::Host::Core::Tests']]], + ['testjobhandler_2ecs',['TestJobHandler.cs',['../_test_job_handler_8cs.html',1,'']]], + ['testmerge',['TestMerge',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge.html',1,'Tgstation.Server.Host.Components.Interop.TestMerge'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge.html',1,'Tgstation.Server.Api.Models.Internal.TestMerge'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html',1,'Tgstation.Server.Host.Models.TestMerge'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge.html',1,'Tgstation.Server.Api.Models.TestMerge'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_rev_info_test_merge.html#a76c0f83e9fc28eeefb8ed97592cd368b',1,'Tgstation.Server.Host.Models.RevInfoTestMerge.TestMerge()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge.html#ae3a6a4e2db1710eb3f1d17967aa3f5d2',1,'Tgstation.Server.Host.Components.Interop.TestMerge.TestMerge()']]], + ['testmerge_2ecs',['TestMerge.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_test_merge_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_api_2_models_2_test_merge_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_components_2_interop_2_test_merge_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_test_merge_8cs.html',1,'(Global Namespace)']]], + ['testmergebase',['TestMergeBase',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.html',1,'Tgstation.Server.Api.Models.Internal.TestMergeBase'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.html#aed82b2a4e5e83239f18657ff4a91b65f',1,'Tgstation.Server.Api.Models.Internal.TestMergeBase.TestMergeBase()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.html#a22e08f62b7a5647d905d8b0ce7f703bd',1,'Tgstation.Server.Api.Models.Internal.TestMergeBase.TestMergeBase(TestMergeBase copy)']]], + ['testmergebase_2ecs',['TestMergeBase.cs',['../_test_merge_base_8cs.html',1,'']]], + ['testmergeparameters',['TestMergeParameters',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters.html',1,'Tgstation::Server::Api::Models']]], + ['testmergeparameters_2ecs',['TestMergeParameters.cs',['../_test_merge_parameters_8cs.html',1,'']]], + ['testmerges',['TestMerges',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html#abb440678a4171fc2c42eb40486469a04',1,'Tgstation.Server.Host.Components.Interop.JsonFile.TestMerges()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a27e34b4cc5f4132d3cf69e0add4e61dd',1,'Tgstation.Server.Host.Models.DatabaseContext.TestMerges()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#a5f8f59f3f214e70074238431b914cbf4',1,'Tgstation.Server.Host.Models.User.TestMerges()']]], + ['testmethodthrows',['TestMethodThrows',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application.html#afca4b06950eef52231f8ca75d4f203dd',1,'Tgstation::Server::Host::Core::Tests::TestApplication']]], + ['testnoversion',['TestNoVersion',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html#ab431c20106e23ec16a217617e8c55d13',1,'Tgstation::Server::Tests::Instance::ByondTest']]], + ['testplatformidentifier',['TestPlatformIdentifier',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_platform_identifier.html',1,'Tgstation::Server::Host::Core::Tests']]], + ['testplatformidentifier_2ecs',['TestPlatformIdentifier.cs',['../_test_platform_identifier_8cs.html',1,'']]], + ['testposixbyondinstaller',['TestPosixByondInstaller',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests_1_1_test_posix_byond_installer.html',1,'Tgstation::Server::Host::Components::Byond::Tests']]], + ['testposixbyondinstaller_2ecs',['TestPosixByondInstaller.cs',['../_test_posix_byond_installer_8cs.html',1,'']]], + ['testpostwrite',['TestPostWrite',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_post_write_handler.html#a49252f0ad9761cfdfa3d5380bc85d4e6',1,'Tgstation::Server::Host::IO::Tests::TestPostWriteHandler']]], + ['testpostwritehandler',['TestPostWriteHandler',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_post_write_handler.html',1,'Tgstation::Server::Host::IO::Tests']]], + ['testpostwritehandler_2ecs',['TestPostWriteHandler.cs',['../_test_post_write_handler_8cs.html',1,'']]], + ['testprogram',['TestProgram',['../class_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests_1_1_test_program.html',1,'Tgstation::Server::Host::Console::Tests']]], + ['testprogram_2ecs',['TestProgram.cs',['../_test_program_8cs.html',1,'']]], + ['testprogramruns',['TestProgramRuns',['../class_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests_1_1_test_program.html#a56f5f5599724b738b11a6734900e18c4',1,'Tgstation::Server::Host::Console::Tests::TestProgram']]], + ['testprogress',['TestProgress',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html#a97e56bb94f5c3e45e4844400e7fdec11',1,'Tgstation::Server::Host::Core::Tests::TestJobHandler']]], + ['testread',['TestRead',['../class_tgstation_1_1_server_1_1_tests_1_1_administration_test.html#ae81f60b9e196bd90598f294dd45621f2',1,'Tgstation::Server::Tests::AdministrationTest']]], + ['testrights',['TestRights',['../class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests_1_1_test_rights.html',1,'Tgstation::Server::Api::Rights::Tests']]], + ['testrights_2ecs',['TestRights.cs',['../_test_rights_8cs.html',1,'']]], + ['testrootpath',['testRootPath',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test.html#aabc2c34fa46079ff3c922be055d30f4a',1,'Tgstation::Server::Tests::InstanceManagerTest']]], + ['testrun',['TestRun',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_tests_1_1_test_server_service.html#a3735824caa5b06bbcbab801947d747c6',1,'Tgstation::Server::Host::Service::Tests::TestServerService']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests.html',1,'Tgstation.Server.Api.Models.Tests'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests.html',1,'Tgstation.Server.Api.Rights.Tests'],['../namespace_tgstation_1_1_server_1_1_api_1_1_tests.html',1,'Tgstation.Server.Api.Tests'],['../namespace_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests.html',1,'Tgstation.Server.Client.Components.Tests'],['../namespace_tgstation_1_1_server_1_1_client_1_1_tests.html',1,'Tgstation.Server.Client.Tests'],['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests.html',1,'Tgstation.Server.Host.Components.Byond.Tests'],['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests.html',1,'Tgstation.Server.Host.Components.Chat.Providers.Tests'],['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests.html',1,'Tgstation.Server.Host.Components.Watchdog.Tests'],['../namespace_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests.html',1,'Tgstation.Server.Host.Console.Tests'],['../namespace_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests.html',1,'Tgstation.Server.Host.Core.Tests'],['../namespace_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests.html',1,'Tgstation.Server.Host.IO.Tests'],['../namespace_tgstation_1_1_server_1_1_host_1_1_security_1_1_tests.html',1,'Tgstation.Server.Host.Security.Tests'],['../namespace_tgstation_1_1_server_1_1_host_1_1_service_1_1_tests.html',1,'Tgstation.Server.Host.Service.Tests'],['../namespace_tgstation_1_1_server_1_1_host_1_1_tests.html',1,'Tgstation.Server.Host.Tests'],['../namespace_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests.html',1,'Tgstation.Server.Host.Watchdog.Tests'],['../namespace_tgstation_1_1_server_1_1_tests.html',1,'Tgstation.Server.Tests']]], + ['testserverclientfactory',['TestServerClientFactory',['../class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_server_client_factory.html',1,'Tgstation::Server::Client::Tests']]], + ['testserverclientfactory_2ecs',['TestServerClientFactory.cs',['../_test_server_client_factory_8cs.html',1,'']]], + ['testserverfactory',['TestServerFactory',['../class_tgstation_1_1_server_1_1_host_1_1_tests_1_1_test_server_factory.html',1,'Tgstation::Server::Host::Tests']]], + ['testserverfactory_2ecs',['TestServerFactory.cs',['../_test_server_factory_8cs.html',1,'']]], + ['testserverservice',['TestServerService',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_tests_1_1_test_server_service.html',1,'Tgstation::Server::Host::Service::Tests']]], + ['testserverservice_2ecs',['TestServerService.cs',['../_test_server_service_8cs.html',1,'']]], + ['testservicecollectionextensions',['TestServiceCollectionExtensions',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions.html',1,'Tgstation::Server::Host::Core::Tests']]], + ['testservicecollectionextensions_2ecs',['TestServiceCollectionExtensions.cs',['../_test_service_collection_extensions_8cs.html',1,'']]], + ['testsetupwizard',['TestSetupWizard',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_setup_wizard.html',1,'Tgstation::Server::Host::Core::Tests']]], + ['testsetupwizard_2ecs',['TestSetupWizard.cs',['../_test_setup_wizard_8cs.html',1,'']]], + ['teststandardoperation',['TestStandardOperation',['../class_tgstation_1_1_server_1_1_tests_1_1_integration_test.html#a430665ac0722fd7d7409cf370c581e4d',1,'Tgstation::Server::Tests::IntegrationTest']]], + ['teststart',['TestStart',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests_1_1_test_dream_daemon_client.html#af8b1c419d3fe1aa263d22dfee52e78be',1,'Tgstation::Server::Client::Components::Tests::TestDreamDaemonClient']]], + ['testsuccessfullaunchandshutdown',['TestSuccessfulLaunchAndShutdown',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests_1_1_test_experimental_watchdog.html#aca4a430168a5bf6dc6867c7ba572ac7f',1,'Tgstation::Server::Host::Components::Watchdog::Tests::TestExperimentalWatchdog']]], + ['testsymlinkfactory',['TestSymlinkFactory',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory.html',1,'Tgstation::Server::Host::IO::Tests']]], + ['testsymlinkfactory_2ecs',['TestSymlinkFactory.cs',['../_test_symlink_factory_8cs.html',1,'']]], + ['testthrowsonunix',['TestThrowsOnUnix',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_post_write_handler.html#a247091ba614a9111461e7c2d2fa48d01',1,'Tgstation::Server::Host::IO::Tests::TestPostWriteHandler']]], + ['testthrowswithnullarg',['TestThrowsWithNullArg',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_post_write_handler.html#af61e7d3fe02505140d16ec569b261758',1,'Tgstation::Server::Host::IO::Tests::TestPostWriteHandler']]], + ['testtoken1',['testToken1',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests_1_1_test_discord_provider.html#ad72eb96b430ebab407c6a72970e60ac5',1,'Tgstation::Server::Host::Components::Chat::Providers::Tests::TestDiscordProvider']]], + ['testunrecognizedresponse',['TestUnrecognizedResponse',['../class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_api_client.html#ad398fd0666210dbeb7522cc686ed5067',1,'Tgstation::Server::Client::Tests::TestApiClient']]], + ['testupdate',['TestUpdate',['../class_tgstation_1_1_server_1_1_tests_1_1_integration_test.html#a0eb292a245a9df4f7ca49ff01569fc82',1,'Tgstation::Server::Tests::IntegrationTest']]], + ['testuseragentsarevalid',['TestUserAgentsAreValid',['../class_tgstation_1_1_server_1_1_api_1_1_tests_1_1_test_api_headers.html#a724629cbd3495103aab68a8ae3952873',1,'Tgstation::Server::Api::Tests::TestApiHeaders']]], + ['testuserinteractive',['TestUserInteractive',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_console.html#a7071b079044cc63cc4f7c5425346309c',1,'Tgstation::Server::Host::IO::Tests::TestConsole']]], + ['testusestandardconfig',['TestUseStandardConfig',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions.html#a177d52de501159e5d37aaf9305808e87',1,'Tgstation::Server::Host::Core::Tests::TestServiceCollectionExtensions']]], + ['testwait',['TestWait',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html#ae660a3ee782b4145aed4faedb3e9c898',1,'Tgstation::Server::Host::Core::Tests::TestJobHandler']]], + ['testwatchdog',['TestWatchdog',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog.html',1,'Tgstation::Server::Host::Watchdog::Tests']]], + ['testwatchdog_2ecs',['TestWatchdog.cs',['../_test_watchdog_8cs.html',1,'']]], + ['testwatchdogfactory',['TestWatchdogFactory',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog_factory.html',1,'Tgstation::Server::Host::Watchdog::Tests']]], + ['testwatchdogfactory_2ecs',['TestWatchdogFactory.cs',['../_test_watchdog_factory_8cs.html',1,'']]], + ['testwithuserstupiditiy',['TestWithUserStupiditiy',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_setup_wizard.html#a0bead36d21a40362d823143bf0100a9b',1,'Tgstation::Server::Host::Core::Tests::TestSetupWizard']]], + ['testworks',['TestWorks',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_database_context_factory.html#a7073120c12c4009e52a7ca58c52fcc70',1,'Tgstation.Server.Host.Core.Tests.TestDatabaseContextFactory.TestWorks()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_d_b_connection_factory.html#aa6a66389ce5d8edbfc60c6c67a0ae5f5',1,'Tgstation.Server.Host.Core.Tests.TestDBConnectionFactory.TestWorks()']]], + ['testworkswithoutupdatepath',['TestWorksWithoutUpdatePath',['../class_tgstation_1_1_server_1_1_host_1_1_tests_1_1_test_server_factory.html#a1293756289f85e4d3c2dd36dfe67fe77',1,'Tgstation::Server::Host::Tests::TestServerFactory']]], + ['testworkswithupdatepath',['TestWorksWithUpdatePath',['../class_tgstation_1_1_server_1_1_host_1_1_tests_1_1_test_server_factory.html#a85be5368f83fa74e0c0438955f93ad27',1,'Tgstation::Server::Host::Tests::TestServerFactory']]], + ['testwriteline',['TestWriteLine',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_console.html#ab54ac67e46c7287fc64b07ff27d6d84a',1,'Tgstation::Server::Host::IO::Tests::TestConsole']]], + ['tgsauthorizeattribute',['TgsAuthorizeAttribute',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html#a71fd52c8f3c07624632ca72fa669aff9',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html#a56841444b636e471e28acb3fd7165372',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute(AdministrationRights requiredRights)'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html#a6103a7a1e759498a879c440554ed156e',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute(InstanceManagerRights requiredRights)'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html#a9bab142d724f39746e9b5cb3f11053eb',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute(RepositoryRights requiredRights)'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html#ab9d25ba7784171d98030af65820e31b9',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute(ByondRights requiredRights)'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html#a74a9510478d9a004288929247b99f59a',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute(DreamMakerRights requiredRights)'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html#ac602c75dd93d93f998119ede5a8a337b',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute(DreamDaemonRights requiredRights)'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html#ac4808ff26e27647d62338b4c55369bab',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute(ChatBotRights requiredRights)'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html#af81be6ff62cf941583825b5c7e8402c2',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute(ConfigurationRights requiredRights)'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html#a075e1a5a46146957800a8461f26aaab0',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute(InstanceUserRights requiredRights)']]], + ['tgsauthorizeattribute_2ecs',['TgsAuthorizeAttribute.cs',['../_tgs_authorize_attribute_8cs.html',1,'']]], + ['tgstation',['Tgstation',['../namespace_tgstation.html',1,'']]], + ['tgstation_2eserver_2eapi_2eassemblyinfo_2ecs',['Tgstation.Server.Api.AssemblyInfo.cs',['../_tgstation_8_server_8_api_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2eapi_2etests_2eassemblyinfo_2ecs',['Tgstation.Server.Api.Tests.AssemblyInfo.cs',['../_tgstation_8_server_8_api_8_tests_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2eapi_2etests_2eprogram_2ecs',['Tgstation.Server.Api.Tests.Program.cs',['../_tgstation_8_server_8_api_8_tests_8_program_8cs.html',1,'']]], + ['tgstation_2eserver_2eclient_2eassemblyinfo_2ecs',['Tgstation.Server.Client.AssemblyInfo.cs',['../_tgstation_8_server_8_client_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2eclient_2etests_2eassemblyinfo_2ecs',['Tgstation.Server.Client.Tests.AssemblyInfo.cs',['../_tgstation_8_server_8_client_8_tests_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2eclient_2etests_2eprogram_2ecs',['Tgstation.Server.Client.Tests.Program.cs',['../_tgstation_8_server_8_client_8_tests_8_program_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2eassemblyinfo_2ecs',['Tgstation.Server.Host.AssemblyInfo.cs',['../_tgstation_8_server_8_host_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2econsole_2eassemblyinfo_2ecs',['Tgstation.Server.Host.Console.AssemblyInfo.cs',['../_tgstation_8_server_8_host_8_console_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2econsole_2etests_2eassemblyinfo_2ecs',['Tgstation.Server.Host.Console.Tests.AssemblyInfo.cs',['../_tgstation_8_server_8_host_8_console_8_tests_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2econsole_2etests_2eprogram_2ecs',['Tgstation.Server.Host.Console.Tests.Program.cs',['../_tgstation_8_server_8_host_8_console_8_tests_8_program_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2erazorassemblyinfo_2ecs',['Tgstation.Server.Host.RazorAssemblyInfo.cs',['../_tgstation_8_server_8_host_8_razor_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2eservice_2eassemblyinfo_2ecs',['Tgstation.Server.Host.Service.AssemblyInfo.cs',['../_tgstation_8_server_8_host_8_service_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2eservice_2etests_2eassemblyinfo_2ecs',['Tgstation.Server.Host.Service.Tests.AssemblyInfo.cs',['../_tgstation_8_server_8_host_8_service_8_tests_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2etests_2eassemblyinfo_2ecs',['Tgstation.Server.Host.Tests.AssemblyInfo.cs',['../_tgstation_8_server_8_host_8_tests_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2etests_2eprogram_2ecs',['Tgstation.Server.Host.Tests.Program.cs',['../_tgstation_8_server_8_host_8_tests_8_program_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2ewatchdog_2eassemblyinfo_2ecs',['Tgstation.Server.Host.Watchdog.AssemblyInfo.cs',['../_tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2ewatchdog_2etests_2eassemblyinfo_2ecs',['Tgstation.Server.Host.Watchdog.Tests.AssemblyInfo.cs',['../_tgstation_8_server_8_host_8_watchdog_8_tests_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2ewatchdog_2etests_2eprogram_2ecs',['Tgstation.Server.Host.Watchdog.Tests.Program.cs',['../_tgstation_8_server_8_host_8_watchdog_8_tests_8_program_8cs.html',1,'']]], + ['tgstation_2eserver_2etests_2eassemblyinfo_2ecs',['Tgstation.Server.Tests.AssemblyInfo.cs',['../_tgstation_8_server_8_tests_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2etests_2eprogram_2ecs',['Tgstation.Server.Tests.Program.cs',['../_tgstation_8_server_8_tests_8_program_8cs.html',1,'']]], + ['timemerged',['TimeMerged',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge.html#a4c3d6b3f0d31bf6bd90efafab77ce4b7',1,'Tgstation::Server::Host::Components::Interop::TestMerge']]], + ['timeout',['Timeout',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a015e61f9e9728ad9b47c175445ea67a1',1,'Tgstation.Server.Client.ApiClient.Timeout()'],['../class_tgstation_1_1_server_1_1_client_1_1_http_client.html#a1c5eb3e376e012d3ca08caf71b009a22',1,'Tgstation.Server.Client.HttpClient.Timeout()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a92b092701f159c344a3c78be34161ecf',1,'Tgstation.Server.Client.IApiClient.Timeout()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_http_client.html#ad27a406c0398b4824889a0020ee291aa',1,'Tgstation.Server.Client.IHttpClient.Timeout()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html#aa1c1488dd8438023b24c87a32e09d5fe',1,'Tgstation.Server.Client.IServerClient.Timeout()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a7d3be56a549f9aedb631bb3824dd5790',1,'Tgstation.Server.Client.ServerClient.Timeout()']]], + ['timeoutseconds',['TimeoutSeconds',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a6b7d2a57ba6340f51694987653033677',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]], + ['timercts',['timerCts',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#aab6ba11c7820ee9de39771aabbecdfcb',1,'Tgstation::Server::Host::Components::Instance']]], + ['timerloop',['TimerLoop',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#afb736b47a7400fb861186b8dad1c4c4c',1,'Tgstation::Server::Host::Components::Instance']]], + ['timertask',['timerTask',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#abf825c028f20cd903db1362892dbd833',1,'Tgstation::Server::Host::Components::Instance']]], + ['titleatmerge',['TitleAtMerge',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.html#a959c2922c726be725daac329f9b21e46',1,'Tgstation::Server::Api::Models::Internal::TestMergeBase']]], + ['toapi',['ToApi',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.html#ac6049a16c80f49d1503935589a5e0042',1,'Tgstation.Server.Host.Models.ChatBot.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.html#a01525688d871d70d1ab28cdda6083011',1,'Tgstation.Server.Host.Models.ChatChannel.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.html#a64a9fc0f8da344e311b5b754eec10611',1,'Tgstation.Server.Host.Models.CompileJob.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html#ab477e13756ea540790df3e245e17173b',1,'Tgstation.Server.Host.Models.DreamMakerSettings.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a169bffb644b7ff7c3686c29373f662c1',1,'Tgstation.Server.Host.Models.Instance.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.html#aad0b6b9eaf0b0a9462987564aa254b68',1,'Tgstation.Server.Host.Models.InstanceUser.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html#aaea7f482968921045b73cbdaca4dd652',1,'Tgstation.Server.Host.Models.Job.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html#acff6370af1842c659c6f8ecb85dd0ea3',1,'Tgstation.Server.Host.Models.RepositorySettings.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html#a8e6f5b4375c0594f10c413c4119515b1',1,'Tgstation.Server.Host.Models.RevisionInformation.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html#ac2943458d2fc3077a6684408fb26ab09',1,'Tgstation.Server.Host.Models.TestMerge.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#a8effbd8cd0ce7ba4c72f40efc08a9b50',1,'Tgstation.Server.Host.Models.User.ToApi(bool recursive, bool showDetails)'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#a1d6fee3f42a73a1505d6d0d12d68b3d9',1,'Tgstation.Server.Host.Models.User.ToApi(bool showDetails)']]], + ['token',['Token',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_token.html',1,'Tgstation.Server.Api.Models.Token'],['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a6a6105b1f7b3dafd096e5e11057aac8d',1,'Tgstation.Server.Api.ApiHeaders.Token()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html#ab3363ffdb533616bd2b6688559f9def1',1,'Tgstation.Server.Client.IServerClient.Token()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a9c54c9b21bfad615f275484dafc6decc',1,'Tgstation.Server.Client.ServerClient.Token()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a7137670591717642aa084370ed40377e',1,'Tgstation.Server.Client.ServerClient.token()']]], + ['token_2ecs',['Token.cs',['../_token_8cs.html',1,'']]], + ['tokenclockskewminutes',['TokenClockSkewMinutes',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html#abbf0169740f418e6ffd4f8c783fdff50',1,'Tgstation::Server::Host::Security::TokenFactory']]], + ['tokenexpiryminutes',['TokenExpiryMinutes',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html#a0cea7772b1f5107da73c23e821e76b43',1,'Tgstation::Server::Host::Security::TokenFactory']]], + ['tokenfactory',['TokenFactory',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html',1,'Tgstation.Server.Host.Security.TokenFactory'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#afd05899e85f5a8a6b8c8e374364872f8',1,'Tgstation.Server.Host.Controllers.HomeController.tokenFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#a93cb446fc8d8f84ea595abe709265398',1,'Tgstation.Server.Host.Core.Application.tokenFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html#a2d4cbeccfd89360632899db93d7068db',1,'Tgstation.Server.Host.Security.TokenFactory.TokenFactory()']]], + ['tokenfactory_2ecs',['TokenFactory.cs',['../_token_factory_8cs.html',1,'']]], + ['tokensigningkeybyteamount',['TokenSigningKeyByteAmount',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html#a1daafa97f229b3c342725fba60505b0f',1,'Tgstation::Server::Host::Security::TokenFactory']]], + ['tostring',['ToString',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder.html#a659884baa91d2aa0072ccd9da844cc1e',1,'Tgstation.Server.Api.Models.DiscordConnectionStringBuilder.ToString()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_connection_string_builder.html#aeeb97f3f4f9cc635eaa55b2e9c81ad84',1,'Tgstation.Server.Api.Models.Internal.ChatConnectionStringBuilder.ToString()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#ac2a182244a480865e560b06da8c4a152',1,'Tgstation.Server.Api.Models.IrcConnectionStringBuilder.ToString()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_launch_result.html#aae5510a59e489f095a6b7cad6cdc57ce',1,'Tgstation.Server.Host.Components.Watchdog.LaunchResult.ToString()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information.html#aad03e1fa87892c0d1e0f72ddfb5a03fe',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.ToString()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html#a16ccfcf72481ac33f4a2a2a22cb7b135',1,'Tgstation.Server.Host.Models.ReattachInformationBase.ToString()']]], + ['totaldmeoverwrite',['TotalDmeOverwrite',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_server_side_modifications.html#ac81394b6c071d9779ab94c8151281723',1,'Tgstation::Server::Host::Components::StaticFiles::ServerSideModifications']]], + ['trace',['Trace',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html#a5d7201b8cfa09c341ec68d81297aabad',1,'Tgstation::Server::Host::Service::Program']]], + ['trackedrepositoryurl',['TrackedRepositoryUrl',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_administration.html#afd9c90cc8b192e20ab018d56c08fcbea',1,'Tgstation::Server::Api::Models::Administration']]], + ['tracking',['Tracking',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#a422e7c7f5d5ac88a75693311521b5d6a',1,'Tgstation.Server.Host.Components.Repository.IRepository.Tracking()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a4a27a5627052f0463fd42c7d3fd569a6',1,'Tgstation.Server.Host.Components.Repository.Repository.Tracking()']]], + ['trackingcontexts',['trackingContexts',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a2b6985d081d60f264709544cd6055ccf',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['trackjsons',['TrackJsons',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a20ab0796f379427bc6c9e0d1a03e9688',1,'Tgstation.Server.Host.Components.Chat.Chat.TrackJsons()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html#a874403376118d4cfcf9ca78d277be9a3',1,'Tgstation.Server.Host.Components.Chat.IChat.TrackJsons()']]], + ['trusted',['Trusted',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ad4850e6b78816679602b13d63d2869b5ac0405d71f21e769c787a10b9620f11ea',1,'Tgstation::Server::Api::Models']]], + ['type',['Type',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_event_notification.html#a20c514ac2837bebd05982a5bfa9f8f73',1,'Tgstation::Server::Host::Components::Interop::EventNotification']]], + ['typemap',['TypeMap',['../class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper.html#a0639f64451959386f79762cb8586b4f0',1,'Tgstation::Server::Api::Rights::RightsHelper']]], + ['watchdog',['Watchdog',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html',1,'Tgstation.Server.Host.Components.Watchdog'],['../namespace_tgstation_1_1_server_1_1_host_1_1_watchdog.html',1,'Tgstation.Server.Host.Watchdog']]] +]; diff --git a/search/all_15.html b/search/all_15.html new file mode 100644 index 0000000000..c0fc0aab70 --- /dev/null +++ b/search/all_15.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_15.js b/search/all_15.js new file mode 100644 index 0000000000..13604ac5e3 --- /dev/null +++ b/search/all_15.js @@ -0,0 +1,47 @@ +var searchData= +[ + ['uid',['Uid',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity.html#a21339e0b4c3d045ba30c6ac6ea15aa4f',1,'Tgstation.Server.Host.Security.ISystemIdentity.Uid()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html#a5335d4436713401b2872d14752f1ba7b',1,'Tgstation.Server.Host.Security.WindowsSystemIdentity.Uid()']]], + ['ultrasafe',['Ultrasafe',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ad4850e6b78816679602b13d63d2869b5a380d297f2cbdccba869676c96bd38bc1',1,'Tgstation::Server::Api::Models']]], + ['unaskedvalidationrequest',['UnaskedValidationRequest',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#af7163ca98f9f5e5c731043ecdace3745a4b42bf5b19925da0a8866a1dfdc33ffd',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['unauthorizedexception',['UnauthorizedException',['../class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception.html',1,'Tgstation.Server.Client.UnauthorizedException'],['../class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception.html#ade207842b48576c6f0fb5f4ee0ef326e',1,'Tgstation.Server.Client.UnauthorizedException.UnauthorizedException()'],['../class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception.html#ab5b729c4ff826ad5fdd574db0942b8f7',1,'Tgstation.Server.Client.UnauthorizedException.UnauthorizedException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception.html#af481bddb4a0e255b1430b6e9f4b62a7e',1,'Tgstation.Server.Client.UnauthorizedException.UnauthorizedException(string message, Exception innerException)']]], + ['unauthorizedexception_2ecs',['UnauthorizedException.cs',['../_unauthorized_exception_8cs.html',1,'']]], + ['uninstall',['Uninstall',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html#a6868da29a3857b56bba33e5d7c623b68',1,'Tgstation::Server::Host::Service::Program']]], + ['unknownreference',['UnknownReference',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#ad02f759b45e4f20dfee55cfbf3f78baa',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['unrecognizedresponseexception',['UnrecognizedResponseException',['../class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html',1,'Tgstation.Server.Client.UnrecognizedResponseException'],['../class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html#af774506fc563e92696b477d71ab16ab4',1,'Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException(string data, HttpStatusCode statusCode)'],['../class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html#ada8a7b87eb9de50dd5b9e43b749ab1be',1,'Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException()'],['../class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html#a783856ad9431193f65c6b76381fb9990',1,'Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html#a299e46f1692182ca4c908d6bed931e00',1,'Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException(string message, Exception innerException)']]], + ['unrecognizedresponseexception_2ecs',['UnrecognizedResponseException.cs',['../_unrecognized_response_exception_8cs.html',1,'']]], + ['up',['Up',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html#a46e535f1b0e37230f3ae9ae2d4768719',1,'Tgstation.Server.Host.Models.Migrations.MSInitialCreate.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html#a61031d082139e9125a4ccea487d10b45',1,'Tgstation.Server.Host.Models.Migrations.MYInitialCreate.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html#afb9883f3d1ddba5f19b2b75fc92da518',1,'Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html#a277da60ba33c15814a36a2465b3a46b0',1,'Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html#aa138d5c7f89f8de85085a95492cc2fb1',1,'Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html#afedd51b63ec46e82a644d88f4655ab02',1,'Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html#a55bccf5330ee9028dcbc7545f86e81a2',1,'Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html#a911c174c70a661a00dd36c55a246649a',1,'Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.html#a8ada361967d2d91205c1c30e967972c1',1,'Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.html#a15e679e5293d3ee883366254eb384835',1,'Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_fix_rev_info_index.html#a49e73096e347803d39c81a192ffdc49e',1,'Tgstation.Server.Host.Models.Migrations.MSFixRevInfoIndex.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_fix_rev_info_index.html#a155983a13b0c593fd68e2313a42dcda9',1,'Tgstation.Server.Host.Models.Migrations.MYFixRevInfoIndex.Up()']]], + ['update',['Update',['../class_tgstation_1_1_server_1_1_client_1_1_administration_client.html#a43842f5f15ef0b33c5450accdb18609f',1,'Tgstation.Server.Client.AdministrationClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#a8f60027fc85212c9b35249cccc88d1e3',1,'Tgstation.Server.Client.Components.ChatBotsClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#a1bc64b3c8ac57f22694751cccf580f90',1,'Tgstation.Server.Client.Components.DreamDaemonClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#ae428fd6c9fad6e1d019b3ded7579c0b5',1,'Tgstation.Server.Client.Components.DreamMakerClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html#ab2356151d04b5f17d797b22dc82c6354',1,'Tgstation.Server.Client.Components.IChatBotsClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html#a9cc6c3e2db7c4491f00ff9347acfe634',1,'Tgstation.Server.Client.Components.IDreamDaemonClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html#a328b3fb9bebf37474ab554894b43eb54',1,'Tgstation.Server.Client.Components.IDreamMakerClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html#a96063a725f2be7f6891ab46e66e7006b',1,'Tgstation.Server.Client.Components.IInstanceUserClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#adf513d69fe64d03119446eba42df5250',1,'Tgstation.Server.Client.Components.InstanceUserClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.html#a24995226be87730e9b7d49d6c53f5b2c',1,'Tgstation.Server.Client.Components.IRepositoryClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#a718c5e27cfe0ddbfcc9c0746ec16a6e0',1,'Tgstation.Server.Client.Components.RepositoryClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client.html#a666df801432630c494c916d35834a38b',1,'Tgstation.Server.Client.IAdministrationClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html#a337b3e0676570d2ba2928b0d2cef5595',1,'Tgstation.Server.Client.IInstanceManagerClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#aed0303f71e96db6fa88fc10cdfb196d3',1,'Tgstation.Server.Client.InstanceManagerClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.html#aecbd14842867cfdce083b793f91ab14e',1,'Tgstation.Server.Client.IUsersClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#a89d2d761849b9b8f2932920841d996e1',1,'Tgstation.Server.Client.UsersClient.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#a40caa3e1b29a3de1e7e7a4e131ca9f2d',1,'Tgstation.Server.Host.Controllers.AdministrationController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html#ad07b67c1ae0820a03abf7298a84a7c2a',1,'Tgstation.Server.Host.Controllers.ByondController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html#a89f50a9a23fd57a4bfcec0334a1b185f',1,'Tgstation.Server.Host.Controllers.ChatController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#a491c50407160ee87a06015b9d096cb8f',1,'Tgstation.Server.Host.Controllers.ConfigurationController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#a8cee89ced886340c58a9345cf2e7ad78',1,'Tgstation.Server.Host.Controllers.DreamDaemonController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html#af08a424065abb1a672b1349839136a5d',1,'Tgstation.Server.Host.Controllers.DreamMakerController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a813ab8ed0c6ef7ad5af02f70e899add1',1,'Tgstation.Server.Host.Controllers.InstanceController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html#a565dd9da819ea79d6c1de133877cd8dd',1,'Tgstation.Server.Host.Controllers.InstanceUserController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html#a2bc81566ec1a9690d2feabf1a7dec0d4',1,'Tgstation.Server.Host.Controllers.ModelController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#a49f03b0091b65ab1fa7349d2b65a8b22',1,'Tgstation.Server.Host.Controllers.RepositoryController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#a96e07e4cf2101eeaba70987a9e03600b',1,'Tgstation.Server.Host.Controllers.UserController.Update()']]], + ['update_3c_20tbody_20_3e',['Update< TBody >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a92a748d5262e33c6ece011016d780c35',1,'Tgstation.Server.Client.ApiClient.Update< TBody >()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a036ef64cf33e776c9042fa59aecbc9ba',1,'Tgstation.Server.Client.IApiClient.Update< TBody >()']]], + ['update_3c_20tbody_2c_20tresult_20_3e',['Update< TBody, TResult >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#aeba489d6ab822da7fe59b46cf0cb2ad4',1,'Tgstation.Server.Client.ApiClient.Update< TBody, TResult >(string route, TBody body, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a7c36add8f2943a7505b20213322be406',1,'Tgstation.Server.Client.ApiClient.Update< TBody, TResult >(string route, TBody body, long instanceId, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a1573e017176db0b603a72944c5373e12',1,'Tgstation.Server.Client.IApiClient.Update< TBody, TResult >(string route, TBody body, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#aed63658d4aa92fc6c6860bab59bb1b2d',1,'Tgstation.Server.Client.IApiClient.Update< TBody, TResult >(string route, TBody body, long instanceId, CancellationToken cancellationToken)']]], + ['update_3c_20tresult_20_3e',['Update< TResult >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#afe91cd24b8b838c9e80e8165c393502c',1,'Tgstation.Server.Client.ApiClient.Update< TResult >()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a2c07a344cb71a5194c90be0b7d71c0bf',1,'Tgstation.Server.Client.IApiClient.Update< TResult >()']]], + ['updatebranch',['UpdateBranch',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39a31df5784b56922c3559917d3286fcac3',1,'Tgstation::Server::Api::Rights']]], + ['updatefromorigin',['UpdateFromOrigin',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html#ac917f08ca0b2f81b49544a1b7b9d3757',1,'Tgstation::Server::Api::Models::Repository']]], + ['updatepackageassetname',['UpdatePackageAssetName',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html#a7f5697f355392923d10aa77a8e94dc91',1,'Tgstation::Server::Host::Configuration::UpdatesConfiguration']]], + ['updatepath',['updatePath',['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a4e10711e91a3025a08ab98e9024e90ad',1,'Tgstation::Server::Host::Server']]], + ['updatesconfiguration',['UpdatesConfiguration',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html',1,'Tgstation.Server.Host.Configuration.UpdatesConfiguration'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#afa09210575a84b625e234e7e0b19fa08',1,'Tgstation.Server.Host.Controllers.AdministrationController.updatesConfiguration()']]], + ['updatesconfiguration_2ecs',['UpdatesConfiguration.cs',['../_updates_configuration_8cs.html',1,'']]], + ['updating',['updating',['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a3a4cc72abe0c0a1e8caddeab4a210324',1,'Tgstation::Server::Host::Server']]], + ['url',['Url',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.html#ab40be7f3d663eaea7b465ca203957629',1,'Tgstation.Server.Api.Models.Internal.TestMergeBase.Url()'],['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a33675bc7469cf1e0dd8f1a21dbaa71a2',1,'Tgstation.Server.Client.ApiClient.Url()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a0efbf73e1dfbee520ceafa593ee2ec51',1,'Tgstation.Server.Client.IApiClient.Url()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html#a2c34434ebb4af540cbd3ec67fc116396',1,'Tgstation.Server.Client.IServerClient.Url()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a7dcb54f317c73bd5a54f7856f0ef79fc',1,'Tgstation.Server.Client.ServerClient.Url()'],['../class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html#ae3c1967267a99741f85146f0cca92a0f',1,'Tgstation.Server.Tests.TestingServer.Url()']]], + ['usecancelledrequestsuppression',['UseCancelledRequestSuppression',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application_builder_extensions.html#a0c686b1b50f2678e17eada51a8149dd1',1,'Tgstation::Server::Host::Core::ApplicationBuilderExtensions']]], + ['usecontext',['UseContext',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_database_context_factory.html#a070ab00030c7e39c32bc4da58df7f114',1,'Tgstation.Server.Host.Core.DatabaseContextFactory.UseContext()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_database_context_factory.html#a80fb6478df6bf246d703cd80f920eabd',1,'Tgstation.Server.Host.Core.IDatabaseContextFactory.UseContext()']]], + ['usedbconflicthandling',['UseDbConflictHandling',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application_builder_extensions.html#aca3ed141beb5a8e4d82767043f87ff67',1,'Tgstation::Server::Host::Core::ApplicationBuilderExtensions']]], + ['useexecutables',['UseExecutables',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a3767b16e9f00578e385dcca6b7e6b816',1,'Tgstation.Server.Host.Components.Byond.ByondManager.UseExecutables()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_manager.html#ae897f63dc75160c7378292be017a50b1',1,'Tgstation.Server.Host.Components.Byond.IByondManager.UseExecutables()']]], + ['useexperimentalwatchdog',['UseExperimentalWatchdog',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html#aba344f151bae43f8f48c4c8ca2f483f7',1,'Tgstation::Server::Host::Configuration::GeneralConfiguration']]], + ['usemysqlmigrations',['UseMySQLMigrations',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a1ee865fd988335db6c17c69af5fdfae2',1,'Tgstation.Server.Host.Models.DatabaseContext.UseMySQLMigrations()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_my_sql_database_context.html#a0a0f59db7bff22ff20ce4a9490d9848d',1,'Tgstation.Server.Host.Models.MySqlDatabaseContext.UseMySQLMigrations()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context.html#a01267b79be35689bff79854ebcbfcdee',1,'Tgstation.Server.Host.Models.SqlServerDatabaseContext.UseMySQLMigrations()']]], + ['user',['User',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user.html',1,'Tgstation.Server.Host.Components.Chat.User'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html',1,'Tgstation.Server.Api.Models.Internal.User'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user.html',1,'Tgstation.Server.Api.Models.User'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html',1,'Tgstation.Server.Host.Models.User'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a12784e8b5b7ac25c0684c9d4c7c59178',1,'Tgstation.Server.Api.Routes.User()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_message.html#a0a9daf5887cdd378b7c0a1997c037f4c',1,'Tgstation.Server.Host.Components.Chat.Providers.Message.User()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_command.html#a2d336aec28cd11a3c07d11e506f91026',1,'Tgstation.Server.Host.Components.Interop.ChatCommand.User()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a0846ac9679599a99923987863edb0d5c',1,'Tgstation.Server.Host.Security.AuthenticationContext.User()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context.html#ae2e7c0c04d2797b9a24a9776277ec77b',1,'Tgstation.Server.Host.Security.IAuthenticationContext.User()'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#ac78f83e6537e2744d0e746646c553db9',1,'Tgstation.Server.Client.UsersClient.User(Routes.User, user ?? throw new ArgumentNullException(nameof(user)), cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#ac78f83e6537e2744d0e746646c553db9',1,'Tgstation.Server.Client.UsersClient.User(Routes.User, user ?? throw new ArgumentNullException(nameof(user)), cancellationToken)']]], + ['user_2ecs',['User.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_user_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_api_2_models_2_user_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_components_2_chat_2_user_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_user_8cs.html',1,'(Global Namespace)']]], + ['useragent',['UserAgent',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a344ee837192b944640d63d1070ba4f2d',1,'Tgstation::Server::Api::ApiHeaders']]], + ['usercontroller',['UserController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html',1,'Tgstation.Server.Host.Controllers.UserController'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#a972194803b6ad32f7be555b9ea93e961',1,'Tgstation.Server.Host.Controllers.UserController.UserController()']]], + ['usercontroller_2ecs',['UserController.cs',['../_user_controller_8cs.html',1,'']]], + ['userid',['UserId',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html#a0b6e52341908af31f36b90ef2d2c89d6',1,'Tgstation::Server::Api::Models::InstanceUser']]], + ['username',['Username',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a13fe189bd2726abf51f2aefa06c08383',1,'Tgstation.Server.Api.ApiHeaders.Username()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity.html#abdae9176f2609703ff36c43d7af97ac1',1,'Tgstation.Server.Host.Security.ISystemIdentity.Username()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html#a7bbd8a3a43a6a2864b3348ae7f9438b9',1,'Tgstation.Server.Host.Security.WindowsSystemIdentity.Username()']]], + ['usernameheader',['UsernameHeader',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#aeb78db4fde83cb73bbad383ccb1b71f1',1,'Tgstation::Server::Api::ApiHeaders']]], + ['userprincipal',['userPrincipal',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html#abf93d22395acd37f9c24aee156691f7a',1,'Tgstation::Server::Host::Security::WindowsSystemIdentity']]], + ['users',['Users',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#acbd79ed6748d8aac0bd0500c01b419ac',1,'Tgstation.Server.Client.Components.IInstanceClient.Users()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a2a01eeaccf183e928f6f50ebb60abdad',1,'Tgstation.Server.Client.Components.InstanceClient.Users()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html#a9c807f862e80f400477c6783910276ee',1,'Tgstation.Server.Client.IServerClient.Users()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a6794b452542c1ee7c38c573e67e6aa83',1,'Tgstation.Server.Client.ServerClient.Users()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#af74e4382b325c0d59886999807b52395',1,'Tgstation.Server.Host.Models.DatabaseContext.Users()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#aab8bdb09db7cd1273541845190a83630',1,'Tgstation.Server.Host.Models.IDatabaseContext.Users()']]], + ['usersclient',['UsersClient',['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html',1,'Tgstation.Server.Client.UsersClient'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#aa7e771fad86b68de8483944e9f34a88e',1,'Tgstation.Server.Client.UsersClient.UsersClient()']]], + ['usersclient_2ecs',['UsersClient.cs',['../_users_client_8cs.html',1,'']]], + ['userupdate',['UserUpdate',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user_update.html',1,'Tgstation::Server::Api::Models']]], + ['userupdate_2ecs',['UserUpdate.cs',['../_user_update_8cs.html',1,'']]], + ['usessl',['UseSsl',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#a8965e74ecabbb3c26693d2a1885dabc3',1,'Tgstation::Server::Api::Models::IrcConnectionStringBuilder']]], + ['usestandardconfig_3c_20tconfig_20_3e',['UseStandardConfig< TConfig >',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_service_collection_extensions.html#aaaeb4b719a842807644dd84a49102ec2',1,'Tgstation::Server::Host::Core::ServiceCollectionExtensions']]] +]; diff --git a/search/all_16.html b/search/all_16.html new file mode 100644 index 0000000000..1490057c31 --- /dev/null +++ b/search/all_16.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_16.js b/search/all_16.js new file mode 100644 index 0000000000..c2c58ff811 --- /dev/null +++ b/search/all_16.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['valid',['Valid',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder.html#adcfa84ac7eac02c297c7560df41d24a2',1,'Tgstation.Server.Api.Models.DiscordConnectionStringBuilder.Valid()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_connection_string_builder.html#a9b8292cc2ffeb79aa55013c6d8a617d7',1,'Tgstation.Server.Api.Models.Internal.ChatConnectionStringBuilder.Valid()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#a01ca8188cc4ec75b5bd47a8253aca0da',1,'Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Valid()']]], + ['validateconfigrelativepath',['ValidateConfigRelativePath',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a3947ddcc7baa1a6c536a0db65766c7cb',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]], + ['validateproviderchanneltypes',['ValidateProviderChannelTypes',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_bot.html#a8f3524dcce53f320de9b210334928a06',1,'Tgstation::Server::Api::Models::ChatBot']]], + ['validationparameters',['ValidationParameters',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_token_factory.html#a46e66985719064cffa8b569830a3712f',1,'Tgstation.Server.Host.Security.ITokenFactory.ValidationParameters()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html#a1fe6c5c282b5db5a2a61a5417e634ed8',1,'Tgstation.Server.Host.Security.TokenFactory.ValidationParameters()']]], + ['verifyapi',['VerifyApi',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a6b1b0acd68c4d63979ed353ba14aea34',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['version',['Version',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a6b7e4d4ae426467f9d10844d43d35874',1,'Tgstation.Server.Api.ApiHeaders.Version()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_byond.html#a5d513e13dc23477c3ef1ce64610bfee3',1,'Tgstation.Server.Api.Models.Byond.Version()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_server_information.html#a9818626b94b820a7b1188c1647bbd633',1,'Tgstation.Server.Api.Models.ServerInformation.Version()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.html#ac7e7961155c2d7c0e08be2d7320e45da',1,'Tgstation.Server.Host.Components.Byond.ByondExecutableLock.Version()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock.html#aaef823795dc654725e448b487fefd9ac',1,'Tgstation.Server.Host.Components.Byond.IByondExecutableLock.Version()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#a02e77eeca07a0002d69e5a225825d94a',1,'Tgstation.Server.Host.Core.Application.Version()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_application.html#adef1cd4ff4ee24d521761279ae2ba591',1,'Tgstation.Server.Host.Core.IApplication.Version()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html#a3bebba1e2658a94424e66713bf1085c4',1,'Tgstation.Server.Client.IServerClient.Version()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a8c853236fdd5679440d5ba7a1289012e',1,'Tgstation.Server.Client.ServerClient.Version()']]], + ['versioncommand',['VersionCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.html',1,'Tgstation.Server.Host.Components.Chat.Commands.VersionCommand'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.html#a61bbb0ce50b6f9cf1a1925596adfb294',1,'Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.VersionCommand()']]], + ['versioncommand_2ecs',['VersionCommand.cs',['../_version_command_8cs.html',1,'']]], + ['versionfilename',['VersionFileName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#acb1d6dfeac5bf1c13e9857dcac03be46',1,'Tgstation::Server::Host::Components::Byond::ByondManager']]], + ['versionkey',['VersionKey',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a02c588c08d51d013fa4e6c5258478352',1,'Tgstation::Server::Host::Components::Byond::ByondManager']]], + ['versionprefix',['VersionPrefix',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#afb6962fb7f4a84f548dc77dd797d39c9',1,'Tgstation.Server.Host.Core.Application.VersionPrefix()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_application.html#ac450d182d713644c27492aebc0ab7739',1,'Tgstation.Server.Host.Core.IApplication.VersionPrefix()']]], + ['versionstring',['VersionString',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#a7659daf7ba8411a369c29cde8660d219',1,'Tgstation.Server.Host.Core.Application.VersionString()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_application.html#a4b9b6cc8befd7b1696bc18bf2d5b4d64',1,'Tgstation.Server.Host.Core.IApplication.VersionString()']]] +]; diff --git a/search/all_17.html b/search/all_17.html new file mode 100644 index 0000000000..a364f6fa76 --- /dev/null +++ b/search/all_17.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_17.js b/search/all_17.js new file mode 100644 index 0000000000..bcd88bab64 --- /dev/null +++ b/search/all_17.js @@ -0,0 +1,45 @@ +var searchData= +[ + ['wait',['Wait',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html#a8139e340599a1bb5d3c0862c20072835',1,'Tgstation::Server::Host::Core::JobHandler']]], + ['waitforjobcompletion',['WaitForJobCompletion',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager.html#aa07b23b3ce401447337f4b026c34a77d',1,'Tgstation.Server.Host.Core.IJobManager.WaitForJobCompletion()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a63a8e2fe5a07e8e8c040e555a5d13d4d',1,'Tgstation.Server.Host.Core.JobManager.WaitForJobCompletion()']]], + ['watchdog',['Watchdog',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html',1,'Tgstation.Server.Host.Watchdog.Watchdog'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html#ae03ea9eb9252aed389443f3bc038cfb2',1,'Tgstation.Server.Host.Components.IInstance.Watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a902e9a3917553cae8ec372948e98d6ec',1,'Tgstation.Server.Host.Components.Instance.Watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html#ada6c36ef01a0cdaf67ea13a350c3f073',1,'Tgstation.Server.Host.Watchdog.Watchdog.Watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html#a90292e2c1149c3d0e92a79d98968be44',1,'Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#aec51431b45d46994bbe24550640833d0',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#a75363c8266024cf66cb86d1c44545bdc',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html#aeabbea7c18623b8fb74c64a3b90aa453',1,'Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a50dc15cecba1cb334d01e08a9433c2dd',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.html#ac460374f4a77377ed95d0474e93dac22',1,'Tgstation.Server.Host.Components.EventConsumer.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a92f39be2b47f571fe439f78ccadd2acc',1,'Tgstation.Server.Host.Service.ServerService.watchdog()']]], + ['watchdog_2ecs',['Watchdog.cs',['../_watchdog_8cs.html',1,'']]], + ['watchdogbase',['WatchdogBase',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a5c2c1bb8436c02ba40fde598cb4e2adb',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.WatchdogBase()']]], + ['watchdogbase_2ecs',['WatchdogBase.cs',['../_watchdog_base_8cs.html',1,'']]], + ['watchdogfactory',['WatchdogFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory'],['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory.html',1,'Tgstation.Server.Host.Watchdog.WatchdogFactory'],['../class_tgstation_1_1_server_1_1_host_1_1_console_1_1_program.html#a6b0b371a6a20cfcf0afd0ddbc3ff5825',1,'Tgstation.Server.Host.Console.Program.WatchdogFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html#acf9b9a6d3e7b8fc8bc349e10a8b6631b',1,'Tgstation.Server.Host.Service.Program.WatchdogFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#a1541cf972ae3dd6f7994370e504406c4',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.WatchdogFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#ab5bda9a81248be0498e668f2b148aa82',1,'Tgstation.Server.Host.Components.InstanceFactory.watchdogFactory()']]], + ['watchdogfactory_2ecs',['WatchdogFactory.cs',['../_components_2_watchdog_2_watchdog_factory_8cs.html',1,'(Global Namespace)'],['../_watchdog_2_watchdog_factory_8cs.html',1,'(Global Namespace)']]], + ['watchdogpresent',['WatchdogPresent',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control.html#a1c9a042a42da1e39316d2f1b45b28765',1,'Tgstation.Server.Host.Core.IServerControl.WatchdogPresent()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a00ad28e8a1946d6dfd1ceda6d02be5b4',1,'Tgstation.Server.Host.Server.WatchdogPresent()']]], + ['watchdogreattachinformation',['WatchdogReattachInformation',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information.html',1,'Tgstation.Server.Host.Models.WatchdogReattachInformation'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information.html',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a8f3e7da2c052af242048578fd8ec6c2d',1,'Tgstation.Server.Host.Models.Instance.WatchdogReattachInformation()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information.html#a685125da2ce331a3d10b18f2cab69751',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.WatchdogReattachInformation()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information.html#a47f01052dee4f437b36b579f7a1555de',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.WatchdogReattachInformation(Models.WatchdogReattachInformation copy, IDmbProvider dmbAlpha, IDmbProvider dmbBravo)']]], + ['watchdogreattachinformation_2ecs',['WatchdogReattachInformation.cs',['../_components_2_watchdog_2_watchdog_reattach_information_8cs.html',1,'(Global Namespace)'],['../_models_2_watchdog_reattach_information_8cs.html',1,'(Global Namespace)']]], + ['watchdogreattachinformationbase',['WatchdogReattachInformationBase',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base.html',1,'Tgstation.Server.Host.Models.WatchdogReattachInformationBase'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base.html#a2cf4943c9af899af0fbf1cde28512830',1,'Tgstation.Server.Host.Models.WatchdogReattachInformationBase.WatchdogReattachInformationBase()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base.html#ad9e940062a22166a256203a5b7ffd3e3',1,'Tgstation.Server.Host.Models.WatchdogReattachInformationBase.WatchdogReattachInformationBase(WatchdogReattachInformationBase copy)']]], + ['watchdogreattachinformationbase_2ecs',['WatchdogReattachInformationBase.cs',['../_watchdog_reattach_information_base_8cs.html',1,'']]], + ['watchdogreattachinformations',['WatchdogReattachInformations',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#ade1c71fa296103bf51c5b6b0b1c478d5',1,'Tgstation.Server.Host.Models.DatabaseContext.WatchdogReattachInformations()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#acf20fa94a000078534bfc9337efca289',1,'Tgstation.Server.Host.Models.IDatabaseContext.WatchdogReattachInformations()']]], + ['watchdogtask',['watchdogTask',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a89678cb55592e83aa074a24dc86dcd6f',1,'Tgstation::Server::Host::Service::ServerService']]], + ['webhostbuilder',['webHostBuilder',['../class_tgstation_1_1_server_1_1_host_1_1_server.html#ae141c6cf410d54399d9ee49b38ca305a',1,'Tgstation::Server::Host::Server']]], + ['windowsbyondinstaller',['WindowsByondInstaller',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#acc9243154bedd29521dfbd1138b999bb',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.WindowsByondInstaller()']]], + ['windowsbyondinstaller_2ecs',['WindowsByondInstaller.cs',['../_windows_byond_installer_8cs.html',1,'']]], + ['windowshost',['WindowsHost',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_administration.html#abf3f89fee1f079cadd4208f337444fec',1,'Tgstation::Server::Api::Models::Administration']]], + ['windowsnetworkpromptreaper',['WindowsNetworkPromptReaper',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html',1,'Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#aa56ce0bc468ca1bb1c97b1abc62da72d',1,'Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.WindowsNetworkPromptReaper()']]], + ['windowsnetworkpromptreaper_2ecs',['WindowsNetworkPromptReaper.cs',['../_windows_network_prompt_reaper_8cs.html',1,'']]], + ['windowspostwritehandler',['WindowsPostWriteHandler',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_post_write_handler.html',1,'Tgstation::Server::Host::IO']]], + ['windowspostwritehandler_2ecs',['WindowsPostWriteHandler.cs',['../_windows_post_write_handler_8cs.html',1,'']]], + ['windowssymlinkfactory',['WindowsSymlinkFactory',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_symlink_factory.html',1,'Tgstation::Server::Host::IO']]], + ['windowssymlinkfactory_2ecs',['WindowsSymlinkFactory.cs',['../_windows_symlink_factory_8cs.html',1,'']]], + ['windowssystemidentity',['WindowsSystemIdentity',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html',1,'Tgstation.Server.Host.Security.WindowsSystemIdentity'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html#a6b20afd81a3b07e0ef1f89fc134652ad',1,'Tgstation.Server.Host.Security.WindowsSystemIdentity.WindowsSystemIdentity(WindowsIdentity identity)'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html#a8a3ea6f579bf33bbba407c615140998d',1,'Tgstation.Server.Host.Security.WindowsSystemIdentity.WindowsSystemIdentity(UserPrincipal userPrincipal)']]], + ['windowssystemidentity_2ecs',['WindowsSystemIdentity.cs',['../_windows_system_identity_8cs.html',1,'']]], + ['windowssystemidentityfactory',['WindowsSystemIdentityFactory',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.html',1,'Tgstation.Server.Host.Security.WindowsSystemIdentityFactory'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.html#a46f081a94982769acd01d0fdee271b40',1,'Tgstation.Server.Host.Security.WindowsSystemIdentityFactory.WindowsSystemIdentityFactory()']]], + ['windowssystemidentityfactory_2ecs',['WindowsSystemIdentityFactory.cs',['../_windows_system_identity_factory_8cs.html',1,'']]], + ['withtoken',['WithToken',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_task_extensions.html#ac1bcd0420999580b9e6ef655b0fa094b',1,'Tgstation::Server::Host::Core::TaskExtensions']]], + ['withtoken_3c_20t_20_3e',['WithToken< T >',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_task_extensions.html#aa285d2d01082dbf1388134564c4a2252',1,'Tgstation::Server::Host::Core::TaskExtensions']]], + ['write',['Write',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#a7623081b4c09cf5f7679989cf73c7003',1,'Tgstation.Server.Client.Components.ConfigurationClient.Write()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.html#ae72948a1a0f52e1a84b0e430c1984e4b',1,'Tgstation.Server.Client.Components.IConfigurationClient.Write()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#ac6f986527806a782c0bea1ab51d7f0ad',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.Write()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.html#aa5244c05dd19f32a6f3603b5ca4fd638',1,'Tgstation.Server.Host.Components.StaticFiles.IConfiguration.Write()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a691a59767073bc7dff0f17b809d07b0ca1129c0e4d43f2d121652a7302712cff6',1,'Tgstation.Server.Api.Rights.Write()']]], + ['writeallbytes',['WriteAllBytes',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#adfa411bbedf8ffc430cb9fcf0a6e6fe4',1,'Tgstation.Server.Host.IO.DefaultIOManager.WriteAllBytes()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#af3e7a63cedbe826cfd27f1a2a411103e',1,'Tgstation.Server.Host.IO.IIOManager.WriteAllBytes()']]], + ['writeasync',['WriteAsync',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.html#aa038503e15f044245a1a0d30b0de1b6d',1,'Tgstation.Server.Host.IO.Console.WriteAsync()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console.html#af9dd7697e9f6a0f4a62567e28cd6c470',1,'Tgstation.Server.Host.IO.IConsole.WriteAsync()']]], + ['writechannels',['WriteChannels',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72a536002a3cc297a67dcee8ec692a569ec',1,'Tgstation::Server::Api::Rights']]], + ['writeconnectionstring',['WriteConnectionString',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72a58680118e47c510bac627f8b20e175a9',1,'Tgstation::Server::Api::Rights']]], + ['writeenabled',['WriteEnabled',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72a574b3ec8f9de787caa6f2fc04c8f9658',1,'Tgstation::Server::Api::Rights']]], + ['writefilechecked',['WriteFileChecked',['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.html#a66e6e18e2e313165e390361b77465f65',1,'Tgstation.Server.Host.IO.ISynchronousIOManager.WriteFileChecked()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.html#a74a681b01f42d65b5bc6e10ad73541c1',1,'Tgstation.Server.Host.IO.SynchronousIOManager.WriteFileChecked()']]], + ['writejson',['WriteJson',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_bool_converter.html#ad941960ec0d37be4e058c86718ade113',1,'Tgstation::Server::Host::Components::Chat::Commands::BoolConverter']]], + ['writename',['WriteName',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72ad70280daaa48077a6f4b46bad136e51a',1,'Tgstation::Server::Api::Rights']]], + ['writeprovider',['WriteProvider',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72a46417a8d9d6f4823667e403b90796186',1,'Tgstation::Server::Api::Rights']]], + ['writeusers',['WriteUsers',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#affda1440f9c5e2dfcca65138d2f89a21a6da2fa278de1516d65f3ebe77670f215',1,'Tgstation.Server.Api.Rights.WriteUsers()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a5f1b5a9225190982810802d7a85bb601a6da2fa278de1516d65f3ebe77670f215',1,'Tgstation.Server.Api.Rights.WriteUsers()']]] +]; diff --git a/search/all_18.html b/search/all_18.html new file mode 100644 index 0000000000..3dff8af24e --- /dev/null +++ b/search/all_18.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_18.js b/search/all_18.js new file mode 100644 index 0000000000..674a0ec057 --- /dev/null +++ b/search/all_18.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['ziptodirectory',['ZipToDirectory',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a8905a0a82326cf61f67ba1ec1eccb0e2',1,'Tgstation.Server.Host.IO.DefaultIOManager.ZipToDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a839873a83e4a687821fbc3d28619f851',1,'Tgstation.Server.Host.IO.IIOManager.ZipToDirectory()']]] +]; diff --git a/search/all_19.html b/search/all_19.html new file mode 100644 index 0000000000..22294bd31e --- /dev/null +++ b/search/all_19.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_19.js b/search/all_19.js new file mode 100644 index 0000000000..be93a1989d --- /dev/null +++ b/search/all_19.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['_7esemaphoreslimcontext',['~SemaphoreSlimContext',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html#a38494639c16b57de63e6af91f2841a12',1,'Tgstation::Server::Host::Core::SemaphoreSlimContext']]], + ['_7esessioncontroller',['~SessionController',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a7f46b2c7656e21490605024f8dec30c5',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]] +]; diff --git a/search/all_2.html b/search/all_2.html new file mode 100644 index 0000000000..4c33d85574 --- /dev/null +++ b/search/all_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_2.js b/search/all_2.js new file mode 100644 index 0000000000..b292cdf075 --- /dev/null +++ b/search/all_2.js @@ -0,0 +1,54 @@ +var searchData= +[ + ['badconfig1',['BadConfig1',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config1.html',1,'Tgstation::Server::Host::Core::Tests::TestServiceCollectionExtensions']]], + ['badconfig2',['BadConfig2',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config2.html',1,'Tgstation::Server::Host::Core::Tests::TestServiceCollectionExtensions']]], + ['badconfig3',['BadConfig3',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config3.html',1,'Tgstation::Server::Host::Core::Tests::TestServiceCollectionExtensions']]], + ['badvalidationrequest',['BadValidationRequest',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#af7163ca98f9f5e5c731043ecdace3745a18d2471b9e1234b2d15002cbafa2adc2',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['basicwatchdog',['BasicWatchdog',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html',1,'Tgstation.Server.Host.Components.Watchdog.BasicWatchdog'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#a3887bdfaaf45e473d90b8f5e0865e8d8',1,'Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.BasicWatchdog()']]], + ['basicwatchdog_2ecs',['BasicWatchdog.cs',['../_basic_watchdog_8cs.html',1,'']]], + ['bdirectoryname',['BDirectoryName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#ac3719e69f1a57c2fa46f439678b17745',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['bearer',['Bearer',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_token.html#adaaa6a5dbcd9ee26980f1040571a68b7',1,'Tgstation::Server::Api::Models::Token']]], + ['binpath',['BinPath',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#aa929f025399e35d5455574c2db72cd76',1,'Tgstation::Server::Host::Components::Byond::ByondManager']]], + ['bodyatmerge',['BodyAtMerge',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.html#a85b9d0866f61c6904480df0ef3abacfb',1,'Tgstation::Server::Api::Models::Internal::TestMergeBase']]], + ['boolconverter',['BoolConverter',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_bool_converter.html',1,'Tgstation::Server::Host::Components::Chat::Commands']]], + ['boolconverter_2ecs',['BoolConverter.cs',['../_bool_converter_8cs.html',1,'']]], + ['botmention',['BotMention',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#af40c0ea392de9986a4705d403674f61c',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.BotMention()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.html#a781f872cb8143fe3ff92f3cc8d0d5abb',1,'Tgstation.Server.Host.Components.Chat.Providers.IProvider.BotMention()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a2724c59c69f5edcb6ccd6549a6ce71d6',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.BotMention()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#a3a3ca6a84bbd0adac5990f8d07601f49',1,'Tgstation.Server.Host.Components.Chat.Providers.Provider.BotMention()']]], + ['bottoken',['BotToken',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder.html#a39978f862c219ec5ef28e3ff63f048e7',1,'Tgstation.Server.Api.Models.DiscordConnectionStringBuilder.BotToken()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#a45475c58bb323678370c010872a126c9',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.botToken()']]], + ['bravo',['Bravo',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information.html#ae62a1d681a37fd5478d92be9d6da0c56',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.Bravo()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information.html#a47092ae40bc086c89dca16a0d9acc5ec',1,'Tgstation.Server.Host.Models.WatchdogReattachInformation.Bravo()']]], + ['bravoserver',['bravoServer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#ab591be0822355d021d3ab5fda024796f',1,'Tgstation::Server::Host::Components::Watchdog::ExperimentalWatchdog']]], + ['break',['Break',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a97c1a4a168451bd7e3be23c467aa2812ae4c38d6d45baf080943d323dd51a2ce8',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['browserresolver',['browserResolver',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#a291e832dea111e7c46387fa96d212cb3',1,'Tgstation::Server::Host::Controllers::HomeController']]], + ['buildmodel',['BuildModel',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_database_context_model_snapshot.html#a32d495bf8758a3f62e39f0e5e39cf2e7',1,'Tgstation.Server.Host.Models.Migrations.MySqlDatabaseContextModelSnapshot.BuildModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_database_context_model_snapshot.html#a13c592085ed6534ff12d1b1c179e06f7',1,'Tgstation.Server.Host.Models.Migrations.SqlServerDatabaseContextModelSnapshot.BuildModel()']]], + ['buildtargetmodel',['BuildTargetModel',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html#a0b50357f52fda0a140c17c0004a117ac',1,'Tgstation.Server.Host.Models.Migrations.MSInitialCreate.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html#acabe78145ddeea131efdf8e09481cc86',1,'Tgstation.Server.Host.Models.Migrations.MYInitialCreate.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html#a5d8914ad6eef1cd43ef831ef8c2eda01',1,'Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html#aca8fc216984500a0d660548a9dada3be',1,'Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html#ad82088299eaf799f643661111e1d1877',1,'Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html#a14285a0c35c5570d9bf33af7eaae5976',1,'Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html#a0b3b826dabd222a804eddd53ae93e329',1,'Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html#a9fef7b3cdc39a92a3717c1f041d85340',1,'Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.html#a97ef9497f79738d08ddcc670606412e0',1,'Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.html#a5b1cf5bef170a124e2ef5e120c056c92',1,'Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_fix_rev_info_index.html#aae18eabba1b598e6409db6aad682cc8c',1,'Tgstation.Server.Host.Models.Migrations.MSFixRevInfoIndex.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_fix_rev_info_index.html#adb8310ad88c4d5807ea21eef700ddd76',1,'Tgstation.Server.Host.Models.Migrations.MYFixRevInfoIndex.BuildTargetModel()']]], + ['builtincommands',['builtinCommands',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ab3e79a7fe69140182ec0881103c72385',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['byond',['Byond',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_byond.html',1,'Tgstation.Server.Api.Models.Byond'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#af10fd8e9368c9ff17b96370108e7c466',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.byond()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#a79e21f63bc3460961ea59be3636a32e4',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.byond()'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a9846874e39579d320e53020346944a60',1,'Tgstation.Server.Api.Routes.Byond()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#a9232f67ce6e82fce57740789d0202357',1,'Tgstation.Server.Client.Components.IInstanceClient.Byond()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a473bf90090e8d3c2b5d4e6689b5ea31f',1,'Tgstation.Server.Client.Components.InstanceClient.Byond()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html#a3dde46060da75e3a757784489da4c810',1,'Tgstation.Server.Client.Components.ByondClient.Byond()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20a2f4b44b678b37bcd3239cd83e64d0eb0',1,'Tgstation.Server.Api.Rights.Byond()']]], + ['byond_2ecs',['Byond.cs',['../_byond_8cs.html',1,'']]], + ['byondactiveversionchange',['ByondActiveVersionChange',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381a16551fe43323cca07bfc777afadbe5a1',1,'Tgstation::Server::Host::Components']]], + ['byondcachepath',['ByondCachePath',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#a9dbecdd4efbda7a406fab099cd108586',1,'Tgstation::Server::Host::Components::Byond::PosixByondInstaller']]], + ['byondclient',['ByondClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html',1,'Tgstation.Server.Client.Components.ByondClient'],['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html#a3f484fee845446e8f23e4a2ad80bd7f3',1,'Tgstation.Server.Tests.Instance.ByondTest.byondClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html#a330467d91ed28edace4990dce15c6991',1,'Tgstation.Server.Client.Components.ByondClient.ByondClient()']]], + ['byondclient_2ecs',['ByondClient.cs',['../_byond_client_8cs.html',1,'']]], + ['byondcommand',['ByondCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html',1,'Tgstation.Server.Host.Components.Chat.Commands.ByondCommand'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html#a04c8863ccdb6d8f93c56eec22e3015d5',1,'Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.ByondCommand()']]], + ['byondcommand_2ecs',['ByondCommand.cs',['../_byond_command_8cs.html',1,'']]], + ['byondconfigdir',['ByondConfigDir',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#ac5e0a1909c082fbcd47ff591764a2345',1,'Tgstation::Server::Host::Components::Byond::WindowsByondInstaller']]], + ['byondcontroller',['ByondController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html',1,'Tgstation.Server.Host.Controllers.ByondController'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html#a60fa22db0b488a68e33b3064cacce100',1,'Tgstation.Server.Host.Controllers.ByondController.ByondController()']]], + ['byondcontroller_2ecs',['ByondController.cs',['../_byond_controller_8cs.html',1,'']]], + ['byondddconfig',['ByondDDConfig',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a85675de1695978da5fe1d958ffb7dcf3',1,'Tgstation::Server::Host::Components::Byond::WindowsByondInstaller']]], + ['byonddxdir',['ByondDXDir',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a2214ac1499336591cc7a382a7b9a986f',1,'Tgstation::Server::Host::Components::Byond::WindowsByondInstaller']]], + ['byondexecutablelock',['ByondExecutableLock',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.html',1,'Tgstation.Server.Host.Components.Byond.ByondExecutableLock'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.html#a7b4cba80d6e7e80dc4b912d72bb2c59f',1,'Tgstation.Server.Host.Components.Byond.ByondExecutableLock.ByondExecutableLock()']]], + ['byondexecutablelock_2ecs',['ByondExecutableLock.cs',['../_byond_executable_lock_8cs.html',1,'']]], + ['byondinstaller',['byondInstaller',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a3d9ba4fe85290b449bb305f06cf5b57c',1,'Tgstation.Server.Host.Components.Byond.ByondManager.byondInstaller()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a9b4acf6f948993eac90206dae7dc1c8d',1,'Tgstation.Server.Host.Components.InstanceFactory.byondInstaller()']]], + ['byondinstallfail',['ByondInstallFail',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381aa63abc793fbdf14cf7caf28a4812e682',1,'Tgstation::Server::Host::Components']]], + ['byondinstallstart',['ByondInstallStart',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381a93c1e81c6ae4a9cc3637be6b044211e9',1,'Tgstation::Server::Host::Components']]], + ['byondlock',['byondLock',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a42e96e58c141e6b8fc7fd3c47421c58b',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['byondmanager',['ByondManager',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html',1,'Tgstation.Server.Host.Components.Byond.ByondManager'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html#aac40deacf0a4f16267395cda353e5b23',1,'Tgstation.Server.Host.Components.IInstance.ByondManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#adcf63127cc4d66507994449215611ba4',1,'Tgstation.Server.Host.Components.Instance.ByondManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a53f179dd7a1f02a716da371710eec7a3',1,'Tgstation.Server.Host.Components.Byond.ByondManager.ByondManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html#a65e3da64c0d52b3811a21952e5bcae28',1,'Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.byondManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#a519a7b7c42cfba5ff53cce4438a31f71',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.byondManager()']]], + ['byondmanager_2ecs',['ByondManager.cs',['../_byond_manager_8cs.html',1,'']]], + ['byondnoprompttrustedmode',['ByondNoPromptTrustedMode',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a5b257317ebd8d23c34d86835b3f48b09',1,'Tgstation::Server::Host::Components::Byond::WindowsByondInstaller']]], + ['byondrevisionsurltemplate',['ByondRevisionsURLTemplate',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#a5e3ee360cb8eafd7e5f185d10819de1f',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.ByondRevisionsURLTemplate()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#ae80d653422c5a38e3bf430d6b8b5ce5e',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ByondRevisionsURLTemplate()']]], + ['byondrights',['ByondRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html#af3250017587c5794a9b2501e97d8896d',1,'Tgstation.Server.Api.Models.InstanceUser.ByondRights()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a2a217a19e652f117e2324fb79ed838b9',1,'Tgstation.Server.Api.Rights.ByondRights()']]], + ['byondrights_2ecs',['ByondRights.cs',['../_byond_rights_8cs.html',1,'']]], + ['byondtest',['ByondTest',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html',1,'Tgstation.Server.Tests.Instance.ByondTest'],['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html#aea9d261dae80fdb3bf6ab8145171d46c',1,'Tgstation.Server.Tests.Instance.ByondTest.ByondTest()']]], + ['byondtest_2ecs',['ByondTest.cs',['../_byond_test_8cs.html',1,'']]], + ['byondtopicsender',['byondTopicSender',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a13168eed51331581cc8783cb08e6fbf4',1,'Tgstation.Server.Host.Components.InstanceFactory.byondTopicSender()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#abf81f6242b4aceb7d9c10122805ace1b',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.byondTopicSender()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#afdff059b68abb8b79d388ee662ee649c',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.byondTopicSender()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a71e7356fbe74f4be48b8d51f57b2e032',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.byondTopicSender()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#ad28a647285744951437e5b5f23c28430',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.byondTopicSender()']]], + ['byondtopictimeout',['ByondTopicTimeout',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html#aa870a193d3830dcf7b7674f8989ba0b0',1,'Tgstation::Server::Host::Configuration::GeneralConfiguration']]], + ['byondversion',['ByondVersion',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job.html#afc996546d665a5ac2135e4e4fae88eb5',1,'Tgstation.Server.Api.Models.CompileJob.ByondVersion()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.html#a009667890d52e30a93a5cd8f15b89904',1,'Tgstation.Server.Host.Models.CompileJob.ByondVersion()']]] +]; diff --git a/search/all_3.html b/search/all_3.html new file mode 100644 index 0000000000..b634070bc7 --- /dev/null +++ b/search/all_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_3.js b/search/all_3.js new file mode 100644 index 0000000000..7cb5b47809 --- /dev/null +++ b/search/all_3.js @@ -0,0 +1,213 @@ +var searchData= +[ + ['cachedclients',['cachedClients',['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#a98b06be6c61309730e3b5eea66da722b',1,'Tgstation::Server::Client::InstanceManagerClient']]], + ['cachedidentities',['cachedIdentities',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html#ab9206118af46526c3bb89c95c5197bd8',1,'Tgstation::Server::Host::Security::IdentityCache']]], + ['cachesystemidentity',['CacheSystemIdentity',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html#acbbad46e8e5ac5cae600edce613f9cf5',1,'Tgstation.Server.Host.Security.IdentityCache.CacheSystemIdentity()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_identity_cache.html#a40f3695ec18d3df1bea7b230b75dabbb',1,'Tgstation.Server.Host.Security.IIdentityCache.CacheSystemIdentity()']]], + ['cancel',['Cancel',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client.html#a060a731a0c221146d5d81d7890e1cd42',1,'Tgstation.Server.Client.Components.IJobsClient.Cancel()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html#a50456aace539b2c54afc8f8218278c49',1,'Tgstation.Server.Client.Components.JobsClient.Cancel()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html#a7f721c0a92fc49009e811ee7615a9ce7',1,'Tgstation.Server.Host.Core.JobHandler.Cancel()']]], + ['cancelclone',['CancelClone',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39a8863765f0ecf9b3004e8051a28251d6a',1,'Tgstation::Server::Api::Rights']]], + ['cancelcompile',['CancelCompile',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5daadc2d374d8bb5ae840bbb0145868fc1f',1,'Tgstation::Server::Api::Rights']]], + ['cancelinstall',['CancelInstall',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a2a217a19e652f117e2324fb79ed838b9a9557127a4ed0a1726e4b32579364083b',1,'Tgstation::Server::Api::Rights']]], + ['canceljob',['CancelJob',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager.html#af5028bbb3b3a9bc9f6ed0052603e6fda',1,'Tgstation.Server.Host.Core.IJobManager.CancelJob()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a6788fc1c0b89ad7bd5b1b08e5cd3c5c0',1,'Tgstation.Server.Host.Core.JobManager.CancelJob()']]], + ['cancellationtoken',['cancellationToken',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#ad2f0b06a4dbe78c59e2e0709fb8d8fda',1,'Tgstation::Server::Host::Components::Interop::CommContext']]], + ['cancellationtokensource',['cancellationTokenSource',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#aa5d4e8581299b0fbbc8622b276f12397',1,'Tgstation.Server.Host.Components.Interop.CommContext.cancellationTokenSource()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#a4ec45a0beda901300d6ce268d34c0ef5',1,'Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.cancellationTokenSource()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html#aafb1cffb23850dc0c276273efe2a8a82',1,'Tgstation.Server.Host.Core.JobHandler.cancellationTokenSource()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.html#ac8422fda839cd16fd8b467bb4947f8a1',1,'Tgstation.Server.Host.Security.IdentityCacheObject.cancellationTokenSource()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a80bf6f84e712996ae1d8894ec96e9ba3',1,'Tgstation.Server.Host.Server.cancellationTokenSource()'],['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a4f65e767919ae007c07ef7b3b715b498',1,'Tgstation.Server.Host.Service.ServerService.cancellationTokenSource()']]], + ['cancelled',['cancelled',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html#a3e7c49f4688ab384e70080bf76e867c9',1,'Tgstation.Server.Host.Core.Tests.TestJobHandler.cancelled()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html#ab68caae8a7e5bd3bfd7764cab7b8773d',1,'Tgstation.Server.Api.Models.Internal.Job.Cancelled()']]], + ['cancelledby',['CancelledBy',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job.html#a377a43a2240e0da18868c1b67803a376',1,'Tgstation.Server.Api.Models.Job.CancelledBy()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html#a11070d5a55b77aa91f23403d17c4d224',1,'Tgstation.Server.Host.Models.Job.CancelledBy()']]], + ['cancelpendingchanges',['CancelPendingChanges',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39a84be61baa3a948e65891036fdaba4ab7',1,'Tgstation::Server::Api::Rights']]], + ['cancelright',['CancelRight',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html#af210e7bef88bdc5ca203c8f0931c520a',1,'Tgstation::Server::Api::Models::Internal::Job']]], + ['cancelrightstype',['CancelRightsType',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html#a796c6a9e900858ec0084648e9b375609',1,'Tgstation::Server::Api::Models::Internal::Job']]], + ['canconvert',['CanConvert',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_bool_converter.html#adad719823d31566cc209bc717c5ccc55',1,'Tgstation::Server::Host::Components::Chat::Commands::BoolConverter']]], + ['canonicalname',['CanonicalName',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#a6882aa0e73af174efc9a7d843888a242',1,'Tgstation::Server::Host::Models::User']]], + ['changeautoupdatesettings',['ChangeAutoUpdateSettings',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39a548b817c7c02c2f62dd3794933b0920c',1,'Tgstation::Server::Api::Rights']]], + ['changechannels',['ChangeChannels',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a2e51d14e66a9be0de64dd55feadb9e7d',1,'Tgstation.Server.Host.Components.Chat.Chat.ChangeChannels()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html#ac0cee4adb5e625763dc8829922e20afe',1,'Tgstation.Server.Host.Components.Chat.IChat.ChangeChannels()']]], + ['changecommitter',['ChangeCommitter',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39abae6cf87a3261b8f904b3943525f3043',1,'Tgstation::Server::Api::Rights']]], + ['changecredentials',['ChangeCredentials',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39adbc2b36c5f0ed08b2f62378225d078d6',1,'Tgstation::Server::Api::Rights']]], + ['changesettings',['ChangeSettings',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ad9805fbf5079c35993641c458d697566',1,'Tgstation.Server.Host.Components.Chat.Chat.ChangeSettings()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html#af5fac12babaf773ee5bc457bc7eaeeda',1,'Tgstation.Server.Host.Components.Chat.IChat.ChangeSettings()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#afab0aa088dc77e54e978c730645d8d00',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.ChangeSettings()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a390fcde5ed6ed30d6e5b5b2ebc8273dc',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ChangeSettings()']]], + ['changetestmergecommits',['ChangeTestMergeCommits',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39a5ad384c7de5c2f6d816c4d652462625b',1,'Tgstation::Server::Api::Rights']]], + ['changeversion',['ChangeVersion',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a391255ccc37ff793820297d7939c31a0',1,'Tgstation.Server.Host.Components.Byond.ByondManager.ChangeVersion()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_manager.html#a04ad9b7aeb3bf8b080dd54a396a7911c',1,'Tgstation.Server.Host.Components.Byond.IByondManager.ChangeVersion()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#affda1440f9c5e2dfcca65138d2f89a21a55c267b42a4e2d36d46ff358ff822968',1,'Tgstation.Server.Api.Rights.ChangeVersion()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a2a217a19e652f117e2324fb79ed838b9a55c267b42a4e2d36d46ff358ff822968',1,'Tgstation.Server.Api.Rights.ChangeVersion()']]], + ['channel',['Channel',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html',1,'Tgstation.Server.Host.Components.Chat.Channel'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping.html#a3e47c8143bcb6ea125dc7e19d61981a7',1,'Tgstation.Server.Host.Components.Chat.ChannelMapping.Channel()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user.html#a757ab1b226367fcaca7c770885002bbd',1,'Tgstation.Server.Host.Components.Chat.User.Channel()']]], + ['channel_2ecs',['Channel.cs',['../_channel_8cs.html',1,'']]], + ['channelidcounter',['channelIdCounter',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a2e2b66e3a89f1bd6aceda7f0a4bb234b',1,'Tgstation.Server.Host.Components.Chat.Chat.channelIdCounter()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a3170ebdb4e8568868efd3b1c1764bf38',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.channelIdCounter()']]], + ['channelidmap',['channelIdMap',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a403b3ff6bccc4b1e3f7e9e8729f84908',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]], + ['channelids',['ChannelIds',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_response.html#a1ccfbf76be5cfe35a6df3da7c615bb5e',1,'Tgstation::Server::Host::Components::Chat::Response']]], + ['channelmapping',['ChannelMapping',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['channelmapping_2ecs',['ChannelMapping.cs',['../_channel_mapping_8cs.html',1,'']]], + ['channels',['Channels',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_bot.html#ab7b0c6f09a83ff00c65b668b19d7992e',1,'Tgstation.Server.Api.Models.ChatBot.Channels()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.html#a962580026629eab3c997002c86e9cb6d',1,'Tgstation.Server.Host.Models.ChatBot.Channels()']]], + ['channelspath',['channelsPath',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#af702fc418b52e116273bacce6697c5dc',1,'Tgstation::Server::Host::Components::Chat::JsonTrackingContext']]], + ['channelssemaphore',['channelsSemaphore',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#a1257ebc66455fcbe3ab2e7e72534ce6e',1,'Tgstation::Server::Host::Components::Chat::JsonTrackingContext']]], + ['chat',['Chat',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html',1,'Tgstation.Server.Host.Components.Chat.Chat'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a768885bf92f07d7e09f61cbd5273bf4e',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.chat()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#ab46cb8a880307f45012474909bada8c3',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.chat()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#af039fd67d6fa74b527048459e1a358b0',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.chat()'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a6cf0d5e4d1f8ed76d2cf84a56392ed2d',1,'Tgstation.Server.Api.Routes.Chat()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html#ad00e650236f4e0d2c512113b9fe2446b',1,'Tgstation.Server.Host.Components.IInstance.Chat()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#abfb0276f594ece7d091630365f7f036a',1,'Tgstation.Server.Host.Components.Instance.Chat()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a934fd52d3434a057fbac3f2994810cb4',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Chat()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a2b3416bb9a400628d5de0737b0649ef0',1,'Tgstation.Server.Host.Components.Chat.Chat.Chat()']]], + ['chat_2ecs',['Chat.cs',['../_chat_8cs.html',1,'']]], + ['chatbot',['ChatBot',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_bot.html',1,'Tgstation.Server.Api.Models.ChatBot'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html',1,'Tgstation.Server.Api.Models.Internal.ChatBot'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.html',1,'Tgstation.Server.Host.Models.ChatBot'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#aa8342c38e2ed6d4290be11a1dfd906d5',1,'Tgstation.Server.Client.Components.ChatBotsClient.ChatBot(Routes.Chat, settings ?? throw new ArgumentNullException(nameof(settings)), instance.Id, cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#aa8342c38e2ed6d4290be11a1dfd906d5',1,'Tgstation.Server.Client.Components.ChatBotsClient.ChatBot(Routes.Chat, settings ?? throw new ArgumentNullException(nameof(settings)), instance.Id, cancellationToken)']]], + ['chatbot_2ecs',['ChatBot.cs',['../_tgstation_8_server_8_api_2_models_2_chat_bot_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_api_2_models_2_internal_2_chat_bot_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_chat_bot_8cs.html',1,'(Global Namespace)']]], + ['chatbotrights',['ChatBotRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html#a940fa0780621d08d50f1e961bb79a87b',1,'Tgstation.Server.Api.Models.InstanceUser.ChatBotRights()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72',1,'Tgstation.Server.Api.Rights.ChatBotRights()']]], + ['chatbotrights_2ecs',['ChatBotRights.cs',['../_chat_bot_rights_8cs.html',1,'']]], + ['chatbots',['ChatBots',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#aca06567ce5a36c7e6b2ac09d5e6d9a38',1,'Tgstation.Server.Client.Components.IInstanceClient.ChatBots()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a8b8ccd6c8cb8f046bc1c94e4220df1c8',1,'Tgstation.Server.Client.Components.InstanceClient.ChatBots()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#aa12d9638a390f6150410fae873d78fe6',1,'Tgstation.Server.Host.Models.DatabaseContext.ChatBots()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#ac8cfc74929b0d6dc63214793bfdb5d62',1,'Tgstation.Server.Host.Models.IDatabaseContext.ChatBots()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20a11eee75253579a31252ca13f9a271873',1,'Tgstation.Server.Api.Rights.ChatBots()']]], + ['chatbotsclient',['ChatBotsClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html',1,'Tgstation.Server.Client.Components.ChatBotsClient'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#a322c40d10b0b8b65802c71a899a555d9',1,'Tgstation.Server.Client.Components.ChatBotsClient.ChatBotsClient()']]], + ['chatbotsclient_2ecs',['ChatBotsClient.cs',['../_chat_bots_client_8cs.html',1,'']]], + ['chatchannel',['ChatChannel',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html',1,'Tgstation.Server.Api.Models.ChatChannel'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.html',1,'Tgstation.Server.Host.Models.ChatChannel']]], + ['chatchannel_2ecs',['ChatChannel.cs',['../_tgstation_8_server_8_api_2_models_2_chat_channel_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_chat_channel_8cs.html',1,'(Global Namespace)']]], + ['chatchannels',['ChatChannels',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a3eb03b8fad30f5a23c73633dd14aeda8',1,'Tgstation.Server.Host.Models.DatabaseContext.ChatChannels()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#a37bfbf2390708d6d40ddc484e7eb50d7',1,'Tgstation.Server.Host.Models.IDatabaseContext.ChatChannels()']]], + ['chatchannelsjson',['ChatChannelsJson',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html#ac4b12b2ff255a2e18bac3b47ad7b1eda',1,'Tgstation.Server.Host.Components.Interop.JsonFile.ChatChannelsJson()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list.html#a467e7d6f73cb109da69af86e1644d8f3',1,'Tgstation.Server.Host.Components.Interop.JsonSubFileList.ChatChannelsJson()']]], + ['chatcommand',['ChatCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_command.html',1,'Tgstation::Server::Host::Components::Interop']]], + ['chatcommand_2ecs',['ChatCommand.cs',['../_chat_command_8cs.html',1,'']]], + ['chatcommandsjson',['ChatCommandsJson',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html#ad9b9e6e7af1746d22adc0cda60302dda',1,'Tgstation.Server.Host.Components.Interop.JsonFile.ChatCommandsJson()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list.html#aab62b9247392345c712b668535e03282',1,'Tgstation.Server.Host.Components.Interop.JsonSubFileList.ChatCommandsJson()']]], + ['chatconnectionstringbuilder',['ChatConnectionStringBuilder',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_connection_string_builder.html',1,'Tgstation::Server::Api::Models::Internal']]], + ['chatconnectionstringbuilder_2ecs',['ChatConnectionStringBuilder.cs',['../_chat_connection_string_builder_8cs.html',1,'']]], + ['chatcontroller',['ChatController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html',1,'Tgstation.Server.Host.Controllers.ChatController'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html#aeb8a6d7b46b068d26e685b7b22e78cb4',1,'Tgstation.Server.Host.Controllers.ChatController.ChatController()']]], + ['chatcontroller_2ecs',['ChatController.cs',['../_chat_controller_8cs.html',1,'']]], + ['chatfactory',['ChatFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html',1,'Tgstation.Server.Host.Components.Chat.ChatFactory'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a59397e41a1bb1df63d5ac8022cbb67d8',1,'Tgstation.Server.Host.Components.InstanceFactory.chatFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html#a42579d851d612e220ec567b406b525ad',1,'Tgstation.Server.Host.Components.Chat.ChatFactory.ChatFactory()']]], + ['chatfactory_2ecs',['ChatFactory.cs',['../_chat_factory_8cs.html',1,'']]], + ['chathandler',['chatHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a67736c6716ce7bc9b5167dedb4e43220',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['chatjsontrackingcontext',['chatJsonTrackingContext',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#aa5a9ae38d8ab674620397be99c74cada',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['chatprovider',['ChatProvider',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a2d962413bc23404156feea75066e39cc',1,'Tgstation::Server::Api::Models']]], + ['chatprovider_2ecs',['ChatProvider.cs',['../_chat_provider_8cs.html',1,'']]], + ['chatsettings',['ChatSettings',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.html#a082ce7e1f98a393dc31eed005abc5002',1,'Tgstation.Server.Host.Models.ChatChannel.ChatSettings()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a1d95c35203ebc275fbbbe394f89c3467',1,'Tgstation.Server.Host.Models.Instance.ChatSettings()']]], + ['chatsettingsid',['ChatSettingsId',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.html#aa81eda97809d3993ebf0d34f77fc0c1b',1,'Tgstation::Server::Host::Models::ChatChannel']]], + ['checkavailable',['CheckAvailable',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.html#a6556df91ef25960c814f583b71996a9f',1,'Tgstation::Server::Host::IO::Console']]], + ['checkcompatibility',['CheckCompatibility',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a3c5df000903796a032fe6a4cafdc8a73',1,'Tgstation::Server::Api::ApiHeaders']]], + ['checkdisposed',['CheckDisposed',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#ab0dfcae37e616a35d85fce7af3e432d8',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['checkexceptionpropagation',['CheckExceptionPropagation',['../class_tgstation_1_1_server_1_1_host_1_1_server.html#adc61d0d2d0cae4ed8a883db99ebe40e5',1,'Tgstation::Server::Host::Server']]], + ['checkgetjob',['CheckGetJob',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a74dc6e77d6d90a69742eb982f98ed7c8',1,'Tgstation::Server::Host::Core::JobManager']]], + ['checklaunchresult',['CheckLaunchResult',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a96ad9302ae812f4ba3bbbaed2f7adbd0',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['checkoutobject',['CheckoutObject',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#ab069c1ee11c48955e51956ff31a0d0fc',1,'Tgstation.Server.Host.Components.Repository.IRepository.CheckoutObject()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a26b2fb935f0fd74a479231085029ce86',1,'Tgstation.Server.Host.Components.Repository.Repository.CheckoutObject()']]], + ['checkoutprogresshandler',['CheckoutProgressHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#ae8ee5ac2942a57e05ec5c7e238e75977',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['checkoutsha',['CheckoutSha',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html#a0d9d62857268d88dff0c4d1935ef8f04',1,'Tgstation::Server::Api::Models::Repository']]], + ['checkreleasesandapplyupdate',['CheckReleasesAndApplyUpdate',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#a136149ffd1e19c77776bf08ad6f019d8',1,'Tgstation::Server::Host::Controllers::AdministrationController']]], + ['checkrunwizard',['CheckRunWizard',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_setup_wizard.html#af7ba7d5740fede2bc7d52977afbd1832',1,'Tgstation.Server.Host.Core.ISetupWizard.CheckRunWizard()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#ac1d5103c18b9b1ae0cee11fd61cf4417',1,'Tgstation.Server.Host.Core.SetupWizard.CheckRunWizard()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_setup_wizard.html#a50972281286613e25958de1e126c86c9',1,'Tgstation.Server.Host.Core.Tests.TestApplication.MockSetupWizard.CheckRunWizard()']]], + ['checksanity',['CheckSanity',['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a5307337e3bb84c45327e8a856b7f425f',1,'Tgstation::Server::Host::Server']]], + ['checkuserpassword',['CheckUserPassword',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html#a020220485dde96985ea6bfe224a85d89',1,'Tgstation.Server.Host.Security.CryptographySuite.CheckUserPassword()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_cryptography_suite.html#ac23fd656dc42cf07e64a62844f8bcfbc',1,'Tgstation.Server.Host.Security.ICryptographySuite.CheckUserPassword()']]], + ['claimsinjector',['ClaimsInjector',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_claims_injector.html',1,'Tgstation.Server.Host.Security.ClaimsInjector'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_claims_injector.html#aaa5f275fb556a0382b8f6aec8368ea8d',1,'Tgstation.Server.Host.Security.ClaimsInjector.ClaimsInjector()']]], + ['claimsinjector_2ecs',['ClaimsInjector.cs',['../_claims_injector_8cs.html',1,'']]], + ['cleancache',['CleanCache',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.html#ad014a7849a1246dc316a9ac3d8a43d16',1,'Tgstation.Server.Host.Components.Byond.IByondInstaller.CleanCache()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#a3d5968bc5509ef349f1176a60ac7e454',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.CleanCache()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a9de74791dbf6de45fb27c97e51805b8c',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.CleanCache()']]], + ['cleanjob',['CleanJob',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a9fcc5356395c5a07696851c9af4dbaf9',1,'Tgstation::Server::Host::Components::Compiler::DmbFactory']]], + ['cleanunusedcompilejobs',['CleanUnusedCompileJobs',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a1cb27242b1748b76daa1483fbde65f60',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.CleanUnusedCompileJobs()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory.html#a7180d98f1dcb2905732e8bbb9c577cc4',1,'Tgstation.Server.Host.Components.Compiler.IDmbFactory.CleanUnusedCompileJobs()']]], + ['cleanupcts',['cleanupCts',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a95f842bd0fd617eb860389efc130de4d',1,'Tgstation::Server::Host::Components::Compiler::DmbFactory']]], + ['cleanupfailedcompile',['CleanupFailedCompile',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#ac455ab29e61b229885cdc8730f7cab9b',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['cleanuptask',['cleanupTask',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a12c033d70ec8b53374f2360d2cac82b0',1,'Tgstation::Server::Host::Components::Compiler::DmbFactory']]], + ['client',['client',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#a059457d72470d29c3530d489adb91d1c',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.client()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a01ba0df08b2b2139b417352c28cabc2f',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.client()'],['../class_tgstation_1_1_server_1_1_tests_1_1_administration_test.html#acd251fb17c3dec58ce610716538ec6c0',1,'Tgstation.Server.Tests.AdministrationTest.client()']]], + ['client_5fmessagereceived',['Client_MessageReceived',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#a3866a830f4cedcfdc6b2d1ca7e87ab4d',1,'Tgstation::Server::Host::Components::Chat::Providers::DiscordProvider']]], + ['client_5fonchannelmessage',['Client_OnChannelMessage',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#ad5b2c312d6d9703edbeb60825cfb1602',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]], + ['client_5fonquerymessage',['Client_OnQueryMessage',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a6709ea88022cc7f1ed175e5f863e79c9',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]], + ['clientexception',['ClientException',['../class_tgstation_1_1_server_1_1_client_1_1_client_exception.html',1,'Tgstation.Server.Client.ClientException'],['../class_tgstation_1_1_server_1_1_client_1_1_client_exception.html#aa609a0cde59451054984705078125700',1,'Tgstation.Server.Client.ClientException.ClientException()'],['../class_tgstation_1_1_server_1_1_client_1_1_client_exception.html#a9195a6bc325e3df79e9ae9490c90a0a4',1,'Tgstation.Server.Client.ClientException.ClientException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_client_exception.html#a8864363a43d30e891b54cc46d75bdce4',1,'Tgstation.Server.Client.ClientException.ClientException(string message, Exception innerException)']]], + ['clientexception_2ecs',['ClientException.cs',['../_client_exception_8cs.html',1,'']]], + ['clientexception_3f_3f_3f',['ClientException???',['../class_tgstation_1_1_server_1_1_client_1_1_client_exception.html#a979138c473a6d3d7538c62f750ac6e3f',1,'Tgstation::Server::Client::ClientException']]], + ['clientfactory',['clientFactory',['../class_tgstation_1_1_server_1_1_tests_1_1_integration_test.html#a531e3e175cefd7786c6e349fa7584f68',1,'Tgstation::Server::Tests::IntegrationTest']]], + ['clone',['Clone',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.html#ad1443ff74ddf28de61129c0c98e2abc2',1,'Tgstation.Server.Client.Components.IRepositoryClient.Clone()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#a5e84a3b8d18e965718b2c37386c6aede',1,'Tgstation.Server.Client.Components.RepositoryClient.Clone()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity.html#a1cb40673b65fa830543c69461449953a',1,'Tgstation.Server.Host.Security.ISystemIdentity.Clone()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html#aa3df6c34f2e2c1a5755b21595bc6f1a5',1,'Tgstation.Server.Host.Security.WindowsSystemIdentity.Clone()']]], + ['cloneinprogress',['CloneInProgress',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository_manager.html#a3e57f020cf906b3c04f3fc81084a98d3',1,'Tgstation.Server.Host.Components.Repository.IRepositoryManager.CloneInProgress()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#adb8787a8636ea92edd721e4e1eb7c97c',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.CloneInProgress()']]], + ['clonemetadata',['CloneMetadata',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html#af41bc4f3fadb8aa31a7d2950f1906383',1,'Tgstation::Server::Api::Models::Instance']]], + ['clonerepository',['CloneRepository',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository_manager.html#acf22ca7387254203fcd8a8e2a9947f0a',1,'Tgstation.Server.Host.Components.Repository.IRepositoryManager.CloneRepository()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#a6df16cc693419c0e3919e46250a40cf8',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.CloneRepository()']]], + ['closeportonreboot',['ClosePortOnReboot',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a7251412ac0b54d647eec022368d53203',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.ClosePortOnReboot()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#a4aff175710c5f3e1acffe941131a4ffa',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.ClosePortOnReboot()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a55e93b989949fa979de9faa32d818b77',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.ClosePortOnReboot()']]], + ['codemodificationsheadfile',['CodeModificationsHeadFile',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#aa146572ec12e2444819edb99be402a91',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]], + ['codemodificationssubdirectory',['CodeModificationsSubdirectory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a7e19fd0432fd7b61f30a015a477eeb74',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]], + ['codemodificationstailfile',['CodeModificationsTailFile',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#ac2b6e06f4a91a2f4fc5f8f93210ee941',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]], + ['combinedstringbuilder',['combinedStringBuilder',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#ad7ee2e54c6885bdfc34eb544e1c8d0dc',1,'Tgstation::Server::Host::Core::Process']]], + ['command',['Command',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_command.html#ad3c1493d8915aecd4c800d462d5931f2',1,'Tgstation::Server::Host::Components::Interop::ChatCommand']]], + ['commandfactory',['CommandFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#aa195d342dbe8a6dbbb2294f15cbe09c0',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.CommandFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a3e34b59cab804565caa31a230980e65b',1,'Tgstation.Server.Host.Components.Chat.Chat.commandFactory()']]], + ['commandfactory_2ecs',['CommandFactory.cs',['../_command_factory_8cs.html',1,'']]], + ['commandspath',['commandsPath',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#a88d413546c92683df93fb058d7f40dc8',1,'Tgstation::Server::Host::Components::Chat::JsonTrackingContext']]], + ['commcommand',['CommCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_command.html',1,'Tgstation::Server::Host::Components::Interop']]], + ['commcommand_2ecs',['CommCommand.cs',['../_comm_command_8cs.html',1,'']]], + ['commcontext',['CommContext',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html',1,'Tgstation.Server.Host.Components.Interop.CommContext'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#a9fb9b0ef078701162f9a307bf04af648',1,'Tgstation.Server.Host.Components.Interop.CommContext.CommContext()']]], + ['commcontext_2ecs',['CommContext.cs',['../_comm_context_8cs.html',1,'']]], + ['comment',['Comment',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters.html#ac347f526ceb9f50ab47df5db6c710385',1,'Tgstation::Server::Api::Models::TestMergeParameters']]], + ['commitsha',['CommitSha',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_revision_information.html#a7d08aaae3b19bbc45ce29b110042a260',1,'Tgstation::Server::Api::Models::Internal::RevisionInformation']]], + ['committeremail',['CommitterEmail',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#af0a552dc881084d79ed5e0e87fbb2d9d',1,'Tgstation::Server::Api::Models::Internal::RepositorySettings']]], + ['committername',['CommitterName',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#ac2fd6ed73ec47e1a8b308ec5d5f6ddf5',1,'Tgstation::Server::Api::Models::Internal::RepositorySettings']]], + ['commonmention',['CommonMention',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a55432cab80130ced59f78ce28750a96a',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['compatible',['Compatible',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a305abd5b6b16230fb32f779af0a07d61',1,'Tgstation::Server::Api::ApiHeaders']]], + ['compile',['Compile',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#af9d90085714117a3109d6f7af3fdc1cc',1,'Tgstation.Server.Client.Components.DreamMakerClient.Compile()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html#a548a8f4daed30ab49f77a23b1c125078',1,'Tgstation.Server.Client.Components.IDreamMakerClient.Compile()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#ac71b166a45e54e668865ba55c3a37041',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.Compile()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dream_maker.html#a74305b91312055e9932cf66b8b05c6d1',1,'Tgstation.Server.Host.Components.Compiler.IDreamMaker.Compile()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5da3de9387fc230ce74214446e58c4fefde',1,'Tgstation.Server.Api.Rights.Compile()']]], + ['compilecancelled',['CompileCancelled',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381aac05aa67f7da74bd470018801530d560',1,'Tgstation::Server::Host::Components']]], + ['compilecomplete',['CompileComplete',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381a32558503790304b9e722550831898633',1,'Tgstation::Server::Host::Components']]], + ['compilefailure',['CompileFailure',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381aaef5e71e3b260e64d5349d6e04e7a0bd',1,'Tgstation::Server::Host::Components']]], + ['compilejob',['CompileJob',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_compile_job.html',1,'Tgstation.Server.Api.Models.Internal.CompileJob'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job.html',1,'Tgstation.Server.Api.Models.CompileJob'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.html',1,'Tgstation.Server.Host.Models.CompileJob'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#ac823618905c23e4f88627b5f7a31e64d',1,'Tgstation.Server.Host.Components.Compiler.DmbProvider.CompileJob()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html#aeeccf7f76aa40de5ac4330bdea527b62',1,'Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.CompileJob()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.html#a9cb64d93aa91a3a16ded1cd37e0cf8db',1,'Tgstation.Server.Host.Components.IDmbProvider.CompileJob()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information.html#a02ee6eb05943c4bbfed4aca64692fa80',1,'Tgstation.Server.Host.Models.ReattachInformation.CompileJob()']]], + ['compilejob_2ecs',['CompileJob.cs',['../_tgstation_8_server_8_api_2_models_2_compile_job_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_api_2_models_2_internal_2_compile_job_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_compile_job_8cs.html',1,'(Global Namespace)']]], + ['compilejobconsumer',['compileJobConsumer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#aa6a592415efad8b06cbbc77803a3bdd8',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.compileJobConsumer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a83fa9f5ca1f5dda6fcacbc0131d30fa9',1,'Tgstation.Server.Host.Components.Instance.compileJobConsumer()']]], + ['compilejobs',['CompileJobs',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information.html#a9b60bc78fa491f2fced9f0432a2708ba',1,'Tgstation.Server.Api.Models.RevisionInformation.CompileJobs()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a8d6f9c53e0c41efb8439327fcd6144a5',1,'Tgstation.Server.Host.Models.DatabaseContext.CompileJobs()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#a11f83112916093348d456baf9f3cc082',1,'Tgstation.Server.Host.Models.IDatabaseContext.CompileJobs()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html#ad53239b4213e48130a30f10662a5b2b6',1,'Tgstation.Server.Host.Models.RevisionInformation.CompileJobs()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5da7c63725727d75ca94b3b395198026acb',1,'Tgstation.Server.Api.Rights.CompileJobs()']]], + ['compileprocess',['CompileProcess',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html#abf2c616c3ac6205bdfea350d2bbea222',1,'Tgstation.Server.Host.Components.IInstance.CompileProcess()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#abbd348ec39811a75b5b29d59f7b0c837',1,'Tgstation.Server.Host.Components.Instance.CompileProcess()']]], + ['compilestart',['CompileStart',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381abec1242b376ffdd3ca51b65b2106e843',1,'Tgstation::Server::Host::Components']]], + ['compiling',['compiling',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#ab859ee90b0153ec01fbeeaa6adea6dbe',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['concatpath',['ConcatPath',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#abd68930642dbf40df272b35dc438312e',1,'Tgstation.Server.Host.IO.DefaultIOManager.ConcatPath()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a286f4eb5c679683b7e519847a6c3574e',1,'Tgstation.Server.Host.IO.IIOManager.ConcatPath()']]], + ['configuration',['Configuration',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a7108deed4746a294c82f0b950602edd3',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.configuration()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.html#acf0b5b1529168e0c66003f571a4edb6e',1,'Tgstation.Server.Host.Components.EventConsumer.configuration()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#a5b2985673070866ac14432d088c44b1e',1,'Tgstation.Server.Host.Core.Application.configuration()'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a8aaca6b84ee519e26c8351c2b5929c18',1,'Tgstation.Server.Api.Routes.Configuration()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#a16626c6a13892319d3f24e0c57dd9394',1,'Tgstation.Server.Client.Components.IInstanceClient.Configuration()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a32339ec5eab6e79b673bed2aca4dbceb',1,'Tgstation.Server.Client.Components.InstanceClient.Configuration()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html#a223522ccf4c8fa14c528d55065134f42',1,'Tgstation.Server.Host.Components.IInstance.Configuration()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a49c2073606768819b91a401c21fe3555',1,'Tgstation.Server.Host.Components.Instance.Configuration()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#ae5932bea40716ebcc3145ccfd2c48aa3',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.Configuration()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20a254f642527b45bc260048e30704edb39',1,'Tgstation.Server.Api.Rights.Configuration()']]], + ['configuration_2ecs',['Configuration.cs',['../_configuration_8cs.html',1,'']]], + ['configurationclient',['ConfigurationClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html',1,'Tgstation.Server.Client.Components.ConfigurationClient'],['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test.html#aa48176d89e902d9834158c81ede8fcaf',1,'Tgstation.Server.Tests.Instance.ConfigurationTest.configurationClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#aed092908af675dfdec16528492815010',1,'Tgstation.Server.Client.Components.ConfigurationClient.ConfigurationClient()']]], + ['configurationclient_2ecs',['ConfigurationClient.cs',['../_configuration_client_8cs.html',1,'']]], + ['configurationcontroller',['ConfigurationController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html',1,'Tgstation.Server.Host.Controllers.ConfigurationController'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#a9ed3e9d430a0a4dbe5b2a3e3298089ca',1,'Tgstation.Server.Host.Controllers.ConfigurationController.ConfigurationController()']]], + ['configurationcontroller_2ecs',['ConfigurationController.cs',['../_configuration_controller_8cs.html',1,'']]], + ['configurationfile',['ConfigurationFile',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html',1,'Tgstation.Server.Api.Models.ConfigurationFile'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#aa983574bbb6d05042ad2f96d30ffa824',1,'Tgstation.Server.Api.Routes.ConfigurationFile()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#a60002e47d604a7189fea03b3a4720787',1,'Tgstation.Server.Client.Components.ConfigurationClient.ConfigurationFile(Routes.Configuration, directory, instance.Id, cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#a804b1608adc364d167bf1224e4490642',1,'Tgstation.Server.Client.Components.ConfigurationClient.ConfigurationFile(Routes.Configuration, file ?? throw new ArgumentNullException(nameof(file)), instance.Id, cancellationToken)']]], + ['configurationfile_2ecs',['ConfigurationFile.cs',['../_configuration_file_8cs.html',1,'']]], + ['configurationrights',['ConfigurationRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html#ae62017841e15071fb5d7652fc60d159a',1,'Tgstation.Server.Api.Models.InstanceUser.ConfigurationRights()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a691a59767073bc7dff0f17b809d07b0c',1,'Tgstation.Server.Api.Rights.ConfigurationRights()']]], + ['configurationrights_2ecs',['ConfigurationRights.cs',['../_configuration_rights_8cs.html',1,'']]], + ['configurationtest',['ConfigurationTest',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test.html',1,'Tgstation.Server.Tests.Instance.ConfigurationTest'],['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test.html#a80083c87de2b165124b6c6953b2ee0b8',1,'Tgstation.Server.Tests.Instance.ConfigurationTest.ConfigurationTest()']]], + ['configurationtest_2ecs',['ConfigurationTest.cs',['../_configuration_test_8cs.html',1,'']]], + ['configurationtype',['ConfigurationType',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html#a6183efad1d4344d06e59ea8bc2072a19',1,'Tgstation.Server.Api.Models.Instance.ConfigurationType()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ab7bc96f211e450615be8669d10de2440',1,'Tgstation.Server.Api.Models.ConfigurationType()']]], + ['configurationtype_2ecs',['ConfigurationType.cs',['../_configuration_type_8cs.html',1,'']]], + ['configure',['Configure',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html#aaba3eb445c2c2c0f8a11d150096b7457',1,'Tgstation.Server.Host.Service.Program.Configure()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#ab90a6ff592e181685e3d31cca74200cb',1,'Tgstation.Server.Host.Core.Application.Configure()']]], + ['configurecontrolpanel',['ConfigureControlPanel',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a7e1172bb615dad9313a2c003dc4b6ecb',1,'Tgstation::Server::Host::Core::SetupWizard']]], + ['configuredatabase',['ConfigureDatabase',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a183509bedc6c64025be09ed2a449dc28',1,'Tgstation::Server::Host::Core::SetupWizard']]], + ['configuregeneral',['ConfigureGeneral',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#aa2fcb84250b683e9ae517a7d3f965617',1,'Tgstation::Server::Host::Core::SetupWizard']]], + ['configurelogging',['ConfigureLogging',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a7dd99f9a874086509e1c0517fbaa8033',1,'Tgstation::Server::Host::Core::SetupWizard']]], + ['configureservices',['ConfigureServices',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#aceaab5ce98c719a556d7e9af25d0da81',1,'Tgstation::Server::Host::Core::Application']]], + ['conflictexception',['ConflictException',['../class_tgstation_1_1_server_1_1_client_1_1_conflict_exception.html',1,'Tgstation.Server.Client.ConflictException'],['../class_tgstation_1_1_server_1_1_client_1_1_conflict_exception.html#a1712ba2a2c9c17fd749f7afc9d096df1',1,'Tgstation.Server.Client.ConflictException.ConflictException(ErrorMessage errorMessage, HttpStatusCode statusCode)'],['../class_tgstation_1_1_server_1_1_client_1_1_conflict_exception.html#a6f35d432dfaab891a7652e2fc636c258',1,'Tgstation.Server.Client.ConflictException.ConflictException()'],['../class_tgstation_1_1_server_1_1_client_1_1_conflict_exception.html#a5577bc93af2abe799a86b0c383902ea2',1,'Tgstation.Server.Client.ConflictException.ConflictException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_conflict_exception.html#a08028d33db9e62104c77df9ef3f673af',1,'Tgstation.Server.Client.ConflictException.ConflictException(string message, Exception innerException)']]], + ['conflictexception_2ecs',['ConflictException.cs',['../_conflict_exception_8cs.html',1,'']]], + ['connect',['Connect',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#ae0ae6a98f9e73c337f6b4fca3791df76',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Connect()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.html#a78705214e55337f3970869e3fcabb502',1,'Tgstation.Server.Host.Components.Chat.Providers.IProvider.Connect()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a5db89afa73a4637471b476a2e534861d',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Connect()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#affce280626a132f2e2a2731946e39a0c',1,'Tgstation.Server.Host.Components.Chat.Providers.Provider.Connect()']]], + ['connected',['Connected',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#ac2744da20824177724b971eb20a6d5a0',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Connected()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.html#acc07a6bfb2fbb35243aa1e147d92dd87',1,'Tgstation.Server.Host.Components.Chat.Providers.IProvider.Connected()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#aa22564e0346747e2c00dfcab7a48141c',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Connected()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#afab0213888c139dbb1786d7f5c0d8680',1,'Tgstation.Server.Host.Components.Chat.Providers.Provider.Connected()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a14aac9b9fe6d650e938af7ec023f4147',1,'Tgstation.Server.Host.Components.Chat.Chat.Connected()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html#a975213a6544826725fa975bbf4485db0',1,'Tgstation.Server.Host.Components.Chat.IChat.Connected()']]], + ['connectionname',['ConnectionName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html#aa1a46e5a96e903a9bb79cd1fcf93ea0c',1,'Tgstation::Server::Host::Components::Chat::Channel']]], + ['connectionstring',['ConnectionString',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html#a21674d47d37f627eb1058f47c0018f7b',1,'Tgstation.Server.Api.Models.Internal.ChatBot.ConnectionString()'],['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html#a53a14b4a89de73b8ea223804c4aea365',1,'Tgstation.Server.Host.Configuration.DatabaseConfiguration.ConnectionString()']]], + ['connectionsupdated',['connectionsUpdated',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a70431daa3f7477949d950d44026ee802',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['console',['Console',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.html',1,'Tgstation.Server.Host.IO.Console'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a65a52e0b0d2e65eb557e0250bbe0de97',1,'Tgstation.Server.Host.Core.SetupWizard.console()']]], + ['console_2ecs',['Console.cs',['../_console_8cs.html',1,'']]], + ['constants',['Constants',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html',1,'Tgstation::Server::Host::Components::Interop']]], + ['constants_2ecs',['Constants.cs',['../_constants_8cs.html',1,'']]], + ['content',['Content',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html#a01ea9f02cf1c5f6442b5753c2d0b0024',1,'Tgstation.Server.Api.Models.ConfigurationFile.Content()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_message.html#a3a4a159c1b7b4ff0a163f4bb29ea4844',1,'Tgstation.Server.Host.Components.Chat.Providers.Message.Content()']]], + ['continue',['Continue',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a97c1a4a168451bd7e3be23c467aa2812aa0bfb8e59e6c13fc8d990781f77694fe',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['controller',['Controller',['../class_controller.html',1,'']]], + ['controlpanelconfiguration',['ControlPanelConfiguration',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_control_panel_configuration.html',1,'Tgstation.Server.Host.Configuration.ControlPanelConfiguration'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#a81d7f216e77a45eed438ee3e88d0677c',1,'Tgstation.Server.Host.Controllers.HomeController.controlPanelConfiguration()']]], + ['controlpanelconfiguration_2ecs',['ControlPanelConfiguration.cs',['../_control_panel_configuration_8cs.html',1,'']]], + ['convertapichatchannel',['ConvertApiChatChannel',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html#a30fce4a18499c3c89b4b153b9805ce85',1,'Tgstation::Server::Host::Controllers::ChatController']]], + ['copydirectory',['CopyDirectory',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#ac24671c0d1ce1f6787304c5f4bcccf7c',1,'Tgstation.Server.Host.IO.DefaultIOManager.CopyDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#aab4ec78e2b2d66ad39642ed92a66250c',1,'Tgstation.Server.Host.IO.IIOManager.CopyDirectory()']]], + ['copydirectoryimpl',['CopyDirectoryImpl',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a32ca1367eadecb45e671aa509f3ce058',1,'Tgstation::Server::Host::IO::DefaultIOManager']]], + ['copydmfilesto',['CopyDMFilesTo',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#ab1a680d6faed5978ce9cd0b7e4d9701b',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.CopyDMFilesTo()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.html#a0b26ca1668b405574bd7662965c7ebb7',1,'Tgstation.Server.Host.Components.StaticFiles.IConfiguration.CopyDMFilesTo()']]], + ['copyfile',['CopyFile',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#ac3523b10f3affcd57a6e94ba5297e8fb',1,'Tgstation.Server.Host.IO.DefaultIOManager.CopyFile()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#aff4f7354934126bbc9516b04bc882ef3',1,'Tgstation.Server.Host.IO.IIOManager.CopyFile()']]], + ['copyto',['CopyTo',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#ada48f9615977d839874139999fdd69ef',1,'Tgstation.Server.Host.Components.Repository.IRepository.CopyTo()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a09369ceb3b7c2c2562d546b9daebd42b',1,'Tgstation.Server.Host.Components.Repository.Repository.CopyTo()']]], + ['counter',['counter',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test.html#aebaa596caa1ccd2790509876c417e9a5',1,'Tgstation::Server::Tests::InstanceManagerTest']]], + ['create',['Create',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#a2683730461ef575dbaab18fb01a10162',1,'Tgstation.Server.Client.Components.ChatBotsClient.Create()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html#a781f11da2fc0bc852e57544872e2f47e',1,'Tgstation.Server.Client.Components.IChatBotsClient.Create()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html#a8f315515848f8b7397e71255fa1055c9',1,'Tgstation.Server.Client.Components.IInstanceUserClient.Create()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#af62bfee4e1cdca8a216bdade995a57b7',1,'Tgstation.Server.Client.Components.InstanceUserClient.Create()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.html#a60a4f54b4b6cb61d3c0054b9b7a04604',1,'Tgstation.Server.Client.IUsersClient.Create()'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#a68a9c4aea0859ef158ef8146e22d0fd6',1,'Tgstation.Server.Client.UsersClient.Create()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html#a30b983a28295a3f212c36cc6907b37f2',1,'Tgstation.Server.Host.Controllers.ChatController.Create()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#aca5c1679707f3b3894d947fae0cd3c07',1,'Tgstation.Server.Host.Controllers.ConfigurationController.Create()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#a978c3f00b9a1818feb160aadd3d84ef2',1,'Tgstation.Server.Host.Controllers.DreamDaemonController.Create()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html#acd0aebc6865b1325211cca4adcb466b5',1,'Tgstation.Server.Host.Controllers.DreamMakerController.Create()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#ad6521d3043ce4e24ab0b18e418ba3227',1,'Tgstation.Server.Host.Controllers.InstanceController.Create()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html#aad3a7e66b1db15d453e55da78cfcb331',1,'Tgstation.Server.Host.Controllers.InstanceUserController.Create()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html#ad22b1346f51b1622f627de304f56c902',1,'Tgstation.Server.Host.Controllers.ModelController.Create()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#a8c266005f9d45d569d4f3e992094d9e3',1,'Tgstation.Server.Host.Controllers.RepositoryController.Create()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#ac423fd61e4ee1ab329af57f2c1b4378f',1,'Tgstation.Server.Host.Controllers.UserController.Create()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72a686e697538050e4664636337cc3b834f',1,'Tgstation.Server.Api.Rights.Create()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79a686e697538050e4664636337cc3b834f',1,'Tgstation.Server.Api.Rights.Create()']]], + ['create_3c_20tbody_2c_20tresult_20_3e',['Create< TBody, TResult >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a73701939b0af1ee33b46c931829200fc',1,'Tgstation.Server.Client.ApiClient.Create< TBody, TResult >(string route, TBody body, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#ab5fc54acd429e50a254fccaf23e52299',1,'Tgstation.Server.Client.ApiClient.Create< TBody, TResult >(string route, TBody body, long instanceId, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a0448d3803d9f45d2e67295cef2096174',1,'Tgstation.Server.Client.IApiClient.Create< TBody, TResult >(string route, TBody body, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a726cb2cf80d2499c3e6ff8ae67bbc0ed',1,'Tgstation.Server.Client.IApiClient.Create< TBody, TResult >(string route, TBody body, long instanceId, CancellationToken cancellationToken)']]], + ['create_3c_20tresult_20_3e',['Create< TResult >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a5c7201add0fadb2be2851aa749a0c3c6',1,'Tgstation.Server.Client.ApiClient.Create< TResult >(string route, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a70d6c289a7e07426ff72c36eb2502819',1,'Tgstation.Server.Client.ApiClient.Create< TResult >(string route, long instanceId, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#ac4bbf7c3cc9ff87beda2b13f018a25f5',1,'Tgstation.Server.Client.IApiClient.Create< TResult >(string route, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a16d32f00e49bed861bcbd1c6c9325727',1,'Tgstation.Server.Client.IApiClient.Create< TResult >(string route, long instanceId, CancellationToken cancellationToken)']]], + ['createapiclient',['CreateApiClient',['../class_tgstation_1_1_server_1_1_client_1_1_api_client_factory.html#af1210c7eddf5533d80c0618d99fc6b4d',1,'Tgstation.Server.Client.ApiClientFactory.CreateApiClient()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client_factory.html#add8cac56a24b5f4a43d870395de0ea83',1,'Tgstation.Server.Client.IApiClientFactory.CreateApiClient()']]], + ['createauthenticationcontext',['CreateAuthenticationContext',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html#a2d25109494770497244333f385bd5d7e',1,'Tgstation.Server.Host.Security.AuthenticationContextFactory.CreateAuthenticationContext()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context_factory.html#a6ed924f10ee271ccc8d2ea840c095e23',1,'Tgstation.Server.Host.Security.IAuthenticationContextFactory.CreateAuthenticationContext()']]], + ['createbaseclient',['CreateBaseClient',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory.html#a0d2033f1157b71089477c1383ed77e09',1,'Tgstation::Server::Host::Core::GitHubClientFactory']]], + ['createchat',['CreateChat',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html#af6247bee1404c3167c5df0534e164930',1,'Tgstation.Server.Host.Components.Chat.ChatFactory.CreateChat()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat_factory.html#a931511f281ecbb0ec05c825c1643514e',1,'Tgstation.Server.Host.Components.Chat.IChatFactory.CreateChat()']]], + ['createclient',['CreateClient',['../interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html#a89d0d8409ead36832135461bb544ad09',1,'Tgstation.Server.Client.IInstanceManagerClient.CreateClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#aad7c5289f672bb2598084276d583a1f9',1,'Tgstation.Server.Client.InstanceManagerClient.CreateClient()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory.html#ab32f8e03603c878ebc0affdc144facd0',1,'Tgstation.Server.Host.Core.GitHubClientFactory.CreateClient()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory.html#aa2f86d385b449ccf9b4d9011c0479e34',1,'Tgstation.Server.Host.Core.GitHubClientFactory.CreateClient(string accessToken)'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_git_hub_client_factory.html#a9043597fb0563f7fb0ed751819aa7525',1,'Tgstation.Server.Host.Core.IGitHubClientFactory.CreateClient()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_git_hub_client_factory.html#a9b084c659f289f370933fe1b53e55ce9',1,'Tgstation.Server.Host.Core.IGitHubClientFactory.CreateClient(string accessToken)']]], + ['createconnection',['CreateConnection',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_d_b_connection_factory.html#a9e18bbfbe825774ff29ea64ee232a756',1,'Tgstation.Server.Host.Core.DBConnectionFactory.CreateConnection()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_d_b_connection_factory.html#a775a396b33671101a528d43e8ba0f442',1,'Tgstation.Server.Host.Core.IDBConnectionFactory.CreateConnection()']]], + ['createconnectionstringbuilder',['CreateConnectionStringBuilder',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html#a2619d0f36825f5e92cfd9e80181639d4',1,'Tgstation::Server::Api::Models::Internal::ChatBot']]], + ['createdat',['CreatedAt',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#ab0d92bcf1b5b9afbb0f7ab1e5952acff',1,'Tgstation::Server::Api::Models::Internal::User']]], + ['createdbcontext',['CreateDbContext',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_design_time_db_context_factory.html#a758f3a7be71b35abb7e9947ed6c7874d',1,'Tgstation.Server.Host.Models.Migrations.MySqlDesignTimeDbContextFactory.CreateDbContext()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_design_time_db_context_factory.html#a8964ffb683dde66c4fe3b1590d9e594a',1,'Tgstation.Server.Host.Models.Migrations.SqlServerDesignTimeDbContextFactory.CreateDbContext()']]], + ['createdby',['CreatedBy',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user.html#a3f9a537d3b5f247f4c84ece80a8924a4',1,'Tgstation.Server.Api.Models.User.CreatedBy()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#a8f1821d1c00f73eff7324bf8fc9c1c7e',1,'Tgstation.Server.Host.Models.User.CreatedBy()']]], + ['createdeadsession',['CreateDeadSession',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller_factory.html#af66f5557aadefc4d380b878a60d59239',1,'Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory.CreateDeadSession()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#a4e4a17d6fa2269f86f0da6cce942244d',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.CreateDeadSession()']]], + ['createdirectory',['CreateDirectory',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#ad3f4cf594c24523ba3717b926843c078',1,'Tgstation.Server.Client.Components.ConfigurationClient.CreateDirectory()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.html#ab7b97489e1cb6307e417f6ecc22b9260',1,'Tgstation.Server.Client.Components.IConfigurationClient.CreateDirectory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a9e6d3a7af0e253142f6ea1fe932f6002',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.CreateDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.html#aac9d5ed7fad37fc5f29295f4a3445449',1,'Tgstation.Server.Host.Components.StaticFiles.IConfiguration.CreateDirectory()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a35975e796c564e8b5dd5d4a601d0c2e3',1,'Tgstation.Server.Host.IO.DefaultIOManager.CreateDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a69aa1b9dbeb6af3744e568095c4376e7',1,'Tgstation.Server.Host.IO.IIOManager.CreateDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.html#a87b99f131bf6b48d725561414d4ddfcb',1,'Tgstation.Server.Host.IO.ISynchronousIOManager.CreateDirectory()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.html#a595b31e7065ee0d3431903fa0ac55156',1,'Tgstation.Server.Host.IO.SynchronousIOManager.CreateDirectory()']]], + ['createdusers',['CreatedUsers',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#abe7d2baab75bacc69885b90664d6c81a',1,'Tgstation::Server::Host::Models::User']]], + ['createinstance',['CreateInstance',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_factory.html#acd069937d6ccb57144f9023c6c05412f',1,'Tgstation.Server.Host.Components.IInstanceFactory.CreateInstance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#afa887ad5dc0636a0c0605b59c7284b3c',1,'Tgstation.Server.Host.Components.InstanceFactory.CreateInstance()']]], + ['createorattach',['CreateOrAttach',['../interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html#af937af9989159b8d9336cffa4f3b578a',1,'Tgstation.Server.Client.IInstanceManagerClient.CreateOrAttach()'],['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#a1a1428f9a34d1cec0fa1bc3fe6b8a3a8',1,'Tgstation.Server.Client.InstanceManagerClient.CreateOrAttach()']]], + ['createprovider',['CreateProvider',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_provider_factory.html#aed7d74bc6b967e2d69f727567ab61abd',1,'Tgstation.Server.Host.Components.Chat.IProviderFactory.CreateProvider()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html#ae6dfc0771ddd57040d0b83fd6e99141d',1,'Tgstation.Server.Host.Components.Chat.ProviderFactory.CreateProvider()']]], + ['createreattachinformation',['CreateReattachInformation',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#a9ef1702c2f488c44b7f4a1cd328bb92f',1,'Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.CreateReattachInformation()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#a0f806ceeb96d87b20963af6368ffae0f',1,'Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.CreateReattachInformation()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#ab10a4b4a00e9e54761121771f475cdf6',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.CreateReattachInformation()']]], + ['createserver',['CreateServer',['../interface_tgstation_1_1_server_1_1_host_1_1_i_server_factory.html#a378688ff3642bb0b72b9224dacb24704',1,'Tgstation.Server.Host.IServerFactory.CreateServer()'],['../class_tgstation_1_1_server_1_1_host_1_1_server_factory.html#a9074ef7b4f79ffba8a4213d6b56938e1',1,'Tgstation.Server.Host.ServerFactory.CreateServer()']]], + ['createserverclient',['CreateServerClient',['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client_factory.html#aed42fe9280a989ba78b8fd2a830a93a8',1,'Tgstation.Server.Client.IServerClientFactory.CreateServerClient(Uri host, string username, string password, TimeSpan timeout=default, CancellationToken cancellationToken=default)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client_factory.html#a58ce916728cfc81f8e143682cd1df5e7',1,'Tgstation.Server.Client.IServerClientFactory.CreateServerClient(Uri host, Token token, TimeSpan timeout=default)'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.html#a358685d267630347317e476195680cc9',1,'Tgstation.Server.Client.ServerClientFactory.CreateServerClient(Uri host, string username, string password, TimeSpan timeout, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.html#a6c53de0537efa094a9c2c52b681acaa2',1,'Tgstation.Server.Client.ServerClientFactory.CreateServerClient(Uri host, Token token, TimeSpan timeout)']]], + ['createsymboliclink',['CreateSymbolicLink',['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_symlink_factory.html#a35bd8c53ef36c4a655e827750a40699c',1,'Tgstation.Server.Host.IO.ISymlinkFactory.CreateSymbolicLink()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_symlink_factory.html#ac487bf33d9a5821fb30bfd7b74915fbe',1,'Tgstation.Server.Host.IO.PosixSymlinkFactory.CreateSymbolicLink()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_symlink_factory.html#a87a0b1b31b48f65e53e4b3b6f476a2c0',1,'Tgstation.Server.Host.IO.WindowsSymlinkFactory.CreateSymbolicLink()'],['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#a668c437c860fb2eafcee04a1a2a613c9',1,'Tgstation.Server.Host.NativeMethods.CreateSymbolicLink()']]], + ['createsymboliclinkflags',['CreateSymbolicLinkFlags',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#afecbde132584de6ed7e41c8c7535f556',1,'Tgstation::Server::Host::NativeMethods']]], + ['createsystemidentity',['CreateSystemIdentity',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity_factory.html#adaf274d215700bf692b1c3964ff32103',1,'Tgstation.Server.Host.Security.ISystemIdentityFactory.CreateSystemIdentity(User user, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity_factory.html#a6dd83aca91cf43c7236afd22dc512b0a',1,'Tgstation.Server.Host.Security.ISystemIdentityFactory.CreateSystemIdentity(string username, string password, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_posix_system_identity_factory.html#a8e2c85e4ed45d68065f86749afa4651d',1,'Tgstation.Server.Host.Security.PosixSystemIdentityFactory.CreateSystemIdentity(User user, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_posix_system_identity_factory.html#a4621a750f1d0592586d26323af215d93',1,'Tgstation.Server.Host.Security.PosixSystemIdentityFactory.CreateSystemIdentity(string username, string password, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.html#a5c140611a428b663c3a3f76623f825c2',1,'Tgstation.Server.Host.Security.WindowsSystemIdentityFactory.CreateSystemIdentity(User user, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.html#a24c82be81ba5cda6c975a931e8bfe6f1',1,'Tgstation.Server.Host.Security.WindowsSystemIdentityFactory.CreateSystemIdentity(string username, string password, CancellationToken cancellationToken)']]], + ['createtestinstance',['CreateTestInstance',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test.html#a5ba9c70a99ad2cb505e7e958fce0921e',1,'Tgstation::Server::Tests::InstanceManagerTest']]], + ['createtoken',['CreateToken',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#afe4c43b884ebd0e9c4b60e39d4e1c162',1,'Tgstation.Server.Host.Controllers.HomeController.CreateToken()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_token_factory.html#a57edffc2d8c63352fbf4ebd0b5991b45',1,'Tgstation.Server.Host.Security.ITokenFactory.CreateToken()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html#a17610f96f7e87136d957e8ba3c1f5d4a',1,'Tgstation.Server.Host.Security.TokenFactory.CreateToken()']]], + ['createusers',['CreateUsers',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a5f1b5a9225190982810802d7a85bb601a90212f132b4b808fe81b7022759031d9',1,'Tgstation::Server::Api::Rights']]], + ['createwatchdog',['CreateWatchdog',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog_factory.html#a2d65347fcee2ad4fc13d67334689668c',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdogFactory.CreateWatchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#a81947168cca38f3c1ffa1e82b57add86',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.CreateWatchdog()'],['../interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog_factory.html#a4610f9c60c131dab81a56aa23abdfbb8',1,'Tgstation.Server.Host.Watchdog.IWatchdogFactory.CreateWatchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory.html#ae25446ee2a7bb19d9208695d18621914',1,'Tgstation.Server.Host.Watchdog.WatchdogFactory.CreateWatchdog()']]], + ['credentialsprovider',['CredentialsProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider.html',1,'Tgstation.Server.Host.Components.Repository.CredentialsProvider'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a9c50da4252e0c984da5f3042053ca28f',1,'Tgstation.Server.Host.Components.InstanceFactory.credentialsProvider()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#afdb8ee82eed9e1b0251d71af2c3ff612',1,'Tgstation.Server.Host.Components.Repository.Repository.credentialsProvider()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#aa5ecd6e3290afe55b0ab07da6ec99948',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.credentialsProvider()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider.html#afabb0d6c31961ce6f295822688694196',1,'Tgstation.Server.Host.Components.Repository.CredentialsProvider.CredentialsProvider()']]], + ['credentialsprovider_2ecs',['CredentialsProvider.cs',['../_credentials_provider_8cs.html',1,'']]], + ['cryptographysuite',['CryptographySuite',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html',1,'Tgstation.Server.Host.Security.CryptographySuite'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#ae61c8c28bfce67853a5b1acbcd095533',1,'Tgstation.Server.Host.Components.InstanceFactory.cryptographySuite()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#a24b2b18a44b0dceb3311a307e47b085b',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.cryptographySuite()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#a78651298906fc1500952310c49c96e06',1,'Tgstation.Server.Host.Controllers.HomeController.cryptographySuite()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#aba1ed8b3befb54640af05c3694eeb278',1,'Tgstation.Server.Host.Controllers.UserController.cryptographySuite()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder.html#a8162408ea812918c39584a7e2131dfee',1,'Tgstation.Server.Host.Models.DatabaseSeeder.cryptographySuite()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html#a57c7a5016e948842f6d52697f806614b',1,'Tgstation.Server.Host.Security.CryptographySuite.CryptographySuite()']]], + ['cryptographysuite_2ecs',['CryptographySuite.cs',['../_cryptography_suite_8cs.html',1,'']]], + ['currentallowwebclient',['CurrentAllowWebclient',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html#a5ec4c59c00dccb5e0b87e4bf2c2d9566',1,'Tgstation::Server::Api::Models::DreamDaemon']]], + ['currentauthenticationcontext',['CurrentAuthenticationContext',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html#a37a564f1b33b53dc2af9fb751b5a7e9b',1,'Tgstation.Server.Host.Security.AuthenticationContextFactory.CurrentAuthenticationContext()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context_factory.html#a6c1be0fe695cf57fa21674373868f709',1,'Tgstation.Server.Host.Security.IAuthenticationContextFactory.CurrentAuthenticationContext()']]], + ['currentport',['CurrentPort',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html#a3740443b5c26f64b1b4f516399219040',1,'Tgstation::Server::Api::Models::DreamDaemon']]], + ['currentsecurity',['CurrentSecurity',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html#aea8a6590efc3c90d0e57f532902a149e',1,'Tgstation::Server::Api::Models::DreamDaemon']]], + ['currentwaittask',['currentWaitTask',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html#a080ec217e432312482ed673597618a3b',1,'Tgstation::Server::Host::Core::Tests::TestJobHandler']]], + ['customcommand',['CustomCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.html',1,'Tgstation::Server::Host::Components::Chat::Commands']]], + ['customcommand_2ecs',['CustomCommand.cs',['../_custom_command_8cs.html',1,'']]], + ['customcommandhandler',['customCommandHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#aaf9418637d15f3785e1a7225fc12ea5b',1,'Tgstation.Server.Host.Components.Chat.Chat.customCommandHandler()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#a29e2454d48fe2ce5e023c37bd2ceb5b8',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext.customCommandHandler()']]] +]; diff --git a/search/all_4.html b/search/all_4.html new file mode 100644 index 0000000000..dd062aeaee --- /dev/null +++ b/search/all_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_4.js b/search/all_4.js new file mode 100644 index 0000000000..f52b947a8f --- /dev/null +++ b/search/all_4.js @@ -0,0 +1,129 @@ +var searchData= +[ + ['databaseconfiguration',['DatabaseConfiguration',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html',1,'Tgstation.Server.Host.Configuration.DatabaseConfiguration'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a97d089b379a721eb4d130c034dce8c2b',1,'Tgstation.Server.Host.Models.DatabaseContext.DatabaseConfiguration()']]], + ['databaseconfiguration_2ecs',['DatabaseConfiguration.cs',['../_database_configuration_8cs.html',1,'']]], + ['databasecontext',['DatabaseContext',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html',1,'Tgstation.Server.Host.Models.DatabaseContext< TParentContext >'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#ab687e0fc0cb712708297c0c2b43ca849',1,'Tgstation.Server.Host.Controllers.ApiController.DatabaseContext()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a3ea918ebd28eef6067c1ec62daa31283',1,'Tgstation.Server.Host.Models.DatabaseContext.DatabaseContext()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html#a4f3486b694a62f17ead5bfe84d20d8e0',1,'Tgstation.Server.Host.Security.AuthenticationContextFactory.databaseContext()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_claims_injector.html#a3fce82f6290d85c4b2b5182cbf7b6c74',1,'Tgstation.Server.Host.Security.ClaimsInjector.databaseContext()']]], + ['databasecontext_2ecs',['DatabaseContext.cs',['../_database_context_8cs.html',1,'']]], + ['databasecontext_3c_20mysqldatabasecontext_20_3e',['DatabaseContext< MySqlDatabaseContext >',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html',1,'Tgstation::Server::Host::Models']]], + ['databasecontext_3c_20sqlserverdatabasecontext_20_3e',['DatabaseContext< SqlServerDatabaseContext >',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html',1,'Tgstation::Server::Host::Models']]], + ['databasecontextfactory',['DatabaseContextFactory',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_database_context_factory.html',1,'Tgstation.Server.Host.Core.DatabaseContextFactory'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_database_context_factory.html#ac86f5235ead630a89c2f021c61226996',1,'Tgstation.Server.Host.Core.DatabaseContextFactory.DatabaseContextFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#abbd5571bc7db746a0f12add2f39e67de',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.databaseContextFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#a092a4f6583f2101fbef0ec6caf5c41a0',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.databaseContextFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a731c40527d51bd6c7674ecc0514b8d30',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.databaseContextFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a4379ea13292a9bc2f8c297b8be8bdf08',1,'Tgstation.Server.Host.Components.Instance.databaseContextFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a1b570e9e9d997c7b93842a93f1a362d6',1,'Tgstation.Server.Host.Components.InstanceFactory.databaseContextFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#ab5c8e78bdae6eb6eb2ed289563c639cc',1,'Tgstation.Server.Host.Components.InstanceManager.databaseContextFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html#ae9849f4e26995f2e0161117857c4ee02',1,'Tgstation.Server.Host.Components.ReattachInfoHandler.databaseContextFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a2b81969e82fa9f6af2bc57597ed92cfb',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.databaseContextFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#af53ebd4410384ee791f3d9c8dd282e88',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.databaseContextFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a928cf25a91203c4808627c4c02dc8771',1,'Tgstation.Server.Host.Core.JobManager.databaseContextFactory()']]], + ['databasecontextfactory_2ecs',['DatabaseContextFactory.cs',['../_database_context_factory_8cs.html',1,'']]], + ['databaseseeder',['DatabaseSeeder',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder.html',1,'Tgstation.Server.Host.Models.DatabaseSeeder'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder.html#ac35912f3685af59a6a0347e8c96c1868',1,'Tgstation.Server.Host.Models.DatabaseSeeder.DatabaseSeeder()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a190f9903acbbbd1fb7da29291639b874',1,'Tgstation.Server.Host.Models.DatabaseContext.databaseSeeder()']]], + ['databaseseeder_2ecs',['DatabaseSeeder.cs',['../_database_seeder_8cs.html',1,'']]], + ['databasetype',['DatabaseType',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html#adab83eaad53afabdb2f7b43c23ece38a',1,'Tgstation.Server.Host.Configuration.DatabaseConfiguration.DatabaseType()'],['../namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html#acda8f6ee23a9ee8ac298f7b4a7d5617c',1,'Tgstation.Server.Host.Configuration.DatabaseType()']]], + ['databasetype_2ecs',['DatabaseType.cs',['../_database_type_8cs.html',1,'']]], + ['dbconnectionfactory',['DBConnectionFactory',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_d_b_connection_factory.html',1,'Tgstation.Server.Host.Core.DBConnectionFactory'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#aa15c53be5a78c0429bfa9a3ae4ae4e56',1,'Tgstation.Server.Host.Core.SetupWizard.dbConnectionFactory()']]], + ['dbconnectionfactory_2ecs',['DBConnectionFactory.cs',['../_d_b_connection_factory_8cs.html',1,'']]], + ['dbcontext',['DbContext',['../class_db_context.html',1,'']]], + ['deadsessioncontroller',['DeadSessionController',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#ae6d762429f47307b1391b01c8148df73',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.DeadSessionController()']]], + ['deadsessioncontroller_2ecs',['DeadSessionController.cs',['../_dead_session_controller_8cs.html',1,'']]], + ['debug',['Debug',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html#a938d576ceba93bf3cb1a32ae1dcccc52',1,'Tgstation::Server::Host::Service::Program']]], + ['defaultadminpassword',['DefaultAdminPassword',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user.html#a6b47a29b6c75f6a51d8c7d0d4305e210',1,'Tgstation::Server::Api::Models::User']]], + ['defaultbuffersize',['DefaultBufferSize',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a8d302b2be6862b23b9a18a9412fc7fc9',1,'Tgstation::Server::Host::IO::DefaultIOManager']]], + ['defaultbyondtopictimeout',['DefaultByondTopicTimeout',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html#a51c2f2b2e7faf729aad307050a6d8a6c',1,'Tgstation::Server::Host::Configuration::GeneralConfiguration']]], + ['defaultgithubrepositoryid',['DefaultGitHubRepositoryId',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html#a7f4f5cb3301033fd4dfebde47baf9c5a',1,'Tgstation::Server::Host::Configuration::UpdatesConfiguration']]], + ['defaultgittagprefix',['DefaultGitTagPrefix',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html#ae004e4379b32596669db26f1bdffef84',1,'Tgstation::Server::Host::Configuration::UpdatesConfiguration']]], + ['defaultiomanager',['DefaultIOManager',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html',1,'Tgstation::Server::Host::IO']]], + ['defaultiomanager_2ecs',['DefaultIOManager.cs',['../_default_i_o_manager_8cs.html',1,'']]], + ['defaultloglevel',['DefaultLogLevel',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html#a20cad976d13ebead44836c2c73546eb1',1,'Tgstation::Server::Host::Configuration::FileLoggingConfiguration']]], + ['defaultmicrosoftloglevel',['DefaultMicrosoftLogLevel',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html#a2ed7c15d2389baf4cb4aea475a33ee43',1,'Tgstation::Server::Host::Configuration::FileLoggingConfiguration']]], + ['defaultminimumpasswordlength',['DefaultMinimumPasswordLength',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html#a2f4d695a6363f6d92a8adb8f7860e809',1,'Tgstation::Server::Host::Configuration::GeneralConfiguration']]], + ['defaultrestarttimeout',['DefaultRestartTimeout',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html#ae39a7785775edb052a36047300b8ec6b',1,'Tgstation::Server::Host::Configuration::GeneralConfiguration']]], + ['defaultupdatepackageassetname',['DefaultUpdatePackageAssetName',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html#a2414ab0c1cbd67d474c6484d065ec90a',1,'Tgstation::Server::Host::Configuration::UpdatesConfiguration']]], + ['delay',['Delay',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_async_delayer.html#a28ea9fb35caed002bf15a67b03d5e0c7',1,'Tgstation.Server.Host.Core.AsyncDelayer.Delay()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_async_delayer.html#afab931ac159bc999fee1e7eda917c7d6',1,'Tgstation.Server.Host.Core.IAsyncDelayer.Delay()']]], + ['delete',['Delete',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a79097c50707454b30e031a6cf53c1cca',1,'Tgstation.Server.Client.ApiClient.Delete(string route, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#ac4676e1e4197c8b3177738388a70db2e',1,'Tgstation.Server.Client.ApiClient.Delete(string route, long instanceId, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#af21f7f62a34e6486d979bf56f93ab522',1,'Tgstation.Server.Client.Components.ChatBotsClient.Delete()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html#a9ce8f7309dd82e761f821939ad877036',1,'Tgstation.Server.Client.Components.IChatBotsClient.Delete()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html#a1e57e5258ee0d519916cbf6e8452de12',1,'Tgstation.Server.Client.Components.IInstanceUserClient.Delete()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#a66319c3cf70b1e17e7d03d00113680ef',1,'Tgstation.Server.Client.Components.InstanceUserClient.Delete()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.html#a542817cc102394601ab78412d37f82ba',1,'Tgstation.Server.Client.Components.IRepositoryClient.Delete()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#a53bf505d9df01bc1bccec11d00e44733',1,'Tgstation.Server.Client.Components.RepositoryClient.Delete()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a6954d79598a2d4498c99e201481dc6b1',1,'Tgstation.Server.Client.IApiClient.Delete(string route, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a64cf5a4f7ea0ce4a99164906fcdfd19a',1,'Tgstation.Server.Client.IApiClient.Delete(string route, long instanceId, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#aacf3549e22bb38699d3226a156e3e0dc',1,'Tgstation.Server.Host.Controllers.AdministrationController.Delete()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html#ae4c12e239d686b07a2113aabe128a0cd',1,'Tgstation.Server.Host.Controllers.ChatController.Delete()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#a70a6018d637cb3eb379b8949a4a754a8',1,'Tgstation.Server.Host.Controllers.ConfigurationController.Delete()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#a014b1924b2ff406c5d064307c9b69f7f',1,'Tgstation.Server.Host.Controllers.DreamDaemonController.Delete()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#ab7a4f28a43b2e9f369a4eeb2f26c04bf',1,'Tgstation.Server.Host.Controllers.InstanceController.Delete()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html#a208fd4ded9833be6c485266ed656c442',1,'Tgstation.Server.Host.Controllers.InstanceUserController.Delete()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html#a46dd58545389064a931f500ee5dcc1b5',1,'Tgstation.Server.Host.Controllers.JobController.Delete()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html#a5b17152b965b2fdc3856cbe989c32e56',1,'Tgstation.Server.Host.Controllers.ModelController.Delete()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#ad5ffc737feb4385afff13146e336a910',1,'Tgstation.Server.Host.Controllers.RepositoryController.Delete()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72af2a6c498fb90ee345d997f888fce3b18',1,'Tgstation.Server.Api.Rights.Delete()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a691a59767073bc7dff0f17b809d07b0caf2a6c498fb90ee345d997f888fce3b18',1,'Tgstation.Server.Api.Rights.Delete()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79af2a6c498fb90ee345d997f888fce3b18',1,'Tgstation.Server.Api.Rights.Delete()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39af2a6c498fb90ee345d997f888fce3b18',1,'Tgstation.Server.Api.Rights.Delete()']]], + ['delete_3c_20tbody_20_3e',['Delete< TBody >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a16602577e0ea7e639491f47873aa07c2',1,'Tgstation.Server.Client.ApiClient.Delete< TBody >()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a59cd6ab3e15c7b5e35268a68e381dd5d',1,'Tgstation.Server.Client.IApiClient.Delete< TBody >()']]], + ['delete_3c_20tresult_20_3e',['Delete< TResult >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#afa6dc92d38b59a7a6a2e44126bb5ad50',1,'Tgstation.Server.Client.ApiClient.Delete< TResult >()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a70767f3f66d4486d4025835ece18d9ef',1,'Tgstation.Server.Client.IApiClient.Delete< TResult >()']]], + ['deleteconnection',['DeleteConnection',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a243d9f218ecf2d6fb157181433c805c9',1,'Tgstation.Server.Host.Components.Chat.Chat.DeleteConnection()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html#ac01264cccd53b252392b22dd6338ec67',1,'Tgstation.Server.Host.Components.Chat.IChat.DeleteConnection()']]], + ['deletedirectory',['DeleteDirectory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a79f673d1a6c8868b648c0c3393e34d27',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.DeleteDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.html#a38c2d45d551a853c4a1545dcf1996063',1,'Tgstation.Server.Host.Components.StaticFiles.IConfiguration.DeleteDirectory()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a9146389753424cef9d723c88589b3263',1,'Tgstation.Server.Host.IO.DefaultIOManager.DeleteDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#ad3e0dda4b7fbad4c77f48ba3b2681dc7',1,'Tgstation.Server.Host.IO.IIOManager.DeleteDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.html#ad7db8df684e3820376d161b6ac89804f',1,'Tgstation.Server.Host.IO.ISynchronousIOManager.DeleteDirectory()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.html#a238b441b58a9da1b2e2821f203b65deb',1,'Tgstation.Server.Host.IO.SynchronousIOManager.DeleteDirectory()']]], + ['deleteemptydirectory',['DeleteEmptyDirectory',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#a6b1c64f700e702c9944463c9cd7d4419',1,'Tgstation.Server.Client.Components.ConfigurationClient.DeleteEmptyDirectory()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.html#ab64268e03bd3451604bf4c4bdbbec2ba',1,'Tgstation.Server.Client.Components.IConfigurationClient.DeleteEmptyDirectory()']]], + ['deletefile',['DeleteFile',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#ad75df660abbe0d645edc657cf9910a1a',1,'Tgstation.Server.Host.IO.DefaultIOManager.DeleteFile()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a6ca322ea63f5693487917c1ee71c707a',1,'Tgstation.Server.Host.IO.IIOManager.DeleteFile()']]], + ['deleterepository',['DeleteRepository',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository_manager.html#a0476484a5f4909326dfd7edcf697716d',1,'Tgstation.Server.Host.Components.Repository.IRepositoryManager.DeleteRepository()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#a48d21690a40164c4a11d81be94055395',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.DeleteRepository()']]], + ['description',['Description',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html#ab37543e34480a044000bd542bf88aa15',1,'Tgstation::Server::Api::Models::Internal::Job']]], + ['designtimedbcontextfactoryhelpers',['DesignTimeDbContextFactoryHelpers',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_design_time_db_context_factory_helpers.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['designtimedbcontextfactoryhelpers_2ecs',['DesignTimeDbContextFactoryHelpers.cs',['../_design_time_db_context_factory_helpers_8cs.html',1,'']]], + ['detach',['Detach',['../interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html#abd45f73a94f3e25829be0e477c73caad',1,'Tgstation.Server.Client.IInstanceManagerClient.Detach()'],['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#a9aaeff926049f5bc8c311fc67b4fb78c',1,'Tgstation.Server.Client.InstanceManagerClient.Detach()']]], + ['devjson',['DevJson',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_design_time_db_context_factory_helpers.html#a32170f36db0a402620aa92f645fe5c45',1,'Tgstation::Server::Host::Models::Migrations::DesignTimeDbContextFactoryHelpers']]], + ['die',['Die',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control.html#a2eb5bdeb76bf1fbfdb297219af3ede45',1,'Tgstation.Server.Host.Core.IServerControl.Die()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#ae61fcfdb226cd0f5126e29ffb6fff403',1,'Tgstation.Server.Host.Server.Die()']]], + ['directory',['Directory',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html#aad824931c595d0e0c5522892e9467499',1,'Tgstation.Server.Host.Configuration.FileLoggingConfiguration.Directory()'],['../class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html#ac4bd05b1f3b435566f633bdbaf980ab6',1,'Tgstation.Server.Tests.TestingServer.Directory()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#a048dc25d07e09e17d7f697cf6ded2dd7',1,'Tgstation.Server.Host.Controllers.ConfigurationController.Directory()'],['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#afecbde132584de6ed7e41c8c7535f556ae73cda510e8bb947f7e61089e5581494',1,'Tgstation.Server.Host.NativeMethods.Directory()']]], + ['directoryexists',['DirectoryExists',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#ad1b0c2e2bdf35fa955cc62f13349f19a',1,'Tgstation.Server.Host.IO.DefaultIOManager.DirectoryExists()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#ae1f28b3b77349cbfbb9b3f9ba1271e5e',1,'Tgstation.Server.Host.IO.IIOManager.DirectoryExists()']]], + ['directoryname',['DirectoryName',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_compile_job.html#af7f70d7f52963a2b3c80537734ba7967',1,'Tgstation::Server::Api::Models::Internal::CompileJob']]], + ['disable',['Disable',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html#af1c69ac7d59ed1817d59b0022d86db15',1,'Tgstation::Server::Host::Configuration::FileLoggingConfiguration']]], + ['disallowed',['Disallowed',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ab7bc96f211e450615be8669d10de2440ade99ae8770699a4725a85853a0790d24',1,'Tgstation::Server::Api::Models']]], + ['disconnect',['Disconnect',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#a449b9d2cfad03af62ac00b752f843869',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Disconnect()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.html#ae24ff61d2fb16b41675498d0d95b67d8',1,'Tgstation.Server.Host.Components.Chat.Providers.IProvider.Disconnect()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#ad4de9ce051d7d17408902660018fbc0c',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Disconnect()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#a09ac5284bd746cd4a6008e5747c31dc9',1,'Tgstation.Server.Host.Components.Chat.Providers.Provider.Disconnect()']]], + ['disconnecting',['disconnecting',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a86767ec9cfd43611d9d5e00cad58197e',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]], + ['discord',['Discord',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a2d962413bc23404156feea75066e39cca8f5cc6430613f1c12f36965050bb7197',1,'Tgstation::Server::Api::Models']]], + ['discordchannelid',['DiscordChannelId',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html#a7d69363fd8b5b85e8a66d7c6d4aeb4ec',1,'Tgstation::Server::Api::Models::ChatChannel']]], + ['discordconnectionstringbuilder',['DiscordConnectionStringBuilder',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder.html',1,'Tgstation.Server.Api.Models.DiscordConnectionStringBuilder'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder.html#a6728e43a98a9f8a7e99cb4b286ae03af',1,'Tgstation.Server.Api.Models.DiscordConnectionStringBuilder.DiscordConnectionStringBuilder()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder.html#acf0ae3d6a9370ce06e612d8edb6773e9',1,'Tgstation.Server.Api.Models.DiscordConnectionStringBuilder.DiscordConnectionStringBuilder(string connectionString)']]], + ['discordconnectionstringbuilder_2ecs',['DiscordConnectionStringBuilder.cs',['../_discord_connection_string_builder_8cs.html',1,'']]], + ['discordprovider',['DiscordProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#abe6a8573e1dabb518760ad0855b22a32',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.DiscordProvider()']]], + ['discordprovider_2ecs',['DiscordProvider.cs',['../_discord_provider_8cs.html',1,'']]], + ['dispose',['Dispose',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#ad4afd612c75a7240f3aa27b49520a1bf',1,'Tgstation.Server.Client.ApiClient.Dispose()'],['../class_tgstation_1_1_server_1_1_client_1_1_http_client.html#a01a43b38e92d4c35f303db4d24a2d27a',1,'Tgstation.Server.Client.HttpClient.Dispose()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#abcacb02b4b6734d065f599659914c2ff',1,'Tgstation.Server.Client.ServerClient.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.html#af8246eaaf2299ebea9af766cad757790',1,'Tgstation.Server.Host.Components.Byond.ByondExecutableLock.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#ad943befa858b57706c8fdeac1c93a7bc',1,'Tgstation.Server.Host.Components.Byond.ByondManager.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#ac28dcfb947617ce11f16c9812e4a5a22',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#aee3b3b6b1c9881104aaae99e92936087',1,'Tgstation.Server.Host.Components.Chat.Chat.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#a39ac250abe610588d3ace612dadf0349',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#af246d1ba4609e088232968f6bcfb32f9',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a42a3640c402f3907704c03f78a19fd8f',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#af65e78f38c21aa4b6b080695ec16cf60',1,'Tgstation.Server.Host.Components.Chat.Providers.Provider.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a07b0bea40ec947926abb767ee66fe5bf',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#af2b79136fa590da24e65b64bf90e119e',1,'Tgstation.Server.Host.Components.Compiler.DmbProvider.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html#a5d9370e4b3d5328babf18ae7cd88ef7c',1,'Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#aeb054aea1394bc477846bb850f7016a0',1,'Tgstation.Server.Host.Components.Instance.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a435d2fb1ad9eeafe2629263a8d78b050',1,'Tgstation.Server.Host.Components.InstanceManager.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#a72b538a5a7ce3b22a1c73a443d4a3925',1,'Tgstation.Server.Host.Components.Interop.CommContext.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a3ea44742a122a7d74046017a02f5ea08',1,'Tgstation.Server.Host.Components.Repository.Repository.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#a61b0a56eced0f9e75057c0c9f17b5d1d',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a490ea3b8f33527e6b1e348346195503a',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#aa3177ce8605a5b37207597bc1e120e71',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a38c78aee4660c3fb696fe2ea5396cd21',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a8d954bc88514cf9103a552bf2b7bcd6a',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.Dispose(bool disposing)'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a674ad9d3fd9d5716186fdb65b99d40ab',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#a76bec34132621ff6fa122665b3a128d1',1,'Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html#a6958c4ad79c009aa019cc008fc84ff14',1,'Tgstation.Server.Host.Core.JobHandler.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a0fbc7a6125fa4033bb93b9de7f0e5ce4',1,'Tgstation.Server.Host.Core.JobManager.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a872943801535a9784fe6521eff33ce13',1,'Tgstation.Server.Host.Core.Process.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration.html#a1a4d9a4d259d03ff3f69b2b061c2e5df',1,'Tgstation.Server.Host.Core.RestartRegistration.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html#a7a90d285258c8e67e5a351c6b8854537',1,'Tgstation.Server.Host.Core.SemaphoreSlimContext.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a4a5a80952341c5a9e0f3a84e27734f8a',1,'Tgstation.Server.Host.Security.AuthenticationContext.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html#accc9334a642e563e47c5308df2d5149a',1,'Tgstation.Server.Host.Security.AuthenticationContextFactory.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html#a8a7ab89f157f77d9424c642587fd0460',1,'Tgstation.Server.Host.Security.IdentityCache.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.html#abf1fccfffa19349bb551ffe64c364387',1,'Tgstation.Server.Host.Security.IdentityCacheObject.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html#a69861e38af0e65778b2e6e5692fd87a4',1,'Tgstation.Server.Host.Security.WindowsSystemIdentity.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a75ee7501b3cb59e3e34c05f382380292',1,'Tgstation.Server.Host.Service.ServerService.Dispose()'],['../class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html#a961376f9557fb389f26cafb5fb93ab96',1,'Tgstation.Server.Tests.TestingServer.Dispose()']]], + ['disposeandnullcontrollers',['DisposeAndNullControllers',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#ab4158781aa5500e7fa039bc969c51ef1',1,'Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.DisposeAndNullControllers()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#a38336dfb2d02f0b73e0613a6aea17d5d',1,'Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.DisposeAndNullControllers()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#ad03dbc1b36b5c42f944d93f13f6260af',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.DisposeAndNullControllers()']]], + ['disposed',['disposed',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a6ba869dae354db235f8518f7283a531c',1,'Tgstation.Server.Host.Components.InstanceManager.disposed()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#a46d77cba8bfc8b6d13c19e72cb3b5078',1,'Tgstation.Server.Host.Components.Interop.CommContext.disposed()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#ac332e36882ad48a5bb7c78cb2b855613',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.disposed()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a7af2a032fc9db77dbc4df931c3617df1',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.disposed()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html#aa3af81c7e35c2832f0f932a346a98d8a',1,'Tgstation.Server.Host.Core.SemaphoreSlimContext.disposed()']]], + ['dmb',['Dmb',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a99c7fcb369f62c78b96d287ef9ccb4a2',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Dmb()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#ab8c54c9d9b013c7456401a3b3173238d',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.Dmb()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_reattach_information.html#aadaab8323c76425738ce0c593814ae97',1,'Tgstation.Server.Host.Components.Watchdog.ReattachInformation.Dmb()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#aa52d31cca5d62e4d483ccf7992442abc',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.Dmb()']]], + ['dmbavailable',['DmbAvailable',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a1d5d557eb411705dd02240b69c74a59e',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.DmbAvailable()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory.html#afd7fb709889bfe02d0f8c128626c88a6',1,'Tgstation.Server.Host.Components.Compiler.IDmbFactory.DmbAvailable()']]], + ['dmbextension',['DmbExtension',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#ad9af96ad4344bc2e662209a741879f5f',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['dmbfactory',['DmbFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a4c3746b0143784d232119fdb418263ba',1,'Tgstation.Server.Host.Components.Instance.dmbFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html#ab0896e8ad879c9c2e2f787f4375fd77d',1,'Tgstation.Server.Host.Components.ReattachInfoHandler.dmbFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a401d41a1b1b805f553f53b35f46275ef',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.DmbFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a52e9bb5f3fdb7e52468afa0ba740e535',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.DmbFactory()']]], + ['dmbfactory_2ecs',['DmbFactory.cs',['../_dmb_factory_8cs.html',1,'']]], + ['dmbname',['DmbName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#a477f78136e0e3bd185543c3279b193ef',1,'Tgstation.Server.Host.Components.Compiler.DmbProvider.DmbName()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html#aa4865055b3f5a9187953b509e8593841',1,'Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.DmbName()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.html#aa24e55fcc06b68ca29feaf598a4277ba',1,'Tgstation.Server.Host.Components.IDmbProvider.DmbName()']]], + ['dmbprovider',['DmbProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html',1,'Tgstation.Server.Host.Components.Compiler.DmbProvider'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#a1537e8b8f8b55841d8d1b51104acb521',1,'Tgstation.Server.Host.Components.Compiler.DmbProvider.DmbProvider()']]], + ['dmbprovider_2ecs',['DmbProvider.cs',['../_dmb_provider_8cs.html',1,'']]], + ['dmcommandapivalidate',['DMCommandApiValidate',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a492cb9c5c1139f76d46438277d66378a',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmcommandchat',['DMCommandChat',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a0d3f04c1d36e7157c7facc7717606848',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmcommandendprocess',['DMCommandEndProcess',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a2a7dfa12298ad3e1dea02fbd1cede501',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmcommandnewport',['DMCommandNewPort',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#acbd267ece34cba8bdcfb533a0cc92d44',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmcommandserverprimed',['DMCommandServerPrimed',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a7b1e719867f307e4399a6d24bb0d454b',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmcommandworldreboot',['DMCommandWorldReboot',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#ab2d2b53ca45e60c6cd0f719913bd2791',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmeextension',['DmeExtension',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#aaab8de158fb3cb8e6de1b56736fbadc6',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['dmename',['DmeName',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_compile_job.html#ac800c1acb193352543a231a96f9e3dbf',1,'Tgstation::Server::Api::Models::Internal::CompileJob']]], + ['dminteropaccessidentifier',['DMInteropAccessIdentifier',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a4f0d734fb08f796526da3d3b2747d0a0',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmparametercommand',['DMParameterCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#aa8a8b0676aefae55757c6afd811f3dc3',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmparameterdata',['DMParameterData',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a8e19e0554d9dcfddb46110ced36da22e',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmparamhostversion',['DMParamHostVersion',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#af139bef52e1ab852ab1c6531538308ad',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmparaminfojson',['DMParamInfoJson',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#aeb1132f64b0adb08029040ac427df4f7',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmresponsesuccess',['DMResponseSuccess',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a016c03536b104f1d147392cd60670d07',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmtopicchangeport',['DMTopicChangePort',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a1741f4781314f7173dca820ccd100e38',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmtopicchangereboot',['DMTopicChangeReboot',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a23dd73bc4fc4d9711f6877fc2ec29ef6',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmtopicchatcommand',['DMTopicChatCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#ae21e91d11e6e623bbbdc9a2cd7500083',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmtopicevent',['DMTopicEvent',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a4e512e97be9a5ef91c921d30662a29c3',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmtopicinteropresponse',['DMTopicInteropResponse',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#aca3a447a172e5e80d21701dc80da0f4a',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['donotdeletethissession',['DoNotDeleteThisSession',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.html#ae54582fd5e1f354554c9a0402eb72a2b',1,'Tgstation.Server.Host.Components.Byond.ByondExecutableLock.DoNotDeleteThisSession()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock.html#aefcf67dd06a656e319e6d6e42a2aef81',1,'Tgstation.Server.Host.Components.Byond.IByondExecutableLock.DoNotDeleteThisSession()']]], + ['down',['Down',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html#a469e01870addd0180bf8f990143b7dfc',1,'Tgstation.Server.Host.Models.Migrations.MSInitialCreate.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html#a6ab7991e1cc2bd0e72632d8b8dec4855',1,'Tgstation.Server.Host.Models.Migrations.MYInitialCreate.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html#a743a5621955d43df4e9780cf76183e23',1,'Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html#a2221d0ff68cbf208df1b312c6864f263',1,'Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html#a17867b620f610dcfea1677ea948f6433',1,'Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html#a182d1024fbd7af021730f7604dcf3dcb',1,'Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html#abcd54980626daace56399a31c3256640',1,'Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html#a813507ad90afe25188b1fbb76e8d850d',1,'Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.html#acb8bff6be45c396886c413c2f531c14a',1,'Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.html#a0a073717d8541e39b758f7f303bcd6eb',1,'Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_fix_rev_info_index.html#ae1e363b16d159ef0c3beebdd502d590e',1,'Tgstation.Server.Host.Models.Migrations.MSFixRevInfoIndex.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_fix_rev_info_index.html#a294142c6d27fea69492ac0ed683f334b',1,'Tgstation.Server.Host.Models.Migrations.MYFixRevInfoIndex.Down()']]], + ['downgradeversion',['downgradeVersion',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a909262eddcaca553541c052dbf98b325',1,'Tgstation::Server::Host::Components::InstanceManager']]], + ['downloadfile',['DownloadFile',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a509e05cc7905cda41869f57bee5c6c58',1,'Tgstation.Server.Host.IO.DefaultIOManager.DownloadFile()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a20647d9e4dd09b806e407cd5c8a23b9b',1,'Tgstation.Server.Host.IO.IIOManager.DownloadFile()']]], + ['downloadversion',['DownloadVersion',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.html#a827552d8311f380aecac2fd75beecc52',1,'Tgstation.Server.Host.Components.Byond.IByondInstaller.DownloadVersion()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#aeac3c26b791aa9ce7e6651883d7ec9fe',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DownloadVersion()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a509d23a163b9b7dcd94ee7e682af944a',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.DownloadVersion()']]], + ['dreamdaemon',['DreamDaemon',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html',1,'Tgstation.Server.Api.Models.DreamDaemon'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a42831355d8d0cd578680f7f8f3f1124a',1,'Tgstation.Server.Api.Routes.DreamDaemon()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#a3d0fe52c8e2428ab13df3f14a4c9d36e',1,'Tgstation.Server.Client.Components.IInstanceClient.DreamDaemon()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a2a6e49e9e7b6d23a95f9839ab4add778',1,'Tgstation.Server.Client.Components.InstanceClient.DreamDaemon()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#ab5eab4143b5b6250e72b4ea05b2a039c',1,'Tgstation.Server.Client.Components.DreamDaemonClient.DreamDaemon()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20a82a60e2400e19cffe6b38b295e10d4c8',1,'Tgstation.Server.Api.Rights.DreamDaemon()']]], + ['dreamdaemon_2ecs',['DreamDaemon.cs',['../_dream_daemon_8cs.html',1,'']]], + ['dreamdaemonclient',['DreamDaemonClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html',1,'Tgstation.Server.Client.Components.DreamDaemonClient'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#a8bf0ad726b61e3dbc31a53c7ea0822c2',1,'Tgstation.Server.Client.Components.DreamDaemonClient.DreamDaemonClient()']]], + ['dreamdaemonclient_2ecs',['DreamDaemonClient.cs',['../_dream_daemon_client_8cs.html',1,'']]], + ['dreamdaemoncontroller',['DreamDaemonController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html',1,'Tgstation.Server.Host.Controllers.DreamDaemonController'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#ad6d82fab816712a4c95163e0ee2a4d7d',1,'Tgstation.Server.Host.Controllers.DreamDaemonController.DreamDaemonController()']]], + ['dreamdaemoncontroller_2ecs',['DreamDaemonController.cs',['../_dream_daemon_controller_8cs.html',1,'']]], + ['dreamdaemonexecutablename',['DreamDaemonExecutableName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#a0e3bcbe1b14ed825ea567a6f859884f7',1,'Tgstation::Server::Host::Components::Byond::PosixByondInstaller']]], + ['dreamdaemonlaunchparameters',['DreamDaemonLaunchParameters',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.html',1,'Tgstation::Server::Api::Models::Internal']]], + ['dreamdaemonlaunchparameters_2ecs',['DreamDaemonLaunchParameters.cs',['../_dream_daemon_launch_parameters_8cs.html',1,'']]], + ['dreamdaemonname',['DreamDaemonName',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.html#ad43d91cf402c0084067dee5d1b182cde',1,'Tgstation.Server.Host.Components.Byond.IByondInstaller.DreamDaemonName()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#a34eca6f24e5a1960b5b8b892ae3372b9',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DreamDaemonName()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#ae567a962061a2b40662d32aad8462724',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.DreamDaemonName()']]], + ['dreamdaemonpath',['DreamDaemonPath',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.html#aebbd445eb581a534e4ad8ff6b0f6c1ce',1,'Tgstation.Server.Host.Components.Byond.ByondExecutableLock.DreamDaemonPath()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock.html#af7c6d39dcd1075f42e8721446b5e159f',1,'Tgstation.Server.Host.Components.Byond.IByondExecutableLock.DreamDaemonPath()']]], + ['dreamdaemonrights',['DreamDaemonRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html#a8367896a1a9ff6e745d0c62b85d8fd0e',1,'Tgstation.Server.Api.Models.InstanceUser.DreamDaemonRights()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49',1,'Tgstation.Server.Api.Rights.DreamDaemonRights()']]], + ['dreamdaemonrights_2ecs',['DreamDaemonRights.cs',['../_dream_daemon_rights_8cs.html',1,'']]], + ['dreamdaemonsecurity',['DreamDaemonSecurity',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ad4850e6b78816679602b13d63d2869b5',1,'Tgstation::Server::Api::Models']]], + ['dreamdaemonsecurity_2ecs',['DreamDaemonSecurity.cs',['../_dream_daemon_security_8cs.html',1,'']]], + ['dreamdaemonsettings',['DreamDaemonSettings',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_settings.html',1,'Tgstation.Server.Api.Models.Internal.DreamDaemonSettings'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html',1,'Tgstation.Server.Host.Models.DreamDaemonSettings'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a08672938118f8e33e151f025cdf6a4ce',1,'Tgstation.Server.Host.Models.DatabaseContext.DreamDaemonSettings()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#ae38b73e25cfd71eb688bf80dd2cefc78',1,'Tgstation.Server.Host.Models.IDatabaseContext.DreamDaemonSettings()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a94cb9055338f1d52397f10aab18f554d',1,'Tgstation.Server.Host.Models.Instance.DreamDaemonSettings()']]], + ['dreamdaemonsettings_2ecs',['DreamDaemonSettings.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_dream_daemon_settings_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_dream_daemon_settings_8cs.html',1,'(Global Namespace)']]], + ['dreamdaemonstatus',['DreamDaemonStatus',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a358f54d77ecd35adb4be872af559eb23',1,'Tgstation::Server::Api::Models']]], + ['dreamdaemonstatus_2ecs',['DreamDaemonStatus.cs',['../_dream_daemon_status_8cs.html',1,'']]], + ['dreammaker',['DreamMaker',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker.html',1,'Tgstation.Server.Api.Models.DreamMaker'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a164263b206a0a3a81ba7fb96b16e4846',1,'Tgstation.Server.Host.Components.Instance.dreamMaker()'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#acc5a1421208a8e29080110f54b364ba8',1,'Tgstation.Server.Api.Routes.DreamMaker()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#a5a505ae2d713942640558e34222b444b',1,'Tgstation.Server.Client.Components.IInstanceClient.DreamMaker()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#af92b0694efe4453eee2ea50d9c18616e',1,'Tgstation.Server.Client.Components.InstanceClient.DreamMaker()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#a62edd66a221c9b7044bd068dcf7324d9',1,'Tgstation.Server.Client.Components.DreamMakerClient.DreamMaker()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a40482c625ab675928223bcafa234a43c',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.DreamMaker()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20af179dcd47770d7cc1eb149ee1a0d06af',1,'Tgstation.Server.Api.Rights.DreamMaker()']]], + ['dreammaker_2ecs',['DreamMaker.cs',['../_tgstation_8_server_8_api_2_models_2_dream_maker_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_components_2_compiler_2_dream_maker_8cs.html',1,'(Global Namespace)']]], + ['dreammakerclient',['DreamMakerClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html',1,'Tgstation.Server.Client.Components.DreamMakerClient'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#a04dd94462a3bb8aad7469c84d53f78a9',1,'Tgstation.Server.Client.Components.DreamMakerClient.DreamMakerClient()']]], + ['dreammakerclient_2ecs',['DreamMakerClient.cs',['../_dream_maker_client_8cs.html',1,'']]], + ['dreammakercontroller',['DreamMakerController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html',1,'Tgstation.Server.Host.Controllers.DreamMakerController'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html#a5434cff9c9fa15212f0630672f48de13',1,'Tgstation.Server.Host.Controllers.DreamMakerController.DreamMakerController()']]], + ['dreammakercontroller_2ecs',['DreamMakerController.cs',['../_dream_maker_controller_8cs.html',1,'']]], + ['dreammakerexecutablename',['DreamMakerExecutableName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#a1563b9bcd5a68d5d2528475956e7d9e8',1,'Tgstation::Server::Host::Components::Byond::PosixByondInstaller']]], + ['dreammakername',['DreamMakerName',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.html#a40f9cadd672f9e36c3a89be2df1cb4b5',1,'Tgstation.Server.Host.Components.Byond.IByondInstaller.DreamMakerName()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#ac5887915176212ab4ca1902f7750314a',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DreamMakerName()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#aaba69fd950bfdaa2fcdf218075ccc9fa',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.DreamMakerName()']]], + ['dreammakerpath',['DreamMakerPath',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.html#a4d5315a7648111cd6851fe47dfe859a2',1,'Tgstation.Server.Host.Components.Byond.ByondExecutableLock.DreamMakerPath()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock.html#a45a3041c6d9e0ba81d361090549bb072',1,'Tgstation.Server.Host.Components.Byond.IByondExecutableLock.DreamMakerPath()']]], + ['dreammakerrights',['DreamMakerRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html#a51bb2f3a485f142fc1b60cc1c4c53052',1,'Tgstation.Server.Api.Models.InstanceUser.DreamMakerRights()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5d',1,'Tgstation.Server.Api.Rights.DreamMakerRights()']]], + ['dreammakerrights_2ecs',['DreamMakerRights.cs',['../_dream_maker_rights_8cs.html',1,'']]], + ['dreammakersettings',['DreamMakerSettings',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html',1,'Tgstation.Server.Host.Models.DreamMakerSettings'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a7c518cbed0128eab8d5449799e960129',1,'Tgstation.Server.Host.Models.DatabaseContext.DreamMakerSettings()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#afd5dbabf36739e297555f3ba3928c99a',1,'Tgstation.Server.Host.Models.IDatabaseContext.DreamMakerSettings()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a09929f71b77a27fc5f609ff64cf190d6',1,'Tgstation.Server.Host.Models.Instance.DreamMakerSettings()']]], + ['dreammakersettings_2ecs',['DreamMakerSettings.cs',['../_dream_maker_settings_8cs.html',1,'']]], + ['dropdatabase',['DropDatabase',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html#a30f47f73075f305073ad72ef3ff44cd4',1,'Tgstation::Server::Host::Configuration::DatabaseConfiguration']]] +]; diff --git a/search/all_5.html b/search/all_5.html new file mode 100644 index 0000000000..f0780fdd34 --- /dev/null +++ b/search/all_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_5.js b/search/all_5.js new file mode 100644 index 0000000000..f422cfefd0 --- /dev/null +++ b/search/all_5.js @@ -0,0 +1,29 @@ +var searchData= +[ + ['editownpassword',['EditOwnPassword',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#affda1440f9c5e2dfcca65138d2f89a21a6ca04cb3c1c0f79210a1e67312debeb5',1,'Tgstation::Server::Api::Rights']]], + ['enable',['Enable',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_control_panel_configuration.html#a15564859b17400f1bcc723a5fbee8121',1,'Tgstation::Server::Host::Configuration::ControlPanelConfiguration']]], + ['enablecustomchatcommands',['EnableCustomChatCommands',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#aaa719b3d931db6811b3056569a6aa2dc',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.EnableCustomChatCommands()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#ae7a1f5cde45d316a03c6e040122639ae',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.EnableCustomChatCommands()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a403bf639776b8c18994b3588df150acd',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.EnableCustomChatCommands()']]], + ['enabled',['Enabled',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html#a4d973efbcdc9eee5597989f2667c42b3',1,'Tgstation.Server.Api.Models.Internal.ChatBot.Enabled()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#a4a0a4bb6e68f049511123dbb5f1dc094',1,'Tgstation.Server.Api.Models.Internal.User.Enabled()']]], + ['enqueuemessage',['EnqueueMessage',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#ac45c189505744c6f1012461193fca877',1,'Tgstation::Server::Host::Components::Chat::Providers::Provider']]], + ['ensuredirectories',['EnsureDirectories',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a5a067086b7757d904b99cabe914a925c',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]], + ['enumchildwindows',['EnumChildWindows',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#a6b4b37ca121784ecd63c477cc022415d',1,'Tgstation::Server::Host::NativeMethods']]], + ['enumwindow',['EnumWindow',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#a8700ec33883a4fa21de33d9b980ddf31',1,'Tgstation::Server::Host::Components::Watchdog::WindowsNetworkPromptReaper']]], + ['enumwindowproc',['EnumWindowProc',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#a865bfe43e7d4085326ccf40500eb4222',1,'Tgstation::Server::Host::NativeMethods']]], + ['errormessage',['ErrorMessage',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html',1,'Tgstation::Server::Api::Models']]], + ['errormessage_2ecs',['ErrorMessage.cs',['../_error_message_8cs.html',1,'']]], + ['errorstringbuilder',['errorStringBuilder',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#aed074d21bc6397bdcf9b0e18caaa5bca',1,'Tgstation::Server::Host::Core::Process']]], + ['eventconsumer',['EventConsumer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.html',1,'Tgstation.Server.Host.Components.EventConsumer'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.html#a6d87fe2d067c9a71ed39e1e3e1a59d86',1,'Tgstation.Server.Host.Components.EventConsumer.EventConsumer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a089219b6d371df8777befb66d5ca9ff7',1,'Tgstation.Server.Host.Components.Byond.ByondManager.eventConsumer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a8d26e10bd830ba3cca93599e0ac2b22b',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.eventConsumer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a16093d1600746a3ab9c232461c5d7da6',1,'Tgstation.Server.Host.Components.Instance.eventConsumer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#aeee0875d15975270e6f16417f78423a6',1,'Tgstation.Server.Host.Components.Repository.Repository.eventConsumer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#ad06470fddc597f80d4cef6b96c30b3e0',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.eventConsumer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a5768c37124d54e80c66dc63d28d0dea4',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.eventConsumer()']]], + ['eventconsumer_2ecs',['EventConsumer.cs',['../_event_consumer_8cs.html',1,'']]], + ['eventnotification',['EventNotification',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_event_notification.html',1,'Tgstation::Server::Host::Components::Interop']]], + ['eventnotification_2ecs',['EventNotification.cs',['../_event_notification_8cs.html',1,'']]], + ['eventscriptssubdirectory',['EventScriptsSubdirectory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#af5dbdc7fa9d0999905d214a98c4604ee',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]], + ['eventtype',['EventType',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381',1,'Tgstation::Server::Host::Components']]], + ['eventtype_2ecs',['EventType.cs',['../_event_type_8cs.html',1,'']]], + ['eventtypescriptfilenamemap',['EventTypeScriptFileNameMap',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a595152ecd2fd978f124506abce9250b3',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]], + ['exceptiondetails',['ExceptionDetails',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html#aac65a410c6b14e0a33b256e3d4451486',1,'Tgstation::Server::Api::Models::Internal::Job']]], + ['exit',['Exit',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a97c1a4a168451bd7e3be23c467aa2812afef46e5063ce3dc78b8ae64fa474241d',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['exitcode',['ExitCode',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_launch_result.html#a335ce27ca86ba77136fd1e705de3f512',1,'Tgstation::Server::Host::Components::Watchdog::LaunchResult']]], + ['experimentalwatchdog',['ExperimentalWatchdog',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html',1,'Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#ad44257e1c074701c56ec3e775102538f',1,'Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.ExperimentalWatchdog()']]], + ['experimentalwatchdog_2ecs',['ExperimentalWatchdog.cs',['../_experimental_watchdog_8cs.html',1,'']]], + ['expiresat',['ExpiresAt',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_token.html#a9c42e74cbe7ed59f9b86e825f3a185d6',1,'Tgstation::Server::Api::Models::Token']]] +]; diff --git a/search/all_6.html b/search/all_6.html new file mode 100644 index 0000000000..39b0f555ce --- /dev/null +++ b/search/all_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_6.js b/search/all_6.js new file mode 100644 index 0000000000..d842bb5713 --- /dev/null +++ b/search/all_6.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['fetchorigin',['FetchOrigin',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#a749160f7ea74fc975303e46d5ad196e0',1,'Tgstation.Server.Host.Components.Repository.IRepository.FetchOrigin()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a9e88ae9848a65008f544cfd34071f115',1,'Tgstation.Server.Host.Components.Repository.Repository.FetchOrigin()']]], + ['file',['File',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a6e67fe387a01c4d8e686734ad936f8b0',1,'Tgstation.Server.Api.Routes.File()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#a51d11df3997c7f49c6fb8e7784d3f2d0',1,'Tgstation.Server.Host.Controllers.ConfigurationController.File()']]], + ['fileexists',['FileExists',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#ab1b31bbcb5d4bdc0650d81a19af5d6ae',1,'Tgstation.Server.Host.IO.DefaultIOManager.FileExists()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a4088b7924c694d628acd99b5a0829c86',1,'Tgstation.Server.Host.IO.IIOManager.FileExists()'],['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test.html#a829c327d0e5cbc853d13fdc174403d2e',1,'Tgstation.Server.Tests.Instance.ConfigurationTest.FileExists()']]], + ['fileloggingconfiguration',['FileLoggingConfiguration',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html',1,'Tgstation::Server::Host::Configuration']]], + ['fileloggingconfiguration_2ecs',['FileLoggingConfiguration.cs',['../_file_logging_configuration_8cs.html',1,'']]], + ['filesystemwatcher',['fileSystemWatcher',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#aeefa70f3fd0bc957bb192aee1aff0a68',1,'Tgstation::Server::Host::Components::Interop::CommContext']]], + ['findwindow',['FindWindow',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#aaff201757860dd95c1ab3047ac6e2ec8',1,'Tgstation::Server::Host::NativeMethods']]], + ['forbidduetomodeconflicts',['ForbidDueToModeConflicts',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#a3478628e5a443b65c9ffb565d4da2cde',1,'Tgstation::Server::Host::Controllers::ConfigurationController']]], + ['force',['Force',['../namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html#ac25a13ffb39d53803eca454f2a329fc1a9eb6b78a99cdb6ffd3d40d18621d9f80',1,'Tgstation::Server::Host::Configuration']]], + ['friendlyname',['FriendlyName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html#a2f8b52c4cbf230594917ade44b5479ca',1,'Tgstation.Server.Host.Components.Chat.Channel.FriendlyName()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user.html#a43d565af3741b4ab20b085df942f7c5e',1,'Tgstation.Server.Host.Components.Chat.User.FriendlyName()']]], + ['fromcompilejob',['FromCompileJob',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#ad34e5b047ffa03fce6137457db55c41e',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.FromCompileJob()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory.html#afbbacb6765fb5cfc3062fbab20bd76d7',1,'Tgstation.Server.Host.Components.Compiler.IDmbFactory.FromCompileJob()']]] +]; diff --git a/search/all_7.html b/search/all_7.html new file mode 100644 index 0000000000..9cd0196e77 --- /dev/null +++ b/search/all_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_7.js b/search/all_7.js new file mode 100644 index 0000000000..5ecce8e2df --- /dev/null +++ b/search/all_7.js @@ -0,0 +1,49 @@ +var searchData= +[ + ['gamestaticfilessubdirectory',['GameStaticFilesSubdirectory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#ae8e07adce00ed418cb29954182699623',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]], + ['generalconfiguration',['GeneralConfiguration',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html',1,'Tgstation.Server.Host.Configuration.GeneralConfiguration'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#aab3385abba108359f03c60b1885f48af',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.generalConfiguration()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#adb0b189a10ec43510b9f10cff91106fd',1,'Tgstation.Server.Host.Controllers.AdministrationController.generalConfiguration()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#abe159da9c5fbc8eba3c3feff488988a0',1,'Tgstation.Server.Host.Controllers.RepositoryController.generalConfiguration()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#a79e1198432e7e557c8d72b3adf71bbf1',1,'Tgstation.Server.Host.Controllers.UserController.generalConfiguration()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#aff15cc6f241427b983f4f183d0d33dc7',1,'Tgstation.Server.Host.Core.SetupWizard.generalConfiguration()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a2823acb68609f9953788b1460ca8cdd3',1,'Tgstation.Server.Host.Server.generalConfiguration()']]], + ['generalconfiguration_2ecs',['GeneralConfiguration.cs',['../_general_configuration_8cs.html',1,'']]], + ['generatecommands',['GenerateCommands',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#a6d69dde344df916a244626be56bc1b78',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.GenerateCommands()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command_factory.html#a3f5fdca17c71257d34528f45f61ed469',1,'Tgstation.Server.Host.Components.Chat.Commands.ICommandFactory.GenerateCommands()']]], + ['generatehandler',['GenerateHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider.html#a0354146fcbb7410adee01f9e82c11e4b',1,'Tgstation.Server.Host.Components.Repository.CredentialsProvider.GenerateHandler()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_credentials_provider.html#a2073b6366f063ff6a8b3ee844e1a7ded',1,'Tgstation.Server.Host.Components.Repository.ICredentialsProvider.GenerateHandler()']]], + ['generatepushoptions',['GeneratePushOptions',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#ae497427222edeac86fbaea36d2dac220',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['getactivecontroller',['GetActiveController',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#ac8039f2bf0c909c13c2091f5dd676613',1,'Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.GetActiveController()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#a4ee975227e7f5550cc584af7e36dfcfd',1,'Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.GetActiveController()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a634f53946305b875c65c04dfd1719830',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.GetActiveController()']]], + ['getallchildhandles',['GetAllChildHandles',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#a568155e47f6f154a48b9793470bab959',1,'Tgstation::Server::Host::Components::Watchdog::WindowsNetworkPromptReaper']]], + ['getcombinedoutput',['GetCombinedOutput',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.html#a44195e1a2830c53385ab8a70a0d35d9c',1,'Tgstation.Server.Host.Core.IProcess.GetCombinedOutput()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a6bc9b5525d72bcf5cc0579c350063b55',1,'Tgstation.Server.Host.Core.Process.GetCombinedOutput()']]], + ['getcompilejob',['GetCompileJob',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#abcc6c859b5cad4037507e5a0c163dcbc',1,'Tgstation.Server.Client.Components.DreamMakerClient.GetCompileJob()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html#a844bc0b226b4298ae06e3cfe953cc6c4',1,'Tgstation.Server.Client.Components.IDreamMakerClient.GetCompileJob()']]], + ['getcustomcommands',['GetCustomCommands',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_json_tracking_context.html#a4c767f16648c5d7e61e393871eff1847',1,'Tgstation.Server.Host.Components.Chat.IJsonTrackingContext.GetCustomCommands()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#ae5f9940133bdf066397d293d04bdb88b',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext.GetCustomCommands()']]], + ['getdbcontextoptions',['GetDbContextOptions',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_design_time_db_context_factory_helpers.html#a6464620324133063bf91162c86e07d8c',1,'Tgstation::Server::Host::Models::Migrations::DesignTimeDbContextFactoryHelpers']]], + ['getdirectories',['GetDirectories',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#acae0255ab165ae1421ece5b1d5fbdf29',1,'Tgstation.Server.Host.IO.DefaultIOManager.GetDirectories()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a4813de766ae0c63cf3ba34e4a40626ca',1,'Tgstation.Server.Host.IO.IIOManager.GetDirectories()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.html#a254a4bab3839ca09cdeade65387523d7',1,'Tgstation.Server.Host.IO.ISynchronousIOManager.GetDirectories()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.html#a65612d712154495899633c1195579b08',1,'Tgstation.Server.Host.IO.SynchronousIOManager.GetDirectories()']]], + ['getdirectoryname',['GetDirectoryName',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a993c9bef376d9b28f47e97d8bdf21d04',1,'Tgstation.Server.Host.IO.DefaultIOManager.GetDirectoryName()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a691970cc91e5576b06ed9ce14e51d9b8',1,'Tgstation.Server.Host.IO.IIOManager.GetDirectoryName()']]], + ['getdotnetpath',['GetDotnetPath',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html#a8d0f1fffc5a866c3d542d2e1c106fbb4',1,'Tgstation::Server::Host::Watchdog::Watchdog']]], + ['geterroroutput',['GetErrorOutput',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.html#a46cfee91f4dc1088a7be8408bbece6ce',1,'Tgstation.Server.Host.Core.IProcess.GetErrorOutput()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a4fdc81bd4df6fb68bc1c576a397a0906',1,'Tgstation.Server.Host.Core.Process.GetErrorOutput()']]], + ['getfilename',['GetFileName',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#adf2a105e1c455565c3c15de9078f1282',1,'Tgstation.Server.Host.IO.DefaultIOManager.GetFileName()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a0d6d5a54db205d2d1d45a927d57f5182',1,'Tgstation.Server.Host.IO.IIOManager.GetFileName()']]], + ['getfilenamewithoutextension',['GetFileNameWithoutExtension',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a5e595bab061d2fe0b1f6cb0454a44a12',1,'Tgstation.Server.Host.IO.DefaultIOManager.GetFileNameWithoutExtension()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#ab6635afaf199a1396a743f3b46eac786',1,'Tgstation.Server.Host.IO.IIOManager.GetFileNameWithoutExtension()']]], + ['getfiles',['GetFiles',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a29ee8cd097023d261cab484b6732cdb6',1,'Tgstation.Server.Host.IO.DefaultIOManager.GetFiles()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#aca74c5436163f98c2780e8aa1468d098',1,'Tgstation.Server.Host.IO.IIOManager.GetFiles()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.html#ad8368416aaa9561f5a55f8705639060e',1,'Tgstation.Server.Host.IO.ISynchronousIOManager.GetFiles()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.html#a9a2b8e249e8a8f9786158e30b52471da',1,'Tgstation.Server.Host.IO.SynchronousIOManager.GetFiles()']]], + ['getfileswithextension',['GetFilesWithExtension',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#adb83c449f775cc4926d580b4c2b692bd',1,'Tgstation.Server.Host.IO.DefaultIOManager.GetFilesWithExtension()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a3a1f02b2e5c45cdb690c13cac8283816',1,'Tgstation.Server.Host.IO.IIOManager.GetFilesWithExtension()']]], + ['getgithubclient',['GetGitHubClient',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#a35af4d06cfa01eea597d3e29e74b0e21',1,'Tgstation::Server::Host::Controllers::AdministrationController']]], + ['getid',['GetId',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#aafc459bdd85faa34ca004f760699355d',1,'Tgstation.Server.Client.Components.ChatBotsClient.GetId()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html#af3ce02a1214ddb80ef5021683fa1c778',1,'Tgstation.Server.Client.Components.IChatBotsClient.GetId()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html#ab3a233f8693053d156993065bd4705cb',1,'Tgstation.Server.Client.Components.IInstanceUserClient.GetId()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client.html#a81f63e00b0598d9da4e701c929758c23',1,'Tgstation.Server.Client.Components.IJobsClient.GetId()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#ab231f97fcf3c7ac3c920bae0530c96a0',1,'Tgstation.Server.Client.Components.InstanceUserClient.GetId()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html#a4dfacac4c1b116591f1c016bfbe4efb3',1,'Tgstation.Server.Client.Components.JobsClient.GetId()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html#ae1c05f75c697ddba9bf488cf899749fb',1,'Tgstation.Server.Client.IInstanceManagerClient.GetId()'],['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#ac8d222eb11e9fe074119eb2ae6fc9f2f',1,'Tgstation.Server.Client.InstanceManagerClient.GetId()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.html#a30511d277c85e7fb8ee65ff6f753f0ab',1,'Tgstation.Server.Client.IUsersClient.GetId()'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#a514da40bf7db90218c7700f8e6b7a288',1,'Tgstation.Server.Client.UsersClient.GetId()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html#a22224fd61a9aba508f1ccd7f6e1a0f3a',1,'Tgstation.Server.Host.Controllers.ChatController.GetId()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html#aa015061d5be81446c63021baaa3d0974',1,'Tgstation.Server.Host.Controllers.DreamMakerController.GetId()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a1cc74a6cb2792c43dd06a7b2eb975218',1,'Tgstation.Server.Host.Controllers.InstanceController.GetId()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html#a2a30dda94e6540698d48034173abd1d9',1,'Tgstation.Server.Host.Controllers.InstanceUserController.GetId()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html#a64bbe6b961dd571aed02cd722e1a155a',1,'Tgstation.Server.Host.Controllers.JobController.GetId()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html#a2197f6b49489738de613f6d4cac0ff85',1,'Tgstation.Server.Host.Controllers.ModelController.GetId()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#a7d6b74a7303032d27eef7536c9a878fa',1,'Tgstation.Server.Host.Controllers.UserController.GetId()']]], + ['getinstance',['GetInstance',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.html#af8941660b12690639e314c4c266e33c4',1,'Tgstation.Server.Host.Components.IInstanceManager.GetInstance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#ab9ce721dc3f4039aa0563490a94bead5',1,'Tgstation.Server.Host.Components.InstanceManager.GetInstance()']]], + ['getjobids',['GetJobIds',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#a4ac0e968d26cc7bb2500021014618b36',1,'Tgstation.Server.Client.Components.DreamMakerClient.GetJobIds()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html#a26f84a9c414291c600ac60c802443d05',1,'Tgstation.Server.Client.Components.IDreamMakerClient.GetJobIds()']]], + ['getlogger',['GetLogger',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application_builder_extensions.html#a7cb4857346ca0e098ebe8c92e9748b62',1,'Tgstation::Server::Host::Core::ApplicationBuilderExtensions']]], + ['getprocess',['GetProcess',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_executor.html#a0ff5a1763bb628b00b952d8f1177980f',1,'Tgstation.Server.Host.Core.IProcessExecutor.GetProcess()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html#a3accd5eef9199021b60058ac46b834cb',1,'Tgstation.Server.Host.Core.ProcessExecutor.GetProcess()']]], + ['getrepositoryownername',['GetRepositoryOwnerName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#adec58d79f9d6c5fe1bc4e43f9f036308',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['getright',['GetRight',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#ade8aeb7dd0a0e480f6f89bd5973703c7',1,'Tgstation.Server.Host.Security.AuthenticationContext.GetRight()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context.html#af5d37fc8159a215c75c3f3688f4415ea',1,'Tgstation.Server.Host.Security.IAuthenticationContext.GetRight()']]], + ['getsecurebytes',['GetSecureBytes',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html#aeaa749c8ecd658514c3d913950268cfc',1,'Tgstation.Server.Host.Security.CryptographySuite.GetSecureBytes()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_cryptography_suite.html#ac6fa20935fc73a1dca313376b5b79d1a',1,'Tgstation.Server.Host.Security.ICryptographySuite.GetSecureBytes()']]], + ['getsecurestring',['GetSecureString',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html#a241b23ae24a7354312245e1cb606f882',1,'Tgstation.Server.Host.Security.CryptographySuite.GetSecureString()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_cryptography_suite.html#ab49e5041cfb7333ee413c9719046ae37',1,'Tgstation.Server.Host.Security.ICryptographySuite.GetSecureString()']]], + ['getserializersettings',['GetSerializerSettings',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#aed28ea7a7fff4be99f3c65a8dcd0a47e',1,'Tgstation::Server::Client::ApiClient']]], + ['getstandardoutput',['GetStandardOutput',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.html#a8f714e7914821c4528baae64ee4639ee',1,'Tgstation.Server.Host.Core.IProcess.GetStandardOutput()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#afb3d9a6f2e0180f1b0f1687d738bc738',1,'Tgstation.Server.Host.Core.Process.GetStandardOutput()']]], + ['getuseranddomainname',['GetUserAndDomainName',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.html#a1cca1b38097ffb81518592e6b967cecf',1,'Tgstation::Server::Host::Security::WindowsSystemIdentityFactory']]], + ['getwindowtext',['GetWindowText',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#aab504dccd83453d3af13a7e4feceb7a9',1,'Tgstation::Server::Host::NativeMethods']]], + ['getwindowthreadprocessid',['GetWindowThreadProcessId',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#a346862e4a517dcfe04a256ec49e7ecea',1,'Tgstation::Server::Host::NativeMethods']]], + ['githubaccesstoken',['GitHubAccessToken',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html#a97eae217a6ba8e75256e745f98f926b8',1,'Tgstation::Server::Host::Configuration::GeneralConfiguration']]], + ['githubclientfactory',['GitHubClientFactory',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory.html',1,'Tgstation.Server.Host.Core.GitHubClientFactory'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory.html#aae860ee190f366dd5f5d95ba33132ad5',1,'Tgstation.Server.Host.Core.GitHubClientFactory.GitHubClientFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#ab75fda1677febc0778388f201fb737ef',1,'Tgstation.Server.Host.Components.Instance.gitHubClientFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#af9e2105dfde05caa1e5a14f8c3141591',1,'Tgstation.Server.Host.Components.InstanceFactory.gitHubClientFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#a40d72314455caeb1d6b72fa047ea18a4',1,'Tgstation.Server.Host.Controllers.AdministrationController.gitHubClientFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#a646263811f3cf4b618c569685a15c90c',1,'Tgstation.Server.Host.Controllers.RepositoryController.gitHubClientFactory()']]], + ['githubclientfactory_2ecs',['GitHubClientFactory.cs',['../_git_hub_client_factory_8cs.html',1,'']]], + ['githubname',['GitHubName',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html#aaa11306778504a3bb95ee6575aa69021',1,'Tgstation::Server::Api::Models::Repository']]], + ['githubowner',['GitHubOwner',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html#a04abf893b8ca947b828372b92534f34a',1,'Tgstation.Server.Api.Models.Repository.GitHubOwner()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#a213c2be1ecbafbd6a801f685c63d04db',1,'Tgstation.Server.Host.Components.Repository.IRepository.GitHubOwner()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#abdb2e4318fb14b8459e3bbc37dad98ba',1,'Tgstation.Server.Host.Components.Repository.Repository.GitHubOwner()']]], + ['githubreponame',['GitHubRepoName',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#aa18c75762768b2eade040269fc0b98c4',1,'Tgstation.Server.Host.Components.Repository.IRepository.GitHubRepoName()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#ad08c159873c35b8d508074a3b21b1739',1,'Tgstation.Server.Host.Components.Repository.Repository.GitHubRepoName()']]], + ['githubrepositoryid',['GitHubRepositoryId',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html#a2f6c66d4e10c5fb6a758727893ea4cd0',1,'Tgstation::Server::Host::Configuration::UpdatesConfiguration']]], + ['githuburl',['GitHubUrl',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a5a72e4dafe281ae05f52e1dbcf37ab71',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['gittagprefix',['GitTagPrefix',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html#a9dce394437a9bc79041a3467e7ad75f4',1,'Tgstation::Server::Host::Configuration::UpdatesConfiguration']]], + ['globalsuppressions_2ecs',['GlobalSuppressions.cs',['../_global_suppressions_8cs.html',1,'']]], + ['goodconfig',['GoodConfig',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_good_config.html',1,'Tgstation::Server::Host::Core::Tests::TestServiceCollectionExtensions']]] +]; diff --git a/search/all_8.html b/search/all_8.html new file mode 100644 index 0000000000..1e8fb9ceb3 --- /dev/null +++ b/search/all_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_8.js b/search/all_8.js new file mode 100644 index 0000000000..817543a63a --- /dev/null +++ b/search/all_8.js @@ -0,0 +1,29 @@ +var searchData= +[ + ['handle',['handle',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a2ed64dec0fe411dab814e5b9f354b027',1,'Tgstation::Server::Host::Core::Process']]], + ['handlebadresponse',['HandleBadResponse',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a7b81831316898d1d92a5103d3ecf145b',1,'Tgstation::Server::Client::ApiClient']]], + ['handlechatcommand',['HandleChatCommand',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_custom_command_handler.html#ab7df30a189d971d3bbd053ce2b5bdd0c',1,'Tgstation.Server.Host.Components.Chat.ICustomCommandHandler.HandleChatCommand()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a359f6160a7b3bdf3b081b301775feb5b',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.HandleChatCommand()']]], + ['handleevent',['HandleEvent',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.html#a92fe6b476551994f44f0206f84ecb7e7',1,'Tgstation.Server.Host.Components.EventConsumer.HandleEvent()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_event_consumer.html#a112febc1b1043ed890f9ed781bc3751c',1,'Tgstation.Server.Host.Components.IEventConsumer.HandleEvent()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a5bff1817e94a17a556da18a4f6c90202',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.HandleEvent()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a4b9550b3cd36106ca8a4510730db2060',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.HandleEvent()']]], + ['handleinterop',['HandleInterop',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_handler.html#af4d1c72d7fb7bc9764a13f1d9e7b00c7',1,'Tgstation.Server.Host.Components.Interop.ICommHandler.HandleInterop()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a867a797b4ec342fe0bdc7ccff458109d',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.HandleInterop()']]], + ['handlemessage',['HandleMessage',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a942b5d525b0855ff6c8b59e0d5f6e7eb',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]], + ['handlemonitorwakeup',['HandleMonitorWakeup',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#a734af406522508a40b77fe6044194a90',1,'Tgstation::Server::Host::Components::Watchdog::BasicWatchdog']]], + ['handler',['handler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.html#a429c52adf7d0b06ee91bb7b1e77cfe35',1,'Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.handler()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#ad8938bc8d2930683555a78c62586faad',1,'Tgstation.Server.Host.Components.Interop.CommContext.handler()']]], + ['handlercts',['handlerCts',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a5bafce0bc712b2631d88b9a87f074b9c',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['handlerestart',['HandleRestart',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a8a972c1d6a2a0fae729edf78b966c7c0',1,'Tgstation.Server.Host.Components.Chat.Chat.HandleRestart()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a2fd05864a3a2b706516784e14afaecc6',1,'Tgstation.Server.Host.Components.InstanceManager.HandleRestart()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#ad78e8addece7234fb29cffe96a18442e',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.HandleRestart()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_handler.html#ad7bcde59a7297d1ef3770943af92a93d',1,'Tgstation.Server.Host.Core.IRestartHandler.HandleRestart()']]], + ['handlermonitorwakeup',['HandlerMonitorWakeup',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#a8b1f961ac1d7bc6c815d01b9bccad487',1,'Tgstation::Server::Host::Components::Watchdog::ExperimentalWatchdog']]], + ['handlewrite',['HandleWrite',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#ae1049d054dc12b093edde8e89d366394',1,'Tgstation.Server.Host.Components.Interop.CommContext.HandleWrite()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_post_write_handler.html#a977c03596e21a07e06d7bc3735c6884f',1,'Tgstation.Server.Host.IO.IPostWriteHandler.HandleWrite()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_post_write_handler.html#a43d2add7500e5047fd259d1291ada0bc',1,'Tgstation.Server.Host.IO.PosixPostWriteHandler.HandleWrite()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_post_write_handler.html#a94fe62fd0f170cca8a95674408a1ede4',1,'Tgstation.Server.Host.IO.WindowsPostWriteHandler.HandleWrite()']]], + ['hardrebooting',['HardRebooting',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a358f54d77ecd35adb4be872af559eb23a6f140364f9894a2f77258f7e81a74703',1,'Tgstation::Server::Api::Models']]], + ['haspermissiontomakesymlinks',['HasPermissionToMakeSymlinks',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory.html#a26f1ef58c7ead54fd0a7b73f616dbb4a',1,'Tgstation::Server::Host::IO::Tests::TestSymlinkFactory']]], + ['head',['Head',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#aaf4a631e6d2aa45a1b6887152f1d13f0',1,'Tgstation.Server.Host.Components.Repository.IRepository.Head()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a40437fe926da0b9e03785da0199a8597',1,'Tgstation.Server.Host.Components.Repository.Repository.Head()']]], + ['headers',['Headers',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a521379a7cffb0980b1d879cb15afd6f0',1,'Tgstation.Server.Client.ApiClient.Headers()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#afb0feaf84640f44711b635836bf9378e',1,'Tgstation.Server.Client.IApiClient.Headers()'],['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a48f8ea0a4dd7ac665735d1728899ebad',1,'Tgstation.Server.Client.ApiClient.headers()']]], + ['headincludeline',['HeadIncludeLine',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_server_side_modifications.html#a83107858b3a44428da91e999cedd2a16',1,'Tgstation::Server::Host::Components::StaticFiles::ServerSideModifications']]], + ['helptext',['HelpText',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html#a35351daa1c342c9086ddbfa0cb131029',1,'Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.HelpText()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.html#a6d0540b2a6fdb2c6f48ddaba78b22bde',1,'Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.HelpText()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command.html#ab8687d89e8f4b08d6221c1fd51ab8ca0',1,'Tgstation.Server.Host.Components.Chat.Commands.ICommand.HelpText()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command.html#afeb9ac3dc4a7e73136babeaa6a2d1782',1,'Tgstation.Server.Host.Components.Chat.Commands.KekCommand.HelpText()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#a5f22a8e068839fa971b715b0bf0abed4',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.HelpText()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html#a7d761098bd18586c0c0098d4d80574e4',1,'Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.HelpText()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.html#ad800f97aca131465993222123307bd59',1,'Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.HelpText()']]], + ['home',['Home',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#a03d7bf4a2c99507c1c69d1b76eee96c8',1,'Tgstation::Server::Host::Controllers::HomeController']]], + ['homecontroller',['HomeController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html',1,'Tgstation.Server.Host.Controllers.HomeController'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#acb05858d562ebbd9ddb7f3f3d19e8834',1,'Tgstation.Server.Host.Controllers.HomeController.HomeController()']]], + ['homecontroller_2ecs',['HomeController.cs',['../_home_controller_8cs.html',1,'']]], + ['hostingenvironment',['hostingEnvironment',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#a74ea7b1dceba49fc08fa7793e35c6d2e',1,'Tgstation.Server.Host.Core.Application.hostingEnvironment()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#af5f22b3e5970434ac04c8ae5024fd0cd',1,'Tgstation.Server.Host.Core.SetupWizard.hostingEnvironment()']]], + ['hostwrite',['HostWrite',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ab7bc96f211e450615be8669d10de2440a509b9f909831ef70e6c1ec59a3b340e9',1,'Tgstation::Server::Api::Models']]], + ['html',['Html',['../class_tgstation_1_1_server_1_1_client_1_1_server_error_exception.html#a8a826616016136ab87369a1a55e52bca',1,'Tgstation::Server::Client::ServerErrorException']]], + ['httpclient',['HttpClient',['../class_tgstation_1_1_server_1_1_client_1_1_http_client.html',1,'Tgstation.Server.Client.HttpClient'],['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a22bc1751fcba63704d2d07a83fa5a857',1,'Tgstation.Server.Client.ApiClient.httpClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_http_client.html#aba5a7cd3aaf62acbe8078cdb7d7da8e9',1,'Tgstation.Server.Client.HttpClient.httpClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_http_client.html#ae30abd8d943980aeb8c192df877b7df8',1,'Tgstation.Server.Client.HttpClient.HttpClient()']]], + ['httpclient_2ecs',['HttpClient.cs',['../_http_client_8cs.html',1,'']]] +]; diff --git a/search/all_9.html b/search/all_9.html new file mode 100644 index 0000000000..27df366b25 --- /dev/null +++ b/search/all_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_9.js b/search/all_9.js new file mode 100644 index 0000000000..8f20623c7b --- /dev/null +++ b/search/all_9.js @@ -0,0 +1,251 @@ +var searchData= +[ + ['iadministrationclient',['IAdministrationClient',['../interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client.html',1,'Tgstation::Server::Client']]], + ['iadministrationclient_2ecs',['IAdministrationClient.cs',['../_i_administration_client_8cs.html',1,'']]], + ['iapiclient',['IApiClient',['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html',1,'Tgstation::Server::Client']]], + ['iapiclient_2ecs',['IApiClient.cs',['../_i_api_client_8cs.html',1,'']]], + ['iapiclientfactory',['IApiClientFactory',['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client_factory.html',1,'Tgstation::Server::Client']]], + ['iapiclientfactory_2ecs',['IApiClientFactory.cs',['../_i_api_client_factory_8cs.html',1,'']]], + ['iapplication',['IApplication',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_application.html',1,'Tgstation::Server::Host::Core']]], + ['iapplication_2ecs',['IApplication.cs',['../_i_application_8cs.html',1,'']]], + ['iapplicationlifetime',['IApplicationLifetime',['../class_i_application_lifetime.html',1,'']]], + ['iasyncdelayer',['IAsyncDelayer',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_async_delayer.html',1,'Tgstation::Server::Host::Core']]], + ['iasyncdelayer_2ecs',['IAsyncDelayer.cs',['../_i_async_delayer_8cs.html',1,'']]], + ['iauthenticationcontext',['IAuthenticationContext',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context.html',1,'Tgstation::Server::Host::Security']]], + ['iauthenticationcontext_2ecs',['IAuthenticationContext.cs',['../_i_authentication_context_8cs.html',1,'']]], + ['iauthenticationcontextfactory',['IAuthenticationContextFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context_factory.html',1,'Tgstation::Server::Host::Security']]], + ['iauthenticationcontextfactory_2ecs',['IAuthenticationContextFactory.cs',['../_i_authentication_context_factory_8cs.html',1,'']]], + ['ibyondclient',['IByondClient',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client.html',1,'Tgstation::Server::Client::Components']]], + ['ibyondclient_2ecs',['IByondClient.cs',['../_i_byond_client_8cs.html',1,'']]], + ['ibyondexecutablelock',['IByondExecutableLock',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock.html',1,'Tgstation::Server::Host::Components::Byond']]], + ['ibyondexecutablelock_2ecs',['IByondExecutableLock.cs',['../_i_byond_executable_lock_8cs.html',1,'']]], + ['ibyondinstaller',['IByondInstaller',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.html',1,'Tgstation::Server::Host::Components::Byond']]], + ['ibyondinstaller_2ecs',['IByondInstaller.cs',['../_i_byond_installer_8cs.html',1,'']]], + ['ibyondmanager',['IByondManager',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_manager.html',1,'Tgstation::Server::Host::Components::Byond']]], + ['ibyondmanager_2ecs',['IByondManager.cs',['../_i_byond_manager_8cs.html',1,'']]], + ['ichat',['IChat',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['ichat_2ecs',['IChat.cs',['../_i_chat_8cs.html',1,'']]], + ['ichatbotsclient',['IChatBotsClient',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html',1,'Tgstation::Server::Client::Components']]], + ['ichatbotsclient_2ecs',['IChatBotsClient.cs',['../_i_chat_bots_client_8cs.html',1,'']]], + ['ichatfactory',['IChatFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat_factory.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['ichatfactory_2ecs',['IChatFactory.cs',['../_i_chat_factory_8cs.html',1,'']]], + ['iclaimsinjector',['IClaimsInjector',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_claims_injector.html',1,'Tgstation::Server::Host::Security']]], + ['iclaimsinjector_2ecs',['IClaimsInjector.cs',['../_i_claims_injector_8cs.html',1,'']]], + ['icommand',['ICommand',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command.html',1,'Tgstation::Server::Host::Components::Chat::Commands']]], + ['icommand_2ecs',['ICommand.cs',['../_i_command_8cs.html',1,'']]], + ['icommandfactory',['ICommandFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command_factory.html',1,'Tgstation::Server::Host::Components::Chat::Commands']]], + ['icommandfactory_2ecs',['ICommandFactory.cs',['../_i_command_factory_8cs.html',1,'']]], + ['icommcontext',['ICommContext',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_context.html',1,'Tgstation::Server::Host::Components::Interop']]], + ['icommcontext_2ecs',['ICommContext.cs',['../_i_comm_context_8cs.html',1,'']]], + ['icommhandler',['ICommHandler',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_handler.html',1,'Tgstation::Server::Host::Components::Interop']]], + ['icommhandler_2ecs',['ICommHandler.cs',['../_i_comm_handler_8cs.html',1,'']]], + ['icompilejobconsumer',['ICompileJobConsumer',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_compile_job_consumer.html',1,'Tgstation::Server::Host::Components::Compiler']]], + ['icompilejobconsumer_2ecs',['ICompileJobConsumer.cs',['../_i_compile_job_consumer_8cs.html',1,'']]], + ['iconfiguration',['IConfiguration',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.html',1,'Tgstation::Server::Host::Components::StaticFiles']]], + ['iconfiguration_2ecs',['IConfiguration.cs',['../_i_configuration_8cs.html',1,'']]], + ['iconfigurationclient',['IConfigurationClient',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.html',1,'Tgstation::Server::Client::Components']]], + ['iconfigurationclient_2ecs',['IConfigurationClient.cs',['../_i_configuration_client_8cs.html',1,'']]], + ['iconsole',['IConsole',['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console.html',1,'Tgstation::Server::Host::IO']]], + ['iconsole_2ecs',['IConsole.cs',['../_i_console_8cs.html',1,'']]], + ['icredentialsprovider',['ICredentialsProvider',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_credentials_provider.html',1,'Tgstation::Server::Host::Components::Repository']]], + ['icredentialsprovider_2ecs',['ICredentialsProvider.cs',['../_i_credentials_provider_8cs.html',1,'']]], + ['icryptographysuite',['ICryptographySuite',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_cryptography_suite.html',1,'Tgstation::Server::Host::Security']]], + ['icryptographysuite_2ecs',['ICryptographySuite.cs',['../_i_cryptography_suite_8cs.html',1,'']]], + ['icustomcommandhandler',['ICustomCommandHandler',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_custom_command_handler.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['icustomcommandhandler_2ecs',['ICustomCommandHandler.cs',['../_i_custom_command_handler_8cs.html',1,'']]], + ['id',['Id',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html#a850128695dbdb7a7482f8debed5a13ce',1,'Tgstation.Server.Api.Models.Instance.Id()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html#a8986e2686e9d872b150f239de214d74c',1,'Tgstation.Server.Api.Models.Internal.ChatBot.Id()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_compile_job.html#aaf50365d79a9cac92220cec95057e421',1,'Tgstation.Server.Api.Models.Internal.CompileJob.Id()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html#a2acfbcb2d53d94d45c49c1cc2bef75d6',1,'Tgstation.Server.Api.Models.Internal.Job.Id()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge.html#a0dbaef6cf504176f317d9d87dd4c97a9',1,'Tgstation.Server.Api.Models.Internal.TestMerge.Id()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#a2c0d8cf4d64347a18c9a6251f9a5783f',1,'Tgstation.Server.Api.Models.Internal.User.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html#a7c2c6e4f3178f608f42d086b35673508',1,'Tgstation.Server.Host.Components.Chat.Channel.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user.html#a30069134279846535d7271c180f337e7',1,'Tgstation.Server.Host.Components.Chat.User.Id()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.html#af541be0a939e2115b688ad5eb5e66234',1,'Tgstation.Server.Host.Core.IProcess.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#ab63bd9afff98a203dddff58bcb4bbe25',1,'Tgstation.Server.Host.Core.Process.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.html#a0dd252ba836263c5a825862bcda215f7',1,'Tgstation.Server.Host.Models.ChatChannel.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html#a914b18d16f0501f1c78b6734779952dd',1,'Tgstation.Server.Host.Models.DreamDaemonSettings.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html#ab561a3992874722f25f3729251fd4249',1,'Tgstation.Server.Host.Models.DreamMakerSettings.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.html#ae7b25543ed8660f8882a9aeedadbcd23',1,'Tgstation.Server.Host.Models.InstanceUser.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information.html#a5c7ca615cd5ead17d8f7cb5fddc4bc2d',1,'Tgstation.Server.Host.Models.ReattachInformation.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html#a3c1a07a5ecde1ec0e3c1a03fc096b2ff',1,'Tgstation.Server.Host.Models.RepositorySettings.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_rev_info_test_merge.html#a1bde159279a6a9abec5d7b28930c6fe2',1,'Tgstation.Server.Host.Models.RevInfoTestMerge.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html#a44a69b7ff8b7d1ca75e43e71694a8adf',1,'Tgstation.Server.Host.Models.RevisionInformation.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information.html#a838faca3764e01b631a6fa12174b6ceb',1,'Tgstation.Server.Host.Models.WatchdogReattachInformation.Id()']]], + ['idatabasecontext',['IDatabaseContext',['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html',1,'Tgstation::Server::Host::Models']]], + ['idatabasecontext_2ecs',['IDatabaseContext.cs',['../_i_database_context_8cs.html',1,'']]], + ['idatabasecontextfactory',['IDatabaseContextFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_database_context_factory.html',1,'Tgstation::Server::Host::Core']]], + ['idatabasecontextfactory_2ecs',['IDatabaseContextFactory.cs',['../_i_database_context_factory_8cs.html',1,'']]], + ['idatabaseseeder',['IDatabaseSeeder',['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_seeder.html',1,'Tgstation::Server::Host::Models']]], + ['idatabaseseeder_2ecs',['IDatabaseSeeder.cs',['../_i_database_seeder_8cs.html',1,'']]], + ['idbconnectionfactory',['IDBConnectionFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_d_b_connection_factory.html',1,'Tgstation::Server::Host::Core']]], + ['idbconnectionfactory_2ecs',['IDBConnectionFactory.cs',['../_i_d_b_connection_factory_8cs.html',1,'']]], + ['identity',['identity',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html#a4e5cb06d84c679a3a2d2fbfdd60e1335',1,'Tgstation::Server::Host::Security::WindowsSystemIdentity']]], + ['identitycache',['IdentityCache',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html',1,'Tgstation.Server.Host.Security.IdentityCache'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html#aa3cdd5649c32a1249a2398343e82f343',1,'Tgstation.Server.Host.Security.IdentityCache.IdentityCache()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#a75b914d5a6ea3a3ef3eaa2ab87b61859',1,'Tgstation.Server.Host.Controllers.HomeController.identityCache()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html#a94c0a91ac1bdb6d25c9546a583fb44e3',1,'Tgstation.Server.Host.Security.AuthenticationContextFactory.identityCache()']]], + ['identitycache_2ecs',['IdentityCache.cs',['../_identity_cache_8cs.html',1,'']]], + ['identitycacheobject',['IdentityCacheObject',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.html',1,'Tgstation.Server.Host.Security.IdentityCacheObject'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.html#a77e5495fa90b8eed2f2d86c6fb711da8',1,'Tgstation.Server.Host.Security.IdentityCacheObject.IdentityCacheObject()']]], + ['identitycacheobject_2ecs',['IdentityCacheObject.cs',['../_identity_cache_object_8cs.html',1,'']]], + ['idesigntimedbcontextfactory',['IDesignTimeDbContextFactory',['../class_i_design_time_db_context_factory.html',1,'']]], + ['idisposable',['IDisposable',['../class_i_disposable.html',1,'']]], + ['idmbfactory',['IDmbFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory.html',1,'Tgstation::Server::Host::Components::Compiler']]], + ['idmbfactory_2ecs',['IDmbFactory.cs',['../_i_dmb_factory_8cs.html',1,'']]], + ['idmbprovider',['IDmbProvider',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.html',1,'Tgstation::Server::Host::Components']]], + ['idmbprovider_2ecs',['IDmbProvider.cs',['../_i_dmb_provider_8cs.html',1,'']]], + ['idreamdaemonclient',['IDreamDaemonClient',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html',1,'Tgstation::Server::Client::Components']]], + ['idreamdaemonclient_2ecs',['IDreamDaemonClient.cs',['../_i_dream_daemon_client_8cs.html',1,'']]], + ['idreammaker',['IDreamMaker',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dream_maker.html',1,'Tgstation::Server::Host::Components::Compiler']]], + ['idreammaker_2ecs',['IDreamMaker.cs',['../_i_dream_maker_8cs.html',1,'']]], + ['idreammakerclient',['IDreamMakerClient',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html',1,'Tgstation::Server::Client::Components']]], + ['idreammakerclient_2ecs',['IDreamMakerClient.cs',['../_i_dream_maker_client_8cs.html',1,'']]], + ['ieventconsumer',['IEventConsumer',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_event_consumer.html',1,'Tgstation::Server::Host::Components']]], + ['ieventconsumer_2ecs',['IEventConsumer.cs',['../_i_event_consumer_8cs.html',1,'']]], + ['igithubclientfactory',['IGitHubClientFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_git_hub_client_factory.html',1,'Tgstation::Server::Host::Core']]], + ['igithubclientfactory_2ecs',['IGitHubClientFactory.cs',['../_i_git_hub_client_factory_8cs.html',1,'']]], + ['ihostedservice',['IHostedService',['../class_i_hosted_service.html',1,'']]], + ['ihttpclient',['IHttpClient',['../interface_tgstation_1_1_server_1_1_client_1_1_i_http_client.html',1,'Tgstation::Server::Client']]], + ['ihttpclient_2ecs',['IHttpClient.cs',['../_i_http_client_8cs.html',1,'']]], + ['iidentitycache',['IIdentityCache',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_identity_cache.html',1,'Tgstation::Server::Host::Security']]], + ['iidentitycache_2ecs',['IIdentityCache.cs',['../_i_identity_cache_8cs.html',1,'']]], + ['iinstance',['IInstance',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html',1,'Tgstation::Server::Host::Components']]], + ['iinstance_2ecs',['IInstance.cs',['../_i_instance_8cs.html',1,'']]], + ['iinstanceclient',['IInstanceClient',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html',1,'Tgstation::Server::Client::Components']]], + ['iinstanceclient_2ecs',['IInstanceClient.cs',['../_i_instance_client_8cs.html',1,'']]], + ['iinstancefactory',['IInstanceFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_factory.html',1,'Tgstation::Server::Host::Components']]], + ['iinstancefactory_2ecs',['IInstanceFactory.cs',['../_i_instance_factory_8cs.html',1,'']]], + ['iinstancemanager',['IInstanceManager',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.html',1,'Tgstation::Server::Host::Components']]], + ['iinstancemanager_2ecs',['IInstanceManager.cs',['../_i_instance_manager_8cs.html',1,'']]], + ['iinstancemanagerclient',['IInstanceManagerClient',['../interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html',1,'Tgstation::Server::Client']]], + ['iinstancemanagerclient_2ecs',['IInstanceManagerClient.cs',['../_i_instance_manager_client_8cs.html',1,'']]], + ['iinstanceuserclient',['IInstanceUserClient',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html',1,'Tgstation::Server::Client::Components']]], + ['iinstanceuserclient_2ecs',['IInstanceUserClient.cs',['../_i_instance_user_client_8cs.html',1,'']]], + ['iiomanager',['IIOManager',['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html',1,'Tgstation::Server::Host::IO']]], + ['iiomanager_2ecs',['IIOManager.cs',['../_i_i_o_manager_8cs.html',1,'']]], + ['ijobmanager',['IJobManager',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager.html',1,'Tgstation::Server::Host::Core']]], + ['ijobmanager_2ecs',['IJobManager.cs',['../_i_job_manager_8cs.html',1,'']]], + ['ijobsclient',['IJobsClient',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client.html',1,'Tgstation::Server::Client::Components']]], + ['ijobsclient_2ecs',['IJobsClient.cs',['../_i_jobs_client_8cs.html',1,'']]], + ['ijsontrackingcontext',['IJsonTrackingContext',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_json_tracking_context.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['ijsontrackingcontext_2ecs',['IJsonTrackingContext.cs',['../_i_json_tracking_context_8cs.html',1,'']]], + ['inactiveserver',['InactiveServer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_monitor_state.html#a6a9bcee1c2d257c41c25777b0ac510e6',1,'Tgstation::Server::Host::Components::Watchdog::MonitorState']]], + ['inactiveservercrashed',['InactiveServerCrashed',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#acb2ccc2dc05d01ec3a6448d3d57155c9a55fa500495cf8a547529c30f8d9c6ea5',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['inactiveservercritfail',['InactiveServerCritFail',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_monitor_state.html#a8df2748432efbc5946a50b412abd7789',1,'Tgstation::Server::Host::Components::Watchdog::MonitorState']]], + ['inactiveserverrebooted',['InactiveServerRebooted',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#acb2ccc2dc05d01ec3a6448d3d57155c9a511bd67e833172fb4f9a30b92591235b',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['inactiveserverstartupcomplete',['InactiveServerStartupComplete',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#acb2ccc2dc05d01ec3a6448d3d57155c9afaf84ad86619c2ec86111febdc77b60a',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['inetworkpromptreaper',['INetworkPromptReaper',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_network_prompt_reaper.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['inetworkpromptreaper_2ecs',['INetworkPromptReaper.cs',['../_i_network_prompt_reaper_8cs.html',1,'']]], + ['initcontrollers',['InitControllers',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#ae3df19d19a115ec3137fc1924de34661',1,'Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.InitControllers()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#a0d42fb1f490a6ca44712dd236bceca92',1,'Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.InitControllers()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a37ced913cc4105a8df8250579bace8f8',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.InitControllers()']]], + ['initialchatbots',['initialChatBots',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a15ead9515d14fbfa0ae40c98b93312cc',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['initialize',['Initialize',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#aac1c768a59e2efecac4dac179533ca4c',1,'Tgstation.Server.Host.Models.DatabaseContext.Initialize()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#aa805da92c4e05d5a7c0010a9bbfeeb9f',1,'Tgstation.Server.Host.Models.IDatabaseContext.Initialize()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests_1_1_test_discord_provider.html#a44c8b813bbadae2022cab1b2deaed3cb',1,'Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider.Initialize()']]], + ['injectclaimsintocontext',['InjectClaimsIntoContext',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_claims_injector.html#a68b33948ac77f08ab2dc17209ce78314',1,'Tgstation.Server.Host.Security.ClaimsInjector.InjectClaimsIntoContext()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_claims_injector.html#ac15d0e829afdb2e3523f6ea38879759e',1,'Tgstation.Server.Host.Security.IClaimsInjector.InjectClaimsIntoContext()']]], + ['install',['Install',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html#ae3be244b24cbb3c9ba859f55e53715e6',1,'Tgstation::Server::Host::Service::Program']]], + ['installbyond',['InstallByond',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.html#a8fec89a87bef1153e103e4b3349fb27b',1,'Tgstation.Server.Host.Components.Byond.IByondInstaller.InstallByond()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#a80e49a1322036d35b8d2839ee49e4f44',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.InstallByond()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a496ed03a850673b3269f09d7b2e42441',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.InstallByond()']]], + ['installeddirectx',['installedDirectX',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a4aaf9bd89e5ad031016e64a3b3cbd3bb',1,'Tgstation::Server::Host::Components::Byond::WindowsByondInstaller']]], + ['installedversions',['InstalledVersions',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#ac6285b8768d8b10b5e4bdeec2cb43953',1,'Tgstation.Server.Host.Components.Byond.ByondManager.InstalledVersions()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_manager.html#ae5fc64e6504a3fd8d1cf1131d841fa14',1,'Tgstation.Server.Host.Components.Byond.IByondManager.InstalledVersions()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html#a58ad28bf73680ade13cd1bf1ebece987',1,'Tgstation.Server.Client.Components.ByondClient.InstalledVersions()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client.html#a1538f8488e7866c4986afe7d3b7ef1a0',1,'Tgstation.Server.Client.Components.IByondClient.InstalledVersions()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a0811c130dd3533e163b38d32a17a8394',1,'Tgstation.Server.Host.Components.Byond.ByondManager.installedVersions()']]], + ['installjob',['InstallJob',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_byond.html#ac42aea970e9f20d09ee3ead318841078',1,'Tgstation::Server::Api::Models::Byond']]], + ['installversion',['InstallVersion',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a1040d60e5aa5723bfb450c69f5ee02f3',1,'Tgstation::Server::Host::Components::Byond::ByondManager']]], + ['instance',['Instance',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html',1,'Tgstation.Server.Host.Components.Instance'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html',1,'Tgstation.Server.Api.Models.Instance'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html',1,'Tgstation.Server.Host.Models.Instance'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#a19f89ec03ffd6f2bf5cab5214d5e6bb8',1,'Tgstation.Server.Host.Controllers.ApiController.Instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.html#ae5433d8739dbd431a207684fb9b4d37d',1,'Tgstation.Server.Host.Models.ChatBot.Instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html#ac33f867ccf152b5fd3a52242e2fed5b4',1,'Tgstation.Server.Host.Models.DreamDaemonSettings.Instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html#a7d310dcc01986cdbfb6bb41d1f80825d',1,'Tgstation.Server.Host.Models.DreamMakerSettings.Instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.html#a84b3880b44a50b0064cd5c5a18027752',1,'Tgstation.Server.Host.Models.InstanceUser.Instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html#acebd359c2b46a97a5ddf7c6c9c4f9eb7',1,'Tgstation.Server.Host.Models.Job.Instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html#a254c0c0373323dc5910b83a8edcfdac2',1,'Tgstation.Server.Host.Models.RepositorySettings.Instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html#ac8ea8a7b515a91b6bd20975fd8f1fd7a',1,'Tgstation.Server.Host.Models.RevisionInformation.Instance()'],['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#ad77819a87cb51a027c4b9b460b382ccd',1,'Tgstation.Server.Client.InstanceManagerClient.Instance(Routes.InstanceManager, instance ?? throw new ArgumentNullException(nameof(instance)), cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#ad77819a87cb51a027c4b9b460b382ccd',1,'Tgstation.Server.Client.InstanceManagerClient.Instance(Routes.InstanceManager, instance ?? throw new ArgumentNullException(nameof(instance)), cancellationToken)'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a7c8ca0a51cb68ea6d1dc6025e0555baf',1,'Tgstation.Server.Host.Components.Instance.Instance()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html#a96b47c77cfbbad1f762003260953c840',1,'Tgstation.Server.Client.Components.ByondClient.instance()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#af082b31182c4ecdcbe3b9c0a81bf9ead',1,'Tgstation.Server.Client.Components.ChatBotsClient.instance()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#a3fbe930ee9bc4cf37d734c4ccc50668c',1,'Tgstation.Server.Client.Components.ConfigurationClient.instance()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#afaaf929e746f11a67fd7eb5818bcd7e9',1,'Tgstation.Server.Client.Components.DreamDaemonClient.instance()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#a8c4ace450e5976c24b3982749de5ccff',1,'Tgstation.Server.Client.Components.DreamMakerClient.instance()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#aaea798aa626ad6d51d036f65c53ea47f',1,'Tgstation.Server.Client.Components.InstanceUserClient.instance()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html#ab7fc36983aad5fd506a83687b70c77ff',1,'Tgstation.Server.Client.Components.JobsClient.instance()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#a3af323ae0b97782b3917673b8d239af8',1,'Tgstation.Server.Client.Components.RepositoryClient.instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#a23c8b9d8f35c1bf902d5ac22c4260bed',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#a441cefe121e0cc6469c9a800b734a231',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html#a06399db6f3586d38d77c451206714286',1,'Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a0b11c2951d19f22c7369278887b55993',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#ab20185d87e27d0d2886245e9e1b79b95',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a0e561e3f3b557e57569f7110cb8edc8c',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.instance()'],['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test.html#a686e4c4d48527bb36ad425503a4a0326',1,'Tgstation.Server.Tests.Instance.ConfigurationTest.instance()']]], + ['instance_2ecs',['Instance.cs',['../_tgstation_8_server_8_api_2_models_2_instance_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_components_2_instance_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_instance_8cs.html',1,'(Global Namespace)']]], + ['instanceadminuser',['InstanceAdminUser',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a501712a48c2962b239aa5fb270c76f82',1,'Tgstation::Server::Host::Controllers::InstanceController']]], + ['instanceattachfilename',['InstanceAttachFileName',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#aa40d55750e2193d714eb1470505c47ee',1,'Tgstation::Server::Host::Controllers::InstanceController']]], + ['instanceautoupdatestart',['InstanceAutoUpdateStart',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381aefc3f4c097e45227dcc2aee3aadc034f',1,'Tgstation::Server::Host::Components']]], + ['instanceclient',['InstanceClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html',1,'Tgstation.Server.Client.Components.InstanceClient'],['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_instance_test.html#a26ebd19908ad9cd8f3dea0fe5bab8d93',1,'Tgstation.Server.Tests.Instance.InstanceTest.instanceClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#af44767648e0b31f744ea09f0864c70ca',1,'Tgstation.Server.Client.Components.InstanceClient.InstanceClient()']]], + ['instanceclient_2ecs',['InstanceClient.cs',['../_instance_client_8cs.html',1,'']]], + ['instancecontroller',['InstanceController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html',1,'Tgstation.Server.Host.Controllers.InstanceController'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a62eb74d4e58236abc641302411f0a74f',1,'Tgstation.Server.Host.Controllers.InstanceController.InstanceController()']]], + ['instancecontroller_2ecs',['InstanceController.cs',['../_instance_controller_8cs.html',1,'']]], + ['instancefactory',['InstanceFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html',1,'Tgstation.Server.Host.Components.InstanceFactory'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#ae2b48b5197337f7a311fd115951be7f6',1,'Tgstation.Server.Host.Components.InstanceManager.instanceFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a652d14bc0bcf431eaa69845e4541a624',1,'Tgstation.Server.Host.Components.InstanceFactory.InstanceFactory()']]], + ['instancefactory_2ecs',['InstanceFactory.cs',['../_instance_factory_8cs.html',1,'']]], + ['instanceid',['InstanceId',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a65e7d0ba3a39c992691f7721c62c1531',1,'Tgstation.Server.Api.ApiHeaders.InstanceId()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.html#a87db1326cbb80ca4a8945be90769656b',1,'Tgstation.Server.Host.Models.ChatBot.InstanceId()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html#ae94a52d9c7e94f3a043ccce4c6731935',1,'Tgstation.Server.Host.Models.DreamDaemonSettings.InstanceId()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html#a0173e07dda1034e7cd127a426d3cfa69',1,'Tgstation.Server.Host.Models.DreamMakerSettings.InstanceId()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.html#a35f8d34f833a758e290c732f40954ddd',1,'Tgstation.Server.Host.Models.InstanceUser.InstanceId()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html#a019883724ea4000a3c088d6dbd7ffaa9',1,'Tgstation.Server.Host.Models.RepositorySettings.InstanceId()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html#a6453d51fe22d312fadfccc0f6e9e3e89',1,'Tgstation.Server.Host.Models.RevisionInformation.InstanceId()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information.html#a9d598aa26cfeeafa70fe3b6edced7a79',1,'Tgstation.Server.Host.Models.WatchdogReattachInformation.InstanceId()']]], + ['instanceidheader',['InstanceIdHeader',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a28f94492eb21542e63675a53d871e3ef',1,'Tgstation::Server::Api::ApiHeaders']]], + ['instancemanager',['InstanceManager',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html',1,'Tgstation.Server.Host.Components.InstanceManager'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a17bfc22b8cbc4624a6ec180aeba91da8',1,'Tgstation.Server.Api.Routes.InstanceManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a67ee123ed66a93f55cec584e9dc3f102',1,'Tgstation.Server.Host.Components.InstanceManager.InstanceManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html#afb94a5c7ed6a392822c4d32b17e8ce20',1,'Tgstation.Server.Host.Controllers.ByondController.instanceManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html#a1e37d0da176e8693608a4719c05e57f9',1,'Tgstation.Server.Host.Controllers.ChatController.instanceManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#a0b158757381e0c695ba632319a14e873',1,'Tgstation.Server.Host.Controllers.ConfigurationController.instanceManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#ad259fbe273d7c5396d766da41023f6f9',1,'Tgstation.Server.Host.Controllers.DreamDaemonController.instanceManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html#aa45b1a91e46ea9a7983b8edf0a1c1cd6',1,'Tgstation.Server.Host.Controllers.DreamMakerController.instanceManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#ad177b6d13a08c429c49b7e4294387d3c',1,'Tgstation.Server.Host.Controllers.InstanceController.instanceManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#a2f7404efa7a9821510b3146bfd99cc6c',1,'Tgstation.Server.Host.Controllers.RepositoryController.instanceManager()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20a7c77d4c45a003ee3d6b3589d2459cc49',1,'Tgstation.Server.Api.Rights.InstanceManager()']]], + ['instancemanager_2ecs',['InstanceManager.cs',['../_instance_manager_8cs.html',1,'']]], + ['instancemanagerclient',['InstanceManagerClient',['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html',1,'Tgstation.Server.Client.InstanceManagerClient'],['../class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test.html#a11690ee922cfd99c42e8770450a47a78',1,'Tgstation.Server.Tests.InstanceManagerTest.instanceManagerClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#a2d6043c1548bc86551fe56f12a78d4cb',1,'Tgstation.Server.Client.InstanceManagerClient.InstanceManagerClient()']]], + ['instancemanagerclient_2ecs',['InstanceManagerClient.cs',['../_instance_manager_client_8cs.html',1,'']]], + ['instancemanagerrights',['InstanceManagerRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#a816ca80f5eecd84ec46d4a365e5633e7',1,'Tgstation.Server.Api.Models.Internal.User.InstanceManagerRights()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79',1,'Tgstation.Server.Api.Rights.InstanceManagerRights()']]], + ['instancemanagerrights_2ecs',['InstanceManagerRights.cs',['../_instance_manager_rights_8cs.html',1,'']]], + ['instancemanagertest',['InstanceManagerTest',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test.html',1,'Tgstation.Server.Tests.InstanceManagerTest'],['../class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test.html#a73adf4e69e5b73873008b16ad115eece',1,'Tgstation.Server.Tests.InstanceManagerTest.InstanceManagerTest()']]], + ['instancemanagertest_2ecs',['InstanceManagerTest.cs',['../_instance_manager_test_8cs.html',1,'']]], + ['instancename',['InstanceName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html#a367a06cd9522d861bc0965a1f6847604',1,'Tgstation::Server::Host::Components::Interop::JsonFile']]], + ['instances',['instances',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#acc8f4c159357a11b0e67ea25d96b26e0',1,'Tgstation.Server.Host.Components.InstanceManager.instances()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html#a220af3e47b92df41d6b96bf8851c11ab',1,'Tgstation.Server.Client.IServerClient.Instances()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a9eb413c086e3e6d25ec2c404611c2b31',1,'Tgstation.Server.Client.ServerClient.Instances()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a29ba63c16baafcb417a9831fd70d20b7',1,'Tgstation.Server.Host.Models.DatabaseContext.Instances()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#aea1b9d5f17eaeb65becd9ff5cc7ba3e7',1,'Tgstation.Server.Host.Models.IDatabaseContext.Instances()']]], + ['instancetest',['InstanceTest',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_instance_test.html',1,'Tgstation.Server.Tests.Instance.InstanceTest'],['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_instance_test.html#a7178a60f55d85261a8a0b73e3afc3209',1,'Tgstation.Server.Tests.Instance.InstanceTest.InstanceTest()']]], + ['instancetest_2ecs',['InstanceTest.cs',['../_instance_test_8cs.html',1,'']]], + ['instanceuser',['InstanceUser',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html',1,'Tgstation.Server.Api.Models.InstanceUser'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.html',1,'Tgstation.Server.Host.Models.InstanceUser'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#ac215c662b5627fe87122f575d006c95f',1,'Tgstation.Server.Api.Routes.InstanceUser()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a5916cab82702e8c3bea39d500419c5dc',1,'Tgstation.Server.Host.Security.AuthenticationContext.InstanceUser()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context.html#a0ffbd3a91f52330582bbc56c13ba7dda',1,'Tgstation.Server.Host.Security.IAuthenticationContext.InstanceUser()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#ab42261638618edd8ca94398807f74812',1,'Tgstation.Server.Client.Components.InstanceUserClient.InstanceUser(Routes.InstanceUser, instanceUser ?? throw new ArgumentNullException(nameof(instanceUser)), instance.Id, cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#ab42261638618edd8ca94398807f74812',1,'Tgstation.Server.Client.Components.InstanceUserClient.InstanceUser(Routes.InstanceUser, instanceUser ?? throw new ArgumentNullException(nameof(instanceUser)), instance.Id, cancellationToken)'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20a07665be2d43147f42c2e73e8e2a19655',1,'Tgstation.Server.Api.Rights.InstanceUser()']]], + ['instanceuser_2ecs',['InstanceUser.cs',['../_tgstation_8_server_8_api_2_models_2_instance_user_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_instance_user_8cs.html',1,'(Global Namespace)']]], + ['instanceuserclient',['InstanceUserClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html',1,'Tgstation.Server.Client.Components.InstanceUserClient'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#a2ae6151c326432db1eaba0373f73733f',1,'Tgstation.Server.Client.Components.InstanceUserClient.InstanceUserClient()']]], + ['instanceuserclient_2ecs',['InstanceUserClient.cs',['../_instance_user_client_8cs.html',1,'']]], + ['instanceusercontroller',['InstanceUserController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html',1,'Tgstation.Server.Host.Controllers.InstanceUserController'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html#a5813d050c32f94a45129e9b6a9eabe9e',1,'Tgstation.Server.Host.Controllers.InstanceUserController.InstanceUserController()']]], + ['instanceusercontroller_2ecs',['InstanceUserController.cs',['../_instance_user_controller_8cs.html',1,'']]], + ['instanceuserrights',['InstanceUserRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html#a152009cdbb0c44ffdf1fc775dd4bd37f',1,'Tgstation.Server.Api.Models.InstanceUser.InstanceUserRights()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a5f1b5a9225190982810802d7a85bb601',1,'Tgstation.Server.Api.Rights.InstanceUserRights()']]], + ['instanceuserrights_2ecs',['InstanceUserRights.cs',['../_instance_user_rights_8cs.html',1,'']]], + ['instanceusers',['InstanceUsers',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a4938bb2d6e6720a1783191004543f2d9',1,'Tgstation.Server.Host.Models.DatabaseContext.InstanceUsers()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#a8b82f256db184f3fa9fda3754b1f8363',1,'Tgstation.Server.Host.Models.IDatabaseContext.InstanceUsers()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a9e8ce579b8d349c10e2a17be4210003a',1,'Tgstation.Server.Host.Models.Instance.InstanceUsers()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#a936e26aa1a873892272663bc193029d7',1,'Tgstation.Server.Host.Models.User.InstanceUsers()']]], + ['insufficientpermissionsexception',['InsufficientPermissionsException',['../class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception.html',1,'Tgstation.Server.Client.InsufficientPermissionsException'],['../class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception.html#a358dd83b6663d93b11f4379ce5d652c0',1,'Tgstation.Server.Client.InsufficientPermissionsException.InsufficientPermissionsException()'],['../class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception.html#a03f411a80e2a3bd6c8f789737459f475',1,'Tgstation.Server.Client.InsufficientPermissionsException.InsufficientPermissionsException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception.html#a611c12ed0eb292ab571c23fac254c1de',1,'Tgstation.Server.Client.InsufficientPermissionsException.InsufficientPermissionsException(string message, Exception innerException)']]], + ['insufficientpermissionsexception_2ecs',['InsufficientPermissionsException.cs',['../_insufficient_permissions_exception_8cs.html',1,'']]], + ['integrationtest',['IntegrationTest',['../class_tgstation_1_1_server_1_1_tests_1_1_integration_test.html',1,'Tgstation::Server::Tests']]], + ['integrationtest_2ecs',['IntegrationTest.cs',['../_integration_test_8cs.html',1,'']]], + ['interopcontext',['interopContext',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a4160b532077797930fdaa1bb02a41eb2',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['inuse',['InUse',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository_manager.html#acfd46405a7a81980c34cc001476b51ca',1,'Tgstation.Server.Host.Components.Repository.IRepositoryManager.InUse()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#a8603cad6d9df4a2079d3249becd0bbbb',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.InUse()']]], + ['invoke',['Invoke',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html#a46b0d8e92f76f34742e1b37f9925828e',1,'Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.Invoke()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.html#ad5707f9705974d53782d7e5d025ac3e7',1,'Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.Invoke()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command.html#a4acd6a23a3ca7d56450aae8db2bc63e3',1,'Tgstation.Server.Host.Components.Chat.Commands.ICommand.Invoke()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command.html#a054bc7a57ed9815bf7587e2dee4f590c',1,'Tgstation.Server.Host.Components.Chat.Commands.KekCommand.Invoke()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#a75e30ad4bc4993e62735761914fe1b94',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.Invoke()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html#a208092aa747a42a875eae87a095fc9c9',1,'Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.Invoke()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.html#a2b017d41ca603e7246a4204778286b54',1,'Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.Invoke()']]], + ['iomanager',['ioManager',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a3cbd5eecf146607f81c6e71bd9a2ebd6',1,'Tgstation.Server.Host.Components.Byond.ByondManager.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#abb34374e2d928177cdb6de25aa4389c9',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#acab07b13972ce055a25dc21dbd974e33',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#aebe2034cf597be2a63fad5808f3eb566',1,'Tgstation.Server.Host.Components.Chat.Chat.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#a040509c76b1f575c85f7effafa8c2719',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a055f0fa0e9b35595d79a5bd090a6fac9',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#ab4707fd2e4ad2f4cecb8f7f218c4c72e',1,'Tgstation.Server.Host.Components.Compiler.DmbProvider.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a0d4eefde54eac8edf70c40222fbd3830',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a493988c0490c85b95850f7bc2a5acfab',1,'Tgstation.Server.Host.Components.InstanceFactory.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a59bc4b977f9b72208d553fbfa57f118e',1,'Tgstation.Server.Host.Components.InstanceManager.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#a87097237d659f917755dfeabef4e245f',1,'Tgstation.Server.Host.Components.Interop.CommContext.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#aa62f89a29abc7febb886a1e7216067a2',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#afd5e0aef7c9a1023bc8a6cebe483c4c3',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#a96a3da163e28fb1b8a09425c06358779',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#ac2d19cdcca5ed40c3f6f2123f426e655',1,'Tgstation.Server.Host.Controllers.AdministrationController.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#a564df332546a6fcee923d3e2cab2fac6',1,'Tgstation.Server.Host.Controllers.ConfigurationController.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#afb2e4e54c38a97b299d1fb7692cc5cdd',1,'Tgstation.Server.Host.Controllers.InstanceController.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a40fb9aa91866cd3d9c1f2aa3feccaecc',1,'Tgstation.Server.Host.Core.SetupWizard.ioManager()']]], + ['iomananger',['ioMananger',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a01a4beb2cee07561f7749668939ab88e',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['iplatformidentifier',['IPlatformIdentifier',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_platform_identifier.html',1,'Tgstation::Server::Host::Core']]], + ['iplatformidentifier_2ecs',['IPlatformIdentifier.cs',['../_i_platform_identifier_8cs.html',1,'']]], + ['ipostwritehandler',['IPostWriteHandler',['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_post_write_handler.html',1,'Tgstation::Server::Host::IO']]], + ['ipostwritehandler_2ecs',['IPostWriteHandler.cs',['../_i_post_write_handler_8cs.html',1,'']]], + ['iprocess',['IProcess',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.html',1,'Tgstation::Server::Host::Core']]], + ['iprocess_2ecs',['IProcess.cs',['../_i_process_8cs.html',1,'']]], + ['iprocessbase',['IProcessBase',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_base.html',1,'Tgstation::Server::Host::Core']]], + ['iprocessbase_2ecs',['IProcessBase.cs',['../_i_process_base_8cs.html',1,'']]], + ['iprocessexecutor',['IProcessExecutor',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_executor.html',1,'Tgstation::Server::Host::Core']]], + ['iprocessexecutor_2ecs',['IProcessExecutor.cs',['../_i_process_executor_8cs.html',1,'']]], + ['iprovider',['IProvider',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.html',1,'Tgstation::Server::Host::Components::Chat::Providers']]], + ['iprovider_2ecs',['IProvider.cs',['../_i_provider_8cs.html',1,'']]], + ['iproviderfactory',['IProviderFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_provider_factory.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['iproviderfactory_2ecs',['IProviderFactory.cs',['../_i_provider_factory_8cs.html',1,'']]], + ['irc',['Irc',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a2d962413bc23404156feea75066e39cca2b6446aa685b2e1260e9d6f60239e547',1,'Tgstation::Server::Api::Models']]], + ['ircchannel',['IrcChannel',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html#a4efdc5fca3a1230d57d63b6393b65239',1,'Tgstation::Server::Api::Models::ChatChannel']]], + ['ircconnectionstringbuilder',['IrcConnectionStringBuilder',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html',1,'Tgstation.Server.Api.Models.IrcConnectionStringBuilder'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#aaca6717795e0914dd265e40bdeb9e045',1,'Tgstation.Server.Api.Models.IrcConnectionStringBuilder.IrcConnectionStringBuilder()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#a7334c0cb968cb00c1bbe1c5fd3a05e33',1,'Tgstation.Server.Api.Models.IrcConnectionStringBuilder.IrcConnectionStringBuilder(string connectionString)']]], + ['ircconnectionstringbuilder_2ecs',['IrcConnectionStringBuilder.cs',['../_irc_connection_string_builder_8cs.html',1,'']]], + ['ircpasswordtype',['IrcPasswordType',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a0a41c646f859c99d437373d8e6e0545b',1,'Tgstation::Server::Api::Models']]], + ['ircpasswordtype_2ecs',['IrcPasswordType.cs',['../_irc_password_type_8cs.html',1,'']]], + ['ircprovider',['IrcProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#ae046e83091f25fdd01e32c895aaf627c',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.IrcProvider()']]], + ['ircprovider_2ecs',['IrcProvider.cs',['../_irc_provider_8cs.html',1,'']]], + ['ireattachinfohandler',['IReattachInfoHandler',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_reattach_info_handler.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['ireattachinfohandler_2ecs',['IReattachInfoHandler.cs',['../_i_reattach_info_handler_8cs.html',1,'']]], + ['irepository',['IRepository',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html',1,'Tgstation::Server::Host::Components::Repository']]], + ['irepository_2ecs',['IRepository.cs',['../_i_repository_8cs.html',1,'']]], + ['irepositoryclient',['IRepositoryClient',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.html',1,'Tgstation::Server::Client::Components']]], + ['irepositoryclient_2ecs',['IRepositoryClient.cs',['../_i_repository_client_8cs.html',1,'']]], + ['irepositorymanager',['IRepositoryManager',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository_manager.html',1,'Tgstation::Server::Host::Components::Repository']]], + ['irepositorymanager_2ecs',['IRepositoryManager.cs',['../_i_repository_manager_8cs.html',1,'']]], + ['irequestlogger',['IRequestLogger',['../interface_tgstation_1_1_server_1_1_client_1_1_i_request_logger.html',1,'Tgstation::Server::Client']]], + ['irequestlogger_2ecs',['IRequestLogger.cs',['../_i_request_logger_8cs.html',1,'']]], + ['irestarthandler',['IRestartHandler',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_handler.html',1,'Tgstation::Server::Host::Core']]], + ['irestarthandler_2ecs',['IRestartHandler.cs',['../_i_restart_handler_8cs.html',1,'']]], + ['irestartregistration',['IRestartRegistration',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_registration.html',1,'Tgstation::Server::Host::Core']]], + ['irestartregistration_2ecs',['IRestartRegistration.cs',['../_i_restart_registration_8cs.html',1,'']]], + ['isadminchannel',['IsAdminChannel',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html#a1a945855589edd8cd22a68bb1ae7323e',1,'Tgstation.Server.Api.Models.ChatChannel.IsAdminChannel()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html#a5e65793a57309c1b5feb1cb5f61ef56e',1,'Tgstation.Server.Host.Components.Chat.Channel.IsAdminChannel()']]], + ['isadministrator',['IsAdministrator',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html#a5c942ce276ce92ca31ecbe9c88f2e982',1,'Tgstation::Server::Host::Service::Program']]], + ['isdirectory',['IsDirectory',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html#a674f1c0203cb7b2cd326ead5f810b885',1,'Tgstation.Server.Api.Models.ConfigurationFile.IsDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.html#a6b94d0c1144161066ce9707231026fe3',1,'Tgstation.Server.Host.IO.ISynchronousIOManager.IsDirectory()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.html#ac1b1a366625c83d9e7cc57acabca1d98',1,'Tgstation.Server.Host.IO.SynchronousIOManager.IsDirectory()']]], + ['iserver',['IServer',['../interface_tgstation_1_1_server_1_1_host_1_1_i_server.html',1,'Tgstation::Server::Host']]], + ['iserver_2ecs',['IServer.cs',['../_i_server_8cs.html',1,'']]], + ['iserverclient',['IServerClient',['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html',1,'Tgstation::Server::Client']]], + ['iserverclient_2ecs',['IServerClient.cs',['../_i_server_client_8cs.html',1,'']]], + ['iserverclientfactory',['IServerClientFactory',['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client_factory.html',1,'Tgstation::Server::Client']]], + ['iserverclientfactory_2ecs',['IServerClientFactory.cs',['../_i_server_client_factory_8cs.html',1,'']]], + ['iservercontrol',['IServerControl',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control.html',1,'Tgstation::Server::Host::Core']]], + ['iservercontrol_2ecs',['IServerControl.cs',['../_i_server_control_8cs.html',1,'']]], + ['iserverfactory',['IServerFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_i_server_factory.html',1,'Tgstation::Server::Host']]], + ['iserverfactory_2ecs',['IServerFactory.cs',['../_i_server_factory_8cs.html',1,'']]], + ['isessioncontroller',['ISessionController',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['isessioncontroller_2ecs',['ISessionController.cs',['../_i_session_controller_8cs.html',1,'']]], + ['isessioncontrollerfactory',['ISessionControllerFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller_factory.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['isessioncontrollerfactory_2ecs',['ISessionControllerFactory.cs',['../_i_session_controller_factory_8cs.html',1,'']]], + ['isetupwizard',['ISetupWizard',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_setup_wizard.html',1,'Tgstation::Server::Host::Core']]], + ['isetupwizard_2ecs',['ISetupWizard.cs',['../_i_setup_wizard_8cs.html',1,'']]], + ['isgithubrepository',['IsGitHubRepository',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#a60ae733cb70d63e2ceedadca18bec940',1,'Tgstation.Server.Host.Components.Repository.IRepository.IsGitHubRepository()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a5a58e407a627009694a99f21823c2593',1,'Tgstation.Server.Host.Components.Repository.Repository.IsGitHubRepository()']]], + ['isinstanceright',['IsInstanceRight',['../class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper.html#a40d32838ff902da852c54215bd8e89fb',1,'Tgstation::Server::Api::Rights::RightsHelper']]], + ['isprimary',['IsPrimary',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a41936b7d9cba1ed471a67ef71b832e62',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.IsPrimary()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#ae1efcc624f78a7c1ce978b000d09d382',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.IsPrimary()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#afe5b724b9a11fb66a39d159dfa35bdf1',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.IsPrimary()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html#ab8164f7f2f90feaf4a79fd6e6b06fcea',1,'Tgstation.Server.Host.Models.ReattachInformationBase.IsPrimary()']]], + ['isprivatechannel',['IsPrivateChannel',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html#af3b6600b9325bf76ca4380d03bfdce6a',1,'Tgstation::Server::Host::Components::Chat::Channel']]], + ['issha',['IsSha',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#ac03c80ad5ffb1ee381dd882fa7a01c3c',1,'Tgstation.Server.Host.Components.Repository.IRepository.IsSha()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#ad2d7497e82967ff9a18368a100c58bf1',1,'Tgstation.Server.Host.Components.Repository.Repository.IsSha()']]], + ['istokenauthentication',['IsTokenAuthentication',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a30222f85d684f2a9c9861a8638b6a31f',1,'Tgstation::Server::Api::ApiHeaders']]], + ['isupdateschannel',['IsUpdatesChannel',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html#a9e8659b045bad05567bef7d037d372d9',1,'Tgstation.Server.Api.Models.ChatChannel.IsUpdatesChannel()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping.html#a602d016c7a0c753aea994d6fc1d6f9db',1,'Tgstation.Server.Host.Components.Chat.ChannelMapping.IsUpdatesChannel()']]], + ['iswatchdogchannel',['IsWatchdogChannel',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html#afb292a0bc8975fae2ca0269e77b29430',1,'Tgstation.Server.Api.Models.ChatChannel.IsWatchdogChannel()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping.html#aa1ded40a4ff15aa4d0e588aca23f6577',1,'Tgstation.Server.Host.Components.Chat.ChannelMapping.IsWatchdogChannel()']]], + ['iswindows',['IsWindows',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_platform_identifier.html#adb4707b4666412fcd499d72689fe2d68',1,'Tgstation.Server.Host.Core.IPlatformIdentifier.IsWindows()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_platform_identifier.html#a3780544c2b8533c3c34e93937bbf8c7e',1,'Tgstation.Server.Host.Core.PlatformIdentifier.IsWindows()']]], + ['isymlinkfactory',['ISymlinkFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_symlink_factory.html',1,'Tgstation::Server::Host::IO']]], + ['isymlinkfactory_2ecs',['ISymlinkFactory.cs',['../_i_symlink_factory_8cs.html',1,'']]], + ['isynchronousiomanager',['ISynchronousIOManager',['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.html',1,'Tgstation::Server::Host::IO']]], + ['isynchronousiomanager_2ecs',['ISynchronousIOManager.cs',['../_i_synchronous_i_o_manager_8cs.html',1,'']]], + ['isystemidentity',['ISystemIdentity',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity.html',1,'Tgstation::Server::Host::Security']]], + ['isystemidentity_2ecs',['ISystemIdentity.cs',['../_i_system_identity_8cs.html',1,'']]], + ['isystemidentityfactory',['ISystemIdentityFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity_factory.html',1,'Tgstation::Server::Host::Security']]], + ['isystemidentityfactory_2ecs',['ISystemIdentityFactory.cs',['../_i_system_identity_factory_8cs.html',1,'']]], + ['itokenfactory',['ITokenFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_token_factory.html',1,'Tgstation::Server::Host::Security']]], + ['itokenfactory_2ecs',['ITokenFactory.cs',['../_i_token_factory_8cs.html',1,'']]], + ['iusersclient',['IUsersClient',['../interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.html',1,'Tgstation::Server::Client']]], + ['iusersclient_2ecs',['IUsersClient.cs',['../_i_users_client_8cs.html',1,'']]], + ['iwatchdog',['IWatchdog',['../interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog.html',1,'Tgstation.Server.Host.Watchdog.IWatchdog'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog']]], + ['iwatchdog_2ecs',['IWatchdog.cs',['../_components_2_watchdog_2_i_watchdog_8cs.html',1,'(Global Namespace)'],['../_watchdog_2_i_watchdog_8cs.html',1,'(Global Namespace)']]], + ['iwatchdogfactory',['IWatchdogFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog_factory.html',1,'Tgstation.Server.Host.Watchdog.IWatchdogFactory'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog_factory.html',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdogFactory']]], + ['iwatchdogfactory_2ecs',['IWatchdogFactory.cs',['../_components_2_watchdog_2_i_watchdog_factory_8cs.html',1,'(Global Namespace)'],['../_watchdog_2_i_watchdog_factory_8cs.html',1,'(Global Namespace)']]] +]; diff --git a/search/all_a.html b/search/all_a.html new file mode 100644 index 0000000000..63f9254d82 --- /dev/null +++ b/search/all_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_a.js b/search/all_a.js new file mode 100644 index 0000000000..8f1ca53fa3 --- /dev/null +++ b/search/all_a.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['job',['Job',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html',1,'Tgstation.Server.Api.Models.Internal.Job'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job.html',1,'Tgstation.Server.Api.Models.Job'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html',1,'Tgstation.Server.Host.Models.Job'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job.html#afe93454d04d57732c948c207cc6d21cb',1,'Tgstation.Server.Api.Models.CompileJob.Job()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.html#a0676e94669f8de80f67aa20c72db5b7c',1,'Tgstation.Server.Host.Models.CompileJob.Job()']]], + ['job_2ecs',['Job.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_job_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_api_2_models_2_job_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_job_8cs.html',1,'(Global Namespace)']]], + ['jobcontroller',['JobController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html',1,'Tgstation.Server.Host.Controllers.JobController'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html#adfbadb3527c89cc59339223bd0e3c5d8',1,'Tgstation.Server.Host.Controllers.JobController.JobController()']]], + ['jobcontroller_2ecs',['JobController.cs',['../_job_controller_8cs.html',1,'']]], + ['jobexception',['JobException',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_exception.html',1,'Tgstation.Server.Host.Core.JobException'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_exception.html#a7e2640b446286941b31c2f061cbbe4bb',1,'Tgstation.Server.Host.Core.JobException.JobException()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_exception.html#a2e11923797181822e8eef7b617fe715f',1,'Tgstation.Server.Host.Core.JobException.JobException(string message)'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_exception.html#af296136e4c2ac489cfa9b0de5aa8e7cf',1,'Tgstation.Server.Host.Core.JobException.JobException(string message, Exception innerException)']]], + ['jobexception_2ecs',['JobException.cs',['../_job_exception_8cs.html',1,'']]], + ['jobhandler',['JobHandler',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html',1,'Tgstation.Server.Host.Core.JobHandler'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html#affef1fbb3f5b44febc56f4f634c64aff',1,'Tgstation.Server.Host.Core.JobHandler.JobHandler()']]], + ['jobhandler_2ecs',['JobHandler.cs',['../_job_handler_8cs.html',1,'']]], + ['jobid',['JobId',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.html#aeb314186da6c36566c0b8e5af7441014',1,'Tgstation::Server::Host::Models::CompileJob']]], + ['joblockcounts',['jobLockCounts',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a59711d360b347c55e94405a9380d0201',1,'Tgstation::Server::Host::Components::Compiler::DmbFactory']]], + ['jobmanager',['JobManager',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html',1,'Tgstation.Server.Host.Core.JobManager'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a8442698876a3b1aab29cb968cd97203e',1,'Tgstation.Server.Host.Components.Instance.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a6913b05824f8ac83a8b5d87386ca96aa',1,'Tgstation.Server.Host.Components.InstanceFactory.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a26d85ac963bb5258ff0ff1041fce7fa3',1,'Tgstation.Server.Host.Components.InstanceManager.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a1688863ddcd7d0bbfa3ec13b7b015319',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#a9cf783832be989be4ccc542d0b738710',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html#a8e1ba9fcd8b44116da4230580c5cdbca',1,'Tgstation.Server.Host.Controllers.ByondController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#ace2a566cc7ff09b10c0bbf448aaeae69',1,'Tgstation.Server.Host.Controllers.DreamDaemonController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html#ae195b225516fe09da8661438fb1dc03f',1,'Tgstation.Server.Host.Controllers.DreamMakerController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a38f7f9669773242d177345e38be2dd34',1,'Tgstation.Server.Host.Controllers.InstanceController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html#a6386df07802db9cdbf34ffe40b031921',1,'Tgstation.Server.Host.Controllers.JobController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#ad15c0217bf9e5ce926a198191d0a04c4',1,'Tgstation.Server.Host.Controllers.RepositoryController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a600fa1321291e3efc38017257e2d4970',1,'Tgstation.Server.Host.Core.JobManager.JobManager()']]], + ['jobmanager_2ecs',['JobManager.cs',['../_job_manager_8cs.html',1,'']]], + ['jobprogress',['JobProgress',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager.html#ae17f251b5dab8ff001059a18f2173749',1,'Tgstation.Server.Host.Core.IJobManager.JobProgress()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#aae4939a2e804eb38fb95e5439eedcf65',1,'Tgstation.Server.Host.Core.JobManager.JobProgress()']]], + ['jobs',['jobs',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a8a9c1a9f80ee10d57d0bb37c7dcaf546',1,'Tgstation.Server.Host.Core.JobManager.jobs()'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a85c563262244bd21fe1bfa1ce5de6a1d',1,'Tgstation.Server.Api.Routes.Jobs()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#ae0df68e17fa23d0ed3445a2c8b2a00b4',1,'Tgstation.Server.Client.Components.IInstanceClient.Jobs()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a84709639847ef446f64be8be1da70c36',1,'Tgstation.Server.Client.Components.InstanceClient.Jobs()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a6f7859cdfa8c1fb81352102ace4e6609',1,'Tgstation.Server.Host.Models.DatabaseContext.Jobs()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#adb2f37e11b8be23855d35e90ad312d3e',1,'Tgstation.Server.Host.Models.IDatabaseContext.Jobs()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a60948c8acd4bca48ce5ea294bcc2e0b6',1,'Tgstation.Server.Host.Models.Instance.Jobs()']]], + ['jobsclient',['JobsClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html',1,'Tgstation.Server.Client.Components.JobsClient'],['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html#a19f34ff37dc6b3f9a83533602d914a70',1,'Tgstation.Server.Tests.Instance.ByondTest.jobsClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html#a9ffef36f7b69e7c76e31af3958797846',1,'Tgstation.Server.Client.Components.JobsClient.JobsClient()']]], + ['jobsclient_2ecs',['JobsClient.cs',['../_jobs_client_8cs.html',1,'']]], + ['jsonconverter',['JsonConverter',['../class_json_converter.html',1,'']]], + ['jsonfile',['JsonFile',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html',1,'Tgstation::Server::Host::Components::Interop']]], + ['jsonfile_2ecs',['JsonFile.cs',['../_json_file_8cs.html',1,'']]], + ['jsonsubfilelist',['JsonSubFileList',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list.html',1,'Tgstation.Server.Host.Components.Interop.JsonSubFileList'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list.html#a268da56241a355906e159a88fd2f9656',1,'Tgstation.Server.Host.Components.Interop.JsonSubFileList.JsonSubFileList()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list.html#a4a823e2d73954d0b15bb88bf43e94387',1,'Tgstation.Server.Host.Components.Interop.JsonSubFileList.JsonSubFileList(JsonSubFileList copy)']]], + ['jsonsubfilelist_2ecs',['JsonSubFileList.cs',['../_json_sub_file_list_8cs.html',1,'']]], + ['jsontrackingcontext',['JsonTrackingContext',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#ad9ce63452e0d98011d7b5e2290829e22',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext.JsonTrackingContext()']]], + ['jsontrackingcontext_2ecs',['JsonTrackingContext.cs',['../_json_tracking_context_8cs.html',1,'']]], + ['jwtauthenticationscheme',['JwtAuthenticationScheme',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a3d49a18342b81d0427f09e51c29544c2',1,'Tgstation::Server::Api::ApiHeaders']]] +]; diff --git a/search/all_b.html b/search/all_b.html new file mode 100644 index 0000000000..44ae3e475b --- /dev/null +++ b/search/all_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_b.js b/search/all_b.js new file mode 100644 index 0000000000..ec20818773 --- /dev/null +++ b/search/all_b.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['keepalive',['KeepAlive',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#a9689654a6dbdb16cdbfb52f9b3c4d595',1,'Tgstation.Server.Host.Components.Compiler.DmbProvider.KeepAlive()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html#adbed7f599b394dfea91f361e742ff587',1,'Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.KeepAlive()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.html#a401e38b6b2c147963eb4a6d42e41b7d3',1,'Tgstation.Server.Host.Components.IDmbProvider.KeepAlive()']]], + ['kek',['Kek',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command.html#a341a9da46f3d06a03bba883d149ff8f3',1,'Tgstation::Server::Host::Components::Chat::Commands::KekCommand']]], + ['kekcommand',['KekCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command.html',1,'Tgstation::Server::Host::Components::Chat::Commands']]], + ['kekcommand_2ecs',['KekCommand.cs',['../_kek_command_8cs.html',1,'']]] +]; diff --git a/search/all_c.html b/search/all_c.html new file mode 100644 index 0000000000..3de15867d4 --- /dev/null +++ b/search/all_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_c.js b/search/all_c.js new file mode 100644 index 0000000000..7f41f05f6e --- /dev/null +++ b/search/all_c.js @@ -0,0 +1,35 @@ +var searchData= +[ + ['lastlaunchparameters',['LastLaunchParameters',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#adf8f73df0fe074af3363857bc43e63a5',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.LastLaunchParameters()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a6548572ef5ab9d7b6b3aae8647a0a053',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.LastLaunchParameters()']]], + ['lastpasswordupdate',['LastPasswordUpdate',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#abd891143624157c8f48bd166cc88ab26',1,'Tgstation::Server::Host::Models::User']]], + ['lastreadhash',['LastReadHash',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html#aad10d9456adc3925247d9f7b49eebeba',1,'Tgstation::Server::Api::Models::ConfigurationFile']]], + ['latestcompilejob',['LatestCompileJob',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html#a8fbc4f11668d3fbb940b88b1b84ab6cc',1,'Tgstation.Server.Host.Components.IInstance.LatestCompileJob()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a4b1084d8d2850d408abae881013a47d9',1,'Tgstation.Server.Host.Components.Instance.LatestCompileJob()']]], + ['latestversion',['LatestVersion',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_administration.html#a907f93161ad8982e66ae18eedf62f241',1,'Tgstation::Server::Api::Models::Administration']]], + ['launch',['Launch',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#afa6b3f10617f13ae7af79317594020e3',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.Launch()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#af619caa031c183aa1aa5adbcf11a3434',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Launch()']]], + ['launchimplnolock',['LaunchImplNoLock',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a589411b1060254b846b3c5a083744441',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['launchnew',['LaunchNew',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller_factory.html#a81e24e064947e945f32e3c480c9dfba9',1,'Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory.LaunchNew()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#a9a53c980bff085803855b2131d923f14',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew()']]], + ['launchprocess',['LaunchProcess',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_executor.html#a1a1777b10e6d7691e2b4a42f5409c2b1',1,'Tgstation.Server.Host.Core.IProcessExecutor.LaunchProcess()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html#ae15f39beff0bc5e489ddb0c2a6ce3e45',1,'Tgstation.Server.Host.Core.ProcessExecutor.LaunchProcess()']]], + ['launchresult',['LaunchResult',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_launch_result.html',1,'Tgstation.Server.Host.Components.Watchdog.LaunchResult'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#ab0055c5ef27b2a9e2a1997e27510e591',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.LaunchResult()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#adaa02ab9bccaaf1ad18f199e319724bc',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.LaunchResult()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a2c534a4480daf0bef9b850155d5492d6',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.LaunchResult()']]], + ['launchresult_2ecs',['LaunchResult.cs',['../_launch_result_8cs.html',1,'']]], + ['launchsecuritylevel',['launchSecurityLevel',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a06664796f61019c512c5588a59fb227c',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['lifetime',['Lifetime',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#ad7f2aa840a1fd11a2aa6e150e1bbddcc',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Lifetime()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a422b1bae1daaf01d446fcdb437518656',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.Lifetime()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_base.html#ab0a9955d3c111c6d847a64c7359e96f6',1,'Tgstation.Server.Host.Core.IProcessBase.Lifetime()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a264612ef60ad839d988fb9484baab432',1,'Tgstation.Server.Host.Core.Process.Lifetime()']]], + ['list',['List',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#af2441379f7420b414f37f5e18ef12e34',1,'Tgstation.Server.Api.Routes.List()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#a2e101ca44e6cd38eb8feb5e92083a58b',1,'Tgstation.Server.Client.Components.ChatBotsClient.List()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#a9abb058e8e7dc5fb6449db904e3ba593',1,'Tgstation.Server.Client.Components.ConfigurationClient.List()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html#ad482caafbf4b09fcd950b2121c384803',1,'Tgstation.Server.Client.Components.IChatBotsClient.List()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.html#a20e28735258c505105437c094634d3d3',1,'Tgstation.Server.Client.Components.IConfigurationClient.List()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html#aa67a2d298305192f32b1e9567aeb9b96',1,'Tgstation.Server.Client.Components.IInstanceUserClient.List()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client.html#aacb0377d1905df14195477b25ea1640c',1,'Tgstation.Server.Client.Components.IJobsClient.List()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#a3854e076413652c6e243bba0404b4caf',1,'Tgstation.Server.Client.Components.InstanceUserClient.List()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html#a7b796de436a48cc7a376e8f821294ec5',1,'Tgstation.Server.Client.Components.JobsClient.List()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html#a4d9ba68cfba405ad7a75f7a704cd9949',1,'Tgstation.Server.Client.IInstanceManagerClient.List()'],['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#a90e8afdfd1ba96a1891ca1e6cefdd5e1',1,'Tgstation.Server.Client.InstanceManagerClient.List()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.html#aee6bf0424f2533c0b5fdd9a14c530c83',1,'Tgstation.Server.Client.IUsersClient.List()'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#ae560ae12df2a21d293055557095cf173',1,'Tgstation.Server.Client.UsersClient.List()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html#a13db02f6ee64da7010e237396b65c6a0',1,'Tgstation.Server.Host.Controllers.ByondController.List()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html#a8d6f1a4319d848e50f4022ee4033d45f',1,'Tgstation.Server.Host.Controllers.ChatController.List()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#afb16c170a38d79139c95de89e25d7a77',1,'Tgstation.Server.Host.Controllers.ConfigurationController.List()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html#a4a3cee3c8ad72825df35bdc0d235961b',1,'Tgstation.Server.Host.Controllers.DreamMakerController.List()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a2afc9e8b1ba1f7a43894f7168fe5418f',1,'Tgstation.Server.Host.Controllers.InstanceController.List()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html#a7d40235b83ad9034edb4097ced8ed09b',1,'Tgstation.Server.Host.Controllers.InstanceUserController.List()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html#a4668a7f0f514c47fa1e9564d174643b1',1,'Tgstation.Server.Host.Controllers.JobController.List()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html#a7c592512d93767d2da3f40b61d58968a',1,'Tgstation.Server.Host.Controllers.ModelController.List()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#a3dded8f4741b40d33c281dee59ca8e26',1,'Tgstation.Server.Host.Controllers.UserController.List()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a691a59767073bc7dff0f17b809d07b0ca4ee29ca12c7d126654bd0e5275de6135',1,'Tgstation.Server.Api.Rights.List()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79a4ee29ca12c7d126654bd0e5275de6135',1,'Tgstation.Server.Api.Rights.List()']]], + ['listactive',['ListActive',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client.html#ad0e3189ae3f28e20982cf4b853013725',1,'Tgstation.Server.Client.Components.IJobsClient.ListActive()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html#a6de35b6d2f313009107e2bb2e2cc4ac7',1,'Tgstation.Server.Client.Components.JobsClient.ListActive()']]], + ['listdirectory',['ListDirectory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a345e802c3d53374b244c935d2ae0047b',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.ListDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.html#a92a08839e2a1abad8ab26431f27ae8c6',1,'Tgstation.Server.Host.Components.StaticFiles.IConfiguration.ListDirectory()']]], + ['listentask',['listenTask',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a4973331fd7986b7f14ec00426b474253',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]], + ['listinstalled',['ListInstalled',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a2a217a19e652f117e2324fb79ed838b9ad102ca284a1a9df653f41ec4c1b22a0b',1,'Tgstation::Server::Api::Rights']]], + ['load',['Load',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html#a061b19ede4db939c9eaa44760dc71296',1,'Tgstation.Server.Host.Components.ReattachInfoHandler.Load()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_reattach_info_handler.html#a8ae59276bc40d0b3a422955c6de2772f',1,'Tgstation.Server.Host.Components.Watchdog.IReattachInfoHandler.Load()']]], + ['loadcachedidentity',['LoadCachedIdentity',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html#a2697ebf18fec9213032f48fb5f351397',1,'Tgstation.Server.Host.Security.IdentityCache.LoadCachedIdentity()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_identity_cache.html#afc655c9c2d6af6086bcda5b6c54e1c41',1,'Tgstation.Server.Host.Security.IIdentityCache.LoadCachedIdentity()']]], + ['loadcompilejob',['LoadCompileJob',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#acac70b83bad6a39918ffb65aa51ed8cc',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.LoadCompileJob()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_compile_job_consumer.html#a668c0ce97bba81789dc20410082865d4',1,'Tgstation.Server.Host.Components.Compiler.ICompileJobConsumer.LoadCompileJob()']]], + ['loadrepository',['LoadRepository',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository_manager.html#aca54bc5a72d05e25cc361728e80b6f1c',1,'Tgstation.Server.Host.Components.Repository.IRepositoryManager.LoadRepository()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#afcab0cdc52ae45ecd0dfba5c7630e303',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.LoadRepository()']]], + ['loadrevisioninformation',['LoadRevisionInformation',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#aa50a2c5f9429a3b52acd47e157f93e47',1,'Tgstation::Server::Host::Controllers::RepositoryController']]], + ['lock',['Lock',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html#a01e4f4e2d775bd2bf0910a1f5c2f24ef',1,'Tgstation::Server::Host::Core::SemaphoreSlimContext']]], + ['lockedsemaphore',['lockedSemaphore',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html#ada2fac68aaa78fbd25c0cb1337925f00',1,'Tgstation::Server::Host::Core::SemaphoreSlimContext']]], + ['locknextdmb',['LockNextDmb',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#add7411c3c24ecb4111738e6ef9c57332',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.LockNextDmb()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory.html#adefdd87ce308d4dfe89f1639fd2c94d4',1,'Tgstation.Server.Host.Components.Compiler.IDmbFactory.LockNextDmb()']]], + ['logger',['logger',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a25f231d9dcbd28c75f9665fb7f0b5e80',1,'Tgstation.Server.Host.Components.Byond.ByondManager.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#acc36317dcbca8c0270c3268e6baa97ce',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a840e56bd491d1ccc2137a6672158f813',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a77069300c653d422a86fbf24424b5354',1,'Tgstation.Server.Host.Components.Chat.Chat.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#a68ad649d2610bcca56d5cb810b889594',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#a8423dac685aea12cdce24d5743a2554f',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a7f84b758cc7548eee2e01b86d8944721',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a4406ae1b1c13c74410a4587287015405',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a1ac7c72870daea9b8fcd6b700dc19573',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#ab4e452661f1c4a25ad903315e42e023e',1,'Tgstation.Server.Host.Components.Instance.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a968fedca8d4cc5ff16c77c0cbc782bda',1,'Tgstation.Server.Host.Components.InstanceManager.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#a9896d4d9823b5c5fe8454faaebe05727',1,'Tgstation.Server.Host.Components.Interop.CommContext.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html#ab7edf14c652d29baf9cd01eaa8580bac',1,'Tgstation.Server.Host.Components.ReattachInfoHandler.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider.html#afb01908cc420ca848e289cd9f3b2a9f8',1,'Tgstation.Server.Host.Components.Repository.CredentialsProvider.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#aaaf20e963c78e114158f07652efc7986',1,'Tgstation.Server.Host.Components.Repository.Repository.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#ab48210b91ab8add64013a209d4223070',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#ab3c240ff7f92402a96f36d29f6ede284',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a807538e13ba482e904ffe0289f1a45a0',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#aa2d55f04b784aa065ea29038fbe50936',1,'Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#aa5a69729c97d0a6eefe433fa956ce556',1,'Tgstation.Server.Host.Controllers.UserController.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#af83d95abda82865799d652b73909612e',1,'Tgstation.Server.Host.Core.JobManager.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a6441bc215e4fa67e76cf1a97bda66cb1',1,'Tgstation.Server.Host.Core.Process.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html#af70a41847bfc5c6210618ee35a8df429',1,'Tgstation.Server.Host.Core.ProcessExecutor.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a3ac53d10c0c2b3ddd10d474bb0d64f8b',1,'Tgstation.Server.Host.Core.SetupWizard.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html#a382d063e7f62559b994c5639504737b6',1,'Tgstation.Server.Host.Security.IdentityCache.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.html#a384470b6fd596dcc97a6e39a0dcdbe74',1,'Tgstation.Server.Host.Security.WindowsSystemIdentityFactory.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#aed53aa0f4276d05a985604f291c70f29',1,'Tgstation.Server.Host.Server.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html#a247d89dab45478183870bbdac843dbde',1,'Tgstation.Server.Host.Watchdog.Watchdog.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#aeb085dbe37cb7208de2d0fe9026e4575',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#a1351fb29bf0d6c411585098aed5616c6',1,'Tgstation.Server.Host.Controllers.ApiController.Logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a43445d9d612fbdf104974bab5a741af0',1,'Tgstation.Server.Host.Models.DatabaseContext.Logger()']]], + ['loggerfactory',['loggerFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a145c7ddb0aef295db2a26fa302a0907d',1,'Tgstation.Server.Host.Components.Chat.Chat.loggerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html#ae7a8fc22bc98072deb02ac6801de37d5',1,'Tgstation.Server.Host.Components.Chat.ChatFactory.loggerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html#a8d321b369f849147a5713738bc16c713',1,'Tgstation.Server.Host.Components.Chat.ProviderFactory.loggerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#afe93210d51c3cd078d16a4b510c3ebe8',1,'Tgstation.Server.Host.Components.InstanceFactory.loggerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#aea415938b2e88e3b63478a46faec41d2',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.loggerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#a31fb20da622d47726730ae6249bb3f20',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.loggerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html#af64b0c00b2fa5e14e6a0c05cd52564f6',1,'Tgstation.Server.Host.Core.ProcessExecutor.loggerFactory()']]], + ['loglevel',['LogLevel',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html#a77b327379b355d7569c118e85e25a3e7',1,'Tgstation::Server::Host::Configuration::FileLoggingConfiguration']]], + ['logonuser',['LogonUser',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#a1dfa561b475b805169687e321251038c',1,'Tgstation::Server::Host::NativeMethods']]], + ['logrequest',['LogRequest',['../interface_tgstation_1_1_server_1_1_client_1_1_i_request_logger.html#a865404ae66021a7a6d95c0688e51f51c',1,'Tgstation::Server::Client::IRequestLogger']]], + ['logresponse',['LogResponse',['../interface_tgstation_1_1_server_1_1_client_1_1_i_request_logger.html#a685925403fc438eb5d3688ce8aca08b7',1,'Tgstation::Server::Client::IRequestLogger']]] +]; diff --git a/search/all_d.html b/search/all_d.html new file mode 100644 index 0000000000..a2d5bd7ed5 --- /dev/null +++ b/search/all_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_d.js b/search/all_d.js new file mode 100644 index 0000000000..748ba02fcf --- /dev/null +++ b/search/all_d.js @@ -0,0 +1,75 @@ +var searchData= +[ + ['main',['Main',['../class_tgstation_1_1_server_1_1_host_1_1_program.html#ad9df0f26f38c75cf0c376910caef770c',1,'Tgstation.Server.Host.Program.Main()'],['../class_tgstation_1_1_server_1_1_host_1_1_console_1_1_program.html#a2b1daae5257614a029bae6c5b83bce47',1,'Tgstation.Server.Host.Console.Program.Main()'],['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html#a626a9a4670edb87ce05328762d46cf8f',1,'Tgstation.Server.Host.Service.Program.Main()'],['../class_auto_generated_program.html#a10fe504a3ffa3644fc9de3ad978c9baf',1,'AutoGeneratedProgram.Main(string[] args)'],['../class_auto_generated_program.html#a10fe504a3ffa3644fc9de3ad978c9baf',1,'AutoGeneratedProgram.Main(string[] args)'],['../class_auto_generated_program.html#a10fe504a3ffa3644fc9de3ad978c9baf',1,'AutoGeneratedProgram.Main(string[] args)'],['../class_auto_generated_program.html#a10fe504a3ffa3644fc9de3ad978c9baf',1,'AutoGeneratedProgram.Main(string[] args)'],['../class_auto_generated_program.html#a10fe504a3ffa3644fc9de3ad978c9baf',1,'AutoGeneratedProgram.Main(string[] args)'],['../class_auto_generated_program.html#a10fe504a3ffa3644fc9de3ad978c9baf',1,'AutoGeneratedProgram.Main(string[] args)'],['../class_release_notes_1_1_program.html#af1f3b99a3336b8990d1015360a86c852',1,'ReleaseNotes.Program.Main()']]], + ['mapchannels',['MapChannels',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#a86d6049a36de24c5818acf1de2957d9e',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.MapChannels()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.html#a6a370b2ee042be699a24a448e41756c0',1,'Tgstation.Server.Host.Components.Chat.Providers.IProvider.MapChannels()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a41099f545ca1e6c9967fb74f931c8ef8',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.MapChannels()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#a7898cde69762bf51ee28a1597ac98d5d',1,'Tgstation.Server.Host.Components.Chat.Providers.Provider.MapChannels()']]], + ['mappedchannels',['mappedChannels',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ab79b64792d737c21c44e332534fde2c2',1,'Tgstation.Server.Host.Components.Chat.Chat.mappedChannels()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#a044ae95d278a4ed4a6a02449e24e8146',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.mappedChannels()']]], + ['mariadb',['MariaDB',['../namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html#acda8f6ee23a9ee8ac298f7b4a7d5617ca7f9733e208088b1ce6df3d4be1765396',1,'Tgstation::Server::Host::Configuration']]], + ['match',['Match',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.html#acf0f8c66b9e3cfa5af8240d0efac2e36',1,'Tgstation::Server::Api::Models::Internal::DreamDaemonLaunchParameters']]], + ['mention',['Mention',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user.html#a8462dc2b4e3bc2c889b2e3ca7ab0ef18',1,'Tgstation::Server::Host::Components::Chat::User']]], + ['mergedat',['MergedAt',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge.html#aa9544b21a01f937b6e1954670001234d',1,'Tgstation::Server::Api::Models::Internal::TestMerge']]], + ['mergedby',['MergedBy',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge.html#a891d563f4a6a8ed0672039e358b607f6',1,'Tgstation.Server.Api.Models.TestMerge.MergedBy()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html#af1122a5c2625038f509330ed4c77bb56',1,'Tgstation.Server.Host.Models.TestMerge.MergedBy()']]], + ['mergeorigin',['MergeOrigin',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#a2911d39fd36e857c0d77503fc5c41a94',1,'Tgstation.Server.Host.Components.Repository.IRepository.MergeOrigin()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#aa2437784b303f5c523a6638d717919eb',1,'Tgstation.Server.Host.Components.Repository.Repository.MergeOrigin()']]], + ['mergepullrequest',['MergePullRequest',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39a38de88c6dfc8b8669a4ffbc35be88aa2',1,'Tgstation::Server::Api::Rights']]], + ['message',['Message',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_message.html',1,'Tgstation.Server.Host.Components.Chat.Providers.Message'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html#ab90236023debcde2cc980ffe856934f9',1,'Tgstation.Server.Api.Models.ErrorMessage.Message()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_response.html#a2b9903ed2451c80594190c2d0d4e0ecc',1,'Tgstation.Server.Host.Components.Chat.Response.Message()']]], + ['message_2ecs',['Message.cs',['../_message_8cs.html',1,'']]], + ['messagequeue',['messageQueue',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#a0cf9e8f2427fc076d90805ef6ee06a66',1,'Tgstation::Server::Host::Components::Chat::Providers::Provider']]], + ['metadata',['metadata',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#ad54344c590beab965fead49ac08224a9',1,'Tgstation.Server.Host.Components.Instance.metadata()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html#aa3e886486d0a0ff9dd9b963c35ec95f4',1,'Tgstation.Server.Host.Components.ReattachInfoHandler.metadata()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#a22f01f297f6ddfa2cfca204c8b94fd83',1,'Tgstation.Server.Client.Components.IInstanceClient.Metadata()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a0107f70cae241fd15612608e8eb93f51',1,'Tgstation.Server.Client.Components.InstanceClient.Metadata()']]], + ['methodnotsupportedexception',['MethodNotSupportedException',['../class_tgstation_1_1_server_1_1_client_1_1_method_not_supported_exception.html',1,'Tgstation.Server.Client.MethodNotSupportedException'],['../class_tgstation_1_1_server_1_1_client_1_1_method_not_supported_exception.html#a7fb5cb48720526b863fc7bf5ea57ef02',1,'Tgstation.Server.Client.MethodNotSupportedException.MethodNotSupportedException()'],['../class_tgstation_1_1_server_1_1_client_1_1_method_not_supported_exception.html#a37543ec8aabe8b8fa96a15243d02e318',1,'Tgstation.Server.Client.MethodNotSupportedException.MethodNotSupportedException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_method_not_supported_exception.html#a5b0a4306e368279a8b18f50a7ad6bb63',1,'Tgstation.Server.Client.MethodNotSupportedException.MethodNotSupportedException(string message, Exception innerException)']]], + ['methodnotsupportedexception_2ecs',['MethodNotSupportedException.cs',['../_method_not_supported_exception_8cs.html',1,'']]], + ['microsoftloglevel',['MicrosoftLogLevel',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html#a5d27b790b93c94ea77f83b3729be63df',1,'Tgstation::Server::Host::Configuration::FileLoggingConfiguration']]], + ['migration',['Migration',['../class_migration.html',1,'']]], + ['minimumpasswordlength',['MinimumPasswordLength',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html#a7e7346acc104b86615effd5d65108c16',1,'Tgstation::Server::Host::Configuration::GeneralConfiguration']]], + ['minimumsecuritylevel',['MinimumSecurityLevel',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_compile_job.html#aba859254f245bc21a8ff640ab58caf03',1,'Tgstation::Server::Api::Models::Internal::CompileJob']]], + ['mockapplicationlifetime',['MockApplicationLifetime',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime.html',1,'Tgstation::Server::Host::Core::Tests::TestApplication']]], + ['mocksetupwizard',['MockSetupWizard',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_setup_wizard.html',1,'Tgstation::Server::Host::Core::Tests::TestApplication']]], + ['modelcontroller',['ModelController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation.Server.Host.Controllers.ModelController< TModel >'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html#aae03be6187527e319e078f16f05f029d',1,'Tgstation.Server.Host.Controllers.ModelController.ModelController()']]], + ['modelcontroller_2ecs',['ModelController.cs',['../_model_controller_8cs.html',1,'']]], + ['modelcontroller_3c_20administration_20_3e',['ModelController< Administration >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20api_2emodels_2ebyond_20_3e',['ModelController< Api.Models.Byond >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20api_2emodels_2echatbot_20_3e',['ModelController< Api.Models.ChatBot >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20api_2emodels_2einstance_20_3e',['ModelController< Api.Models.Instance >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20api_2emodels_2einstanceuser_20_3e',['ModelController< Api.Models.InstanceUser >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20api_2emodels_2ejob_20_3e',['ModelController< Api.Models.Job >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20configurationfile_20_3e',['ModelController< ConfigurationFile >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20dreamdaemon_20_3e',['ModelController< DreamDaemon >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20dreammaker_20_3e',['ModelController< DreamMaker >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20repository_20_3e',['ModelController< Repository >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20userupdate_20_3e',['ModelController< UserUpdate >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelsnapshot',['ModelSnapshot',['../class_model_snapshot.html',1,'']]], + ['modifydme',['ModifyDme',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a295665eca92d9eb5d17e1fb5d11c1559',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['monitoraction',['MonitorAction',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a97c1a4a168451bd7e3be23c467aa2812',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['monitoraction_2ecs',['MonitorAction.cs',['../_monitor_action_8cs.html',1,'']]], + ['monitoractivationreason',['MonitorActivationReason',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#acb2ccc2dc05d01ec3a6448d3d57155c9',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['monitoractivationreason_2ecs',['MonitorActivationReason.cs',['../_monitor_activation_reason_8cs.html',1,'']]], + ['monitorcts',['monitorCts',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a47a5f64148a117c561df7b0e7e1703e6',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['monitorlifetimes',['MonitorLifetimes',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#ae645457cc3d46e9af4db2aab7bd5fc4c',1,'Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.MonitorLifetimes()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#a8d676609895840ea192fabcbdb385707',1,'Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.MonitorLifetimes()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a4863be0a433eff6e496eb03230759fc5',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.MonitorLifetimes()']]], + ['monitormessages',['MonitorMessages',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ac18520f70606684f373aa25bba1c25fe',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['monitorstate',['MonitorState',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_monitor_state.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['monitorstate_2ecs',['MonitorState.cs',['../_monitor_state_8cs.html',1,'']]], + ['monitortask',['monitorTask',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#abfb7590db69ab59a040c1ac91c671d6d',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['movedirectory',['MoveDirectory',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a5c7c3fb8d450153922c11e37ea118f62',1,'Tgstation.Server.Host.IO.DefaultIOManager.MoveDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#ad8dc6ae8e69047b801a7344b17d0cc37',1,'Tgstation.Server.Host.IO.IIOManager.MoveDirectory()']]], + ['movefile',['MoveFile',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a2ecf7ea4ad7cadd294a1a4882e56a812',1,'Tgstation.Server.Host.IO.DefaultIOManager.MoveFile()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a2dff052035f4d3d0c689d0e89d8deecd',1,'Tgstation.Server.Host.IO.IIOManager.MoveFile()']]], + ['moveinstance',['MoveInstance',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.html#aa69422870da99ddea3c29e50e691d2da',1,'Tgstation.Server.Host.Components.IInstanceManager.MoveInstance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#af03d58b2af3646c99ff62db47dcf6d12',1,'Tgstation.Server.Host.Components.InstanceManager.MoveInstance()']]], + ['moveinstancejobprefix',['MoveInstanceJobPrefix',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a05f43b931e38b2d401566435d5a3de75',1,'Tgstation::Server::Host::Controllers::InstanceController']]], + ['movejob',['MoveJob',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html#af06c3e84c2a288ca0bd6cddd172a568d',1,'Tgstation::Server::Api::Models::Instance']]], + ['msaddminimumsecurity',['MSAddMinimumSecurity',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['msfixrevinfoindex',['MSFixRevInfoIndex',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_fix_rev_info_index.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['msinitialcreate',['MSInitialCreate',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['msnullableandforeignkeycleanup',['MSNullableAndForeignKeyCleanup',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['msreattachcompilejobrequired',['MSReattachCompileJobRequired',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['mstoggletestmergecomments',['MSToggleTestmergeComments',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['myaddminimumsecurity',['MYAddMinimumSecurity',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['myfixrevinfoindex',['MYFixRevInfoIndex',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_fix_rev_info_index.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['myinitialcreate',['MYInitialCreate',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['mynullableandforeignkeycleanup',['MYNullableAndForeignKeyCleanup',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['myreattachcompilejobrequired',['MYReattachCompileJobRequired',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['mysql',['MySql',['../namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html#acda8f6ee23a9ee8ac298f7b4a7d5617ca9df306f03daedccf83f5e2983dbb5422',1,'Tgstation::Server::Host::Configuration']]], + ['mysqldatabasecontext',['MySqlDatabaseContext',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_my_sql_database_context.html',1,'Tgstation.Server.Host.Models.MySqlDatabaseContext'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_my_sql_database_context.html#a82e4370619d62057376daf22ecc290a0',1,'Tgstation.Server.Host.Models.MySqlDatabaseContext.MySqlDatabaseContext()']]], + ['mysqldatabasecontext_2ecs',['MySqlDatabaseContext.cs',['../_my_sql_database_context_8cs.html',1,'']]], + ['mysqldatabasecontextmodelsnapshot',['MySqlDatabaseContextModelSnapshot',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_database_context_model_snapshot.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['mysqldatabasecontextmodelsnapshot_2ecs',['MySqlDatabaseContextModelSnapshot.cs',['../_my_sql_database_context_model_snapshot_8cs.html',1,'']]], + ['mysqldesigntimedbcontextfactory',['MySqlDesignTimeDbContextFactory',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_design_time_db_context_factory.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['mysqldesigntimedbcontextfactory_2ecs',['MySqlDesignTimeDbContextFactory.cs',['../_my_sql_design_time_db_context_factory_8cs.html',1,'']]], + ['mysqlserverversion',['MySqlServerVersion',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html#abb0513764b16289df15f08e8127d0582',1,'Tgstation::Server::Host::Configuration::DatabaseConfiguration']]], + ['mytoggletestmergecomments',['MYToggleTestmergeComments',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.html',1,'Tgstation::Server::Host::Models::Migrations']]] +]; diff --git a/search/all_e.html b/search/all_e.html new file mode 100644 index 0000000000..f9a056dcd5 --- /dev/null +++ b/search/all_e.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_e.js b/search/all_e.js new file mode 100644 index 0000000000..dd0b68840e --- /dev/null +++ b/search/all_e.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['name',['Name',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html#a14638776df0c9820958f4d5c532df67f',1,'Tgstation.Server.Api.Models.Instance.Name()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html#a5fe1533e33e54183640013c08aebdf2f',1,'Tgstation.Server.Api.Models.Internal.ChatBot.Name()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#aef98c54b24b4d1133ea761784699c360',1,'Tgstation.Server.Api.Models.Internal.User.Name()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html#aa3c25add23e8a5463468700cb5d3f8fe',1,'Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.Name()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.html#a639265f4892f69fac25fa32d7413fe75',1,'Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.Name()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command.html#aa9cbbf23975efc1dde048ee43a6e1d4b',1,'Tgstation.Server.Host.Components.Chat.Commands.ICommand.Name()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command.html#a310057ff5025763b3a208631f9f76daf',1,'Tgstation.Server.Host.Components.Chat.Commands.KekCommand.Name()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#a161ed3eee61c1cdb62fc5de7ba6e54b5',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.Name()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html#a12e4e89bc06dc6f44f953760a3bcf800',1,'Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.Name()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.html#a5c8f4bdfbf9054761790392222009914',1,'Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.Name()'],['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a82a1c35bb13819cd1003592351251fc1',1,'Tgstation.Server.Host.Service.ServerService.Name()']]], + ['nativemethods',['NativeMethods',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html',1,'Tgstation::Server::Host']]], + ['nativemethods_2ecs',['NativeMethods.cs',['../_native_methods_8cs.html',1,'']]], + ['networkpromptreaper',['networkPromptReaper',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#af4c3eca3b6ba03440f6f2397eeb2ccc3',1,'Tgstation.Server.Host.Components.InstanceFactory.networkPromptReaper()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#ad76b184848b0394fc53ab0299f87c213',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.networkPromptReaper()']]], + ['never',['Never',['../namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html#ac25a13ffb39d53803eca454f2a329fc1a6e7b34fa59e1bd229b207892956dc41c',1,'Tgstation::Server::Host::Configuration']]], + ['nevervalidated',['NeverValidated',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#af7163ca98f9f5e5c731043ecdace3745a48849e38346e47a569371c42b698fe36',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['newdmbavailable',['NewDmbAvailable',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#acb2ccc2dc05d01ec3a6448d3d57155c9aa2bd02c12bb4927940a72a240edf9707',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['newerdmbtcs',['newerDmbTcs',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#ae0b92673c1c6c9d1c56c33c5b7e242ee',1,'Tgstation::Server::Host::Components::Compiler::DmbFactory']]], + ['newtestmerges',['NewTestMerges',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html#a05bdec3c08f5acba28d9e72d70f38833',1,'Tgstation::Server::Api::Models::Repository']]], + ['newversion',['NewVersion',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_administration.html#ab40a1df200563a8351347145f50a8bc1',1,'Tgstation::Server::Api::Models::Administration']]], + ['nextaction',['NextAction',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_monitor_state.html#a87534d177a8fda685d068f47526b5bad',1,'Tgstation::Server::Host::Components::Watchdog::MonitorState']]], + ['nextdmbprovider',['nextDmbProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a26908afd23a086c22146b663c64d6526',1,'Tgstation::Server::Host::Components::Compiler::DmbFactory']]], + ['nextmessage',['NextMessage',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.html#ab6cd020395b652aa9d79c00497b739fb',1,'Tgstation.Server.Host.Components.Chat.Providers.IProvider.NextMessage()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#a962a3510e617d6754d8e21a237d4b933',1,'Tgstation.Server.Host.Components.Chat.Providers.Provider.NextMessage(CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#ac27feec8aca499fa963dd6f6b557b818',1,'Tgstation.Server.Host.Components.Chat.Providers.Provider.nextMessage()']]], + ['nextport',['nextPort',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#abb3e44b6490e277be6295ba31d1bd0c5',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['nickname',['Nickname',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#a95d8cce20205d05b7bfbda1d088af791',1,'Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Nickname()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a75457eda73c1935c8784dc7fadf9e0ba',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.nickname()']]], + ['nickserv',['NickServ',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a0a41c646f859c99d437373d8e6e0545ba1d351e780172667f7ac246f762907249',1,'Tgstation::Server::Api::Models']]], + ['none',['None',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#afecbde132584de6ed7e41c8c7535f556a6adf97f83acf6453d4a6a4b1070f3754',1,'Tgstation.Server.Host.NativeMethods.None()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#affda1440f9c5e2dfcca65138d2f89a21a6adf97f83acf6453d4a6a4b1070f3754',1,'Tgstation.Server.Api.Rights.None()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a2a217a19e652f117e2324fb79ed838b9a6adf97f83acf6453d4a6a4b1070f3754',1,'Tgstation.Server.Api.Rights.None()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72a6adf97f83acf6453d4a6a4b1070f3754',1,'Tgstation.Server.Api.Rights.None()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a691a59767073bc7dff0f17b809d07b0ca6adf97f83acf6453d4a6a4b1070f3754',1,'Tgstation.Server.Api.Rights.None()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49a6adf97f83acf6453d4a6a4b1070f3754',1,'Tgstation.Server.Api.Rights.None()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5da6adf97f83acf6453d4a6a4b1070f3754',1,'Tgstation.Server.Api.Rights.None()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79a6adf97f83acf6453d4a6a4b1070f3754',1,'Tgstation.Server.Api.Rights.None()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a5f1b5a9225190982810802d7a85bb601a6adf97f83acf6453d4a6a4b1070f3754',1,'Tgstation.Server.Api.Rights.None()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39a6adf97f83acf6453d4a6a4b1070f3754',1,'Tgstation.Server.Api.Rights.None()']]], + ['normal',['Normal',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a3b33ca95a6257e0c719adc7b54444ab8a960b44c579bc2f6818d2daaf9e4c16f0',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['normalizeanddelete',['NormalizeAndDelete',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#ab0629dee77100aa23cc5f7934efccdb7',1,'Tgstation::Server::Host::IO::DefaultIOManager']]], + ['normalizemention',['NormalizeMention',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#a8618deb5180b94f46015301982fa36a1',1,'Tgstation::Server::Host::Components::Chat::Providers::DiscordProvider']]], + ['normalizemodelpath',['NormalizeModelPath',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a8cb3dd699b719fbc0b8068ebafd56b3d',1,'Tgstation::Server::Host::Controllers::InstanceController']]], + ['notifyoffailedreattach',['NotifyOfFailedReattach',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a8b6f38ba84751a83a7db0a28ccef95ae',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['number',['Number',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters.html#aaa166ac91235805a6bf35558ca8eacb1',1,'Tgstation::Server::Api::Models::TestMergeParameters']]] +]; diff --git a/search/all_f.html b/search/all_f.html new file mode 100644 index 0000000000..f6997fa5fb --- /dev/null +++ b/search/all_f.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/all_f.js b/search/all_f.js new file mode 100644 index 0000000000..503fafaaf3 --- /dev/null +++ b/search/all_f.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['octokitexception',['OctokitException',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#aae91f209dda2b1d6a356a3cc3700750e',1,'Tgstation::Server::Host::Controllers::AdministrationController']]], + ['offline',['Offline',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a358f54d77ecd35adb4be872af559eb23a8d9da4bc0e49a50e09ac9f7e56789d39',1,'Tgstation::Server::Api::Models']]], + ['offlineinstance',['OfflineInstance',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.html#ad749e8ae302cb4f361be8e6641d8504f',1,'Tgstation.Server.Host.Components.IInstanceManager.OfflineInstance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a77615fe1970391e6ebe643dc3033156f',1,'Tgstation.Server.Host.Components.InstanceManager.OfflineInstance()']]], + ['onactionexecutionasync',['OnActionExecutionAsync',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#ae6314cf236db98c1e453639df84e8242',1,'Tgstation::Server::Host::Controllers::ApiController']]], + ['onconfiguring',['OnConfiguring',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_my_sql_database_context.html#a3ce3ce4b82076cf1ad9f4b8e486890bf',1,'Tgstation.Server.Host.Models.MySqlDatabaseContext.OnConfiguring()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context.html#ab675eb66a3bd5177c3b40eafaf041e9a',1,'Tgstation.Server.Host.Models.SqlServerDatabaseContext.OnConfiguring()']]], + ['ondispose',['onDispose',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#a922e38ea308976fd36f9f6d7e73ece41',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext.onDispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#a5335130518633dacf3bc1c9da0608bb9',1,'Tgstation.Server.Host.Components.Compiler.DmbProvider.onDispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#af2a69a0a07eff91257bace7640a3df8e',1,'Tgstation.Server.Host.Components.Repository.Repository.onDispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration.html#a7db0cb09e48b12745868127e77dba1d0',1,'Tgstation.Server.Host.Core.RestartRegistration.onDispose()']]], + ['onexecuteasync',['OnExecuteAsync',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html#a86d24d735c64eb7c67a935b809927dd4',1,'Tgstation::Server::Host::Service::Program']]], + ['online',['Online',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html#a6f024aa440adbecbd80b053eb57badc2',1,'Tgstation.Server.Api.Models.Instance.Online()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a358f54d77ecd35adb4be872af559eb23a54f664c70c22054ea0d8d26fc3997ce7',1,'Tgstation.Server.Api.Models.Online()']]], + ['onlineinstance',['OnlineInstance',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.html#af016d9fc2c80b6b2849540f2cd1ddfda',1,'Tgstation.Server.Host.Components.IInstanceManager.OnlineInstance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a00b4178d67ebc7ac4b0e3fe87484df15',1,'Tgstation.Server.Host.Components.InstanceManager.OnlineInstance()']]], + ['only',['Only',['../namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html#ac25a13ffb39d53803eca454f2a329fc1a8392461cf759088854e16710b9b75d1a',1,'Tgstation::Server::Host::Configuration']]], + ['onmodelcreating',['OnModelCreating',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#abe2f492adf2ca108188e6f14a3c8c512',1,'Tgstation::Server::Host::Models::DatabaseContext']]], + ['onnewerdmb',['OnNewerDmb',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a9180ff90fc4bd8a3cc8821bbb7780b48',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.OnNewerDmb()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory.html#a02ce5ba5c1863e5b2ee6e8e92245c1da',1,'Tgstation.Server.Host.Components.Compiler.IDmbFactory.OnNewerDmb()']]], + ['onreboot',['OnReboot',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a310e26682626017eb2b5001089357c76',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.OnReboot()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#aa22611bb1515c92112cb88c1fd2a346b',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.OnReboot()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#ac4495210a6e09f9232428329fb1e3839',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.OnReboot()']]], + ['onstart',['OnStart',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a40bef17d85eb30f2cbad7ed81ef9c774',1,'Tgstation::Server::Host::Service::ServerService']]], + ['onstop',['OnStop',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a6e54a00e5d8fc3f0629277f2bb7274ba',1,'Tgstation::Server::Host::Service::ServerService']]], + ['openwritestream',['OpenWriteStream',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a888245bfe6d20d98807cec9257289a03',1,'Tgstation::Server::Host::IO::DefaultIOManager']]], + ['origin',['Origin',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html#aa1c6aea021c1b615a36ebfc18c341bf7',1,'Tgstation.Server.Api.Models.Repository.Origin()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#ad8e2dda20f93df7994dd3ffc903c6531',1,'Tgstation.Server.Host.Components.Repository.IRepository.Origin()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a4885e47a21a11d7fdf1f2071f7cfbb0a',1,'Tgstation.Server.Host.Components.Repository.Repository.Origin()']]], + ['origincommitsha',['OriginCommitSha',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_revision_information.html#a5641d5a687d99b092d97c1dab39b6cc6',1,'Tgstation::Server::Api::Models::Internal::RevisionInformation']]], + ['origintrackingerrortemplate',['OriginTrackingErrorTemplate',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a160b164a1b668c2951ac4cff5db5205b',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['output',['Output',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_compile_job.html#a0dae39cbd8a16db72bccf3e7e3488fc3',1,'Tgstation::Server::Api::Models::Internal::CompileJob']]], + ['outputstringbuilder',['outputStringBuilder',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#af8517923bfe227ca085cb98d821565e8',1,'Tgstation::Server::Host::Core::Process']]] +]; diff --git a/search/classes_0.html b/search/classes_0.html new file mode 100644 index 0000000000..b3c6ec6af3 --- /dev/null +++ b/search/classes_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_0.js b/search/classes_0.js new file mode 100644 index 0000000000..50d4e9b0c6 --- /dev/null +++ b/search/classes_0.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['administration',['Administration',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_administration.html',1,'Tgstation::Server::Api::Models']]], + ['administrationclient',['AdministrationClient',['../class_tgstation_1_1_server_1_1_client_1_1_administration_client.html',1,'Tgstation::Server::Client']]], + ['administrationcontroller',['AdministrationController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['administrationtest',['AdministrationTest',['../class_tgstation_1_1_server_1_1_tests_1_1_administration_test.html',1,'Tgstation::Server::Tests']]], + ['apiclient',['ApiClient',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html',1,'Tgstation::Server::Client']]], + ['apiclientfactory',['ApiClientFactory',['../class_tgstation_1_1_server_1_1_client_1_1_api_client_factory.html',1,'Tgstation::Server::Client']]], + ['apiconflictexception',['ApiConflictException',['../class_tgstation_1_1_server_1_1_client_1_1_api_conflict_exception.html',1,'Tgstation::Server::Client']]], + ['apicontroller',['ApiController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['apiheaders',['ApiHeaders',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html',1,'Tgstation::Server::Api']]], + ['apimismatchexception',['ApiMismatchException',['../class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception.html',1,'Tgstation::Server::Client']]], + ['application',['Application',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html',1,'Tgstation::Server::Host::Core']]], + ['applicationbuilderextensions',['ApplicationBuilderExtensions',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application_builder_extensions.html',1,'Tgstation::Server::Host::Core']]], + ['asyncdelayer',['AsyncDelayer',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_async_delayer.html',1,'Tgstation::Server::Host::Core']]], + ['authenticationcontext',['AuthenticationContext',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html',1,'Tgstation::Server::Host::Security']]], + ['authenticationcontextfactory',['AuthenticationContextFactory',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html',1,'Tgstation::Server::Host::Security']]], + ['authorizeattribute',['AuthorizeAttribute',['../class_authorize_attribute.html',1,'']]], + ['autogeneratedprogram',['AutoGeneratedProgram',['../class_auto_generated_program.html',1,'']]] +]; diff --git a/search/classes_1.html b/search/classes_1.html new file mode 100644 index 0000000000..b744c4d15f --- /dev/null +++ b/search/classes_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_1.js b/search/classes_1.js new file mode 100644 index 0000000000..41b0b56e96 --- /dev/null +++ b/search/classes_1.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['badconfig1',['BadConfig1',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config1.html',1,'Tgstation::Server::Host::Core::Tests::TestServiceCollectionExtensions']]], + ['badconfig2',['BadConfig2',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config2.html',1,'Tgstation::Server::Host::Core::Tests::TestServiceCollectionExtensions']]], + ['badconfig3',['BadConfig3',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config3.html',1,'Tgstation::Server::Host::Core::Tests::TestServiceCollectionExtensions']]], + ['basicwatchdog',['BasicWatchdog',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['boolconverter',['BoolConverter',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_bool_converter.html',1,'Tgstation::Server::Host::Components::Chat::Commands']]], + ['byond',['Byond',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_byond.html',1,'Tgstation::Server::Api::Models']]], + ['byondclient',['ByondClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html',1,'Tgstation::Server::Client::Components']]], + ['byondcommand',['ByondCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html',1,'Tgstation::Server::Host::Components::Chat::Commands']]], + ['byondcontroller',['ByondController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['byondexecutablelock',['ByondExecutableLock',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.html',1,'Tgstation::Server::Host::Components::Byond']]], + ['byondmanager',['ByondManager',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html',1,'Tgstation::Server::Host::Components::Byond']]], + ['byondtest',['ByondTest',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html',1,'Tgstation::Server::Tests::Instance']]] +]; diff --git a/search/classes_10.html b/search/classes_10.html new file mode 100644 index 0000000000..2690032717 --- /dev/null +++ b/search/classes_10.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_10.js b/search/classes_10.js new file mode 100644 index 0000000000..f7bcec22c9 --- /dev/null +++ b/search/classes_10.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['semaphoreslimcontext',['SemaphoreSlimContext',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html',1,'Tgstation::Server::Host::Core']]], + ['server',['Server',['../class_tgstation_1_1_server_1_1_host_1_1_server.html',1,'Tgstation::Server::Host']]], + ['serverclient',['ServerClient',['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html',1,'Tgstation::Server::Client']]], + ['serverclientfactory',['ServerClientFactory',['../class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.html',1,'Tgstation::Server::Client']]], + ['servererrorexception',['ServerErrorException',['../class_tgstation_1_1_server_1_1_client_1_1_server_error_exception.html',1,'Tgstation::Server::Client']]], + ['serverfactory',['ServerFactory',['../class_tgstation_1_1_server_1_1_host_1_1_server_factory.html',1,'Tgstation::Server::Host']]], + ['serverinformation',['ServerInformation',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_server_information.html',1,'Tgstation::Server::Api::Models']]], + ['serverservice',['ServerService',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html',1,'Tgstation::Server::Host::Service']]], + ['serversidemodifications',['ServerSideModifications',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_server_side_modifications.html',1,'Tgstation::Server::Host::Components::StaticFiles']]], + ['servicebase',['ServiceBase',['../class_service_base.html',1,'']]], + ['servicecollectionextensions',['ServiceCollectionExtensions',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_service_collection_extensions.html',1,'Tgstation::Server::Host::Core']]], + ['serviceunavailableexception',['ServiceUnavailableException',['../class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception.html',1,'Tgstation::Server::Client']]], + ['sessioncontroller',['SessionController',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['sessioncontrollerfactory',['SessionControllerFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['setupwizard',['SetupWizard',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html',1,'Tgstation::Server::Host::Core']]], + ['sqlserverdatabasecontext',['SqlServerDatabaseContext',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context.html',1,'Tgstation::Server::Host::Models']]], + ['sqlserverdatabasecontextmodelsnapshot',['SqlServerDatabaseContextModelSnapshot',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_database_context_model_snapshot.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['sqlserverdesigntimedbcontextfactory',['SqlServerDesignTimeDbContextFactory',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_design_time_db_context_factory.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['synchronousiomanager',['SynchronousIOManager',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.html',1,'Tgstation::Server::Host::IO']]] +]; diff --git a/search/classes_11.html b/search/classes_11.html new file mode 100644 index 0000000000..e9f8eabba4 --- /dev/null +++ b/search/classes_11.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_11.js b/search/classes_11.js new file mode 100644 index 0000000000..0059dfcfdf --- /dev/null +++ b/search/classes_11.js @@ -0,0 +1,40 @@ +var searchData= +[ + ['taskextensions',['TaskExtensions',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_task_extensions.html',1,'Tgstation::Server::Host::Core']]], + ['temporarydmbprovider',['TemporaryDmbProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html',1,'Tgstation::Server::Host::Components::Compiler']]], + ['testapiclient',['TestApiClient',['../class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_api_client.html',1,'Tgstation::Server::Client::Tests']]], + ['testapiheaders',['TestApiHeaders',['../class_tgstation_1_1_server_1_1_api_1_1_tests_1_1_test_api_headers.html',1,'Tgstation::Server::Api::Tests']]], + ['testapplication',['TestApplication',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application.html',1,'Tgstation::Server::Host::Core::Tests']]], + ['testasyncdelayer',['TestAsyncDelayer',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_async_delayer.html',1,'Tgstation::Server::Host::Core::Tests']]], + ['testauthenticationcontext',['TestAuthenticationContext',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_tests_1_1_test_authentication_context.html',1,'Tgstation::Server::Host::Security::Tests']]], + ['testconsole',['TestConsole',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_console.html',1,'Tgstation::Server::Host::IO::Tests']]], + ['testdatabasecontextfactory',['TestDatabaseContextFactory',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_database_context_factory.html',1,'Tgstation::Server::Host::Core::Tests']]], + ['testdbconnectionfactory',['TestDBConnectionFactory',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_d_b_connection_factory.html',1,'Tgstation::Server::Host::Core::Tests']]], + ['testdiscordprovider',['TestDiscordProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests_1_1_test_discord_provider.html',1,'Tgstation::Server::Host::Components::Chat::Providers::Tests']]], + ['testdreamdaemonclient',['TestDreamDaemonClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests_1_1_test_dream_daemon_client.html',1,'Tgstation::Server::Client::Components::Tests']]], + ['testexperimentalwatchdog',['TestExperimentalWatchdog',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests_1_1_test_experimental_watchdog.html',1,'Tgstation::Server::Host::Components::Watchdog::Tests']]], + ['testgithubclientfactory',['TestGitHubClientFactory',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_git_hub_client_factory.html',1,'Tgstation::Server::Host::Core::Tests']]], + ['testingserver',['TestingServer',['../class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html',1,'Tgstation::Server::Tests']]], + ['testircconnectionstringbuilder',['TestIrcConnectionStringBuilder',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests_1_1_test_irc_connection_string_builder.html',1,'Tgstation::Server::Api::Models::Tests']]], + ['testjobexception',['TestJobException',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_exception.html',1,'Tgstation::Server::Host::Core::Tests']]], + ['testjobhandler',['TestJobHandler',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html',1,'Tgstation::Server::Host::Core::Tests']]], + ['testmerge',['TestMerge',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge.html',1,'Tgstation.Server.Host.Components.Interop.TestMerge'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge.html',1,'Tgstation.Server.Api.Models.Internal.TestMerge'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html',1,'Tgstation.Server.Host.Models.TestMerge'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge.html',1,'Tgstation.Server.Api.Models.TestMerge']]], + ['testmergebase',['TestMergeBase',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.html',1,'Tgstation::Server::Api::Models::Internal']]], + ['testmergeparameters',['TestMergeParameters',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters.html',1,'Tgstation::Server::Api::Models']]], + ['testplatformidentifier',['TestPlatformIdentifier',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_platform_identifier.html',1,'Tgstation::Server::Host::Core::Tests']]], + ['testposixbyondinstaller',['TestPosixByondInstaller',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests_1_1_test_posix_byond_installer.html',1,'Tgstation::Server::Host::Components::Byond::Tests']]], + ['testpostwritehandler',['TestPostWriteHandler',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_post_write_handler.html',1,'Tgstation::Server::Host::IO::Tests']]], + ['testprogram',['TestProgram',['../class_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests_1_1_test_program.html',1,'Tgstation::Server::Host::Console::Tests']]], + ['testrights',['TestRights',['../class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests_1_1_test_rights.html',1,'Tgstation::Server::Api::Rights::Tests']]], + ['testserverclientfactory',['TestServerClientFactory',['../class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_server_client_factory.html',1,'Tgstation::Server::Client::Tests']]], + ['testserverfactory',['TestServerFactory',['../class_tgstation_1_1_server_1_1_host_1_1_tests_1_1_test_server_factory.html',1,'Tgstation::Server::Host::Tests']]], + ['testserverservice',['TestServerService',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_tests_1_1_test_server_service.html',1,'Tgstation::Server::Host::Service::Tests']]], + ['testservicecollectionextensions',['TestServiceCollectionExtensions',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions.html',1,'Tgstation::Server::Host::Core::Tests']]], + ['testsetupwizard',['TestSetupWizard',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_setup_wizard.html',1,'Tgstation::Server::Host::Core::Tests']]], + ['testsymlinkfactory',['TestSymlinkFactory',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory.html',1,'Tgstation::Server::Host::IO::Tests']]], + ['testwatchdog',['TestWatchdog',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog.html',1,'Tgstation::Server::Host::Watchdog::Tests']]], + ['testwatchdogfactory',['TestWatchdogFactory',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog_factory.html',1,'Tgstation::Server::Host::Watchdog::Tests']]], + ['tgsauthorizeattribute',['TgsAuthorizeAttribute',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html',1,'Tgstation::Server::Host::Controllers']]], + ['token',['Token',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_token.html',1,'Tgstation::Server::Api::Models']]], + ['tokenfactory',['TokenFactory',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html',1,'Tgstation::Server::Host::Security']]] +]; diff --git a/search/classes_12.html b/search/classes_12.html new file mode 100644 index 0000000000..c20b926284 --- /dev/null +++ b/search/classes_12.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_12.js b/search/classes_12.js new file mode 100644 index 0000000000..ccb09364bd --- /dev/null +++ b/search/classes_12.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['unauthorizedexception',['UnauthorizedException',['../class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception.html',1,'Tgstation::Server::Client']]], + ['unrecognizedresponseexception',['UnrecognizedResponseException',['../class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html',1,'Tgstation::Server::Client']]], + ['updatesconfiguration',['UpdatesConfiguration',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html',1,'Tgstation::Server::Host::Configuration']]], + ['user',['User',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user.html',1,'Tgstation.Server.Host.Components.Chat.User'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html',1,'Tgstation.Server.Api.Models.Internal.User'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user.html',1,'Tgstation.Server.Api.Models.User'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html',1,'Tgstation.Server.Host.Models.User']]], + ['usercontroller',['UserController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['usersclient',['UsersClient',['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html',1,'Tgstation::Server::Client']]], + ['userupdate',['UserUpdate',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user_update.html',1,'Tgstation::Server::Api::Models']]] +]; diff --git a/search/classes_13.html b/search/classes_13.html new file mode 100644 index 0000000000..524085fe3c --- /dev/null +++ b/search/classes_13.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_13.js b/search/classes_13.js new file mode 100644 index 0000000000..f144efa300 --- /dev/null +++ b/search/classes_13.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['versioncommand',['VersionCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.html',1,'Tgstation::Server::Host::Components::Chat::Commands']]] +]; diff --git a/search/classes_14.html b/search/classes_14.html new file mode 100644 index 0000000000..8e2bfaff56 --- /dev/null +++ b/search/classes_14.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_14.js b/search/classes_14.js new file mode 100644 index 0000000000..896737289b --- /dev/null +++ b/search/classes_14.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['watchdog',['Watchdog',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html',1,'Tgstation::Server::Host::Watchdog']]], + ['watchdogbase',['WatchdogBase',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['watchdogfactory',['WatchdogFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory'],['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory.html',1,'Tgstation.Server.Host.Watchdog.WatchdogFactory']]], + ['watchdogreattachinformation',['WatchdogReattachInformation',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information.html',1,'Tgstation.Server.Host.Models.WatchdogReattachInformation'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information.html',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation']]], + ['watchdogreattachinformationbase',['WatchdogReattachInformationBase',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base.html',1,'Tgstation::Server::Host::Models']]], + ['windowsbyondinstaller',['WindowsByondInstaller',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html',1,'Tgstation::Server::Host::Components::Byond']]], + ['windowsnetworkpromptreaper',['WindowsNetworkPromptReaper',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['windowspostwritehandler',['WindowsPostWriteHandler',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_post_write_handler.html',1,'Tgstation::Server::Host::IO']]], + ['windowssymlinkfactory',['WindowsSymlinkFactory',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_symlink_factory.html',1,'Tgstation::Server::Host::IO']]], + ['windowssystemidentity',['WindowsSystemIdentity',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html',1,'Tgstation::Server::Host::Security']]], + ['windowssystemidentityfactory',['WindowsSystemIdentityFactory',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.html',1,'Tgstation::Server::Host::Security']]] +]; diff --git a/search/classes_2.html b/search/classes_2.html new file mode 100644 index 0000000000..7878acb4fe --- /dev/null +++ b/search/classes_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_2.js b/search/classes_2.js new file mode 100644 index 0000000000..bc278903a0 --- /dev/null +++ b/search/classes_2.js @@ -0,0 +1,32 @@ +var searchData= +[ + ['channel',['Channel',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['channelmapping',['ChannelMapping',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['chat',['Chat',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['chatbot',['ChatBot',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_bot.html',1,'Tgstation.Server.Api.Models.ChatBot'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html',1,'Tgstation.Server.Api.Models.Internal.ChatBot'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.html',1,'Tgstation.Server.Host.Models.ChatBot']]], + ['chatbotsclient',['ChatBotsClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html',1,'Tgstation::Server::Client::Components']]], + ['chatchannel',['ChatChannel',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html',1,'Tgstation.Server.Api.Models.ChatChannel'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.html',1,'Tgstation.Server.Host.Models.ChatChannel']]], + ['chatcommand',['ChatCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_command.html',1,'Tgstation::Server::Host::Components::Interop']]], + ['chatconnectionstringbuilder',['ChatConnectionStringBuilder',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_connection_string_builder.html',1,'Tgstation::Server::Api::Models::Internal']]], + ['chatcontroller',['ChatController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['chatfactory',['ChatFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['claimsinjector',['ClaimsInjector',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_claims_injector.html',1,'Tgstation::Server::Host::Security']]], + ['clientexception',['ClientException',['../class_tgstation_1_1_server_1_1_client_1_1_client_exception.html',1,'Tgstation::Server::Client']]], + ['commandfactory',['CommandFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html',1,'Tgstation::Server::Host::Components::Chat::Commands']]], + ['commcommand',['CommCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_command.html',1,'Tgstation::Server::Host::Components::Interop']]], + ['commcontext',['CommContext',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html',1,'Tgstation::Server::Host::Components::Interop']]], + ['compilejob',['CompileJob',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_compile_job.html',1,'Tgstation.Server.Api.Models.Internal.CompileJob'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job.html',1,'Tgstation.Server.Api.Models.CompileJob'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.html',1,'Tgstation.Server.Host.Models.CompileJob']]], + ['configuration',['Configuration',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html',1,'Tgstation::Server::Host::Components::StaticFiles']]], + ['configurationclient',['ConfigurationClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html',1,'Tgstation::Server::Client::Components']]], + ['configurationcontroller',['ConfigurationController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['configurationfile',['ConfigurationFile',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html',1,'Tgstation::Server::Api::Models']]], + ['configurationtest',['ConfigurationTest',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test.html',1,'Tgstation::Server::Tests::Instance']]], + ['conflictexception',['ConflictException',['../class_tgstation_1_1_server_1_1_client_1_1_conflict_exception.html',1,'Tgstation::Server::Client']]], + ['console',['Console',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.html',1,'Tgstation::Server::Host::IO']]], + ['constants',['Constants',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html',1,'Tgstation::Server::Host::Components::Interop']]], + ['controller',['Controller',['../class_controller.html',1,'']]], + ['controlpanelconfiguration',['ControlPanelConfiguration',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_control_panel_configuration.html',1,'Tgstation::Server::Host::Configuration']]], + ['credentialsprovider',['CredentialsProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider.html',1,'Tgstation::Server::Host::Components::Repository']]], + ['cryptographysuite',['CryptographySuite',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html',1,'Tgstation::Server::Host::Security']]], + ['customcommand',['CustomCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.html',1,'Tgstation::Server::Host::Components::Chat::Commands']]] +]; diff --git a/search/classes_3.html b/search/classes_3.html new file mode 100644 index 0000000000..c231d86f0f --- /dev/null +++ b/search/classes_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_3.js b/search/classes_3.js new file mode 100644 index 0000000000..96c4edf764 --- /dev/null +++ b/search/classes_3.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['databaseconfiguration',['DatabaseConfiguration',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html',1,'Tgstation::Server::Host::Configuration']]], + ['databasecontext',['DatabaseContext',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html',1,'Tgstation::Server::Host::Models']]], + ['databasecontext_3c_20mysqldatabasecontext_20_3e',['DatabaseContext< MySqlDatabaseContext >',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html',1,'Tgstation::Server::Host::Models']]], + ['databasecontext_3c_20sqlserverdatabasecontext_20_3e',['DatabaseContext< SqlServerDatabaseContext >',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html',1,'Tgstation::Server::Host::Models']]], + ['databasecontextfactory',['DatabaseContextFactory',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_database_context_factory.html',1,'Tgstation::Server::Host::Core']]], + ['databaseseeder',['DatabaseSeeder',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder.html',1,'Tgstation::Server::Host::Models']]], + ['dbconnectionfactory',['DBConnectionFactory',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_d_b_connection_factory.html',1,'Tgstation::Server::Host::Core']]], + ['dbcontext',['DbContext',['../class_db_context.html',1,'']]], + ['deadsessioncontroller',['DeadSessionController',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['defaultiomanager',['DefaultIOManager',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html',1,'Tgstation::Server::Host::IO']]], + ['designtimedbcontextfactoryhelpers',['DesignTimeDbContextFactoryHelpers',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_design_time_db_context_factory_helpers.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['discordconnectionstringbuilder',['DiscordConnectionStringBuilder',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder.html',1,'Tgstation::Server::Api::Models']]], + ['discordprovider',['DiscordProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html',1,'Tgstation::Server::Host::Components::Chat::Providers']]], + ['dmbfactory',['DmbFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html',1,'Tgstation::Server::Host::Components::Compiler']]], + ['dmbprovider',['DmbProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html',1,'Tgstation::Server::Host::Components::Compiler']]], + ['dreamdaemon',['DreamDaemon',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html',1,'Tgstation::Server::Api::Models']]], + ['dreamdaemonclient',['DreamDaemonClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html',1,'Tgstation::Server::Client::Components']]], + ['dreamdaemoncontroller',['DreamDaemonController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['dreamdaemonlaunchparameters',['DreamDaemonLaunchParameters',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.html',1,'Tgstation::Server::Api::Models::Internal']]], + ['dreamdaemonsettings',['DreamDaemonSettings',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_settings.html',1,'Tgstation.Server.Api.Models.Internal.DreamDaemonSettings'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html',1,'Tgstation.Server.Host.Models.DreamDaemonSettings']]], + ['dreammaker',['DreamMaker',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker.html',1,'Tgstation.Server.Api.Models.DreamMaker'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker']]], + ['dreammakerclient',['DreamMakerClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html',1,'Tgstation::Server::Client::Components']]], + ['dreammakercontroller',['DreamMakerController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['dreammakersettings',['DreamMakerSettings',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html',1,'Tgstation::Server::Host::Models']]] +]; diff --git a/search/classes_4.html b/search/classes_4.html new file mode 100644 index 0000000000..86dd4384f5 --- /dev/null +++ b/search/classes_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_4.js b/search/classes_4.js new file mode 100644 index 0000000000..983489257c --- /dev/null +++ b/search/classes_4.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['errormessage',['ErrorMessage',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html',1,'Tgstation::Server::Api::Models']]], + ['eventconsumer',['EventConsumer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.html',1,'Tgstation::Server::Host::Components']]], + ['eventnotification',['EventNotification',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_event_notification.html',1,'Tgstation::Server::Host::Components::Interop']]], + ['experimentalwatchdog',['ExperimentalWatchdog',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html',1,'Tgstation::Server::Host::Components::Watchdog']]] +]; diff --git a/search/classes_5.html b/search/classes_5.html new file mode 100644 index 0000000000..7aaef4df31 --- /dev/null +++ b/search/classes_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_5.js b/search/classes_5.js new file mode 100644 index 0000000000..a5d6f35398 --- /dev/null +++ b/search/classes_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['fileloggingconfiguration',['FileLoggingConfiguration',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html',1,'Tgstation::Server::Host::Configuration']]] +]; diff --git a/search/classes_6.html b/search/classes_6.html new file mode 100644 index 0000000000..aad7834e86 --- /dev/null +++ b/search/classes_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_6.js b/search/classes_6.js new file mode 100644 index 0000000000..a2b744c99f --- /dev/null +++ b/search/classes_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generalconfiguration',['GeneralConfiguration',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html',1,'Tgstation::Server::Host::Configuration']]], + ['githubclientfactory',['GitHubClientFactory',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory.html',1,'Tgstation::Server::Host::Core']]], + ['goodconfig',['GoodConfig',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_good_config.html',1,'Tgstation::Server::Host::Core::Tests::TestServiceCollectionExtensions']]] +]; diff --git a/search/classes_7.html b/search/classes_7.html new file mode 100644 index 0000000000..794e3948f2 --- /dev/null +++ b/search/classes_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_7.js b/search/classes_7.js new file mode 100644 index 0000000000..6ee395916c --- /dev/null +++ b/search/classes_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['homecontroller',['HomeController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['httpclient',['HttpClient',['../class_tgstation_1_1_server_1_1_client_1_1_http_client.html',1,'Tgstation::Server::Client']]] +]; diff --git a/search/classes_8.html b/search/classes_8.html new file mode 100644 index 0000000000..1ba60c903b --- /dev/null +++ b/search/classes_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_8.js b/search/classes_8.js new file mode 100644 index 0000000000..108eb0472e --- /dev/null +++ b/search/classes_8.js @@ -0,0 +1,104 @@ +var searchData= +[ + ['iadministrationclient',['IAdministrationClient',['../interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client.html',1,'Tgstation::Server::Client']]], + ['iapiclient',['IApiClient',['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html',1,'Tgstation::Server::Client']]], + ['iapiclientfactory',['IApiClientFactory',['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client_factory.html',1,'Tgstation::Server::Client']]], + ['iapplication',['IApplication',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_application.html',1,'Tgstation::Server::Host::Core']]], + ['iapplicationlifetime',['IApplicationLifetime',['../class_i_application_lifetime.html',1,'']]], + ['iasyncdelayer',['IAsyncDelayer',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_async_delayer.html',1,'Tgstation::Server::Host::Core']]], + ['iauthenticationcontext',['IAuthenticationContext',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context.html',1,'Tgstation::Server::Host::Security']]], + ['iauthenticationcontextfactory',['IAuthenticationContextFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context_factory.html',1,'Tgstation::Server::Host::Security']]], + ['ibyondclient',['IByondClient',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client.html',1,'Tgstation::Server::Client::Components']]], + ['ibyondexecutablelock',['IByondExecutableLock',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock.html',1,'Tgstation::Server::Host::Components::Byond']]], + ['ibyondinstaller',['IByondInstaller',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.html',1,'Tgstation::Server::Host::Components::Byond']]], + ['ibyondmanager',['IByondManager',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_manager.html',1,'Tgstation::Server::Host::Components::Byond']]], + ['ichat',['IChat',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['ichatbotsclient',['IChatBotsClient',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html',1,'Tgstation::Server::Client::Components']]], + ['ichatfactory',['IChatFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat_factory.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['iclaimsinjector',['IClaimsInjector',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_claims_injector.html',1,'Tgstation::Server::Host::Security']]], + ['icommand',['ICommand',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command.html',1,'Tgstation::Server::Host::Components::Chat::Commands']]], + ['icommandfactory',['ICommandFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command_factory.html',1,'Tgstation::Server::Host::Components::Chat::Commands']]], + ['icommcontext',['ICommContext',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_context.html',1,'Tgstation::Server::Host::Components::Interop']]], + ['icommhandler',['ICommHandler',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_handler.html',1,'Tgstation::Server::Host::Components::Interop']]], + ['icompilejobconsumer',['ICompileJobConsumer',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_compile_job_consumer.html',1,'Tgstation::Server::Host::Components::Compiler']]], + ['iconfiguration',['IConfiguration',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.html',1,'Tgstation::Server::Host::Components::StaticFiles']]], + ['iconfigurationclient',['IConfigurationClient',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.html',1,'Tgstation::Server::Client::Components']]], + ['iconsole',['IConsole',['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console.html',1,'Tgstation::Server::Host::IO']]], + ['icredentialsprovider',['ICredentialsProvider',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_credentials_provider.html',1,'Tgstation::Server::Host::Components::Repository']]], + ['icryptographysuite',['ICryptographySuite',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_cryptography_suite.html',1,'Tgstation::Server::Host::Security']]], + ['icustomcommandhandler',['ICustomCommandHandler',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_custom_command_handler.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['idatabasecontext',['IDatabaseContext',['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html',1,'Tgstation::Server::Host::Models']]], + ['idatabasecontextfactory',['IDatabaseContextFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_database_context_factory.html',1,'Tgstation::Server::Host::Core']]], + ['idatabaseseeder',['IDatabaseSeeder',['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_seeder.html',1,'Tgstation::Server::Host::Models']]], + ['idbconnectionfactory',['IDBConnectionFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_d_b_connection_factory.html',1,'Tgstation::Server::Host::Core']]], + ['identitycache',['IdentityCache',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html',1,'Tgstation::Server::Host::Security']]], + ['identitycacheobject',['IdentityCacheObject',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.html',1,'Tgstation::Server::Host::Security']]], + ['idesigntimedbcontextfactory',['IDesignTimeDbContextFactory',['../class_i_design_time_db_context_factory.html',1,'']]], + ['idisposable',['IDisposable',['../class_i_disposable.html',1,'']]], + ['idmbfactory',['IDmbFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory.html',1,'Tgstation::Server::Host::Components::Compiler']]], + ['idmbprovider',['IDmbProvider',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.html',1,'Tgstation::Server::Host::Components']]], + ['idreamdaemonclient',['IDreamDaemonClient',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html',1,'Tgstation::Server::Client::Components']]], + ['idreammaker',['IDreamMaker',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dream_maker.html',1,'Tgstation::Server::Host::Components::Compiler']]], + ['idreammakerclient',['IDreamMakerClient',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html',1,'Tgstation::Server::Client::Components']]], + ['ieventconsumer',['IEventConsumer',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_event_consumer.html',1,'Tgstation::Server::Host::Components']]], + ['igithubclientfactory',['IGitHubClientFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_git_hub_client_factory.html',1,'Tgstation::Server::Host::Core']]], + ['ihostedservice',['IHostedService',['../class_i_hosted_service.html',1,'']]], + ['ihttpclient',['IHttpClient',['../interface_tgstation_1_1_server_1_1_client_1_1_i_http_client.html',1,'Tgstation::Server::Client']]], + ['iidentitycache',['IIdentityCache',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_identity_cache.html',1,'Tgstation::Server::Host::Security']]], + ['iinstance',['IInstance',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html',1,'Tgstation::Server::Host::Components']]], + ['iinstanceclient',['IInstanceClient',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html',1,'Tgstation::Server::Client::Components']]], + ['iinstancefactory',['IInstanceFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_factory.html',1,'Tgstation::Server::Host::Components']]], + ['iinstancemanager',['IInstanceManager',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.html',1,'Tgstation::Server::Host::Components']]], + ['iinstancemanagerclient',['IInstanceManagerClient',['../interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html',1,'Tgstation::Server::Client']]], + ['iinstanceuserclient',['IInstanceUserClient',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html',1,'Tgstation::Server::Client::Components']]], + ['iiomanager',['IIOManager',['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html',1,'Tgstation::Server::Host::IO']]], + ['ijobmanager',['IJobManager',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager.html',1,'Tgstation::Server::Host::Core']]], + ['ijobsclient',['IJobsClient',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client.html',1,'Tgstation::Server::Client::Components']]], + ['ijsontrackingcontext',['IJsonTrackingContext',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_json_tracking_context.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['inetworkpromptreaper',['INetworkPromptReaper',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_network_prompt_reaper.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['instance',['Instance',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html',1,'Tgstation.Server.Host.Components.Instance'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html',1,'Tgstation.Server.Api.Models.Instance'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html',1,'Tgstation.Server.Host.Models.Instance']]], + ['instanceclient',['InstanceClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html',1,'Tgstation::Server::Client::Components']]], + ['instancecontroller',['InstanceController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['instancefactory',['InstanceFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html',1,'Tgstation::Server::Host::Components']]], + ['instancemanager',['InstanceManager',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html',1,'Tgstation::Server::Host::Components']]], + ['instancemanagerclient',['InstanceManagerClient',['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html',1,'Tgstation::Server::Client']]], + ['instancemanagertest',['InstanceManagerTest',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test.html',1,'Tgstation::Server::Tests']]], + ['instancetest',['InstanceTest',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_instance_test.html',1,'Tgstation::Server::Tests::Instance']]], + ['instanceuser',['InstanceUser',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html',1,'Tgstation.Server.Api.Models.InstanceUser'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.html',1,'Tgstation.Server.Host.Models.InstanceUser']]], + ['instanceuserclient',['InstanceUserClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html',1,'Tgstation::Server::Client::Components']]], + ['instanceusercontroller',['InstanceUserController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['insufficientpermissionsexception',['InsufficientPermissionsException',['../class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception.html',1,'Tgstation::Server::Client']]], + ['integrationtest',['IntegrationTest',['../class_tgstation_1_1_server_1_1_tests_1_1_integration_test.html',1,'Tgstation::Server::Tests']]], + ['iplatformidentifier',['IPlatformIdentifier',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_platform_identifier.html',1,'Tgstation::Server::Host::Core']]], + ['ipostwritehandler',['IPostWriteHandler',['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_post_write_handler.html',1,'Tgstation::Server::Host::IO']]], + ['iprocess',['IProcess',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.html',1,'Tgstation::Server::Host::Core']]], + ['iprocessbase',['IProcessBase',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_base.html',1,'Tgstation::Server::Host::Core']]], + ['iprocessexecutor',['IProcessExecutor',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_executor.html',1,'Tgstation::Server::Host::Core']]], + ['iprovider',['IProvider',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.html',1,'Tgstation::Server::Host::Components::Chat::Providers']]], + ['iproviderfactory',['IProviderFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_provider_factory.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['ircconnectionstringbuilder',['IrcConnectionStringBuilder',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html',1,'Tgstation::Server::Api::Models']]], + ['ircprovider',['IrcProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html',1,'Tgstation::Server::Host::Components::Chat::Providers']]], + ['ireattachinfohandler',['IReattachInfoHandler',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_reattach_info_handler.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['irepository',['IRepository',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html',1,'Tgstation::Server::Host::Components::Repository']]], + ['irepositoryclient',['IRepositoryClient',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.html',1,'Tgstation::Server::Client::Components']]], + ['irepositorymanager',['IRepositoryManager',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository_manager.html',1,'Tgstation::Server::Host::Components::Repository']]], + ['irequestlogger',['IRequestLogger',['../interface_tgstation_1_1_server_1_1_client_1_1_i_request_logger.html',1,'Tgstation::Server::Client']]], + ['irestarthandler',['IRestartHandler',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_handler.html',1,'Tgstation::Server::Host::Core']]], + ['irestartregistration',['IRestartRegistration',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_registration.html',1,'Tgstation::Server::Host::Core']]], + ['iserver',['IServer',['../interface_tgstation_1_1_server_1_1_host_1_1_i_server.html',1,'Tgstation::Server::Host']]], + ['iserverclient',['IServerClient',['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html',1,'Tgstation::Server::Client']]], + ['iserverclientfactory',['IServerClientFactory',['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client_factory.html',1,'Tgstation::Server::Client']]], + ['iservercontrol',['IServerControl',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control.html',1,'Tgstation::Server::Host::Core']]], + ['iserverfactory',['IServerFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_i_server_factory.html',1,'Tgstation::Server::Host']]], + ['isessioncontroller',['ISessionController',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['isessioncontrollerfactory',['ISessionControllerFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller_factory.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['isetupwizard',['ISetupWizard',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_setup_wizard.html',1,'Tgstation::Server::Host::Core']]], + ['isymlinkfactory',['ISymlinkFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_symlink_factory.html',1,'Tgstation::Server::Host::IO']]], + ['isynchronousiomanager',['ISynchronousIOManager',['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.html',1,'Tgstation::Server::Host::IO']]], + ['isystemidentity',['ISystemIdentity',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity.html',1,'Tgstation::Server::Host::Security']]], + ['isystemidentityfactory',['ISystemIdentityFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity_factory.html',1,'Tgstation::Server::Host::Security']]], + ['itokenfactory',['ITokenFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_token_factory.html',1,'Tgstation::Server::Host::Security']]], + ['iusersclient',['IUsersClient',['../interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.html',1,'Tgstation::Server::Client']]], + ['iwatchdog',['IWatchdog',['../interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog.html',1,'Tgstation.Server.Host.Watchdog.IWatchdog'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog']]], + ['iwatchdogfactory',['IWatchdogFactory',['../interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog_factory.html',1,'Tgstation.Server.Host.Watchdog.IWatchdogFactory'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog_factory.html',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdogFactory']]] +]; diff --git a/search/classes_9.html b/search/classes_9.html new file mode 100644 index 0000000000..565e7d7a06 --- /dev/null +++ b/search/classes_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_9.js b/search/classes_9.js new file mode 100644 index 0000000000..db8792015f --- /dev/null +++ b/search/classes_9.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['job',['Job',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html',1,'Tgstation.Server.Api.Models.Internal.Job'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job.html',1,'Tgstation.Server.Api.Models.Job'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html',1,'Tgstation.Server.Host.Models.Job']]], + ['jobcontroller',['JobController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['jobexception',['JobException',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_exception.html',1,'Tgstation::Server::Host::Core']]], + ['jobhandler',['JobHandler',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html',1,'Tgstation::Server::Host::Core']]], + ['jobmanager',['JobManager',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html',1,'Tgstation::Server::Host::Core']]], + ['jobsclient',['JobsClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html',1,'Tgstation::Server::Client::Components']]], + ['jsonconverter',['JsonConverter',['../class_json_converter.html',1,'']]], + ['jsonfile',['JsonFile',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html',1,'Tgstation::Server::Host::Components::Interop']]], + ['jsonsubfilelist',['JsonSubFileList',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list.html',1,'Tgstation::Server::Host::Components::Interop']]], + ['jsontrackingcontext',['JsonTrackingContext',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html',1,'Tgstation::Server::Host::Components::Chat']]] +]; diff --git a/search/classes_a.html b/search/classes_a.html new file mode 100644 index 0000000000..ca7479a3dd --- /dev/null +++ b/search/classes_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_a.js b/search/classes_a.js new file mode 100644 index 0000000000..35880fd548 --- /dev/null +++ b/search/classes_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['kekcommand',['KekCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command.html',1,'Tgstation::Server::Host::Components::Chat::Commands']]] +]; diff --git a/search/classes_b.html b/search/classes_b.html new file mode 100644 index 0000000000..ef84802062 --- /dev/null +++ b/search/classes_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_b.js b/search/classes_b.js new file mode 100644 index 0000000000..56a4a7d754 --- /dev/null +++ b/search/classes_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['launchresult',['LaunchResult',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_launch_result.html',1,'Tgstation::Server::Host::Components::Watchdog']]] +]; diff --git a/search/classes_c.html b/search/classes_c.html new file mode 100644 index 0000000000..052ea3c793 --- /dev/null +++ b/search/classes_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_c.js b/search/classes_c.js new file mode 100644 index 0000000000..2900dceb38 --- /dev/null +++ b/search/classes_c.js @@ -0,0 +1,37 @@ +var searchData= +[ + ['message',['Message',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_message.html',1,'Tgstation::Server::Host::Components::Chat::Providers']]], + ['methodnotsupportedexception',['MethodNotSupportedException',['../class_tgstation_1_1_server_1_1_client_1_1_method_not_supported_exception.html',1,'Tgstation::Server::Client']]], + ['migration',['Migration',['../class_migration.html',1,'']]], + ['mockapplicationlifetime',['MockApplicationLifetime',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime.html',1,'Tgstation::Server::Host::Core::Tests::TestApplication']]], + ['mocksetupwizard',['MockSetupWizard',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_setup_wizard.html',1,'Tgstation::Server::Host::Core::Tests::TestApplication']]], + ['modelcontroller',['ModelController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20administration_20_3e',['ModelController< Administration >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20api_2emodels_2ebyond_20_3e',['ModelController< Api.Models.Byond >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20api_2emodels_2echatbot_20_3e',['ModelController< Api.Models.ChatBot >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20api_2emodels_2einstance_20_3e',['ModelController< Api.Models.Instance >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20api_2emodels_2einstanceuser_20_3e',['ModelController< Api.Models.InstanceUser >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20api_2emodels_2ejob_20_3e',['ModelController< Api.Models.Job >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20configurationfile_20_3e',['ModelController< ConfigurationFile >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20dreamdaemon_20_3e',['ModelController< DreamDaemon >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20dreammaker_20_3e',['ModelController< DreamMaker >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20repository_20_3e',['ModelController< Repository >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelcontroller_3c_20userupdate_20_3e',['ModelController< UserUpdate >',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['modelsnapshot',['ModelSnapshot',['../class_model_snapshot.html',1,'']]], + ['monitorstate',['MonitorState',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_monitor_state.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['msaddminimumsecurity',['MSAddMinimumSecurity',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['msfixrevinfoindex',['MSFixRevInfoIndex',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_fix_rev_info_index.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['msinitialcreate',['MSInitialCreate',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['msnullableandforeignkeycleanup',['MSNullableAndForeignKeyCleanup',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['msreattachcompilejobrequired',['MSReattachCompileJobRequired',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['mstoggletestmergecomments',['MSToggleTestmergeComments',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['myaddminimumsecurity',['MYAddMinimumSecurity',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['myfixrevinfoindex',['MYFixRevInfoIndex',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_fix_rev_info_index.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['myinitialcreate',['MYInitialCreate',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['mynullableandforeignkeycleanup',['MYNullableAndForeignKeyCleanup',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['myreattachcompilejobrequired',['MYReattachCompileJobRequired',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['mysqldatabasecontext',['MySqlDatabaseContext',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_my_sql_database_context.html',1,'Tgstation::Server::Host::Models']]], + ['mysqldatabasecontextmodelsnapshot',['MySqlDatabaseContextModelSnapshot',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_database_context_model_snapshot.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['mysqldesigntimedbcontextfactory',['MySqlDesignTimeDbContextFactory',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_design_time_db_context_factory.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['mytoggletestmergecomments',['MYToggleTestmergeComments',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.html',1,'Tgstation::Server::Host::Models::Migrations']]] +]; diff --git a/search/classes_d.html b/search/classes_d.html new file mode 100644 index 0000000000..de68b5ab8d --- /dev/null +++ b/search/classes_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_d.js b/search/classes_d.js new file mode 100644 index 0000000000..8d2993eaab --- /dev/null +++ b/search/classes_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['nativemethods',['NativeMethods',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html',1,'Tgstation::Server::Host']]] +]; diff --git a/search/classes_e.html b/search/classes_e.html new file mode 100644 index 0000000000..4ba8b8292d --- /dev/null +++ b/search/classes_e.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_e.js b/search/classes_e.js new file mode 100644 index 0000000000..bac822552c --- /dev/null +++ b/search/classes_e.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['platformidentifier',['PlatformIdentifier',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_platform_identifier.html',1,'Tgstation::Server::Host::Core']]], + ['posixbyondinstaller',['PosixByondInstaller',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html',1,'Tgstation::Server::Host::Components::Byond']]], + ['posixnetworkpromptreaper',['PosixNetworkPromptReaper',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_posix_network_prompt_reaper.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['posixpostwritehandler',['PosixPostWriteHandler',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_post_write_handler.html',1,'Tgstation::Server::Host::IO']]], + ['posixsymlinkfactory',['PosixSymlinkFactory',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_symlink_factory.html',1,'Tgstation::Server::Host::IO']]], + ['posixsystemidentityfactory',['PosixSystemIdentityFactory',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_posix_system_identity_factory.html',1,'Tgstation::Server::Host::Security']]], + ['process',['Process',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html',1,'Tgstation::Server::Host::Core']]], + ['processexecutor',['ProcessExecutor',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html',1,'Tgstation::Server::Host::Core']]], + ['program',['Program',['../class_tgstation_1_1_server_1_1_host_1_1_console_1_1_program.html',1,'Tgstation.Server.Host.Console.Program'],['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html',1,'Tgstation.Server.Host.Service.Program'],['../class_tgstation_1_1_server_1_1_host_1_1_program.html',1,'Tgstation.Server.Host.Program'],['../class_release_notes_1_1_program.html',1,'ReleaseNotes.Program']]], + ['provider',['Provider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html',1,'Tgstation::Server::Host::Components::Chat::Providers']]], + ['providerfactory',['ProviderFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['pullrequestscommand',['PullRequestsCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html',1,'Tgstation::Server::Host::Components::Chat::Commands']]] +]; diff --git a/search/classes_f.html b/search/classes_f.html new file mode 100644 index 0000000000..e850497395 --- /dev/null +++ b/search/classes_f.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/classes_f.js b/search/classes_f.js new file mode 100644 index 0000000000..b11f0fb1e7 --- /dev/null +++ b/search/classes_f.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['ratelimitexception',['RateLimitException',['../class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception.html',1,'Tgstation::Server::Client']]], + ['reattachinfohandler',['ReattachInfoHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html',1,'Tgstation::Server::Host::Components']]], + ['reattachinformation',['ReattachInformation',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information.html',1,'Tgstation.Server.Host.Models.ReattachInformation'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_reattach_information.html',1,'Tgstation.Server.Host.Components.Watchdog.ReattachInformation']]], + ['reattachinformationbase',['ReattachInformationBase',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html',1,'Tgstation::Server::Host::Models']]], + ['repository',['Repository',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html',1,'Tgstation.Server.Api.Models.Repository'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html',1,'Tgstation.Server.Host.Components.Repository.Repository']]], + ['repositoryclient',['RepositoryClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html',1,'Tgstation::Server::Client::Components']]], + ['repositorycontroller',['RepositoryController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html',1,'Tgstation::Server::Host::Controllers']]], + ['repositorymanager',['RepositoryManager',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html',1,'Tgstation::Server::Host::Components::Repository']]], + ['repositorysettings',['RepositorySettings',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html',1,'Tgstation.Server.Host.Models.RepositorySettings'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html',1,'Tgstation.Server.Api.Models.Internal.RepositorySettings']]], + ['requesttimeoutexception',['RequestTimeoutException',['../class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception.html',1,'Tgstation::Server::Client']]], + ['resolvingiomanager',['ResolvingIOManager',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_resolving_i_o_manager.html',1,'Tgstation::Server::Host::IO']]], + ['response',['Response',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_response.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['restartregistration',['RestartRegistration',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration.html',1,'Tgstation::Server::Host::Core']]], + ['revinfotestmerge',['RevInfoTestMerge',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_rev_info_test_merge.html',1,'Tgstation::Server::Host::Models']]], + ['revisioncommand',['RevisionCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html',1,'Tgstation::Server::Host::Components::Chat::Commands']]], + ['revisioninformation',['RevisionInformation',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_revision_information.html',1,'Tgstation.Server.Api.Models.Internal.RevisionInformation'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information.html',1,'Tgstation.Server.Api.Models.RevisionInformation'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html',1,'Tgstation.Server.Host.Models.RevisionInformation']]], + ['rightshelper',['RightsHelper',['../class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper.html',1,'Tgstation::Server::Api::Rights']]], + ['routes',['Routes',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html',1,'Tgstation::Server::Api']]] +]; diff --git a/search/close.png b/search/close.png new file mode 100644 index 0000000000000000000000000000000000000000..9342d3dfeea7b7c4ee610987e717804b5a42ceb9 GIT binary patch literal 273 zcmV+s0q*{ZP)4(RlMby96)VwnbG{ zbe&}^BDn7x>$<{ck4zAK-=nT;=hHG)kmplIF${xqm8db3oX6wT3bvp`TE@m0cg;b) zBuSL}5?N7O(iZLdAlz@)b)Rd~DnSsSX&P5qC`XwuFwcAYLC+d2>+1(8on;wpt8QIC X2MT$R4iQDd00000NkvXXu0mjfia~GN literal 0 HcmV?d00001 diff --git a/search/enums_0.html b/search/enums_0.html new file mode 100644 index 0000000000..7040a9c5d4 --- /dev/null +++ b/search/enums_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enums_0.js b/search/enums_0.js new file mode 100644 index 0000000000..7a92a7d905 --- /dev/null +++ b/search/enums_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['administrationrights',['AdministrationRights',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#affda1440f9c5e2dfcca65138d2f89a21',1,'Tgstation::Server::Api::Rights']]], + ['apivalidationstatus',['ApiValidationStatus',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#af7163ca98f9f5e5c731043ecdace3745',1,'Tgstation::Server::Host::Components::Watchdog']]] +]; diff --git a/search/enums_1.html b/search/enums_1.html new file mode 100644 index 0000000000..0c65c0e09c --- /dev/null +++ b/search/enums_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enums_1.js b/search/enums_1.js new file mode 100644 index 0000000000..9807e0ce3b --- /dev/null +++ b/search/enums_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['byondrights',['ByondRights',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a2a217a19e652f117e2324fb79ed838b9',1,'Tgstation::Server::Api::Rights']]] +]; diff --git a/search/enums_2.html b/search/enums_2.html new file mode 100644 index 0000000000..4250446db5 --- /dev/null +++ b/search/enums_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enums_2.js b/search/enums_2.js new file mode 100644 index 0000000000..447d043518 --- /dev/null +++ b/search/enums_2.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['chatbotrights',['ChatBotRights',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72',1,'Tgstation::Server::Api::Rights']]], + ['chatprovider',['ChatProvider',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a2d962413bc23404156feea75066e39cc',1,'Tgstation::Server::Api::Models']]], + ['configurationrights',['ConfigurationRights',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a691a59767073bc7dff0f17b809d07b0c',1,'Tgstation::Server::Api::Rights']]], + ['configurationtype',['ConfigurationType',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ab7bc96f211e450615be8669d10de2440',1,'Tgstation::Server::Api::Models']]], + ['createsymboliclinkflags',['CreateSymbolicLinkFlags',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#afecbde132584de6ed7e41c8c7535f556',1,'Tgstation::Server::Host::NativeMethods']]] +]; diff --git a/search/enums_3.html b/search/enums_3.html new file mode 100644 index 0000000000..b118cca0ca --- /dev/null +++ b/search/enums_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enums_3.js b/search/enums_3.js new file mode 100644 index 0000000000..0dd5ce6e08 --- /dev/null +++ b/search/enums_3.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['databasetype',['DatabaseType',['../namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html#acda8f6ee23a9ee8ac298f7b4a7d5617c',1,'Tgstation::Server::Host::Configuration']]], + ['dreamdaemonrights',['DreamDaemonRights',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49',1,'Tgstation::Server::Api::Rights']]], + ['dreamdaemonsecurity',['DreamDaemonSecurity',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ad4850e6b78816679602b13d63d2869b5',1,'Tgstation::Server::Api::Models']]], + ['dreamdaemonstatus',['DreamDaemonStatus',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a358f54d77ecd35adb4be872af559eb23',1,'Tgstation::Server::Api::Models']]], + ['dreammakerrights',['DreamMakerRights',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5d',1,'Tgstation::Server::Api::Rights']]] +]; diff --git a/search/enums_4.html b/search/enums_4.html new file mode 100644 index 0000000000..2795d4b145 --- /dev/null +++ b/search/enums_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enums_4.js b/search/enums_4.js new file mode 100644 index 0000000000..075b026531 --- /dev/null +++ b/search/enums_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['eventtype',['EventType',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381',1,'Tgstation::Server::Host::Components']]] +]; diff --git a/search/enums_5.html b/search/enums_5.html new file mode 100644 index 0000000000..ab40bbd192 --- /dev/null +++ b/search/enums_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enums_5.js b/search/enums_5.js new file mode 100644 index 0000000000..46c0af05a3 --- /dev/null +++ b/search/enums_5.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['instancemanagerrights',['InstanceManagerRights',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79',1,'Tgstation::Server::Api::Rights']]], + ['instanceuserrights',['InstanceUserRights',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a5f1b5a9225190982810802d7a85bb601',1,'Tgstation::Server::Api::Rights']]], + ['ircpasswordtype',['IrcPasswordType',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a0a41c646f859c99d437373d8e6e0545b',1,'Tgstation::Server::Api::Models']]] +]; diff --git a/search/enums_6.html b/search/enums_6.html new file mode 100644 index 0000000000..f32ac36818 --- /dev/null +++ b/search/enums_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enums_6.js b/search/enums_6.js new file mode 100644 index 0000000000..f062c5d326 --- /dev/null +++ b/search/enums_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['monitoraction',['MonitorAction',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a97c1a4a168451bd7e3be23c467aa2812',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['monitoractivationreason',['MonitorActivationReason',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#acb2ccc2dc05d01ec3a6448d3d57155c9',1,'Tgstation::Server::Host::Components::Watchdog']]] +]; diff --git a/search/enums_7.html b/search/enums_7.html new file mode 100644 index 0000000000..7a25d59036 --- /dev/null +++ b/search/enums_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enums_7.js b/search/enums_7.js new file mode 100644 index 0000000000..1c1cbe8e45 --- /dev/null +++ b/search/enums_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['rebootstate',['RebootState',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a3b33ca95a6257e0c719adc7b54444ab8',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['repositoryrights',['RepositoryRights',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39',1,'Tgstation::Server::Api::Rights']]], + ['rightstype',['RightsType',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20',1,'Tgstation::Server::Api::Rights']]] +]; diff --git a/search/enums_8.html b/search/enums_8.html new file mode 100644 index 0000000000..03c3de22e2 --- /dev/null +++ b/search/enums_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enums_8.js b/search/enums_8.js new file mode 100644 index 0000000000..d7857ac6eb --- /dev/null +++ b/search/enums_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['setupwizardmode',['SetupWizardMode',['../namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html#ac25a13ffb39d53803eca454f2a329fc1',1,'Tgstation::Server::Host::Configuration']]] +]; diff --git a/search/enumvalues_0.html b/search/enumvalues_0.html new file mode 100644 index 0000000000..78895c79bc --- /dev/null +++ b/search/enumvalues_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enumvalues_0.js b/search/enumvalues_0.js new file mode 100644 index 0000000000..159bee7acb --- /dev/null +++ b/search/enumvalues_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['activelaunchparametersupdated',['ActiveLaunchParametersUpdated',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#acb2ccc2dc05d01ec3a6448d3d57155c9a5787c2f334905254452c2c362bf5874b',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['activeservercrashed',['ActiveServerCrashed',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#acb2ccc2dc05d01ec3a6448d3d57155c9ab92e148d2dd1c50669d594966a5ec6df',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['activeserverrebooted',['ActiveServerRebooted',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#acb2ccc2dc05d01ec3a6448d3d57155c9ab97165994c837a20e96ed22267cb1a86',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['administration',['Administration',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20a7258e7251413465e0a3eb58094430bde',1,'Tgstation::Server::Api::Rights']]], + ['allowunprivilegedcreate',['AllowUnprivilegedCreate',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#afecbde132584de6ed7e41c8c7535f556aa5039b48592e4eb0e0bcc4bebf94bdf8',1,'Tgstation::Server::Host::NativeMethods']]], + ['autodetect',['Autodetect',['../namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html#ac25a13ffb39d53803eca454f2a329fc1aa0f56afccfad0701bc1076f838655233',1,'Tgstation::Server::Host::Configuration']]] +]; diff --git a/search/enumvalues_1.html b/search/enumvalues_1.html new file mode 100644 index 0000000000..9b02a4b381 --- /dev/null +++ b/search/enumvalues_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enumvalues_1.js b/search/enumvalues_1.js new file mode 100644 index 0000000000..d4a11f2d95 --- /dev/null +++ b/search/enumvalues_1.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['badvalidationrequest',['BadValidationRequest',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#af7163ca98f9f5e5c731043ecdace3745a18d2471b9e1234b2d15002cbafa2adc2',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['break',['Break',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a97c1a4a168451bd7e3be23c467aa2812ae4c38d6d45baf080943d323dd51a2ce8',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['byond',['Byond',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20a2f4b44b678b37bcd3239cd83e64d0eb0',1,'Tgstation::Server::Api::Rights']]], + ['byondactiveversionchange',['ByondActiveVersionChange',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381a16551fe43323cca07bfc777afadbe5a1',1,'Tgstation::Server::Host::Components']]], + ['byondinstallfail',['ByondInstallFail',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381aa63abc793fbdf14cf7caf28a4812e682',1,'Tgstation::Server::Host::Components']]], + ['byondinstallstart',['ByondInstallStart',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381a93c1e81c6ae4a9cc3637be6b044211e9',1,'Tgstation::Server::Host::Components']]] +]; diff --git a/search/enumvalues_10.html b/search/enumvalues_10.html new file mode 100644 index 0000000000..bf46a654fb --- /dev/null +++ b/search/enumvalues_10.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enumvalues_10.js b/search/enumvalues_10.js new file mode 100644 index 0000000000..d3480a647b --- /dev/null +++ b/search/enumvalues_10.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['write',['Write',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a691a59767073bc7dff0f17b809d07b0ca1129c0e4d43f2d121652a7302712cff6',1,'Tgstation::Server::Api::Rights']]], + ['writechannels',['WriteChannels',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72a536002a3cc297a67dcee8ec692a569ec',1,'Tgstation::Server::Api::Rights']]], + ['writeconnectionstring',['WriteConnectionString',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72a58680118e47c510bac627f8b20e175a9',1,'Tgstation::Server::Api::Rights']]], + ['writeenabled',['WriteEnabled',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72a574b3ec8f9de787caa6f2fc04c8f9658',1,'Tgstation::Server::Api::Rights']]], + ['writename',['WriteName',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72ad70280daaa48077a6f4b46bad136e51a',1,'Tgstation::Server::Api::Rights']]], + ['writeprovider',['WriteProvider',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72a46417a8d9d6f4823667e403b90796186',1,'Tgstation::Server::Api::Rights']]], + ['writeusers',['WriteUsers',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#affda1440f9c5e2dfcca65138d2f89a21a6da2fa278de1516d65f3ebe77670f215',1,'Tgstation.Server.Api.Rights.WriteUsers()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a5f1b5a9225190982810802d7a85bb601a6da2fa278de1516d65f3ebe77670f215',1,'Tgstation.Server.Api.Rights.WriteUsers()']]] +]; diff --git a/search/enumvalues_2.html b/search/enumvalues_2.html new file mode 100644 index 0000000000..2482854d90 --- /dev/null +++ b/search/enumvalues_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enumvalues_2.js b/search/enumvalues_2.js new file mode 100644 index 0000000000..3a6b7d66e3 --- /dev/null +++ b/search/enumvalues_2.js @@ -0,0 +1,23 @@ +var searchData= +[ + ['cancelclone',['CancelClone',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39a8863765f0ecf9b3004e8051a28251d6a',1,'Tgstation::Server::Api::Rights']]], + ['cancelcompile',['CancelCompile',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5daadc2d374d8bb5ae840bbb0145868fc1f',1,'Tgstation::Server::Api::Rights']]], + ['cancelinstall',['CancelInstall',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a2a217a19e652f117e2324fb79ed838b9a9557127a4ed0a1726e4b32579364083b',1,'Tgstation::Server::Api::Rights']]], + ['cancelpendingchanges',['CancelPendingChanges',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39a84be61baa3a948e65891036fdaba4ab7',1,'Tgstation::Server::Api::Rights']]], + ['changeautoupdatesettings',['ChangeAutoUpdateSettings',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39a548b817c7c02c2f62dd3794933b0920c',1,'Tgstation::Server::Api::Rights']]], + ['changecommitter',['ChangeCommitter',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39abae6cf87a3261b8f904b3943525f3043',1,'Tgstation::Server::Api::Rights']]], + ['changecredentials',['ChangeCredentials',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39adbc2b36c5f0ed08b2f62378225d078d6',1,'Tgstation::Server::Api::Rights']]], + ['changetestmergecommits',['ChangeTestMergeCommits',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39a5ad384c7de5c2f6d816c4d652462625b',1,'Tgstation::Server::Api::Rights']]], + ['changeversion',['ChangeVersion',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#affda1440f9c5e2dfcca65138d2f89a21a55c267b42a4e2d36d46ff358ff822968',1,'Tgstation.Server.Api.Rights.ChangeVersion()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a2a217a19e652f117e2324fb79ed838b9a55c267b42a4e2d36d46ff358ff822968',1,'Tgstation.Server.Api.Rights.ChangeVersion()']]], + ['chatbots',['ChatBots',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20a11eee75253579a31252ca13f9a271873',1,'Tgstation::Server::Api::Rights']]], + ['compile',['Compile',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5da3de9387fc230ce74214446e58c4fefde',1,'Tgstation::Server::Api::Rights']]], + ['compilecancelled',['CompileCancelled',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381aac05aa67f7da74bd470018801530d560',1,'Tgstation::Server::Host::Components']]], + ['compilecomplete',['CompileComplete',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381a32558503790304b9e722550831898633',1,'Tgstation::Server::Host::Components']]], + ['compilefailure',['CompileFailure',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381aaef5e71e3b260e64d5349d6e04e7a0bd',1,'Tgstation::Server::Host::Components']]], + ['compilejobs',['CompileJobs',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5da7c63725727d75ca94b3b395198026acb',1,'Tgstation::Server::Api::Rights']]], + ['compilestart',['CompileStart',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381abec1242b376ffdd3ca51b65b2106e843',1,'Tgstation::Server::Host::Components']]], + ['configuration',['Configuration',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20a254f642527b45bc260048e30704edb39',1,'Tgstation::Server::Api::Rights']]], + ['continue',['Continue',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a97c1a4a168451bd7e3be23c467aa2812aa0bfb8e59e6c13fc8d990781f77694fe',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['create',['Create',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72a686e697538050e4664636337cc3b834f',1,'Tgstation.Server.Api.Rights.Create()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79a686e697538050e4664636337cc3b834f',1,'Tgstation.Server.Api.Rights.Create()']]], + ['createusers',['CreateUsers',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a5f1b5a9225190982810802d7a85bb601a90212f132b4b808fe81b7022759031d9',1,'Tgstation::Server::Api::Rights']]] +]; diff --git a/search/enumvalues_3.html b/search/enumvalues_3.html new file mode 100644 index 0000000000..e6124b9471 --- /dev/null +++ b/search/enumvalues_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enumvalues_3.js b/search/enumvalues_3.js new file mode 100644 index 0000000000..9d97f8f357 --- /dev/null +++ b/search/enumvalues_3.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['delete',['Delete',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72af2a6c498fb90ee345d997f888fce3b18',1,'Tgstation.Server.Api.Rights.Delete()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a691a59767073bc7dff0f17b809d07b0caf2a6c498fb90ee345d997f888fce3b18',1,'Tgstation.Server.Api.Rights.Delete()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79af2a6c498fb90ee345d997f888fce3b18',1,'Tgstation.Server.Api.Rights.Delete()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39af2a6c498fb90ee345d997f888fce3b18',1,'Tgstation.Server.Api.Rights.Delete()']]], + ['directory',['Directory',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#afecbde132584de6ed7e41c8c7535f556ae73cda510e8bb947f7e61089e5581494',1,'Tgstation::Server::Host::NativeMethods']]], + ['disallowed',['Disallowed',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ab7bc96f211e450615be8669d10de2440ade99ae8770699a4725a85853a0790d24',1,'Tgstation::Server::Api::Models']]], + ['discord',['Discord',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a2d962413bc23404156feea75066e39cca8f5cc6430613f1c12f36965050bb7197',1,'Tgstation::Server::Api::Models']]], + ['dreamdaemon',['DreamDaemon',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20a82a60e2400e19cffe6b38b295e10d4c8',1,'Tgstation::Server::Api::Rights']]], + ['dreammaker',['DreamMaker',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20af179dcd47770d7cc1eb149ee1a0d06af',1,'Tgstation::Server::Api::Rights']]] +]; diff --git a/search/enumvalues_4.html b/search/enumvalues_4.html new file mode 100644 index 0000000000..8d234cfc19 --- /dev/null +++ b/search/enumvalues_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enumvalues_4.js b/search/enumvalues_4.js new file mode 100644 index 0000000000..f8747b1739 --- /dev/null +++ b/search/enumvalues_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['editownpassword',['EditOwnPassword',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#affda1440f9c5e2dfcca65138d2f89a21a6ca04cb3c1c0f79210a1e67312debeb5',1,'Tgstation::Server::Api::Rights']]], + ['exit',['Exit',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a97c1a4a168451bd7e3be23c467aa2812afef46e5063ce3dc78b8ae64fa474241d',1,'Tgstation::Server::Host::Components::Watchdog']]] +]; diff --git a/search/enumvalues_5.html b/search/enumvalues_5.html new file mode 100644 index 0000000000..d16ee24bef --- /dev/null +++ b/search/enumvalues_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enumvalues_5.js b/search/enumvalues_5.js new file mode 100644 index 0000000000..a971e16f9e --- /dev/null +++ b/search/enumvalues_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['force',['Force',['../namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html#ac25a13ffb39d53803eca454f2a329fc1a9eb6b78a99cdb6ffd3d40d18621d9f80',1,'Tgstation::Server::Host::Configuration']]] +]; diff --git a/search/enumvalues_6.html b/search/enumvalues_6.html new file mode 100644 index 0000000000..c39f086580 --- /dev/null +++ b/search/enumvalues_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enumvalues_6.js b/search/enumvalues_6.js new file mode 100644 index 0000000000..aa7d763c96 --- /dev/null +++ b/search/enumvalues_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['hardrebooting',['HardRebooting',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a358f54d77ecd35adb4be872af559eb23a6f140364f9894a2f77258f7e81a74703',1,'Tgstation::Server::Api::Models']]], + ['hostwrite',['HostWrite',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ab7bc96f211e450615be8669d10de2440a509b9f909831ef70e6c1ec59a3b340e9',1,'Tgstation::Server::Api::Models']]] +]; diff --git a/search/enumvalues_7.html b/search/enumvalues_7.html new file mode 100644 index 0000000000..f75419fec0 --- /dev/null +++ b/search/enumvalues_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enumvalues_7.js b/search/enumvalues_7.js new file mode 100644 index 0000000000..560beb988d --- /dev/null +++ b/search/enumvalues_7.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['inactiveservercrashed',['InactiveServerCrashed',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#acb2ccc2dc05d01ec3a6448d3d57155c9a55fa500495cf8a547529c30f8d9c6ea5',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['inactiveserverrebooted',['InactiveServerRebooted',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#acb2ccc2dc05d01ec3a6448d3d57155c9a511bd67e833172fb4f9a30b92591235b',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['inactiveserverstartupcomplete',['InactiveServerStartupComplete',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#acb2ccc2dc05d01ec3a6448d3d57155c9afaf84ad86619c2ec86111febdc77b60a',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['instanceautoupdatestart',['InstanceAutoUpdateStart',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381aefc3f4c097e45227dcc2aee3aadc034f',1,'Tgstation::Server::Host::Components']]], + ['instancemanager',['InstanceManager',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20a7c77d4c45a003ee3d6b3589d2459cc49',1,'Tgstation::Server::Api::Rights']]], + ['instanceuser',['InstanceUser',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20a07665be2d43147f42c2e73e8e2a19655',1,'Tgstation::Server::Api::Rights']]], + ['irc',['Irc',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a2d962413bc23404156feea75066e39cca2b6446aa685b2e1260e9d6f60239e547',1,'Tgstation::Server::Api::Models']]] +]; diff --git a/search/enumvalues_8.html b/search/enumvalues_8.html new file mode 100644 index 0000000000..96b5b73e79 --- /dev/null +++ b/search/enumvalues_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enumvalues_8.js b/search/enumvalues_8.js new file mode 100644 index 0000000000..ec08f6013e --- /dev/null +++ b/search/enumvalues_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['list',['List',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a691a59767073bc7dff0f17b809d07b0ca4ee29ca12c7d126654bd0e5275de6135',1,'Tgstation.Server.Api.Rights.List()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79a4ee29ca12c7d126654bd0e5275de6135',1,'Tgstation.Server.Api.Rights.List()']]], + ['listinstalled',['ListInstalled',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a2a217a19e652f117e2324fb79ed838b9ad102ca284a1a9df653f41ec4c1b22a0b',1,'Tgstation::Server::Api::Rights']]] +]; diff --git a/search/enumvalues_9.html b/search/enumvalues_9.html new file mode 100644 index 0000000000..2e532f48f3 --- /dev/null +++ b/search/enumvalues_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enumvalues_9.js b/search/enumvalues_9.js new file mode 100644 index 0000000000..6ba9e37338 --- /dev/null +++ b/search/enumvalues_9.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['mariadb',['MariaDB',['../namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html#acda8f6ee23a9ee8ac298f7b4a7d5617ca7f9733e208088b1ce6df3d4be1765396',1,'Tgstation::Server::Host::Configuration']]], + ['mergepullrequest',['MergePullRequest',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39a38de88c6dfc8b8669a4ffbc35be88aa2',1,'Tgstation::Server::Api::Rights']]], + ['mysql',['MySql',['../namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html#acda8f6ee23a9ee8ac298f7b4a7d5617ca9df306f03daedccf83f5e2983dbb5422',1,'Tgstation::Server::Host::Configuration']]] +]; diff --git a/search/enumvalues_a.html b/search/enumvalues_a.html new file mode 100644 index 0000000000..848615891e --- /dev/null +++ b/search/enumvalues_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enumvalues_a.js b/search/enumvalues_a.js new file mode 100644 index 0000000000..669dfea845 --- /dev/null +++ b/search/enumvalues_a.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['never',['Never',['../namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html#ac25a13ffb39d53803eca454f2a329fc1a6e7b34fa59e1bd229b207892956dc41c',1,'Tgstation::Server::Host::Configuration']]], + ['nevervalidated',['NeverValidated',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#af7163ca98f9f5e5c731043ecdace3745a48849e38346e47a569371c42b698fe36',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['newdmbavailable',['NewDmbAvailable',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#acb2ccc2dc05d01ec3a6448d3d57155c9aa2bd02c12bb4927940a72a240edf9707',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['nickserv',['NickServ',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a0a41c646f859c99d437373d8e6e0545ba1d351e780172667f7ac246f762907249',1,'Tgstation::Server::Api::Models']]], + ['none',['None',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#afecbde132584de6ed7e41c8c7535f556a6adf97f83acf6453d4a6a4b1070f3754',1,'Tgstation.Server.Host.NativeMethods.None()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#affda1440f9c5e2dfcca65138d2f89a21a6adf97f83acf6453d4a6a4b1070f3754',1,'Tgstation.Server.Api.Rights.None()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a2a217a19e652f117e2324fb79ed838b9a6adf97f83acf6453d4a6a4b1070f3754',1,'Tgstation.Server.Api.Rights.None()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72a6adf97f83acf6453d4a6a4b1070f3754',1,'Tgstation.Server.Api.Rights.None()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a691a59767073bc7dff0f17b809d07b0ca6adf97f83acf6453d4a6a4b1070f3754',1,'Tgstation.Server.Api.Rights.None()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49a6adf97f83acf6453d4a6a4b1070f3754',1,'Tgstation.Server.Api.Rights.None()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5da6adf97f83acf6453d4a6a4b1070f3754',1,'Tgstation.Server.Api.Rights.None()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79a6adf97f83acf6453d4a6a4b1070f3754',1,'Tgstation.Server.Api.Rights.None()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a5f1b5a9225190982810802d7a85bb601a6adf97f83acf6453d4a6a4b1070f3754',1,'Tgstation.Server.Api.Rights.None()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39a6adf97f83acf6453d4a6a4b1070f3754',1,'Tgstation.Server.Api.Rights.None()']]], + ['normal',['Normal',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a3b33ca95a6257e0c719adc7b54444ab8a960b44c579bc2f6818d2daaf9e4c16f0',1,'Tgstation::Server::Host::Components::Watchdog']]] +]; diff --git a/search/enumvalues_b.html b/search/enumvalues_b.html new file mode 100644 index 0000000000..3ac456a6ef --- /dev/null +++ b/search/enumvalues_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enumvalues_b.js b/search/enumvalues_b.js new file mode 100644 index 0000000000..8d4f68c1c2 --- /dev/null +++ b/search/enumvalues_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['offline',['Offline',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a358f54d77ecd35adb4be872af559eb23a8d9da4bc0e49a50e09ac9f7e56789d39',1,'Tgstation::Server::Api::Models']]], + ['online',['Online',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a358f54d77ecd35adb4be872af559eb23a54f664c70c22054ea0d8d26fc3997ce7',1,'Tgstation::Server::Api::Models']]], + ['only',['Only',['../namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html#ac25a13ffb39d53803eca454f2a329fc1a8392461cf759088854e16710b9b75d1a',1,'Tgstation::Server::Host::Configuration']]] +]; diff --git a/search/enumvalues_c.html b/search/enumvalues_c.html new file mode 100644 index 0000000000..0f79745331 --- /dev/null +++ b/search/enumvalues_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enumvalues_c.js b/search/enumvalues_c.js new file mode 100644 index 0000000000..ef4c8c4631 --- /dev/null +++ b/search/enumvalues_c.js @@ -0,0 +1,23 @@ +var searchData= +[ + ['read',['Read',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72a7a1a5f3e79fdc91edf2f5ead9d66abb4',1,'Tgstation.Server.Api.Rights.Read()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a691a59767073bc7dff0f17b809d07b0ca7a1a5f3e79fdc91edf2f5ead9d66abb4',1,'Tgstation.Server.Api.Rights.Read()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5da7a1a5f3e79fdc91edf2f5ead9d66abb4',1,'Tgstation.Server.Api.Rights.Read()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79a7a1a5f3e79fdc91edf2f5ead9d66abb4',1,'Tgstation.Server.Api.Rights.Read()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39a7a1a5f3e79fdc91edf2f5ead9d66abb4',1,'Tgstation.Server.Api.Rights.Read()']]], + ['readactive',['ReadActive',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a2a217a19e652f117e2324fb79ed838b9a3326023a4750bdbe33075fdad47d2a8d',1,'Tgstation::Server::Api::Rights']]], + ['readconnectionstring',['ReadConnectionString',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a580a36a11165b2590be342b45c31ec72a1696551e4b826946427650d66b0a0c18',1,'Tgstation::Server::Api::Rights']]], + ['readmetadata',['ReadMetadata',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49a6ac3e4ef171de3175ef0763a390eea05',1,'Tgstation::Server::Api::Rights']]], + ['readrevision',['ReadRevision',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49ae49f7f612746455ed28b92600f4d973c',1,'Tgstation::Server::Api::Rights']]], + ['readusers',['ReadUsers',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#affda1440f9c5e2dfcca65138d2f89a21a1a27a371ba5487ede2e91059df7cab27',1,'Tgstation.Server.Api.Rights.ReadUsers()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a5f1b5a9225190982810802d7a85bb601a1a27a371ba5487ede2e91059df7cab27',1,'Tgstation.Server.Api.Rights.ReadUsers()']]], + ['relocate',['Relocate',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79aa8642eb657c3ab24f0a52b2ef8115d3f',1,'Tgstation::Server::Api::Rights']]], + ['rename',['Rename',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79a904a8304056d77e4547744781b7ceb50',1,'Tgstation::Server::Api::Rights']]], + ['repocheckout',['RepoCheckout',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381ab0586bbc30b26132d29bbc4a69bd0da2',1,'Tgstation::Server::Host::Components']]], + ['repofetch',['RepoFetch',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381ab482b626f1064d696e63b2c62430cdf8',1,'Tgstation::Server::Host::Components']]], + ['repomergeconflict',['RepoMergeConflict',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381a7f72fdbb58d503c2a30b23a72cd1134c',1,'Tgstation::Server::Host::Components']]], + ['repomergepullrequest',['RepoMergePullRequest',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381afc010e2f845e7e0e6b7507a47c17363b',1,'Tgstation::Server::Host::Components']]], + ['repopresynchronize',['RepoPreSynchronize',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381a28b74db9a0a4619b28a21c0573fbc0d8',1,'Tgstation::Server::Host::Components']]], + ['reporesetorigin',['RepoResetOrigin',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381a2d081595fabf6ba0facdc9d1fb7921e6',1,'Tgstation::Server::Host::Components']]], + ['repository',['Repository',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20a33fcf2b3ec4686d9cd06051c726d0ba2',1,'Tgstation::Server::Api::Rights']]], + ['requiressafe',['RequiresSafe',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#af7163ca98f9f5e5c731043ecdace3745aa664657b234543e1fc6702e00b784325',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['requirestrusted',['RequiresTrusted',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#af7163ca98f9f5e5c731043ecdace3745a2cb40d93bedc4fe88f33d0fd49c87563',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['requiresultrasafe',['RequiresUltrasafe',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#af7163ca98f9f5e5c731043ecdace3745a6125188ea908d44694f8cdff0eef43f4',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['restart',['Restart',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49a51cfbcff36da74a9fc47f3a5140f99f2',1,'Tgstation.Server.Api.Rights.Restart()'],['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a97c1a4a168451bd7e3be23c467aa2812a51cfbcff36da74a9fc47f3a5140f99f2',1,'Tgstation.Server.Host.Components.Watchdog.Restart()'],['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a3b33ca95a6257e0c719adc7b54444ab8a51cfbcff36da74a9fc47f3a5140f99f2',1,'Tgstation.Server.Host.Components.Watchdog.Restart()']]], + ['restarthost',['RestartHost',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#affda1440f9c5e2dfcca65138d2f89a21a4ebebe34711c9ddafa1eff5faa9a377e',1,'Tgstation::Server::Api::Rights']]] +]; diff --git a/search/enumvalues_d.html b/search/enumvalues_d.html new file mode 100644 index 0000000000..ea3e08f022 --- /dev/null +++ b/search/enumvalues_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enumvalues_d.js b/search/enumvalues_d.js new file mode 100644 index 0000000000..6b43cf2b4a --- /dev/null +++ b/search/enumvalues_d.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['safe',['Safe',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ad4850e6b78816679602b13d63d2869b5ac6eea0560cd6f377e78dff2c85cc9122',1,'Tgstation::Server::Api::Models']]], + ['sasl',['Sasl',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a0a41c646f859c99d437373d8e6e0545ba722a094110489086589ef2ca86d2a516',1,'Tgstation::Server::Api::Models']]], + ['server',['Server',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#a0a41c646f859c99d437373d8e6e0545ba9aa1b03934893d7134a660af4204f2a9',1,'Tgstation::Server::Api::Models']]], + ['setapivalidationport',['SetApiValidationPort',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5da926d34b9044ba920f715e8e2f6a72c62',1,'Tgstation::Server::Api::Rights']]], + ['setautostart',['SetAutoStart',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49ac73c1c7e96a1b68753840b8502528ab0',1,'Tgstation::Server::Api::Rights']]], + ['setautoupdate',['SetAutoUpdate',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79a2e54e04dba31375a3401f9f300a80d81',1,'Tgstation::Server::Api::Rights']]], + ['setconfiguration',['SetConfiguration',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79a2e423f35163ade75efce4061c98e1803',1,'Tgstation::Server::Api::Rights']]], + ['setdme',['SetDme',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5da14814465c8710a1dd49b3642c172ed36',1,'Tgstation::Server::Api::Rights']]], + ['setonline',['SetOnline',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#af199a84ed6fe6ca557db9de91070ad79a49241bae6f08ea45c321cbee8ce70cda',1,'Tgstation::Server::Api::Rights']]], + ['setorigin',['SetOrigin',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39a4cfe869c65c26d572cd5ab1b98abdb6a',1,'Tgstation::Server::Api::Rights']]], + ['setports',['SetPorts',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49a81a46f4105078d5ddae4991343644468',1,'Tgstation::Server::Api::Rights']]], + ['setreference',['SetReference',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39a177459d00b7f29a44b87c9a5e1cb1f11',1,'Tgstation::Server::Api::Rights']]], + ['setsecurity',['SetSecurity',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49ad01c76a7263a2d3af037a139b8563b5a',1,'Tgstation::Server::Api::Rights']]], + ['setsecuritylevel',['SetSecurityLevel',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a6aac419b6a793fe07657d96ac48dee5dab49667168f82f3007e86f44c40e6322c',1,'Tgstation::Server::Api::Rights']]], + ['setsha',['SetSha',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39ad8c2d7ddc75692573d20ed5254fcd06a',1,'Tgstation::Server::Api::Rights']]], + ['setstartuptimeout',['SetStartupTimeout',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49ae34541119c09d49ca1ba51be76c98aa1',1,'Tgstation::Server::Api::Rights']]], + ['setwebclient',['SetWebClient',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49aba69275e93f440b20e7bebe7be6f8a7c',1,'Tgstation::Server::Api::Rights']]], + ['shutdown',['Shutdown',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49a1a4ebb180ba59b067782515ffee6e975',1,'Tgstation.Server.Api.Rights.Shutdown()'],['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a3b33ca95a6257e0c719adc7b54444ab8a1a4ebb180ba59b067782515ffee6e975',1,'Tgstation.Server.Host.Components.Watchdog.Shutdown()']]], + ['skip',['Skip',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a97c1a4a168451bd7e3be23c467aa2812a72ef2b9b6965d078e3c7f95487a82d1c',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['softrestart',['SoftRestart',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49a31d920012be69305899466206d2a4823',1,'Tgstation::Server::Api::Rights']]], + ['softshutdown',['SoftShutdown',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49ae814f60fe597531f5630e0aef1adea94',1,'Tgstation::Server::Api::Rights']]], + ['sqlserver',['SqlServer',['../namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html#acda8f6ee23a9ee8ac298f7b4a7d5617cae86e829e4d4c68b30a4fd26aa2bfca72',1,'Tgstation::Server::Host::Configuration']]], + ['start',['Start',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#acf2642afce6567c03b79876139a10a49aa6122a65eaa676f700ae68d393054a37',1,'Tgstation::Server::Api::Rights']]], + ['systemidentitywrite',['SystemIdentityWrite',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ab7bc96f211e450615be8669d10de2440ab027b6d7abbf6c6fa50c64fc51437bce',1,'Tgstation::Server::Api::Models']]] +]; diff --git a/search/enumvalues_e.html b/search/enumvalues_e.html new file mode 100644 index 0000000000..fcadce69e0 --- /dev/null +++ b/search/enumvalues_e.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enumvalues_e.js b/search/enumvalues_e.js new file mode 100644 index 0000000000..38251182c6 --- /dev/null +++ b/search/enumvalues_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['trusted',['Trusted',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ad4850e6b78816679602b13d63d2869b5ac0405d71f21e769c787a10b9620f11ea',1,'Tgstation::Server::Api::Models']]] +]; diff --git a/search/enumvalues_f.html b/search/enumvalues_f.html new file mode 100644 index 0000000000..73c9882c10 --- /dev/null +++ b/search/enumvalues_f.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/enumvalues_f.js b/search/enumvalues_f.js new file mode 100644 index 0000000000..f2a5592192 --- /dev/null +++ b/search/enumvalues_f.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['ultrasafe',['Ultrasafe',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html#ad4850e6b78816679602b13d63d2869b5a380d297f2cbdccba869676c96bd38bc1',1,'Tgstation::Server::Api::Models']]], + ['unaskedvalidationrequest',['UnaskedValidationRequest',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#af7163ca98f9f5e5c731043ecdace3745a4b42bf5b19925da0a8866a1dfdc33ffd',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['updatebranch',['UpdateBranch',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a95336db3db40dbae9701ef6e51240f39a31df5784b56922c3559917d3286fcac3',1,'Tgstation::Server::Api::Rights']]] +]; diff --git a/search/files_0.html b/search/files_0.html new file mode 100644 index 0000000000..40cd455439 --- /dev/null +++ b/search/files_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_0.js b/search/files_0.js new file mode 100644 index 0000000000..150b7dee32 --- /dev/null +++ b/search/files_0.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['20180906135553_5fmsinitialcreate_2ecs',['20180906135553_MSInitialCreate.cs',['../20180906135553___m_s_initial_create_8cs.html',1,'']]], + ['20180906135553_5fmsinitialcreate_2edesigner_2ecs',['20180906135553_MSInitialCreate.Designer.cs',['../20180906135553___m_s_initial_create_8_designer_8cs.html',1,'']]], + ['20180906143029_5fmyinitialcreate_2ecs',['20180906143029_MYInitialCreate.cs',['../20180906143029___m_y_initial_create_8cs.html',1,'']]], + ['20180906143029_5fmyinitialcreate_2edesigner_2ecs',['20180906143029_MYInitialCreate.Designer.cs',['../20180906143029___m_y_initial_create_8_designer_8cs.html',1,'']]], + ['20180918020726_5fmyaddminimumsecurity_2ecs',['20180918020726_MYAddMinimumSecurity.cs',['../20180918020726___m_y_add_minimum_security_8cs.html',1,'']]], + ['20180918020726_5fmyaddminimumsecurity_2edesigner_2ecs',['20180918020726_MYAddMinimumSecurity.Designer.cs',['../20180918020726___m_y_add_minimum_security_8_designer_8cs.html',1,'']]], + ['20180918021228_5fmsaddminimumsecurity_2ecs',['20180918021228_MSAddMinimumSecurity.cs',['../20180918021228___m_s_add_minimum_security_8cs.html',1,'']]], + ['20180918021228_5fmsaddminimumsecurity_2edesigner_2ecs',['20180918021228_MSAddMinimumSecurity.Designer.cs',['../20180918021228___m_s_add_minimum_security_8_designer_8cs.html',1,'']]], + ['20180918204520_5fmynullableandforeignkeycleanup_2ecs',['20180918204520_MYNullableAndForeignKeyCleanup.cs',['../20180918204520___m_y_nullable_and_foreign_key_cleanup_8cs.html',1,'']]], + ['20180918204520_5fmynullableandforeignkeycleanup_2edesigner_2ecs',['20180918204520_MYNullableAndForeignKeyCleanup.Designer.cs',['../20180918204520___m_y_nullable_and_foreign_key_cleanup_8_designer_8cs.html',1,'']]], + ['20180918205224_5fmsnullableandforeignkeycleanup_2ecs',['20180918205224_MSNullableAndForeignKeyCleanup.cs',['../20180918205224___m_s_nullable_and_foreign_key_cleanup_8cs.html',1,'']]], + ['20180918205224_5fmsnullableandforeignkeycleanup_2edesigner_2ecs',['20180918205224_MSNullableAndForeignKeyCleanup.Designer.cs',['../20180918205224___m_s_nullable_and_foreign_key_cleanup_8_designer_8cs.html',1,'']]], + ['20180926033145_5fmsreattachcompilejobrequired_2ecs',['20180926033145_MSReattachCompileJobRequired.cs',['../20180926033145___m_s_reattach_compile_job_required_8cs.html',1,'']]], + ['20180926033145_5fmsreattachcompilejobrequired_2edesigner_2ecs',['20180926033145_MSReattachCompileJobRequired.Designer.cs',['../20180926033145___m_s_reattach_compile_job_required_8_designer_8cs.html',1,'']]], + ['20180926034014_5fmyreattachcompilejobrequired_2ecs',['20180926034014_MYReattachCompileJobRequired.cs',['../20180926034014___m_y_reattach_compile_job_required_8cs.html',1,'']]], + ['20180926034014_5fmyreattachcompilejobrequired_2edesigner_2ecs',['20180926034014_MYReattachCompileJobRequired.Designer.cs',['../20180926034014___m_y_reattach_compile_job_required_8_designer_8cs.html',1,'']]], + ['20181124231534_5fmstoggletestmergecomments_2ecs',['20181124231534_MSToggleTestmergeComments.cs',['../20181124231534___m_s_toggle_testmerge_comments_8cs.html',1,'']]], + ['20181124231534_5fmstoggletestmergecomments_2edesigner_2ecs',['20181124231534_MSToggleTestmergeComments.Designer.cs',['../20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs.html',1,'']]], + ['20181124231549_5fmytoggletestmergecomments_2ecs',['20181124231549_MYToggleTestmergeComments.cs',['../20181124231549___m_y_toggle_testmerge_comments_8cs.html',1,'']]], + ['20181124231549_5fmytoggletestmergecomments_2edesigner_2ecs',['20181124231549_MYToggleTestmergeComments.Designer.cs',['../20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs.html',1,'']]], + ['20190219041825_5fmsfixrevinfoindex_2ecs',['20190219041825_MSFixRevInfoIndex.cs',['../20190219041825___m_s_fix_rev_info_index_8cs.html',1,'']]], + ['20190219041825_5fmsfixrevinfoindex_2edesigner_2ecs',['20190219041825_MSFixRevInfoIndex.Designer.cs',['../20190219041825___m_s_fix_rev_info_index_8_designer_8cs.html',1,'']]], + ['20190219042440_5fmyfixrevinfoindex_2ecs',['20190219042440_MYFixRevInfoIndex.cs',['../20190219042440___m_y_fix_rev_info_index_8cs.html',1,'']]], + ['20190219042440_5fmyfixrevinfoindex_2edesigner_2ecs',['20190219042440_MYFixRevInfoIndex.Designer.cs',['../20190219042440___m_y_fix_rev_info_index_8_designer_8cs.html',1,'']]] +]; diff --git a/search/files_1.html b/search/files_1.html new file mode 100644 index 0000000000..646d1f4cc5 --- /dev/null +++ b/search/files_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_1.js b/search/files_1.js new file mode 100644 index 0000000000..38337f5c7b --- /dev/null +++ b/search/files_1.js @@ -0,0 +1,23 @@ +var searchData= +[ + ['administration_2ecs',['Administration.cs',['../_administration_8cs.html',1,'']]], + ['administrationclient_2ecs',['AdministrationClient.cs',['../_administration_client_8cs.html',1,'']]], + ['administrationcontroller_2ecs',['AdministrationController.cs',['../_administration_controller_8cs.html',1,'']]], + ['administrationrights_2ecs',['AdministrationRights.cs',['../_administration_rights_8cs.html',1,'']]], + ['administrationtest_2ecs',['AdministrationTest.cs',['../_administration_test_8cs.html',1,'']]], + ['api_2edox',['API.dox',['../_a_p_i_8dox.html',1,'']]], + ['apiclient_2ecs',['ApiClient.cs',['../_api_client_8cs.html',1,'']]], + ['apiclientfactory_2ecs',['ApiClientFactory.cs',['../_api_client_factory_8cs.html',1,'']]], + ['apiconflictexception_2ecs',['ApiConflictException.cs',['../_api_conflict_exception_8cs.html',1,'']]], + ['apicontroller_2ecs',['ApiController.cs',['../_api_controller_8cs.html',1,'']]], + ['apiheaders_2ecs',['ApiHeaders.cs',['../_api_headers_8cs.html',1,'']]], + ['apimismatchexception_2ecs',['ApiMismatchException.cs',['../_api_mismatch_exception_8cs.html',1,'']]], + ['apivalidationstatus_2ecs',['ApiValidationStatus.cs',['../_api_validation_status_8cs.html',1,'']]], + ['application_2ecs',['Application.cs',['../_application_8cs.html',1,'']]], + ['applicationbuilderextensions_2ecs',['ApplicationBuilderExtensions.cs',['../_application_builder_extensions_8cs.html',1,'']]], + ['architecture_2edox',['Architecture.dox',['../_architecture_8dox.html',1,'']]], + ['assemblyinfo_2ecs',['AssemblyInfo.cs',['../_tgstation_8_server_8_client_2_assembly_info_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_assembly_info_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_8_console_2_assembly_info_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_8_service_2_properties_2_assembly_info_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_8_watchdog_2_assembly_info_8cs.html',1,'(Global Namespace)']]], + ['asyncdelayer_2ecs',['AsyncDelayer.cs',['../_async_delayer_8cs.html',1,'']]], + ['authenticationcontext_2ecs',['AuthenticationContext.cs',['../_authentication_context_8cs.html',1,'']]], + ['authenticationcontextfactory_2ecs',['AuthenticationContextFactory.cs',['../_authentication_context_factory_8cs.html',1,'']]] +]; diff --git a/search/files_10.html b/search/files_10.html new file mode 100644 index 0000000000..42c42d6bc8 --- /dev/null +++ b/search/files_10.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_10.js b/search/files_10.js new file mode 100644 index 0000000000..07c28b18c0 --- /dev/null +++ b/search/files_10.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['ratelimitexception_2ecs',['RateLimitException.cs',['../_rate_limit_exception_8cs.html',1,'']]], + ['readme_2emd',['README.md',['../_r_e_a_d_m_e_8md.html',1,'(Global Namespace)'],['../tools_2_release_notes_2_r_e_a_d_m_e_8md.html',1,'(Global Namespace)']]], + ['reattachinfohandler_2ecs',['ReattachInfoHandler.cs',['../_reattach_info_handler_8cs.html',1,'']]], + ['reattachinformation_2ecs',['ReattachInformation.cs',['../_components_2_watchdog_2_reattach_information_8cs.html',1,'(Global Namespace)'],['../_models_2_reattach_information_8cs.html',1,'(Global Namespace)']]], + ['reattachinformationbase_2ecs',['ReattachInformationBase.cs',['../_reattach_information_base_8cs.html',1,'']]], + ['rebootstate_2ecs',['RebootState.cs',['../_reboot_state_8cs.html',1,'']]], + ['releasenotes_2eassemblyinfo_2ecs',['ReleaseNotes.AssemblyInfo.cs',['../_release_notes_8_assembly_info_8cs.html',1,'']]], + ['repository_2ecs',['Repository.cs',['../_tgstation_8_server_8_api_2_models_2_repository_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_components_2_repository_2_repository_8cs.html',1,'(Global Namespace)']]], + ['repositoryclient_2ecs',['RepositoryClient.cs',['../_repository_client_8cs.html',1,'']]], + ['repositorycontroller_2ecs',['RepositoryController.cs',['../_repository_controller_8cs.html',1,'']]], + ['repositorymanager_2ecs',['RepositoryManager.cs',['../_repository_manager_8cs.html',1,'']]], + ['repositoryrights_2ecs',['RepositoryRights.cs',['../_repository_rights_8cs.html',1,'']]], + ['repositorysettings_2ecs',['RepositorySettings.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_repository_settings_8cs.html',1,'(Global Namespace)']]], + ['requesttimeoutexception_2ecs',['RequestTimeoutException.cs',['../_request_timeout_exception_8cs.html',1,'']]], + ['resolvingiomanager_2ecs',['ResolvingIOManager.cs',['../_resolving_i_o_manager_8cs.html',1,'']]], + ['response_2ecs',['Response.cs',['../_response_8cs.html',1,'']]], + ['restartregistration_2ecs',['RestartRegistration.cs',['../_restart_registration_8cs.html',1,'']]], + ['revinfotestmerge_2ecs',['RevInfoTestMerge.cs',['../_rev_info_test_merge_8cs.html',1,'']]], + ['revisioncommand_2ecs',['RevisionCommand.cs',['../_revision_command_8cs.html',1,'']]], + ['revisioninformation_2ecs',['RevisionInformation.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_revision_information_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_api_2_models_2_revision_information_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_revision_information_8cs.html',1,'(Global Namespace)']]], + ['rightshelper_2ecs',['RightsHelper.cs',['../_rights_helper_8cs.html',1,'']]], + ['rightstype_2ecs',['RightsType.cs',['../_rights_type_8cs.html',1,'']]], + ['routes_2ecs',['Routes.cs',['../_routes_8cs.html',1,'']]] +]; diff --git a/search/files_11.html b/search/files_11.html new file mode 100644 index 0000000000..4ea3d72aa4 --- /dev/null +++ b/search/files_11.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_11.js b/search/files_11.js new file mode 100644 index 0000000000..429b7b4a4d --- /dev/null +++ b/search/files_11.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['semaphoreslimcontext_2ecs',['SemaphoreSlimContext.cs',['../_semaphore_slim_context_8cs.html',1,'']]], + ['server_2ecs',['Server.cs',['../_server_8cs.html',1,'']]], + ['serverclient_2ecs',['ServerClient.cs',['../_server_client_8cs.html',1,'']]], + ['serverclientfactory_2ecs',['ServerClientFactory.cs',['../_server_client_factory_8cs.html',1,'']]], + ['servererrorexception_2ecs',['ServerErrorException.cs',['../_server_error_exception_8cs.html',1,'']]], + ['serverfactory_2ecs',['ServerFactory.cs',['../_server_factory_8cs.html',1,'']]], + ['serverinformation_2ecs',['ServerInformation.cs',['../_server_information_8cs.html',1,'']]], + ['serverservice_2ecs',['ServerService.cs',['../_server_service_8cs.html',1,'']]], + ['serversidemodifications_2ecs',['ServerSideModifications.cs',['../_server_side_modifications_8cs.html',1,'']]], + ['servicecollectionextensions_2ecs',['ServiceCollectionExtensions.cs',['../_service_collection_extensions_8cs.html',1,'']]], + ['serviceunavailableexception_2ecs',['ServiceUnavailableException.cs',['../_service_unavailable_exception_8cs.html',1,'']]], + ['sessioncontroller_2ecs',['SessionController.cs',['../_session_controller_8cs.html',1,'']]], + ['sessioncontrollerfactory_2ecs',['SessionControllerFactory.cs',['../_session_controller_factory_8cs.html',1,'']]], + ['setupwizard_2ecs',['SetupWizard.cs',['../_setup_wizard_8cs.html',1,'']]], + ['setupwizardmode_2ecs',['SetupWizardMode.cs',['../_setup_wizard_mode_8cs.html',1,'']]], + ['sqlserverdatabasecontext_2ecs',['SqlServerDatabaseContext.cs',['../_sql_server_database_context_8cs.html',1,'']]], + ['sqlserverdatabasecontextmodelsnapshot_2ecs',['SqlServerDatabaseContextModelSnapshot.cs',['../_sql_server_database_context_model_snapshot_8cs.html',1,'']]], + ['sqlserverdesigntimedbcontextfactory_2ecs',['SqlServerDesignTimeDbContextFactory.cs',['../_sql_server_design_time_db_context_factory_8cs.html',1,'']]], + ['synchronousiomanager_2ecs',['SynchronousIOManager.cs',['../_synchronous_i_o_manager_8cs.html',1,'']]] +]; diff --git a/search/files_12.html b/search/files_12.html new file mode 100644 index 0000000000..42c849cebe --- /dev/null +++ b/search/files_12.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_12.js b/search/files_12.js new file mode 100644 index 0000000000..708d4a027a --- /dev/null +++ b/search/files_12.js @@ -0,0 +1,60 @@ +var searchData= +[ + ['taskextensions_2ecs',['TaskExtensions.cs',['../_task_extensions_8cs.html',1,'']]], + ['temporarydmbprovider_2ecs',['TemporaryDmbProvider.cs',['../_temporary_dmb_provider_8cs.html',1,'']]], + ['testapiclient_2ecs',['TestApiClient.cs',['../_test_api_client_8cs.html',1,'']]], + ['testapiheaders_2ecs',['TestApiHeaders.cs',['../_test_api_headers_8cs.html',1,'']]], + ['testapplication_2ecs',['TestApplication.cs',['../_test_application_8cs.html',1,'']]], + ['testasyncdelayer_2ecs',['TestAsyncDelayer.cs',['../_test_async_delayer_8cs.html',1,'']]], + ['testauthenticationcontext_2ecs',['TestAuthenticationContext.cs',['../_test_authentication_context_8cs.html',1,'']]], + ['testconsole_2ecs',['TestConsole.cs',['../_test_console_8cs.html',1,'']]], + ['testdatabasecontextfactory_2ecs',['TestDatabaseContextFactory.cs',['../_test_database_context_factory_8cs.html',1,'']]], + ['testdbconnectionfactory_2ecs',['TestDBConnectionFactory.cs',['../_test_d_b_connection_factory_8cs.html',1,'']]], + ['testdiscordprovider_2ecs',['TestDiscordProvider.cs',['../_test_discord_provider_8cs.html',1,'']]], + ['testdreamdaemonclient_2ecs',['TestDreamDaemonClient.cs',['../_test_dream_daemon_client_8cs.html',1,'']]], + ['testexperimentalwatchdog_2ecs',['TestExperimentalWatchdog.cs',['../_test_experimental_watchdog_8cs.html',1,'']]], + ['testgithubclientfactory_2ecs',['TestGitHubClientFactory.cs',['../_test_git_hub_client_factory_8cs.html',1,'']]], + ['testingserver_2ecs',['TestingServer.cs',['../_testing_server_8cs.html',1,'']]], + ['testircconnectionstringbuilder_2ecs',['TestIrcConnectionStringBuilder.cs',['../_test_irc_connection_string_builder_8cs.html',1,'']]], + ['testjobexception_2ecs',['TestJobException.cs',['../_test_job_exception_8cs.html',1,'']]], + ['testjobhandler_2ecs',['TestJobHandler.cs',['../_test_job_handler_8cs.html',1,'']]], + ['testmerge_2ecs',['TestMerge.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_test_merge_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_api_2_models_2_test_merge_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_components_2_interop_2_test_merge_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_test_merge_8cs.html',1,'(Global Namespace)']]], + ['testmergebase_2ecs',['TestMergeBase.cs',['../_test_merge_base_8cs.html',1,'']]], + ['testmergeparameters_2ecs',['TestMergeParameters.cs',['../_test_merge_parameters_8cs.html',1,'']]], + ['testplatformidentifier_2ecs',['TestPlatformIdentifier.cs',['../_test_platform_identifier_8cs.html',1,'']]], + ['testposixbyondinstaller_2ecs',['TestPosixByondInstaller.cs',['../_test_posix_byond_installer_8cs.html',1,'']]], + ['testpostwritehandler_2ecs',['TestPostWriteHandler.cs',['../_test_post_write_handler_8cs.html',1,'']]], + ['testprogram_2ecs',['TestProgram.cs',['../_test_program_8cs.html',1,'']]], + ['testrights_2ecs',['TestRights.cs',['../_test_rights_8cs.html',1,'']]], + ['testserverclientfactory_2ecs',['TestServerClientFactory.cs',['../_test_server_client_factory_8cs.html',1,'']]], + ['testserverfactory_2ecs',['TestServerFactory.cs',['../_test_server_factory_8cs.html',1,'']]], + ['testserverservice_2ecs',['TestServerService.cs',['../_test_server_service_8cs.html',1,'']]], + ['testservicecollectionextensions_2ecs',['TestServiceCollectionExtensions.cs',['../_test_service_collection_extensions_8cs.html',1,'']]], + ['testsetupwizard_2ecs',['TestSetupWizard.cs',['../_test_setup_wizard_8cs.html',1,'']]], + ['testsymlinkfactory_2ecs',['TestSymlinkFactory.cs',['../_test_symlink_factory_8cs.html',1,'']]], + ['testwatchdog_2ecs',['TestWatchdog.cs',['../_test_watchdog_8cs.html',1,'']]], + ['testwatchdogfactory_2ecs',['TestWatchdogFactory.cs',['../_test_watchdog_factory_8cs.html',1,'']]], + ['tgsauthorizeattribute_2ecs',['TgsAuthorizeAttribute.cs',['../_tgs_authorize_attribute_8cs.html',1,'']]], + ['tgstation_2eserver_2eapi_2eassemblyinfo_2ecs',['Tgstation.Server.Api.AssemblyInfo.cs',['../_tgstation_8_server_8_api_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2eapi_2etests_2eassemblyinfo_2ecs',['Tgstation.Server.Api.Tests.AssemblyInfo.cs',['../_tgstation_8_server_8_api_8_tests_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2eapi_2etests_2eprogram_2ecs',['Tgstation.Server.Api.Tests.Program.cs',['../_tgstation_8_server_8_api_8_tests_8_program_8cs.html',1,'']]], + ['tgstation_2eserver_2eclient_2eassemblyinfo_2ecs',['Tgstation.Server.Client.AssemblyInfo.cs',['../_tgstation_8_server_8_client_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2eclient_2etests_2eassemblyinfo_2ecs',['Tgstation.Server.Client.Tests.AssemblyInfo.cs',['../_tgstation_8_server_8_client_8_tests_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2eclient_2etests_2eprogram_2ecs',['Tgstation.Server.Client.Tests.Program.cs',['../_tgstation_8_server_8_client_8_tests_8_program_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2eassemblyinfo_2ecs',['Tgstation.Server.Host.AssemblyInfo.cs',['../_tgstation_8_server_8_host_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2econsole_2eassemblyinfo_2ecs',['Tgstation.Server.Host.Console.AssemblyInfo.cs',['../_tgstation_8_server_8_host_8_console_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2econsole_2etests_2eassemblyinfo_2ecs',['Tgstation.Server.Host.Console.Tests.AssemblyInfo.cs',['../_tgstation_8_server_8_host_8_console_8_tests_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2econsole_2etests_2eprogram_2ecs',['Tgstation.Server.Host.Console.Tests.Program.cs',['../_tgstation_8_server_8_host_8_console_8_tests_8_program_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2erazorassemblyinfo_2ecs',['Tgstation.Server.Host.RazorAssemblyInfo.cs',['../_tgstation_8_server_8_host_8_razor_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2eservice_2eassemblyinfo_2ecs',['Tgstation.Server.Host.Service.AssemblyInfo.cs',['../_tgstation_8_server_8_host_8_service_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2eservice_2etests_2eassemblyinfo_2ecs',['Tgstation.Server.Host.Service.Tests.AssemblyInfo.cs',['../_tgstation_8_server_8_host_8_service_8_tests_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2etests_2eassemblyinfo_2ecs',['Tgstation.Server.Host.Tests.AssemblyInfo.cs',['../_tgstation_8_server_8_host_8_tests_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2etests_2eprogram_2ecs',['Tgstation.Server.Host.Tests.Program.cs',['../_tgstation_8_server_8_host_8_tests_8_program_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2ewatchdog_2eassemblyinfo_2ecs',['Tgstation.Server.Host.Watchdog.AssemblyInfo.cs',['../_tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2ewatchdog_2etests_2eassemblyinfo_2ecs',['Tgstation.Server.Host.Watchdog.Tests.AssemblyInfo.cs',['../_tgstation_8_server_8_host_8_watchdog_8_tests_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2ehost_2ewatchdog_2etests_2eprogram_2ecs',['Tgstation.Server.Host.Watchdog.Tests.Program.cs',['../_tgstation_8_server_8_host_8_watchdog_8_tests_8_program_8cs.html',1,'']]], + ['tgstation_2eserver_2etests_2eassemblyinfo_2ecs',['Tgstation.Server.Tests.AssemblyInfo.cs',['../_tgstation_8_server_8_tests_8_assembly_info_8cs.html',1,'']]], + ['tgstation_2eserver_2etests_2eprogram_2ecs',['Tgstation.Server.Tests.Program.cs',['../_tgstation_8_server_8_tests_8_program_8cs.html',1,'']]], + ['token_2ecs',['Token.cs',['../_token_8cs.html',1,'']]], + ['tokenfactory_2ecs',['TokenFactory.cs',['../_token_factory_8cs.html',1,'']]] +]; diff --git a/search/files_13.html b/search/files_13.html new file mode 100644 index 0000000000..d789562d64 --- /dev/null +++ b/search/files_13.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_13.js b/search/files_13.js new file mode 100644 index 0000000000..90f13217e7 --- /dev/null +++ b/search/files_13.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['unauthorizedexception_2ecs',['UnauthorizedException.cs',['../_unauthorized_exception_8cs.html',1,'']]], + ['unrecognizedresponseexception_2ecs',['UnrecognizedResponseException.cs',['../_unrecognized_response_exception_8cs.html',1,'']]], + ['updatesconfiguration_2ecs',['UpdatesConfiguration.cs',['../_updates_configuration_8cs.html',1,'']]], + ['user_2ecs',['User.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_user_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_api_2_models_2_user_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_components_2_chat_2_user_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_user_8cs.html',1,'(Global Namespace)']]], + ['usercontroller_2ecs',['UserController.cs',['../_user_controller_8cs.html',1,'']]], + ['usersclient_2ecs',['UsersClient.cs',['../_users_client_8cs.html',1,'']]], + ['userupdate_2ecs',['UserUpdate.cs',['../_user_update_8cs.html',1,'']]] +]; diff --git a/search/files_14.html b/search/files_14.html new file mode 100644 index 0000000000..54b5327634 --- /dev/null +++ b/search/files_14.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_14.js b/search/files_14.js new file mode 100644 index 0000000000..415cea6f70 --- /dev/null +++ b/search/files_14.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['versioncommand_2ecs',['VersionCommand.cs',['../_version_command_8cs.html',1,'']]] +]; diff --git a/search/files_15.html b/search/files_15.html new file mode 100644 index 0000000000..c6f71e4a5c --- /dev/null +++ b/search/files_15.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_15.js b/search/files_15.js new file mode 100644 index 0000000000..dba748a5f7 --- /dev/null +++ b/search/files_15.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['watchdog_2ecs',['Watchdog.cs',['../_watchdog_8cs.html',1,'']]], + ['watchdogbase_2ecs',['WatchdogBase.cs',['../_watchdog_base_8cs.html',1,'']]], + ['watchdogfactory_2ecs',['WatchdogFactory.cs',['../_components_2_watchdog_2_watchdog_factory_8cs.html',1,'(Global Namespace)'],['../_watchdog_2_watchdog_factory_8cs.html',1,'(Global Namespace)']]], + ['watchdogreattachinformation_2ecs',['WatchdogReattachInformation.cs',['../_components_2_watchdog_2_watchdog_reattach_information_8cs.html',1,'(Global Namespace)'],['../_models_2_watchdog_reattach_information_8cs.html',1,'(Global Namespace)']]], + ['watchdogreattachinformationbase_2ecs',['WatchdogReattachInformationBase.cs',['../_watchdog_reattach_information_base_8cs.html',1,'']]], + ['windowsbyondinstaller_2ecs',['WindowsByondInstaller.cs',['../_windows_byond_installer_8cs.html',1,'']]], + ['windowsnetworkpromptreaper_2ecs',['WindowsNetworkPromptReaper.cs',['../_windows_network_prompt_reaper_8cs.html',1,'']]], + ['windowspostwritehandler_2ecs',['WindowsPostWriteHandler.cs',['../_windows_post_write_handler_8cs.html',1,'']]], + ['windowssymlinkfactory_2ecs',['WindowsSymlinkFactory.cs',['../_windows_symlink_factory_8cs.html',1,'']]], + ['windowssystemidentity_2ecs',['WindowsSystemIdentity.cs',['../_windows_system_identity_8cs.html',1,'']]], + ['windowssystemidentityfactory_2ecs',['WindowsSystemIdentityFactory.cs',['../_windows_system_identity_factory_8cs.html',1,'']]] +]; diff --git a/search/files_2.html b/search/files_2.html new file mode 100644 index 0000000000..9e47a77a27 --- /dev/null +++ b/search/files_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_2.js b/search/files_2.js new file mode 100644 index 0000000000..94cd73d3b7 --- /dev/null +++ b/search/files_2.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['basicwatchdog_2ecs',['BasicWatchdog.cs',['../_basic_watchdog_8cs.html',1,'']]], + ['boolconverter_2ecs',['BoolConverter.cs',['../_bool_converter_8cs.html',1,'']]], + ['byond_2ecs',['Byond.cs',['../_byond_8cs.html',1,'']]], + ['byondclient_2ecs',['ByondClient.cs',['../_byond_client_8cs.html',1,'']]], + ['byondcommand_2ecs',['ByondCommand.cs',['../_byond_command_8cs.html',1,'']]], + ['byondcontroller_2ecs',['ByondController.cs',['../_byond_controller_8cs.html',1,'']]], + ['byondexecutablelock_2ecs',['ByondExecutableLock.cs',['../_byond_executable_lock_8cs.html',1,'']]], + ['byondmanager_2ecs',['ByondManager.cs',['../_byond_manager_8cs.html',1,'']]], + ['byondrights_2ecs',['ByondRights.cs',['../_byond_rights_8cs.html',1,'']]], + ['byondtest_2ecs',['ByondTest.cs',['../_byond_test_8cs.html',1,'']]] +]; diff --git a/search/files_3.html b/search/files_3.html new file mode 100644 index 0000000000..167679b4df --- /dev/null +++ b/search/files_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_3.js b/search/files_3.js new file mode 100644 index 0000000000..ab897cf0d8 --- /dev/null +++ b/search/files_3.js @@ -0,0 +1,35 @@ +var searchData= +[ + ['channel_2ecs',['Channel.cs',['../_channel_8cs.html',1,'']]], + ['channelmapping_2ecs',['ChannelMapping.cs',['../_channel_mapping_8cs.html',1,'']]], + ['chat_2ecs',['Chat.cs',['../_chat_8cs.html',1,'']]], + ['chatbot_2ecs',['ChatBot.cs',['../_tgstation_8_server_8_api_2_models_2_chat_bot_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_api_2_models_2_internal_2_chat_bot_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_chat_bot_8cs.html',1,'(Global Namespace)']]], + ['chatbotrights_2ecs',['ChatBotRights.cs',['../_chat_bot_rights_8cs.html',1,'']]], + ['chatbotsclient_2ecs',['ChatBotsClient.cs',['../_chat_bots_client_8cs.html',1,'']]], + ['chatchannel_2ecs',['ChatChannel.cs',['../_tgstation_8_server_8_api_2_models_2_chat_channel_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_chat_channel_8cs.html',1,'(Global Namespace)']]], + ['chatcommand_2ecs',['ChatCommand.cs',['../_chat_command_8cs.html',1,'']]], + ['chatconnectionstringbuilder_2ecs',['ChatConnectionStringBuilder.cs',['../_chat_connection_string_builder_8cs.html',1,'']]], + ['chatcontroller_2ecs',['ChatController.cs',['../_chat_controller_8cs.html',1,'']]], + ['chatfactory_2ecs',['ChatFactory.cs',['../_chat_factory_8cs.html',1,'']]], + ['chatprovider_2ecs',['ChatProvider.cs',['../_chat_provider_8cs.html',1,'']]], + ['claimsinjector_2ecs',['ClaimsInjector.cs',['../_claims_injector_8cs.html',1,'']]], + ['clientexception_2ecs',['ClientException.cs',['../_client_exception_8cs.html',1,'']]], + ['commandfactory_2ecs',['CommandFactory.cs',['../_command_factory_8cs.html',1,'']]], + ['commcommand_2ecs',['CommCommand.cs',['../_comm_command_8cs.html',1,'']]], + ['commcontext_2ecs',['CommContext.cs',['../_comm_context_8cs.html',1,'']]], + ['compilejob_2ecs',['CompileJob.cs',['../_tgstation_8_server_8_api_2_models_2_compile_job_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_api_2_models_2_internal_2_compile_job_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_compile_job_8cs.html',1,'(Global Namespace)']]], + ['configuration_2ecs',['Configuration.cs',['../_configuration_8cs.html',1,'']]], + ['configurationclient_2ecs',['ConfigurationClient.cs',['../_configuration_client_8cs.html',1,'']]], + ['configurationcontroller_2ecs',['ConfigurationController.cs',['../_configuration_controller_8cs.html',1,'']]], + ['configurationfile_2ecs',['ConfigurationFile.cs',['../_configuration_file_8cs.html',1,'']]], + ['configurationrights_2ecs',['ConfigurationRights.cs',['../_configuration_rights_8cs.html',1,'']]], + ['configurationtest_2ecs',['ConfigurationTest.cs',['../_configuration_test_8cs.html',1,'']]], + ['configurationtype_2ecs',['ConfigurationType.cs',['../_configuration_type_8cs.html',1,'']]], + ['conflictexception_2ecs',['ConflictException.cs',['../_conflict_exception_8cs.html',1,'']]], + ['console_2ecs',['Console.cs',['../_console_8cs.html',1,'']]], + ['constants_2ecs',['Constants.cs',['../_constants_8cs.html',1,'']]], + ['controlpanelconfiguration_2ecs',['ControlPanelConfiguration.cs',['../_control_panel_configuration_8cs.html',1,'']]], + ['credentialsprovider_2ecs',['CredentialsProvider.cs',['../_credentials_provider_8cs.html',1,'']]], + ['cryptographysuite_2ecs',['CryptographySuite.cs',['../_cryptography_suite_8cs.html',1,'']]], + ['customcommand_2ecs',['CustomCommand.cs',['../_custom_command_8cs.html',1,'']]] +]; diff --git a/search/files_4.html b/search/files_4.html new file mode 100644 index 0000000000..0eaa44a4ed --- /dev/null +++ b/search/files_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_4.js b/search/files_4.js new file mode 100644 index 0000000000..1bd4df24f3 --- /dev/null +++ b/search/files_4.js @@ -0,0 +1,29 @@ +var searchData= +[ + ['databaseconfiguration_2ecs',['DatabaseConfiguration.cs',['../_database_configuration_8cs.html',1,'']]], + ['databasecontext_2ecs',['DatabaseContext.cs',['../_database_context_8cs.html',1,'']]], + ['databasecontextfactory_2ecs',['DatabaseContextFactory.cs',['../_database_context_factory_8cs.html',1,'']]], + ['databaseseeder_2ecs',['DatabaseSeeder.cs',['../_database_seeder_8cs.html',1,'']]], + ['databasetype_2ecs',['DatabaseType.cs',['../_database_type_8cs.html',1,'']]], + ['dbconnectionfactory_2ecs',['DBConnectionFactory.cs',['../_d_b_connection_factory_8cs.html',1,'']]], + ['deadsessioncontroller_2ecs',['DeadSessionController.cs',['../_dead_session_controller_8cs.html',1,'']]], + ['defaultiomanager_2ecs',['DefaultIOManager.cs',['../_default_i_o_manager_8cs.html',1,'']]], + ['designtimedbcontextfactoryhelpers_2ecs',['DesignTimeDbContextFactoryHelpers.cs',['../_design_time_db_context_factory_helpers_8cs.html',1,'']]], + ['discordconnectionstringbuilder_2ecs',['DiscordConnectionStringBuilder.cs',['../_discord_connection_string_builder_8cs.html',1,'']]], + ['discordprovider_2ecs',['DiscordProvider.cs',['../_discord_provider_8cs.html',1,'']]], + ['dmbfactory_2ecs',['DmbFactory.cs',['../_dmb_factory_8cs.html',1,'']]], + ['dmbprovider_2ecs',['DmbProvider.cs',['../_dmb_provider_8cs.html',1,'']]], + ['dreamdaemon_2ecs',['DreamDaemon.cs',['../_dream_daemon_8cs.html',1,'']]], + ['dreamdaemonclient_2ecs',['DreamDaemonClient.cs',['../_dream_daemon_client_8cs.html',1,'']]], + ['dreamdaemoncontroller_2ecs',['DreamDaemonController.cs',['../_dream_daemon_controller_8cs.html',1,'']]], + ['dreamdaemonlaunchparameters_2ecs',['DreamDaemonLaunchParameters.cs',['../_dream_daemon_launch_parameters_8cs.html',1,'']]], + ['dreamdaemonrights_2ecs',['DreamDaemonRights.cs',['../_dream_daemon_rights_8cs.html',1,'']]], + ['dreamdaemonsecurity_2ecs',['DreamDaemonSecurity.cs',['../_dream_daemon_security_8cs.html',1,'']]], + ['dreamdaemonsettings_2ecs',['DreamDaemonSettings.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_dream_daemon_settings_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_dream_daemon_settings_8cs.html',1,'(Global Namespace)']]], + ['dreamdaemonstatus_2ecs',['DreamDaemonStatus.cs',['../_dream_daemon_status_8cs.html',1,'']]], + ['dreammaker_2ecs',['DreamMaker.cs',['../_tgstation_8_server_8_api_2_models_2_dream_maker_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_components_2_compiler_2_dream_maker_8cs.html',1,'(Global Namespace)']]], + ['dreammakerclient_2ecs',['DreamMakerClient.cs',['../_dream_maker_client_8cs.html',1,'']]], + ['dreammakercontroller_2ecs',['DreamMakerController.cs',['../_dream_maker_controller_8cs.html',1,'']]], + ['dreammakerrights_2ecs',['DreamMakerRights.cs',['../_dream_maker_rights_8cs.html',1,'']]], + ['dreammakersettings_2ecs',['DreamMakerSettings.cs',['../_dream_maker_settings_8cs.html',1,'']]] +]; diff --git a/search/files_5.html b/search/files_5.html new file mode 100644 index 0000000000..25316a5ad5 --- /dev/null +++ b/search/files_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_5.js b/search/files_5.js new file mode 100644 index 0000000000..37f169e510 --- /dev/null +++ b/search/files_5.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['errormessage_2ecs',['ErrorMessage.cs',['../_error_message_8cs.html',1,'']]], + ['eventconsumer_2ecs',['EventConsumer.cs',['../_event_consumer_8cs.html',1,'']]], + ['eventnotification_2ecs',['EventNotification.cs',['../_event_notification_8cs.html',1,'']]], + ['eventtype_2ecs',['EventType.cs',['../_event_type_8cs.html',1,'']]], + ['experimentalwatchdog_2ecs',['ExperimentalWatchdog.cs',['../_experimental_watchdog_8cs.html',1,'']]] +]; diff --git a/search/files_6.html b/search/files_6.html new file mode 100644 index 0000000000..6f326f5f7b --- /dev/null +++ b/search/files_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_6.js b/search/files_6.js new file mode 100644 index 0000000000..57f4608270 --- /dev/null +++ b/search/files_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['fileloggingconfiguration_2ecs',['FileLoggingConfiguration.cs',['../_file_logging_configuration_8cs.html',1,'']]] +]; diff --git a/search/files_7.html b/search/files_7.html new file mode 100644 index 0000000000..53e39bfd1c --- /dev/null +++ b/search/files_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_7.js b/search/files_7.js new file mode 100644 index 0000000000..ed39139ff0 --- /dev/null +++ b/search/files_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generalconfiguration_2ecs',['GeneralConfiguration.cs',['../_general_configuration_8cs.html',1,'']]], + ['githubclientfactory_2ecs',['GitHubClientFactory.cs',['../_git_hub_client_factory_8cs.html',1,'']]], + ['globalsuppressions_2ecs',['GlobalSuppressions.cs',['../_global_suppressions_8cs.html',1,'']]] +]; diff --git a/search/files_8.html b/search/files_8.html new file mode 100644 index 0000000000..861a02cd4b --- /dev/null +++ b/search/files_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_8.js b/search/files_8.js new file mode 100644 index 0000000000..012ccb23c4 --- /dev/null +++ b/search/files_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['homecontroller_2ecs',['HomeController.cs',['../_home_controller_8cs.html',1,'']]], + ['httpclient_2ecs',['HttpClient.cs',['../_http_client_8cs.html',1,'']]] +]; diff --git a/search/files_9.html b/search/files_9.html new file mode 100644 index 0000000000..020cb091e6 --- /dev/null +++ b/search/files_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_9.js b/search/files_9.js new file mode 100644 index 0000000000..d39b20ff05 --- /dev/null +++ b/search/files_9.js @@ -0,0 +1,103 @@ +var searchData= +[ + ['iadministrationclient_2ecs',['IAdministrationClient.cs',['../_i_administration_client_8cs.html',1,'']]], + ['iapiclient_2ecs',['IApiClient.cs',['../_i_api_client_8cs.html',1,'']]], + ['iapiclientfactory_2ecs',['IApiClientFactory.cs',['../_i_api_client_factory_8cs.html',1,'']]], + ['iapplication_2ecs',['IApplication.cs',['../_i_application_8cs.html',1,'']]], + ['iasyncdelayer_2ecs',['IAsyncDelayer.cs',['../_i_async_delayer_8cs.html',1,'']]], + ['iauthenticationcontext_2ecs',['IAuthenticationContext.cs',['../_i_authentication_context_8cs.html',1,'']]], + ['iauthenticationcontextfactory_2ecs',['IAuthenticationContextFactory.cs',['../_i_authentication_context_factory_8cs.html',1,'']]], + ['ibyondclient_2ecs',['IByondClient.cs',['../_i_byond_client_8cs.html',1,'']]], + ['ibyondexecutablelock_2ecs',['IByondExecutableLock.cs',['../_i_byond_executable_lock_8cs.html',1,'']]], + ['ibyondinstaller_2ecs',['IByondInstaller.cs',['../_i_byond_installer_8cs.html',1,'']]], + ['ibyondmanager_2ecs',['IByondManager.cs',['../_i_byond_manager_8cs.html',1,'']]], + ['ichat_2ecs',['IChat.cs',['../_i_chat_8cs.html',1,'']]], + ['ichatbotsclient_2ecs',['IChatBotsClient.cs',['../_i_chat_bots_client_8cs.html',1,'']]], + ['ichatfactory_2ecs',['IChatFactory.cs',['../_i_chat_factory_8cs.html',1,'']]], + ['iclaimsinjector_2ecs',['IClaimsInjector.cs',['../_i_claims_injector_8cs.html',1,'']]], + ['icommand_2ecs',['ICommand.cs',['../_i_command_8cs.html',1,'']]], + ['icommandfactory_2ecs',['ICommandFactory.cs',['../_i_command_factory_8cs.html',1,'']]], + ['icommcontext_2ecs',['ICommContext.cs',['../_i_comm_context_8cs.html',1,'']]], + ['icommhandler_2ecs',['ICommHandler.cs',['../_i_comm_handler_8cs.html',1,'']]], + ['icompilejobconsumer_2ecs',['ICompileJobConsumer.cs',['../_i_compile_job_consumer_8cs.html',1,'']]], + ['iconfiguration_2ecs',['IConfiguration.cs',['../_i_configuration_8cs.html',1,'']]], + ['iconfigurationclient_2ecs',['IConfigurationClient.cs',['../_i_configuration_client_8cs.html',1,'']]], + ['iconsole_2ecs',['IConsole.cs',['../_i_console_8cs.html',1,'']]], + ['icredentialsprovider_2ecs',['ICredentialsProvider.cs',['../_i_credentials_provider_8cs.html',1,'']]], + ['icryptographysuite_2ecs',['ICryptographySuite.cs',['../_i_cryptography_suite_8cs.html',1,'']]], + ['icustomcommandhandler_2ecs',['ICustomCommandHandler.cs',['../_i_custom_command_handler_8cs.html',1,'']]], + ['idatabasecontext_2ecs',['IDatabaseContext.cs',['../_i_database_context_8cs.html',1,'']]], + ['idatabasecontextfactory_2ecs',['IDatabaseContextFactory.cs',['../_i_database_context_factory_8cs.html',1,'']]], + ['idatabaseseeder_2ecs',['IDatabaseSeeder.cs',['../_i_database_seeder_8cs.html',1,'']]], + ['idbconnectionfactory_2ecs',['IDBConnectionFactory.cs',['../_i_d_b_connection_factory_8cs.html',1,'']]], + ['identitycache_2ecs',['IdentityCache.cs',['../_identity_cache_8cs.html',1,'']]], + ['identitycacheobject_2ecs',['IdentityCacheObject.cs',['../_identity_cache_object_8cs.html',1,'']]], + ['idmbfactory_2ecs',['IDmbFactory.cs',['../_i_dmb_factory_8cs.html',1,'']]], + ['idmbprovider_2ecs',['IDmbProvider.cs',['../_i_dmb_provider_8cs.html',1,'']]], + ['idreamdaemonclient_2ecs',['IDreamDaemonClient.cs',['../_i_dream_daemon_client_8cs.html',1,'']]], + ['idreammaker_2ecs',['IDreamMaker.cs',['../_i_dream_maker_8cs.html',1,'']]], + ['idreammakerclient_2ecs',['IDreamMakerClient.cs',['../_i_dream_maker_client_8cs.html',1,'']]], + ['ieventconsumer_2ecs',['IEventConsumer.cs',['../_i_event_consumer_8cs.html',1,'']]], + ['igithubclientfactory_2ecs',['IGitHubClientFactory.cs',['../_i_git_hub_client_factory_8cs.html',1,'']]], + ['ihttpclient_2ecs',['IHttpClient.cs',['../_i_http_client_8cs.html',1,'']]], + ['iidentitycache_2ecs',['IIdentityCache.cs',['../_i_identity_cache_8cs.html',1,'']]], + ['iinstance_2ecs',['IInstance.cs',['../_i_instance_8cs.html',1,'']]], + ['iinstanceclient_2ecs',['IInstanceClient.cs',['../_i_instance_client_8cs.html',1,'']]], + ['iinstancefactory_2ecs',['IInstanceFactory.cs',['../_i_instance_factory_8cs.html',1,'']]], + ['iinstancemanager_2ecs',['IInstanceManager.cs',['../_i_instance_manager_8cs.html',1,'']]], + ['iinstancemanagerclient_2ecs',['IInstanceManagerClient.cs',['../_i_instance_manager_client_8cs.html',1,'']]], + ['iinstanceuserclient_2ecs',['IInstanceUserClient.cs',['../_i_instance_user_client_8cs.html',1,'']]], + ['iiomanager_2ecs',['IIOManager.cs',['../_i_i_o_manager_8cs.html',1,'']]], + ['ijobmanager_2ecs',['IJobManager.cs',['../_i_job_manager_8cs.html',1,'']]], + ['ijobsclient_2ecs',['IJobsClient.cs',['../_i_jobs_client_8cs.html',1,'']]], + ['ijsontrackingcontext_2ecs',['IJsonTrackingContext.cs',['../_i_json_tracking_context_8cs.html',1,'']]], + ['inetworkpromptreaper_2ecs',['INetworkPromptReaper.cs',['../_i_network_prompt_reaper_8cs.html',1,'']]], + ['instance_2ecs',['Instance.cs',['../_tgstation_8_server_8_api_2_models_2_instance_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_components_2_instance_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_instance_8cs.html',1,'(Global Namespace)']]], + ['instanceclient_2ecs',['InstanceClient.cs',['../_instance_client_8cs.html',1,'']]], + ['instancecontroller_2ecs',['InstanceController.cs',['../_instance_controller_8cs.html',1,'']]], + ['instancefactory_2ecs',['InstanceFactory.cs',['../_instance_factory_8cs.html',1,'']]], + ['instancemanager_2ecs',['InstanceManager.cs',['../_instance_manager_8cs.html',1,'']]], + ['instancemanagerclient_2ecs',['InstanceManagerClient.cs',['../_instance_manager_client_8cs.html',1,'']]], + ['instancemanagerrights_2ecs',['InstanceManagerRights.cs',['../_instance_manager_rights_8cs.html',1,'']]], + ['instancemanagertest_2ecs',['InstanceManagerTest.cs',['../_instance_manager_test_8cs.html',1,'']]], + ['instancetest_2ecs',['InstanceTest.cs',['../_instance_test_8cs.html',1,'']]], + ['instanceuser_2ecs',['InstanceUser.cs',['../_tgstation_8_server_8_api_2_models_2_instance_user_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_instance_user_8cs.html',1,'(Global Namespace)']]], + ['instanceuserclient_2ecs',['InstanceUserClient.cs',['../_instance_user_client_8cs.html',1,'']]], + ['instanceusercontroller_2ecs',['InstanceUserController.cs',['../_instance_user_controller_8cs.html',1,'']]], + ['instanceuserrights_2ecs',['InstanceUserRights.cs',['../_instance_user_rights_8cs.html',1,'']]], + ['insufficientpermissionsexception_2ecs',['InsufficientPermissionsException.cs',['../_insufficient_permissions_exception_8cs.html',1,'']]], + ['integrationtest_2ecs',['IntegrationTest.cs',['../_integration_test_8cs.html',1,'']]], + ['iplatformidentifier_2ecs',['IPlatformIdentifier.cs',['../_i_platform_identifier_8cs.html',1,'']]], + ['ipostwritehandler_2ecs',['IPostWriteHandler.cs',['../_i_post_write_handler_8cs.html',1,'']]], + ['iprocess_2ecs',['IProcess.cs',['../_i_process_8cs.html',1,'']]], + ['iprocessbase_2ecs',['IProcessBase.cs',['../_i_process_base_8cs.html',1,'']]], + ['iprocessexecutor_2ecs',['IProcessExecutor.cs',['../_i_process_executor_8cs.html',1,'']]], + ['iprovider_2ecs',['IProvider.cs',['../_i_provider_8cs.html',1,'']]], + ['iproviderfactory_2ecs',['IProviderFactory.cs',['../_i_provider_factory_8cs.html',1,'']]], + ['ircconnectionstringbuilder_2ecs',['IrcConnectionStringBuilder.cs',['../_irc_connection_string_builder_8cs.html',1,'']]], + ['ircpasswordtype_2ecs',['IrcPasswordType.cs',['../_irc_password_type_8cs.html',1,'']]], + ['ircprovider_2ecs',['IrcProvider.cs',['../_irc_provider_8cs.html',1,'']]], + ['ireattachinfohandler_2ecs',['IReattachInfoHandler.cs',['../_i_reattach_info_handler_8cs.html',1,'']]], + ['irepository_2ecs',['IRepository.cs',['../_i_repository_8cs.html',1,'']]], + ['irepositoryclient_2ecs',['IRepositoryClient.cs',['../_i_repository_client_8cs.html',1,'']]], + ['irepositorymanager_2ecs',['IRepositoryManager.cs',['../_i_repository_manager_8cs.html',1,'']]], + ['irequestlogger_2ecs',['IRequestLogger.cs',['../_i_request_logger_8cs.html',1,'']]], + ['irestarthandler_2ecs',['IRestartHandler.cs',['../_i_restart_handler_8cs.html',1,'']]], + ['irestartregistration_2ecs',['IRestartRegistration.cs',['../_i_restart_registration_8cs.html',1,'']]], + ['iserver_2ecs',['IServer.cs',['../_i_server_8cs.html',1,'']]], + ['iserverclient_2ecs',['IServerClient.cs',['../_i_server_client_8cs.html',1,'']]], + ['iserverclientfactory_2ecs',['IServerClientFactory.cs',['../_i_server_client_factory_8cs.html',1,'']]], + ['iservercontrol_2ecs',['IServerControl.cs',['../_i_server_control_8cs.html',1,'']]], + ['iserverfactory_2ecs',['IServerFactory.cs',['../_i_server_factory_8cs.html',1,'']]], + ['isessioncontroller_2ecs',['ISessionController.cs',['../_i_session_controller_8cs.html',1,'']]], + ['isessioncontrollerfactory_2ecs',['ISessionControllerFactory.cs',['../_i_session_controller_factory_8cs.html',1,'']]], + ['isetupwizard_2ecs',['ISetupWizard.cs',['../_i_setup_wizard_8cs.html',1,'']]], + ['isymlinkfactory_2ecs',['ISymlinkFactory.cs',['../_i_symlink_factory_8cs.html',1,'']]], + ['isynchronousiomanager_2ecs',['ISynchronousIOManager.cs',['../_i_synchronous_i_o_manager_8cs.html',1,'']]], + ['isystemidentity_2ecs',['ISystemIdentity.cs',['../_i_system_identity_8cs.html',1,'']]], + ['isystemidentityfactory_2ecs',['ISystemIdentityFactory.cs',['../_i_system_identity_factory_8cs.html',1,'']]], + ['itokenfactory_2ecs',['ITokenFactory.cs',['../_i_token_factory_8cs.html',1,'']]], + ['iusersclient_2ecs',['IUsersClient.cs',['../_i_users_client_8cs.html',1,'']]], + ['iwatchdog_2ecs',['IWatchdog.cs',['../_components_2_watchdog_2_i_watchdog_8cs.html',1,'(Global Namespace)'],['../_watchdog_2_i_watchdog_8cs.html',1,'(Global Namespace)']]], + ['iwatchdogfactory_2ecs',['IWatchdogFactory.cs',['../_components_2_watchdog_2_i_watchdog_factory_8cs.html',1,'(Global Namespace)'],['../_watchdog_2_i_watchdog_factory_8cs.html',1,'(Global Namespace)']]] +]; diff --git a/search/files_a.html b/search/files_a.html new file mode 100644 index 0000000000..d7549b7d5e --- /dev/null +++ b/search/files_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_a.js b/search/files_a.js new file mode 100644 index 0000000000..6978b1ceaf --- /dev/null +++ b/search/files_a.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['job_2ecs',['Job.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_job_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_api_2_models_2_job_8cs.html',1,'(Global Namespace)'],['../_tgstation_8_server_8_host_2_models_2_job_8cs.html',1,'(Global Namespace)']]], + ['jobcontroller_2ecs',['JobController.cs',['../_job_controller_8cs.html',1,'']]], + ['jobexception_2ecs',['JobException.cs',['../_job_exception_8cs.html',1,'']]], + ['jobhandler_2ecs',['JobHandler.cs',['../_job_handler_8cs.html',1,'']]], + ['jobmanager_2ecs',['JobManager.cs',['../_job_manager_8cs.html',1,'']]], + ['jobsclient_2ecs',['JobsClient.cs',['../_jobs_client_8cs.html',1,'']]], + ['jsonfile_2ecs',['JsonFile.cs',['../_json_file_8cs.html',1,'']]], + ['jsonsubfilelist_2ecs',['JsonSubFileList.cs',['../_json_sub_file_list_8cs.html',1,'']]], + ['jsontrackingcontext_2ecs',['JsonTrackingContext.cs',['../_json_tracking_context_8cs.html',1,'']]] +]; diff --git a/search/files_b.html b/search/files_b.html new file mode 100644 index 0000000000..a761fc229a --- /dev/null +++ b/search/files_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_b.js b/search/files_b.js new file mode 100644 index 0000000000..29a7616b49 --- /dev/null +++ b/search/files_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['kekcommand_2ecs',['KekCommand.cs',['../_kek_command_8cs.html',1,'']]] +]; diff --git a/search/files_c.html b/search/files_c.html new file mode 100644 index 0000000000..1411ec6d8a --- /dev/null +++ b/search/files_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_c.js b/search/files_c.js new file mode 100644 index 0000000000..d7d08a365d --- /dev/null +++ b/search/files_c.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['launchresult_2ecs',['LaunchResult.cs',['../_launch_result_8cs.html',1,'']]] +]; diff --git a/search/files_d.html b/search/files_d.html new file mode 100644 index 0000000000..6e7e505ade --- /dev/null +++ b/search/files_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_d.js b/search/files_d.js new file mode 100644 index 0000000000..1e1a164f90 --- /dev/null +++ b/search/files_d.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['message_2ecs',['Message.cs',['../_message_8cs.html',1,'']]], + ['methodnotsupportedexception_2ecs',['MethodNotSupportedException.cs',['../_method_not_supported_exception_8cs.html',1,'']]], + ['modelcontroller_2ecs',['ModelController.cs',['../_model_controller_8cs.html',1,'']]], + ['monitoraction_2ecs',['MonitorAction.cs',['../_monitor_action_8cs.html',1,'']]], + ['monitoractivationreason_2ecs',['MonitorActivationReason.cs',['../_monitor_activation_reason_8cs.html',1,'']]], + ['monitorstate_2ecs',['MonitorState.cs',['../_monitor_state_8cs.html',1,'']]], + ['mysqldatabasecontext_2ecs',['MySqlDatabaseContext.cs',['../_my_sql_database_context_8cs.html',1,'']]], + ['mysqldatabasecontextmodelsnapshot_2ecs',['MySqlDatabaseContextModelSnapshot.cs',['../_my_sql_database_context_model_snapshot_8cs.html',1,'']]], + ['mysqldesigntimedbcontextfactory_2ecs',['MySqlDesignTimeDbContextFactory.cs',['../_my_sql_design_time_db_context_factory_8cs.html',1,'']]] +]; diff --git a/search/files_e.html b/search/files_e.html new file mode 100644 index 0000000000..4bfc8dd531 --- /dev/null +++ b/search/files_e.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_e.js b/search/files_e.js new file mode 100644 index 0000000000..8f7fabcb98 --- /dev/null +++ b/search/files_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['nativemethods_2ecs',['NativeMethods.cs',['../_native_methods_8cs.html',1,'']]] +]; diff --git a/search/files_f.html b/search/files_f.html new file mode 100644 index 0000000000..f5e13b567a --- /dev/null +++ b/search/files_f.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/files_f.js b/search/files_f.js new file mode 100644 index 0000000000..95f62714cc --- /dev/null +++ b/search/files_f.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['platformidentifier_2ecs',['PlatformIdentifier.cs',['../_platform_identifier_8cs.html',1,'']]], + ['posixbyondinstaller_2ecs',['PosixByondInstaller.cs',['../_posix_byond_installer_8cs.html',1,'']]], + ['posixnetworkpromptreaper_2ecs',['PosixNetworkPromptReaper.cs',['../_posix_network_prompt_reaper_8cs.html',1,'']]], + ['posixpostwritehandler_2ecs',['PosixPostWriteHandler.cs',['../_posix_post_write_handler_8cs.html',1,'']]], + ['posixsymlinkfactory_2ecs',['PosixSymlinkFactory.cs',['../_posix_symlink_factory_8cs.html',1,'']]], + ['posixsystemidentityfactory_2ecs',['PosixSystemIdentityFactory.cs',['../_posix_system_identity_factory_8cs.html',1,'']]], + ['process_2ecs',['Process.cs',['../_process_8cs.html',1,'']]], + ['processexecutor_2ecs',['ProcessExecutor.cs',['../_process_executor_8cs.html',1,'']]], + ['program_2ecs',['Program.cs',['../src_2_tgstation_8_server_8_host_2_program_8cs.html',1,'(Global Namespace)'],['../src_2_tgstation_8_server_8_host_8_console_2_program_8cs.html',1,'(Global Namespace)'],['../src_2_tgstation_8_server_8_host_8_service_2_program_8cs.html',1,'(Global Namespace)'],['../tools_2_release_notes_2_program_8cs.html',1,'(Global Namespace)']]], + ['provider_2ecs',['Provider.cs',['../_provider_8cs.html',1,'']]], + ['providerfactory_2ecs',['ProviderFactory.cs',['../_provider_factory_8cs.html',1,'']]], + ['pullrequestscommand_2ecs',['PullRequestsCommand.cs',['../_pull_requests_command_8cs.html',1,'']]] +]; diff --git a/search/functions_0.html b/search/functions_0.html new file mode 100644 index 0000000000..bc73761f52 --- /dev/null +++ b/search/functions_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_0.js b/search/functions_0.js new file mode 100644 index 0000000000..c0a58c8f98 --- /dev/null +++ b/search/functions_0.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['activeversion',['ActiveVersion',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html#a33ebe5cafb9a3e5cfa0b6a0bf9f6070f',1,'Tgstation.Server.Client.Components.ByondClient.ActiveVersion()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client.html#a98f0743e5c383c7d301a4b436d298c72',1,'Tgstation.Server.Client.Components.IByondClient.ActiveVersion()']]], + ['addrequestlogger',['AddRequestLogger',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a139db37d2f5069e2940421a0cd12fd93',1,'Tgstation.Server.Client.ApiClient.AddRequestLogger()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a55853418698889c9f90804d1e9067b51',1,'Tgstation.Server.Client.IApiClient.AddRequestLogger()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html#aa06d2eb21c87b01b2d195e3125cb7ccf',1,'Tgstation.Server.Client.IServerClient.AddRequestLogger()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a5b082a51331accc1d118b549c422169a',1,'Tgstation.Server.Client.ServerClient.AddRequestLogger()']]], + ['addtestmerge',['AddTestMerge',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#a05fcb2c19ab0f43a15264431a20790ec',1,'Tgstation.Server.Host.Components.Repository.IRepository.AddTestMerge()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#ab400805727fc1130c18a878f131edce1',1,'Tgstation.Server.Host.Components.Repository.Repository.AddTestMerge()']]], + ['administrationclient',['AdministrationClient',['../class_tgstation_1_1_server_1_1_client_1_1_administration_client.html#aa5d48433766cd2f29ee60007767f5387',1,'Tgstation::Server::Client::AdministrationClient']]], + ['administrationcontroller',['AdministrationController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#aaa8e198cadcd3b26ad60708965fcee60',1,'Tgstation::Server::Host::Controllers::AdministrationController']]], + ['administrationtest',['AdministrationTest',['../class_tgstation_1_1_server_1_1_tests_1_1_administration_test.html#a20ab9f933254691d5334e3a63bb20056',1,'Tgstation::Server::Tests::AdministrationTest']]], + ['apiclient',['ApiClient',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a26be1a658c69fad22bd229863013f2f7',1,'Tgstation::Server::Client::ApiClient']]], + ['apiconflictexception',['ApiConflictException',['../class_tgstation_1_1_server_1_1_client_1_1_api_conflict_exception.html#ab4f3940b662b24b906bf15d94a0c64b9',1,'Tgstation.Server.Client.ApiConflictException.ApiConflictException()'],['../class_tgstation_1_1_server_1_1_client_1_1_api_conflict_exception.html#ac779b4eb27f674d0c804955a8bb50b4b',1,'Tgstation.Server.Client.ApiConflictException.ApiConflictException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_api_conflict_exception.html#a76b2d08f49a952c5693d785c379328e2',1,'Tgstation.Server.Client.ApiConflictException.ApiConflictException(string message, Exception innerException)']]], + ['apiconflictexception_3f_3f',['ApiConflictException??',['../class_tgstation_1_1_server_1_1_client_1_1_api_conflict_exception.html#ab1fd0da6e865a2ad994976b56696b977',1,'Tgstation::Server::Client::ApiConflictException']]], + ['apicontroller',['ApiController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#a1049f4b2b9557ea752177833ef52052e',1,'Tgstation::Server::Host::Controllers::ApiController']]], + ['apiheaders',['ApiHeaders',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#aee584e59a0c6535f1d3c60d620036253',1,'Tgstation.Server.Api.ApiHeaders.ApiHeaders(ProductHeaderValue userAgent, string token)'],['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#ac6a606d30d1bd1cf066cd8f5d917df18',1,'Tgstation.Server.Api.ApiHeaders.ApiHeaders(ProductHeaderValue userAgent, string username, string password)'],['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#aa03245a124379bec7f0eb3fc672a4e43',1,'Tgstation.Server.Api.ApiHeaders.ApiHeaders(RequestHeaders requestHeaders)'],['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a16b461300fbc981ef39230f85b680870',1,'Tgstation.Server.Api.ApiHeaders.ApiHeaders(ProductHeaderValue userAgent, string token, string username, string password)']]], + ['apimismatchexception',['ApiMismatchException',['../class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception.html#a44a164cea5981471231d38a4f6c24445',1,'Tgstation.Server.Client.ApiMismatchException.ApiMismatchException(ErrorMessage errorMessage)'],['../class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception.html#a0d331471e5b733864bda3a8991cd24f1',1,'Tgstation.Server.Client.ApiMismatchException.ApiMismatchException()'],['../class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception.html#a85117962e2ec4b4bad057bb399eee845',1,'Tgstation.Server.Client.ApiMismatchException.ApiMismatchException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_api_mismatch_exception.html#a8250a76f90fa9a5c5a9e76e0c1775300',1,'Tgstation.Server.Client.ApiMismatchException.ApiMismatchException(string message, Exception innerException)']]], + ['application',['Application',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#a50d1d37a5a6445d281a45f26f57b18a7',1,'Tgstation::Server::Host::Core::Application']]], + ['applyupdate',['ApplyUpdate',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control.html#a08e0b784b8a22398a183e759446bf5f3',1,'Tgstation.Server.Host.Core.IServerControl.ApplyUpdate()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a38345c5b5fc217b03e0142dc8513e0cd',1,'Tgstation.Server.Host.Server.ApplyUpdate()']]], + ['attachexithandler',['AttachExitHandler',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html#a69445610e0255820d0f9d471198d9bbf',1,'Tgstation::Server::Host::Core::ProcessExecutor']]], + ['authenticationcontext',['AuthenticationContext',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a238c36a23b55ce8e76b471e35600a7e3',1,'Tgstation.Server.Host.Security.AuthenticationContext.AuthenticationContext()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a997a651219197de91ceb799db4a340d2',1,'Tgstation.Server.Host.Security.AuthenticationContext.AuthenticationContext(ISystemIdentity systemIdentity, User user, InstanceUser instanceUser)']]], + ['authenticationcontextfactory',['AuthenticationContextFactory',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html#a054bf8ed411f414b4ccbd01db5d3b83b',1,'Tgstation::Server::Host::Security::AuthenticationContextFactory']]] +]; diff --git a/search/functions_1.html b/search/functions_1.html new file mode 100644 index 0000000000..bfcf880be9 --- /dev/null +++ b/search/functions_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_1.js b/search/functions_1.js new file mode 100644 index 0000000000..1825525b5e --- /dev/null +++ b/search/functions_1.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['basicwatchdog',['BasicWatchdog',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#a3887bdfaaf45e473d90b8f5e0865e8d8',1,'Tgstation::Server::Host::Components::Watchdog::BasicWatchdog']]], + ['buildmodel',['BuildModel',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_database_context_model_snapshot.html#a32d495bf8758a3f62e39f0e5e39cf2e7',1,'Tgstation.Server.Host.Models.Migrations.MySqlDatabaseContextModelSnapshot.BuildModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_database_context_model_snapshot.html#a13c592085ed6534ff12d1b1c179e06f7',1,'Tgstation.Server.Host.Models.Migrations.SqlServerDatabaseContextModelSnapshot.BuildModel()']]], + ['buildtargetmodel',['BuildTargetModel',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html#a0b50357f52fda0a140c17c0004a117ac',1,'Tgstation.Server.Host.Models.Migrations.MSInitialCreate.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html#acabe78145ddeea131efdf8e09481cc86',1,'Tgstation.Server.Host.Models.Migrations.MYInitialCreate.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html#a5d8914ad6eef1cd43ef831ef8c2eda01',1,'Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html#aca8fc216984500a0d660548a9dada3be',1,'Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html#ad82088299eaf799f643661111e1d1877',1,'Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html#a14285a0c35c5570d9bf33af7eaae5976',1,'Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html#a0b3b826dabd222a804eddd53ae93e329',1,'Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html#a9fef7b3cdc39a92a3717c1f041d85340',1,'Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.html#a97ef9497f79738d08ddcc670606412e0',1,'Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.html#a5b1cf5bef170a124e2ef5e120c056c92',1,'Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_fix_rev_info_index.html#aae18eabba1b598e6409db6aad682cc8c',1,'Tgstation.Server.Host.Models.Migrations.MSFixRevInfoIndex.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_fix_rev_info_index.html#adb8310ad88c4d5807ea21eef700ddd76',1,'Tgstation.Server.Host.Models.Migrations.MYFixRevInfoIndex.BuildTargetModel()']]], + ['byond',['Byond',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html#a3dde46060da75e3a757784489da4c810',1,'Tgstation::Server::Client::Components::ByondClient']]], + ['byondclient',['ByondClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html#a330467d91ed28edace4990dce15c6991',1,'Tgstation::Server::Client::Components::ByondClient']]], + ['byondcommand',['ByondCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html#a04c8863ccdb6d8f93c56eec22e3015d5',1,'Tgstation::Server::Host::Components::Chat::Commands::ByondCommand']]], + ['byondcontroller',['ByondController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html#a60fa22db0b488a68e33b3064cacce100',1,'Tgstation::Server::Host::Controllers::ByondController']]], + ['byondexecutablelock',['ByondExecutableLock',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.html#a7b4cba80d6e7e80dc4b912d72bb2c59f',1,'Tgstation::Server::Host::Components::Byond::ByondExecutableLock']]], + ['byondmanager',['ByondManager',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a53f179dd7a1f02a716da371710eec7a3',1,'Tgstation::Server::Host::Components::Byond::ByondManager']]], + ['byondtest',['ByondTest',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html#aea9d261dae80fdb3bf6ab8145171d46c',1,'Tgstation::Server::Tests::Instance::ByondTest']]] +]; diff --git a/search/functions_10.html b/search/functions_10.html new file mode 100644 index 0000000000..d69badf9e5 --- /dev/null +++ b/search/functions_10.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_10.js b/search/functions_10.js new file mode 100644 index 0000000000..56ed555205 --- /dev/null +++ b/search/functions_10.js @@ -0,0 +1,53 @@ +var searchData= +[ + ['ratelimit',['RateLimit',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#ae04b510fcc8e0f4cc9e380b3995e2f21',1,'Tgstation::Server::Host::Controllers::AdministrationController']]], + ['ratelimitexception',['RateLimitException',['../class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception.html#a1bd82db7496764293896d95a761a5b1c',1,'Tgstation.Server.Client.RateLimitException.RateLimitException()'],['../class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception.html#a9dc7a4a7250ba2b88698bdb27d208392',1,'Tgstation.Server.Client.RateLimitException.RateLimitException(string secondsString)'],['../class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception.html#ab30825486f294c98083fb35043f5da0a',1,'Tgstation.Server.Client.RateLimitException.RateLimitException(string message, Exception innerException)']]], + ['rawcheckout',['RawCheckout',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#ace81561f45095dabdd6969b281a2be08',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['read',['Read',['../class_tgstation_1_1_server_1_1_client_1_1_administration_client.html#a90fccaf2e24a3793a1c3892365415d63',1,'Tgstation.Server.Client.AdministrationClient.Read()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#adb77f8fd7a46572e3c1d6bd90e3e300c',1,'Tgstation.Server.Client.Components.ConfigurationClient.Read()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#afcc1957f652e164e4f2e9e05ca84bc9d',1,'Tgstation.Server.Client.Components.DreamDaemonClient.Read()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#aa2f286f3f548960f2f9f88f17eb31538',1,'Tgstation.Server.Client.Components.DreamMakerClient.Read()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.html#a8f860a7b9851f7bcffa232fcf82eb109',1,'Tgstation.Server.Client.Components.IConfigurationClient.Read()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html#a1e6a43558dcadc261304053b63476323',1,'Tgstation.Server.Client.Components.IDreamDaemonClient.Read()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html#ac0b3a15957db0648ca8425469e1983b0',1,'Tgstation.Server.Client.Components.IDreamMakerClient.Read()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html#aae3394792a75d2690ff8038cb4e8007f',1,'Tgstation.Server.Client.Components.IInstanceUserClient.Read()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#ad1b39d718a1f3e635cf7ff8e24499d66',1,'Tgstation.Server.Client.Components.InstanceUserClient.Read()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.html#a5ec2d45a88691381a86f02d6a941f912',1,'Tgstation.Server.Client.Components.IRepositoryClient.Read()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#a37e9b08107bacf7d431b64ef3051fdc3',1,'Tgstation.Server.Client.Components.RepositoryClient.Read()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client.html#a2e63dc96c5b580f348e76f014924c85f',1,'Tgstation.Server.Client.IAdministrationClient.Read()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.html#adfc947bf76c50385d043a46732cb1f75',1,'Tgstation.Server.Client.IUsersClient.Read()'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#a7b9ce7489b2a8b3e7c8453580cfe95ff',1,'Tgstation.Server.Client.UsersClient.Read()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#ad62e7c4dde34d7c7d1039bcbf03c5b72',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.Read()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.html#a32086334958bd9009ec8eda200b9a200',1,'Tgstation.Server.Host.Components.StaticFiles.IConfiguration.Read()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#a4d85bad203f0c08f4c8ff09dd783248b',1,'Tgstation.Server.Host.Controllers.AdministrationController.Read()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html#a952241db5593e5fdfe0f8c97122e097f',1,'Tgstation.Server.Host.Controllers.ByondController.Read()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#aea734bbb3778fcaeefa46f3fde7d710b',1,'Tgstation.Server.Host.Controllers.DreamDaemonController.Read()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html#a304cbb23b5628962a7436db2cda0650a',1,'Tgstation.Server.Host.Controllers.DreamMakerController.Read()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html#a756ea65062cf457109384d7ffdac05b6',1,'Tgstation.Server.Host.Controllers.InstanceUserController.Read()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html#ac22a786b37cadeadfee8b49c9f5dfb3c',1,'Tgstation.Server.Host.Controllers.JobController.Read()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html#a653aa0edb4111fe7c8e1aa6eb88f6f7d',1,'Tgstation.Server.Host.Controllers.ModelController.Read()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#ac3004cbeb4a0154b9f563a71d6c5f554',1,'Tgstation.Server.Host.Controllers.RepositoryController.Read()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#a1eacebe83e43999c75bc26be5551f6c9',1,'Tgstation.Server.Host.Controllers.UserController.Read()']]], + ['read_3c_20tresult_20_3e',['Read< TResult >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a1808561c1ec1ddac56ee78648788214c',1,'Tgstation.Server.Client.ApiClient.Read< TResult >(string route, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a90dffec712d3fea1328dd2b8cb4ce5b7',1,'Tgstation.Server.Client.ApiClient.Read< TResult >(string route, long instanceId, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#ae8bd028857ed8443176c7ac25edd18bd',1,'Tgstation.Server.Client.IApiClient.Read< TResult >(string route, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a95d05b8d2e00d2da463ec7d7e6e4e2ae',1,'Tgstation.Server.Client.IApiClient.Read< TResult >(string route, long instanceId, CancellationToken cancellationToken)']]], + ['readallbytes',['ReadAllBytes',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a8b156fb1670e0f2f74bccdf040d2661c',1,'Tgstation.Server.Host.IO.DefaultIOManager.ReadAllBytes()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a6c0856abd25ea8e2096702aae37f2b0c',1,'Tgstation.Server.Host.IO.IIOManager.ReadAllBytes()']]], + ['readfile',['ReadFile',['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.html#a19577dc573076fd58ac1d55d682d5606',1,'Tgstation.Server.Host.IO.ISynchronousIOManager.ReadFile()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.html#ae7fb6512f77a65454cf2309a1c4eccdf',1,'Tgstation.Server.Host.IO.SynchronousIOManager.ReadFile()']]], + ['readimpl',['ReadImpl',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#a833396fc76a932247c5e86e4887fd197',1,'Tgstation::Server::Host::Controllers::DreamDaemonController']]], + ['readjson',['ReadJson',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_bool_converter.html#af0c58117243eef427efccaaa308c8b02',1,'Tgstation::Server::Host::Components::Chat::Commands::BoolConverter']]], + ['readlineasync',['ReadLineAsync',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.html#ad64d553f84d31d737bd00595fe6a122f',1,'Tgstation.Server.Host.IO.Console.ReadLineAsync()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console.html#a5bdc0f5d449d520355dccb0f01cc0694',1,'Tgstation.Server.Host.IO.IConsole.ReadLineAsync()']]], + ['ready',['Ready',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#a6f74ea1c4857a9ee311133077e75cbd8',1,'Tgstation.Server.Host.Core.Application.Ready()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_application.html#a45d03e6ca2a677f358c52bc8b4fe1dca',1,'Tgstation.Server.Host.Core.IApplication.Ready()']]], + ['reattach',['Reattach',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller_factory.html#ac777b68fbfe9c7f37eb054cb1bbe3f42',1,'Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory.Reattach()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#afc88772088200c0924fdfb2373a5a6c8',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.Reattach()']]], + ['reattachinfohandler',['ReattachInfoHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html#a8f936ffcb62ef8c77edba65bf4cfd674',1,'Tgstation::Server::Host::Components::ReattachInfoHandler']]], + ['reattachinformation',['ReattachInformation',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_reattach_information.html#a644624c553fc70200479f14a8baf8b2f',1,'Tgstation.Server.Host.Components.Watchdog.ReattachInformation.ReattachInformation()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_reattach_information.html#a1ed22cba2a3f2732e762802ca4e14e40',1,'Tgstation.Server.Host.Components.Watchdog.ReattachInformation.ReattachInformation(Models.ReattachInformation copy, IDmbProvider dmb)']]], + ['reattachinformationbase',['ReattachInformationBase',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html#a662295d2f9dd1746560777809a91eec0',1,'Tgstation.Server.Host.Models.ReattachInformationBase.ReattachInformationBase()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html#adbb46135d2724b48f149ded000511f49',1,'Tgstation.Server.Host.Models.ReattachInformationBase.ReattachInformationBase(ReattachInformationBase copy)']]], + ['registercommandhandler',['RegisterCommandHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a679bc4e2665f6b95094a15ea006e5f23',1,'Tgstation.Server.Host.Components.Chat.Chat.RegisterCommandHandler()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html#a97c581c9838e82dd45f0f79f7b9b3ee9',1,'Tgstation.Server.Host.Components.Chat.IChat.RegisterCommandHandler()']]], + ['registerforrestart',['RegisterForRestart',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control.html#a35728d66030addfd5551351b8c6db942',1,'Tgstation.Server.Host.Core.IServerControl.RegisterForRestart()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a0664caef3896a16c9f668177c68002d3',1,'Tgstation.Server.Host.Server.RegisterForRestart()']]], + ['registerhandler',['RegisterHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#a5df02d9741c6b3b99d9d47be05c04faa',1,'Tgstation.Server.Host.Components.Interop.CommContext.RegisterHandler()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_context.html#a7f947ca9fe0193e1e6e66eaa31c81a93',1,'Tgstation.Server.Host.Components.Interop.ICommContext.RegisterHandler()']]], + ['registeroperation',['RegisterOperation',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager.html#a9148664a7a0e80dc4c354e5135329ded',1,'Tgstation.Server.Host.Core.IJobManager.RegisterOperation()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a921f3dc614772f50917a0171fcfd657f',1,'Tgstation.Server.Host.Core.JobManager.RegisterOperation()']]], + ['registerprocess',['RegisterProcess',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_network_prompt_reaper.html#a921378833260f01b071581f60c202286',1,'Tgstation.Server.Host.Components.Watchdog.INetworkPromptReaper.RegisterProcess()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_posix_network_prompt_reaper.html#ac45ef1ebf4ef583fa800c83f0d36ff52',1,'Tgstation.Server.Host.Components.Watchdog.PosixNetworkPromptReaper.RegisterProcess()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#a2672a5fe3947a90b600684f57291d19d',1,'Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.RegisterProcess()']]], + ['release',['Release',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a1c7d96b5137c4bcf94803b4807e2c062',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Release()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#a2f2c370c1bbc4e6378dbfe98f18353d3',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.Release()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a275f0854e7df3126d0d3a3fe390b1a13',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.Release()']]], + ['removeprovider',['RemoveProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a42d935d351ce13a9b966c1120d06de8e',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['rename',['Rename',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html#abb631d02974c1e646993ca97d4a2aec4',1,'Tgstation.Server.Host.Components.IInstance.Rename()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a7e74907bfa7882ef479670e2f7102a3f',1,'Tgstation.Server.Host.Components.Instance.Rename()']]], + ['repository',['Repository',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#a1c314570d2e4f3c0a6dfb7e8aa6c68a0',1,'Tgstation.Server.Client.Components.RepositoryClient.Repository(Routes.Repository, repository, instance.Id, cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#aa68b503106bfa0f9558c08cc8d79ec1d',1,'Tgstation.Server.Client.Components.RepositoryClient.Repository(Routes.Repository, repository ?? throw new ArgumentNullException(nameof(repository)), instance.Id, cancellationToken)'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#ad21b7cd54ab824159e7828aea9598fe3',1,'Tgstation.Server.Host.Components.Repository.Repository.Repository()']]], + ['repositoryclient',['RepositoryClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#aa7ff208124be2377aa50b40f63aad06c',1,'Tgstation::Server::Client::Components::RepositoryClient']]], + ['repositorycontroller',['RepositoryController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#ac88456f7aa7bbb54f37c6a468c102bed',1,'Tgstation::Server::Host::Controllers::RepositoryController']]], + ['repositorymanager',['RepositoryManager',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#a6ce9d92eaf8266ad98a31ee6adbc5c34',1,'Tgstation::Server::Host::Components::Repository::RepositoryManager']]], + ['requesttimeoutexception',['RequestTimeoutException',['../class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception.html#a0dd3ecf1238e3cb9c8d76dd749929ead',1,'Tgstation.Server.Client.RequestTimeoutException.RequestTimeoutException()'],['../class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception.html#a85873681c9fb67bfd55b8751ba791e5b',1,'Tgstation.Server.Client.RequestTimeoutException.RequestTimeoutException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_request_timeout_exception.html#a80635931d781eaab27edcae371a77e7c',1,'Tgstation.Server.Client.RequestTimeoutException.RequestTimeoutException(string message, Exception innerException)']]], + ['resetadminpassword',['ResetAdminPassword',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder.html#aa448dafe5d62a4314040526037449ddd',1,'Tgstation.Server.Host.Models.DatabaseSeeder.ResetAdminPassword()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_seeder.html#a753aeccc2026cd9c7c00f11dcf4b9110',1,'Tgstation.Server.Host.Models.IDatabaseSeeder.ResetAdminPassword()']]], + ['resetrebootstate',['ResetRebootState',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a8644c6835b2bff2ec93f7f7609b9fecd',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.ResetRebootState()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#adf354aa2b35f8150bcd12a6338c59956',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.ResetRebootState()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#a2859725d1805d6655be14566f9edcf00',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.ResetRebootState()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a10030d2d9fd76e199bc1ea38627c7422',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.ResetRebootState()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a8def0047dcd40c0dfccd1a58be57f938',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ResetRebootState()']]], + ['resettoorigin',['ResetToOrigin',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#ab03d183168abf3cc19f57bc47e25c5d6',1,'Tgstation.Server.Host.Components.Repository.IRepository.ResetToOrigin()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a1b591fe0be8dbc5636d96d8e9992ddbe',1,'Tgstation.Server.Host.Components.Repository.Repository.ResetToOrigin()']]], + ['resettosha',['ResetToSha',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#aa955f0aaefce1850e40eda99419fdd79',1,'Tgstation.Server.Host.Components.Repository.IRepository.ResetToSha()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a760cc043dfc2bc394b52d9d6717d7843',1,'Tgstation.Server.Host.Components.Repository.Repository.ResetToSha()']]], + ['resolvepath',['ResolvePath',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a287eaf4e73a4d64e50f1dab24c3b0d3e',1,'Tgstation.Server.Host.IO.DefaultIOManager.ResolvePath()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#aef508a4c82215e95c29aa23255fdb01c',1,'Tgstation.Server.Host.IO.IIOManager.ResolvePath()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_resolving_i_o_manager.html#a50b2302533637090939afbb9dee042ee',1,'Tgstation.Server.Host.IO.ResolvingIOManager.ResolvePath()']]], + ['resolvingiomanager',['ResolvingIOManager',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_resolving_i_o_manager.html#a4e9c20b01d6d66f04eb106365f9d7a1a',1,'Tgstation::Server::Host::IO::ResolvingIOManager']]], + ['restart',['Restart',['../class_tgstation_1_1_server_1_1_client_1_1_administration_client.html#a695a17f5dc134c529d21146c1273c58b',1,'Tgstation.Server.Client.AdministrationClient.Restart()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#ab7598c890869f71b94e6051acbc6790d',1,'Tgstation.Server.Client.Components.DreamDaemonClient.Restart()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html#adb6252aed5c2e88bc48923b1936921fd',1,'Tgstation.Server.Client.Components.IDreamDaemonClient.Restart()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client.html#a9730058c232e1f8d1917137f3445d8a3',1,'Tgstation.Server.Client.IAdministrationClient.Restart()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#a0e80e3751764c584151e51f4395efbf5',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.Restart()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a39d65944835fca058d4a4be46eaf81bd',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Restart()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#af9a8f5a5f43f7f01031650b9319fe953',1,'Tgstation.Server.Host.Controllers.DreamDaemonController.Restart()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control.html#a13dcbb02bca9b289a8bccd07a848b4b9',1,'Tgstation.Server.Host.Core.IServerControl.Restart()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#ab2114beab119e090ece99d97ef0ca9c6',1,'Tgstation.Server.Host.Server.Restart()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a3299866691a7a4ef98a42bd27b03bfba',1,'Tgstation.Server.Host.Server.Restart(Version newVersion, Exception exception)']]], + ['restartregistration',['RestartRegistration',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration.html#a4391d21de43d098a833168620dc24dc4',1,'Tgstation::Server::Host::Core::RestartRegistration']]], + ['revisioncommand',['RevisionCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html#a7958e83719218e0c15fae6210c1227b7',1,'Tgstation::Server::Host::Components::Chat::Commands::RevisionCommand']]], + ['righttotype',['RightToType',['../class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper.html#ab694cd1b9b98a6be7d79f236a71b386c',1,'Tgstation::Server::Api::Rights::RightsHelper']]], + ['rolename',['RoleName',['../class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper.html#acbf514eba48e29a2dc177eb5ae34edd7',1,'Tgstation::Server::Api::Rights::RightsHelper']]], + ['rolenames_3c_20tright_20_3e',['RoleNames< TRight >',['../class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper.html#a08d444c5eb8868e931b37f11f9071f92',1,'Tgstation::Server::Api::Rights::RightsHelper']]], + ['run',['Run',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#acada234c8af8eaa1c63a1f77a579f789',1,'Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.Run()'],['../class_tgstation_1_1_server_1_1_tests_1_1_administration_test.html#aa41c1e37002472723f7ecf389377db65',1,'Tgstation.Server.Tests.AdministrationTest.Run()'],['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html#a4d2ae0cc66117b154809223552fec33c',1,'Tgstation.Server.Tests.Instance.ByondTest.Run()'],['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test.html#a55b8c34f57fe7c608de427e277a0bbd6',1,'Tgstation.Server.Tests.Instance.ConfigurationTest.Run()'],['../class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test.html#af686ec03cb0fdb0afbb812e51497b3cf',1,'Tgstation.Server.Tests.InstanceManagerTest.Run()']]], + ['runasync',['RunAsync',['../interface_tgstation_1_1_server_1_1_host_1_1_i_server.html#adbc2845e82b03ae5d2437be1b2659f50',1,'Tgstation.Server.Host.IServer.RunAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#af29679fec3814cbd12e306090e3fcfb1',1,'Tgstation.Server.Host.Server.RunAsync()'],['../interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog.html#abe13ec45a7d7ba7db422ea661156b697',1,'Tgstation.Server.Host.Watchdog.IWatchdog.RunAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html#a3f2e5da2e83854873a9d8f986aff8f17',1,'Tgstation.Server.Host.Watchdog.Watchdog.RunAsync()'],['../class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html#a791305c44a7cad7ba787d7ee8a53019e',1,'Tgstation.Server.Tests.TestingServer.RunAsync()']]], + ['runcompilejob',['RunCompileJob',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a171140f263892237911eae056aa309c5',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['rundreammaker',['RunDreamMaker',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#ad17613397de38dcdca68b3adb1c533a7',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['runimpersonated',['RunImpersonated',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity.html#a9b525a56c704424ce14e78edcb7d003e',1,'Tgstation.Server.Host.Security.ISystemIdentity.RunImpersonated()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html#aaa070f717bb19b6d85f0253d7820bc75',1,'Tgstation.Server.Host.Security.WindowsSystemIdentity.RunImpersonated()']]], + ['runjob',['RunJob',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a8a5878703c7cc9d4686850960f305cb1',1,'Tgstation::Server::Host::Core::JobManager']]], + ['runrequest_3c_20tresult_20_3e',['RunRequest< TResult >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#afe7cf5895d2cbd54c50c27073ffd08af',1,'Tgstation::Server::Client::ApiClient']]], + ['runtests',['RunTests',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_instance_test.html#a0f9a172faa4a92e6e50186fe1e2f77fd',1,'Tgstation::Server::Tests::Instance::InstanceTest']]], + ['runwatchdog',['RunWatchdog',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a5ce97a95847cecf3650ae60f0f62d836',1,'Tgstation::Server::Host::Service::ServerService']]], + ['runwizard',['RunWizard',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#ad3c6c2c16eb62a8fc4371752ca3e8de5',1,'Tgstation::Server::Host::Core::SetupWizard']]] +]; diff --git a/search/functions_11.html b/search/functions_11.html new file mode 100644 index 0000000000..2c143588ef --- /dev/null +++ b/search/functions_11.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_11.js b/search/functions_11.js new file mode 100644 index 0000000000..2cec13678f --- /dev/null +++ b/search/functions_11.js @@ -0,0 +1,52 @@ +var searchData= +[ + ['sanitizegetpath',['SanitizeGetPath',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#ab946844da209d641f1d29dfb8ff673a9',1,'Tgstation::Server::Client::Components::ConfigurationClient']]], + ['save',['Save',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html#aeff147714497ace9d41af9ca0b788833',1,'Tgstation.Server.Host.Components.ReattachInfoHandler.Save()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_reattach_info_handler.html#a16fd365b310e3b5a2079cb8128751507',1,'Tgstation.Server.Host.Components.Watchdog.IReattachInfoHandler.Save()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a1af2fcef1f485fbb45858c4b216d38c2',1,'Tgstation.Server.Host.Models.DatabaseContext.Save()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#a27f06a42dba05daefb2ffe64bcd66070',1,'Tgstation.Server.Host.Models.IDatabaseContext.Save()']]], + ['saveconfiguration',['SaveConfiguration',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a33979a0c479a916c0c3e572f52e2914b',1,'Tgstation::Server::Host::Core::SetupWizard']]], + ['schemadowngradeforserverversion',['SchemaDowngradeForServerVersion',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#ae838bb2dc7f95d7a52682695bf3635b6',1,'Tgstation.Server.Host.Models.DatabaseContext.SchemaDowngradeForServerVersion()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#a9d7b25434b90a7340886f97924e79024',1,'Tgstation.Server.Host.Models.IDatabaseContext.SchemaDowngradeForServerVersion()']]], + ['securityword',['SecurityWord',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#a70fd03d6869f455b343650314076d498',1,'Tgstation::Server::Host::Components::Watchdog::SessionControllerFactory']]], + ['seedadminuser',['SeedAdminUser',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder.html#a33cc018d457e556f1d17f4f781cb2d2b',1,'Tgstation::Server::Host::Models::DatabaseSeeder']]], + ['seeddatabase',['SeedDatabase',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder.html#a3bac7ba8cb5d06787f6f5c79dcbd0b7f',1,'Tgstation.Server.Host.Models.DatabaseSeeder.SeedDatabase()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_seeder.html#a789999e9fefb120b8bd73334832b03eb',1,'Tgstation.Server.Host.Models.IDatabaseSeeder.SeedDatabase()']]], + ['selectfactory',['SelectFactory',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory.html#aab34ee44930736ba24aa1016b26f2d33',1,'Tgstation::Server::Host::IO::Tests::TestSymlinkFactory']]], + ['semaphoreslimcontext',['SemaphoreSlimContext',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html#a600d8d0a279d2fe17d1f48c1a1bd17d4',1,'Tgstation::Server::Host::Core::SemaphoreSlimContext']]], + ['sendasync',['SendAsync',['../class_tgstation_1_1_server_1_1_client_1_1_http_client.html#a3564ac1eca649d3318f91116a3123279',1,'Tgstation.Server.Client.HttpClient.SendAsync()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_http_client.html#a7c73a8c52b38c69ed369036d186192de',1,'Tgstation.Server.Client.IHttpClient.SendAsync()']]], + ['sendcommand',['SendCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#aa98e6de498a01067af07754cb5822ecf',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.SendCommand()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#acecb23152cbf86fc4c7e6f0e0a716aca',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.SendCommand()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a89bda875f426c81f2770f2bfc75c0b32',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.SendCommand(string command, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a2f13c5b73a38cd544431c659f6474260',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.SendCommand(string command, ushort? overridePort, CancellationToken cancellationToken)']]], + ['senddeploymentmessage',['SendDeploymentMessage',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a025d41f083d40d158d013ff5450d522e',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['sendmessage',['SendMessage',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a7b0c3e2ccae0567ff35d0c01538e9d6a',1,'Tgstation.Server.Host.Components.Chat.Chat.SendMessage()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html#a7c3b57384b915ad9f1f4c3a7ad13db7d',1,'Tgstation.Server.Host.Components.Chat.IChat.SendMessage()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#ac986f3eaca89e94c1a16d3a6392c44dd',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.SendMessage()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.html#ad0b951bd26aed974f63c3e11971eb009',1,'Tgstation.Server.Host.Components.Chat.Providers.IProvider.SendMessage()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a8bfdc6f40539bde1282c4c8c002ce7e0',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.SendMessage()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#a89fe4a51bf3659db42995a39cc607285',1,'Tgstation.Server.Host.Components.Chat.Providers.Provider.SendMessage()'],['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#a23bd1ebb88ecd7ec9ae0ae7b867a05e7',1,'Tgstation.Server.Host.NativeMethods.SendMessage()']]], + ['sendupdatemessage',['SendUpdateMessage',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ac2371187a677501230d773bb19619b76',1,'Tgstation.Server.Host.Components.Chat.Chat.SendUpdateMessage()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html#a4e5b9e98e5ba0b2cf5daf36c69d89455',1,'Tgstation.Server.Host.Components.Chat.IChat.SendUpdateMessage()']]], + ['sendwatchdogmessage',['SendWatchdogMessage',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ae3b680dea33f561c3873cb1ad89d08fb',1,'Tgstation.Server.Host.Components.Chat.Chat.SendWatchdogMessage()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html#a46a41e93326aa21f8ccefb8428b13eb3',1,'Tgstation.Server.Host.Components.Chat.IChat.SendWatchdogMessage()']]], + ['server',['Server',['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a49b3292f84ad94251345a9b9ee4fc90a',1,'Tgstation::Server::Host::Server']]], + ['serverclient',['ServerClient',['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#aeb7a24a33819012790a38d5fceb2c8bb',1,'Tgstation::Server::Client::ServerClient']]], + ['serverclientfactory',['ServerClientFactory',['../class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.html#ae72794d4ee4b75d442896ef3764d435b',1,'Tgstation::Server::Client::ServerClientFactory']]], + ['servererrorexception',['ServerErrorException',['../class_tgstation_1_1_server_1_1_client_1_1_server_error_exception.html#a3c0883bc41902cff9f2becfdb64c0d97',1,'Tgstation.Server.Client.ServerErrorException.ServerErrorException()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_error_exception.html#a8df6f788200930f5a4408062c8cd1120',1,'Tgstation.Server.Client.ServerErrorException.ServerErrorException(string html)'],['../class_tgstation_1_1_server_1_1_client_1_1_server_error_exception.html#a2426a2796880232113cfd743b1010fdb',1,'Tgstation.Server.Client.ServerErrorException.ServerErrorException(string message, Exception innerException)']]], + ['serverservice',['ServerService',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a3f4d7655e24f18f6929e48f48c79b0a2',1,'Tgstation::Server::Host::Service::ServerService']]], + ['serversidemodifications',['ServerSideModifications',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_server_side_modifications.html#a80a1a88d3e1f59d285b91563e86e2ef8',1,'Tgstation::Server::Host::Components::StaticFiles::ServerSideModifications']]], + ['serviceunavailableexception',['ServiceUnavailableException',['../class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception.html#a8969972514222281c1d3e7df4804c046',1,'Tgstation.Server.Client.ServiceUnavailableException.ServiceUnavailableException()'],['../class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception.html#a6a729a7fa03b7a6bfebf6df9935b89a5',1,'Tgstation.Server.Client.ServiceUnavailableException.ServiceUnavailableException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_service_unavailable_exception.html#a49a6d51cf0a76f247c3ea7bcc42f638f',1,'Tgstation.Server.Client.ServiceUnavailableException.ServiceUnavailableException(string message, Exception innerException)']]], + ['sessioncontroller',['SessionController',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#ae5443414944a0987591da095e20a22db',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['sessioncontrollerfactory',['SessionControllerFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#a300cbc6914bdd6dfdab7335fcea74b31',1,'Tgstation::Server::Host::Components::Watchdog::SessionControllerFactory']]], + ['setactiveversion',['SetActiveVersion',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html#a798c9e8b4b224f3a78791f765d69b304',1,'Tgstation.Server.Client.Components.ByondClient.SetActiveVersion()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client.html#a76a30723a9370f391d4ca12fb31e5c71',1,'Tgstation.Server.Client.Components.IByondClient.SetActiveVersion()']]], + ['setautoupdateinterval',['SetAutoUpdateInterval',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html#a579c48046b16d1e8af0670c89c35d016',1,'Tgstation.Server.Host.Components.IInstance.SetAutoUpdateInterval()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a9c7e2863cce30a01be66c0ce1dd07d9c',1,'Tgstation.Server.Host.Components.Instance.SetAutoUpdateInterval()']]], + ['setchannels',['SetChannels',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_json_tracking_context.html#ac408c1fd7c02c5a3e38e8dd61d81a4bd',1,'Tgstation.Server.Host.Components.Chat.IJsonTrackingContext.SetChannels()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#af8929ecaca85cb7ad4ccf7c9eab75cca',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext.SetChannels()']]], + ['setconnectionstringbuilder',['SetConnectionStringBuilder',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html#ad289a7498cd4082d22ccd610107883ea',1,'Tgstation::Server::Api::Models::Internal::ChatBot']]], + ['sethandler',['SetHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.html#a593d81a97b0b00221c098a3c04049800',1,'Tgstation::Server::Host::Components::Chat::Commands::CustomCommand']]], + ['sethighpriority',['SetHighPriority',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#aef4c7c64a5e65b145c8a1bec87ec7dce',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.SetHighPriority()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#af6e7093ca0ba5a23b92753efb585d8cc',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.SetHighPriority()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_base.html#a8b3c3113a6f911d992ec8eaf0f4bc185',1,'Tgstation.Server.Host.Core.IProcessBase.SetHighPriority()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a91e7f308841dadc4e14998d730f10557',1,'Tgstation.Server.Host.Core.Process.SetHighPriority()']]], + ['setid',['SetID',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a0266a146dbc57a7c6168533d7a7b10eb',1,'Tgstation::Server::Api::Routes']]], + ['setport',['SetPort',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a96e0eb1ff216d40c57e2c2ceb4690c54',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.SetPort()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#a83d11030bd08b307ea3a6f7bfc05284c',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.SetPort()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a25f0b56359996842163f348a227734b9',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.SetPort()']]], + ['setrebootstate',['SetRebootState',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#af1b9377a045c1a882e04a513c053e6a4',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.SetRebootState()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#ac0db66caea3d150af0eb64cb9596ee22',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.SetRebootState()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a1076b12f9e7bfa7b7bf89f97d20c6c4e',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.SetRebootState()']]], + ['setrequestheaders',['SetRequestHeaders',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a5f9f37923fe9811ceb4556af0ebfc8aa',1,'Tgstation::Server::Api::ApiHeaders']]], + ['setupwizard',['SetupWizard',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#ad0affb495878d67188e8b33f3f2f7c0f',1,'Tgstation::Server::Host::Core::SetupWizard']]], + ['setuserpassword',['SetUserPassword',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html#a0936b97992a82380047925e656b4bdae',1,'Tgstation.Server.Host.Security.CryptographySuite.SetUserPassword()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_cryptography_suite.html#aeab60aa0a0ee2cb5e2ad5dbde1983430',1,'Tgstation.Server.Host.Security.ICryptographySuite.SetUserPassword()']]], + ['setwatchdog',['SetWatchdog',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#a38465548f0041dfcd4cd148c8452f437',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.SetWatchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.html#a981e8e1ab9868dc2a02b7edbb547c0a5',1,'Tgstation.Server.Host.Components.EventConsumer.SetWatchdog()']]], + ['shutdown',['Shutdown',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#a42a57cfe50960559e8d8c2c003cb27f5',1,'Tgstation.Server.Client.Components.DreamDaemonClient.Shutdown()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html#a6dd7bcf744d8804790ece473931f378b',1,'Tgstation.Server.Client.Components.IDreamDaemonClient.Shutdown()']]], + ['sqlserverdatabasecontext',['SqlServerDatabaseContext',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context.html#a2e40ab7994079110ed29e098aa411179',1,'Tgstation::Server::Host::Models::SqlServerDatabaseContext']]], + ['standardmodelchecks',['StandardModelChecks',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html#ab8afe851bcb7261ecdc2556f1179ba4e',1,'Tgstation::Server::Host::Controllers::InstanceUserController']]], + ['start',['Start',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#a9c62e25db987e4847e6a4a8e04a72b2c',1,'Tgstation.Server.Client.Components.DreamDaemonClient.Start()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html#a97ceb0b52366f1b4ce685ef8399c44e5',1,'Tgstation.Server.Client.Components.IDreamDaemonClient.Start()']]], + ['startasync',['StartAsync',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a7b6d8a1eef58f0e3265a67ebe9036f13',1,'Tgstation.Server.Host.Components.Byond.ByondManager.StartAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a7c9cdcd6b2af7b502269aaf082832cc1',1,'Tgstation.Server.Host.Components.Chat.Chat.StartAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#aadc03e1b2349c02cb4b49d8ed421c7a4',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.StartAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a11cc04923d2557eefd57ad2ded9eb7f2',1,'Tgstation.Server.Host.Components.Instance.StartAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#aabf10dd79c9488de365bb8de0129b74b',1,'Tgstation.Server.Host.Components.InstanceFactory.StartAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#aa2bcc92fca46ad404800304ce4bdd781',1,'Tgstation.Server.Host.Components.InstanceManager.StartAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#af05de18337edc2207b60b080de230802',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.StartAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#ae30d4b582b04eb7c3ef3c5d848429bbd',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StartAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#a1ca59b3d09398b0c4f2dea44c8d06f06',1,'Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.StartAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a9c6fbf500b0a6937d1df3c807feba46f',1,'Tgstation.Server.Host.Core.JobManager.StartAsync()']]], + ['startmonitor',['StartMonitor',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a4a2930b2a0a2ae99537024bb3cd4c397',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['staticignorepath',['StaticIgnorePath',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a4a5436d55e83759de84d17871039d752',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]], + ['stopapplication',['StopApplication',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime.html#a52dc12deb9c08610b2f9de382049579f',1,'Tgstation::Server::Host::Core::Tests::TestApplication::MockApplicationLifetime']]], + ['stopasync',['StopAsync',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a691493488b449c0589784dc2f91e039b',1,'Tgstation.Server.Host.Components.Byond.ByondManager.StopAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a45fbff93d02a71183b098029c2ee9249',1,'Tgstation.Server.Host.Components.Chat.Chat.StopAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a214367e1d3118ba0535bbd398743fbec',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.StopAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a1ecc3606d7dab80f458ad0835b7151c4',1,'Tgstation.Server.Host.Components.Instance.StopAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#aad758c3c739d563f51b44b8429acadc9',1,'Tgstation.Server.Host.Components.InstanceFactory.StopAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#aaa1a2f2c9fe345546fd5f8ae27fe466b',1,'Tgstation.Server.Host.Components.InstanceManager.StopAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a33a5cd96e75dae867c113915bd6ebb27',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.StopAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#aec4f16b34fe08499a4aaff0235ecdc76',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StopAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#a484902384f4452c5e42cf529285bd6b6',1,'Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.StopAsync()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#ac9c87738bb92771ec01ff19a1d39e8a0',1,'Tgstation.Server.Host.Core.JobManager.StopAsync()']]], + ['stopmonitor',['StopMonitor',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a565b987a394c375c75b3fe14ca3f75e1',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['sychronize',['Sychronize',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#a5f8ea07e50eb3d5d272b956a6e2543b5',1,'Tgstation.Server.Host.Components.Repository.IRepository.Sychronize()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#afd7c7599794e9541d6134a30d5d7e683',1,'Tgstation.Server.Host.Components.Repository.Repository.Sychronize()']]], + ['symlinkstaticfilesto',['SymlinkStaticFilesTo',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#af7ad93cfb1c7c7718a3b1ffe3e12d42d',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.SymlinkStaticFilesTo()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.html#a255b4504ec55e9a4c006463db8aaa61e',1,'Tgstation.Server.Host.Components.StaticFiles.IConfiguration.SymlinkStaticFilesTo()']]] +]; diff --git a/search/functions_12.html b/search/functions_12.html new file mode 100644 index 0000000000..3235f8dcd2 --- /dev/null +++ b/search/functions_12.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_12.js b/search/functions_12.js new file mode 100644 index 0000000000..5f68aa593d --- /dev/null +++ b/search/functions_12.js @@ -0,0 +1,66 @@ +var searchData= +[ + ['temporarydmbprovider',['TemporaryDmbProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html#a90a2df2d992af62f3f4d47671b214473',1,'Tgstation::Server::Host::Components::Compiler::TemporaryDmbProvider']]], + ['terminate',['Terminate',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#a7fded5c4b8aeb291ad5b1797a25eee14',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.Terminate()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a49a9acdffdc9e7cd176f803b23e97ff4',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Terminate()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.html#ac670c2127fe7373939bf4d28404477b7',1,'Tgstation.Server.Host.Core.IProcess.Terminate()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a31c71a6209f43d3765441d941b177455',1,'Tgstation.Server.Host.Core.Process.Terminate()']]], + ['terminatenolock',['TerminateNoLock',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a6845304123ed975aec4de3dc79bf8551',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['testallpoweroftwo',['TestAllPowerOfTwo',['../class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests_1_1_test_rights.html#ac22b5c3b8908f9c571192d9028b04553',1,'Tgstation::Server::Api::Rights::Tests::TestRights']]], + ['testbadparameters',['TestBadParameters',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_d_b_connection_factory.html#a5b325eb91434829a6d4942af9e5d30a3',1,'Tgstation::Server::Host::Core::Tests::TestDBConnectionFactory']]], + ['testbasicparseandbuild',['TestBasicParseAndBuild',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests_1_1_test_irc_connection_string_builder.html#a959c6f0f3613155f666b3cf8a45226b8',1,'Tgstation::Server::Api::Models::Tests::TestIrcConnectionStringBuilder']]], + ['testcacheclean',['TestCacheClean',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests_1_1_test_posix_byond_installer.html#a93186b574838ef51135f2e1148578454',1,'Tgstation::Server::Host::Components::Byond::Tests::TestPosixByondInstaller']]], + ['testcancel',['TestCancel',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_async_delayer.html#aecc2560705e5f2758a12c21f740bd196',1,'Tgstation::Server::Host::Core::Tests::TestAsyncDelayer']]], + ['testcancellation',['TestCancellation',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html#ad4df9d6c934563e06a21e9d414068d85',1,'Tgstation::Server::Host::Core::Tests::TestJobHandler']]], + ['testconfigureservicesthrowswhensetupwizardconfigurationdemands',['TestConfigureServicesThrowsWhenSetupWizardConfigurationDemands',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application.html#af70c6d27fbe2bc05775f1349eb64573c',1,'Tgstation::Server::Host::Core::Tests::TestApplication']]], + ['testconnectanddisconnect',['TestConnectAndDisconnect',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests_1_1_test_discord_provider.html#aff4f133b6e583937a541a551518b98d3',1,'Tgstation::Server::Host::Components::Chat::Providers::Tests::TestDiscordProvider']]], + ['testconnectwithfaketokenfails',['TestConnectWithFakeTokenFails',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests_1_1_test_discord_provider.html#ab66eaa7dd23c1546a45d1580a2a370da',1,'Tgstation::Server::Host::Components::Chat::Providers::Tests::TestDiscordProvider']]], + ['testconstruction',['TestConstruction',['../class_tgstation_1_1_server_1_1_api_1_1_tests_1_1_test_api_headers.html#a2d664d4ac4557f482b38df8e806e1f42',1,'Tgstation.Server.Api.Tests.TestApiHeaders.TestConstruction()'],['../class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_server_client_factory.html#a0aed735a759835b91fdbf224cc342432',1,'Tgstation.Server.Client.Tests.TestServerClientFactory.TestConstruction()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests_1_1_test_posix_byond_installer.html#a869d94dba8cff790e2df8217bfaf355d',1,'Tgstation.Server.Host.Components.Byond.Tests.TestPosixByondInstaller.TestConstruction()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests_1_1_test_experimental_watchdog.html#a87e106ec9986ec46c9e6ae90cf9d74b5',1,'Tgstation.Server.Host.Components.Watchdog.Tests.TestExperimentalWatchdog.TestConstruction()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_exception.html#af3a9ba6e5aa81f2db9c2196151d03ef6',1,'Tgstation.Server.Host.Core.Tests.TestJobException.TestConstruction()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_tests_1_1_test_authentication_context.html#ac3732c1a787ae5c0167792f4460882b0',1,'Tgstation.Server.Host.Security.Tests.TestAuthenticationContext.TestConstruction()'],['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog.html#a594221e7157a53ccca141db7c4798911',1,'Tgstation.Server.Host.Watchdog.Tests.TestWatchdog.TestConstruction()']]], + ['testconstructionanddisposal',['TestConstructionAndDisposal',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_tests_1_1_test_server_service.html#a036ab68c3912f73b633f7d4f72084977',1,'Tgstation.Server.Host.Service.Tests.TestServerService.TestConstructionAndDisposal()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests_1_1_test_discord_provider.html#a2b645e425cab8f5dd00dc0ced0f0facb',1,'Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider.TestConstructionAndDisposal()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html#af79bff79c24cf82505c520b97d6a58c4',1,'Tgstation.Server.Host.Core.Tests.TestJobHandler.TestConstructionAndDisposal()']]], + ['testconstructionthrows',['TestConstructionThrows',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_database_context_factory.html#a70e790c7d0a0fc4ddf1643a9e8ac519e',1,'Tgstation.Server.Host.Core.Tests.TestDatabaseContextFactory.TestConstructionThrows()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_setup_wizard.html#a308f384fe6be8b4dc9827cf206b1bb9b',1,'Tgstation.Server.Host.Core.Tests.TestSetupWizard.TestConstructionThrows()']]], + ['testcontruction',['TestContruction',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_git_hub_client_factory.html#a133cc009980bb76619f7f69327b810ec',1,'Tgstation::Server::Host::Core::Tests::TestGitHubClientFactory']]], + ['testcorrectplatform',['TestCorrectPlatform',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_platform_identifier.html#a201e8385b86f70b48a0518c165405af7',1,'Tgstation::Server::Host::Core::Tests::TestPlatformIdentifier']]], + ['testcreatebasicclient',['TestCreateBasicClient',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_git_hub_client_factory.html#aaa4e7d0fc93c9cefa1740e94f99f797f',1,'Tgstation::Server::Host::Core::Tests::TestGitHubClientFactory']]], + ['testcreatetokenclient',['TestCreateTokenClient',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_git_hub_client_factory.html#a22a84d4e879766eb8bbd3d189ce96dd6',1,'Tgstation::Server::Host::Core::Tests::TestGitHubClientFactory']]], + ['testcreatewatchdog',['TestCreateWatchdog',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests_1_1_test_watchdog_factory.html#a7d6c9da1ecaa6e93ebe104c523d7e705',1,'Tgstation::Server::Host::Watchdog::Tests::TestWatchdogFactory']]], + ['testdelay',['TestDelay',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_async_delayer.html#ac2cad3312d896ef24eabb634cc530361',1,'Tgstation::Server::Host::Core::Tests::TestAsyncDelayer']]], + ['testdeletedirectory',['TestDeleteDirectory',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test.html#ae45683361822c5c2bec81a98f5efcfd4',1,'Tgstation::Server::Tests::Instance::ConfigurationTest']]], + ['testdeserializingbyondmodelswork',['TestDeserializingByondModelsWork',['../class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_api_client.html#ad9d319f434bbf6fe98cfdd7027ee46fe',1,'Tgstation::Server::Client::Tests::TestApiClient']]], + ['testdirectoryworks',['TestDirectoryWorks',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory.html#a45df2f421faf63b25335df35dcd4be86',1,'Tgstation::Server::Host::IO::Tests::TestSymlinkFactory']]], + ['testdownload',['TestDownload',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests_1_1_test_posix_byond_installer.html#a561c149085259cc5056a7be7960cfbf8',1,'Tgstation::Server::Host::Components::Byond::Tests::TestPosixByondInstaller']]], + ['testfailsproperly',['TestFailsProperly',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory.html#af41f0fad922e6a596d6d6d6845ba4a41',1,'Tgstation::Server::Host::IO::Tests::TestSymlinkFactory']]], + ['testfileworks',['TestFileWorks',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory.html#a34acc752c1c06d894710b13475d960b6',1,'Tgstation::Server::Host::IO::Tests::TestSymlinkFactory']]], + ['testgetrightsgeneric',['TestGetRightsGeneric',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_tests_1_1_test_authentication_context.html#a23f7177f248769cb2c1c5c0c2bf0275e',1,'Tgstation::Server::Host::Security::Tests::TestAuthenticationContext']]], + ['testingserver',['TestingServer',['../class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html#af09b16bfab8645d880d43ee3281ddf15',1,'Tgstation::Server::Tests::TestingServer']]], + ['testinstall511',['TestInstall511',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html#a4f92da17917c57d69587ca11a12fcadd',1,'Tgstation::Server::Tests::Instance::ByondTest']]], + ['testinstallbyond',['TestInstallByond',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests_1_1_test_posix_byond_installer.html#ac7aa368eed3d5f40353e87e0394be17d',1,'Tgstation::Server::Host::Components::Byond::Tests::TestPosixByondInstaller']]], + ['testjob',['TestJob',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html#ad434a57ed477eb4bf2051429e29c25ca',1,'Tgstation::Server::Host::Core::Tests::TestJobHandler']]], + ['testmerge',['TestMerge',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge.html#ae3a6a4e2db1710eb3f1d17967aa3f5d2',1,'Tgstation::Server::Host::Components::Interop::TestMerge']]], + ['testmergebase',['TestMergeBase',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.html#aed82b2a4e5e83239f18657ff4a91b65f',1,'Tgstation.Server.Api.Models.Internal.TestMergeBase.TestMergeBase()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.html#a22e08f62b7a5647d905d8b0ce7f703bd',1,'Tgstation.Server.Api.Models.Internal.TestMergeBase.TestMergeBase(TestMergeBase copy)']]], + ['testmethodthrows',['TestMethodThrows',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application.html#afca4b06950eef52231f8ca75d4f203dd',1,'Tgstation::Server::Host::Core::Tests::TestApplication']]], + ['testnoversion',['TestNoVersion',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html#ab431c20106e23ec16a217617e8c55d13',1,'Tgstation::Server::Tests::Instance::ByondTest']]], + ['testpostwrite',['TestPostWrite',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_post_write_handler.html#a49252f0ad9761cfdfa3d5380bc85d4e6',1,'Tgstation::Server::Host::IO::Tests::TestPostWriteHandler']]], + ['testprogramruns',['TestProgramRuns',['../class_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests_1_1_test_program.html#a56f5f5599724b738b11a6734900e18c4',1,'Tgstation::Server::Host::Console::Tests::TestProgram']]], + ['testprogress',['TestProgress',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html#a97e56bb94f5c3e45e4844400e7fdec11',1,'Tgstation::Server::Host::Core::Tests::TestJobHandler']]], + ['testread',['TestRead',['../class_tgstation_1_1_server_1_1_tests_1_1_administration_test.html#ae81f60b9e196bd90598f294dd45621f2',1,'Tgstation::Server::Tests::AdministrationTest']]], + ['testrun',['TestRun',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_tests_1_1_test_server_service.html#a3735824caa5b06bbcbab801947d747c6',1,'Tgstation::Server::Host::Service::Tests::TestServerService']]], + ['teststandardoperation',['TestStandardOperation',['../class_tgstation_1_1_server_1_1_tests_1_1_integration_test.html#a430665ac0722fd7d7409cf370c581e4d',1,'Tgstation::Server::Tests::IntegrationTest']]], + ['teststart',['TestStart',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests_1_1_test_dream_daemon_client.html#af8b1c419d3fe1aa263d22dfee52e78be',1,'Tgstation::Server::Client::Components::Tests::TestDreamDaemonClient']]], + ['testsuccessfullaunchandshutdown',['TestSuccessfulLaunchAndShutdown',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests_1_1_test_experimental_watchdog.html#aca4a430168a5bf6dc6867c7ba572ac7f',1,'Tgstation::Server::Host::Components::Watchdog::Tests::TestExperimentalWatchdog']]], + ['testthrowsonunix',['TestThrowsOnUnix',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_post_write_handler.html#a247091ba614a9111461e7c2d2fa48d01',1,'Tgstation::Server::Host::IO::Tests::TestPostWriteHandler']]], + ['testthrowswithnullarg',['TestThrowsWithNullArg',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_post_write_handler.html#af61e7d3fe02505140d16ec569b261758',1,'Tgstation::Server::Host::IO::Tests::TestPostWriteHandler']]], + ['testunrecognizedresponse',['TestUnrecognizedResponse',['../class_tgstation_1_1_server_1_1_client_1_1_tests_1_1_test_api_client.html#ad398fd0666210dbeb7522cc686ed5067',1,'Tgstation::Server::Client::Tests::TestApiClient']]], + ['testupdate',['TestUpdate',['../class_tgstation_1_1_server_1_1_tests_1_1_integration_test.html#a0eb292a245a9df4f7ca49ff01569fc82',1,'Tgstation::Server::Tests::IntegrationTest']]], + ['testuseragentsarevalid',['TestUserAgentsAreValid',['../class_tgstation_1_1_server_1_1_api_1_1_tests_1_1_test_api_headers.html#a724629cbd3495103aab68a8ae3952873',1,'Tgstation::Server::Api::Tests::TestApiHeaders']]], + ['testuserinteractive',['TestUserInteractive',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_console.html#a7071b079044cc63cc4f7c5425346309c',1,'Tgstation::Server::Host::IO::Tests::TestConsole']]], + ['testusestandardconfig',['TestUseStandardConfig',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions.html#a177d52de501159e5d37aaf9305808e87',1,'Tgstation::Server::Host::Core::Tests::TestServiceCollectionExtensions']]], + ['testwait',['TestWait',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html#ae660a3ee782b4145aed4faedb3e9c898',1,'Tgstation::Server::Host::Core::Tests::TestJobHandler']]], + ['testwithuserstupiditiy',['TestWithUserStupiditiy',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_setup_wizard.html#a0bead36d21a40362d823143bf0100a9b',1,'Tgstation::Server::Host::Core::Tests::TestSetupWizard']]], + ['testworks',['TestWorks',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_database_context_factory.html#a7073120c12c4009e52a7ca58c52fcc70',1,'Tgstation.Server.Host.Core.Tests.TestDatabaseContextFactory.TestWorks()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_d_b_connection_factory.html#aa6a66389ce5d8edbfc60c6c67a0ae5f5',1,'Tgstation.Server.Host.Core.Tests.TestDBConnectionFactory.TestWorks()']]], + ['testworkswithoutupdatepath',['TestWorksWithoutUpdatePath',['../class_tgstation_1_1_server_1_1_host_1_1_tests_1_1_test_server_factory.html#a1293756289f85e4d3c2dd36dfe67fe77',1,'Tgstation::Server::Host::Tests::TestServerFactory']]], + ['testworkswithupdatepath',['TestWorksWithUpdatePath',['../class_tgstation_1_1_server_1_1_host_1_1_tests_1_1_test_server_factory.html#a85be5368f83fa74e0c0438955f93ad27',1,'Tgstation::Server::Host::Tests::TestServerFactory']]], + ['testwriteline',['TestWriteLine',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_console.html#ab54ac67e46c7287fc64b07ff27d6d84a',1,'Tgstation::Server::Host::IO::Tests::TestConsole']]], + ['tgsauthorizeattribute',['TgsAuthorizeAttribute',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html#a71fd52c8f3c07624632ca72fa669aff9',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html#a56841444b636e471e28acb3fd7165372',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute(AdministrationRights requiredRights)'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html#a6103a7a1e759498a879c440554ed156e',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute(InstanceManagerRights requiredRights)'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html#a9bab142d724f39746e9b5cb3f11053eb',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute(RepositoryRights requiredRights)'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html#ab9d25ba7784171d98030af65820e31b9',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute(ByondRights requiredRights)'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html#a74a9510478d9a004288929247b99f59a',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute(DreamMakerRights requiredRights)'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html#ac602c75dd93d93f998119ede5a8a337b',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute(DreamDaemonRights requiredRights)'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html#ac4808ff26e27647d62338b4c55369bab',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute(ChatBotRights requiredRights)'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html#af81be6ff62cf941583825b5c7e8402c2',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute(ConfigurationRights requiredRights)'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_tgs_authorize_attribute.html#a075e1a5a46146957800a8461f26aaab0',1,'Tgstation.Server.Host.Controllers.TgsAuthorizeAttribute.TgsAuthorizeAttribute(InstanceUserRights requiredRights)']]], + ['timerloop',['TimerLoop',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#afb736b47a7400fb861186b8dad1c4c4c',1,'Tgstation::Server::Host::Components::Instance']]], + ['toapi',['ToApi',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.html#ac6049a16c80f49d1503935589a5e0042',1,'Tgstation.Server.Host.Models.ChatBot.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.html#a01525688d871d70d1ab28cdda6083011',1,'Tgstation.Server.Host.Models.ChatChannel.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.html#a64a9fc0f8da344e311b5b754eec10611',1,'Tgstation.Server.Host.Models.CompileJob.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html#ab477e13756ea540790df3e245e17173b',1,'Tgstation.Server.Host.Models.DreamMakerSettings.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a169bffb644b7ff7c3686c29373f662c1',1,'Tgstation.Server.Host.Models.Instance.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.html#aad0b6b9eaf0b0a9462987564aa254b68',1,'Tgstation.Server.Host.Models.InstanceUser.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html#aaea7f482968921045b73cbdaca4dd652',1,'Tgstation.Server.Host.Models.Job.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html#acff6370af1842c659c6f8ecb85dd0ea3',1,'Tgstation.Server.Host.Models.RepositorySettings.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html#a8e6f5b4375c0594f10c413c4119515b1',1,'Tgstation.Server.Host.Models.RevisionInformation.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html#ac2943458d2fc3077a6684408fb26ab09',1,'Tgstation.Server.Host.Models.TestMerge.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#a8effbd8cd0ce7ba4c72f40efc08a9b50',1,'Tgstation.Server.Host.Models.User.ToApi(bool recursive, bool showDetails)'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#a1d6fee3f42a73a1505d6d0d12d68b3d9',1,'Tgstation.Server.Host.Models.User.ToApi(bool showDetails)']]], + ['tokenfactory',['TokenFactory',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html#a2d4cbeccfd89360632899db93d7068db',1,'Tgstation::Server::Host::Security::TokenFactory']]], + ['tostring',['ToString',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder.html#a659884baa91d2aa0072ccd9da844cc1e',1,'Tgstation.Server.Api.Models.DiscordConnectionStringBuilder.ToString()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_connection_string_builder.html#aeeb97f3f4f9cc635eaa55b2e9c81ad84',1,'Tgstation.Server.Api.Models.Internal.ChatConnectionStringBuilder.ToString()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#ac2a182244a480865e560b06da8c4a152',1,'Tgstation.Server.Api.Models.IrcConnectionStringBuilder.ToString()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_launch_result.html#aae5510a59e489f095a6b7cad6cdc57ce',1,'Tgstation.Server.Host.Components.Watchdog.LaunchResult.ToString()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information.html#aad03e1fa87892c0d1e0f72ddfb5a03fe',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.ToString()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html#a16ccfcf72481ac33f4a2a2a22cb7b135',1,'Tgstation.Server.Host.Models.ReattachInformationBase.ToString()']]], + ['trackjsons',['TrackJsons',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a20ab0796f379427bc6c9e0d1a03e9688',1,'Tgstation.Server.Host.Components.Chat.Chat.TrackJsons()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html#a874403376118d4cfcf9ca78d277be9a3',1,'Tgstation.Server.Host.Components.Chat.IChat.TrackJsons()']]] +]; diff --git a/search/functions_13.html b/search/functions_13.html new file mode 100644 index 0000000000..dce66cc4ed --- /dev/null +++ b/search/functions_13.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_13.js b/search/functions_13.js new file mode 100644 index 0000000000..9575485047 --- /dev/null +++ b/search/functions_13.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['unauthorizedexception',['UnauthorizedException',['../class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception.html#ade207842b48576c6f0fb5f4ee0ef326e',1,'Tgstation.Server.Client.UnauthorizedException.UnauthorizedException()'],['../class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception.html#ab5b729c4ff826ad5fdd574db0942b8f7',1,'Tgstation.Server.Client.UnauthorizedException.UnauthorizedException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception.html#af481bddb4a0e255b1430b6e9f4b62a7e',1,'Tgstation.Server.Client.UnauthorizedException.UnauthorizedException(string message, Exception innerException)']]], + ['unrecognizedresponseexception',['UnrecognizedResponseException',['../class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html#af774506fc563e92696b477d71ab16ab4',1,'Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException(string data, HttpStatusCode statusCode)'],['../class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html#ada8a7b87eb9de50dd5b9e43b749ab1be',1,'Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException()'],['../class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html#a783856ad9431193f65c6b76381fb9990',1,'Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html#a299e46f1692182ca4c908d6bed931e00',1,'Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException(string message, Exception innerException)']]], + ['up',['Up',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html#a46e535f1b0e37230f3ae9ae2d4768719',1,'Tgstation.Server.Host.Models.Migrations.MSInitialCreate.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html#a61031d082139e9125a4ccea487d10b45',1,'Tgstation.Server.Host.Models.Migrations.MYInitialCreate.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html#afb9883f3d1ddba5f19b2b75fc92da518',1,'Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html#a277da60ba33c15814a36a2465b3a46b0',1,'Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html#aa138d5c7f89f8de85085a95492cc2fb1',1,'Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html#afedd51b63ec46e82a644d88f4655ab02',1,'Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html#a55bccf5330ee9028dcbc7545f86e81a2',1,'Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html#a911c174c70a661a00dd36c55a246649a',1,'Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.html#a8ada361967d2d91205c1c30e967972c1',1,'Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.html#a15e679e5293d3ee883366254eb384835',1,'Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_fix_rev_info_index.html#a49e73096e347803d39c81a192ffdc49e',1,'Tgstation.Server.Host.Models.Migrations.MSFixRevInfoIndex.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_fix_rev_info_index.html#a155983a13b0c593fd68e2313a42dcda9',1,'Tgstation.Server.Host.Models.Migrations.MYFixRevInfoIndex.Up()']]], + ['update',['Update',['../class_tgstation_1_1_server_1_1_client_1_1_administration_client.html#a43842f5f15ef0b33c5450accdb18609f',1,'Tgstation.Server.Client.AdministrationClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#a8f60027fc85212c9b35249cccc88d1e3',1,'Tgstation.Server.Client.Components.ChatBotsClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#a1bc64b3c8ac57f22694751cccf580f90',1,'Tgstation.Server.Client.Components.DreamDaemonClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#ae428fd6c9fad6e1d019b3ded7579c0b5',1,'Tgstation.Server.Client.Components.DreamMakerClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html#ab2356151d04b5f17d797b22dc82c6354',1,'Tgstation.Server.Client.Components.IChatBotsClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html#a9cc6c3e2db7c4491f00ff9347acfe634',1,'Tgstation.Server.Client.Components.IDreamDaemonClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html#a328b3fb9bebf37474ab554894b43eb54',1,'Tgstation.Server.Client.Components.IDreamMakerClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html#a96063a725f2be7f6891ab46e66e7006b',1,'Tgstation.Server.Client.Components.IInstanceUserClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#adf513d69fe64d03119446eba42df5250',1,'Tgstation.Server.Client.Components.InstanceUserClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.html#a24995226be87730e9b7d49d6c53f5b2c',1,'Tgstation.Server.Client.Components.IRepositoryClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#a718c5e27cfe0ddbfcc9c0746ec16a6e0',1,'Tgstation.Server.Client.Components.RepositoryClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client.html#a666df801432630c494c916d35834a38b',1,'Tgstation.Server.Client.IAdministrationClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html#a337b3e0676570d2ba2928b0d2cef5595',1,'Tgstation.Server.Client.IInstanceManagerClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#aed0303f71e96db6fa88fc10cdfb196d3',1,'Tgstation.Server.Client.InstanceManagerClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.html#aecbd14842867cfdce083b793f91ab14e',1,'Tgstation.Server.Client.IUsersClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#a89d2d761849b9b8f2932920841d996e1',1,'Tgstation.Server.Client.UsersClient.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#a40caa3e1b29a3de1e7e7a4e131ca9f2d',1,'Tgstation.Server.Host.Controllers.AdministrationController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html#ad07b67c1ae0820a03abf7298a84a7c2a',1,'Tgstation.Server.Host.Controllers.ByondController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html#a89f50a9a23fd57a4bfcec0334a1b185f',1,'Tgstation.Server.Host.Controllers.ChatController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#a491c50407160ee87a06015b9d096cb8f',1,'Tgstation.Server.Host.Controllers.ConfigurationController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#a8cee89ced886340c58a9345cf2e7ad78',1,'Tgstation.Server.Host.Controllers.DreamDaemonController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html#af08a424065abb1a672b1349839136a5d',1,'Tgstation.Server.Host.Controllers.DreamMakerController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a813ab8ed0c6ef7ad5af02f70e899add1',1,'Tgstation.Server.Host.Controllers.InstanceController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html#a565dd9da819ea79d6c1de133877cd8dd',1,'Tgstation.Server.Host.Controllers.InstanceUserController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html#a2bc81566ec1a9690d2feabf1a7dec0d4',1,'Tgstation.Server.Host.Controllers.ModelController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#a49f03b0091b65ab1fa7349d2b65a8b22',1,'Tgstation.Server.Host.Controllers.RepositoryController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#a96e07e4cf2101eeaba70987a9e03600b',1,'Tgstation.Server.Host.Controllers.UserController.Update()']]], + ['update_3c_20tbody_20_3e',['Update< TBody >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a92a748d5262e33c6ece011016d780c35',1,'Tgstation.Server.Client.ApiClient.Update< TBody >()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a036ef64cf33e776c9042fa59aecbc9ba',1,'Tgstation.Server.Client.IApiClient.Update< TBody >()']]], + ['update_3c_20tbody_2c_20tresult_20_3e',['Update< TBody, TResult >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#aeba489d6ab822da7fe59b46cf0cb2ad4',1,'Tgstation.Server.Client.ApiClient.Update< TBody, TResult >(string route, TBody body, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a7c36add8f2943a7505b20213322be406',1,'Tgstation.Server.Client.ApiClient.Update< TBody, TResult >(string route, TBody body, long instanceId, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a1573e017176db0b603a72944c5373e12',1,'Tgstation.Server.Client.IApiClient.Update< TBody, TResult >(string route, TBody body, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#aed63658d4aa92fc6c6860bab59bb1b2d',1,'Tgstation.Server.Client.IApiClient.Update< TBody, TResult >(string route, TBody body, long instanceId, CancellationToken cancellationToken)']]], + ['update_3c_20tresult_20_3e',['Update< TResult >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#afe91cd24b8b838c9e80e8165c393502c',1,'Tgstation.Server.Client.ApiClient.Update< TResult >()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a2c07a344cb71a5194c90be0b7d71c0bf',1,'Tgstation.Server.Client.IApiClient.Update< TResult >()']]], + ['usecancelledrequestsuppression',['UseCancelledRequestSuppression',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application_builder_extensions.html#a0c686b1b50f2678e17eada51a8149dd1',1,'Tgstation::Server::Host::Core::ApplicationBuilderExtensions']]], + ['usecontext',['UseContext',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_database_context_factory.html#a070ab00030c7e39c32bc4da58df7f114',1,'Tgstation.Server.Host.Core.DatabaseContextFactory.UseContext()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_database_context_factory.html#a80fb6478df6bf246d703cd80f920eabd',1,'Tgstation.Server.Host.Core.IDatabaseContextFactory.UseContext()']]], + ['usedbconflicthandling',['UseDbConflictHandling',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application_builder_extensions.html#aca3ed141beb5a8e4d82767043f87ff67',1,'Tgstation::Server::Host::Core::ApplicationBuilderExtensions']]], + ['useexecutables',['UseExecutables',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a3767b16e9f00578e385dcca6b7e6b816',1,'Tgstation.Server.Host.Components.Byond.ByondManager.UseExecutables()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_manager.html#ae897f63dc75160c7378292be017a50b1',1,'Tgstation.Server.Host.Components.Byond.IByondManager.UseExecutables()']]], + ['usemysqlmigrations',['UseMySQLMigrations',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a1ee865fd988335db6c17c69af5fdfae2',1,'Tgstation.Server.Host.Models.DatabaseContext.UseMySQLMigrations()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_my_sql_database_context.html#a0a0f59db7bff22ff20ce4a9490d9848d',1,'Tgstation.Server.Host.Models.MySqlDatabaseContext.UseMySQLMigrations()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context.html#a01267b79be35689bff79854ebcbfcdee',1,'Tgstation.Server.Host.Models.SqlServerDatabaseContext.UseMySQLMigrations()']]], + ['user',['User',['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#ac78f83e6537e2744d0e746646c553db9',1,'Tgstation.Server.Client.UsersClient.User(Routes.User, user ?? throw new ArgumentNullException(nameof(user)), cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#ac78f83e6537e2744d0e746646c553db9',1,'Tgstation.Server.Client.UsersClient.User(Routes.User, user ?? throw new ArgumentNullException(nameof(user)), cancellationToken)']]], + ['usercontroller',['UserController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#a972194803b6ad32f7be555b9ea93e961',1,'Tgstation::Server::Host::Controllers::UserController']]], + ['usersclient',['UsersClient',['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#aa7e771fad86b68de8483944e9f34a88e',1,'Tgstation::Server::Client::UsersClient']]], + ['usestandardconfig_3c_20tconfig_20_3e',['UseStandardConfig< TConfig >',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_service_collection_extensions.html#aaaeb4b719a842807644dd84a49102ec2',1,'Tgstation::Server::Host::Core::ServiceCollectionExtensions']]] +]; diff --git a/search/functions_14.html b/search/functions_14.html new file mode 100644 index 0000000000..4c663fa5a0 --- /dev/null +++ b/search/functions_14.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_14.js b/search/functions_14.js new file mode 100644 index 0000000000..35dde7091d --- /dev/null +++ b/search/functions_14.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['validateconfigrelativepath',['ValidateConfigRelativePath',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a3947ddcc7baa1a6c536a0db65766c7cb',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]], + ['validateproviderchanneltypes',['ValidateProviderChannelTypes',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_bot.html#a8f3524dcce53f320de9b210334928a06',1,'Tgstation::Server::Api::Models::ChatBot']]], + ['verifyapi',['VerifyApi',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a6b1b0acd68c4d63979ed353ba14aea34',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['version',['Version',['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html#a3bebba1e2658a94424e66713bf1085c4',1,'Tgstation.Server.Client.IServerClient.Version()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a8c853236fdd5679440d5ba7a1289012e',1,'Tgstation.Server.Client.ServerClient.Version()']]], + ['versioncommand',['VersionCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.html#a61bbb0ce50b6f9cf1a1925596adfb294',1,'Tgstation::Server::Host::Components::Chat::Commands::VersionCommand']]], + ['versionkey',['VersionKey',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a02c588c08d51d013fa4e6c5258478352',1,'Tgstation::Server::Host::Components::Byond::ByondManager']]] +]; diff --git a/search/functions_15.html b/search/functions_15.html new file mode 100644 index 0000000000..071f6c4f7b --- /dev/null +++ b/search/functions_15.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_15.js b/search/functions_15.js new file mode 100644 index 0000000000..09910f7292 --- /dev/null +++ b/search/functions_15.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['wait',['Wait',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html#a8139e340599a1bb5d3c0862c20072835',1,'Tgstation::Server::Host::Core::JobHandler']]], + ['waitforjobcompletion',['WaitForJobCompletion',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager.html#aa07b23b3ce401447337f4b026c34a77d',1,'Tgstation.Server.Host.Core.IJobManager.WaitForJobCompletion()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a63a8e2fe5a07e8e8c040e555a5d13d4d',1,'Tgstation.Server.Host.Core.JobManager.WaitForJobCompletion()']]], + ['watchdog',['Watchdog',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html#ada6c36ef01a0cdaf67ea13a350c3f073',1,'Tgstation::Server::Host::Watchdog::Watchdog']]], + ['watchdogbase',['WatchdogBase',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a5c2c1bb8436c02ba40fde598cb4e2adb',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['watchdogfactory',['WatchdogFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#a1541cf972ae3dd6f7994370e504406c4',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogFactory']]], + ['watchdogreattachinformation',['WatchdogReattachInformation',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information.html#a685125da2ce331a3d10b18f2cab69751',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.WatchdogReattachInformation()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information.html#a47f01052dee4f437b36b579f7a1555de',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.WatchdogReattachInformation(Models.WatchdogReattachInformation copy, IDmbProvider dmbAlpha, IDmbProvider dmbBravo)']]], + ['watchdogreattachinformationbase',['WatchdogReattachInformationBase',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base.html#a2cf4943c9af899af0fbf1cde28512830',1,'Tgstation.Server.Host.Models.WatchdogReattachInformationBase.WatchdogReattachInformationBase()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base.html#ad9e940062a22166a256203a5b7ffd3e3',1,'Tgstation.Server.Host.Models.WatchdogReattachInformationBase.WatchdogReattachInformationBase(WatchdogReattachInformationBase copy)']]], + ['windowsbyondinstaller',['WindowsByondInstaller',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#acc9243154bedd29521dfbd1138b999bb',1,'Tgstation::Server::Host::Components::Byond::WindowsByondInstaller']]], + ['windowsnetworkpromptreaper',['WindowsNetworkPromptReaper',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#aa56ce0bc468ca1bb1c97b1abc62da72d',1,'Tgstation::Server::Host::Components::Watchdog::WindowsNetworkPromptReaper']]], + ['windowssystemidentity',['WindowsSystemIdentity',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html#a6b20afd81a3b07e0ef1f89fc134652ad',1,'Tgstation.Server.Host.Security.WindowsSystemIdentity.WindowsSystemIdentity(WindowsIdentity identity)'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html#a8a3ea6f579bf33bbba407c615140998d',1,'Tgstation.Server.Host.Security.WindowsSystemIdentity.WindowsSystemIdentity(UserPrincipal userPrincipal)']]], + ['windowssystemidentityfactory',['WindowsSystemIdentityFactory',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.html#a46f081a94982769acd01d0fdee271b40',1,'Tgstation::Server::Host::Security::WindowsSystemIdentityFactory']]], + ['withtoken',['WithToken',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_task_extensions.html#ac1bcd0420999580b9e6ef655b0fa094b',1,'Tgstation::Server::Host::Core::TaskExtensions']]], + ['withtoken_3c_20t_20_3e',['WithToken< T >',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_task_extensions.html#aa285d2d01082dbf1388134564c4a2252',1,'Tgstation::Server::Host::Core::TaskExtensions']]], + ['write',['Write',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#a7623081b4c09cf5f7679989cf73c7003',1,'Tgstation.Server.Client.Components.ConfigurationClient.Write()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.html#ae72948a1a0f52e1a84b0e430c1984e4b',1,'Tgstation.Server.Client.Components.IConfigurationClient.Write()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#ac6f986527806a782c0bea1ab51d7f0ad',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.Write()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.html#aa5244c05dd19f32a6f3603b5ca4fd638',1,'Tgstation.Server.Host.Components.StaticFiles.IConfiguration.Write()']]], + ['writeallbytes',['WriteAllBytes',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#adfa411bbedf8ffc430cb9fcf0a6e6fe4',1,'Tgstation.Server.Host.IO.DefaultIOManager.WriteAllBytes()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#af3e7a63cedbe826cfd27f1a2a411103e',1,'Tgstation.Server.Host.IO.IIOManager.WriteAllBytes()']]], + ['writeasync',['WriteAsync',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.html#aa038503e15f044245a1a0d30b0de1b6d',1,'Tgstation.Server.Host.IO.Console.WriteAsync()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console.html#af9dd7697e9f6a0f4a62567e28cd6c470',1,'Tgstation.Server.Host.IO.IConsole.WriteAsync()']]], + ['writefilechecked',['WriteFileChecked',['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.html#a66e6e18e2e313165e390361b77465f65',1,'Tgstation.Server.Host.IO.ISynchronousIOManager.WriteFileChecked()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.html#a74a681b01f42d65b5bc6e10ad73541c1',1,'Tgstation.Server.Host.IO.SynchronousIOManager.WriteFileChecked()']]], + ['writejson',['WriteJson',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_bool_converter.html#ad941960ec0d37be4e058c86718ade113',1,'Tgstation::Server::Host::Components::Chat::Commands::BoolConverter']]] +]; diff --git a/search/functions_16.html b/search/functions_16.html new file mode 100644 index 0000000000..185f971028 --- /dev/null +++ b/search/functions_16.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_16.js b/search/functions_16.js new file mode 100644 index 0000000000..674a0ec057 --- /dev/null +++ b/search/functions_16.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['ziptodirectory',['ZipToDirectory',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a8905a0a82326cf61f67ba1ec1eccb0e2',1,'Tgstation.Server.Host.IO.DefaultIOManager.ZipToDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a839873a83e4a687821fbc3d28619f851',1,'Tgstation.Server.Host.IO.IIOManager.ZipToDirectory()']]] +]; diff --git a/search/functions_17.html b/search/functions_17.html new file mode 100644 index 0000000000..6f92cf7ad8 --- /dev/null +++ b/search/functions_17.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_17.js b/search/functions_17.js new file mode 100644 index 0000000000..be93a1989d --- /dev/null +++ b/search/functions_17.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['_7esemaphoreslimcontext',['~SemaphoreSlimContext',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html#a38494639c16b57de63e6af91f2841a12',1,'Tgstation::Server::Host::Core::SemaphoreSlimContext']]], + ['_7esessioncontroller',['~SessionController',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a7f46b2c7656e21490605024f8dec30c5',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]] +]; diff --git a/search/functions_2.html b/search/functions_2.html new file mode 100644 index 0000000000..2b44474ed7 --- /dev/null +++ b/search/functions_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_2.js b/search/functions_2.js new file mode 100644 index 0000000000..6e740c2448 --- /dev/null +++ b/search/functions_2.js @@ -0,0 +1,92 @@ +var searchData= +[ + ['cachesystemidentity',['CacheSystemIdentity',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html#acbbad46e8e5ac5cae600edce613f9cf5',1,'Tgstation.Server.Host.Security.IdentityCache.CacheSystemIdentity()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_identity_cache.html#a40f3695ec18d3df1bea7b230b75dabbb',1,'Tgstation.Server.Host.Security.IIdentityCache.CacheSystemIdentity()']]], + ['cancel',['Cancel',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client.html#a060a731a0c221146d5d81d7890e1cd42',1,'Tgstation.Server.Client.Components.IJobsClient.Cancel()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html#a50456aace539b2c54afc8f8218278c49',1,'Tgstation.Server.Client.Components.JobsClient.Cancel()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html#a7f721c0a92fc49009e811ee7615a9ce7',1,'Tgstation.Server.Host.Core.JobHandler.Cancel()']]], + ['canceljob',['CancelJob',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager.html#af5028bbb3b3a9bc9f6ed0052603e6fda',1,'Tgstation.Server.Host.Core.IJobManager.CancelJob()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a6788fc1c0b89ad7bd5b1b08e5cd3c5c0',1,'Tgstation.Server.Host.Core.JobManager.CancelJob()']]], + ['canconvert',['CanConvert',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_bool_converter.html#adad719823d31566cc209bc717c5ccc55',1,'Tgstation::Server::Host::Components::Chat::Commands::BoolConverter']]], + ['changechannels',['ChangeChannels',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a2e51d14e66a9be0de64dd55feadb9e7d',1,'Tgstation.Server.Host.Components.Chat.Chat.ChangeChannels()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html#ac0cee4adb5e625763dc8829922e20afe',1,'Tgstation.Server.Host.Components.Chat.IChat.ChangeChannels()']]], + ['changesettings',['ChangeSettings',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ad9805fbf5079c35993641c458d697566',1,'Tgstation.Server.Host.Components.Chat.Chat.ChangeSettings()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html#af5fac12babaf773ee5bc457bc7eaeeda',1,'Tgstation.Server.Host.Components.Chat.IChat.ChangeSettings()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#afab0aa088dc77e54e978c730645d8d00',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.ChangeSettings()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a390fcde5ed6ed30d6e5b5b2ebc8273dc',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ChangeSettings()']]], + ['changeversion',['ChangeVersion',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a391255ccc37ff793820297d7939c31a0',1,'Tgstation.Server.Host.Components.Byond.ByondManager.ChangeVersion()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_manager.html#a04ad9b7aeb3bf8b080dd54a396a7911c',1,'Tgstation.Server.Host.Components.Byond.IByondManager.ChangeVersion()']]], + ['chat',['Chat',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a2b3416bb9a400628d5de0737b0649ef0',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['chatbot',['ChatBot',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#aa8342c38e2ed6d4290be11a1dfd906d5',1,'Tgstation.Server.Client.Components.ChatBotsClient.ChatBot(Routes.Chat, settings ?? throw new ArgumentNullException(nameof(settings)), instance.Id, cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#aa8342c38e2ed6d4290be11a1dfd906d5',1,'Tgstation.Server.Client.Components.ChatBotsClient.ChatBot(Routes.Chat, settings ?? throw new ArgumentNullException(nameof(settings)), instance.Id, cancellationToken)']]], + ['chatbotsclient',['ChatBotsClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#a322c40d10b0b8b65802c71a899a555d9',1,'Tgstation::Server::Client::Components::ChatBotsClient']]], + ['chatcontroller',['ChatController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html#aeb8a6d7b46b068d26e685b7b22e78cb4',1,'Tgstation::Server::Host::Controllers::ChatController']]], + ['chatfactory',['ChatFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html#a42579d851d612e220ec567b406b525ad',1,'Tgstation::Server::Host::Components::Chat::ChatFactory']]], + ['checkavailable',['CheckAvailable',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.html#a6556df91ef25960c814f583b71996a9f',1,'Tgstation::Server::Host::IO::Console']]], + ['checkcompatibility',['CheckCompatibility',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a3c5df000903796a032fe6a4cafdc8a73',1,'Tgstation::Server::Api::ApiHeaders']]], + ['checkdisposed',['CheckDisposed',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#ab0dfcae37e616a35d85fce7af3e432d8',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['checkexceptionpropagation',['CheckExceptionPropagation',['../class_tgstation_1_1_server_1_1_host_1_1_server.html#adc61d0d2d0cae4ed8a883db99ebe40e5',1,'Tgstation::Server::Host::Server']]], + ['checkgetjob',['CheckGetJob',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a74dc6e77d6d90a69742eb982f98ed7c8',1,'Tgstation::Server::Host::Core::JobManager']]], + ['checklaunchresult',['CheckLaunchResult',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a96ad9302ae812f4ba3bbbaed2f7adbd0',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['checkoutobject',['CheckoutObject',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#ab069c1ee11c48955e51956ff31a0d0fc',1,'Tgstation.Server.Host.Components.Repository.IRepository.CheckoutObject()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a26b2fb935f0fd74a479231085029ce86',1,'Tgstation.Server.Host.Components.Repository.Repository.CheckoutObject()']]], + ['checkoutprogresshandler',['CheckoutProgressHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#ae8ee5ac2942a57e05ec5c7e238e75977',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['checkreleasesandapplyupdate',['CheckReleasesAndApplyUpdate',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#a136149ffd1e19c77776bf08ad6f019d8',1,'Tgstation::Server::Host::Controllers::AdministrationController']]], + ['checkrunwizard',['CheckRunWizard',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_setup_wizard.html#af7ba7d5740fede2bc7d52977afbd1832',1,'Tgstation.Server.Host.Core.ISetupWizard.CheckRunWizard()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#ac1d5103c18b9b1ae0cee11fd61cf4417',1,'Tgstation.Server.Host.Core.SetupWizard.CheckRunWizard()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_setup_wizard.html#a50972281286613e25958de1e126c86c9',1,'Tgstation.Server.Host.Core.Tests.TestApplication.MockSetupWizard.CheckRunWizard()']]], + ['checksanity',['CheckSanity',['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a5307337e3bb84c45327e8a856b7f425f',1,'Tgstation::Server::Host::Server']]], + ['checkuserpassword',['CheckUserPassword',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html#a020220485dde96985ea6bfe224a85d89',1,'Tgstation.Server.Host.Security.CryptographySuite.CheckUserPassword()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_cryptography_suite.html#ac23fd656dc42cf07e64a62844f8bcfbc',1,'Tgstation.Server.Host.Security.ICryptographySuite.CheckUserPassword()']]], + ['claimsinjector',['ClaimsInjector',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_claims_injector.html#aaa5f275fb556a0382b8f6aec8368ea8d',1,'Tgstation::Server::Host::Security::ClaimsInjector']]], + ['cleancache',['CleanCache',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.html#ad014a7849a1246dc316a9ac3d8a43d16',1,'Tgstation.Server.Host.Components.Byond.IByondInstaller.CleanCache()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#a3d5968bc5509ef349f1176a60ac7e454',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.CleanCache()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a9de74791dbf6de45fb27c97e51805b8c',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.CleanCache()']]], + ['cleanjob',['CleanJob',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a9fcc5356395c5a07696851c9af4dbaf9',1,'Tgstation::Server::Host::Components::Compiler::DmbFactory']]], + ['cleanunusedcompilejobs',['CleanUnusedCompileJobs',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a1cb27242b1748b76daa1483fbde65f60',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.CleanUnusedCompileJobs()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory.html#a7180d98f1dcb2905732e8bbb9c577cc4',1,'Tgstation.Server.Host.Components.Compiler.IDmbFactory.CleanUnusedCompileJobs()']]], + ['cleanupfailedcompile',['CleanupFailedCompile',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#ac455ab29e61b229885cdc8730f7cab9b',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['client_5fmessagereceived',['Client_MessageReceived',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#a3866a830f4cedcfdc6b2d1ca7e87ab4d',1,'Tgstation::Server::Host::Components::Chat::Providers::DiscordProvider']]], + ['client_5fonchannelmessage',['Client_OnChannelMessage',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#ad5b2c312d6d9703edbeb60825cfb1602',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]], + ['client_5fonquerymessage',['Client_OnQueryMessage',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a6709ea88022cc7f1ed175e5f863e79c9',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]], + ['clientexception',['ClientException',['../class_tgstation_1_1_server_1_1_client_1_1_client_exception.html#aa609a0cde59451054984705078125700',1,'Tgstation.Server.Client.ClientException.ClientException()'],['../class_tgstation_1_1_server_1_1_client_1_1_client_exception.html#a9195a6bc325e3df79e9ae9490c90a0a4',1,'Tgstation.Server.Client.ClientException.ClientException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_client_exception.html#a8864363a43d30e891b54cc46d75bdce4',1,'Tgstation.Server.Client.ClientException.ClientException(string message, Exception innerException)']]], + ['clientexception_3f_3f_3f',['ClientException???',['../class_tgstation_1_1_server_1_1_client_1_1_client_exception.html#a979138c473a6d3d7538c62f750ac6e3f',1,'Tgstation::Server::Client::ClientException']]], + ['clone',['Clone',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.html#ad1443ff74ddf28de61129c0c98e2abc2',1,'Tgstation.Server.Client.Components.IRepositoryClient.Clone()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#a5e84a3b8d18e965718b2c37386c6aede',1,'Tgstation.Server.Client.Components.RepositoryClient.Clone()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity.html#a1cb40673b65fa830543c69461449953a',1,'Tgstation.Server.Host.Security.ISystemIdentity.Clone()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html#aa3df6c34f2e2c1a5755b21595bc6f1a5',1,'Tgstation.Server.Host.Security.WindowsSystemIdentity.Clone()']]], + ['clonemetadata',['CloneMetadata',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html#af41bc4f3fadb8aa31a7d2950f1906383',1,'Tgstation::Server::Api::Models::Instance']]], + ['clonerepository',['CloneRepository',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository_manager.html#acf22ca7387254203fcd8a8e2a9947f0a',1,'Tgstation.Server.Host.Components.Repository.IRepositoryManager.CloneRepository()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#a6df16cc693419c0e3919e46250a40cf8',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.CloneRepository()']]], + ['commandfactory',['CommandFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#aa195d342dbe8a6dbbb2294f15cbe09c0',1,'Tgstation::Server::Host::Components::Chat::Commands::CommandFactory']]], + ['commcontext',['CommContext',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#a9fb9b0ef078701162f9a307bf04af648',1,'Tgstation::Server::Host::Components::Interop::CommContext']]], + ['compatible',['Compatible',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a305abd5b6b16230fb32f779af0a07d61',1,'Tgstation::Server::Api::ApiHeaders']]], + ['compile',['Compile',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#af9d90085714117a3109d6f7af3fdc1cc',1,'Tgstation.Server.Client.Components.DreamMakerClient.Compile()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html#a548a8f4daed30ab49f77a23b1c125078',1,'Tgstation.Server.Client.Components.IDreamMakerClient.Compile()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#ac71b166a45e54e668865ba55c3a37041',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.Compile()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dream_maker.html#a74305b91312055e9932cf66b8b05c6d1',1,'Tgstation.Server.Host.Components.Compiler.IDreamMaker.Compile()']]], + ['compileprocess',['CompileProcess',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html#abf2c616c3ac6205bdfea350d2bbea222',1,'Tgstation.Server.Host.Components.IInstance.CompileProcess()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#abbd348ec39811a75b5b29d59f7b0c837',1,'Tgstation.Server.Host.Components.Instance.CompileProcess()']]], + ['concatpath',['ConcatPath',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#abd68930642dbf40df272b35dc438312e',1,'Tgstation.Server.Host.IO.DefaultIOManager.ConcatPath()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a286f4eb5c679683b7e519847a6c3574e',1,'Tgstation.Server.Host.IO.IIOManager.ConcatPath()']]], + ['configuration',['Configuration',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#ae5932bea40716ebcc3145ccfd2c48aa3',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]], + ['configurationclient',['ConfigurationClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#aed092908af675dfdec16528492815010',1,'Tgstation::Server::Client::Components::ConfigurationClient']]], + ['configurationcontroller',['ConfigurationController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#a9ed3e9d430a0a4dbe5b2a3e3298089ca',1,'Tgstation::Server::Host::Controllers::ConfigurationController']]], + ['configurationfile',['ConfigurationFile',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#a60002e47d604a7189fea03b3a4720787',1,'Tgstation.Server.Client.Components.ConfigurationClient.ConfigurationFile(Routes.Configuration, directory, instance.Id, cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#a804b1608adc364d167bf1224e4490642',1,'Tgstation.Server.Client.Components.ConfigurationClient.ConfigurationFile(Routes.Configuration, file ?? throw new ArgumentNullException(nameof(file)), instance.Id, cancellationToken)']]], + ['configurationtest',['ConfigurationTest',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test.html#a80083c87de2b165124b6c6953b2ee0b8',1,'Tgstation::Server::Tests::Instance::ConfigurationTest']]], + ['configure',['Configure',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#ab90a6ff592e181685e3d31cca74200cb',1,'Tgstation::Server::Host::Core::Application']]], + ['configurecontrolpanel',['ConfigureControlPanel',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a7e1172bb615dad9313a2c003dc4b6ecb',1,'Tgstation::Server::Host::Core::SetupWizard']]], + ['configuredatabase',['ConfigureDatabase',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a183509bedc6c64025be09ed2a449dc28',1,'Tgstation::Server::Host::Core::SetupWizard']]], + ['configuregeneral',['ConfigureGeneral',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#aa2fcb84250b683e9ae517a7d3f965617',1,'Tgstation::Server::Host::Core::SetupWizard']]], + ['configurelogging',['ConfigureLogging',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a7dd99f9a874086509e1c0517fbaa8033',1,'Tgstation::Server::Host::Core::SetupWizard']]], + ['configureservices',['ConfigureServices',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#aceaab5ce98c719a556d7e9af25d0da81',1,'Tgstation::Server::Host::Core::Application']]], + ['conflictexception',['ConflictException',['../class_tgstation_1_1_server_1_1_client_1_1_conflict_exception.html#a1712ba2a2c9c17fd749f7afc9d096df1',1,'Tgstation.Server.Client.ConflictException.ConflictException(ErrorMessage errorMessage, HttpStatusCode statusCode)'],['../class_tgstation_1_1_server_1_1_client_1_1_conflict_exception.html#a6f35d432dfaab891a7652e2fc636c258',1,'Tgstation.Server.Client.ConflictException.ConflictException()'],['../class_tgstation_1_1_server_1_1_client_1_1_conflict_exception.html#a5577bc93af2abe799a86b0c383902ea2',1,'Tgstation.Server.Client.ConflictException.ConflictException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_conflict_exception.html#a08028d33db9e62104c77df9ef3f673af',1,'Tgstation.Server.Client.ConflictException.ConflictException(string message, Exception innerException)']]], + ['connect',['Connect',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#ae0ae6a98f9e73c337f6b4fca3791df76',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Connect()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.html#a78705214e55337f3970869e3fcabb502',1,'Tgstation.Server.Host.Components.Chat.Providers.IProvider.Connect()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a5db89afa73a4637471b476a2e534861d',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Connect()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#affce280626a132f2e2a2731946e39a0c',1,'Tgstation.Server.Host.Components.Chat.Providers.Provider.Connect()']]], + ['connected',['Connected',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a14aac9b9fe6d650e938af7ec023f4147',1,'Tgstation.Server.Host.Components.Chat.Chat.Connected()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html#a975213a6544826725fa975bbf4485db0',1,'Tgstation.Server.Host.Components.Chat.IChat.Connected()']]], + ['convertapichatchannel',['ConvertApiChatChannel',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html#a30fce4a18499c3c89b4b153b9805ce85',1,'Tgstation::Server::Host::Controllers::ChatController']]], + ['copydirectory',['CopyDirectory',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#ac24671c0d1ce1f6787304c5f4bcccf7c',1,'Tgstation.Server.Host.IO.DefaultIOManager.CopyDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#aab4ec78e2b2d66ad39642ed92a66250c',1,'Tgstation.Server.Host.IO.IIOManager.CopyDirectory()']]], + ['copydirectoryimpl',['CopyDirectoryImpl',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a32ca1367eadecb45e671aa509f3ce058',1,'Tgstation::Server::Host::IO::DefaultIOManager']]], + ['copydmfilesto',['CopyDMFilesTo',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#ab1a680d6faed5978ce9cd0b7e4d9701b',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.CopyDMFilesTo()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.html#a0b26ca1668b405574bd7662965c7ebb7',1,'Tgstation.Server.Host.Components.StaticFiles.IConfiguration.CopyDMFilesTo()']]], + ['copyfile',['CopyFile',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#ac3523b10f3affcd57a6e94ba5297e8fb',1,'Tgstation.Server.Host.IO.DefaultIOManager.CopyFile()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#aff4f7354934126bbc9516b04bc882ef3',1,'Tgstation.Server.Host.IO.IIOManager.CopyFile()']]], + ['copyto',['CopyTo',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#ada48f9615977d839874139999fdd69ef',1,'Tgstation.Server.Host.Components.Repository.IRepository.CopyTo()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a09369ceb3b7c2c2562d546b9daebd42b',1,'Tgstation.Server.Host.Components.Repository.Repository.CopyTo()']]], + ['create',['Create',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#a2683730461ef575dbaab18fb01a10162',1,'Tgstation.Server.Client.Components.ChatBotsClient.Create()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html#a781f11da2fc0bc852e57544872e2f47e',1,'Tgstation.Server.Client.Components.IChatBotsClient.Create()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html#a8f315515848f8b7397e71255fa1055c9',1,'Tgstation.Server.Client.Components.IInstanceUserClient.Create()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#af62bfee4e1cdca8a216bdade995a57b7',1,'Tgstation.Server.Client.Components.InstanceUserClient.Create()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.html#a60a4f54b4b6cb61d3c0054b9b7a04604',1,'Tgstation.Server.Client.IUsersClient.Create()'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#a68a9c4aea0859ef158ef8146e22d0fd6',1,'Tgstation.Server.Client.UsersClient.Create()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html#a30b983a28295a3f212c36cc6907b37f2',1,'Tgstation.Server.Host.Controllers.ChatController.Create()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#aca5c1679707f3b3894d947fae0cd3c07',1,'Tgstation.Server.Host.Controllers.ConfigurationController.Create()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#a978c3f00b9a1818feb160aadd3d84ef2',1,'Tgstation.Server.Host.Controllers.DreamDaemonController.Create()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html#acd0aebc6865b1325211cca4adcb466b5',1,'Tgstation.Server.Host.Controllers.DreamMakerController.Create()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#ad6521d3043ce4e24ab0b18e418ba3227',1,'Tgstation.Server.Host.Controllers.InstanceController.Create()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html#aad3a7e66b1db15d453e55da78cfcb331',1,'Tgstation.Server.Host.Controllers.InstanceUserController.Create()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html#ad22b1346f51b1622f627de304f56c902',1,'Tgstation.Server.Host.Controllers.ModelController.Create()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#a8c266005f9d45d569d4f3e992094d9e3',1,'Tgstation.Server.Host.Controllers.RepositoryController.Create()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#ac423fd61e4ee1ab329af57f2c1b4378f',1,'Tgstation.Server.Host.Controllers.UserController.Create()']]], + ['create_3c_20tbody_2c_20tresult_20_3e',['Create< TBody, TResult >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a73701939b0af1ee33b46c931829200fc',1,'Tgstation.Server.Client.ApiClient.Create< TBody, TResult >(string route, TBody body, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#ab5fc54acd429e50a254fccaf23e52299',1,'Tgstation.Server.Client.ApiClient.Create< TBody, TResult >(string route, TBody body, long instanceId, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a0448d3803d9f45d2e67295cef2096174',1,'Tgstation.Server.Client.IApiClient.Create< TBody, TResult >(string route, TBody body, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a726cb2cf80d2499c3e6ff8ae67bbc0ed',1,'Tgstation.Server.Client.IApiClient.Create< TBody, TResult >(string route, TBody body, long instanceId, CancellationToken cancellationToken)']]], + ['create_3c_20tresult_20_3e',['Create< TResult >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a5c7201add0fadb2be2851aa749a0c3c6',1,'Tgstation.Server.Client.ApiClient.Create< TResult >(string route, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a70d6c289a7e07426ff72c36eb2502819',1,'Tgstation.Server.Client.ApiClient.Create< TResult >(string route, long instanceId, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#ac4bbf7c3cc9ff87beda2b13f018a25f5',1,'Tgstation.Server.Client.IApiClient.Create< TResult >(string route, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a16d32f00e49bed861bcbd1c6c9325727',1,'Tgstation.Server.Client.IApiClient.Create< TResult >(string route, long instanceId, CancellationToken cancellationToken)']]], + ['createapiclient',['CreateApiClient',['../class_tgstation_1_1_server_1_1_client_1_1_api_client_factory.html#af1210c7eddf5533d80c0618d99fc6b4d',1,'Tgstation.Server.Client.ApiClientFactory.CreateApiClient()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client_factory.html#add8cac56a24b5f4a43d870395de0ea83',1,'Tgstation.Server.Client.IApiClientFactory.CreateApiClient()']]], + ['createauthenticationcontext',['CreateAuthenticationContext',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html#a2d25109494770497244333f385bd5d7e',1,'Tgstation.Server.Host.Security.AuthenticationContextFactory.CreateAuthenticationContext()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context_factory.html#a6ed924f10ee271ccc8d2ea840c095e23',1,'Tgstation.Server.Host.Security.IAuthenticationContextFactory.CreateAuthenticationContext()']]], + ['createbaseclient',['CreateBaseClient',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory.html#a0d2033f1157b71089477c1383ed77e09',1,'Tgstation::Server::Host::Core::GitHubClientFactory']]], + ['createchat',['CreateChat',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html#af6247bee1404c3167c5df0534e164930',1,'Tgstation.Server.Host.Components.Chat.ChatFactory.CreateChat()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat_factory.html#a931511f281ecbb0ec05c825c1643514e',1,'Tgstation.Server.Host.Components.Chat.IChatFactory.CreateChat()']]], + ['createclient',['CreateClient',['../interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html#a89d0d8409ead36832135461bb544ad09',1,'Tgstation.Server.Client.IInstanceManagerClient.CreateClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#aad7c5289f672bb2598084276d583a1f9',1,'Tgstation.Server.Client.InstanceManagerClient.CreateClient()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory.html#ab32f8e03603c878ebc0affdc144facd0',1,'Tgstation.Server.Host.Core.GitHubClientFactory.CreateClient()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory.html#aa2f86d385b449ccf9b4d9011c0479e34',1,'Tgstation.Server.Host.Core.GitHubClientFactory.CreateClient(string accessToken)'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_git_hub_client_factory.html#a9043597fb0563f7fb0ed751819aa7525',1,'Tgstation.Server.Host.Core.IGitHubClientFactory.CreateClient()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_git_hub_client_factory.html#a9b084c659f289f370933fe1b53e55ce9',1,'Tgstation.Server.Host.Core.IGitHubClientFactory.CreateClient(string accessToken)']]], + ['createconnection',['CreateConnection',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_d_b_connection_factory.html#a9e18bbfbe825774ff29ea64ee232a756',1,'Tgstation.Server.Host.Core.DBConnectionFactory.CreateConnection()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_d_b_connection_factory.html#a775a396b33671101a528d43e8ba0f442',1,'Tgstation.Server.Host.Core.IDBConnectionFactory.CreateConnection()']]], + ['createconnectionstringbuilder',['CreateConnectionStringBuilder',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html#a2619d0f36825f5e92cfd9e80181639d4',1,'Tgstation::Server::Api::Models::Internal::ChatBot']]], + ['createdbcontext',['CreateDbContext',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_design_time_db_context_factory.html#a758f3a7be71b35abb7e9947ed6c7874d',1,'Tgstation.Server.Host.Models.Migrations.MySqlDesignTimeDbContextFactory.CreateDbContext()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_design_time_db_context_factory.html#a8964ffb683dde66c4fe3b1590d9e594a',1,'Tgstation.Server.Host.Models.Migrations.SqlServerDesignTimeDbContextFactory.CreateDbContext()']]], + ['createdeadsession',['CreateDeadSession',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller_factory.html#af66f5557aadefc4d380b878a60d59239',1,'Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory.CreateDeadSession()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#a4e4a17d6fa2269f86f0da6cce942244d',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.CreateDeadSession()']]], + ['createdirectory',['CreateDirectory',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#ad3f4cf594c24523ba3717b926843c078',1,'Tgstation.Server.Client.Components.ConfigurationClient.CreateDirectory()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.html#ab7b97489e1cb6307e417f6ecc22b9260',1,'Tgstation.Server.Client.Components.IConfigurationClient.CreateDirectory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a9e6d3a7af0e253142f6ea1fe932f6002',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.CreateDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.html#aac9d5ed7fad37fc5f29295f4a3445449',1,'Tgstation.Server.Host.Components.StaticFiles.IConfiguration.CreateDirectory()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a35975e796c564e8b5dd5d4a601d0c2e3',1,'Tgstation.Server.Host.IO.DefaultIOManager.CreateDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a69aa1b9dbeb6af3744e568095c4376e7',1,'Tgstation.Server.Host.IO.IIOManager.CreateDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.html#a87b99f131bf6b48d725561414d4ddfcb',1,'Tgstation.Server.Host.IO.ISynchronousIOManager.CreateDirectory()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.html#a595b31e7065ee0d3431903fa0ac55156',1,'Tgstation.Server.Host.IO.SynchronousIOManager.CreateDirectory()']]], + ['createinstance',['CreateInstance',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_factory.html#acd069937d6ccb57144f9023c6c05412f',1,'Tgstation.Server.Host.Components.IInstanceFactory.CreateInstance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#afa887ad5dc0636a0c0605b59c7284b3c',1,'Tgstation.Server.Host.Components.InstanceFactory.CreateInstance()']]], + ['createorattach',['CreateOrAttach',['../interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html#af937af9989159b8d9336cffa4f3b578a',1,'Tgstation.Server.Client.IInstanceManagerClient.CreateOrAttach()'],['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#a1a1428f9a34d1cec0fa1bc3fe6b8a3a8',1,'Tgstation.Server.Client.InstanceManagerClient.CreateOrAttach()']]], + ['createprovider',['CreateProvider',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_provider_factory.html#aed7d74bc6b967e2d69f727567ab61abd',1,'Tgstation.Server.Host.Components.Chat.IProviderFactory.CreateProvider()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html#ae6dfc0771ddd57040d0b83fd6e99141d',1,'Tgstation.Server.Host.Components.Chat.ProviderFactory.CreateProvider()']]], + ['createreattachinformation',['CreateReattachInformation',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#a9ef1702c2f488c44b7f4a1cd328bb92f',1,'Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.CreateReattachInformation()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#a0f806ceeb96d87b20963af6368ffae0f',1,'Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.CreateReattachInformation()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#ab10a4b4a00e9e54761121771f475cdf6',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.CreateReattachInformation()']]], + ['createserver',['CreateServer',['../interface_tgstation_1_1_server_1_1_host_1_1_i_server_factory.html#a378688ff3642bb0b72b9224dacb24704',1,'Tgstation.Server.Host.IServerFactory.CreateServer()'],['../class_tgstation_1_1_server_1_1_host_1_1_server_factory.html#a9074ef7b4f79ffba8a4213d6b56938e1',1,'Tgstation.Server.Host.ServerFactory.CreateServer()']]], + ['createserverclient',['CreateServerClient',['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client_factory.html#aed42fe9280a989ba78b8fd2a830a93a8',1,'Tgstation.Server.Client.IServerClientFactory.CreateServerClient(Uri host, string username, string password, TimeSpan timeout=default, CancellationToken cancellationToken=default)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client_factory.html#a58ce916728cfc81f8e143682cd1df5e7',1,'Tgstation.Server.Client.IServerClientFactory.CreateServerClient(Uri host, Token token, TimeSpan timeout=default)'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.html#a358685d267630347317e476195680cc9',1,'Tgstation.Server.Client.ServerClientFactory.CreateServerClient(Uri host, string username, string password, TimeSpan timeout, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.html#a6c53de0537efa094a9c2c52b681acaa2',1,'Tgstation.Server.Client.ServerClientFactory.CreateServerClient(Uri host, Token token, TimeSpan timeout)']]], + ['createsymboliclink',['CreateSymbolicLink',['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_symlink_factory.html#a35bd8c53ef36c4a655e827750a40699c',1,'Tgstation.Server.Host.IO.ISymlinkFactory.CreateSymbolicLink()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_symlink_factory.html#ac487bf33d9a5821fb30bfd7b74915fbe',1,'Tgstation.Server.Host.IO.PosixSymlinkFactory.CreateSymbolicLink()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_symlink_factory.html#a87a0b1b31b48f65e53e4b3b6f476a2c0',1,'Tgstation.Server.Host.IO.WindowsSymlinkFactory.CreateSymbolicLink()'],['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#a668c437c860fb2eafcee04a1a2a613c9',1,'Tgstation.Server.Host.NativeMethods.CreateSymbolicLink()']]], + ['createsystemidentity',['CreateSystemIdentity',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity_factory.html#adaf274d215700bf692b1c3964ff32103',1,'Tgstation.Server.Host.Security.ISystemIdentityFactory.CreateSystemIdentity(User user, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity_factory.html#a6dd83aca91cf43c7236afd22dc512b0a',1,'Tgstation.Server.Host.Security.ISystemIdentityFactory.CreateSystemIdentity(string username, string password, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_posix_system_identity_factory.html#a8e2c85e4ed45d68065f86749afa4651d',1,'Tgstation.Server.Host.Security.PosixSystemIdentityFactory.CreateSystemIdentity(User user, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_posix_system_identity_factory.html#a4621a750f1d0592586d26323af215d93',1,'Tgstation.Server.Host.Security.PosixSystemIdentityFactory.CreateSystemIdentity(string username, string password, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.html#a5c140611a428b663c3a3f76623f825c2',1,'Tgstation.Server.Host.Security.WindowsSystemIdentityFactory.CreateSystemIdentity(User user, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.html#a24c82be81ba5cda6c975a931e8bfe6f1',1,'Tgstation.Server.Host.Security.WindowsSystemIdentityFactory.CreateSystemIdentity(string username, string password, CancellationToken cancellationToken)']]], + ['createtestinstance',['CreateTestInstance',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test.html#a5ba9c70a99ad2cb505e7e958fce0921e',1,'Tgstation::Server::Tests::InstanceManagerTest']]], + ['createtoken',['CreateToken',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#afe4c43b884ebd0e9c4b60e39d4e1c162',1,'Tgstation.Server.Host.Controllers.HomeController.CreateToken()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_token_factory.html#a57edffc2d8c63352fbf4ebd0b5991b45',1,'Tgstation.Server.Host.Security.ITokenFactory.CreateToken()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html#a17610f96f7e87136d957e8ba3c1f5d4a',1,'Tgstation.Server.Host.Security.TokenFactory.CreateToken()']]], + ['createwatchdog',['CreateWatchdog',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog_factory.html#a2d65347fcee2ad4fc13d67334689668c',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdogFactory.CreateWatchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#a81947168cca38f3c1ffa1e82b57add86',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.CreateWatchdog()'],['../interface_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_i_watchdog_factory.html#a4610f9c60c131dab81a56aa23abdfbb8',1,'Tgstation.Server.Host.Watchdog.IWatchdogFactory.CreateWatchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory.html#ae25446ee2a7bb19d9208695d18621914',1,'Tgstation.Server.Host.Watchdog.WatchdogFactory.CreateWatchdog()']]], + ['credentialsprovider',['CredentialsProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider.html#afabb0d6c31961ce6f295822688694196',1,'Tgstation::Server::Host::Components::Repository::CredentialsProvider']]], + ['cryptographysuite',['CryptographySuite',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html#a57c7a5016e948842f6d52697f806614b',1,'Tgstation::Server::Host::Security::CryptographySuite']]] +]; diff --git a/search/functions_3.html b/search/functions_3.html new file mode 100644 index 0000000000..3dca36715c --- /dev/null +++ b/search/functions_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_3.js b/search/functions_3.js new file mode 100644 index 0000000000..1fbc4dccd2 --- /dev/null +++ b/search/functions_3.js @@ -0,0 +1,37 @@ +var searchData= +[ + ['databasecontext',['DatabaseContext',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a3ea918ebd28eef6067c1ec62daa31283',1,'Tgstation::Server::Host::Models::DatabaseContext']]], + ['databasecontextfactory',['DatabaseContextFactory',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_database_context_factory.html#ac86f5235ead630a89c2f021c61226996',1,'Tgstation::Server::Host::Core::DatabaseContextFactory']]], + ['databaseseeder',['DatabaseSeeder',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder.html#ac35912f3685af59a6a0347e8c96c1868',1,'Tgstation::Server::Host::Models::DatabaseSeeder']]], + ['deadsessioncontroller',['DeadSessionController',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#ae6d762429f47307b1391b01c8148df73',1,'Tgstation::Server::Host::Components::Watchdog::DeadSessionController']]], + ['delay',['Delay',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_async_delayer.html#a28ea9fb35caed002bf15a67b03d5e0c7',1,'Tgstation.Server.Host.Core.AsyncDelayer.Delay()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_async_delayer.html#afab931ac159bc999fee1e7eda917c7d6',1,'Tgstation.Server.Host.Core.IAsyncDelayer.Delay()']]], + ['delete',['Delete',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a79097c50707454b30e031a6cf53c1cca',1,'Tgstation.Server.Client.ApiClient.Delete(string route, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#ac4676e1e4197c8b3177738388a70db2e',1,'Tgstation.Server.Client.ApiClient.Delete(string route, long instanceId, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#af21f7f62a34e6486d979bf56f93ab522',1,'Tgstation.Server.Client.Components.ChatBotsClient.Delete()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html#a9ce8f7309dd82e761f821939ad877036',1,'Tgstation.Server.Client.Components.IChatBotsClient.Delete()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html#a1e57e5258ee0d519916cbf6e8452de12',1,'Tgstation.Server.Client.Components.IInstanceUserClient.Delete()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#a66319c3cf70b1e17e7d03d00113680ef',1,'Tgstation.Server.Client.Components.InstanceUserClient.Delete()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.html#a542817cc102394601ab78412d37f82ba',1,'Tgstation.Server.Client.Components.IRepositoryClient.Delete()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#a53bf505d9df01bc1bccec11d00e44733',1,'Tgstation.Server.Client.Components.RepositoryClient.Delete()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a6954d79598a2d4498c99e201481dc6b1',1,'Tgstation.Server.Client.IApiClient.Delete(string route, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a64cf5a4f7ea0ce4a99164906fcdfd19a',1,'Tgstation.Server.Client.IApiClient.Delete(string route, long instanceId, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#aacf3549e22bb38699d3226a156e3e0dc',1,'Tgstation.Server.Host.Controllers.AdministrationController.Delete()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html#ae4c12e239d686b07a2113aabe128a0cd',1,'Tgstation.Server.Host.Controllers.ChatController.Delete()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#a70a6018d637cb3eb379b8949a4a754a8',1,'Tgstation.Server.Host.Controllers.ConfigurationController.Delete()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#a014b1924b2ff406c5d064307c9b69f7f',1,'Tgstation.Server.Host.Controllers.DreamDaemonController.Delete()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#ab7a4f28a43b2e9f369a4eeb2f26c04bf',1,'Tgstation.Server.Host.Controllers.InstanceController.Delete()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html#a208fd4ded9833be6c485266ed656c442',1,'Tgstation.Server.Host.Controllers.InstanceUserController.Delete()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html#a46dd58545389064a931f500ee5dcc1b5',1,'Tgstation.Server.Host.Controllers.JobController.Delete()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html#a5b17152b965b2fdc3856cbe989c32e56',1,'Tgstation.Server.Host.Controllers.ModelController.Delete()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#ad5ffc737feb4385afff13146e336a910',1,'Tgstation.Server.Host.Controllers.RepositoryController.Delete()']]], + ['delete_3c_20tbody_20_3e',['Delete< TBody >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a16602577e0ea7e639491f47873aa07c2',1,'Tgstation.Server.Client.ApiClient.Delete< TBody >()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a59cd6ab3e15c7b5e35268a68e381dd5d',1,'Tgstation.Server.Client.IApiClient.Delete< TBody >()']]], + ['delete_3c_20tresult_20_3e',['Delete< TResult >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#afa6dc92d38b59a7a6a2e44126bb5ad50',1,'Tgstation.Server.Client.ApiClient.Delete< TResult >()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a70767f3f66d4486d4025835ece18d9ef',1,'Tgstation.Server.Client.IApiClient.Delete< TResult >()']]], + ['deleteconnection',['DeleteConnection',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a243d9f218ecf2d6fb157181433c805c9',1,'Tgstation.Server.Host.Components.Chat.Chat.DeleteConnection()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_chat.html#ac01264cccd53b252392b22dd6338ec67',1,'Tgstation.Server.Host.Components.Chat.IChat.DeleteConnection()']]], + ['deletedirectory',['DeleteDirectory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a79f673d1a6c8868b648c0c3393e34d27',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.DeleteDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.html#a38c2d45d551a853c4a1545dcf1996063',1,'Tgstation.Server.Host.Components.StaticFiles.IConfiguration.DeleteDirectory()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a9146389753424cef9d723c88589b3263',1,'Tgstation.Server.Host.IO.DefaultIOManager.DeleteDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#ad3e0dda4b7fbad4c77f48ba3b2681dc7',1,'Tgstation.Server.Host.IO.IIOManager.DeleteDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.html#ad7db8df684e3820376d161b6ac89804f',1,'Tgstation.Server.Host.IO.ISynchronousIOManager.DeleteDirectory()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.html#a238b441b58a9da1b2e2821f203b65deb',1,'Tgstation.Server.Host.IO.SynchronousIOManager.DeleteDirectory()']]], + ['deleteemptydirectory',['DeleteEmptyDirectory',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#a6b1c64f700e702c9944463c9cd7d4419',1,'Tgstation.Server.Client.Components.ConfigurationClient.DeleteEmptyDirectory()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.html#ab64268e03bd3451604bf4c4bdbbec2ba',1,'Tgstation.Server.Client.Components.IConfigurationClient.DeleteEmptyDirectory()']]], + ['deletefile',['DeleteFile',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#ad75df660abbe0d645edc657cf9910a1a',1,'Tgstation.Server.Host.IO.DefaultIOManager.DeleteFile()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a6ca322ea63f5693487917c1ee71c707a',1,'Tgstation.Server.Host.IO.IIOManager.DeleteFile()']]], + ['deleterepository',['DeleteRepository',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository_manager.html#a0476484a5f4909326dfd7edcf697716d',1,'Tgstation.Server.Host.Components.Repository.IRepositoryManager.DeleteRepository()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#a48d21690a40164c4a11d81be94055395',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.DeleteRepository()']]], + ['detach',['Detach',['../interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html#abd45f73a94f3e25829be0e477c73caad',1,'Tgstation.Server.Client.IInstanceManagerClient.Detach()'],['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#a9aaeff926049f5bc8c311fc67b4fb78c',1,'Tgstation.Server.Client.InstanceManagerClient.Detach()']]], + ['die',['Die',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control.html#a2eb5bdeb76bf1fbfdb297219af3ede45',1,'Tgstation.Server.Host.Core.IServerControl.Die()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#ae61fcfdb226cd0f5126e29ffb6fff403',1,'Tgstation.Server.Host.Server.Die()']]], + ['directory',['Directory',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#a048dc25d07e09e17d7f697cf6ded2dd7',1,'Tgstation::Server::Host::Controllers::ConfigurationController']]], + ['directoryexists',['DirectoryExists',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#ad1b0c2e2bdf35fa955cc62f13349f19a',1,'Tgstation.Server.Host.IO.DefaultIOManager.DirectoryExists()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#ae1f28b3b77349cbfbb9b3f9ba1271e5e',1,'Tgstation.Server.Host.IO.IIOManager.DirectoryExists()']]], + ['disconnect',['Disconnect',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#a449b9d2cfad03af62ac00b752f843869',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Disconnect()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.html#ae24ff61d2fb16b41675498d0d95b67d8',1,'Tgstation.Server.Host.Components.Chat.Providers.IProvider.Disconnect()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#ad4de9ce051d7d17408902660018fbc0c',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Disconnect()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#a09ac5284bd746cd4a6008e5747c31dc9',1,'Tgstation.Server.Host.Components.Chat.Providers.Provider.Disconnect()']]], + ['discordconnectionstringbuilder',['DiscordConnectionStringBuilder',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder.html#a6728e43a98a9f8a7e99cb4b286ae03af',1,'Tgstation.Server.Api.Models.DiscordConnectionStringBuilder.DiscordConnectionStringBuilder()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder.html#acf0ae3d6a9370ce06e612d8edb6773e9',1,'Tgstation.Server.Api.Models.DiscordConnectionStringBuilder.DiscordConnectionStringBuilder(string connectionString)']]], + ['discordprovider',['DiscordProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#abe6a8573e1dabb518760ad0855b22a32',1,'Tgstation::Server::Host::Components::Chat::Providers::DiscordProvider']]], + ['dispose',['Dispose',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#ad4afd612c75a7240f3aa27b49520a1bf',1,'Tgstation.Server.Client.ApiClient.Dispose()'],['../class_tgstation_1_1_server_1_1_client_1_1_http_client.html#a01a43b38e92d4c35f303db4d24a2d27a',1,'Tgstation.Server.Client.HttpClient.Dispose()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#abcacb02b4b6734d065f599659914c2ff',1,'Tgstation.Server.Client.ServerClient.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.html#af8246eaaf2299ebea9af766cad757790',1,'Tgstation.Server.Host.Components.Byond.ByondExecutableLock.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#ad943befa858b57706c8fdeac1c93a7bc',1,'Tgstation.Server.Host.Components.Byond.ByondManager.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#ac28dcfb947617ce11f16c9812e4a5a22',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#aee3b3b6b1c9881104aaae99e92936087',1,'Tgstation.Server.Host.Components.Chat.Chat.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#a39ac250abe610588d3ace612dadf0349',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#af246d1ba4609e088232968f6bcfb32f9',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a42a3640c402f3907704c03f78a19fd8f',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#af65e78f38c21aa4b6b080695ec16cf60',1,'Tgstation.Server.Host.Components.Chat.Providers.Provider.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a07b0bea40ec947926abb767ee66fe5bf',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#af2b79136fa590da24e65b64bf90e119e',1,'Tgstation.Server.Host.Components.Compiler.DmbProvider.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html#a5d9370e4b3d5328babf18ae7cd88ef7c',1,'Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#aeb054aea1394bc477846bb850f7016a0',1,'Tgstation.Server.Host.Components.Instance.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a435d2fb1ad9eeafe2629263a8d78b050',1,'Tgstation.Server.Host.Components.InstanceManager.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#a72b538a5a7ce3b22a1c73a443d4a3925',1,'Tgstation.Server.Host.Components.Interop.CommContext.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a3ea44742a122a7d74046017a02f5ea08',1,'Tgstation.Server.Host.Components.Repository.Repository.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#a61b0a56eced0f9e75057c0c9f17b5d1d',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a490ea3b8f33527e6b1e348346195503a',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#aa3177ce8605a5b37207597bc1e120e71',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a38c78aee4660c3fb696fe2ea5396cd21',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a8d954bc88514cf9103a552bf2b7bcd6a',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.Dispose(bool disposing)'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a674ad9d3fd9d5716186fdb65b99d40ab',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#a76bec34132621ff6fa122665b3a128d1',1,'Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html#a6958c4ad79c009aa019cc008fc84ff14',1,'Tgstation.Server.Host.Core.JobHandler.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a0fbc7a6125fa4033bb93b9de7f0e5ce4',1,'Tgstation.Server.Host.Core.JobManager.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a872943801535a9784fe6521eff33ce13',1,'Tgstation.Server.Host.Core.Process.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration.html#a1a4d9a4d259d03ff3f69b2b061c2e5df',1,'Tgstation.Server.Host.Core.RestartRegistration.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html#a7a90d285258c8e67e5a351c6b8854537',1,'Tgstation.Server.Host.Core.SemaphoreSlimContext.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a4a5a80952341c5a9e0f3a84e27734f8a',1,'Tgstation.Server.Host.Security.AuthenticationContext.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html#accc9334a642e563e47c5308df2d5149a',1,'Tgstation.Server.Host.Security.AuthenticationContextFactory.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html#a8a7ab89f157f77d9424c642587fd0460',1,'Tgstation.Server.Host.Security.IdentityCache.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.html#abf1fccfffa19349bb551ffe64c364387',1,'Tgstation.Server.Host.Security.IdentityCacheObject.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html#a69861e38af0e65778b2e6e5692fd87a4',1,'Tgstation.Server.Host.Security.WindowsSystemIdentity.Dispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a75ee7501b3cb59e3e34c05f382380292',1,'Tgstation.Server.Host.Service.ServerService.Dispose()'],['../class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html#a961376f9557fb389f26cafb5fb93ab96',1,'Tgstation.Server.Tests.TestingServer.Dispose()']]], + ['disposeandnullcontrollers',['DisposeAndNullControllers',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#ab4158781aa5500e7fa039bc969c51ef1',1,'Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.DisposeAndNullControllers()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#a38336dfb2d02f0b73e0613a6aea17d5d',1,'Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.DisposeAndNullControllers()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#ad03dbc1b36b5c42f944d93f13f6260af',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.DisposeAndNullControllers()']]], + ['dmbfactory',['DmbFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a52e9bb5f3fdb7e52468afa0ba740e535',1,'Tgstation::Server::Host::Components::Compiler::DmbFactory']]], + ['dmbprovider',['DmbProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#a1537e8b8f8b55841d8d1b51104acb521',1,'Tgstation::Server::Host::Components::Compiler::DmbProvider']]], + ['donotdeletethissession',['DoNotDeleteThisSession',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.html#ae54582fd5e1f354554c9a0402eb72a2b',1,'Tgstation.Server.Host.Components.Byond.ByondExecutableLock.DoNotDeleteThisSession()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock.html#aefcf67dd06a656e319e6d6e42a2aef81',1,'Tgstation.Server.Host.Components.Byond.IByondExecutableLock.DoNotDeleteThisSession()']]], + ['down',['Down',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html#a469e01870addd0180bf8f990143b7dfc',1,'Tgstation.Server.Host.Models.Migrations.MSInitialCreate.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html#a6ab7991e1cc2bd0e72632d8b8dec4855',1,'Tgstation.Server.Host.Models.Migrations.MYInitialCreate.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html#a743a5621955d43df4e9780cf76183e23',1,'Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html#a2221d0ff68cbf208df1b312c6864f263',1,'Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html#a17867b620f610dcfea1677ea948f6433',1,'Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html#a182d1024fbd7af021730f7604dcf3dcb',1,'Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html#abcd54980626daace56399a31c3256640',1,'Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html#a813507ad90afe25188b1fbb76e8d850d',1,'Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.html#acb8bff6be45c396886c413c2f531c14a',1,'Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.html#a0a073717d8541e39b758f7f303bcd6eb',1,'Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_fix_rev_info_index.html#ae1e363b16d159ef0c3beebdd502d590e',1,'Tgstation.Server.Host.Models.Migrations.MSFixRevInfoIndex.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_fix_rev_info_index.html#a294142c6d27fea69492ac0ed683f334b',1,'Tgstation.Server.Host.Models.Migrations.MYFixRevInfoIndex.Down()']]], + ['downloadfile',['DownloadFile',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a509e05cc7905cda41869f57bee5c6c58',1,'Tgstation.Server.Host.IO.DefaultIOManager.DownloadFile()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a20647d9e4dd09b806e407cd5c8a23b9b',1,'Tgstation.Server.Host.IO.IIOManager.DownloadFile()']]], + ['downloadversion',['DownloadVersion',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.html#a827552d8311f380aecac2fd75beecc52',1,'Tgstation.Server.Host.Components.Byond.IByondInstaller.DownloadVersion()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#aeac3c26b791aa9ce7e6651883d7ec9fe',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DownloadVersion()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a509d23a163b9b7dcd94ee7e682af944a',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.DownloadVersion()']]], + ['dreamdaemon',['DreamDaemon',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#ab5eab4143b5b6250e72b4ea05b2a039c',1,'Tgstation::Server::Client::Components::DreamDaemonClient']]], + ['dreamdaemonclient',['DreamDaemonClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#a8bf0ad726b61e3dbc31a53c7ea0822c2',1,'Tgstation::Server::Client::Components::DreamDaemonClient']]], + ['dreamdaemoncontroller',['DreamDaemonController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#ad6d82fab816712a4c95163e0ee2a4d7d',1,'Tgstation::Server::Host::Controllers::DreamDaemonController']]], + ['dreammaker',['DreamMaker',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#a62edd66a221c9b7044bd068dcf7324d9',1,'Tgstation.Server.Client.Components.DreamMakerClient.DreamMaker()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a40482c625ab675928223bcafa234a43c',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.DreamMaker()']]], + ['dreammakerclient',['DreamMakerClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#a04dd94462a3bb8aad7469c84d53f78a9',1,'Tgstation::Server::Client::Components::DreamMakerClient']]], + ['dreammakercontroller',['DreamMakerController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html#a5434cff9c9fa15212f0630672f48de13',1,'Tgstation::Server::Host::Controllers::DreamMakerController']]] +]; diff --git a/search/functions_4.html b/search/functions_4.html new file mode 100644 index 0000000000..e713f28670 --- /dev/null +++ b/search/functions_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_4.js b/search/functions_4.js new file mode 100644 index 0000000000..58b844be54 --- /dev/null +++ b/search/functions_4.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['enablecustomchatcommands',['EnableCustomChatCommands',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#aaa719b3d931db6811b3056569a6aa2dc',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.EnableCustomChatCommands()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#ae7a1f5cde45d316a03c6e040122639ae',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.EnableCustomChatCommands()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a403bf639776b8c18994b3588df150acd',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.EnableCustomChatCommands()']]], + ['enqueuemessage',['EnqueueMessage',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#ac45c189505744c6f1012461193fca877',1,'Tgstation::Server::Host::Components::Chat::Providers::Provider']]], + ['ensuredirectories',['EnsureDirectories',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a5a067086b7757d904b99cabe914a925c',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]], + ['enumchildwindows',['EnumChildWindows',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#a6b4b37ca121784ecd63c477cc022415d',1,'Tgstation::Server::Host::NativeMethods']]], + ['enumwindow',['EnumWindow',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#a8700ec33883a4fa21de33d9b980ddf31',1,'Tgstation::Server::Host::Components::Watchdog::WindowsNetworkPromptReaper']]], + ['enumwindowproc',['EnumWindowProc',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#a865bfe43e7d4085326ccf40500eb4222',1,'Tgstation::Server::Host::NativeMethods']]], + ['eventconsumer',['EventConsumer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.html#a6d87fe2d067c9a71ed39e1e3e1a59d86',1,'Tgstation::Server::Host::Components::EventConsumer']]], + ['experimentalwatchdog',['ExperimentalWatchdog',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#ad44257e1c074701c56ec3e775102538f',1,'Tgstation::Server::Host::Components::Watchdog::ExperimentalWatchdog']]] +]; diff --git a/search/functions_5.html b/search/functions_5.html new file mode 100644 index 0000000000..cfe6b17d97 --- /dev/null +++ b/search/functions_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_5.js b/search/functions_5.js new file mode 100644 index 0000000000..cc3e3ae1da --- /dev/null +++ b/search/functions_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['fetchorigin',['FetchOrigin',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#a749160f7ea74fc975303e46d5ad196e0',1,'Tgstation.Server.Host.Components.Repository.IRepository.FetchOrigin()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a9e88ae9848a65008f544cfd34071f115',1,'Tgstation.Server.Host.Components.Repository.Repository.FetchOrigin()']]], + ['file',['File',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#a51d11df3997c7f49c6fb8e7784d3f2d0',1,'Tgstation::Server::Host::Controllers::ConfigurationController']]], + ['fileexists',['FileExists',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#ab1b31bbcb5d4bdc0650d81a19af5d6ae',1,'Tgstation.Server.Host.IO.DefaultIOManager.FileExists()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a4088b7924c694d628acd99b5a0829c86',1,'Tgstation.Server.Host.IO.IIOManager.FileExists()'],['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test.html#a829c327d0e5cbc853d13fdc174403d2e',1,'Tgstation.Server.Tests.Instance.ConfigurationTest.FileExists()']]], + ['findwindow',['FindWindow',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#aaff201757860dd95c1ab3047ac6e2ec8',1,'Tgstation::Server::Host::NativeMethods']]], + ['forbidduetomodeconflicts',['ForbidDueToModeConflicts',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#a3478628e5a443b65c9ffb565d4da2cde',1,'Tgstation::Server::Host::Controllers::ConfigurationController']]], + ['fromcompilejob',['FromCompileJob',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#ad34e5b047ffa03fce6137457db55c41e',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.FromCompileJob()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory.html#afbbacb6765fb5cfc3062fbab20bd76d7',1,'Tgstation.Server.Host.Components.Compiler.IDmbFactory.FromCompileJob()']]] +]; diff --git a/search/functions_6.html b/search/functions_6.html new file mode 100644 index 0000000000..a78ec13f19 --- /dev/null +++ b/search/functions_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_6.js b/search/functions_6.js new file mode 100644 index 0000000000..ece1ddbdb1 --- /dev/null +++ b/search/functions_6.js @@ -0,0 +1,36 @@ +var searchData= +[ + ['generatecommands',['GenerateCommands',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#a6d69dde344df916a244626be56bc1b78',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.GenerateCommands()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command_factory.html#a3f5fdca17c71257d34528f45f61ed469',1,'Tgstation.Server.Host.Components.Chat.Commands.ICommandFactory.GenerateCommands()']]], + ['generatehandler',['GenerateHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider.html#a0354146fcbb7410adee01f9e82c11e4b',1,'Tgstation.Server.Host.Components.Repository.CredentialsProvider.GenerateHandler()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_credentials_provider.html#a2073b6366f063ff6a8b3ee844e1a7ded',1,'Tgstation.Server.Host.Components.Repository.ICredentialsProvider.GenerateHandler()']]], + ['generatepushoptions',['GeneratePushOptions',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#ae497427222edeac86fbaea36d2dac220',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['getactivecontroller',['GetActiveController',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#ac8039f2bf0c909c13c2091f5dd676613',1,'Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.GetActiveController()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#a4ee975227e7f5550cc584af7e36dfcfd',1,'Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.GetActiveController()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a634f53946305b875c65c04dfd1719830',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.GetActiveController()']]], + ['getallchildhandles',['GetAllChildHandles',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#a568155e47f6f154a48b9793470bab959',1,'Tgstation::Server::Host::Components::Watchdog::WindowsNetworkPromptReaper']]], + ['getcombinedoutput',['GetCombinedOutput',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.html#a44195e1a2830c53385ab8a70a0d35d9c',1,'Tgstation.Server.Host.Core.IProcess.GetCombinedOutput()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a6bc9b5525d72bcf5cc0579c350063b55',1,'Tgstation.Server.Host.Core.Process.GetCombinedOutput()']]], + ['getcompilejob',['GetCompileJob',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#abcc6c859b5cad4037507e5a0c163dcbc',1,'Tgstation.Server.Client.Components.DreamMakerClient.GetCompileJob()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html#a844bc0b226b4298ae06e3cfe953cc6c4',1,'Tgstation.Server.Client.Components.IDreamMakerClient.GetCompileJob()']]], + ['getcustomcommands',['GetCustomCommands',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_json_tracking_context.html#a4c767f16648c5d7e61e393871eff1847',1,'Tgstation.Server.Host.Components.Chat.IJsonTrackingContext.GetCustomCommands()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#ae5f9940133bdf066397d293d04bdb88b',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext.GetCustomCommands()']]], + ['getdbcontextoptions',['GetDbContextOptions',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_design_time_db_context_factory_helpers.html#a6464620324133063bf91162c86e07d8c',1,'Tgstation::Server::Host::Models::Migrations::DesignTimeDbContextFactoryHelpers']]], + ['getdirectories',['GetDirectories',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#acae0255ab165ae1421ece5b1d5fbdf29',1,'Tgstation.Server.Host.IO.DefaultIOManager.GetDirectories()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a4813de766ae0c63cf3ba34e4a40626ca',1,'Tgstation.Server.Host.IO.IIOManager.GetDirectories()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.html#a254a4bab3839ca09cdeade65387523d7',1,'Tgstation.Server.Host.IO.ISynchronousIOManager.GetDirectories()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.html#a65612d712154495899633c1195579b08',1,'Tgstation.Server.Host.IO.SynchronousIOManager.GetDirectories()']]], + ['getdirectoryname',['GetDirectoryName',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a993c9bef376d9b28f47e97d8bdf21d04',1,'Tgstation.Server.Host.IO.DefaultIOManager.GetDirectoryName()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a691970cc91e5576b06ed9ce14e51d9b8',1,'Tgstation.Server.Host.IO.IIOManager.GetDirectoryName()']]], + ['getdotnetpath',['GetDotnetPath',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html#a8d0f1fffc5a866c3d542d2e1c106fbb4',1,'Tgstation::Server::Host::Watchdog::Watchdog']]], + ['geterroroutput',['GetErrorOutput',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.html#a46cfee91f4dc1088a7be8408bbece6ce',1,'Tgstation.Server.Host.Core.IProcess.GetErrorOutput()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a4fdc81bd4df6fb68bc1c576a397a0906',1,'Tgstation.Server.Host.Core.Process.GetErrorOutput()']]], + ['getfilename',['GetFileName',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#adf2a105e1c455565c3c15de9078f1282',1,'Tgstation.Server.Host.IO.DefaultIOManager.GetFileName()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a0d6d5a54db205d2d1d45a927d57f5182',1,'Tgstation.Server.Host.IO.IIOManager.GetFileName()']]], + ['getfilenamewithoutextension',['GetFileNameWithoutExtension',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a5e595bab061d2fe0b1f6cb0454a44a12',1,'Tgstation.Server.Host.IO.DefaultIOManager.GetFileNameWithoutExtension()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#ab6635afaf199a1396a743f3b46eac786',1,'Tgstation.Server.Host.IO.IIOManager.GetFileNameWithoutExtension()']]], + ['getfiles',['GetFiles',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a29ee8cd097023d261cab484b6732cdb6',1,'Tgstation.Server.Host.IO.DefaultIOManager.GetFiles()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#aca74c5436163f98c2780e8aa1468d098',1,'Tgstation.Server.Host.IO.IIOManager.GetFiles()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.html#ad8368416aaa9561f5a55f8705639060e',1,'Tgstation.Server.Host.IO.ISynchronousIOManager.GetFiles()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.html#a9a2b8e249e8a8f9786158e30b52471da',1,'Tgstation.Server.Host.IO.SynchronousIOManager.GetFiles()']]], + ['getfileswithextension',['GetFilesWithExtension',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#adb83c449f775cc4926d580b4c2b692bd',1,'Tgstation.Server.Host.IO.DefaultIOManager.GetFilesWithExtension()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a3a1f02b2e5c45cdb690c13cac8283816',1,'Tgstation.Server.Host.IO.IIOManager.GetFilesWithExtension()']]], + ['getgithubclient',['GetGitHubClient',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#a35af4d06cfa01eea597d3e29e74b0e21',1,'Tgstation::Server::Host::Controllers::AdministrationController']]], + ['getid',['GetId',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#aafc459bdd85faa34ca004f760699355d',1,'Tgstation.Server.Client.Components.ChatBotsClient.GetId()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html#af3ce02a1214ddb80ef5021683fa1c778',1,'Tgstation.Server.Client.Components.IChatBotsClient.GetId()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html#ab3a233f8693053d156993065bd4705cb',1,'Tgstation.Server.Client.Components.IInstanceUserClient.GetId()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client.html#a81f63e00b0598d9da4e701c929758c23',1,'Tgstation.Server.Client.Components.IJobsClient.GetId()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#ab231f97fcf3c7ac3c920bae0530c96a0',1,'Tgstation.Server.Client.Components.InstanceUserClient.GetId()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html#a4dfacac4c1b116591f1c016bfbe4efb3',1,'Tgstation.Server.Client.Components.JobsClient.GetId()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html#ae1c05f75c697ddba9bf488cf899749fb',1,'Tgstation.Server.Client.IInstanceManagerClient.GetId()'],['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#ac8d222eb11e9fe074119eb2ae6fc9f2f',1,'Tgstation.Server.Client.InstanceManagerClient.GetId()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.html#a30511d277c85e7fb8ee65ff6f753f0ab',1,'Tgstation.Server.Client.IUsersClient.GetId()'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#a514da40bf7db90218c7700f8e6b7a288',1,'Tgstation.Server.Client.UsersClient.GetId()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html#a22224fd61a9aba508f1ccd7f6e1a0f3a',1,'Tgstation.Server.Host.Controllers.ChatController.GetId()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html#aa015061d5be81446c63021baaa3d0974',1,'Tgstation.Server.Host.Controllers.DreamMakerController.GetId()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a1cc74a6cb2792c43dd06a7b2eb975218',1,'Tgstation.Server.Host.Controllers.InstanceController.GetId()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html#a2a30dda94e6540698d48034173abd1d9',1,'Tgstation.Server.Host.Controllers.InstanceUserController.GetId()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html#a64bbe6b961dd571aed02cd722e1a155a',1,'Tgstation.Server.Host.Controllers.JobController.GetId()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html#a2197f6b49489738de613f6d4cac0ff85',1,'Tgstation.Server.Host.Controllers.ModelController.GetId()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#a7d6b74a7303032d27eef7536c9a878fa',1,'Tgstation.Server.Host.Controllers.UserController.GetId()']]], + ['getinstance',['GetInstance',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.html#af8941660b12690639e314c4c266e33c4',1,'Tgstation.Server.Host.Components.IInstanceManager.GetInstance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#ab9ce721dc3f4039aa0563490a94bead5',1,'Tgstation.Server.Host.Components.InstanceManager.GetInstance()']]], + ['getjobids',['GetJobIds',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#a4ac0e968d26cc7bb2500021014618b36',1,'Tgstation.Server.Client.Components.DreamMakerClient.GetJobIds()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html#a26f84a9c414291c600ac60c802443d05',1,'Tgstation.Server.Client.Components.IDreamMakerClient.GetJobIds()']]], + ['getlogger',['GetLogger',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application_builder_extensions.html#a7cb4857346ca0e098ebe8c92e9748b62',1,'Tgstation::Server::Host::Core::ApplicationBuilderExtensions']]], + ['getprocess',['GetProcess',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_executor.html#a0ff5a1763bb628b00b952d8f1177980f',1,'Tgstation.Server.Host.Core.IProcessExecutor.GetProcess()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html#a3accd5eef9199021b60058ac46b834cb',1,'Tgstation.Server.Host.Core.ProcessExecutor.GetProcess()']]], + ['getrepositoryownername',['GetRepositoryOwnerName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#adec58d79f9d6c5fe1bc4e43f9f036308',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['getright',['GetRight',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#ade8aeb7dd0a0e480f6f89bd5973703c7',1,'Tgstation.Server.Host.Security.AuthenticationContext.GetRight()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context.html#af5d37fc8159a215c75c3f3688f4415ea',1,'Tgstation.Server.Host.Security.IAuthenticationContext.GetRight()']]], + ['getsecurebytes',['GetSecureBytes',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html#aeaa749c8ecd658514c3d913950268cfc',1,'Tgstation.Server.Host.Security.CryptographySuite.GetSecureBytes()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_cryptography_suite.html#ac6fa20935fc73a1dca313376b5b79d1a',1,'Tgstation.Server.Host.Security.ICryptographySuite.GetSecureBytes()']]], + ['getsecurestring',['GetSecureString',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html#a241b23ae24a7354312245e1cb606f882',1,'Tgstation.Server.Host.Security.CryptographySuite.GetSecureString()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_cryptography_suite.html#ab49e5041cfb7333ee413c9719046ae37',1,'Tgstation.Server.Host.Security.ICryptographySuite.GetSecureString()']]], + ['getserializersettings',['GetSerializerSettings',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#aed28ea7a7fff4be99f3c65a8dcd0a47e',1,'Tgstation::Server::Client::ApiClient']]], + ['getstandardoutput',['GetStandardOutput',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.html#a8f714e7914821c4528baae64ee4639ee',1,'Tgstation.Server.Host.Core.IProcess.GetStandardOutput()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#afb3d9a6f2e0180f1b0f1687d738bc738',1,'Tgstation.Server.Host.Core.Process.GetStandardOutput()']]], + ['getuseranddomainname',['GetUserAndDomainName',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.html#a1cca1b38097ffb81518592e6b967cecf',1,'Tgstation::Server::Host::Security::WindowsSystemIdentityFactory']]], + ['getwindowtext',['GetWindowText',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#aab504dccd83453d3af13a7e4feceb7a9',1,'Tgstation::Server::Host::NativeMethods']]], + ['getwindowthreadprocessid',['GetWindowThreadProcessId',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#a346862e4a517dcfe04a256ec49e7ecea',1,'Tgstation::Server::Host::NativeMethods']]], + ['githubclientfactory',['GitHubClientFactory',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory.html#aae860ee190f366dd5f5d95ba33132ad5',1,'Tgstation::Server::Host::Core::GitHubClientFactory']]] +]; diff --git a/search/functions_7.html b/search/functions_7.html new file mode 100644 index 0000000000..7842361ff5 --- /dev/null +++ b/search/functions_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_7.js b/search/functions_7.js new file mode 100644 index 0000000000..59f5c8ae41 --- /dev/null +++ b/search/functions_7.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['handlebadresponse',['HandleBadResponse',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a7b81831316898d1d92a5103d3ecf145b',1,'Tgstation::Server::Client::ApiClient']]], + ['handlechatcommand',['HandleChatCommand',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_custom_command_handler.html#ab7df30a189d971d3bbd053ce2b5bdd0c',1,'Tgstation.Server.Host.Components.Chat.ICustomCommandHandler.HandleChatCommand()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a359f6160a7b3bdf3b081b301775feb5b',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.HandleChatCommand()']]], + ['handleevent',['HandleEvent',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.html#a92fe6b476551994f44f0206f84ecb7e7',1,'Tgstation.Server.Host.Components.EventConsumer.HandleEvent()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_event_consumer.html#a112febc1b1043ed890f9ed781bc3751c',1,'Tgstation.Server.Host.Components.IEventConsumer.HandleEvent()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a5bff1817e94a17a556da18a4f6c90202',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.HandleEvent()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a4b9550b3cd36106ca8a4510730db2060',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.HandleEvent()']]], + ['handleinterop',['HandleInterop',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_i_comm_handler.html#af4d1c72d7fb7bc9764a13f1d9e7b00c7',1,'Tgstation.Server.Host.Components.Interop.ICommHandler.HandleInterop()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a867a797b4ec342fe0bdc7ccff458109d',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.HandleInterop()']]], + ['handlemessage',['HandleMessage',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a942b5d525b0855ff6c8b59e0d5f6e7eb',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]], + ['handlemonitorwakeup',['HandleMonitorWakeup',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#a734af406522508a40b77fe6044194a90',1,'Tgstation::Server::Host::Components::Watchdog::BasicWatchdog']]], + ['handlerestart',['HandleRestart',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a8a972c1d6a2a0fae729edf78b966c7c0',1,'Tgstation.Server.Host.Components.Chat.Chat.HandleRestart()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a2fd05864a3a2b706516784e14afaecc6',1,'Tgstation.Server.Host.Components.InstanceManager.HandleRestart()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#ad78e8addece7234fb29cffe96a18442e',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.HandleRestart()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_restart_handler.html#ad7bcde59a7297d1ef3770943af92a93d',1,'Tgstation.Server.Host.Core.IRestartHandler.HandleRestart()']]], + ['handlermonitorwakeup',['HandlerMonitorWakeup',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#a8b1f961ac1d7bc6c815d01b9bccad487',1,'Tgstation::Server::Host::Components::Watchdog::ExperimentalWatchdog']]], + ['handlewrite',['HandleWrite',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#ae1049d054dc12b093edde8e89d366394',1,'Tgstation.Server.Host.Components.Interop.CommContext.HandleWrite()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_post_write_handler.html#a977c03596e21a07e06d7bc3735c6884f',1,'Tgstation.Server.Host.IO.IPostWriteHandler.HandleWrite()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_posix_post_write_handler.html#a43d2add7500e5047fd259d1291ada0bc',1,'Tgstation.Server.Host.IO.PosixPostWriteHandler.HandleWrite()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_windows_post_write_handler.html#a94fe62fd0f170cca8a95674408a1ede4',1,'Tgstation.Server.Host.IO.WindowsPostWriteHandler.HandleWrite()']]], + ['haspermissiontomakesymlinks',['HasPermissionToMakeSymlinks',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory.html#a26f1ef58c7ead54fd0a7b73f616dbb4a',1,'Tgstation::Server::Host::IO::Tests::TestSymlinkFactory']]], + ['home',['Home',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#a03d7bf4a2c99507c1c69d1b76eee96c8',1,'Tgstation::Server::Host::Controllers::HomeController']]], + ['homecontroller',['HomeController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#acb05858d562ebbd9ddb7f3f3d19e8834',1,'Tgstation::Server::Host::Controllers::HomeController']]], + ['httpclient',['HttpClient',['../class_tgstation_1_1_server_1_1_client_1_1_http_client.html#ae30abd8d943980aeb8c192df877b7df8',1,'Tgstation::Server::Client::HttpClient']]] +]; diff --git a/search/functions_8.html b/search/functions_8.html new file mode 100644 index 0000000000..48feafe560 --- /dev/null +++ b/search/functions_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_8.js b/search/functions_8.js new file mode 100644 index 0000000000..b59a6289ab --- /dev/null +++ b/search/functions_8.js @@ -0,0 +1,31 @@ +var searchData= +[ + ['identitycache',['IdentityCache',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html#aa3cdd5649c32a1249a2398343e82f343',1,'Tgstation::Server::Host::Security::IdentityCache']]], + ['identitycacheobject',['IdentityCacheObject',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.html#a77e5495fa90b8eed2f2d86c6fb711da8',1,'Tgstation::Server::Host::Security::IdentityCacheObject']]], + ['initcontrollers',['InitControllers',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#ae3df19d19a115ec3137fc1924de34661',1,'Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.InitControllers()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#a0d42fb1f490a6ca44712dd236bceca92',1,'Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.InitControllers()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a37ced913cc4105a8df8250579bace8f8',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.InitControllers()']]], + ['initialize',['Initialize',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#aac1c768a59e2efecac4dac179533ca4c',1,'Tgstation.Server.Host.Models.DatabaseContext.Initialize()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#aa805da92c4e05d5a7c0010a9bbfeeb9f',1,'Tgstation.Server.Host.Models.IDatabaseContext.Initialize()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests_1_1_test_discord_provider.html#a44c8b813bbadae2022cab1b2deaed3cb',1,'Tgstation.Server.Host.Components.Chat.Providers.Tests.TestDiscordProvider.Initialize()']]], + ['injectclaimsintocontext',['InjectClaimsIntoContext',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_claims_injector.html#a68b33948ac77f08ab2dc17209ce78314',1,'Tgstation.Server.Host.Security.ClaimsInjector.InjectClaimsIntoContext()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_claims_injector.html#ac15d0e829afdb2e3523f6ea38879759e',1,'Tgstation.Server.Host.Security.IClaimsInjector.InjectClaimsIntoContext()']]], + ['installbyond',['InstallByond',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.html#a8fec89a87bef1153e103e4b3349fb27b',1,'Tgstation.Server.Host.Components.Byond.IByondInstaller.InstallByond()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#a80e49a1322036d35b8d2839ee49e4f44',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.InstallByond()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a496ed03a850673b3269f09d7b2e42441',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.InstallByond()']]], + ['installedversions',['InstalledVersions',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html#a58ad28bf73680ade13cd1bf1ebece987',1,'Tgstation.Server.Client.Components.ByondClient.InstalledVersions()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_byond_client.html#a1538f8488e7866c4986afe7d3b7ef1a0',1,'Tgstation.Server.Client.Components.IByondClient.InstalledVersions()']]], + ['installversion',['InstallVersion',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a1040d60e5aa5723bfb450c69f5ee02f3',1,'Tgstation::Server::Host::Components::Byond::ByondManager']]], + ['instance',['Instance',['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#ad77819a87cb51a027c4b9b460b382ccd',1,'Tgstation.Server.Client.InstanceManagerClient.Instance(Routes.InstanceManager, instance ?? throw new ArgumentNullException(nameof(instance)), cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#ad77819a87cb51a027c4b9b460b382ccd',1,'Tgstation.Server.Client.InstanceManagerClient.Instance(Routes.InstanceManager, instance ?? throw new ArgumentNullException(nameof(instance)), cancellationToken)'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a7c8ca0a51cb68ea6d1dc6025e0555baf',1,'Tgstation.Server.Host.Components.Instance.Instance()']]], + ['instanceadminuser',['InstanceAdminUser',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a501712a48c2962b239aa5fb270c76f82',1,'Tgstation::Server::Host::Controllers::InstanceController']]], + ['instanceclient',['InstanceClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#af44767648e0b31f744ea09f0864c70ca',1,'Tgstation::Server::Client::Components::InstanceClient']]], + ['instancecontroller',['InstanceController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a62eb74d4e58236abc641302411f0a74f',1,'Tgstation::Server::Host::Controllers::InstanceController']]], + ['instancefactory',['InstanceFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a652d14bc0bcf431eaa69845e4541a624',1,'Tgstation::Server::Host::Components::InstanceFactory']]], + ['instancemanager',['InstanceManager',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a67ee123ed66a93f55cec584e9dc3f102',1,'Tgstation::Server::Host::Components::InstanceManager']]], + ['instancemanagerclient',['InstanceManagerClient',['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#a2d6043c1548bc86551fe56f12a78d4cb',1,'Tgstation::Server::Client::InstanceManagerClient']]], + ['instancemanagertest',['InstanceManagerTest',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test.html#a73adf4e69e5b73873008b16ad115eece',1,'Tgstation::Server::Tests::InstanceManagerTest']]], + ['instancetest',['InstanceTest',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_instance_test.html#a7178a60f55d85261a8a0b73e3afc3209',1,'Tgstation::Server::Tests::Instance::InstanceTest']]], + ['instanceuser',['InstanceUser',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#ab42261638618edd8ca94398807f74812',1,'Tgstation.Server.Client.Components.InstanceUserClient.InstanceUser(Routes.InstanceUser, instanceUser ?? throw new ArgumentNullException(nameof(instanceUser)), instance.Id, cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#ab42261638618edd8ca94398807f74812',1,'Tgstation.Server.Client.Components.InstanceUserClient.InstanceUser(Routes.InstanceUser, instanceUser ?? throw new ArgumentNullException(nameof(instanceUser)), instance.Id, cancellationToken)']]], + ['instanceuserclient',['InstanceUserClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#a2ae6151c326432db1eaba0373f73733f',1,'Tgstation::Server::Client::Components::InstanceUserClient']]], + ['instanceusercontroller',['InstanceUserController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html#a5813d050c32f94a45129e9b6a9eabe9e',1,'Tgstation::Server::Host::Controllers::InstanceUserController']]], + ['insufficientpermissionsexception',['InsufficientPermissionsException',['../class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception.html#a358dd83b6663d93b11f4379ce5d652c0',1,'Tgstation.Server.Client.InsufficientPermissionsException.InsufficientPermissionsException()'],['../class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception.html#a03f411a80e2a3bd6c8f789737459f475',1,'Tgstation.Server.Client.InsufficientPermissionsException.InsufficientPermissionsException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_insufficient_permissions_exception.html#a611c12ed0eb292ab571c23fac254c1de',1,'Tgstation.Server.Client.InsufficientPermissionsException.InsufficientPermissionsException(string message, Exception innerException)']]], + ['invoke',['Invoke',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html#a46b0d8e92f76f34742e1b37f9925828e',1,'Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.Invoke()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.html#ad5707f9705974d53782d7e5d025ac3e7',1,'Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.Invoke()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command.html#a4acd6a23a3ca7d56450aae8db2bc63e3',1,'Tgstation.Server.Host.Components.Chat.Commands.ICommand.Invoke()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command.html#a054bc7a57ed9815bf7587e2dee4f590c',1,'Tgstation.Server.Host.Components.Chat.Commands.KekCommand.Invoke()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#a75e30ad4bc4993e62735761914fe1b94',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.Invoke()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html#a208092aa747a42a875eae87a095fc9c9',1,'Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.Invoke()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.html#a2b017d41ca603e7246a4204778286b54',1,'Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.Invoke()']]], + ['ircconnectionstringbuilder',['IrcConnectionStringBuilder',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#aaca6717795e0914dd265e40bdeb9e045',1,'Tgstation.Server.Api.Models.IrcConnectionStringBuilder.IrcConnectionStringBuilder()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#a7334c0cb968cb00c1bbe1c5fd3a05e33',1,'Tgstation.Server.Api.Models.IrcConnectionStringBuilder.IrcConnectionStringBuilder(string connectionString)']]], + ['ircprovider',['IrcProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#ae046e83091f25fdd01e32c895aaf627c',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]], + ['isadministrator',['IsAdministrator',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html#a5c942ce276ce92ca31ecbe9c88f2e982',1,'Tgstation::Server::Host::Service::Program']]], + ['isdirectory',['IsDirectory',['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_synchronous_i_o_manager.html#a6b94d0c1144161066ce9707231026fe3',1,'Tgstation.Server.Host.IO.ISynchronousIOManager.IsDirectory()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_synchronous_i_o_manager.html#ac1b1a366625c83d9e7cc57acabca1d98',1,'Tgstation.Server.Host.IO.SynchronousIOManager.IsDirectory()']]], + ['isinstanceright',['IsInstanceRight',['../class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper.html#a40d32838ff902da852c54215bd8e89fb',1,'Tgstation::Server::Api::Rights::RightsHelper']]], + ['issha',['IsSha',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#ac03c80ad5ffb1ee381dd882fa7a01c3c',1,'Tgstation.Server.Host.Components.Repository.IRepository.IsSha()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#ad2d7497e82967ff9a18368a100c58bf1',1,'Tgstation.Server.Host.Components.Repository.Repository.IsSha()']]] +]; diff --git a/search/functions_9.html b/search/functions_9.html new file mode 100644 index 0000000000..0f05a8ba45 --- /dev/null +++ b/search/functions_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_9.js b/search/functions_9.js new file mode 100644 index 0000000000..d9aa03aba6 --- /dev/null +++ b/search/functions_9.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['jobcontroller',['JobController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html#adfbadb3527c89cc59339223bd0e3c5d8',1,'Tgstation::Server::Host::Controllers::JobController']]], + ['jobexception',['JobException',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_exception.html#a7e2640b446286941b31c2f061cbbe4bb',1,'Tgstation.Server.Host.Core.JobException.JobException()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_exception.html#a2e11923797181822e8eef7b617fe715f',1,'Tgstation.Server.Host.Core.JobException.JobException(string message)'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_exception.html#af296136e4c2ac489cfa9b0de5aa8e7cf',1,'Tgstation.Server.Host.Core.JobException.JobException(string message, Exception innerException)']]], + ['jobhandler',['JobHandler',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html#affef1fbb3f5b44febc56f4f634c64aff',1,'Tgstation::Server::Host::Core::JobHandler']]], + ['jobmanager',['JobManager',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a600fa1321291e3efc38017257e2d4970',1,'Tgstation::Server::Host::Core::JobManager']]], + ['jobprogress',['JobProgress',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager.html#ae17f251b5dab8ff001059a18f2173749',1,'Tgstation.Server.Host.Core.IJobManager.JobProgress()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#aae4939a2e804eb38fb95e5439eedcf65',1,'Tgstation.Server.Host.Core.JobManager.JobProgress()']]], + ['jobsclient',['JobsClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html#a9ffef36f7b69e7c76e31af3958797846',1,'Tgstation::Server::Client::Components::JobsClient']]], + ['jsonsubfilelist',['JsonSubFileList',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list.html#a268da56241a355906e159a88fd2f9656',1,'Tgstation.Server.Host.Components.Interop.JsonSubFileList.JsonSubFileList()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list.html#a4a823e2d73954d0b15bb88bf43e94387',1,'Tgstation.Server.Host.Components.Interop.JsonSubFileList.JsonSubFileList(JsonSubFileList copy)']]], + ['jsontrackingcontext',['JsonTrackingContext',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#ad9ce63452e0d98011d7b5e2290829e22',1,'Tgstation::Server::Host::Components::Chat::JsonTrackingContext']]] +]; diff --git a/search/functions_a.html b/search/functions_a.html new file mode 100644 index 0000000000..03faad22fa --- /dev/null +++ b/search/functions_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_a.js b/search/functions_a.js new file mode 100644 index 0000000000..2b2b151b7b --- /dev/null +++ b/search/functions_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['keepalive',['KeepAlive',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#a9689654a6dbdb16cdbfb52f9b3c4d595',1,'Tgstation.Server.Host.Components.Compiler.DmbProvider.KeepAlive()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html#adbed7f599b394dfea91f361e742ff587',1,'Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.KeepAlive()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.html#a401e38b6b2c147963eb4a6d42e41b7d3',1,'Tgstation.Server.Host.Components.IDmbProvider.KeepAlive()']]] +]; diff --git a/search/functions_b.html b/search/functions_b.html new file mode 100644 index 0000000000..c690013ae4 --- /dev/null +++ b/search/functions_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_b.js b/search/functions_b.js new file mode 100644 index 0000000000..beef30796f --- /dev/null +++ b/search/functions_b.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['latestcompilejob',['LatestCompileJob',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html#a8fbc4f11668d3fbb940b88b1b84ab6cc',1,'Tgstation.Server.Host.Components.IInstance.LatestCompileJob()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a4b1084d8d2850d408abae881013a47d9',1,'Tgstation.Server.Host.Components.Instance.LatestCompileJob()']]], + ['launch',['Launch',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#afa6b3f10617f13ae7af79317594020e3',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.Launch()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#af619caa031c183aa1aa5adbcf11a3434',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Launch()']]], + ['launchimplnolock',['LaunchImplNoLock',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a589411b1060254b846b3c5a083744441',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['launchnew',['LaunchNew',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller_factory.html#a81e24e064947e945f32e3c480c9dfba9',1,'Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory.LaunchNew()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#a9a53c980bff085803855b2131d923f14',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.LaunchNew()']]], + ['launchprocess',['LaunchProcess',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_executor.html#a1a1777b10e6d7691e2b4a42f5409c2b1',1,'Tgstation.Server.Host.Core.IProcessExecutor.LaunchProcess()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html#ae15f39beff0bc5e489ddb0c2a6ce3e45',1,'Tgstation.Server.Host.Core.ProcessExecutor.LaunchProcess()']]], + ['list',['List',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#af2441379f7420b414f37f5e18ef12e34',1,'Tgstation.Server.Api.Routes.List()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#a2e101ca44e6cd38eb8feb5e92083a58b',1,'Tgstation.Server.Client.Components.ChatBotsClient.List()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#a9abb058e8e7dc5fb6449db904e3ba593',1,'Tgstation.Server.Client.Components.ConfigurationClient.List()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html#ad482caafbf4b09fcd950b2121c384803',1,'Tgstation.Server.Client.Components.IChatBotsClient.List()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_configuration_client.html#a20e28735258c505105437c094634d3d3',1,'Tgstation.Server.Client.Components.IConfigurationClient.List()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html#aa67a2d298305192f32b1e9567aeb9b96',1,'Tgstation.Server.Client.Components.IInstanceUserClient.List()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client.html#aacb0377d1905df14195477b25ea1640c',1,'Tgstation.Server.Client.Components.IJobsClient.List()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#a3854e076413652c6e243bba0404b4caf',1,'Tgstation.Server.Client.Components.InstanceUserClient.List()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html#a7b796de436a48cc7a376e8f821294ec5',1,'Tgstation.Server.Client.Components.JobsClient.List()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html#a4d9ba68cfba405ad7a75f7a704cd9949',1,'Tgstation.Server.Client.IInstanceManagerClient.List()'],['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#a90e8afdfd1ba96a1891ca1e6cefdd5e1',1,'Tgstation.Server.Client.InstanceManagerClient.List()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.html#aee6bf0424f2533c0b5fdd9a14c530c83',1,'Tgstation.Server.Client.IUsersClient.List()'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#ae560ae12df2a21d293055557095cf173',1,'Tgstation.Server.Client.UsersClient.List()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html#a13db02f6ee64da7010e237396b65c6a0',1,'Tgstation.Server.Host.Controllers.ByondController.List()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html#a8d6f1a4319d848e50f4022ee4033d45f',1,'Tgstation.Server.Host.Controllers.ChatController.List()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#afb16c170a38d79139c95de89e25d7a77',1,'Tgstation.Server.Host.Controllers.ConfigurationController.List()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html#a4a3cee3c8ad72825df35bdc0d235961b',1,'Tgstation.Server.Host.Controllers.DreamMakerController.List()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a2afc9e8b1ba1f7a43894f7168fe5418f',1,'Tgstation.Server.Host.Controllers.InstanceController.List()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html#a7d40235b83ad9034edb4097ced8ed09b',1,'Tgstation.Server.Host.Controllers.InstanceUserController.List()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html#a4668a7f0f514c47fa1e9564d174643b1',1,'Tgstation.Server.Host.Controllers.JobController.List()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html#a7c592512d93767d2da3f40b61d58968a',1,'Tgstation.Server.Host.Controllers.ModelController.List()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#a3dded8f4741b40d33c281dee59ca8e26',1,'Tgstation.Server.Host.Controllers.UserController.List()']]], + ['listactive',['ListActive',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_jobs_client.html#ad0e3189ae3f28e20982cf4b853013725',1,'Tgstation.Server.Client.Components.IJobsClient.ListActive()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html#a6de35b6d2f313009107e2bb2e2cc4ac7',1,'Tgstation.Server.Client.Components.JobsClient.ListActive()']]], + ['listdirectory',['ListDirectory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a345e802c3d53374b244c935d2ae0047b',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.ListDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_i_configuration.html#a92a08839e2a1abad8ab26431f27ae8c6',1,'Tgstation.Server.Host.Components.StaticFiles.IConfiguration.ListDirectory()']]], + ['load',['Load',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html#a061b19ede4db939c9eaa44760dc71296',1,'Tgstation.Server.Host.Components.ReattachInfoHandler.Load()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_reattach_info_handler.html#a8ae59276bc40d0b3a422955c6de2772f',1,'Tgstation.Server.Host.Components.Watchdog.IReattachInfoHandler.Load()']]], + ['loadcachedidentity',['LoadCachedIdentity',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html#a2697ebf18fec9213032f48fb5f351397',1,'Tgstation.Server.Host.Security.IdentityCache.LoadCachedIdentity()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_identity_cache.html#afc655c9c2d6af6086bcda5b6c54e1c41',1,'Tgstation.Server.Host.Security.IIdentityCache.LoadCachedIdentity()']]], + ['loadcompilejob',['LoadCompileJob',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#acac70b83bad6a39918ffb65aa51ed8cc',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.LoadCompileJob()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_compile_job_consumer.html#a668c0ce97bba81789dc20410082865d4',1,'Tgstation.Server.Host.Components.Compiler.ICompileJobConsumer.LoadCompileJob()']]], + ['loadrepository',['LoadRepository',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository_manager.html#aca54bc5a72d05e25cc361728e80b6f1c',1,'Tgstation.Server.Host.Components.Repository.IRepositoryManager.LoadRepository()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#afcab0cdc52ae45ecd0dfba5c7630e303',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.LoadRepository()']]], + ['loadrevisioninformation',['LoadRevisionInformation',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#aa50a2c5f9429a3b52acd47e157f93e47',1,'Tgstation::Server::Host::Controllers::RepositoryController']]], + ['lock',['Lock',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html#a01e4f4e2d775bd2bf0910a1f5c2f24ef',1,'Tgstation::Server::Host::Core::SemaphoreSlimContext']]], + ['locknextdmb',['LockNextDmb',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#add7411c3c24ecb4111738e6ef9c57332',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.LockNextDmb()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory.html#adefdd87ce308d4dfe89f1639fd2c94d4',1,'Tgstation.Server.Host.Components.Compiler.IDmbFactory.LockNextDmb()']]], + ['logonuser',['LogonUser',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#a1dfa561b475b805169687e321251038c',1,'Tgstation::Server::Host::NativeMethods']]], + ['logrequest',['LogRequest',['../interface_tgstation_1_1_server_1_1_client_1_1_i_request_logger.html#a865404ae66021a7a6d95c0688e51f51c',1,'Tgstation::Server::Client::IRequestLogger']]], + ['logresponse',['LogResponse',['../interface_tgstation_1_1_server_1_1_client_1_1_i_request_logger.html#a685925403fc438eb5d3688ce8aca08b7',1,'Tgstation::Server::Client::IRequestLogger']]] +]; diff --git a/search/functions_c.html b/search/functions_c.html new file mode 100644 index 0000000000..3b2976a049 --- /dev/null +++ b/search/functions_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_c.js b/search/functions_c.js new file mode 100644 index 0000000000..ce1809f6b1 --- /dev/null +++ b/search/functions_c.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['main',['Main',['../class_tgstation_1_1_server_1_1_host_1_1_program.html#ad9df0f26f38c75cf0c376910caef770c',1,'Tgstation.Server.Host.Program.Main()'],['../class_tgstation_1_1_server_1_1_host_1_1_console_1_1_program.html#a2b1daae5257614a029bae6c5b83bce47',1,'Tgstation.Server.Host.Console.Program.Main()'],['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html#a626a9a4670edb87ce05328762d46cf8f',1,'Tgstation.Server.Host.Service.Program.Main()'],['../class_auto_generated_program.html#a10fe504a3ffa3644fc9de3ad978c9baf',1,'AutoGeneratedProgram.Main(string[] args)'],['../class_auto_generated_program.html#a10fe504a3ffa3644fc9de3ad978c9baf',1,'AutoGeneratedProgram.Main(string[] args)'],['../class_auto_generated_program.html#a10fe504a3ffa3644fc9de3ad978c9baf',1,'AutoGeneratedProgram.Main(string[] args)'],['../class_auto_generated_program.html#a10fe504a3ffa3644fc9de3ad978c9baf',1,'AutoGeneratedProgram.Main(string[] args)'],['../class_auto_generated_program.html#a10fe504a3ffa3644fc9de3ad978c9baf',1,'AutoGeneratedProgram.Main(string[] args)'],['../class_auto_generated_program.html#a10fe504a3ffa3644fc9de3ad978c9baf',1,'AutoGeneratedProgram.Main(string[] args)'],['../class_release_notes_1_1_program.html#af1f3b99a3336b8990d1015360a86c852',1,'ReleaseNotes.Program.Main()']]], + ['mapchannels',['MapChannels',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#a86d6049a36de24c5818acf1de2957d9e',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.MapChannels()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.html#a6a370b2ee042be699a24a448e41756c0',1,'Tgstation.Server.Host.Components.Chat.Providers.IProvider.MapChannels()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a41099f545ca1e6c9967fb74f931c8ef8',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.MapChannels()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#a7898cde69762bf51ee28a1597ac98d5d',1,'Tgstation.Server.Host.Components.Chat.Providers.Provider.MapChannels()']]], + ['match',['Match',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.html#acf0f8c66b9e3cfa5af8240d0efac2e36',1,'Tgstation::Server::Api::Models::Internal::DreamDaemonLaunchParameters']]], + ['mergeorigin',['MergeOrigin',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#a2911d39fd36e857c0d77503fc5c41a94',1,'Tgstation.Server.Host.Components.Repository.IRepository.MergeOrigin()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#aa2437784b303f5c523a6638d717919eb',1,'Tgstation.Server.Host.Components.Repository.Repository.MergeOrigin()']]], + ['methodnotsupportedexception',['MethodNotSupportedException',['../class_tgstation_1_1_server_1_1_client_1_1_method_not_supported_exception.html#a7fb5cb48720526b863fc7bf5ea57ef02',1,'Tgstation.Server.Client.MethodNotSupportedException.MethodNotSupportedException()'],['../class_tgstation_1_1_server_1_1_client_1_1_method_not_supported_exception.html#a37543ec8aabe8b8fa96a15243d02e318',1,'Tgstation.Server.Client.MethodNotSupportedException.MethodNotSupportedException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_method_not_supported_exception.html#a5b0a4306e368279a8b18f50a7ad6bb63',1,'Tgstation.Server.Client.MethodNotSupportedException.MethodNotSupportedException(string message, Exception innerException)']]], + ['modelcontroller',['ModelController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html#aae03be6187527e319e078f16f05f029d',1,'Tgstation::Server::Host::Controllers::ModelController']]], + ['modifydme',['ModifyDme',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a295665eca92d9eb5d17e1fb5d11c1559',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['monitorlifetimes',['MonitorLifetimes',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#ae645457cc3d46e9af4db2aab7bd5fc4c',1,'Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.MonitorLifetimes()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#a8d676609895840ea192fabcbdb385707',1,'Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.MonitorLifetimes()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a4863be0a433eff6e496eb03230759fc5',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.MonitorLifetimes()']]], + ['monitormessages',['MonitorMessages',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ac18520f70606684f373aa25bba1c25fe',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['movedirectory',['MoveDirectory',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a5c7c3fb8d450153922c11e37ea118f62',1,'Tgstation.Server.Host.IO.DefaultIOManager.MoveDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#ad8dc6ae8e69047b801a7344b17d0cc37',1,'Tgstation.Server.Host.IO.IIOManager.MoveDirectory()']]], + ['movefile',['MoveFile',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a2ecf7ea4ad7cadd294a1a4882e56a812',1,'Tgstation.Server.Host.IO.DefaultIOManager.MoveFile()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a2dff052035f4d3d0c689d0e89d8deecd',1,'Tgstation.Server.Host.IO.IIOManager.MoveFile()']]], + ['moveinstance',['MoveInstance',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.html#aa69422870da99ddea3c29e50e691d2da',1,'Tgstation.Server.Host.Components.IInstanceManager.MoveInstance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#af03d58b2af3646c99ff62db47dcf6d12',1,'Tgstation.Server.Host.Components.InstanceManager.MoveInstance()']]], + ['mysqldatabasecontext',['MySqlDatabaseContext',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_my_sql_database_context.html#a82e4370619d62057376daf22ecc290a0',1,'Tgstation::Server::Host::Models::MySqlDatabaseContext']]] +]; diff --git a/search/functions_d.html b/search/functions_d.html new file mode 100644 index 0000000000..0c542463fb --- /dev/null +++ b/search/functions_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_d.js b/search/functions_d.js new file mode 100644 index 0000000000..85e05c26d3 --- /dev/null +++ b/search/functions_d.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['nextmessage',['NextMessage',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.html#ab6cd020395b652aa9d79c00497b739fb',1,'Tgstation.Server.Host.Components.Chat.Providers.IProvider.NextMessage()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#a962a3510e617d6754d8e21a237d4b933',1,'Tgstation.Server.Host.Components.Chat.Providers.Provider.NextMessage()']]], + ['normalizeanddelete',['NormalizeAndDelete',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#ab0629dee77100aa23cc5f7934efccdb7',1,'Tgstation::Server::Host::IO::DefaultIOManager']]], + ['normalizemention',['NormalizeMention',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#a8618deb5180b94f46015301982fa36a1',1,'Tgstation::Server::Host::Components::Chat::Providers::DiscordProvider']]], + ['normalizemodelpath',['NormalizeModelPath',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a8cb3dd699b719fbc0b8068ebafd56b3d',1,'Tgstation::Server::Host::Controllers::InstanceController']]], + ['notifyoffailedreattach',['NotifyOfFailedReattach',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a8b6f38ba84751a83a7db0a28ccef95ae',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]] +]; diff --git a/search/functions_e.html b/search/functions_e.html new file mode 100644 index 0000000000..c1bd8701e9 --- /dev/null +++ b/search/functions_e.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_e.js b/search/functions_e.js new file mode 100644 index 0000000000..69c8abf380 --- /dev/null +++ b/search/functions_e.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['offlineinstance',['OfflineInstance',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.html#ad749e8ae302cb4f361be8e6641d8504f',1,'Tgstation.Server.Host.Components.IInstanceManager.OfflineInstance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a77615fe1970391e6ebe643dc3033156f',1,'Tgstation.Server.Host.Components.InstanceManager.OfflineInstance()']]], + ['onactionexecutionasync',['OnActionExecutionAsync',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#ae6314cf236db98c1e453639df84e8242',1,'Tgstation::Server::Host::Controllers::ApiController']]], + ['onconfiguring',['OnConfiguring',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_my_sql_database_context.html#a3ce3ce4b82076cf1ad9f4b8e486890bf',1,'Tgstation.Server.Host.Models.MySqlDatabaseContext.OnConfiguring()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context.html#ab675eb66a3bd5177c3b40eafaf041e9a',1,'Tgstation.Server.Host.Models.SqlServerDatabaseContext.OnConfiguring()']]], + ['onexecuteasync',['OnExecuteAsync',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html#a86d24d735c64eb7c67a935b809927dd4',1,'Tgstation::Server::Host::Service::Program']]], + ['onlineinstance',['OnlineInstance',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance_manager.html#af016d9fc2c80b6b2849540f2cd1ddfda',1,'Tgstation.Server.Host.Components.IInstanceManager.OnlineInstance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a00b4178d67ebc7ac4b0e3fe87484df15',1,'Tgstation.Server.Host.Components.InstanceManager.OnlineInstance()']]], + ['onmodelcreating',['OnModelCreating',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#abe2f492adf2ca108188e6f14a3c8c512',1,'Tgstation::Server::Host::Models::DatabaseContext']]], + ['onstart',['OnStart',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a40bef17d85eb30f2cbad7ed81ef9c774',1,'Tgstation::Server::Host::Service::ServerService']]], + ['onstop',['OnStop',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a6e54a00e5d8fc3f0629277f2bb7274ba',1,'Tgstation::Server::Host::Service::ServerService']]], + ['openwritestream',['OpenWriteStream',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a888245bfe6d20d98807cec9257289a03',1,'Tgstation::Server::Host::IO::DefaultIOManager']]] +]; diff --git a/search/functions_f.html b/search/functions_f.html new file mode 100644 index 0000000000..38b6e817c8 --- /dev/null +++ b/search/functions_f.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/functions_f.js b/search/functions_f.js new file mode 100644 index 0000000000..7e6b81d556 --- /dev/null +++ b/search/functions_f.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['patch_3c_20tresult_20_3e',['Patch< TResult >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a2c706947515724ff353a3b1422815ff8',1,'Tgstation.Server.Client.ApiClient.Patch< TResult >()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a28294924cb1336289469fbfa5de2f61f',1,'Tgstation.Server.Client.IApiClient.Patch< TResult >()']]], + ['pathcontainsparentaccess',['PathContainsParentAccess',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#aa2dfcb05f73420f251547ae0108b3222',1,'Tgstation.Server.Host.IO.DefaultIOManager.PathContainsParentAccess()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#af05931d02f5f5d95b87a56c0cc60d855',1,'Tgstation.Server.Host.IO.IIOManager.PathContainsParentAccess()']]], + ['platformidentifier',['PlatformIdentifier',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_platform_identifier.html#a5fc0677e82945f0ecd679f95d89e21a7',1,'Tgstation::Server::Host::Core::PlatformIdentifier']]], + ['populateapi',['PopulateApi',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#a169541f29e0361eaba0bf8ba85624f10',1,'Tgstation::Server::Host::Controllers::RepositoryController']]], + ['posixbyondinstaller',['PosixByondInstaller',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#a50d25ab6f657fb56ceb74831d6656c60',1,'Tgstation::Server::Host::Components::Byond::PosixByondInstaller']]], + ['pressanykeyasync',['PressAnyKeyAsync',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.html#ad10bdc2971cb4068b3fe0d46aa7cb167',1,'Tgstation.Server.Host.IO.Console.PressAnyKeyAsync()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console.html#ad674c458bbe343698fb0da3494bf3e37',1,'Tgstation.Server.Host.IO.IConsole.PressAnyKeyAsync()']]], + ['process',['Process',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a622737e9c97152cfe56a81f2721dca04',1,'Tgstation::Server::Host::Core::Process']]], + ['processexecutor',['ProcessExecutor',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html#ade5e5044a7817d2b606e058d0707faf7',1,'Tgstation::Server::Host::Core::ProcessExecutor']]], + ['processmessage',['ProcessMessage',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a57210321fe78dea227d4aa8c9764ba9a',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['progresstask',['ProgressTask',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a64bc3c5708758312281bbcd8a6b54149',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['promptforhostingport',['PromptForHostingPort',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a8768c71828396ea36792de7e1e0d68b0',1,'Tgstation::Server::Host::Core::SetupWizard']]], + ['promptyesno',['PromptYesNo',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a439d28e66cccf8b111c37f7c67135dc3',1,'Tgstation::Server::Host::Core::SetupWizard']]], + ['provider',['Provider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#a5e04da11d3a242b4d32ad95c4cf2bb75',1,'Tgstation::Server::Host::Components::Chat::Providers::Provider']]], + ['providerfactory',['ProviderFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html#aa29104de105fbc85b60b43d6f6a6fa85',1,'Tgstation::Server::Host::Components::Chat::ProviderFactory']]], + ['pullrequestscommand',['PullRequestsCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#a96ba3e78b38424740cda93576b897bf6',1,'Tgstation::Server::Host::Components::Chat::Commands::PullRequestsCommand']]], + ['pushheadtotemporarybranch',['PushHeadToTemporaryBranch',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a96553d378f9b7d9cfc4eb169f12bdba7',1,'Tgstation::Server::Host::Components::Repository::Repository']]] +]; diff --git a/search/mag_sel.png b/search/mag_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..39c0ed52a25dd9d080ee0d42ae6c6042bdfa04d7 GIT binary patch literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz6!2%?$TA$hhDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~NU84L`?eGCi_EEpJ?t}-xGu`@87+QPtK?83kxQ`TapwHK(CDaqU2h2ejD|C#+j z9%q3^WHAE+w=f7ZGR&GI0Tg5}@$_|Nf5gMiEhFgvHvB$N=!mC_V~EE2vzPXI9ZnEo zd+1zHor@dYLod2Y{ z@R$7$Z!PXTbY$|@#T!bMzm?`b<(R`cbw(gxJHzu zB$lLFB^RXvDF!10LknF)BV7aY5JN*NBMU1-b8Q0yD+2>vd*|CI8glbfGSez?Ylunu RoetE%;OXk;vd$@?2>>CYplSdB literal 0 HcmV?d00001 diff --git a/search/namespaces_0.html b/search/namespaces_0.html new file mode 100644 index 0000000000..c534537918 --- /dev/null +++ b/search/namespaces_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/namespaces_0.js b/search/namespaces_0.js new file mode 100644 index 0000000000..fc4f3ea8e4 --- /dev/null +++ b/search/namespaces_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['releasenotes',['ReleaseNotes',['../namespace_release_notes.html',1,'']]] +]; diff --git a/search/namespaces_1.html b/search/namespaces_1.html new file mode 100644 index 0000000000..8b44a3c9b4 --- /dev/null +++ b/search/namespaces_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/namespaces_1.js b/search/namespaces_1.js new file mode 100644 index 0000000000..14c96eda08 --- /dev/null +++ b/search/namespaces_1.js @@ -0,0 +1,31 @@ +var searchData= +[ + ['api',['Api',['../namespace_tgstation_1_1_server_1_1_api.html',1,'Tgstation::Server']]], + ['byond',['Byond',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond.html',1,'Tgstation::Server::Host::Components']]], + ['chat',['Chat',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat.html',1,'Tgstation::Server::Host::Components']]], + ['client',['Client',['../namespace_tgstation_1_1_server_1_1_client.html',1,'Tgstation::Server']]], + ['commands',['Commands',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['compiler',['Compiler',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler.html',1,'Tgstation::Server::Host::Components']]], + ['components',['Components',['../namespace_tgstation_1_1_server_1_1_client_1_1_components.html',1,'Tgstation.Server.Client.Components'],['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html',1,'Tgstation.Server.Host.Components']]], + ['configuration',['Configuration',['../namespace_tgstation_1_1_server_1_1_host_1_1_configuration.html',1,'Tgstation::Server::Host']]], + ['console',['Console',['../namespace_tgstation_1_1_server_1_1_host_1_1_console.html',1,'Tgstation::Server::Host']]], + ['controllers',['Controllers',['../namespace_tgstation_1_1_server_1_1_host_1_1_controllers.html',1,'Tgstation::Server::Host']]], + ['core',['Core',['../namespace_tgstation_1_1_server_1_1_host_1_1_core.html',1,'Tgstation::Server::Host']]], + ['host',['Host',['../namespace_tgstation_1_1_server_1_1_host.html',1,'Tgstation::Server']]], + ['instance',['Instance',['../namespace_tgstation_1_1_server_1_1_tests_1_1_instance.html',1,'Tgstation::Server::Tests']]], + ['internal',['Internal',['../namespace_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal.html',1,'Tgstation::Server::Api::Models']]], + ['interop',['Interop',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop.html',1,'Tgstation::Server::Host::Components']]], + ['io',['IO',['../namespace_tgstation_1_1_server_1_1_host_1_1_i_o.html',1,'Tgstation::Server::Host']]], + ['migrations',['Migrations',['../namespace_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations.html',1,'Tgstation::Server::Host::Models']]], + ['models',['Models',['../namespace_tgstation_1_1_server_1_1_api_1_1_models.html',1,'Tgstation.Server.Api.Models'],['../namespace_tgstation_1_1_server_1_1_host_1_1_models.html',1,'Tgstation.Server.Host.Models']]], + ['providers',['Providers',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['repository',['Repository',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository.html',1,'Tgstation::Server::Host::Components']]], + ['rights',['Rights',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html',1,'Tgstation::Server::Api']]], + ['security',['Security',['../namespace_tgstation_1_1_server_1_1_host_1_1_security.html',1,'Tgstation::Server::Host']]], + ['server',['Server',['../namespace_tgstation_1_1_server.html',1,'Tgstation']]], + ['service',['Service',['../namespace_tgstation_1_1_server_1_1_host_1_1_service.html',1,'Tgstation::Server::Host']]], + ['staticfiles',['StaticFiles',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files.html',1,'Tgstation::Server::Host::Components']]], + ['tests',['Tests',['../namespace_tgstation_1_1_server_1_1_api_1_1_models_1_1_tests.html',1,'Tgstation.Server.Api.Models.Tests'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights_1_1_tests.html',1,'Tgstation.Server.Api.Rights.Tests'],['../namespace_tgstation_1_1_server_1_1_api_1_1_tests.html',1,'Tgstation.Server.Api.Tests'],['../namespace_tgstation_1_1_server_1_1_client_1_1_components_1_1_tests.html',1,'Tgstation.Server.Client.Components.Tests'],['../namespace_tgstation_1_1_server_1_1_client_1_1_tests.html',1,'Tgstation.Server.Client.Tests'],['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_tests.html',1,'Tgstation.Server.Host.Components.Byond.Tests'],['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests.html',1,'Tgstation.Server.Host.Components.Chat.Providers.Tests'],['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_tests.html',1,'Tgstation.Server.Host.Components.Watchdog.Tests'],['../namespace_tgstation_1_1_server_1_1_host_1_1_console_1_1_tests.html',1,'Tgstation.Server.Host.Console.Tests'],['../namespace_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests.html',1,'Tgstation.Server.Host.Core.Tests'],['../namespace_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests.html',1,'Tgstation.Server.Host.IO.Tests'],['../namespace_tgstation_1_1_server_1_1_host_1_1_security_1_1_tests.html',1,'Tgstation.Server.Host.Security.Tests'],['../namespace_tgstation_1_1_server_1_1_host_1_1_service_1_1_tests.html',1,'Tgstation.Server.Host.Service.Tests'],['../namespace_tgstation_1_1_server_1_1_host_1_1_tests.html',1,'Tgstation.Server.Host.Tests'],['../namespace_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_tests.html',1,'Tgstation.Server.Host.Watchdog.Tests'],['../namespace_tgstation_1_1_server_1_1_tests.html',1,'Tgstation.Server.Tests']]], + ['tgstation',['Tgstation',['../namespace_tgstation.html',1,'']]], + ['watchdog',['Watchdog',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html',1,'Tgstation.Server.Host.Components.Watchdog'],['../namespace_tgstation_1_1_server_1_1_host_1_1_watchdog.html',1,'Tgstation.Server.Host.Watchdog']]] +]; diff --git a/search/nomatches.html b/search/nomatches.html new file mode 100644 index 0000000000..4377320895 --- /dev/null +++ b/search/nomatches.html @@ -0,0 +1,12 @@ + + + + + + + +
+
No Matches
+
+ + diff --git a/search/pages_0.html b/search/pages_0.html new file mode 100644 index 0000000000..3d06b05219 --- /dev/null +++ b/search/pages_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/pages_0.js b/search/pages_0.js new file mode 100644 index 0000000000..0845f57dae --- /dev/null +++ b/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api',['API',['../api.html',1,'']]] +]; diff --git a/search/pages_1.html b/search/pages_1.html new file mode 100644 index 0000000000..06f1e40f07 --- /dev/null +++ b/search/pages_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/pages_1.js b/search/pages_1.js new file mode 100644 index 0000000000..33d5451359 --- /dev/null +++ b/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['server_20architecture',['Server Architecture',['../architecture.html',1,'']]] +]; diff --git a/search/pages_2.html b/search/pages_2.html new file mode 100644 index 0000000000..703f781bd4 --- /dev/null +++ b/search/pages_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/pages_2.js b/search/pages_2.js new file mode 100644 index 0000000000..a8ee9bdfa0 --- /dev/null +++ b/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['tgstation_2dserver_20v4_3a',['tgstation-server v4:',['../index.html',1,'']]] +]; diff --git a/search/properties_0.html b/search/properties_0.html new file mode 100644 index 0000000000..4762c6b2e8 --- /dev/null +++ b/search/properties_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_0.js b/search/properties_0.js new file mode 100644 index 0000000000..1d81ea163b --- /dev/null +++ b/search/properties_0.js @@ -0,0 +1,38 @@ +var searchData= +[ + ['accessdenied',['AccessDenied',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html#acb78a02b4881844e9412384563d9d78d',1,'Tgstation::Server::Api::Models::ConfigurationFile']]], + ['accessidentifier',['AccessIdentifier',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html#a2bd99b30ed4d54d87603c04e2feef05b',1,'Tgstation.Server.Host.Components.Interop.JsonFile.AccessIdentifier()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html#a5e04032bcdd57e2008d0072359321aef',1,'Tgstation.Server.Host.Models.ReattachInformationBase.AccessIdentifier()']]], + ['accesstoken',['AccessToken',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#a01d23bbd00ea0d0ef0562690dda05d68',1,'Tgstation.Server.Api.Models.Internal.RepositorySettings.AccessToken()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html#a8f0e23dc0b852a011d12ed8b092e3d95',1,'Tgstation.Server.Host.Models.DreamDaemonSettings.AccessToken()']]], + ['accessuser',['AccessUser',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#abd68bd6a273689244ef32837167a017b',1,'Tgstation::Server::Api::Models::Internal::RepositorySettings']]], + ['active',['Active',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_i_json_tracking_context.html#a95e3032dfe80bf9b43319cd748e92f43',1,'Tgstation.Server.Host.Components.Chat.IJsonTrackingContext.Active()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#ae49232400fdffefa09614f56ebaf30a3',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext.Active()']]], + ['activecompilejob',['ActiveCompileJob',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html#a311301ac58f15b03a82b11eb0788a450',1,'Tgstation.Server.Api.Models.DreamDaemon.ActiveCompileJob()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#a23f9971c8bc84a87cfaf08744eaaee0d',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.ActiveCompileJob()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a45abee7a1738182e8dc0fd27544dbc79',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ActiveCompileJob()']]], + ['activejob',['ActiveJob',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html#a9f29b34852fb2d6cc5144234b6368295',1,'Tgstation::Server::Api::Models::Repository']]], + ['activelaunchparameters',['ActiveLaunchParameters',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#a19270c2054e4431802fdf5a59f9b3518',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.ActiveLaunchParameters()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a9affc2eeae2903d1bdb0fa81a6550fc4',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.ActiveLaunchParameters()']]], + ['activeparametersupdated',['ActiveParametersUpdated',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#afee401fd5e0d23482b77498b6ec23a03',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['activeserver',['ActiveServer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_monitor_state.html#a2dd69b0c4244d5e4bc042c29fda80991',1,'Tgstation::Server::Host::Components::Watchdog::MonitorState']]], + ['activetestmerges',['ActiveTestMerges',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information.html#ac2fdbb439533190464a6853975fa5a6c',1,'Tgstation.Server.Api.Models.RevisionInformation.ActiveTestMerges()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html#a25414bdca3caccf6cbb2a9924ee1e51a',1,'Tgstation.Server.Host.Models.RevisionInformation.ActiveTestMerges()']]], + ['activeversion',['ActiveVersion',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a3e62e619b7e50c3b9c990952d7a426be',1,'Tgstation.Server.Host.Components.Byond.ByondManager.ActiveVersion()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_manager.html#a4bbf7c36cfdbbbdc5a87813d0d6959f6',1,'Tgstation.Server.Host.Components.Byond.IByondManager.ActiveVersion()']]], + ['address',['Address',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#a742b0cb17d7a59090cac73f8cc147743',1,'Tgstation::Server::Api::Models::IrcConnectionStringBuilder']]], + ['administration',['Administration',['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html#a170097fe653238823c6a3c5a07c4ec94',1,'Tgstation.Server.Client.IServerClient.Administration()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#af81da913067b74f5e8098c6106fda1af',1,'Tgstation.Server.Client.ServerClient.Administration()']]], + ['administrationrights',['AdministrationRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#ad28e489fcb8df51b4ba2f5cdf5dd5d22',1,'Tgstation::Server::Api::Models::Internal::User']]], + ['adminonly',['AdminOnly',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.html#a32556e6bc56cad31d993e4be70e7ca60',1,'Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.AdminOnly()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command.html#a0872d9ed0ba21f3decc6d5303001fc8e',1,'Tgstation.Server.Host.Components.Chat.Commands.ICommand.AdminOnly()']]], + ['allowanyorigin',['AllowAnyOrigin',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_control_panel_configuration.html#a5c0b28cdbd801a02bce701901a060818',1,'Tgstation::Server::Host::Configuration::ControlPanelConfiguration']]], + ['allowedorigins',['AllowedOrigins',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_control_panel_configuration.html#a7f0a8f0d0540bb5832bf61c86a98b202',1,'Tgstation::Server::Host::Configuration::ControlPanelConfiguration']]], + ['allowwebclient',['AllowWebClient',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.html#a5f96244396a57f351043723b254803bc',1,'Tgstation::Server::Api::Models::Internal::DreamDaemonLaunchParameters']]], + ['alpha',['Alpha',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information.html#ad4200a3bfd73794a43632ca0cc0159db',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.Alpha()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information.html#a3a49df7a56bfa54062a9ff6b71da2390',1,'Tgstation.Server.Host.Models.WatchdogReattachInformation.Alpha()']]], + ['alphaisactive',['AlphaIsActive',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#abbbd1824bcf972a1eb312c12780fc0bc',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.AlphaIsActive()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a39f77bb87d63b1a1a50aac89ad909f29',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.AlphaIsActive()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base.html#a5aedd7a86a8a880e075bc414cba587bf',1,'Tgstation.Server.Host.Models.WatchdogReattachInformationBase.AlphaIsActive()']]], + ['apiheaders',['ApiHeaders',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#a1934074118a6f4f9044b9da630c91a8e',1,'Tgstation::Server::Host::Controllers::ApiController']]], + ['apivalidateonly',['ApiValidateOnly',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html#a4eed58bec180ca4d6b45764fb97459d9',1,'Tgstation::Server::Host::Components::Interop::JsonFile']]], + ['apivalidationport',['ApiValidationPort',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker.html#a4b421130ab4c6b6836f8dfbf4f8df02e',1,'Tgstation::Server::Api::Models::DreamMaker']]], + ['apivalidationsecuritylevel',['ApiValidationSecurityLevel',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker.html#abfa04639a2bfa207aef060ca84a732da',1,'Tgstation::Server::Api::Models::DreamMaker']]], + ['apivalidationstatus',['ApiValidationStatus',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#a420a602d40898c12599cba77b1df12af',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.ApiValidationStatus()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a983fd5bf0d56d06d9906c69cbd7a81d7',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.ApiValidationStatus()']]], + ['apiversion',['ApiVersion',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a4769bf50b06d55b116a34cd1ffa04809',1,'Tgstation.Server.Api.ApiHeaders.ApiVersion()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_server_information.html#af00e7c69acbf29c56b72db2e9ffdaa73',1,'Tgstation.Server.Api.Models.ServerInformation.ApiVersion()']]], + ['asyncdelayer',['AsyncDelayer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#abbdc59de3b3556a08bd111264527f369',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['authenticationcontext',['AuthenticationContext',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#af37f0d0021bc861bea5444108a4de87d',1,'Tgstation::Server::Host::Controllers::ApiController']]], + ['author',['Author',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.html#afcd90fdf59c804fd367867b053a7b075',1,'Tgstation::Server::Api::Models::Internal::TestMergeBase']]], + ['autostart',['AutoStart',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_settings.html#ad042a8ceccbcbed55dfabbdebd45b162',1,'Tgstation::Server::Api::Models::Internal::DreamDaemonSettings']]], + ['autoupdateinterval',['AutoUpdateInterval',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html#aebe907c68112eae3f1ac2dfdf384ec5b',1,'Tgstation::Server::Api::Models::Instance']]], + ['autoupdateskeeptestmerges',['AutoUpdatesKeepTestMerges',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#ad376f28c643709a12b1a95196f4fe38f',1,'Tgstation::Server::Api::Models::Internal::RepositorySettings']]], + ['autoupdatessynchronize',['AutoUpdatesSynchronize',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#a771f7bdc30a0f666c1eaba7210dfb690',1,'Tgstation::Server::Api::Models::Internal::RepositorySettings']]], + ['available',['Available',['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console.html#ab35fa75560527910780645de7dc54ca8',1,'Tgstation::Server::Host::IO::IConsole']]] +]; diff --git a/search/properties_1.html b/search/properties_1.html new file mode 100644 index 0000000000..1635f1a7b4 --- /dev/null +++ b/search/properties_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_1.js b/search/properties_1.js new file mode 100644 index 0000000000..1260b98860 --- /dev/null +++ b/search/properties_1.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['bearer',['Bearer',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_token.html#adaaa6a5dbcd9ee26980f1040571a68b7',1,'Tgstation::Server::Api::Models::Token']]], + ['bodyatmerge',['BodyAtMerge',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.html#a85b9d0866f61c6904480df0ef3abacfb',1,'Tgstation::Server::Api::Models::Internal::TestMergeBase']]], + ['botmention',['BotMention',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#af40c0ea392de9986a4705d403674f61c',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.BotMention()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.html#a781f872cb8143fe3ff92f3cc8d0d5abb',1,'Tgstation.Server.Host.Components.Chat.Providers.IProvider.BotMention()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#a3a3ca6a84bbd0adac5990f8d07601f49',1,'Tgstation.Server.Host.Components.Chat.Providers.Provider.BotMention()']]], + ['bottoken',['BotToken',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder.html#a39978f862c219ec5ef28e3ff63f048e7',1,'Tgstation::Server::Api::Models::DiscordConnectionStringBuilder']]], + ['bravo',['Bravo',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information.html#ae62a1d681a37fd5478d92be9d6da0c56',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogReattachInformation.Bravo()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information.html#a47092ae40bc086c89dca16a0d9acc5ec',1,'Tgstation.Server.Host.Models.WatchdogReattachInformation.Bravo()']]], + ['byond',['Byond',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#a9232f67ce6e82fce57740789d0202357',1,'Tgstation.Server.Client.Components.IInstanceClient.Byond()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a473bf90090e8d3c2b5d4e6689b5ea31f',1,'Tgstation.Server.Client.Components.InstanceClient.Byond()']]], + ['byondmanager',['ByondManager',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html#aac40deacf0a4f16267395cda353e5b23',1,'Tgstation.Server.Host.Components.IInstance.ByondManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#adcf63127cc4d66507994449215611ba4',1,'Tgstation.Server.Host.Components.Instance.ByondManager()']]], + ['byondrights',['ByondRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html#af3250017587c5794a9b2501e97d8896d',1,'Tgstation::Server::Api::Models::InstanceUser']]], + ['byondtopictimeout',['ByondTopicTimeout',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html#aa870a193d3830dcf7b7674f8989ba0b0',1,'Tgstation::Server::Host::Configuration::GeneralConfiguration']]], + ['byondversion',['ByondVersion',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job.html#afc996546d665a5ac2135e4e4fae88eb5',1,'Tgstation.Server.Api.Models.CompileJob.ByondVersion()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.html#a009667890d52e30a93a5cd8f15b89904',1,'Tgstation.Server.Host.Models.CompileJob.ByondVersion()']]] +]; diff --git a/search/properties_10.html b/search/properties_10.html new file mode 100644 index 0000000000..e622275f14 --- /dev/null +++ b/search/properties_10.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_10.js b/search/properties_10.js new file mode 100644 index 0000000000..2a3c41732d --- /dev/null +++ b/search/properties_10.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['scriptfileextension',['ScriptFileExtension',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_platform_identifier.html#a44133d2882a25ade2ab52588c9d1cdb3',1,'Tgstation.Server.Host.Core.IPlatformIdentifier.ScriptFileExtension()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_platform_identifier.html#a6605782a19fe372a97b07270125fa885',1,'Tgstation.Server.Host.Core.PlatformIdentifier.ScriptFileExtension()']]], + ['secondarydirectory',['SecondaryDirectory',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.html#ab815ba06901d8064ab7451667f1fc58a',1,'Tgstation::Server::Host::Components::IDmbProvider']]], + ['secondaryport',['SecondaryPort',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.html#ad45d0d4381f4e8bc4be6e5d050382080',1,'Tgstation::Server::Api::Models::Internal::DreamDaemonLaunchParameters']]], + ['securitylevel',['SecurityLevel',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.html#aab2ca846e0aade7de3cfcea099f40fa4',1,'Tgstation.Server.Api.Models.Internal.DreamDaemonLaunchParameters.SecurityLevel()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html#ab8c25fac824bd44da5b7aa1a1256d793',1,'Tgstation.Server.Host.Components.Interop.JsonFile.SecurityLevel()']]], + ['semaphore',['Semaphore',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a96d8bb542f16398eada0a59c00955005',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['serverapiversion',['ServerApiVersion',['../class_tgstation_1_1_server_1_1_client_1_1_client_exception.html#a2bc432cbd374898f5a3e65f14aeb606b',1,'Tgstation::Server::Client::ClientException']]], + ['servercommandsjson',['ServerCommandsJson',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html#a1334d58a732afc470443e4c68a1ee405',1,'Tgstation.Server.Host.Components.Interop.JsonFile.ServerCommandsJson()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list.html#ae3409b5ad7f9e915e961427d80376ed1',1,'Tgstation.Server.Host.Components.Interop.JsonSubFileList.ServerCommandsJson()']]], + ['sessioncontrollerfactory',['SessionControllerFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a24eb5f0e32cd79487cd9bd80d5257abb',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['setupwizardmode',['SetupWizardMode',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html#ace6cef6156eebad4a760e3d9f58dcb7e',1,'Tgstation::Server::Host::Configuration::GeneralConfiguration']]], + ['severapiversion',['SeverApiVersion',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html#a19535256c75f895fa8d5c0b7cef0424c',1,'Tgstation::Server::Api::Models::ErrorMessage']]], + ['showtestmergecommitters',['ShowTestMergeCommitters',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#ad0559033aa2ab7b93c9e63e3b31d2ddd',1,'Tgstation::Server::Api::Models::Internal::RepositorySettings']]], + ['softrestart',['SoftRestart',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_settings.html#a8f0524cddb16cbeba06c8efb91099887',1,'Tgstation::Server::Api::Models::Internal::DreamDaemonSettings']]], + ['softshutdown',['SoftShutdown',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_settings.html#aad572af1215517120400e46b633afd02',1,'Tgstation::Server::Api::Models::Internal::DreamDaemonSettings']]], + ['stagedcompilejob',['StagedCompileJob',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html#a7554a23c04eba3508897073aeb5150fe',1,'Tgstation::Server::Api::Models::DreamDaemon']]], + ['startedat',['StartedAt',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html#a0988d9930cae8f698a17c20d3e8cec9a',1,'Tgstation::Server::Api::Models::Internal::Job']]], + ['startedby',['StartedBy',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job.html#a85997775934f3449582bcc13f3fdfa52',1,'Tgstation.Server.Api.Models.Job.StartedBy()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html#aeb64c30e0787225682030adf2d2af036',1,'Tgstation.Server.Host.Models.Job.StartedBy()']]], + ['startup',['Startup',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.html#aa185f10c39a857423d715ce9a2d40355',1,'Tgstation.Server.Host.Core.IProcess.Startup()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#aaa8635a40b6cccf556d9ccaacfdb47ec',1,'Tgstation.Server.Host.Core.Process.Startup()']]], + ['startuptime',['StartupTime',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_launch_result.html#abd071a9c148f21989c89490106d3f904',1,'Tgstation::Server::Host::Components::Watchdog::LaunchResult']]], + ['startuptimeout',['StartupTimeout',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.html#aa3ac63088b89bf67dd5fdbe67970b03d',1,'Tgstation::Server::Api::Models::Internal::DreamDaemonLaunchParameters']]], + ['statuscode',['StatusCode',['../class_tgstation_1_1_server_1_1_client_1_1_client_exception.html#a443523d368932789a1ec2a332199d5e6',1,'Tgstation::Server::Client::ClientException']]], + ['stoppedat',['StoppedAt',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html#a2b6b6dbe1243f140d9fb04767ea16c61',1,'Tgstation::Server::Api::Models::Internal::Job']]], + ['systemidentifier',['SystemIdentifier',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#afa19e8180a87c821a7b77d27765c1824',1,'Tgstation::Server::Api::Models::Internal::User']]], + ['systemidentity',['SystemIdentity',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a05ce72960f78e0a11148f44292f3fb7b',1,'Tgstation.Server.Host.Security.AuthenticationContext.SystemIdentity()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context.html#a01b4dc318a62fa3b321593418eb1247e',1,'Tgstation.Server.Host.Security.IAuthenticationContext.SystemIdentity()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.html#a86a823a9e7ee94f2497bfae86c1efeed',1,'Tgstation.Server.Host.Security.IdentityCacheObject.SystemIdentity()']]] +]; diff --git a/search/properties_11.html b/search/properties_11.html new file mode 100644 index 0000000000..9cab16e413 --- /dev/null +++ b/search/properties_11.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_11.js b/search/properties_11.js new file mode 100644 index 0000000000..39afdb7d45 --- /dev/null +++ b/search/properties_11.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['tag',['Tag',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html#afbaa58b791797ca845c1b49a0fa758c1',1,'Tgstation.Server.Api.Models.ChatChannel.Tag()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html#a883160d1391d307f9c860f1d67be0d9d',1,'Tgstation.Server.Host.Components.Chat.Channel.Tag()']]], + ['tailincludeline',['TailIncludeLine',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_server_side_modifications.html#ac479bad6bd50784c761ee4ea93ab12e7',1,'Tgstation::Server::Host::Components::StaticFiles::ServerSideModifications']]], + ['terminationwasrequested',['TerminationWasRequested',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#af1deb0ef8ce6a9f45326caa2e7aa78ea',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.TerminationWasRequested()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#ac1af411aad68101ede7a310e2c34ed91',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.TerminationWasRequested()']]], + ['testmerge',['TestMerge',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_rev_info_test_merge.html#a76c0f83e9fc28eeefb8ed97592cd368b',1,'Tgstation::Server::Host::Models::RevInfoTestMerge']]], + ['testmerges',['TestMerges',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html#abb440678a4171fc2c42eb40486469a04',1,'Tgstation.Server.Host.Components.Interop.JsonFile.TestMerges()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a27e34b4cc5f4132d3cf69e0add4e61dd',1,'Tgstation.Server.Host.Models.DatabaseContext.TestMerges()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#a5f8f59f3f214e70074238431b914cbf4',1,'Tgstation.Server.Host.Models.User.TestMerges()']]], + ['timemerged',['TimeMerged',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge.html#a4c3d6b3f0d31bf6bd90efafab77ce4b7',1,'Tgstation::Server::Host::Components::Interop::TestMerge']]], + ['timeout',['Timeout',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a015e61f9e9728ad9b47c175445ea67a1',1,'Tgstation.Server.Client.ApiClient.Timeout()'],['../class_tgstation_1_1_server_1_1_client_1_1_http_client.html#a1c5eb3e376e012d3ca08caf71b009a22',1,'Tgstation.Server.Client.HttpClient.Timeout()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a92b092701f159c344a3c78be34161ecf',1,'Tgstation.Server.Client.IApiClient.Timeout()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_http_client.html#ad27a406c0398b4824889a0020ee291aa',1,'Tgstation.Server.Client.IHttpClient.Timeout()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html#aa1c1488dd8438023b24c87a32e09d5fe',1,'Tgstation.Server.Client.IServerClient.Timeout()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a7d3be56a549f9aedb631bb3824dd5790',1,'Tgstation.Server.Client.ServerClient.Timeout()']]], + ['titleatmerge',['TitleAtMerge',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.html#a959c2922c726be725daac329f9b21e46',1,'Tgstation::Server::Api::Models::Internal::TestMergeBase']]], + ['token',['Token',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a6a6105b1f7b3dafd096e5e11057aac8d',1,'Tgstation.Server.Api.ApiHeaders.Token()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html#ab3363ffdb533616bd2b6688559f9def1',1,'Tgstation.Server.Client.IServerClient.Token()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a9c54c9b21bfad615f275484dafc6decc',1,'Tgstation.Server.Client.ServerClient.Token()']]], + ['totaldmeoverwrite',['TotalDmeOverwrite',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_server_side_modifications.html#ac81394b6c071d9779ab94c8151281723',1,'Tgstation::Server::Host::Components::StaticFiles::ServerSideModifications']]], + ['trace',['Trace',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html#a5d7201b8cfa09c341ec68d81297aabad',1,'Tgstation::Server::Host::Service::Program']]], + ['trackedrepositoryurl',['TrackedRepositoryUrl',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_administration.html#afd9c90cc8b192e20ab018d56c08fcbea',1,'Tgstation::Server::Api::Models::Administration']]], + ['tracking',['Tracking',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#a422e7c7f5d5ac88a75693311521b5d6a',1,'Tgstation::Server::Host::Components::Repository::IRepository']]], + ['type',['Type',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_event_notification.html#a20c514ac2837bebd05982a5bfa9f8f73',1,'Tgstation::Server::Host::Components::Interop::EventNotification']]] +]; diff --git a/search/properties_12.html b/search/properties_12.html new file mode 100644 index 0000000000..a4699f4746 --- /dev/null +++ b/search/properties_12.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_12.js b/search/properties_12.js new file mode 100644 index 0000000000..10f48a2dff --- /dev/null +++ b/search/properties_12.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['uid',['Uid',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity.html#a21339e0b4c3d045ba30c6ac6ea15aa4f',1,'Tgstation::Server::Host::Security::ISystemIdentity']]], + ['uninstall',['Uninstall',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html#a6868da29a3857b56bba33e5d7c623b68',1,'Tgstation::Server::Host::Service::Program']]], + ['updatefromorigin',['UpdateFromOrigin',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html#ac917f08ca0b2f81b49544a1b7b9d3757',1,'Tgstation::Server::Api::Models::Repository']]], + ['updatepackageassetname',['UpdatePackageAssetName',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html#a7f5697f355392923d10aa77a8e94dc91',1,'Tgstation::Server::Host::Configuration::UpdatesConfiguration']]], + ['url',['Url',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.html#ab40be7f3d663eaea7b465ca203957629',1,'Tgstation.Server.Api.Models.Internal.TestMergeBase.Url()'],['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a33675bc7469cf1e0dd8f1a21dbaa71a2',1,'Tgstation.Server.Client.ApiClient.Url()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a0efbf73e1dfbee520ceafa593ee2ec51',1,'Tgstation.Server.Client.IApiClient.Url()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html#a2c34434ebb4af540cbd3ec67fc116396',1,'Tgstation.Server.Client.IServerClient.Url()'],['../class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html#ae3c1967267a99741f85146f0cca92a0f',1,'Tgstation.Server.Tests.TestingServer.Url()']]], + ['useexperimentalwatchdog',['UseExperimentalWatchdog',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html#aba344f151bae43f8f48c4c8ca2f483f7',1,'Tgstation::Server::Host::Configuration::GeneralConfiguration']]], + ['user',['User',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_message.html#a0a9daf5887cdd378b7c0a1997c037f4c',1,'Tgstation.Server.Host.Components.Chat.Providers.Message.User()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_command.html#a2d336aec28cd11a3c07d11e506f91026',1,'Tgstation.Server.Host.Components.Interop.ChatCommand.User()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a0846ac9679599a99923987863edb0d5c',1,'Tgstation.Server.Host.Security.AuthenticationContext.User()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context.html#ae2e7c0c04d2797b9a24a9776277ec77b',1,'Tgstation.Server.Host.Security.IAuthenticationContext.User()']]], + ['userid',['UserId',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html#a0b6e52341908af31f36b90ef2d2c89d6',1,'Tgstation::Server::Api::Models::InstanceUser']]], + ['username',['Username',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a13fe189bd2726abf51f2aefa06c08383',1,'Tgstation.Server.Api.ApiHeaders.Username()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_system_identity.html#abdae9176f2609703ff36c43d7af97ac1',1,'Tgstation.Server.Host.Security.ISystemIdentity.Username()']]], + ['users',['Users',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#acbd79ed6748d8aac0bd0500c01b419ac',1,'Tgstation.Server.Client.Components.IInstanceClient.Users()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a2a01eeaccf183e928f6f50ebb60abdad',1,'Tgstation.Server.Client.Components.InstanceClient.Users()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html#a9c807f862e80f400477c6783910276ee',1,'Tgstation.Server.Client.IServerClient.Users()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a6794b452542c1ee7c38c573e67e6aa83',1,'Tgstation.Server.Client.ServerClient.Users()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#af74e4382b325c0d59886999807b52395',1,'Tgstation.Server.Host.Models.DatabaseContext.Users()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#aab8bdb09db7cd1273541845190a83630',1,'Tgstation.Server.Host.Models.IDatabaseContext.Users()']]], + ['usessl',['UseSsl',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#a8965e74ecabbb3c26693d2a1885dabc3',1,'Tgstation::Server::Api::Models::IrcConnectionStringBuilder']]] +]; diff --git a/search/properties_13.html b/search/properties_13.html new file mode 100644 index 0000000000..76cffddc5c --- /dev/null +++ b/search/properties_13.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_13.js b/search/properties_13.js new file mode 100644 index 0000000000..dcccc6ced8 --- /dev/null +++ b/search/properties_13.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['valid',['Valid',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_connection_string_builder.html#a9b8292cc2ffeb79aa55013c6d8a617d7',1,'Tgstation::Server::Api::Models::Internal::ChatConnectionStringBuilder']]], + ['validationparameters',['ValidationParameters',['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_token_factory.html#a46e66985719064cffa8b569830a3712f',1,'Tgstation.Server.Host.Security.ITokenFactory.ValidationParameters()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html#a1fe6c5c282b5db5a2a61a5417e634ed8',1,'Tgstation.Server.Host.Security.TokenFactory.ValidationParameters()']]], + ['version',['Version',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_byond.html#a5d513e13dc23477c3ef1ce64610bfee3',1,'Tgstation.Server.Api.Models.Byond.Version()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_server_information.html#a9818626b94b820a7b1188c1647bbd633',1,'Tgstation.Server.Api.Models.ServerInformation.Version()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.html#ac7e7961155c2d7c0e08be2d7320e45da',1,'Tgstation.Server.Host.Components.Byond.ByondExecutableLock.Version()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock.html#aaef823795dc654725e448b487fefd9ac',1,'Tgstation.Server.Host.Components.Byond.IByondExecutableLock.Version()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#a02e77eeca07a0002d69e5a225825d94a',1,'Tgstation.Server.Host.Core.Application.Version()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_application.html#adef1cd4ff4ee24d521761279ae2ba591',1,'Tgstation.Server.Host.Core.IApplication.Version()']]], + ['versionprefix',['VersionPrefix',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_application.html#ac450d182d713644c27492aebc0ab7739',1,'Tgstation::Server::Host::Core::IApplication']]], + ['versionstring',['VersionString',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#a7659daf7ba8411a369c29cde8660d219',1,'Tgstation.Server.Host.Core.Application.VersionString()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_application.html#a4b9b6cc8befd7b1696bc18bf2d5b4d64',1,'Tgstation.Server.Host.Core.IApplication.VersionString()']]] +]; diff --git a/search/properties_14.html b/search/properties_14.html new file mode 100644 index 0000000000..1ffd623de3 --- /dev/null +++ b/search/properties_14.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_14.js b/search/properties_14.js new file mode 100644 index 0000000000..b369149bd8 --- /dev/null +++ b/search/properties_14.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['watchdog',['Watchdog',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html#ae03ea9eb9252aed389443f3bc038cfb2',1,'Tgstation.Server.Host.Components.IInstance.Watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a902e9a3917553cae8ec372948e98d6ec',1,'Tgstation.Server.Host.Components.Instance.Watchdog()']]], + ['watchdogfactory',['WatchdogFactory',['../class_tgstation_1_1_server_1_1_host_1_1_console_1_1_program.html#a6b0b371a6a20cfcf0afd0ddbc3ff5825',1,'Tgstation::Server::Host::Console::Program']]], + ['watchdogpresent',['WatchdogPresent',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_server_control.html#a1c9a042a42da1e39316d2f1b45b28765',1,'Tgstation::Server::Host::Core::IServerControl']]], + ['watchdogreattachinformation',['WatchdogReattachInformation',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a8f3e7da2c052af242048578fd8ec6c2d',1,'Tgstation::Server::Host::Models::Instance']]], + ['watchdogreattachinformations',['WatchdogReattachInformations',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#ade1c71fa296103bf51c5b6b0b1c478d5',1,'Tgstation.Server.Host.Models.DatabaseContext.WatchdogReattachInformations()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#acf20fa94a000078534bfc9337efca289',1,'Tgstation.Server.Host.Models.IDatabaseContext.WatchdogReattachInformations()']]], + ['windowshost',['WindowsHost',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_administration.html#abf3f89fee1f079cadd4208f337444fec',1,'Tgstation::Server::Api::Models::Administration']]] +]; diff --git a/search/properties_2.html b/search/properties_2.html new file mode 100644 index 0000000000..daeef210fa --- /dev/null +++ b/search/properties_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_2.js b/search/properties_2.js new file mode 100644 index 0000000000..2de8bc5926 --- /dev/null +++ b/search/properties_2.js @@ -0,0 +1,44 @@ +var searchData= +[ + ['cancelled',['Cancelled',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html#ab68caae8a7e5bd3bfd7764cab7b8773d',1,'Tgstation::Server::Api::Models::Internal::Job']]], + ['cancelledby',['CancelledBy',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job.html#a377a43a2240e0da18868c1b67803a376',1,'Tgstation.Server.Api.Models.Job.CancelledBy()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html#a11070d5a55b77aa91f23403d17c4d224',1,'Tgstation.Server.Host.Models.Job.CancelledBy()']]], + ['cancelright',['CancelRight',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html#af210e7bef88bdc5ca203c8f0931c520a',1,'Tgstation::Server::Api::Models::Internal::Job']]], + ['cancelrightstype',['CancelRightsType',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html#a796c6a9e900858ec0084648e9b375609',1,'Tgstation::Server::Api::Models::Internal::Job']]], + ['canonicalname',['CanonicalName',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#a6882aa0e73af174efc9a7d843888a242',1,'Tgstation::Server::Host::Models::User']]], + ['channel',['Channel',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping.html#a3e47c8143bcb6ea125dc7e19d61981a7',1,'Tgstation.Server.Host.Components.Chat.ChannelMapping.Channel()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user.html#a757ab1b226367fcaca7c770885002bbd',1,'Tgstation.Server.Host.Components.Chat.User.Channel()']]], + ['channelids',['ChannelIds',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_response.html#a1ccfbf76be5cfe35a6df3da7c615bb5e',1,'Tgstation::Server::Host::Components::Chat::Response']]], + ['channels',['Channels',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_bot.html#ab7b0c6f09a83ff00c65b668b19d7992e',1,'Tgstation.Server.Api.Models.ChatBot.Channels()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.html#a962580026629eab3c997002c86e9cb6d',1,'Tgstation.Server.Host.Models.ChatBot.Channels()']]], + ['chat',['Chat',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html#ad00e650236f4e0d2c512113b9fe2446b',1,'Tgstation.Server.Host.Components.IInstance.Chat()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#abfb0276f594ece7d091630365f7f036a',1,'Tgstation.Server.Host.Components.Instance.Chat()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a934fd52d3434a057fbac3f2994810cb4',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Chat()']]], + ['chatbotrights',['ChatBotRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html#a940fa0780621d08d50f1e961bb79a87b',1,'Tgstation::Server::Api::Models::InstanceUser']]], + ['chatbots',['ChatBots',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#aca06567ce5a36c7e6b2ac09d5e6d9a38',1,'Tgstation.Server.Client.Components.IInstanceClient.ChatBots()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a8b8ccd6c8cb8f046bc1c94e4220df1c8',1,'Tgstation.Server.Client.Components.InstanceClient.ChatBots()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#aa12d9638a390f6150410fae873d78fe6',1,'Tgstation.Server.Host.Models.DatabaseContext.ChatBots()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#ac8cfc74929b0d6dc63214793bfdb5d62',1,'Tgstation.Server.Host.Models.IDatabaseContext.ChatBots()']]], + ['chatchannels',['ChatChannels',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a3eb03b8fad30f5a23c73633dd14aeda8',1,'Tgstation.Server.Host.Models.DatabaseContext.ChatChannels()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#a37bfbf2390708d6d40ddc484e7eb50d7',1,'Tgstation.Server.Host.Models.IDatabaseContext.ChatChannels()']]], + ['chatchannelsjson',['ChatChannelsJson',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html#ac4b12b2ff255a2e18bac3b47ad7b1eda',1,'Tgstation.Server.Host.Components.Interop.JsonFile.ChatChannelsJson()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list.html#a467e7d6f73cb109da69af86e1644d8f3',1,'Tgstation.Server.Host.Components.Interop.JsonSubFileList.ChatChannelsJson()']]], + ['chatcommandsjson',['ChatCommandsJson',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html#ad9b9e6e7af1746d22adc0cda60302dda',1,'Tgstation.Server.Host.Components.Interop.JsonFile.ChatCommandsJson()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_sub_file_list.html#aab62b9247392345c712b668535e03282',1,'Tgstation.Server.Host.Components.Interop.JsonSubFileList.ChatCommandsJson()']]], + ['chatsettings',['ChatSettings',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.html#a082ce7e1f98a393dc31eed005abc5002',1,'Tgstation.Server.Host.Models.ChatChannel.ChatSettings()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a1d95c35203ebc275fbbbe394f89c3467',1,'Tgstation.Server.Host.Models.Instance.ChatSettings()']]], + ['chatsettingsid',['ChatSettingsId',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.html#aa81eda97809d3993ebf0d34f77fc0c1b',1,'Tgstation::Server::Host::Models::ChatChannel']]], + ['checkoutsha',['CheckoutSha',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html#a0d9d62857268d88dff0c4d1935ef8f04',1,'Tgstation::Server::Api::Models::Repository']]], + ['cloneinprogress',['CloneInProgress',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository_manager.html#a3e57f020cf906b3c04f3fc81084a98d3',1,'Tgstation.Server.Host.Components.Repository.IRepositoryManager.CloneInProgress()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#adb8787a8636ea92edd721e4e1eb7c97c',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.CloneInProgress()']]], + ['closeportonreboot',['ClosePortOnReboot',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a7251412ac0b54d647eec022368d53203',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.ClosePortOnReboot()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#a4aff175710c5f3e1acffe941131a4ffa',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.ClosePortOnReboot()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a55e93b989949fa979de9faa32d818b77',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.ClosePortOnReboot()']]], + ['command',['Command',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_command.html#ad3c1493d8915aecd4c800d462d5931f2',1,'Tgstation::Server::Host::Components::Interop::ChatCommand']]], + ['comment',['Comment',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters.html#ac347f526ceb9f50ab47df5db6c710385',1,'Tgstation::Server::Api::Models::TestMergeParameters']]], + ['commitsha',['CommitSha',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_revision_information.html#a7d08aaae3b19bbc45ce29b110042a260',1,'Tgstation::Server::Api::Models::Internal::RevisionInformation']]], + ['committeremail',['CommitterEmail',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#af0a552dc881084d79ed5e0e87fbb2d9d',1,'Tgstation::Server::Api::Models::Internal::RepositorySettings']]], + ['committername',['CommitterName',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#ac2fd6ed73ec47e1a8b308ec5d5f6ddf5',1,'Tgstation::Server::Api::Models::Internal::RepositorySettings']]], + ['compilejob',['CompileJob',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#ac823618905c23e4f88627b5f7a31e64d',1,'Tgstation.Server.Host.Components.Compiler.DmbProvider.CompileJob()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html#aeeccf7f76aa40de5ac4330bdea527b62',1,'Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.CompileJob()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.html#a9cb64d93aa91a3a16ded1cd37e0cf8db',1,'Tgstation.Server.Host.Components.IDmbProvider.CompileJob()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information.html#a02ee6eb05943c4bbfed4aca64692fa80',1,'Tgstation.Server.Host.Models.ReattachInformation.CompileJob()']]], + ['compilejobs',['CompileJobs',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information.html#a9b60bc78fa491f2fced9f0432a2708ba',1,'Tgstation.Server.Api.Models.RevisionInformation.CompileJobs()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a8d6f9c53e0c41efb8439327fcd6144a5',1,'Tgstation.Server.Host.Models.DatabaseContext.CompileJobs()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#a11f83112916093348d456baf9f3cc082',1,'Tgstation.Server.Host.Models.IDatabaseContext.CompileJobs()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html#ad53239b4213e48130a30f10662a5b2b6',1,'Tgstation.Server.Host.Models.RevisionInformation.CompileJobs()']]], + ['configuration',['Configuration',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#a16626c6a13892319d3f24e0c57dd9394',1,'Tgstation.Server.Client.Components.IInstanceClient.Configuration()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a32339ec5eab6e79b673bed2aca4dbceb',1,'Tgstation.Server.Client.Components.InstanceClient.Configuration()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html#a223522ccf4c8fa14c528d55065134f42',1,'Tgstation.Server.Host.Components.IInstance.Configuration()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a49c2073606768819b91a401c21fe3555',1,'Tgstation.Server.Host.Components.Instance.Configuration()']]], + ['configurationrights',['ConfigurationRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html#ae62017841e15071fb5d7652fc60d159a',1,'Tgstation::Server::Api::Models::InstanceUser']]], + ['configurationtype',['ConfigurationType',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html#a6183efad1d4344d06e59ea8bc2072a19',1,'Tgstation::Server::Api::Models::Instance']]], + ['configure',['Configure',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html#aaba3eb445c2c2c0f8a11d150096b7457',1,'Tgstation::Server::Host::Service::Program']]], + ['connected',['Connected',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_i_provider.html#acc07a6bfb2fbb35243aa1e147d92dd87',1,'Tgstation.Server.Host.Components.Chat.Providers.IProvider.Connected()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#afab0213888c139dbb1786d7f5c0d8680',1,'Tgstation.Server.Host.Components.Chat.Providers.Provider.Connected()']]], + ['connectionname',['ConnectionName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html#aa1a46e5a96e903a9bb79cd1fcf93ea0c',1,'Tgstation::Server::Host::Components::Chat::Channel']]], + ['connectionstring',['ConnectionString',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html#a21674d47d37f627eb1058f47c0018f7b',1,'Tgstation.Server.Api.Models.Internal.ChatBot.ConnectionString()'],['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html#a53a14b4a89de73b8ea223804c4aea365',1,'Tgstation.Server.Host.Configuration.DatabaseConfiguration.ConnectionString()']]], + ['content',['Content',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html#a01ea9f02cf1c5f6442b5753c2d0b0024',1,'Tgstation.Server.Api.Models.ConfigurationFile.Content()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_message.html#a3a4a159c1b7b4ff0a163f4bb29ea4844',1,'Tgstation.Server.Host.Components.Chat.Providers.Message.Content()']]], + ['createdat',['CreatedAt',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#ab0d92bcf1b5b9afbb0f7ab1e5952acff',1,'Tgstation::Server::Api::Models::Internal::User']]], + ['createdby',['CreatedBy',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user.html#a3f9a537d3b5f247f4c84ece80a8924a4',1,'Tgstation.Server.Api.Models.User.CreatedBy()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#a8f1821d1c00f73eff7324bf8fc9c1c7e',1,'Tgstation.Server.Host.Models.User.CreatedBy()']]], + ['createdusers',['CreatedUsers',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#abe7d2baab75bacc69885b90664d6c81a',1,'Tgstation::Server::Host::Models::User']]], + ['currentallowwebclient',['CurrentAllowWebclient',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html#a5ec4c59c00dccb5e0b87e4bf2c2d9566',1,'Tgstation::Server::Api::Models::DreamDaemon']]], + ['currentauthenticationcontext',['CurrentAuthenticationContext',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html#a37a564f1b33b53dc2af9fb751b5a7e9b',1,'Tgstation.Server.Host.Security.AuthenticationContextFactory.CurrentAuthenticationContext()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context_factory.html#a6c1be0fe695cf57fa21674373868f709',1,'Tgstation.Server.Host.Security.IAuthenticationContextFactory.CurrentAuthenticationContext()']]], + ['currentport',['CurrentPort',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html#a3740443b5c26f64b1b4f516399219040',1,'Tgstation::Server::Api::Models::DreamDaemon']]], + ['currentsecurity',['CurrentSecurity',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html#aea8a6590efc3c90d0e57f532902a149e',1,'Tgstation::Server::Api::Models::DreamDaemon']]] +]; diff --git a/search/properties_3.html b/search/properties_3.html new file mode 100644 index 0000000000..b6b726212b --- /dev/null +++ b/search/properties_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_3.js b/search/properties_3.js new file mode 100644 index 0000000000..66e5c3037e --- /dev/null +++ b/search/properties_3.js @@ -0,0 +1,28 @@ +var searchData= +[ + ['databaseconfiguration',['DatabaseConfiguration',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a97d089b379a721eb4d130c034dce8c2b',1,'Tgstation::Server::Host::Models::DatabaseContext']]], + ['databasecontext',['DatabaseContext',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#ab687e0fc0cb712708297c0c2b43ca849',1,'Tgstation::Server::Host::Controllers::ApiController']]], + ['databasetype',['DatabaseType',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html#adab83eaad53afabdb2f7b43c23ece38a',1,'Tgstation::Server::Host::Configuration::DatabaseConfiguration']]], + ['debug',['Debug',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html#a938d576ceba93bf3cb1a32ae1dcccc52',1,'Tgstation::Server::Host::Service::Program']]], + ['description',['Description',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html#ab37543e34480a044000bd542bf88aa15',1,'Tgstation::Server::Api::Models::Internal::Job']]], + ['directory',['Directory',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html#aad824931c595d0e0c5522892e9467499',1,'Tgstation.Server.Host.Configuration.FileLoggingConfiguration.Directory()'],['../class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html#ac4bd05b1f3b435566f633bdbaf980ab6',1,'Tgstation.Server.Tests.TestingServer.Directory()']]], + ['directoryname',['DirectoryName',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_compile_job.html#af7f70d7f52963a2b3c80537734ba7967',1,'Tgstation::Server::Api::Models::Internal::CompileJob']]], + ['disable',['Disable',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html#af1c69ac7d59ed1817d59b0022d86db15',1,'Tgstation::Server::Host::Configuration::FileLoggingConfiguration']]], + ['discordchannelid',['DiscordChannelId',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html#a7d69363fd8b5b85e8a66d7c6d4aeb4ec',1,'Tgstation::Server::Api::Models::ChatChannel']]], + ['dmb',['Dmb',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a99c7fcb369f62c78b96d287ef9ccb4a2',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Dmb()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#ab8c54c9d9b013c7456401a3b3173238d',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.Dmb()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_reattach_information.html#aadaab8323c76425738ce0c593814ae97',1,'Tgstation.Server.Host.Components.Watchdog.ReattachInformation.Dmb()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#aa52d31cca5d62e4d483ccf7992442abc',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.Dmb()']]], + ['dmbavailable',['DmbAvailable',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory.html#afd7fb709889bfe02d0f8c128626c88a6',1,'Tgstation::Server::Host::Components::Compiler::IDmbFactory']]], + ['dmbfactory',['DmbFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a401d41a1b1b805f553f53b35f46275ef',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['dmbname',['DmbName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html#aa4865055b3f5a9187953b509e8593841',1,'Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.DmbName()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.html#aa24e55fcc06b68ca29feaf598a4277ba',1,'Tgstation.Server.Host.Components.IDmbProvider.DmbName()']]], + ['dmename',['DmeName',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_compile_job.html#ac800c1acb193352543a231a96f9e3dbf',1,'Tgstation::Server::Api::Models::Internal::CompileJob']]], + ['dreamdaemon',['DreamDaemon',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#a3d0fe52c8e2428ab13df3f14a4c9d36e',1,'Tgstation.Server.Client.Components.IInstanceClient.DreamDaemon()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a2a6e49e9e7b6d23a95f9839ab4add778',1,'Tgstation.Server.Client.Components.InstanceClient.DreamDaemon()']]], + ['dreamdaemonname',['DreamDaemonName',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.html#ad43d91cf402c0084067dee5d1b182cde',1,'Tgstation::Server::Host::Components::Byond::IByondInstaller']]], + ['dreamdaemonpath',['DreamDaemonPath',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.html#aebbd445eb581a534e4ad8ff6b0f6c1ce',1,'Tgstation.Server.Host.Components.Byond.ByondExecutableLock.DreamDaemonPath()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock.html#af7c6d39dcd1075f42e8721446b5e159f',1,'Tgstation.Server.Host.Components.Byond.IByondExecutableLock.DreamDaemonPath()']]], + ['dreamdaemonrights',['DreamDaemonRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html#a8367896a1a9ff6e745d0c62b85d8fd0e',1,'Tgstation::Server::Api::Models::InstanceUser']]], + ['dreamdaemonsettings',['DreamDaemonSettings',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a08672938118f8e33e151f025cdf6a4ce',1,'Tgstation.Server.Host.Models.DatabaseContext.DreamDaemonSettings()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#ae38b73e25cfd71eb688bf80dd2cefc78',1,'Tgstation.Server.Host.Models.IDatabaseContext.DreamDaemonSettings()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a94cb9055338f1d52397f10aab18f554d',1,'Tgstation.Server.Host.Models.Instance.DreamDaemonSettings()']]], + ['dreammaker',['DreamMaker',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#a5a505ae2d713942640558e34222b444b',1,'Tgstation.Server.Client.Components.IInstanceClient.DreamMaker()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#af92b0694efe4453eee2ea50d9c18616e',1,'Tgstation.Server.Client.Components.InstanceClient.DreamMaker()']]], + ['dreammakername',['DreamMakerName',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.html#a40f9cadd672f9e36c3a89be2df1cb4b5',1,'Tgstation::Server::Host::Components::Byond::IByondInstaller']]], + ['dreammakerpath',['DreamMakerPath',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.html#a4d5315a7648111cd6851fe47dfe859a2',1,'Tgstation.Server.Host.Components.Byond.ByondExecutableLock.DreamMakerPath()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock.html#a45a3041c6d9e0ba81d361090549bb072',1,'Tgstation.Server.Host.Components.Byond.IByondExecutableLock.DreamMakerPath()']]], + ['dreammakerrights',['DreamMakerRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html#a51bb2f3a485f142fc1b60cc1c4c53052',1,'Tgstation::Server::Api::Models::InstanceUser']]], + ['dreammakersettings',['DreamMakerSettings',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a7c518cbed0128eab8d5449799e960129',1,'Tgstation.Server.Host.Models.DatabaseContext.DreamMakerSettings()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#afd5dbabf36739e297555f3ba3928c99a',1,'Tgstation.Server.Host.Models.IDatabaseContext.DreamMakerSettings()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a09929f71b77a27fc5f609ff64cf190d6',1,'Tgstation.Server.Host.Models.Instance.DreamMakerSettings()']]], + ['dropdatabase',['DropDatabase',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html#a30f47f73075f305073ad72ef3ff44cd4',1,'Tgstation::Server::Host::Configuration::DatabaseConfiguration']]] +]; diff --git a/search/properties_4.html b/search/properties_4.html new file mode 100644 index 0000000000..ead8e97bef --- /dev/null +++ b/search/properties_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_4.js b/search/properties_4.js new file mode 100644 index 0000000000..b08bf57c04 --- /dev/null +++ b/search/properties_4.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['enable',['Enable',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_control_panel_configuration.html#a15564859b17400f1bcc723a5fbee8121',1,'Tgstation::Server::Host::Configuration::ControlPanelConfiguration']]], + ['enabled',['Enabled',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html#a4d973efbcdc9eee5597989f2667c42b3',1,'Tgstation.Server.Api.Models.Internal.ChatBot.Enabled()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#a4a0a4bb6e68f049511123dbb5f1dc094',1,'Tgstation.Server.Api.Models.Internal.User.Enabled()']]], + ['exceptiondetails',['ExceptionDetails',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html#aac65a410c6b14e0a33b256e3d4451486',1,'Tgstation::Server::Api::Models::Internal::Job']]], + ['exitcode',['ExitCode',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_launch_result.html#a335ce27ca86ba77136fd1e705de3f512',1,'Tgstation::Server::Host::Components::Watchdog::LaunchResult']]], + ['expiresat',['ExpiresAt',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_token.html#a9c42e74cbe7ed59f9b86e825f3a185d6',1,'Tgstation::Server::Api::Models::Token']]] +]; diff --git a/search/properties_5.html b/search/properties_5.html new file mode 100644 index 0000000000..378e50cde5 --- /dev/null +++ b/search/properties_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_5.js b/search/properties_5.js new file mode 100644 index 0000000000..b71a215d65 --- /dev/null +++ b/search/properties_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['friendlyname',['FriendlyName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html#a2f8b52c4cbf230594917ade44b5479ca',1,'Tgstation.Server.Host.Components.Chat.Channel.FriendlyName()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user.html#a43d565af3741b4ab20b085df942f7c5e',1,'Tgstation.Server.Host.Components.Chat.User.FriendlyName()']]] +]; diff --git a/search/properties_6.html b/search/properties_6.html new file mode 100644 index 0000000000..437288e2a2 --- /dev/null +++ b/search/properties_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_6.js b/search/properties_6.js new file mode 100644 index 0000000000..c5a09cf67f --- /dev/null +++ b/search/properties_6.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['githubaccesstoken',['GitHubAccessToken',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html#a97eae217a6ba8e75256e745f98f926b8',1,'Tgstation::Server::Host::Configuration::GeneralConfiguration']]], + ['githubname',['GitHubName',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html#aaa11306778504a3bb95ee6575aa69021',1,'Tgstation::Server::Api::Models::Repository']]], + ['githubowner',['GitHubOwner',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html#a04abf893b8ca947b828372b92534f34a',1,'Tgstation.Server.Api.Models.Repository.GitHubOwner()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#a213c2be1ecbafbd6a801f685c63d04db',1,'Tgstation.Server.Host.Components.Repository.IRepository.GitHubOwner()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#abdb2e4318fb14b8459e3bbc37dad98ba',1,'Tgstation.Server.Host.Components.Repository.Repository.GitHubOwner()']]], + ['githubreponame',['GitHubRepoName',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#aa18c75762768b2eade040269fc0b98c4',1,'Tgstation.Server.Host.Components.Repository.IRepository.GitHubRepoName()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#ad08c159873c35b8d508074a3b21b1739',1,'Tgstation.Server.Host.Components.Repository.Repository.GitHubRepoName()']]], + ['githubrepositoryid',['GitHubRepositoryId',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html#a2f6c66d4e10c5fb6a758727893ea4cd0',1,'Tgstation::Server::Host::Configuration::UpdatesConfiguration']]], + ['gittagprefix',['GitTagPrefix',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html#a9dce394437a9bc79041a3467e7ad75f4',1,'Tgstation::Server::Host::Configuration::UpdatesConfiguration']]] +]; diff --git a/search/properties_7.html b/search/properties_7.html new file mode 100644 index 0000000000..954964ef9a --- /dev/null +++ b/search/properties_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_7.js b/search/properties_7.js new file mode 100644 index 0000000000..0a7e5dec85 --- /dev/null +++ b/search/properties_7.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['head',['Head',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#aaf4a631e6d2aa45a1b6887152f1d13f0',1,'Tgstation::Server::Host::Components::Repository::IRepository']]], + ['headers',['Headers',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a521379a7cffb0980b1d879cb15afd6f0',1,'Tgstation.Server.Client.ApiClient.Headers()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#afb0feaf84640f44711b635836bf9378e',1,'Tgstation.Server.Client.IApiClient.Headers()']]], + ['headincludeline',['HeadIncludeLine',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_server_side_modifications.html#a83107858b3a44428da91e999cedd2a16',1,'Tgstation::Server::Host::Components::StaticFiles::ServerSideModifications']]], + ['helptext',['HelpText',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.html#a6d0540b2a6fdb2c6f48ddaba78b22bde',1,'Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.HelpText()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command.html#ab8687d89e8f4b08d6221c1fd51ab8ca0',1,'Tgstation.Server.Host.Components.Chat.Commands.ICommand.HelpText()']]], + ['html',['Html',['../class_tgstation_1_1_server_1_1_client_1_1_server_error_exception.html#a8a826616016136ab87369a1a55e52bca',1,'Tgstation::Server::Client::ServerErrorException']]] +]; diff --git a/search/properties_8.html b/search/properties_8.html new file mode 100644 index 0000000000..f92a6a0011 --- /dev/null +++ b/search/properties_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_8.js b/search/properties_8.js new file mode 100644 index 0000000000..46f49d2023 --- /dev/null +++ b/search/properties_8.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['id',['Id',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html#a850128695dbdb7a7482f8debed5a13ce',1,'Tgstation.Server.Api.Models.Instance.Id()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html#a8986e2686e9d872b150f239de214d74c',1,'Tgstation.Server.Api.Models.Internal.ChatBot.Id()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_compile_job.html#aaf50365d79a9cac92220cec95057e421',1,'Tgstation.Server.Api.Models.Internal.CompileJob.Id()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_job.html#a2acfbcb2d53d94d45c49c1cc2bef75d6',1,'Tgstation.Server.Api.Models.Internal.Job.Id()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge.html#a0dbaef6cf504176f317d9d87dd4c97a9',1,'Tgstation.Server.Api.Models.Internal.TestMerge.Id()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#a2c0d8cf4d64347a18c9a6251f9a5783f',1,'Tgstation.Server.Api.Models.Internal.User.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html#a7c2c6e4f3178f608f42d086b35673508',1,'Tgstation.Server.Host.Components.Chat.Channel.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user.html#a30069134279846535d7271c180f337e7',1,'Tgstation.Server.Host.Components.Chat.User.Id()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process.html#af541be0a939e2115b688ad5eb5e66234',1,'Tgstation.Server.Host.Core.IProcess.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#ab63bd9afff98a203dddff58bcb4bbe25',1,'Tgstation.Server.Host.Core.Process.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.html#a0dd252ba836263c5a825862bcda215f7',1,'Tgstation.Server.Host.Models.ChatChannel.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html#a914b18d16f0501f1c78b6734779952dd',1,'Tgstation.Server.Host.Models.DreamDaemonSettings.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html#ab561a3992874722f25f3729251fd4249',1,'Tgstation.Server.Host.Models.DreamMakerSettings.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.html#ae7b25543ed8660f8882a9aeedadbcd23',1,'Tgstation.Server.Host.Models.InstanceUser.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information.html#a5c7ca615cd5ead17d8f7cb5fddc4bc2d',1,'Tgstation.Server.Host.Models.ReattachInformation.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html#a3c1a07a5ecde1ec0e3c1a03fc096b2ff',1,'Tgstation.Server.Host.Models.RepositorySettings.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_rev_info_test_merge.html#a1bde159279a6a9abec5d7b28930c6fe2',1,'Tgstation.Server.Host.Models.RevInfoTestMerge.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html#a44a69b7ff8b7d1ca75e43e71694a8adf',1,'Tgstation.Server.Host.Models.RevisionInformation.Id()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information.html#a838faca3764e01b631a6fa12174b6ceb',1,'Tgstation.Server.Host.Models.WatchdogReattachInformation.Id()']]], + ['inactiveserver',['InactiveServer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_monitor_state.html#a6a9bcee1c2d257c41c25777b0ac510e6',1,'Tgstation::Server::Host::Components::Watchdog::MonitorState']]], + ['inactiveservercritfail',['InactiveServerCritFail',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_monitor_state.html#a8df2748432efbc5946a50b412abd7789',1,'Tgstation::Server::Host::Components::Watchdog::MonitorState']]], + ['install',['Install',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html#ae3be244b24cbb3c9ba859f55e53715e6',1,'Tgstation::Server::Host::Service::Program']]], + ['installedversions',['InstalledVersions',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#ac6285b8768d8b10b5e4bdeec2cb43953',1,'Tgstation.Server.Host.Components.Byond.ByondManager.InstalledVersions()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_manager.html#ae5fc64e6504a3fd8d1cf1131d841fa14',1,'Tgstation.Server.Host.Components.Byond.IByondManager.InstalledVersions()']]], + ['installjob',['InstallJob',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_byond.html#ac42aea970e9f20d09ee3ead318841078',1,'Tgstation::Server::Api::Models::Byond']]], + ['instance',['Instance',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#a19f89ec03ffd6f2bf5cab5214d5e6bb8',1,'Tgstation.Server.Host.Controllers.ApiController.Instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.html#ae5433d8739dbd431a207684fb9b4d37d',1,'Tgstation.Server.Host.Models.ChatBot.Instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html#ac33f867ccf152b5fd3a52242e2fed5b4',1,'Tgstation.Server.Host.Models.DreamDaemonSettings.Instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html#a7d310dcc01986cdbfb6bb41d1f80825d',1,'Tgstation.Server.Host.Models.DreamMakerSettings.Instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.html#a84b3880b44a50b0064cd5c5a18027752',1,'Tgstation.Server.Host.Models.InstanceUser.Instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html#acebd359c2b46a97a5ddf7c6c9c4f9eb7',1,'Tgstation.Server.Host.Models.Job.Instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html#a254c0c0373323dc5910b83a8edcfdac2',1,'Tgstation.Server.Host.Models.RepositorySettings.Instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html#ac8ea8a7b515a91b6bd20975fd8f1fd7a',1,'Tgstation.Server.Host.Models.RevisionInformation.Instance()']]], + ['instanceid',['InstanceId',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a65e7d0ba3a39c992691f7721c62c1531',1,'Tgstation.Server.Api.ApiHeaders.InstanceId()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.html#a87db1326cbb80ca4a8945be90769656b',1,'Tgstation.Server.Host.Models.ChatBot.InstanceId()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html#ae94a52d9c7e94f3a043ccce4c6731935',1,'Tgstation.Server.Host.Models.DreamDaemonSettings.InstanceId()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html#a0173e07dda1034e7cd127a426d3cfa69',1,'Tgstation.Server.Host.Models.DreamMakerSettings.InstanceId()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.html#a35f8d34f833a758e290c732f40954ddd',1,'Tgstation.Server.Host.Models.InstanceUser.InstanceId()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html#a019883724ea4000a3c088d6dbd7ffaa9',1,'Tgstation.Server.Host.Models.RepositorySettings.InstanceId()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html#a6453d51fe22d312fadfccc0f6e9e3e89',1,'Tgstation.Server.Host.Models.RevisionInformation.InstanceId()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information.html#a9d598aa26cfeeafa70fe3b6edced7a79',1,'Tgstation.Server.Host.Models.WatchdogReattachInformation.InstanceId()']]], + ['instancemanagerrights',['InstanceManagerRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#a816ca80f5eecd84ec46d4a365e5633e7',1,'Tgstation::Server::Api::Models::Internal::User']]], + ['instancename',['InstanceName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html#a367a06cd9522d861bc0965a1f6847604',1,'Tgstation::Server::Host::Components::Interop::JsonFile']]], + ['instances',['Instances',['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html#a220af3e47b92df41d6b96bf8851c11ab',1,'Tgstation.Server.Client.IServerClient.Instances()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a9eb413c086e3e6d25ec2c404611c2b31',1,'Tgstation.Server.Client.ServerClient.Instances()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a29ba63c16baafcb417a9831fd70d20b7',1,'Tgstation.Server.Host.Models.DatabaseContext.Instances()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#aea1b9d5f17eaeb65becd9ff5cc7ba3e7',1,'Tgstation.Server.Host.Models.IDatabaseContext.Instances()']]], + ['instanceuser',['InstanceUser',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a5916cab82702e8c3bea39d500419c5dc',1,'Tgstation.Server.Host.Security.AuthenticationContext.InstanceUser()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context.html#a0ffbd3a91f52330582bbc56c13ba7dda',1,'Tgstation.Server.Host.Security.IAuthenticationContext.InstanceUser()']]], + ['instanceuserrights',['InstanceUserRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html#a152009cdbb0c44ffdf1fc775dd4bd37f',1,'Tgstation::Server::Api::Models::InstanceUser']]], + ['instanceusers',['InstanceUsers',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a4938bb2d6e6720a1783191004543f2d9',1,'Tgstation.Server.Host.Models.DatabaseContext.InstanceUsers()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#a8b82f256db184f3fa9fda3754b1f8363',1,'Tgstation.Server.Host.Models.IDatabaseContext.InstanceUsers()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a9e8ce579b8d349c10e2a17be4210003a',1,'Tgstation.Server.Host.Models.Instance.InstanceUsers()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#a936e26aa1a873892272663bc193029d7',1,'Tgstation.Server.Host.Models.User.InstanceUsers()']]], + ['inuse',['InUse',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository_manager.html#acfd46405a7a81980c34cc001476b51ca',1,'Tgstation::Server::Host::Components::Repository::IRepositoryManager']]], + ['ircchannel',['IrcChannel',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html#a4efdc5fca3a1230d57d63b6393b65239',1,'Tgstation::Server::Api::Models::ChatChannel']]], + ['isadminchannel',['IsAdminChannel',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html#a1a945855589edd8cd22a68bb1ae7323e',1,'Tgstation.Server.Api.Models.ChatChannel.IsAdminChannel()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html#a5e65793a57309c1b5feb1cb5f61ef56e',1,'Tgstation.Server.Host.Components.Chat.Channel.IsAdminChannel()']]], + ['isdirectory',['IsDirectory',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html#a674f1c0203cb7b2cd326ead5f810b885',1,'Tgstation::Server::Api::Models::ConfigurationFile']]], + ['isgithubrepository',['IsGitHubRepository',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#a60ae733cb70d63e2ceedadca18bec940',1,'Tgstation.Server.Host.Components.Repository.IRepository.IsGitHubRepository()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a5a58e407a627009694a99f21823c2593',1,'Tgstation.Server.Host.Components.Repository.Repository.IsGitHubRepository()']]], + ['isprimary',['IsPrimary',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#ae1efcc624f78a7c1ce978b000d09d382',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.IsPrimary()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#afe5b724b9a11fb66a39d159dfa35bdf1',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.IsPrimary()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html#ab8164f7f2f90feaf4a79fd6e6b06fcea',1,'Tgstation.Server.Host.Models.ReattachInformationBase.IsPrimary()']]], + ['isprivatechannel',['IsPrivateChannel',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html#af3b6600b9325bf76ca4380d03bfdce6a',1,'Tgstation::Server::Host::Components::Chat::Channel']]], + ['isupdateschannel',['IsUpdatesChannel',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html#a9e8659b045bad05567bef7d037d372d9',1,'Tgstation.Server.Api.Models.ChatChannel.IsUpdatesChannel()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping.html#a602d016c7a0c753aea994d6fc1d6f9db',1,'Tgstation.Server.Host.Components.Chat.ChannelMapping.IsUpdatesChannel()']]], + ['iswatchdogchannel',['IsWatchdogChannel',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_chat_channel.html#afb292a0bc8975fae2ca0269e77b29430',1,'Tgstation.Server.Api.Models.ChatChannel.IsWatchdogChannel()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping.html#aa1ded40a4ff15aa4d0e588aca23f6577',1,'Tgstation.Server.Host.Components.Chat.ChannelMapping.IsWatchdogChannel()']]], + ['iswindows',['IsWindows',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_platform_identifier.html#adb4707b4666412fcd499d72689fe2d68',1,'Tgstation.Server.Host.Core.IPlatformIdentifier.IsWindows()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_platform_identifier.html#a3780544c2b8533c3c34e93937bbf8c7e',1,'Tgstation.Server.Host.Core.PlatformIdentifier.IsWindows()']]] +]; diff --git a/search/properties_9.html b/search/properties_9.html new file mode 100644 index 0000000000..6762399fe2 --- /dev/null +++ b/search/properties_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_9.js b/search/properties_9.js new file mode 100644 index 0000000000..231eb5aa3c --- /dev/null +++ b/search/properties_9.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['job',['Job',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job.html#afe93454d04d57732c948c207cc6d21cb',1,'Tgstation.Server.Api.Models.CompileJob.Job()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.html#a0676e94669f8de80f67aa20c72db5b7c',1,'Tgstation.Server.Host.Models.CompileJob.Job()']]], + ['jobid',['JobId',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.html#aeb314186da6c36566c0b8e5af7441014',1,'Tgstation::Server::Host::Models::CompileJob']]], + ['jobs',['Jobs',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#ae0df68e17fa23d0ed3445a2c8b2a00b4',1,'Tgstation.Server.Client.Components.IInstanceClient.Jobs()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a84709639847ef446f64be8be1da70c36',1,'Tgstation.Server.Client.Components.InstanceClient.Jobs()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a6f7859cdfa8c1fb81352102ace4e6609',1,'Tgstation.Server.Host.Models.DatabaseContext.Jobs()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#adb2f37e11b8be23855d35e90ad312d3e',1,'Tgstation.Server.Host.Models.IDatabaseContext.Jobs()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a60948c8acd4bca48ce5ea294bcc2e0b6',1,'Tgstation.Server.Host.Models.Instance.Jobs()']]] +]; diff --git a/search/properties_a.html b/search/properties_a.html new file mode 100644 index 0000000000..07f870aa65 --- /dev/null +++ b/search/properties_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_a.js b/search/properties_a.js new file mode 100644 index 0000000000..4ea799c9ad --- /dev/null +++ b/search/properties_a.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['lastlaunchparameters',['LastLaunchParameters',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#adf8f73df0fe074af3363857bc43e63a5',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.LastLaunchParameters()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a6548572ef5ab9d7b6b3aae8647a0a053',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.LastLaunchParameters()']]], + ['lastpasswordupdate',['LastPasswordUpdate',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#abd891143624157c8f48bd166cc88ab26',1,'Tgstation::Server::Host::Models::User']]], + ['lastreadhash',['LastReadHash',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html#aad10d9456adc3925247d9f7b49eebeba',1,'Tgstation::Server::Api::Models::ConfigurationFile']]], + ['latestversion',['LatestVersion',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_administration.html#a907f93161ad8982e66ae18eedf62f241',1,'Tgstation::Server::Api::Models::Administration']]], + ['launchresult',['LaunchResult',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#ab0055c5ef27b2a9e2a1997e27510e591',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.LaunchResult()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#adaa02ab9bccaaf1ad18f199e319724bc',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.LaunchResult()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a2c534a4480daf0bef9b850155d5492d6',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.LaunchResult()']]], + ['lifetime',['Lifetime',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#ad7f2aa840a1fd11a2aa6e150e1bbddcc',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Lifetime()'],['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_process_base.html#ab0a9955d3c111c6d847a64c7359e96f6',1,'Tgstation.Server.Host.Core.IProcessBase.Lifetime()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a264612ef60ad839d988fb9484baab432',1,'Tgstation.Server.Host.Core.Process.Lifetime()']]], + ['logger',['Logger',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#aeb085dbe37cb7208de2d0fe9026e4575',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#a1351fb29bf0d6c411585098aed5616c6',1,'Tgstation.Server.Host.Controllers.ApiController.Logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a43445d9d612fbdf104974bab5a741af0',1,'Tgstation.Server.Host.Models.DatabaseContext.Logger()']]], + ['loglevel',['LogLevel',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html#a77b327379b355d7569c118e85e25a3e7',1,'Tgstation::Server::Host::Configuration::FileLoggingConfiguration']]] +]; diff --git a/search/properties_b.html b/search/properties_b.html new file mode 100644 index 0000000000..7ff8681522 --- /dev/null +++ b/search/properties_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_b.js b/search/properties_b.js new file mode 100644 index 0000000000..65ac0421ca --- /dev/null +++ b/search/properties_b.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['mention',['Mention',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user.html#a8462dc2b4e3bc2c889b2e3ca7ab0ef18',1,'Tgstation::Server::Host::Components::Chat::User']]], + ['mergedat',['MergedAt',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge.html#aa9544b21a01f937b6e1954670001234d',1,'Tgstation::Server::Api::Models::Internal::TestMerge']]], + ['mergedby',['MergedBy',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge.html#a891d563f4a6a8ed0672039e358b607f6',1,'Tgstation.Server.Api.Models.TestMerge.MergedBy()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html#af1122a5c2625038f509330ed4c77bb56',1,'Tgstation.Server.Host.Models.TestMerge.MergedBy()']]], + ['message',['Message',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_error_message.html#ab90236023debcde2cc980ffe856934f9',1,'Tgstation.Server.Api.Models.ErrorMessage.Message()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_response.html#a2b9903ed2451c80594190c2d0d4e0ecc',1,'Tgstation.Server.Host.Components.Chat.Response.Message()']]], + ['metadata',['Metadata',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#a22f01f297f6ddfa2cfca204c8b94fd83',1,'Tgstation.Server.Client.Components.IInstanceClient.Metadata()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a0107f70cae241fd15612608e8eb93f51',1,'Tgstation.Server.Client.Components.InstanceClient.Metadata()']]], + ['microsoftloglevel',['MicrosoftLogLevel',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html#a5d27b790b93c94ea77f83b3729be63df',1,'Tgstation::Server::Host::Configuration::FileLoggingConfiguration']]], + ['minimumpasswordlength',['MinimumPasswordLength',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html#a7e7346acc104b86615effd5d65108c16',1,'Tgstation::Server::Host::Configuration::GeneralConfiguration']]], + ['minimumsecuritylevel',['MinimumSecurityLevel',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_compile_job.html#aba859254f245bc21a8ff640ab58caf03',1,'Tgstation::Server::Api::Models::Internal::CompileJob']]], + ['movejob',['MoveJob',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html#af06c3e84c2a288ca0bd6cddd172a568d',1,'Tgstation::Server::Api::Models::Instance']]], + ['mysqlserverversion',['MySqlServerVersion',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html#abb0513764b16289df15f08e8127d0582',1,'Tgstation::Server::Host::Configuration::DatabaseConfiguration']]] +]; diff --git a/search/properties_c.html b/search/properties_c.html new file mode 100644 index 0000000000..599b0670ff --- /dev/null +++ b/search/properties_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_c.js b/search/properties_c.js new file mode 100644 index 0000000000..ecc07ce4d6 --- /dev/null +++ b/search/properties_c.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['name',['Name',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html#a14638776df0c9820958f4d5c532df67f',1,'Tgstation.Server.Api.Models.Instance.Name()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html#a5fe1533e33e54183640013c08aebdf2f',1,'Tgstation.Server.Api.Models.Internal.ChatBot.Name()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html#aef98c54b24b4d1133ea761784699c360',1,'Tgstation.Server.Api.Models.Internal.User.Name()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.html#a639265f4892f69fac25fa32d7413fe75',1,'Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.Name()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_i_command.html#aa9cbbf23975efc1dde048ee43a6e1d4b',1,'Tgstation.Server.Host.Components.Chat.Commands.ICommand.Name()']]], + ['newtestmerges',['NewTestMerges',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html#a05bdec3c08f5acba28d9e72d70f38833',1,'Tgstation::Server::Api::Models::Repository']]], + ['newversion',['NewVersion',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_administration.html#ab40a1df200563a8351347145f50a8bc1',1,'Tgstation::Server::Api::Models::Administration']]], + ['nextaction',['NextAction',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_monitor_state.html#a87534d177a8fda685d068f47526b5bad',1,'Tgstation::Server::Host::Components::Watchdog::MonitorState']]], + ['nickname',['Nickname',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#a95d8cce20205d05b7bfbda1d088af791',1,'Tgstation::Server::Api::Models::IrcConnectionStringBuilder']]], + ['number',['Number',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters.html#aaa166ac91235805a6bf35558ca8eacb1',1,'Tgstation::Server::Api::Models::TestMergeParameters']]] +]; diff --git a/search/properties_d.html b/search/properties_d.html new file mode 100644 index 0000000000..ed0aa1e898 --- /dev/null +++ b/search/properties_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_d.js b/search/properties_d.js new file mode 100644 index 0000000000..2cf9d95a4a --- /dev/null +++ b/search/properties_d.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['online',['Online',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html#a6f024aa440adbecbd80b053eb57badc2',1,'Tgstation::Server::Api::Models::Instance']]], + ['onnewerdmb',['OnNewerDmb',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a9180ff90fc4bd8a3cc8821bbb7780b48',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.OnNewerDmb()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory.html#a02ce5ba5c1863e5b2ee6e8e92245c1da',1,'Tgstation.Server.Host.Components.Compiler.IDmbFactory.OnNewerDmb()']]], + ['onreboot',['OnReboot',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a310e26682626017eb2b5001089357c76',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.OnReboot()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#aa22611bb1515c92112cb88c1fd2a346b',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.OnReboot()']]], + ['origin',['Origin',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html#aa1c6aea021c1b615a36ebfc18c341bf7',1,'Tgstation.Server.Api.Models.Repository.Origin()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#ad8e2dda20f93df7994dd3ffc903c6531',1,'Tgstation.Server.Host.Components.Repository.IRepository.Origin()']]], + ['origincommitsha',['OriginCommitSha',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_revision_information.html#a5641d5a687d99b092d97c1dab39b6cc6',1,'Tgstation::Server::Api::Models::Internal::RevisionInformation']]], + ['output',['Output',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_compile_job.html#a0dae39cbd8a16db72bccf3e7e3488fc3',1,'Tgstation::Server::Api::Models::Internal::CompileJob']]] +]; diff --git a/search/properties_e.html b/search/properties_e.html new file mode 100644 index 0000000000..d7fedf768b --- /dev/null +++ b/search/properties_e.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_e.js b/search/properties_e.js new file mode 100644 index 0000000000..36a6925f7d --- /dev/null +++ b/search/properties_e.js @@ -0,0 +1,25 @@ +var searchData= +[ + ['parameters',['Parameters',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_command.html#afd33185ed1438ff8f87a1f6729d22210',1,'Tgstation.Server.Host.Components.Interop.CommCommand.Parameters()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_event_notification.html#a43fed96d3312ca1537a6294213396046',1,'Tgstation.Server.Host.Components.Interop.EventNotification.Parameters()']]], + ['params',['Params',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_command.html#adb1c285b5df8ea67d08ccadb7593f959',1,'Tgstation::Server::Host::Components::Interop::ChatCommand']]], + ['password',['Password',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#af420ae2e12b49c480947cc3068f033e6',1,'Tgstation.Server.Api.ApiHeaders.Password()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#a5dc7c8fe9762a68b49b6707498130a8b',1,'Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Password()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user_update.html#a6b66974e72005bfe586a72e8d24940cd',1,'Tgstation.Server.Api.Models.UserUpdate.Password()']]], + ['passwordhash',['PasswordHash',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#ab5648b7f95630ff37ad8b0ddd72c1f54',1,'Tgstation::Server::Host::Models::User']]], + ['passwordtype',['PasswordType',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#a7291f32770eaa19de8067a41a1f15509',1,'Tgstation::Server::Api::Models::IrcConnectionStringBuilder']]], + ['path',['Path',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html#aefbf190e4363fe3095963d1d40a36fd1',1,'Tgstation.Server.Api.Models.ConfigurationFile.Path()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html#ae390e04ad03e5f6daaefcfa96ed9a6d2',1,'Tgstation.Server.Api.Models.Instance.Path()']]], + ['port',['Port',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#a099e5c3fd62567ff0be2526a94943822',1,'Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Port()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#ab21dfb05ca356124194ae5c22b4a778b',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.Port()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a1caf618f26dc4f91986252b92b2b5fd5',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.Port()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html#afcf987dfdf8f483388bfd832582c6a8b',1,'Tgstation.Server.Host.Models.ReattachInformationBase.Port()']]], + ['postcomplete',['PostComplete',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html#ab2680675a7b2124d03a899f45a09e08e',1,'Tgstation::Server::Host::Models::Job']]], + ['posttestmergecomment',['PostTestMergeComment',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#acdaf4f19af7d330bcbf35c3cb240b50c',1,'Tgstation::Server::Api::Models::Internal::RepositorySettings']]], + ['primarydirectory',['PrimaryDirectory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html#a0bc97032ff316e913dd373e68a2232c2',1,'Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.PrimaryDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.html#aa3e399fe1533b15a2e0814b3634037bc',1,'Tgstation.Server.Host.Components.IDmbProvider.PrimaryDirectory()']]], + ['primaryport',['PrimaryPort',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.html#affe09fcc79cb191dece8adfb642d8cc0',1,'Tgstation::Server::Api::Models::Internal::DreamDaemonLaunchParameters']]], + ['primaryrevisioninformation',['PrimaryRevisionInformation',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html#a4fb69a83c0ff12c00dc7db7905003709',1,'Tgstation::Server::Host::Models::TestMerge']]], + ['primaryrevisioninformationid',['PrimaryRevisionInformationId',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html#a1f5f380223b363e413f2f8b9ba29a4b2',1,'Tgstation::Server::Host::Models::TestMerge']]], + ['primarytestmerge',['PrimaryTestMerge',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information.html#a628bb81ae3a0621e5e3ad472d0dab742',1,'Tgstation.Server.Api.Models.RevisionInformation.PrimaryTestMerge()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html#adbe03f25ff741698ab92816bf7b511c5',1,'Tgstation.Server.Host.Models.RevisionInformation.PrimaryTestMerge()']]], + ['processid',['ProcessId',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html#aef75179a5df95282951af5c85997578f',1,'Tgstation.Server.Host.Models.DreamDaemonSettings.ProcessId()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html#a6f8d698913ca0c40775eaa9a1ec8a787',1,'Tgstation.Server.Host.Models.ReattachInformationBase.ProcessId()']]], + ['progress',['Progress',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job.html#a2c9ae1e6331880d2f0f198c16f574e4f',1,'Tgstation.Server.Api.Models.Job.Progress()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html#ac8d74f805cd5f8d259aa37f189d133cc',1,'Tgstation.Server.Host.Core.JobHandler.Progress()']]], + ['projectname',['ProjectName',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker.html#ad36bc7e479eaaaeeee6b5d0164296cf0',1,'Tgstation::Server::Api::Models::DreamMaker']]], + ['provider',['Provider',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot.html#aa1c996d380be8d91b5042b6e1286b443',1,'Tgstation::Server::Api::Models::Internal::ChatBot']]], + ['providerchannelid',['ProviderChannelId',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping.html#af9b20c51cf6dad7a37b048111026abcf',1,'Tgstation::Server::Host::Components::Chat::ChannelMapping']]], + ['providerid',['ProviderId',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping.html#a647f007fe6e42d97d736747f6069c584',1,'Tgstation::Server::Host::Components::Chat::ChannelMapping']]], + ['pullrequestrevision',['PullRequestRevision',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters.html#adbe0060eb8405c4d27f40031913c5bf0',1,'Tgstation::Server::Api::Models::TestMergeParameters']]], + ['pushtestmergecommits',['PushTestMergeCommits',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#a80ce424c357f9823d79245f509403807',1,'Tgstation::Server::Api::Models::Internal::RepositorySettings']]] +]; diff --git a/search/properties_f.html b/search/properties_f.html new file mode 100644 index 0000000000..ec565bd510 --- /dev/null +++ b/search/properties_f.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/properties_f.js b/search/properties_f.js new file mode 100644 index 0000000000..2fda8ec735 --- /dev/null +++ b/search/properties_f.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['rawjson',['RawJson',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_command.html#a2a36d966a4d7a2b7c045d4da6bc84ec9',1,'Tgstation::Server::Host::Components::Interop::CommCommand']]], + ['rawuseragent',['RawUserAgent',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a8e9f868cdb40bcbfb9fb5b8cdee7a5a3',1,'Tgstation::Server::Api::ApiHeaders']]], + ['realid',['RealId',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel.html#a4008cb7e685a82e590a10f673ed23fd3',1,'Tgstation.Server.Host.Components.Chat.Channel.RealId()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user.html#ac4a6e8d71a8d3e48057c40df6e798db4',1,'Tgstation.Server.Host.Components.Chat.User.RealId()']]], + ['reattachinformations',['ReattachInformations',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a7a1cdc4c717337334e3b4dfd51bbd1c8',1,'Tgstation.Server.Host.Models.DatabaseContext.ReattachInformations()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#afee6cf458d92a060f160cbd821a8c1f4',1,'Tgstation.Server.Host.Models.IDatabaseContext.ReattachInformations()']]], + ['rebootinginactiveserver',['RebootingInactiveServer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_monitor_state.html#a37727fb1a18d568d3b85da43088b1ab7',1,'Tgstation::Server::Host::Components::Watchdog::MonitorState']]], + ['rebootstate',['RebootState',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#af12460cd54ebce65ecf71fb8dad516c4',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.RebootState()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#a0145fd1816a703bcb80fd8e107034f4c',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.RebootState()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#af219e5439d3128b574f162780bc7720b',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.RebootState()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a5bc3f8e6c5569555d358578e612a1920',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.RebootState()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html#aec874c3505b96efeeaf100ce4b7e6eea',1,'Tgstation.Server.Host.Models.ReattachInformationBase.RebootState()']]], + ['reference',['Reference',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html#a7409d655bc6993e0eb1d75743160a3b2',1,'Tgstation.Server.Api.Models.Repository.Reference()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_i_repository.html#a36f1520633eca12a57b6ed52c60c5257',1,'Tgstation.Server.Host.Components.Repository.IRepository.Reference()']]], + ['repository',['Repository',['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#adf8d664f59d973f69aa15c22fba93735',1,'Tgstation.Server.Client.Components.IInstanceClient.Repository()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a507ef7665b72f494e56b997e19835367',1,'Tgstation.Server.Client.Components.InstanceClient.Repository()']]], + ['repositorymanager',['RepositoryManager',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html#a95e8444e36fb2dde06d9d9f8159d423b',1,'Tgstation.Server.Host.Components.IInstance.RepositoryManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a0ba6b6f63f50a267051c77c15e6c6fcf',1,'Tgstation.Server.Host.Components.Instance.RepositoryManager()']]], + ['repositoryrights',['RepositoryRights',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance_user.html#a369d2b654bf3c91d4d78e3c758a27757',1,'Tgstation::Server::Api::Models::InstanceUser']]], + ['repositorysettings',['RepositorySettings',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a4e7be9a13ff81eb52196f1a35172263b',1,'Tgstation.Server.Host.Models.DatabaseContext.RepositorySettings()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#a57e8c3c7a2f1a7f3d34208ab49390096',1,'Tgstation.Server.Host.Models.IDatabaseContext.RepositorySettings()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a389d4c0693f617133a4a8db430c65ab4',1,'Tgstation.Server.Host.Models.Instance.RepositorySettings()']]], + ['resetadminpassword',['ResetAdminPassword',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html#a90f97812f033dd9cc418ea1fcffe3ce0',1,'Tgstation::Server::Host::Configuration::DatabaseConfiguration']]], + ['restartrequested',['RestartRequested',['../interface_tgstation_1_1_server_1_1_host_1_1_i_server.html#ac87902a08c496cd40add682a2ec6c616',1,'Tgstation.Server.Host.IServer.RestartRequested()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#add86891cdb4011d078e94671466ef14e',1,'Tgstation.Server.Host.Server.RestartRequested()']]], + ['restarttimeout',['RestartTimeout',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html#addf96ec4a3f16bc7d3d2cd94347dd1d3',1,'Tgstation::Server::Host::Configuration::GeneralConfiguration']]], + ['retryafter',['RetryAfter',['../class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception.html#a1aad8b621a8b13f9671908f0bc6b3025',1,'Tgstation::Server::Client::RateLimitException']]], + ['revinfotestmerges',['RevInfoTestMerges',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a7b31c0d79c7983467cad196f2d647a3e',1,'Tgstation::Server::Host::Models::DatabaseContext']]], + ['revision',['Revision',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_json_file.html#af6d70d4a20f3176c3c19b2952c9a3ec3',1,'Tgstation.Server.Host.Components.Interop.JsonFile.Revision()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge.html#aaea6dcdb934abf7929b14a051f4d724f',1,'Tgstation.Server.Host.Components.Interop.TestMerge.Revision()']]], + ['revisioninformation',['RevisionInformation',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_compile_job.html#a1d1274044dfcbf5e6e69798cc57beab5',1,'Tgstation.Server.Api.Models.CompileJob.RevisionInformation()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html#a0ff964c98b1bd3dac0c2d0d77f223492',1,'Tgstation.Server.Api.Models.Repository.RevisionInformation()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.html#a30c14e7fc4c770ff11cd0f10be4fb4dd',1,'Tgstation.Server.Host.Models.CompileJob.RevisionInformation()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_rev_info_test_merge.html#a84e7e578fe5c0d7c09dc22f9085d7367',1,'Tgstation.Server.Host.Models.RevInfoTestMerge.RevisionInformation()']]], + ['revisioninformations',['RevisionInformations',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a171b007805a06da662fbbfb5a4508957',1,'Tgstation.Server.Host.Models.DatabaseContext.RevisionInformations()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#a8e78614cd8f6b1c9b29677a631d42604',1,'Tgstation.Server.Host.Models.IDatabaseContext.RevisionInformations()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#ae46b0c821ef239baa662cc6449042428',1,'Tgstation.Server.Host.Models.Instance.RevisionInformations()']]], + ['revisoninformations',['RevisonInformations',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html#a7fe2e5a682458f709e43ff6bab6e6912',1,'Tgstation::Server::Host::Models::TestMerge']]], + ['running',['Running',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_daemon.html#aeb790941d9b1807e1de1f1b869102c01',1,'Tgstation.Server.Api.Models.DreamDaemon.Running()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_watchdog.html#a26fc404928f808be57119b4dcd5edbb2',1,'Tgstation.Server.Host.Components.Watchdog.IWatchdog.Running()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a27e3ca033079704cca1f215e31f4cc0b',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Running()']]] +]; diff --git a/search/search.css b/search/search.css new file mode 100644 index 0000000000..3cf9df94a4 --- /dev/null +++ b/search/search.css @@ -0,0 +1,271 @@ +/*---------------- Search Box */ + +#FSearchBox { + float: left; +} + +#MSearchBox { + white-space : nowrap; + float: none; + margin-top: 8px; + right: 0px; + width: 170px; + height: 24px; + z-index: 102; +} + +#MSearchBox .left +{ + display:block; + position:absolute; + left:10px; + width:20px; + height:19px; + background:url('search_l.png') no-repeat; + background-position:right; +} + +#MSearchSelect { + display:block; + position:absolute; + width:20px; + height:19px; +} + +.left #MSearchSelect { + left:4px; +} + +.right #MSearchSelect { + right:5px; +} + +#MSearchField { + display:block; + position:absolute; + height:19px; + background:url('search_m.png') repeat-x; + border:none; + width:115px; + margin-left:20px; + padding-left:4px; + color: #909090; + outline: none; + font: 9pt Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; +} + +#FSearchBox #MSearchField { + margin-left:15px; +} + +#MSearchBox .right { + display:block; + position:absolute; + right:10px; + top:8px; + width:20px; + height:19px; + background:url('search_r.png') no-repeat; + background-position:left; +} + +#MSearchClose { + display: none; + position: absolute; + top: 4px; + background : none; + border: none; + margin: 0px 4px 0px 0px; + padding: 0px 0px; + outline: none; +} + +.left #MSearchClose { + left: 6px; +} + +.right #MSearchClose { + right: 2px; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; +} + +.SRResult { + display: none; +} + +DIV.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/search/search.js b/search/search.js new file mode 100644 index 0000000000..a554ab9cb5 --- /dev/null +++ b/search/search.js @@ -0,0 +1,814 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches.html'; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName == 'DIV' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName == 'DIV' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e(R!W8j_r#qQ#gnr4kAxdU#F0+OBry$Z+ z_0PMi;P|#{d%mw(dnw=jM%@$onTJa%@6Nm3`;2S#nwtVFJI#`U@2Q@@JCCctagvF- z8H=anvo~dTmJ2YA%wA6IHRv%{vxvUm|R)kgZeo zmX%Zb;mpflGZdXCTAgit`||AFzkI#z&(3d4(htA?U2FOL4WF6wY&TB#n3n*I4+hl| z*NBpo#FA92vEu822WQ%mvv4FO#qs` BFGc_W literal 0 HcmV?d00001 diff --git a/search/search_r.png b/search/search_r.png new file mode 100644 index 0000000000000000000000000000000000000000..1af5d21ee13e070d7600f1c4657fde843b953a69 GIT binary patch literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9c!2%@BXHTsJQY`6?zK#qG8~eHcB(ehe3dtTp zz6=bxGZ+|(`xqD=STHa&U1eaXVrO7DwS|Gf*oA>XrmV$GYcEhOQT(QLuS{~ooZ2P@v=Xc@RKW@Irliv8_;wroU0*)0O?temdsA~70jrdux+`@W7 z-N(<(C)L?hOO?KV{>8(jC{hpKsws)#Fh zvsO>IB+gb@b+rGWaO&!a9Z{!U+fV*s7TS>fdt&j$L%^U@Epd$~Nl7e8wMs5Z1yT$~ z28I^8hDN#u<{^fLRz?<9hUVG^237_Jy7tbuQ8eV{r(~v8;?@w8^gA7>fx*+&&t;uc GLK6VEQpiUD literal 0 HcmV?d00001 diff --git a/search/searchdata.js b/search/searchdata.js new file mode 100644 index 0000000000..8f9d4febbe --- /dev/null +++ b/search/searchdata.js @@ -0,0 +1,42 @@ +var indexSectionsWithContent = +{ + 0: "2abcdefghijklmnopqrstuvwz~", + 1: "abcdefghijklmnprstuvw", + 2: "rt", + 3: "2abcdefghijklmnprstuvw", + 4: "abcdefghijklmnoprstuvwz~", + 5: "abcdefghijklmnopqrstuvw", + 6: "abcdeimrs", + 7: "abcdefhilmnorstuw", + 8: "abcdefghijlmnoprstuvw", + 9: "ast" +}; + +var indexSectionNames = +{ + 0: "all", + 1: "classes", + 2: "namespaces", + 3: "files", + 4: "functions", + 5: "variables", + 6: "enums", + 7: "enumvalues", + 8: "properties", + 9: "pages" +}; + +var indexSectionLabels = +{ + 0: "All", + 1: "Classes", + 2: "Namespaces", + 3: "Files", + 4: "Functions", + 5: "Variables", + 6: "Enumerations", + 7: "Enumerator", + 8: "Properties", + 9: "Pages" +}; + diff --git a/search/variables_0.html b/search/variables_0.html new file mode 100644 index 0000000000..12104bcb5f --- /dev/null +++ b/search/variables_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_0.js b/search/variables_0.js new file mode 100644 index 0000000000..88e15806a2 --- /dev/null +++ b/search/variables_0.js @@ -0,0 +1,29 @@ +var searchData= +[ + ['active',['active',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#ad884d3e85c000fa8e1e2a38f85205d71',1,'Tgstation::Server::Host::Components::Chat::JsonTrackingContext']]], + ['activecompilejob',['ActiveCompileJob',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#a81dcb408195dd21a64c7df3f73c5e123',1,'Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.ActiveCompileJob()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#ad92fd5a42c701562bd4ae033b533b9bd',1,'Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.ActiveCompileJob()']]], + ['activeversionfilename',['ActiveVersionFileName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a55d24d297ec0618cf0ecdd6fc0bd5a66',1,'Tgstation::Server::Host::Components::Byond::ByondManager']]], + ['address',['address',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a5b89ca154b65b12e53b6dca3ceeb0243',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]], + ['adirectoryname',['ADirectoryName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#af0d17d78c53e4981ffc59049c2c56706',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['administration',['Administration',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a1bd414117e790a954bd7bfb83c7d4fc9',1,'Tgstation::Server::Api::Routes']]], + ['adminname',['AdminName',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user.html#a446a804a6eeed2502879382f46df0b9d',1,'Tgstation::Server::Api::Models::User']]], + ['adminonly',['AdminOnly',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html#a42073a7395ce9de9b0de9d36e4d6f388',1,'Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.AdminOnly()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command.html#ad69632c6b423bea790abde206d926425',1,'Tgstation.Server.Host.Components.Chat.Commands.KekCommand.AdminOnly()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#a63dc4a93cb647e14f40a613101d7335e',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.AdminOnly()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html#a17094a94c993b8bbb5fdda8b7a470707',1,'Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.AdminOnly()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.html#a801fd1e205cb8e006fefcbf8af8e3b30',1,'Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.AdminOnly()']]], + ['alphabravostartupseperationinterval',['AlphaBravoStartupSeperationInterval',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#a2ff3cf57883f2b63890498b5e6b4821b',1,'Tgstation::Server::Host::Components::Watchdog::ExperimentalWatchdog']]], + ['alphaisactive',['AlphaIsActive',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#aab354486232b251f67b55956510c409b',1,'Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.AlphaIsActive()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#aa3c8cbb203ca8a7c7d7c021929f9179c',1,'Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.AlphaIsActive()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#a4f66d0dbde98c0e34ee6a57f7b7d2a78',1,'Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.alphaIsActive()']]], + ['alphaserver',['alphaServer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#a0c3dbaa20e0dd6fe267c7030bc5b2b10',1,'Tgstation::Server::Host::Components::Watchdog::ExperimentalWatchdog']]], + ['anyrights',['AnyRights',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.html#a59c0c3cc859620cac6feef11142b561d',1,'Tgstation::Server::Host::Models::InstanceUser']]], + ['apiclient',['apiClient',['../class_tgstation_1_1_server_1_1_client_1_1_administration_client.html#aa8fcfafea45fc308cd03fc312b49bbc9',1,'Tgstation.Server.Client.AdministrationClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html#a295eaf549628214344fb27e81fba5541',1,'Tgstation.Server.Client.Components.ByondClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#a6d24e075bdc11fb958a8b4621475b662',1,'Tgstation.Server.Client.Components.ChatBotsClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#a42e1a0711dec8d78fc370b30b1aacf80',1,'Tgstation.Server.Client.Components.ConfigurationClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#a877a9f75012ed5a6f8673e6ab152b7b8',1,'Tgstation.Server.Client.Components.DreamDaemonClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#a15b39a0722ab7ba469ea002df87190a7',1,'Tgstation.Server.Client.Components.DreamMakerClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#af73c0e3dbcf9e1bc1f8591f3a6331629',1,'Tgstation.Server.Client.Components.InstanceClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#afe9a85e5c7dfa76fcd2ffdeecc388b34',1,'Tgstation.Server.Client.Components.InstanceUserClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html#acd85788ba2647284a601f7cca2e3d8cb',1,'Tgstation.Server.Client.Components.JobsClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#a34759d9d0d89eab5def2d32cc90b7736',1,'Tgstation.Server.Client.Components.RepositoryClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#a717fb098fea90adf6d93ae860e0420fe',1,'Tgstation.Server.Client.InstanceManagerClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a20ec30223872220ef996f4219888f3cc',1,'Tgstation.Server.Client.ServerClient.apiClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#a1d983fe53f4fef69d2ba676884d4ce8c',1,'Tgstation.Server.Client.UsersClient.apiClient()']]], + ['apiclientfactory',['ApiClientFactory',['../class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.html#a1ce05c0c437fca7e62dd764346be53a0',1,'Tgstation::Server::Client::ServerClientFactory']]], + ['apivalidationstatus',['ApiValidationStatus',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a229bbdc35a064d562a4d8779e89f791e',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.ApiValidationStatus()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a53cf16d968bf052deb39c207f5b63c3c',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.apiValidationStatus()']]], + ['apiversionheader',['ApiVersionHeader',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a99649cb8fbf286c635b109e8373b415e',1,'Tgstation::Server::Api::ApiHeaders']]], + ['application',['application',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#a682d13ef1262bd6a39e7c7c6bcb537cf',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.html#aef8fa9c3e5faf65669f3da8c7ac80a35',1,'Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html#acbd1f85ac20eddcfb169523a8af250f7',1,'Tgstation.Server.Host.Components.Chat.ProviderFactory.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#ac3a97f78be517494b755082b2d36e8ba',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#afdd4f1d47dfe74234cea804859fce88c',1,'Tgstation.Server.Host.Components.InstanceFactory.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a943980988fc2fac07085f98eee0b48d7',1,'Tgstation.Server.Host.Components.InstanceManager.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#ac2d5a6dea1cb8242645f96c5db66c25a',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#acf65dab404b5e87eb467ef80124459ab',1,'Tgstation.Server.Host.Controllers.AdministrationController.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#a45c2a8cb2a11e4354193bb8742b709ff',1,'Tgstation.Server.Host.Controllers.HomeController.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a3d7871cf9a4e751e9a25c4ef0595d778',1,'Tgstation.Server.Host.Controllers.InstanceController.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_git_hub_client_factory.html#a803dc318c868ed697fe5f56d312ed909',1,'Tgstation.Server.Host.Core.GitHubClientFactory.application()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a7ae637043ea8134553f87c1a105b3ff9',1,'Tgstation.Server.Host.Core.SetupWizard.application()']]], + ['applicationjson',['ApplicationJson',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#ab997bcc41eaf1aec06776846675e4569',1,'Tgstation::Server::Api::ApiHeaders']]], + ['applicationstarted',['ApplicationStarted',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime.html#a7cc39319f18b1498e56e57277581180b',1,'Tgstation::Server::Host::Core::Tests::TestApplication::MockApplicationLifetime']]], + ['applicationstopped',['ApplicationStopped',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime.html#a2c49db7567058a404b13cc6d8d19636e',1,'Tgstation::Server::Host::Core::Tests::TestApplication::MockApplicationLifetime']]], + ['applicationstopping',['ApplicationStopping',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_application_1_1_mock_application_lifetime.html#addc2d6f3ff76480893796bc473362b2c',1,'Tgstation::Server::Host::Core::Tests::TestApplication::MockApplicationLifetime']]], + ['assemblyname',['AssemblyName',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#acc064dcbf2348cfcf44d06acff499977',1,'Tgstation::Server::Api::ApiHeaders']]], + ['asyncdelayer',['asyncDelayer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a5afa2c2a7ec36f92a63f64cc18f5504e',1,'Tgstation.Server.Host.Components.Chat.Chat.asyncDelayer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html#a6c8a5a6ecc17361261fcfa92518b4e71',1,'Tgstation.Server.Host.Components.Chat.ChatFactory.asyncDelayer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html#a0c4a5f2e2ff5c7656558c250d1620c11',1,'Tgstation.Server.Host.Components.Chat.ProviderFactory.asyncDelayer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a154b7cf302e0d4b39d338846a851b898',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.asyncDelayer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#a54c74a8ac3780369ed05096391c124a5',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.asyncDelayer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#a5a4d7bd7df9fe84ee7b60df90554a6e8',1,'Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.asyncDelayer()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#ae7d416bf09e0f0b5675ed8ce7d99c99a',1,'Tgstation.Server.Host.Core.SetupWizard.asyncDelayer()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html#a9ae1ecab8e3826302aa8d692c0d659d1',1,'Tgstation.Server.Host.Security.IdentityCache.asyncDelayer()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html#ad5a557224dd5d8eac2a46dec133509fb',1,'Tgstation.Server.Host.Security.TokenFactory.asyncDelayer()']]], + ['authenticationcontextfactory',['authenticationContextFactory',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_claims_injector.html#a65b9d8be87a72903d74d266180612800',1,'Tgstation::Server::Host::Security::ClaimsInjector']]], + ['autostart',['autoStart',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a410f168d84f80c138450fb42f222ba01',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['available',['Available',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.html#a7fede11791f3ad6ab39f29cb5ce0075c',1,'Tgstation::Server::Host::IO::Console']]] +]; diff --git a/search/variables_1.html b/search/variables_1.html new file mode 100644 index 0000000000..b784017a1a --- /dev/null +++ b/search/variables_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_1.js b/search/variables_1.js new file mode 100644 index 0000000000..fc923695ce --- /dev/null +++ b/search/variables_1.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['bdirectoryname',['BDirectoryName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#ac3719e69f1a57c2fa46f439678b17745',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['binpath',['BinPath',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#aa929f025399e35d5455574c2db72cd76',1,'Tgstation::Server::Host::Components::Byond::ByondManager']]], + ['botmention',['BotMention',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a2724c59c69f5edcb6ccd6549a6ce71d6',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]], + ['bottoken',['botToken',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#a45475c58bb323678370c010872a126c9',1,'Tgstation::Server::Host::Components::Chat::Providers::DiscordProvider']]], + ['bravoserver',['bravoServer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#ab591be0822355d021d3ab5fda024796f',1,'Tgstation::Server::Host::Components::Watchdog::ExperimentalWatchdog']]], + ['browserresolver',['browserResolver',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#a291e832dea111e7c46387fa96d212cb3',1,'Tgstation::Server::Host::Controllers::HomeController']]], + ['builtincommands',['builtinCommands',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ab3e79a7fe69140182ec0881103c72385',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['byond',['byond',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#af10fd8e9368c9ff17b96370108e7c466',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.byond()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#a79e21f63bc3460961ea59be3636a32e4',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.byond()'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a9846874e39579d320e53020346944a60',1,'Tgstation.Server.Api.Routes.Byond()']]], + ['byondcachepath',['ByondCachePath',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#a9dbecdd4efbda7a406fab099cd108586',1,'Tgstation::Server::Host::Components::Byond::PosixByondInstaller']]], + ['byondclient',['byondClient',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html#a3f484fee845446e8f23e4a2ad80bd7f3',1,'Tgstation::Server::Tests::Instance::ByondTest']]], + ['byondconfigdir',['ByondConfigDir',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#ac5e0a1909c082fbcd47ff591764a2345',1,'Tgstation::Server::Host::Components::Byond::WindowsByondInstaller']]], + ['byondddconfig',['ByondDDConfig',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a85675de1695978da5fe1d958ffb7dcf3',1,'Tgstation::Server::Host::Components::Byond::WindowsByondInstaller']]], + ['byonddxdir',['ByondDXDir',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a2214ac1499336591cc7a382a7b9a986f',1,'Tgstation::Server::Host::Components::Byond::WindowsByondInstaller']]], + ['byondinstaller',['byondInstaller',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a3d9ba4fe85290b449bb305f06cf5b57c',1,'Tgstation.Server.Host.Components.Byond.ByondManager.byondInstaller()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a9b4acf6f948993eac90206dae7dc1c8d',1,'Tgstation.Server.Host.Components.InstanceFactory.byondInstaller()']]], + ['byondlock',['byondLock',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a42e96e58c141e6b8fc7fd3c47421c58b',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['byondmanager',['byondManager',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html#a65e3da64c0d52b3811a21952e5bcae28',1,'Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.byondManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#a519a7b7c42cfba5ff53cce4438a31f71',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.byondManager()']]], + ['byondnoprompttrustedmode',['ByondNoPromptTrustedMode',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a5b257317ebd8d23c34d86835b3f48b09',1,'Tgstation::Server::Host::Components::Byond::WindowsByondInstaller']]], + ['byondrevisionsurltemplate',['ByondRevisionsURLTemplate',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#a5e3ee360cb8eafd7e5f185d10819de1f',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.ByondRevisionsURLTemplate()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#ae80d653422c5a38e3bf430d6b8b5ce5e',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ByondRevisionsURLTemplate()']]], + ['byondtopicsender',['byondTopicSender',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a13168eed51331581cc8783cb08e6fbf4',1,'Tgstation.Server.Host.Components.InstanceFactory.byondTopicSender()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#abf81f6242b4aceb7d9c10122805ace1b',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.byondTopicSender()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#afdff059b68abb8b79d388ee662ee649c',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.byondTopicSender()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a71e7356fbe74f4be48b8d51f57b2e032',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.byondTopicSender()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#ad28a647285744951437e5b5f23c28430',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.byondTopicSender()']]] +]; diff --git a/search/variables_10.html b/search/variables_10.html new file mode 100644 index 0000000000..308afd51e6 --- /dev/null +++ b/search/variables_10.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_10.js b/search/variables_10.js new file mode 100644 index 0000000000..478829c200 --- /dev/null +++ b/search/variables_10.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['querychannelidmap',['queryChannelIdMap',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#aa1d881a293f002c54c639ed5ed6f251d',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]] +]; diff --git a/search/variables_11.html b/search/variables_11.html new file mode 100644 index 0000000000..c276827701 --- /dev/null +++ b/search/variables_11.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_11.js b/search/variables_11.js new file mode 100644 index 0000000000..cfaca69d35 --- /dev/null +++ b/search/variables_11.js @@ -0,0 +1,28 @@ +var searchData= +[ + ['realserver',['realServer',['../class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html#a292747ef36a9f260dbe9b62591e2c93d',1,'Tgstation::Server::Tests::TestingServer']]], + ['reattachinfohandler',['reattachInfoHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a72ff0b6fb336a2d931cf64d795d8a542',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['reattachinformation',['reattachInformation',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a017d1f82539ec09794f736e9ae04e7fd',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['rebootstate',['RebootState',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#a9e53440db7666ec16e93e62b19f376d3',1,'Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.RebootState()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a97f00f4296f371039beff6e167b4ff03',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.RebootState()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_experimental_watchdog.html#a44e42b999b353da3ff1f5899a77ee12c',1,'Tgstation.Server.Host.Components.Watchdog.ExperimentalWatchdog.RebootState()']]], + ['reboottcs',['rebootTcs',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a92ab8344fdb23d7b4db96f4595ae8054',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['recheckdelayms',['RecheckDelayMs',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#ae04f9adb517fe75c7cf4ea67a67d9c20',1,'Tgstation::Server::Host::Components::Watchdog::WindowsNetworkPromptReaper']]], + ['reference',['Reference',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a019e9f75f0129457c1f6f2e44e9736d0',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['registeredprocesses',['registeredProcesses',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#ae5f1894d3067dde466021e2725886b8a',1,'Tgstation::Server::Host::Components::Watchdog::WindowsNetworkPromptReaper']]], + ['released',['released',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#aa59a34a24d122357d081403d95a76e78',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['releaseservers',['releaseServers',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a256c7fd5a04870388411185b46ff6fb8',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['remotetemporarybranchname',['RemoteTemporaryBranchName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a4ad624c2294a1cc28f47d251ed3a17f8',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['repository',['Repository',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a738817663facf9293a084ab4c5a155ef',1,'Tgstation.Server.Api.Routes.Repository()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a46c9b5f872d0225fd0c8f6364ccf3489',1,'Tgstation.Server.Host.Components.Repository.Repository.repository()']]], + ['repositorylogger',['repositoryLogger',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#a215c5b936673287ad252f01b1b87f9bf',1,'Tgstation::Server::Host::Components::Repository::RepositoryManager']]], + ['repositorymanager',['repositoryManager',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#ac6eb0ebb09860c076b09529a92963592',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.repositoryManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#af5857133d7544a45ce4b4e75210830b2',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.repositoryManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html#acdac2dc61b95355e78f8a1b008b7f7b4',1,'Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.repositoryManager()']]], + ['repositorysettings',['repositorySettings',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#ab33fc190fb7655d0ed75fc400e260d2e',1,'Tgstation::Server::Host::Components::Repository::RepositoryManager']]], + ['requestloggers',['requestLoggers',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a8c0c69d8203c1af593869613dfb1f8cc',1,'Tgstation::Server::Client::ApiClient']]], + ['requireheaders',['requireHeaders',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#a91c58c31f7a3cc51fff3cfc3b236756d',1,'Tgstation::Server::Host::Controllers::ApiController']]], + ['requireinstance',['requireInstance',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#afe4f020656eb2d02def6ff389fd33bcb',1,'Tgstation::Server::Host::Controllers::ApiController']]], + ['restarthandlers',['restartHandlers',['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a6fd99785ffec475ce3d3835c1206505f',1,'Tgstation::Server::Host::Server']]], + ['restartnotsupportedexception',['RestartNotSupportedException',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#a69d9c2b017d6ecbc121fef1661528c50',1,'Tgstation::Server::Host::Controllers::AdministrationController']]], + ['restartregistration',['restartRegistration',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ab1ff05d250d5aa61c90d5b1a1afa2a3b',1,'Tgstation.Server.Host.Components.Chat.Chat.restartRegistration()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#aefe25fd33c4a6dfb4ea27b583a2286ea',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.restartRegistration()']]], + ['restartrequested',['RestartRequested',['../class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html#a61f844c9c2459cc3ab86153678e938db',1,'Tgstation::Server::Tests::TestingServer']]], + ['root',['Root',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#aa336e9d55df01b49f6d217b48563900a',1,'Tgstation::Server::Api::Routes']]], + ['rootjson',['RootJson',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_design_time_db_context_factory_helpers.html#a1fa8a2aa0e3e9da12ef8889900047067',1,'Tgstation::Server::Host::Models::Migrations::DesignTimeDbContextFactoryHelpers']]], + ['runtask',['runTask',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#a9c208972ecc5b7d3f543c2e33ca745c3',1,'Tgstation::Server::Host::Components::Watchdog::WindowsNetworkPromptReaper']]] +]; diff --git a/search/variables_12.html b/search/variables_12.html new file mode 100644 index 0000000000..bad4c794f4 --- /dev/null +++ b/search/variables_12.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_12.js b/search/variables_12.js new file mode 100644 index 0000000000..2fd57db948 --- /dev/null +++ b/search/variables_12.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['scopefactory',['scopeFactory',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_database_context_factory.html#a2cce345f61e3614445113964be73e3dc',1,'Tgstation::Server::Host::Core::DatabaseContextFactory']]], + ['secondarydirectory',['SecondaryDirectory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#a22d8b0640fe39cb55e644b9a97cbca63',1,'Tgstation.Server.Host.Components.Compiler.DmbProvider.SecondaryDirectory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html#a9b49c370a0335f6fc8966e8fbed630fe',1,'Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.SecondaryDirectory()']]], + ['section',['Section',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_control_panel_configuration.html#adbbc553f0fd0f2eb4a69a8361c5a9c80',1,'Tgstation.Server.Host.Configuration.ControlPanelConfiguration.Section()'],['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html#a3c3201b453ffd190158839da139e4a13',1,'Tgstation.Server.Host.Configuration.DatabaseConfiguration.Section()'],['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html#a8450ea7764591aa38857686d8fc70f93',1,'Tgstation.Server.Host.Configuration.FileLoggingConfiguration.Section()'],['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html#a04dc43bd8ff33f4a8a791f750f7eb1d9',1,'Tgstation.Server.Host.Configuration.GeneralConfiguration.Section()'],['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html#aeed3d84cee92ab5e7488d5c5b52493c7',1,'Tgstation.Server.Host.Configuration.UpdatesConfiguration.Section()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_good_config.html#a519b196f2689a69fdf560c2b9daa8cbc',1,'Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.GoodConfig.Section()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config1.html#aadc0a9ff1fa2ee6ef0a51eaf5df45671',1,'Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.BadConfig1.Section()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_service_collection_extensions_1_1_bad_config2.html#a103b465b4ca8add84af64f2d0692bc91',1,'Tgstation.Server.Host.Core.Tests.TestServiceCollectionExtensions.BadConfig2.Section()']]], + ['securestringlength',['SecureStringLength',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html#a893d5725e799a79d7a3dd172f098edb8',1,'Tgstation::Server::Host::Security::CryptographySuite']]], + ['semaphore',['semaphore',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a192e5a69ce9c2300f588cc65af3a64f2',1,'Tgstation.Server.Host.Components.Byond.ByondManager.semaphore()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#ae6aa8519a6401fc95218f2de88080605',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.semaphore()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#a550982dbdc2ce226e878702a520bbe27',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.semaphore()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#af64bb7e6efa9991a5a3a14993a3277e8',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.semaphore()']]], + ['sendmessagecount',['SendMessageCount',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#abf165c8b6b3e76716dce9cd6cfe31586',1,'Tgstation::Server::Host::Components::Watchdog::WindowsNetworkPromptReaper']]], + ['server',['server',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html#a68bc2da7797f5d0d21a7ab153f558099',1,'Tgstation::Server::Host::Components::Watchdog::BasicWatchdog']]], + ['servercontrol',['serverControl',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html#a680fca011bf0ce22e735337fa4b669b2',1,'Tgstation.Server.Host.Components.Chat.ChatFactory.serverControl()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#ac2ba10fddea5448f4c8c08f363a0e391',1,'Tgstation.Server.Host.Components.InstanceManager.serverControl()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#a5af6c1c8d2eb3d485928e889478f0c87',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.serverControl()']]], + ['serverfactory',['ServerFactory',['../class_tgstation_1_1_server_1_1_host_1_1_program.html#a7a505b0b21db5eea8c5b144d137c1ae2',1,'Tgstation::Server::Host::Program']]], + ['serverupdater',['serverUpdater',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#a860fa70ca4b87deb3f9e6f550d57dc72',1,'Tgstation::Server::Host::Controllers::AdministrationController']]], + ['sessioncontrollerfactory',['sessionControllerFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a83a510422b603a4b745cca929a8f0689',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['shellscriptextension',['ShellScriptExtension',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#a979586ccac8fef0e0a10b9e2f5bfa339',1,'Tgstation::Server::Host::Components::Byond::PosixByondInstaller']]], + ['started',['started',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#add2fda12ab0f9d293937b641a266b8a0',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['startuptcs',['startupTcs',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#a3f49850eb0598fa0627bafcbe46ccf33',1,'Tgstation::Server::Host::Core::Application']]], + ['staticignorefile',['StaticIgnoreFile',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a3c23fe94867b94fa0833f4a789830fd1',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]], + ['subdirectory',['subdirectory',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_resolving_i_o_manager.html#a02d7c98f480664056ad8dbe912003ae9',1,'Tgstation::Server::Host::IO::ResolvingIOManager']]], + ['symlinkfactory',['symlinkFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#ae9583eef7d68626e70fd30097b6db87c',1,'Tgstation.Server.Host.Components.InstanceFactory.symlinkFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a5a52deb2c99db89b8e8dfb4bf1a5fd3f',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.symlinkFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_tests_1_1_test_symlink_factory.html#ab7293877a2fb900634168cfa69663286',1,'Tgstation.Server.Host.IO.Tests.TestSymlinkFactory.symlinkFactory()']]], + ['synchronousiomanager',['synchronousIOManager',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a2b14e009e117f22b206bbdf743712809',1,'Tgstation.Server.Host.Components.InstanceFactory.synchronousIOManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a29a360d050eedfecf24a5d7a75331f1d',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.synchronousIOManager()']]], + ['systemidentityfactory',['systemIdentityFactory',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#a82f9e135570d468d3a0cfbf645e2f0ae',1,'Tgstation.Server.Host.Controllers.HomeController.systemIdentityFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#adcb096909c25a05c74f2714128607c05',1,'Tgstation.Server.Host.Controllers.UserController.systemIdentityFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html#a3d9f7c19ce83603342197d6fd6dffab7',1,'Tgstation.Server.Host.Security.AuthenticationContextFactory.systemIdentityFactory()']]] +]; diff --git a/search/variables_13.html b/search/variables_13.html new file mode 100644 index 0000000000..ef6d36cf33 --- /dev/null +++ b/search/variables_13.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_13.js b/search/variables_13.js new file mode 100644 index 0000000000..e135974020 --- /dev/null +++ b/search/variables_13.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['task',['task',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html#addccba3eae2415a1f1abd3b4195f5bb9',1,'Tgstation.Server.Host.Core.JobHandler.task()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.html#a2d1a4fc7b7fee56456ccebfb699ad8ee',1,'Tgstation.Server.Host.Security.IdentityCacheObject.task()']]], + ['terminationwasrequested',['TerminationWasRequested',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a742d99e0b6bb71d69c2d1da4deab93b9',1,'Tgstation::Server::Host::Components::Watchdog::DeadSessionController']]], + ['testrootpath',['testRootPath',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test.html#aabc2c34fa46079ff3c922be055d30f4a',1,'Tgstation::Server::Tests::InstanceManagerTest']]], + ['testtoken1',['testToken1',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_tests_1_1_test_discord_provider.html#ad72eb96b430ebab407c6a72970e60ac5',1,'Tgstation::Server::Host::Components::Chat::Providers::Tests::TestDiscordProvider']]], + ['timeoutseconds',['TimeoutSeconds',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a6b7d2a57ba6340f51694987653033677',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]], + ['timercts',['timerCts',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#aab6ba11c7820ee9de39771aabbecdfcb',1,'Tgstation::Server::Host::Components::Instance']]], + ['timertask',['timerTask',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#abf825c028f20cd903db1362892dbd833',1,'Tgstation::Server::Host::Components::Instance']]], + ['token',['token',['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a7137670591717642aa084370ed40377e',1,'Tgstation::Server::Client::ServerClient']]], + ['tokenclockskewminutes',['TokenClockSkewMinutes',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html#abbf0169740f418e6ffd4f8c783fdff50',1,'Tgstation::Server::Host::Security::TokenFactory']]], + ['tokenexpiryminutes',['TokenExpiryMinutes',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html#a0cea7772b1f5107da73c23e821e76b43',1,'Tgstation::Server::Host::Security::TokenFactory']]], + ['tokenfactory',['tokenFactory',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#afd05899e85f5a8a6b8c8e374364872f8',1,'Tgstation.Server.Host.Controllers.HomeController.tokenFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#a93cb446fc8d8f84ea595abe709265398',1,'Tgstation.Server.Host.Core.Application.tokenFactory()']]], + ['tokensigningkeybyteamount',['TokenSigningKeyByteAmount',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html#a1daafa97f229b3c342725fba60505b0f',1,'Tgstation::Server::Host::Security::TokenFactory']]], + ['tracking',['Tracking',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a4a27a5627052f0463fd42c7d3fd569a6',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['trackingcontexts',['trackingContexts',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a2b6985d081d60f264709544cd6055ccf',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['typemap',['TypeMap',['../class_tgstation_1_1_server_1_1_api_1_1_rights_1_1_rights_helper.html#a0639f64451959386f79762cb8586b4f0',1,'Tgstation::Server::Api::Rights::RightsHelper']]] +]; diff --git a/search/variables_14.html b/search/variables_14.html new file mode 100644 index 0000000000..305ea5376d --- /dev/null +++ b/search/variables_14.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_14.js b/search/variables_14.js new file mode 100644 index 0000000000..cd2df6a298 --- /dev/null +++ b/search/variables_14.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['uid',['Uid',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html#a5335d4436713401b2872d14752f1ba7b',1,'Tgstation::Server::Host::Security::WindowsSystemIdentity']]], + ['unknownreference',['UnknownReference',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#ad02f759b45e4f20dfee55cfbf3f78baa',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['updatepath',['updatePath',['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a4e10711e91a3025a08ab98e9024e90ad',1,'Tgstation::Server::Host::Server']]], + ['updatesconfiguration',['updatesConfiguration',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#afa09210575a84b625e234e7e0b19fa08',1,'Tgstation::Server::Host::Controllers::AdministrationController']]], + ['updating',['updating',['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a3a4cc72abe0c0a1e8caddeab4a210324',1,'Tgstation::Server::Host::Server']]], + ['url',['Url',['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a7dcb54f317c73bd5a54f7856f0ef79fc',1,'Tgstation::Server::Client::ServerClient']]], + ['user',['User',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a12784e8b5b7ac25c0684c9d4c7c59178',1,'Tgstation::Server::Api::Routes']]], + ['useragent',['UserAgent',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a344ee837192b944640d63d1070ba4f2d',1,'Tgstation::Server::Api::ApiHeaders']]], + ['username',['Username',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html#a7bbd8a3a43a6a2864b3348ae7f9438b9',1,'Tgstation::Server::Host::Security::WindowsSystemIdentity']]], + ['usernameheader',['UsernameHeader',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#aeb78db4fde83cb73bbad383ccb1b71f1',1,'Tgstation::Server::Api::ApiHeaders']]], + ['userprincipal',['userPrincipal',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html#abf93d22395acd37f9c24aee156691f7a',1,'Tgstation::Server::Host::Security::WindowsSystemIdentity']]] +]; diff --git a/search/variables_15.html b/search/variables_15.html new file mode 100644 index 0000000000..8c9bf77bc8 --- /dev/null +++ b/search/variables_15.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_15.js b/search/variables_15.js new file mode 100644 index 0000000000..54be947a15 --- /dev/null +++ b/search/variables_15.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['valid',['Valid',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_discord_connection_string_builder.html#adcfa84ac7eac02c297c7560df41d24a2',1,'Tgstation.Server.Api.Models.DiscordConnectionStringBuilder.Valid()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#a01ca8188cc4ec75b5bd47a8253aca0da',1,'Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Valid()']]], + ['version',['Version',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a6b7e4d4ae426467f9d10844d43d35874',1,'Tgstation::Server::Api::ApiHeaders']]], + ['versionfilename',['VersionFileName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#acb1d6dfeac5bf1c13e9857dcac03be46',1,'Tgstation::Server::Host::Components::Byond::ByondManager']]], + ['versionprefix',['VersionPrefix',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#afb6962fb7f4a84f548dc77dd797d39c9',1,'Tgstation::Server::Host::Core::Application']]] +]; diff --git a/search/variables_16.html b/search/variables_16.html new file mode 100644 index 0000000000..1061d0df9c --- /dev/null +++ b/search/variables_16.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_16.js b/search/variables_16.js new file mode 100644 index 0000000000..8bde34c05f --- /dev/null +++ b/search/variables_16.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['watchdog',['watchdog',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html#a90292e2c1149c3d0e92a79d98968be44',1,'Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#aec51431b45d46994bbe24550640833d0',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#a75363c8266024cf66cb86d1c44545bdc',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html#aeabbea7c18623b8fb74c64a3b90aa453',1,'Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a50dc15cecba1cb334d01e08a9433c2dd',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.html#ac460374f4a77377ed95d0474e93dac22',1,'Tgstation.Server.Host.Components.EventConsumer.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a92f39be2b47f571fe439f78ccadd2acc',1,'Tgstation.Server.Host.Service.ServerService.watchdog()']]], + ['watchdogfactory',['WatchdogFactory',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html#acf9b9a6d3e7b8fc8bc349e10a8b6631b',1,'Tgstation.Server.Host.Service.Program.WatchdogFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#ab5bda9a81248be0498e668f2b148aa82',1,'Tgstation.Server.Host.Components.InstanceFactory.watchdogFactory()']]], + ['watchdogpresent',['WatchdogPresent',['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a00ad28e8a1946d6dfd1ceda6d02be5b4',1,'Tgstation::Server::Host::Server']]], + ['watchdogtask',['watchdogTask',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a89678cb55592e83aa074a24dc86dcd6f',1,'Tgstation::Server::Host::Service::ServerService']]], + ['webhostbuilder',['webHostBuilder',['../class_tgstation_1_1_server_1_1_host_1_1_server.html#ae141c6cf410d54399d9ee49b38ca305a',1,'Tgstation::Server::Host::Server']]] +]; diff --git a/search/variables_2.html b/search/variables_2.html new file mode 100644 index 0000000000..0cb98d3057 --- /dev/null +++ b/search/variables_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_2.js b/search/variables_2.js new file mode 100644 index 0000000000..892e5b1e78 --- /dev/null +++ b/search/variables_2.js @@ -0,0 +1,41 @@ +var searchData= +[ + ['cachedclients',['cachedClients',['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#a98b06be6c61309730e3b5eea66da722b',1,'Tgstation::Server::Client::InstanceManagerClient']]], + ['cachedidentities',['cachedIdentities',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html#ab9206118af46526c3bb89c95c5197bd8',1,'Tgstation::Server::Host::Security::IdentityCache']]], + ['cancellationtoken',['cancellationToken',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#ad2f0b06a4dbe78c59e2e0709fb8d8fda',1,'Tgstation::Server::Host::Components::Interop::CommContext']]], + ['cancellationtokensource',['cancellationTokenSource',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#aa5d4e8581299b0fbbc8622b276f12397',1,'Tgstation.Server.Host.Components.Interop.CommContext.cancellationTokenSource()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#a4ec45a0beda901300d6ce268d34c0ef5',1,'Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.cancellationTokenSource()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html#aafb1cffb23850dc0c276273efe2a8a82',1,'Tgstation.Server.Host.Core.JobHandler.cancellationTokenSource()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.html#ac8422fda839cd16fd8b467bb4947f8a1',1,'Tgstation.Server.Host.Security.IdentityCacheObject.cancellationTokenSource()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a80bf6f84e712996ae1d8894ec96e9ba3',1,'Tgstation.Server.Host.Server.cancellationTokenSource()'],['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a4f65e767919ae007c07ef7b3b715b498',1,'Tgstation.Server.Host.Service.ServerService.cancellationTokenSource()']]], + ['cancelled',['cancelled',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html#a3e7c49f4688ab384e70080bf76e867c9',1,'Tgstation::Server::Host::Core::Tests::TestJobHandler']]], + ['channelidcounter',['channelIdCounter',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a2e2b66e3a89f1bd6aceda7f0a4bb234b',1,'Tgstation.Server.Host.Components.Chat.Chat.channelIdCounter()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a3170ebdb4e8568868efd3b1c1764bf38',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.channelIdCounter()']]], + ['channelidmap',['channelIdMap',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a403b3ff6bccc4b1e3f7e9e8729f84908',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]], + ['channelspath',['channelsPath',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#af702fc418b52e116273bacce6697c5dc',1,'Tgstation::Server::Host::Components::Chat::JsonTrackingContext']]], + ['channelssemaphore',['channelsSemaphore',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#a1257ebc66455fcbe3ab2e7e72534ce6e',1,'Tgstation::Server::Host::Components::Chat::JsonTrackingContext']]], + ['chat',['chat',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a768885bf92f07d7e09f61cbd5273bf4e',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.chat()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#ab46cb8a880307f45012474909bada8c3',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.chat()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#af039fd67d6fa74b527048459e1a358b0',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.chat()'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a6cf0d5e4d1f8ed76d2cf84a56392ed2d',1,'Tgstation.Server.Api.Routes.Chat()']]], + ['chatfactory',['chatFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a59397e41a1bb1df63d5ac8022cbb67d8',1,'Tgstation::Server::Host::Components::InstanceFactory']]], + ['chathandler',['chatHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a67736c6716ce7bc9b5167dedb4e43220',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['chatjsontrackingcontext',['chatJsonTrackingContext',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#aa5a9ae38d8ab674620397be99c74cada',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['cleanupcts',['cleanupCts',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a95f842bd0fd617eb860389efc130de4d',1,'Tgstation::Server::Host::Components::Compiler::DmbFactory']]], + ['cleanuptask',['cleanupTask',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a12c033d70ec8b53374f2360d2cac82b0',1,'Tgstation::Server::Host::Components::Compiler::DmbFactory']]], + ['client',['client',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#a059457d72470d29c3530d489adb91d1c',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.client()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a01ba0df08b2b2139b417352c28cabc2f',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.client()'],['../class_tgstation_1_1_server_1_1_tests_1_1_administration_test.html#acd251fb17c3dec58ce610716538ec6c0',1,'Tgstation.Server.Tests.AdministrationTest.client()']]], + ['clientfactory',['clientFactory',['../class_tgstation_1_1_server_1_1_tests_1_1_integration_test.html#a531e3e175cefd7786c6e349fa7584f68',1,'Tgstation::Server::Tests::IntegrationTest']]], + ['codemodificationsheadfile',['CodeModificationsHeadFile',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#aa146572ec12e2444819edb99be402a91',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]], + ['codemodificationssubdirectory',['CodeModificationsSubdirectory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a7e19fd0432fd7b61f30a015a477eeb74',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]], + ['codemodificationstailfile',['CodeModificationsTailFile',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#ac2b6e06f4a91a2f4fc5f8f93210ee941',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]], + ['combinedstringbuilder',['combinedStringBuilder',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#ad7ee2e54c6885bdfc34eb544e1c8d0dc',1,'Tgstation::Server::Host::Core::Process']]], + ['commandfactory',['commandFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a3e34b59cab804565caa31a230980e65b',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['commandspath',['commandsPath',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#a88d413546c92683df93fb058d7f40dc8',1,'Tgstation::Server::Host::Components::Chat::JsonTrackingContext']]], + ['commonmention',['CommonMention',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a55432cab80130ced59f78ce28750a96a',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['compilejobconsumer',['compileJobConsumer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#aa6a592415efad8b06cbbc77803a3bdd8',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.compileJobConsumer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a83fa9f5ca1f5dda6fcacbc0131d30fa9',1,'Tgstation.Server.Host.Components.Instance.compileJobConsumer()']]], + ['compiling',['compiling',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#ab859ee90b0153ec01fbeeaa6adea6dbe',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['configuration',['configuration',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a7108deed4746a294c82f0b950602edd3',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.configuration()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.html#acf0b5b1529168e0c66003f571a4edb6e',1,'Tgstation.Server.Host.Components.EventConsumer.configuration()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#a5b2985673070866ac14432d088c44b1e',1,'Tgstation.Server.Host.Core.Application.configuration()'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a8aaca6b84ee519e26c8351c2b5929c18',1,'Tgstation.Server.Api.Routes.Configuration()']]], + ['configurationclient',['configurationClient',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test.html#aa48176d89e902d9834158c81ede8fcaf',1,'Tgstation::Server::Tests::Instance::ConfigurationTest']]], + ['configurationfile',['ConfigurationFile',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#aa983574bbb6d05042ad2f96d30ffa824',1,'Tgstation::Server::Api::Routes']]], + ['connected',['Connected',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#ac2744da20824177724b971eb20a6d5a0',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Connected()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#aa22564e0346747e2c00dfcab7a48141c',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Connected()']]], + ['connectionsupdated',['connectionsUpdated',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a70431daa3f7477949d950d44026ee802',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['console',['console',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a65a52e0b0d2e65eb557e0250bbe0de97',1,'Tgstation::Server::Host::Core::SetupWizard']]], + ['controlpanelconfiguration',['controlPanelConfiguration',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#a81d7f216e77a45eed438ee3e88d0677c',1,'Tgstation::Server::Host::Controllers::HomeController']]], + ['counter',['counter',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test.html#aebaa596caa1ccd2790509876c417e9a5',1,'Tgstation::Server::Tests::InstanceManagerTest']]], + ['credentialsprovider',['credentialsProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a9c50da4252e0c984da5f3042053ca28f',1,'Tgstation.Server.Host.Components.InstanceFactory.credentialsProvider()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#afdb8ee82eed9e1b0251d71af2c3ff612',1,'Tgstation.Server.Host.Components.Repository.Repository.credentialsProvider()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#aa5ecd6e3290afe55b0ab07da6ec99948',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.credentialsProvider()']]], + ['cryptographysuite',['cryptographySuite',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#ae61c8c28bfce67853a5b1acbcd095533',1,'Tgstation.Server.Host.Components.InstanceFactory.cryptographySuite()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#a24b2b18a44b0dceb3311a307e47b085b',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.cryptographySuite()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#a78651298906fc1500952310c49c96e06',1,'Tgstation.Server.Host.Controllers.HomeController.cryptographySuite()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#aba1ed8b3befb54640af05c3694eeb278',1,'Tgstation.Server.Host.Controllers.UserController.cryptographySuite()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_seeder.html#a8162408ea812918c39584a7e2131dfee',1,'Tgstation.Server.Host.Models.DatabaseSeeder.cryptographySuite()']]], + ['currentwaittask',['currentWaitTask',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html#a080ec217e432312482ed673597618a3b',1,'Tgstation::Server::Host::Core::Tests::TestJobHandler']]], + ['customcommandhandler',['customCommandHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#aaf9418637d15f3785e1a7225fc12ea5b',1,'Tgstation.Server.Host.Components.Chat.Chat.customCommandHandler()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#a29e2454d48fe2ce5e023c37bd2ceb5b8',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext.customCommandHandler()']]] +]; diff --git a/search/variables_3.html b/search/variables_3.html new file mode 100644 index 0000000000..1e83bf5a9f --- /dev/null +++ b/search/variables_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_3.js b/search/variables_3.js new file mode 100644 index 0000000000..150e5b4b49 --- /dev/null +++ b/search/variables_3.js @@ -0,0 +1,49 @@ +var searchData= +[ + ['databasecontext',['databaseContext',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html#a4f3486b694a62f17ead5bfe84d20d8e0',1,'Tgstation.Server.Host.Security.AuthenticationContextFactory.databaseContext()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_claims_injector.html#a3fce82f6290d85c4b2b5182cbf7b6c74',1,'Tgstation.Server.Host.Security.ClaimsInjector.databaseContext()']]], + ['databasecontextfactory',['databaseContextFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#abbd5571bc7db746a0f12add2f39e67de',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.databaseContextFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#a092a4f6583f2101fbef0ec6caf5c41a0',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.databaseContextFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a731c40527d51bd6c7674ecc0514b8d30',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.databaseContextFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a4379ea13292a9bc2f8c297b8be8bdf08',1,'Tgstation.Server.Host.Components.Instance.databaseContextFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a1b570e9e9d997c7b93842a93f1a362d6',1,'Tgstation.Server.Host.Components.InstanceFactory.databaseContextFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#ab5c8e78bdae6eb6eb2ed289563c639cc',1,'Tgstation.Server.Host.Components.InstanceManager.databaseContextFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html#ae9849f4e26995f2e0161117857c4ee02',1,'Tgstation.Server.Host.Components.ReattachInfoHandler.databaseContextFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a2b81969e82fa9f6af2bc57597ed92cfb',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.databaseContextFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#af53ebd4410384ee791f3d9c8dd282e88',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.databaseContextFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a928cf25a91203c4808627c4c02dc8771',1,'Tgstation.Server.Host.Core.JobManager.databaseContextFactory()']]], + ['databaseseeder',['databaseSeeder',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a190f9903acbbbd1fb7da29291639b874',1,'Tgstation::Server::Host::Models::DatabaseContext']]], + ['dbconnectionfactory',['dbConnectionFactory',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#aa15c53be5a78c0429bfa9a3ae4ae4e56',1,'Tgstation::Server::Host::Core::SetupWizard']]], + ['defaultadminpassword',['DefaultAdminPassword',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user.html#a6b47a29b6c75f6a51d8c7d0d4305e210',1,'Tgstation::Server::Api::Models::User']]], + ['defaultbuffersize',['DefaultBufferSize',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a8d302b2be6862b23b9a18a9412fc7fc9',1,'Tgstation::Server::Host::IO::DefaultIOManager']]], + ['defaultbyondtopictimeout',['DefaultByondTopicTimeout',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html#a51c2f2b2e7faf729aad307050a6d8a6c',1,'Tgstation::Server::Host::Configuration::GeneralConfiguration']]], + ['defaultgithubrepositoryid',['DefaultGitHubRepositoryId',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html#a7f4f5cb3301033fd4dfebde47baf9c5a',1,'Tgstation::Server::Host::Configuration::UpdatesConfiguration']]], + ['defaultgittagprefix',['DefaultGitTagPrefix',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html#ae004e4379b32596669db26f1bdffef84',1,'Tgstation::Server::Host::Configuration::UpdatesConfiguration']]], + ['defaultloglevel',['DefaultLogLevel',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html#a20cad976d13ebead44836c2c73546eb1',1,'Tgstation::Server::Host::Configuration::FileLoggingConfiguration']]], + ['defaultmicrosoftloglevel',['DefaultMicrosoftLogLevel',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html#a2ed7c15d2389baf4cb4aea475a33ee43',1,'Tgstation::Server::Host::Configuration::FileLoggingConfiguration']]], + ['defaultminimumpasswordlength',['DefaultMinimumPasswordLength',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html#a2f4d695a6363f6d92a8adb8f7860e809',1,'Tgstation::Server::Host::Configuration::GeneralConfiguration']]], + ['defaultrestarttimeout',['DefaultRestartTimeout',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html#ae39a7785775edb052a36047300b8ec6b',1,'Tgstation::Server::Host::Configuration::GeneralConfiguration']]], + ['defaultupdatepackageassetname',['DefaultUpdatePackageAssetName',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html#a2414ab0c1cbd67d474c6484d065ec90a',1,'Tgstation::Server::Host::Configuration::UpdatesConfiguration']]], + ['devjson',['DevJson',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_design_time_db_context_factory_helpers.html#a32170f36db0a402620aa92f645fe5c45',1,'Tgstation::Server::Host::Models::Migrations::DesignTimeDbContextFactoryHelpers']]], + ['disconnecting',['disconnecting',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a86767ec9cfd43611d9d5e00cad58197e',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]], + ['disposed',['disposed',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a6ba869dae354db235f8518f7283a531c',1,'Tgstation.Server.Host.Components.InstanceManager.disposed()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#a46d77cba8bfc8b6d13c19e72cb3b5078',1,'Tgstation.Server.Host.Components.Interop.CommContext.disposed()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#ac332e36882ad48a5bb7c78cb2b855613',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.disposed()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a7af2a032fc9db77dbc4df931c3617df1',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.disposed()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html#aa3af81c7e35c2832f0f932a346a98d8a',1,'Tgstation.Server.Host.Core.SemaphoreSlimContext.disposed()']]], + ['dmbavailable',['DmbAvailable',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a1d5d557eb411705dd02240b69c74a59e',1,'Tgstation::Server::Host::Components::Compiler::DmbFactory']]], + ['dmbextension',['DmbExtension',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#ad9af96ad4344bc2e662209a741879f5f',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['dmbfactory',['dmbFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a4c3746b0143784d232119fdb418263ba',1,'Tgstation.Server.Host.Components.Instance.dmbFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html#ab0896e8ad879c9c2e2f787f4375fd77d',1,'Tgstation.Server.Host.Components.ReattachInfoHandler.dmbFactory()']]], + ['dmbname',['DmbName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#a477f78136e0e3bd185543c3279b193ef',1,'Tgstation::Server::Host::Components::Compiler::DmbProvider']]], + ['dmcommandapivalidate',['DMCommandApiValidate',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a492cb9c5c1139f76d46438277d66378a',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmcommandchat',['DMCommandChat',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a0d3f04c1d36e7157c7facc7717606848',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmcommandendprocess',['DMCommandEndProcess',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a2a7dfa12298ad3e1dea02fbd1cede501',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmcommandnewport',['DMCommandNewPort',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#acbd267ece34cba8bdcfb533a0cc92d44',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmcommandserverprimed',['DMCommandServerPrimed',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a7b1e719867f307e4399a6d24bb0d454b',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmcommandworldreboot',['DMCommandWorldReboot',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#ab2d2b53ca45e60c6cd0f719913bd2791',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmeextension',['DmeExtension',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#aaab8de158fb3cb8e6de1b56736fbadc6',1,'Tgstation::Server::Host::Components::Compiler::DreamMaker']]], + ['dminteropaccessidentifier',['DMInteropAccessIdentifier',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a4f0d734fb08f796526da3d3b2747d0a0',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmparametercommand',['DMParameterCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#aa8a8b0676aefae55757c6afd811f3dc3',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmparameterdata',['DMParameterData',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a8e19e0554d9dcfddb46110ced36da22e',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmparamhostversion',['DMParamHostVersion',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#af139bef52e1ab852ab1c6531538308ad',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmparaminfojson',['DMParamInfoJson',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#aeb1132f64b0adb08029040ac427df4f7',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmresponsesuccess',['DMResponseSuccess',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a016c03536b104f1d147392cd60670d07',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmtopicchangeport',['DMTopicChangePort',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a1741f4781314f7173dca820ccd100e38',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmtopicchangereboot',['DMTopicChangeReboot',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a23dd73bc4fc4d9711f6877fc2ec29ef6',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmtopicchatcommand',['DMTopicChatCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#ae21e91d11e6e623bbbdc9a2cd7500083',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmtopicevent',['DMTopicEvent',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a4e512e97be9a5ef91c921d30662a29c3',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['dmtopicinteropresponse',['DMTopicInteropResponse',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#aca3a447a172e5e80d21701dc80da0f4a',1,'Tgstation::Server::Host::Components::Interop::Constants']]], + ['downgradeversion',['downgradeVersion',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a909262eddcaca553541c052dbf98b325',1,'Tgstation::Server::Host::Components::InstanceManager']]], + ['dreamdaemon',['DreamDaemon',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a42831355d8d0cd578680f7f8f3f1124a',1,'Tgstation::Server::Api::Routes']]], + ['dreamdaemonexecutablename',['DreamDaemonExecutableName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#a0e3bcbe1b14ed825ea567a6f859884f7',1,'Tgstation::Server::Host::Components::Byond::PosixByondInstaller']]], + ['dreamdaemonname',['DreamDaemonName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#a34eca6f24e5a1960b5b8b892ae3372b9',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DreamDaemonName()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#ae567a962061a2b40662d32aad8462724',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.DreamDaemonName()']]], + ['dreammaker',['dreamMaker',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a164263b206a0a3a81ba7fb96b16e4846',1,'Tgstation.Server.Host.Components.Instance.dreamMaker()'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#acc5a1421208a8e29080110f54b364ba8',1,'Tgstation.Server.Api.Routes.DreamMaker()']]], + ['dreammakerexecutablename',['DreamMakerExecutableName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#a1563b9bcd5a68d5d2528475956e7d9e8',1,'Tgstation::Server::Host::Components::Byond::PosixByondInstaller']]], + ['dreammakername',['DreamMakerName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#ac5887915176212ab4ca1902f7750314a',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DreamMakerName()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#aaba69fd950bfdaa2fcdf218075ccc9fa',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.DreamMakerName()']]] +]; diff --git a/search/variables_4.html b/search/variables_4.html new file mode 100644 index 0000000000..39883bd605 --- /dev/null +++ b/search/variables_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_4.js b/search/variables_4.js new file mode 100644 index 0000000000..f4a0f2e036 --- /dev/null +++ b/search/variables_4.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['errorstringbuilder',['errorStringBuilder',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#aed074d21bc6397bdcf9b0e18caaa5bca',1,'Tgstation::Server::Host::Core::Process']]], + ['eventconsumer',['eventConsumer',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a089219b6d371df8777befb66d5ca9ff7',1,'Tgstation.Server.Host.Components.Byond.ByondManager.eventConsumer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a8d26e10bd830ba3cca93599e0ac2b22b',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.eventConsumer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a16093d1600746a3ab9c232461c5d7da6',1,'Tgstation.Server.Host.Components.Instance.eventConsumer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#aeee0875d15975270e6f16417f78423a6',1,'Tgstation.Server.Host.Components.Repository.Repository.eventConsumer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#ad06470fddc597f80d4cef6b96c30b3e0',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.eventConsumer()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a5768c37124d54e80c66dc63d28d0dea4',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.eventConsumer()']]], + ['eventscriptssubdirectory',['EventScriptsSubdirectory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#af5dbdc7fa9d0999905d214a98c4604ee',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]], + ['eventtypescriptfilenamemap',['EventTypeScriptFileNameMap',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a595152ecd2fd978f124506abce9250b3',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]] +]; diff --git a/search/variables_5.html b/search/variables_5.html new file mode 100644 index 0000000000..f25879c02b --- /dev/null +++ b/search/variables_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_5.js b/search/variables_5.js new file mode 100644 index 0000000000..d0237ea765 --- /dev/null +++ b/search/variables_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['file',['File',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a6e67fe387a01c4d8e686734ad936f8b0',1,'Tgstation::Server::Api::Routes']]], + ['filesystemwatcher',['fileSystemWatcher',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#aeefa70f3fd0bc957bb192aee1aff0a68',1,'Tgstation::Server::Host::Components::Interop::CommContext']]] +]; diff --git a/search/variables_6.html b/search/variables_6.html new file mode 100644 index 0000000000..0fcd6c2f8a --- /dev/null +++ b/search/variables_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_6.js b/search/variables_6.js new file mode 100644 index 0000000000..6b3e9cdc1b --- /dev/null +++ b/search/variables_6.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['gamestaticfilessubdirectory',['GameStaticFilesSubdirectory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#ae8e07adce00ed418cb29954182699623',1,'Tgstation::Server::Host::Components::StaticFiles::Configuration']]], + ['generalconfiguration',['generalConfiguration',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#aab3385abba108359f03c60b1885f48af',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.generalConfiguration()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#adb0b189a10ec43510b9f10cff91106fd',1,'Tgstation.Server.Host.Controllers.AdministrationController.generalConfiguration()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#abe159da9c5fbc8eba3c3feff488988a0',1,'Tgstation.Server.Host.Controllers.RepositoryController.generalConfiguration()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#a79e1198432e7e557c8d72b3adf71bbf1',1,'Tgstation.Server.Host.Controllers.UserController.generalConfiguration()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#aff15cc6f241427b983f4f183d0d33dc7',1,'Tgstation.Server.Host.Core.SetupWizard.generalConfiguration()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a2823acb68609f9953788b1460ca8cdd3',1,'Tgstation.Server.Host.Server.generalConfiguration()']]], + ['githubclientfactory',['gitHubClientFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#ab75fda1677febc0778388f201fb737ef',1,'Tgstation.Server.Host.Components.Instance.gitHubClientFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#af9e2105dfde05caa1e5a14f8c3141591',1,'Tgstation.Server.Host.Components.InstanceFactory.gitHubClientFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#a40d72314455caeb1d6b72fa047ea18a4',1,'Tgstation.Server.Host.Controllers.AdministrationController.gitHubClientFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#a646263811f3cf4b618c569685a15c90c',1,'Tgstation.Server.Host.Controllers.RepositoryController.gitHubClientFactory()']]], + ['githuburl',['GitHubUrl',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a5a72e4dafe281ae05f52e1dbcf37ab71',1,'Tgstation::Server::Host::Components::Repository::Repository']]] +]; diff --git a/search/variables_7.html b/search/variables_7.html new file mode 100644 index 0000000000..ad2fa37a5d --- /dev/null +++ b/search/variables_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_7.js b/search/variables_7.js new file mode 100644 index 0000000000..12c10f0b76 --- /dev/null +++ b/search/variables_7.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['handle',['handle',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a2ed64dec0fe411dab814e5b9f354b027',1,'Tgstation::Server::Host::Core::Process']]], + ['handler',['handler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_custom_command.html#a429c52adf7d0b06ee91bb7b1e77cfe35',1,'Tgstation.Server.Host.Components.Chat.Commands.CustomCommand.handler()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#ad8938bc8d2930683555a78c62586faad',1,'Tgstation.Server.Host.Components.Interop.CommContext.handler()']]], + ['handlercts',['handlerCts',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a5bafce0bc712b2631d88b9a87f074b9c',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['head',['Head',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a40437fe926da0b9e03785da0199a8597',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['headers',['headers',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a48f8ea0a4dd7ac665735d1728899ebad',1,'Tgstation::Server::Client::ApiClient']]], + ['helptext',['HelpText',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html#a35351daa1c342c9086ddbfa0cb131029',1,'Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.HelpText()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command.html#afeb9ac3dc4a7e73136babeaa6a2d1782',1,'Tgstation.Server.Host.Components.Chat.Commands.KekCommand.HelpText()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#a5f22a8e068839fa971b715b0bf0abed4',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.HelpText()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html#a7d761098bd18586c0c0098d4d80574e4',1,'Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.HelpText()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.html#ad800f97aca131465993222123307bd59',1,'Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.HelpText()']]], + ['hostingenvironment',['hostingEnvironment',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html#a74ea7b1dceba49fc08fa7793e35c6d2e',1,'Tgstation.Server.Host.Core.Application.hostingEnvironment()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#af5f22b3e5970434ac04c8ae5024fd0cd',1,'Tgstation.Server.Host.Core.SetupWizard.hostingEnvironment()']]], + ['httpclient',['httpClient',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a22bc1751fcba63704d2d07a83fa5a857',1,'Tgstation.Server.Client.ApiClient.httpClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_http_client.html#aba5a7cd3aaf62acbe8078cdb7d7da8e9',1,'Tgstation.Server.Client.HttpClient.httpClient()']]] +]; diff --git a/search/variables_8.html b/search/variables_8.html new file mode 100644 index 0000000000..23887d77b9 --- /dev/null +++ b/search/variables_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_8.js b/search/variables_8.js new file mode 100644 index 0000000000..d5d5859ae2 --- /dev/null +++ b/search/variables_8.js @@ -0,0 +1,23 @@ +var searchData= +[ + ['identity',['identity',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html#a4e5cb06d84c679a3a2d2fbfdd60e1335',1,'Tgstation::Server::Host::Security::WindowsSystemIdentity']]], + ['identitycache',['identityCache',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#a75b914d5a6ea3a3ef3eaa2ab87b61859',1,'Tgstation.Server.Host.Controllers.HomeController.identityCache()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html#a94c0a91ac1bdb6d25c9546a583fb44e3',1,'Tgstation.Server.Host.Security.AuthenticationContextFactory.identityCache()']]], + ['initialchatbots',['initialChatBots',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a15ead9515d14fbfa0ae40c98b93312cc',1,'Tgstation::Server::Host::Components::Chat::Chat']]], + ['installeddirectx',['installedDirectX',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a4aaf9bd89e5ad031016e64a3b3cbd3bb',1,'Tgstation::Server::Host::Components::Byond::WindowsByondInstaller']]], + ['installedversions',['installedVersions',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a0811c130dd3533e163b38d32a17a8394',1,'Tgstation::Server::Host::Components::Byond::ByondManager']]], + ['instance',['instance',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html#a96b47c77cfbbad1f762003260953c840',1,'Tgstation.Server.Client.Components.ByondClient.instance()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#af082b31182c4ecdcbe3b9c0a81bf9ead',1,'Tgstation.Server.Client.Components.ChatBotsClient.instance()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_configuration_client.html#a3fbe930ee9bc4cf37d734c4ccc50668c',1,'Tgstation.Server.Client.Components.ConfigurationClient.instance()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#afaaf929e746f11a67fd7eb5818bcd7e9',1,'Tgstation.Server.Client.Components.DreamDaemonClient.instance()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#a8c4ace450e5976c24b3982749de5ccff',1,'Tgstation.Server.Client.Components.DreamMakerClient.instance()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#aaea798aa626ad6d51d036f65c53ea47f',1,'Tgstation.Server.Client.Components.InstanceUserClient.instance()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html#ab7fc36983aad5fd506a83687b70c77ff',1,'Tgstation.Server.Client.Components.JobsClient.instance()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#a3af323ae0b97782b3917673b8d239af8',1,'Tgstation.Server.Client.Components.RepositoryClient.instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#a23c8b9d8f35c1bf902d5ac22c4260bed',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#a441cefe121e0cc6469c9a800b734a231',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html#a06399db6f3586d38d77c451206714286',1,'Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a0b11c2951d19f22c7369278887b55993',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#ab20185d87e27d0d2886245e9e1b79b95',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.instance()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a0e561e3f3b557e57569f7110cb8edc8c',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.instance()'],['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_configuration_test.html#a686e4c4d48527bb36ad425503a4a0326',1,'Tgstation.Server.Tests.Instance.ConfigurationTest.instance()']]], + ['instanceattachfilename',['InstanceAttachFileName',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#aa40d55750e2193d714eb1470505c47ee',1,'Tgstation::Server::Host::Controllers::InstanceController']]], + ['instanceclient',['instanceClient',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_instance_test.html#a26ebd19908ad9cd8f3dea0fe5bab8d93',1,'Tgstation::Server::Tests::Instance::InstanceTest']]], + ['instancefactory',['instanceFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#ae2b48b5197337f7a311fd115951be7f6',1,'Tgstation::Server::Host::Components::InstanceManager']]], + ['instanceidheader',['InstanceIdHeader',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a28f94492eb21542e63675a53d871e3ef',1,'Tgstation::Server::Api::ApiHeaders']]], + ['instancemanager',['InstanceManager',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a17bfc22b8cbc4624a6ec180aeba91da8',1,'Tgstation.Server.Api.Routes.InstanceManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html#afb94a5c7ed6a392822c4d32b17e8ce20',1,'Tgstation.Server.Host.Controllers.ByondController.instanceManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html#a1e37d0da176e8693608a4719c05e57f9',1,'Tgstation.Server.Host.Controllers.ChatController.instanceManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#a0b158757381e0c695ba632319a14e873',1,'Tgstation.Server.Host.Controllers.ConfigurationController.instanceManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#ad259fbe273d7c5396d766da41023f6f9',1,'Tgstation.Server.Host.Controllers.DreamDaemonController.instanceManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html#aa45b1a91e46ea9a7983b8edf0a1c1cd6',1,'Tgstation.Server.Host.Controllers.DreamMakerController.instanceManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#ad177b6d13a08c429c49b7e4294387d3c',1,'Tgstation.Server.Host.Controllers.InstanceController.instanceManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#a2f7404efa7a9821510b3146bfd99cc6c',1,'Tgstation.Server.Host.Controllers.RepositoryController.instanceManager()']]], + ['instancemanagerclient',['instanceManagerClient',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_manager_test.html#a11690ee922cfd99c42e8770450a47a78',1,'Tgstation::Server::Tests::InstanceManagerTest']]], + ['instances',['instances',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#acc8f4c159357a11b0e67ea25d96b26e0',1,'Tgstation::Server::Host::Components::InstanceManager']]], + ['instanceuser',['InstanceUser',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#ac215c662b5627fe87122f575d006c95f',1,'Tgstation::Server::Api::Routes']]], + ['interopcontext',['interopContext',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a4160b532077797930fdaa1bb02a41eb2',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['inuse',['InUse',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#a8603cad6d9df4a2079d3249becd0bbbb',1,'Tgstation::Server::Host::Components::Repository::RepositoryManager']]], + ['iomanager',['ioManager',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a3cbd5eecf146607f81c6e71bd9a2ebd6',1,'Tgstation.Server.Host.Components.Byond.ByondManager.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#abb34374e2d928177cdb6de25aa4389c9',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#acab07b13972ce055a25dc21dbd974e33',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#aebe2034cf597be2a63fad5808f3eb566',1,'Tgstation.Server.Host.Components.Chat.Chat.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#a040509c76b1f575c85f7effafa8c2719',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a055f0fa0e9b35595d79a5bd090a6fac9',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#ab4707fd2e4ad2f4cecb8f7f218c4c72e',1,'Tgstation.Server.Host.Components.Compiler.DmbProvider.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a0d4eefde54eac8edf70c40222fbd3830',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a493988c0490c85b95850f7bc2a5acfab',1,'Tgstation.Server.Host.Components.InstanceFactory.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a59bc4b977f9b72208d553fbfa57f118e',1,'Tgstation.Server.Host.Components.InstanceManager.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#a87097237d659f917755dfeabef4e245f',1,'Tgstation.Server.Host.Components.Interop.CommContext.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#aa62f89a29abc7febb886a1e7216067a2',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#afd5e0aef7c9a1023bc8a6cebe483c4c3',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#a96a3da163e28fb1b8a09425c06358779',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#ac2d19cdcca5ed40c3f6f2123f426e655',1,'Tgstation.Server.Host.Controllers.AdministrationController.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#a564df332546a6fcee923d3e2cab2fac6',1,'Tgstation.Server.Host.Controllers.ConfigurationController.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#afb2e4e54c38a97b299d1fb7692cc5cdd',1,'Tgstation.Server.Host.Controllers.InstanceController.ioManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a40fb9aa91866cd3d9c1f2aa3feccaecc',1,'Tgstation.Server.Host.Core.SetupWizard.ioManager()']]], + ['iomananger',['ioMananger',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a01a4beb2cee07561f7749668939ab88e',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['isprimary',['IsPrimary',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a41936b7d9cba1ed471a67ef71b832e62',1,'Tgstation::Server::Host::Components::Watchdog::DeadSessionController']]], + ['istokenauthentication',['IsTokenAuthentication',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a30222f85d684f2a9c9861a8638b6a31f',1,'Tgstation::Server::Api::ApiHeaders']]] +]; diff --git a/search/variables_9.html b/search/variables_9.html new file mode 100644 index 0000000000..f44664990b --- /dev/null +++ b/search/variables_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_9.js b/search/variables_9.js new file mode 100644 index 0000000000..569838932b --- /dev/null +++ b/search/variables_9.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['joblockcounts',['jobLockCounts',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a59711d360b347c55e94405a9380d0201',1,'Tgstation::Server::Host::Components::Compiler::DmbFactory']]], + ['jobmanager',['jobManager',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a8442698876a3b1aab29cb968cd97203e',1,'Tgstation.Server.Host.Components.Instance.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a6913b05824f8ac83a8b5d87386ca96aa',1,'Tgstation.Server.Host.Components.InstanceFactory.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a26d85ac963bb5258ff0ff1041fce7fa3',1,'Tgstation.Server.Host.Components.InstanceManager.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a1688863ddcd7d0bbfa3ec13b7b015319',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogBase.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#a9cf783832be989be4ccc542d0b738710',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html#a8e1ba9fcd8b44116da4230580c5cdbca',1,'Tgstation.Server.Host.Controllers.ByondController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#ace2a566cc7ff09b10c0bbf448aaeae69',1,'Tgstation.Server.Host.Controllers.DreamDaemonController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html#ae195b225516fe09da8661438fb1dc03f',1,'Tgstation.Server.Host.Controllers.DreamMakerController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a38f7f9669773242d177345e38be2dd34',1,'Tgstation.Server.Host.Controllers.InstanceController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html#a6386df07802db9cdbf34ffe40b031921',1,'Tgstation.Server.Host.Controllers.JobController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#ad15c0217bf9e5ce926a198191d0a04c4',1,'Tgstation.Server.Host.Controllers.RepositoryController.jobManager()']]], + ['jobs',['jobs',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a8a9c1a9f80ee10d57d0bb37c7dcaf546',1,'Tgstation.Server.Host.Core.JobManager.jobs()'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a85c563262244bd21fe1bfa1ce5de6a1d',1,'Tgstation.Server.Api.Routes.Jobs()']]], + ['jobsclient',['jobsClient',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html#a19f34ff37dc6b3f9a83533602d914a70',1,'Tgstation::Server::Tests::Instance::ByondTest']]], + ['jwtauthenticationscheme',['JwtAuthenticationScheme',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a3d49a18342b81d0427f09e51c29544c2',1,'Tgstation::Server::Api::ApiHeaders']]] +]; diff --git a/search/variables_a.html b/search/variables_a.html new file mode 100644 index 0000000000..59633b3576 --- /dev/null +++ b/search/variables_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_a.js b/search/variables_a.js new file mode 100644 index 0000000000..8c103994c2 --- /dev/null +++ b/search/variables_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['kek',['Kek',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command.html#a341a9da46f3d06a03bba883d149ff8f3',1,'Tgstation::Server::Host::Components::Chat::Commands::KekCommand']]] +]; diff --git a/search/variables_b.html b/search/variables_b.html new file mode 100644 index 0000000000..17216090f2 --- /dev/null +++ b/search/variables_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_b.js b/search/variables_b.js new file mode 100644 index 0000000000..8f93c4999f --- /dev/null +++ b/search/variables_b.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['launchsecuritylevel',['launchSecurityLevel',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a06664796f61019c512c5588a59fb227c',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['lifetime',['Lifetime',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a422b1bae1daaf01d446fcdb437518656',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['listentask',['listenTask',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a4973331fd7986b7f14ec00426b474253',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]], + ['lockedsemaphore',['lockedSemaphore',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html#ada2fac68aaa78fbd25c0cb1337925f00',1,'Tgstation::Server::Host::Core::SemaphoreSlimContext']]], + ['logger',['logger',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a25f231d9dcbd28c75f9665fb7f0b5e80',1,'Tgstation.Server.Host.Components.Byond.ByondManager.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#acc36317dcbca8c0270c3268e6baa97ce',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a840e56bd491d1ccc2137a6672158f813',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a77069300c653d422a86fbf24424b5354',1,'Tgstation.Server.Host.Components.Chat.Chat.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#a68ad649d2610bcca56d5cb810b889594',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#a8423dac685aea12cdce24d5743a2554f',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a7f84b758cc7548eee2e01b86d8944721',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a4406ae1b1c13c74410a4587287015405',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a1ac7c72870daea9b8fcd6b700dc19573',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#ab4e452661f1c4a25ad903315e42e023e',1,'Tgstation.Server.Host.Components.Instance.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a968fedca8d4cc5ff16c77c0cbc782bda',1,'Tgstation.Server.Host.Components.InstanceManager.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#a9896d4d9823b5c5fe8454faaebe05727',1,'Tgstation.Server.Host.Components.Interop.CommContext.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html#ab7edf14c652d29baf9cd01eaa8580bac',1,'Tgstation.Server.Host.Components.ReattachInfoHandler.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider.html#afb01908cc420ca848e289cd9f3b2a9f8',1,'Tgstation.Server.Host.Components.Repository.CredentialsProvider.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#aaaf20e963c78e114158f07652efc7986',1,'Tgstation.Server.Host.Components.Repository.Repository.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#ab48210b91ab8add64013a209d4223070',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#ab3c240ff7f92402a96f36d29f6ede284',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a807538e13ba482e904ffe0289f1a45a0',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#aa2d55f04b784aa065ea29038fbe50936',1,'Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#aa5a69729c97d0a6eefe433fa956ce556',1,'Tgstation.Server.Host.Controllers.UserController.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#af83d95abda82865799d652b73909612e',1,'Tgstation.Server.Host.Core.JobManager.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a6441bc215e4fa67e76cf1a97bda66cb1',1,'Tgstation.Server.Host.Core.Process.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html#af70a41847bfc5c6210618ee35a8df429',1,'Tgstation.Server.Host.Core.ProcessExecutor.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a3ac53d10c0c2b3ddd10d474bb0d64f8b',1,'Tgstation.Server.Host.Core.SetupWizard.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html#a382d063e7f62559b994c5639504737b6',1,'Tgstation.Server.Host.Security.IdentityCache.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.html#a384470b6fd596dcc97a6e39a0dcdbe74',1,'Tgstation.Server.Host.Security.WindowsSystemIdentityFactory.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#aed53aa0f4276d05a985604f291c70f29',1,'Tgstation.Server.Host.Server.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html#a247d89dab45478183870bbdac843dbde',1,'Tgstation.Server.Host.Watchdog.Watchdog.logger()']]], + ['loggerfactory',['loggerFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a145c7ddb0aef295db2a26fa302a0907d',1,'Tgstation.Server.Host.Components.Chat.Chat.loggerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html#ae7a8fc22bc98072deb02ac6801de37d5',1,'Tgstation.Server.Host.Components.Chat.ChatFactory.loggerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html#a8d321b369f849147a5713738bc16c713',1,'Tgstation.Server.Host.Components.Chat.ProviderFactory.loggerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#afe93210d51c3cd078d16a4b510c3ebe8',1,'Tgstation.Server.Host.Components.InstanceFactory.loggerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#aea415938b2e88e3b63478a46faec41d2',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.loggerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#a31fb20da622d47726730ae6249bb3f20',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.loggerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html#af64b0c00b2fa5e14e6a0c05cd52564f6',1,'Tgstation.Server.Host.Core.ProcessExecutor.loggerFactory()']]] +]; diff --git a/search/variables_c.html b/search/variables_c.html new file mode 100644 index 0000000000..78e211ac15 --- /dev/null +++ b/search/variables_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_c.js b/search/variables_c.js new file mode 100644 index 0000000000..9f8ac8fc13 --- /dev/null +++ b/search/variables_c.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['mappedchannels',['mappedChannels',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ab79b64792d737c21c44e332534fde2c2',1,'Tgstation.Server.Host.Components.Chat.Chat.mappedChannels()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#a044ae95d278a4ed4a6a02449e24e8146',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.mappedChannels()']]], + ['messagequeue',['messageQueue',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#a0cf9e8f2427fc076d90805ef6ee06a66',1,'Tgstation::Server::Host::Components::Chat::Providers::Provider']]], + ['metadata',['metadata',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#ad54344c590beab965fead49ac08224a9',1,'Tgstation.Server.Host.Components.Instance.metadata()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html#aa3e886486d0a0ff9dd9b963c35ec95f4',1,'Tgstation.Server.Host.Components.ReattachInfoHandler.metadata()']]], + ['monitorcts',['monitorCts',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#a47a5f64148a117c561df7b0e7e1703e6',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['monitortask',['monitorTask',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html#abfb7590db69ab59a040c1ac91c671d6d',1,'Tgstation::Server::Host::Components::Watchdog::WatchdogBase']]], + ['moveinstancejobprefix',['MoveInstanceJobPrefix',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a05f43b931e38b2d401566435d5a3de75',1,'Tgstation::Server::Host::Controllers::InstanceController']]] +]; diff --git a/search/variables_d.html b/search/variables_d.html new file mode 100644 index 0000000000..bd27a70be4 --- /dev/null +++ b/search/variables_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_d.js b/search/variables_d.js new file mode 100644 index 0000000000..e1f7eee25f --- /dev/null +++ b/search/variables_d.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['name',['Name',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html#aa3c25add23e8a5463468700cb5d3f8fe',1,'Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.Name()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_kek_command.html#a310057ff5025763b3a208631f9f76daf',1,'Tgstation.Server.Host.Components.Chat.Commands.KekCommand.Name()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#a161ed3eee61c1cdb62fc5de7ba6e54b5',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.Name()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html#a12e4e89bc06dc6f44f953760a3bcf800',1,'Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.Name()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_version_command.html#a5c8f4bdfbf9054761790392222009914',1,'Tgstation.Server.Host.Components.Chat.Commands.VersionCommand.Name()'],['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a82a1c35bb13819cd1003592351251fc1',1,'Tgstation.Server.Host.Service.ServerService.Name()']]], + ['networkpromptreaper',['networkPromptReaper',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#af4c3eca3b6ba03440f6f2397eeb2ccc3',1,'Tgstation.Server.Host.Components.InstanceFactory.networkPromptReaper()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#ad76b184848b0394fc53ab0299f87c213',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.networkPromptReaper()']]], + ['newerdmbtcs',['newerDmbTcs',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#ae0b92673c1c6c9d1c56c33c5b7e242ee',1,'Tgstation::Server::Host::Components::Compiler::DmbFactory']]], + ['nextdmbprovider',['nextDmbProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a26908afd23a086c22146b663c64d6526',1,'Tgstation::Server::Host::Components::Compiler::DmbFactory']]], + ['nextmessage',['nextMessage',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html#ac27feec8aca499fa963dd6f6b557b818',1,'Tgstation::Server::Host::Components::Chat::Providers::Provider']]], + ['nextport',['nextPort',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#abb3e44b6490e277be6295ba31d1bd0c5',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['nickname',['nickname',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a75457eda73c1935c8784dc7fadf9e0ba',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]] +]; diff --git a/search/variables_e.html b/search/variables_e.html new file mode 100644 index 0000000000..f2130e01ba --- /dev/null +++ b/search/variables_e.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_e.js b/search/variables_e.js new file mode 100644 index 0000000000..e4938ec34a --- /dev/null +++ b/search/variables_e.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['octokitexception',['OctokitException',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#aae91f209dda2b1d6a356a3cc3700750e',1,'Tgstation::Server::Host::Controllers::AdministrationController']]], + ['ondispose',['onDispose',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#a922e38ea308976fd36f9f6d7e73ece41',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext.onDispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#a5335130518633dacf3bc1c9da0608bb9',1,'Tgstation.Server.Host.Components.Compiler.DmbProvider.onDispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#af2a69a0a07eff91257bace7640a3df8e',1,'Tgstation.Server.Host.Components.Repository.Repository.onDispose()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration.html#a7db0cb09e48b12745868127e77dba1d0',1,'Tgstation.Server.Host.Core.RestartRegistration.onDispose()']]], + ['onreboot',['OnReboot',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#ac4495210a6e09f9232428329fb1e3839',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['origin',['Origin',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a4885e47a21a11d7fdf1f2071f7cfbb0a',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['origintrackingerrortemplate',['OriginTrackingErrorTemplate',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a160b164a1b668c2951ac4cff5db5205b',1,'Tgstation::Server::Host::Components::Repository::Repository']]], + ['outputstringbuilder',['outputStringBuilder',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#af8517923bfe227ca085cb98d821565e8',1,'Tgstation::Server::Host::Core::Process']]] +]; diff --git a/search/variables_f.html b/search/variables_f.html new file mode 100644 index 0000000000..d660697696 --- /dev/null +++ b/search/variables_f.html @@ -0,0 +1,30 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/search/variables_f.js b/search/variables_f.js new file mode 100644 index 0000000000..b954dc5da9 --- /dev/null +++ b/search/variables_f.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['password',['password',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a0af57fc7dec5c5f69ae6ba15756031a7',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]], + ['passwordauthenticationscheme',['PasswordAuthenticationScheme',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#ab5d031ce8e7fba2e1575dde74ba9647a',1,'Tgstation::Server::Api::ApiHeaders']]], + ['passwordhasher',['passwordHasher',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_cryptography_suite.html#ad519d6aa46f39a52f9a7b50e0f181fd9',1,'Tgstation::Server::Host::Security::CryptographySuite']]], + ['passwordtype',['passwordType',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a6d496510a7558d62c26d917a51226264',1,'Tgstation::Server::Host::Components::Chat::Providers::IrcProvider']]], + ['platformidentifier',['platformIdentifier',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a3c8f7e67bf286c73dd25994db7ed31a5',1,'Tgstation.Server.Host.Components.InstanceFactory.platformIdentifier()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a9103478c93c69deb31f3549ab04dcc84',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.platformIdentifier()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#a3aa705877f0afe4663cd60c18f790c39',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.platformIdentifier()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#aab5c882433d208418174394df71cfab4',1,'Tgstation.Server.Host.Controllers.AdministrationController.platformIdentifier()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#ac62c0b1b0e346409b20c3054d4a8354a',1,'Tgstation.Server.Host.Controllers.InstanceController.platformIdentifier()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a44d43e1c3e25f89c2e5e50367ee7b00a',1,'Tgstation.Server.Host.Core.SetupWizard.platformIdentifier()']]], + ['port',['Port',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_dead_session_controller.html#a288cb8d3a65cb19797718371c8a488ed',1,'Tgstation.Server.Host.Components.Watchdog.DeadSessionController.Port()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a0a16e9a0617d8e75740478a5d68a4420',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.port()']]], + ['portassignmenttcs',['portAssignmentTcs',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a7a37884acc006ceafba6cb4e8b7711a2',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['portclosedforreboot',['portClosedForReboot',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#af0c3b4329beff8ac1d48abad08567378',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['postwritehandler',['postWriteHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#abaa57b4cd2fdf1ea15b08b81ccd88023',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.postWriteHandler()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#aca83a69059579020791c6d62721c08fd',1,'Tgstation.Server.Host.Components.InstanceFactory.postWriteHandler()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a9070bfae5692e48611c410eeef52c7af',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.postWriteHandler()']]], + ['primarydirectory',['PrimaryDirectory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#a2a2e015f0196f86632485bd3dd94bd4e',1,'Tgstation::Server::Host::Components::Compiler::DmbProvider']]], + ['process',['process',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#ad5dd4ef0f1bda6f26c3fe9a93223204f',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], + ['processexecutor',['processExecutor',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a9ddafa8d405709ae20f157c9041b4b01',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.processExecutor()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#ad98d6b773ab4ecc0f65b308c707fc4c2',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.processExecutor()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a5fdcd121985cce7d20f2d61e0ea5eca4',1,'Tgstation.Server.Host.Components.InstanceFactory.processExecutor()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a0eb31611253abc0c887ec46f1e9b8611',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.processExecutor()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#aba8d97c1aedc6bedb85b47b68d652677',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.processExecutor()']]], + ['productheadervalue',['productHeaderValue',['../class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.html#a5db19a315f04b37200db2761f678661b',1,'Tgstation.Server.Client.ServerClientFactory.productHeaderValue()'],['../class_tgstation_1_1_server_1_1_api_1_1_tests_1_1_test_api_headers.html#a380531ccea4ef4d6191490bc6d513ee0',1,'Tgstation.Server.Api.Tests.TestApiHeaders.productHeaderValue()']]], + ['propagatedexception',['propagatedException',['../class_tgstation_1_1_server_1_1_host_1_1_server.html#a6541983f401f2c25c474573a2d28235c',1,'Tgstation::Server::Host::Server']]], + ['providerfactory',['providerFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ab0fc5acc521bee160dffaf45bdb9afe5',1,'Tgstation.Server.Host.Components.Chat.Chat.providerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html#a524251049a9a7f960681e4f1e6c68b97',1,'Tgstation.Server.Host.Components.Chat.ChatFactory.providerFactory()']]], + ['providers',['providers',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a01b888e7f83c86acb162c6107c662876',1,'Tgstation::Server::Host::Components::Chat::Chat']]] +]; diff --git a/splitbar.png b/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/src_2_tgstation_8_server_8_host_2_program_8cs.html b/src_2_tgstation_8_server_8_host_2_program_8cs.html new file mode 100644 index 0000000000..d7da5ecb4d --- /dev/null +++ b/src_2_tgstation_8_server_8_host_2_program_8cs.html @@ -0,0 +1,103 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Program.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
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
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
+
+ + + + diff --git a/src_2_tgstation_8_server_8_host_2_program_8cs_source.html b/src_2_tgstation_8_server_8_host_2_program_8cs_source.html new file mode 100644 index 0000000000..c15d229a12 --- /dev/null +++ b/src_2_tgstation_8_server_8_host_2_program_8cs_source.html @@ -0,0 +1,90 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host/Program.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
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.IO;
5 using System.Threading;
6 using System.Threading.Tasks;
7 
8 namespace Tgstation.Server.Host
9 {
13  static class Program
14  {
18 #pragma warning disable SA1401 // Fields must be private
19  internal static IServerFactory ServerFactory = new ServerFactory();
20 #pragma warning restore SA1401 // Fields must be private
21 
27  public static async Task<int> Main(string[] args)
28  {
29  var listArgs = new List<string>(args);
30 
31  // first arg is 100% always the update path, starting it otherwise is solely for debugging purposes
32  string updatePath;
33  if (listArgs.Count > 0)
34  {
35  updatePath = listArgs[0];
36  listArgs.RemoveAt(0);
37  if (listArgs.Remove("--attach-debugger"))
38  Debugger.Launch();
39  }
40  else
41  updatePath = null;
42  try
43  {
44  var server = ServerFactory.CreateServer(listArgs.ToArray(), updatePath);
45  try
46  {
47  using (var cts = new CancellationTokenSource())
48  {
49  void AppDomainHandler(object a, EventArgs b) => cts.Cancel();
50  AppDomain.CurrentDomain.ProcessExit += AppDomainHandler;
51  try
52  {
53  Console.CancelKeyPress += (a, b) =>
54  {
55  b.Cancel = true;
56  cts.Cancel();
57  };
58  await server.RunAsync(cts.Token).ConfigureAwait(false);
59  }
60  finally
61  {
62  AppDomain.CurrentDomain.ProcessExit -= AppDomainHandler;
63  }
64  }
65  }
66  catch (OperationCanceledException) { }
67  return server.RestartRequested ? 1 : 0;
68  }
69  catch (Exception e)
70  {
71  if (updatePath != null)
72  {
73  File.WriteAllText(updatePath, e.ToString());
74  return 2;
75  }
76 
77  throw;
78  }
79  }
80  }
81 }
+
Entrypoint for the Process
Definition: Program.cs:13
+ +
Task RunAsync(CancellationToken cancellationToken)
Runs the IServer
+
IServer CreateServer(string[] args, string updatePath)
Create a IServer
+
static async Task< int > Main(string[] args)
Entrypoint for the Program
Definition: Program.cs:27
+ +
static internal IServerFactory ServerFactory
The IServerFactory to use
Definition: Program.cs:19
+
+ + + + diff --git a/src_2_tgstation_8_server_8_host_8_console_2_program_8cs.html b/src_2_tgstation_8_server_8_host_8_console_2_program_8cs.html new file mode 100644 index 0000000000..316a449093 --- /dev/null +++ b/src_2_tgstation_8_server_8_host_8_console_2_program_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Console/Program.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
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
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Console
 
+
+ + + + diff --git a/src_2_tgstation_8_server_8_host_8_console_2_program_8cs_source.html b/src_2_tgstation_8_server_8_host_8_console_2_program_8cs_source.html new file mode 100644 index 0000000000..78f2823255 --- /dev/null +++ b/src_2_tgstation_8_server_8_host_8_console_2_program_8cs_source.html @@ -0,0 +1,94 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Console/Program.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
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 
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
+
static internal async Task Main(string[] args)
Entrypoint for the application
Definition: Program.cs:25
+
static internal IWatchdogFactory WatchdogFactory
The IWatchdogFactory for the Program
Definition: Program.cs:18
+ + +
Task RunAsync(bool runConfigure, string[] args, CancellationToken cancellationToken)
Run the IWatchdog
+ + + + + +
+ + + + diff --git a/src_2_tgstation_8_server_8_host_8_service_2_program_8cs.html b/src_2_tgstation_8_server_8_host_8_service_2_program_8cs.html new file mode 100644 index 0000000000..6a2b0bce57 --- /dev/null +++ b/src_2_tgstation_8_server_8_host_8_service_2_program_8cs.html @@ -0,0 +1,105 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Service/Program.cs File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
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
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Service
 
+
+ + + + diff --git a/src_2_tgstation_8_server_8_host_8_service_2_program_8cs_source.html b/src_2_tgstation_8_server_8_host_8_service_2_program_8cs_source.html new file mode 100644 index 0000000000..7866cb7cc6 --- /dev/null +++ b/src_2_tgstation_8_server_8_host_8_service_2_program_8cs_source.html @@ -0,0 +1,104 @@ + + + + + + + +tgstation-server: src/Tgstation.Server.Host.Service/Program.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
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 
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 (Configure)
114  await WatchdogFactory.CreateWatchdog(loggerFactory).RunAsync(true, Array.Empty<string>(), default).ConfigureAwait(false);
115 
116  if (Install)
117  {
118  if (Uninstall)
119  return; // oh no, it's retarded...
120  using (var processInstaller = new ServiceProcessInstaller())
121  using (var installer = new ServiceInstaller())
122  {
123  processInstaller.Account = ServiceAccount.LocalSystem;
124 
125  installer.Context = new InstallContext("tgs-4-install.log", new string[] { String.Format(CultureInfo.InvariantCulture, "/assemblypath={0}", Assembly.GetEntryAssembly().Location) });
126  installer.Description = "/tg/station 13 server v4 running as a windows service";
127  installer.DisplayName = "/tg/station server 4";
128  installer.DelayedAutoStart = true;
129  installer.StartType = ServiceStartMode.Automatic;
130  installer.ServicesDependedOn = new string[] { "Tcpip", "Dhcp", "Dnscache" };
131  installer.ServiceName = ServerService.Name;
132  installer.Parent = processInstaller;
133 
134  var state = new ListDictionary();
135  installer.Install(state);
136  }
137  }
138  else if (Uninstall)
139  using (var installer = new ServiceInstaller())
140  {
141  installer.Context = new InstallContext("tgs-4-uninstall.log", null);
142  installer.ServiceName = ServerService.Name;
143  installer.Uninstall(null);
144  }
145  else if (!Configure)
146  using (var service = new ServerService(WatchdogFactory, loggerFactory, Trace ? LogLevel.Trace : Debug ? LogLevel.Debug : LogLevel.Information))
147  ServiceBase.Run(service);
148  }
149  }
150  }
151 }
bool Uninstall
The –uninstall or -u option
Definition: Program.cs:34
+
static Task< int > Main(string[] args)
Entrypoint for the application
+
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
+
bool Debug
The –debug or -d option. Enables debug logs
Definition: Program.cs:58
+
static internal IWatchdogFactory WatchdogFactory
The IWatchdogFactory for the Program
Definition: Program.cs:27
+
bool Configure
The –configure or -c option
Definition: Program.cs:46
+ +
IWatchdog CreateWatchdog(ILoggerFactory loggerFactory)
Create a IWatchdog
+ +
Task RunAsync(bool runConfigure, string[] args, CancellationToken cancellationToken)
Run the IWatchdog
+
bool Install
The –install or -i option
Definition: Program.cs:40
+ +
Contains the entrypoint for the application
Definition: Program.cs:21
+
const string Name
The canonical windows service name
+
bool Trace
The –trace or -t option. Enables trace logs
Definition: Program.cs:52
+ +
Represents a IWatchdog as a ServiceBase
+ + + + +
+ + + + diff --git a/sync_off.png b/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/sync_on.png b/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/tab_a.png b/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/tab_b.png b/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/tabs.css b/tabs.css new file mode 100644 index 0000000000..8ea7d54961 --- /dev/null +++ b/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/tgs.ico b/tgs.ico new file mode 100644 index 0000000000000000000000000000000000000000..6ed69fadfcdf8deb049f66dfffc46d5361332feb GIT binary patch literal 123198 zcmeHQ2b>f|_HG1(QxxyiJH1mu&xnDbAQ>bqf<%dugM>v;q9P!>AR-bJ0TGd8IK_aX z2#5hz#f;%jFx}~`r~lK_Logl)QvdI(nVPNX?V0K7shQnbrhdPk?y0V>diCn-SFc{Z zs&<@mPDSUKV;r2TJ0mJMP7lX%PB zX4{+n+bBCg5VM}LHT8#F$viu1R(UX^)tZ+V_Gx?kJFQ0BSK&->jo zecN3mM)kc^4DH@rEW2%nSTJ*<7}B+=xUyR_F|boZaasN9&s zh;pEBOrtZae1USrH3Qp=F@rjaZ~pUd@%5MgC$2(XU7MdHx?WO4^lDQ}4DZoGG&=Lh zFD||4PhcZ@>PM_~5;_BpuAV zX^pCa&+yq^IW>AHEX@4(t~{e7{E={PkDy%f5YL+>p-V z=E)-kcp&&p&(<|hYH`8w%fY7uqx!a$&pfx`(a`hXe+Tl4!vB8$NsR2%Myy_P3+mTF z@EJY}IzDB+pIEa}CVuv*N1~qpcGuTp@hy|Z^;ca1`kRQ4Klqzi|Hx{#3G47_t6G1! zsotp-53=qI&&7SdsrcY;Z^=6F89v+Q!aokh_5S?vgFT;@k@%7H_iim7dtjNEdEGF< zXZURE+9%vhoDAsHKz#c555)5u!}a&z-`K&O#KM~=$@=jbKHI**sTVapr|MSLXKvm# zV$QUy#o)`E2-SY$(0=b|?Kh%VOVQ}8D&T+Bt-#Vnt!kg(bZTA6OsOvHqVc1Fuzh z{sHB#0?vkYYJA42mz;O3ELZ;l9-N#yCsqPKX5n4?>XP%1U5oP8qOM;7Z?n)|l@O;t z;uKbLLOVhJ*Zn|!G1+-^WT0Wa7P(}^v+^9;2hNn$Ko-4qU>EQ3(;Ne%~DG%`I zYs4+*J*Mf<@YHDoJ2$M-&n4g7W!*M&qEiig1AYcVZtMk?iD#K7+f4nhTRjx7{xdCP z*FZjd>x}X4Y~}xX)5kfLaW$}0gY$utop?te_ZkS)N1)9`>pCY&oZmWQoQxaLv4MPd z`n9ho+Fe|Y*xEUuWBv0FM;^>eg_U>Ac0T^_y>h+V);SeqD&JjGW9&nkMb^QqW?m=#R0PIhM>^pVG+pm|qYkr^7X0JG9XQ?-YgR6j@LeZ@SP_Z4kwIpARtbg^iE>Mf@GIRE3>?eG_yaE9TrVTJoxHwF;CmKcd|l zUD2ktYzDN?7+~Pni>j3uQ?KqTAN}vw#q(Er>Svih+MoU5v@!h!^I%@>Ep=EXdjH~P37$j0w4Mw{S$5U&($PDp=L{=`4< zdHYS*iq~Iy4tbm^`OiGNwKz8idR`0Q^9$9+khfCSke7bnFZP{$Z~8z-RPvU2GVd3k z+i)0k)SOToRHB|JmMxee=H-u}o*=G*?xf_y%Uhoo4Iyv5K?ikO)I8n+*6N~8pLT9?hL{YUitorpr<9lSLdmyJ|Ng$rgE9^Mi>G`;-}7nD zoSJnZ`_NA{mhu5I*4elBf93EV-i^Lm>Z3CzUMY3AJLXIkKmG8%WI1uO`H3}R`h+23 z9CRXGK2ygdO_yA7+}-WBS5Sfd~#}4j@qmx*% zXqLEf;!yN6^(EffztsP8C1QR*^Kk1DETivbb)6xXH#ru38wI|vY<}+VUPYVB_m1x) z56V{_MgJ?3=AXdtSHZ89$a~b_E{%_cE~UsWcE0D%xz6j`o-c>GABE?}W6bdbvBd*z z%ew7X{~Mfs#1Fv9_~AWU9<}MQzm!`zYf`cNVnqN)4#o}@(Kk&;-}(*ut98IxE_AS5 z=vwR0R^NaR)6t(*#P}yxHjbDsoV`vpdF*kjI{DC++(*oZwHpOad51@#Q%N4o^PrO_ z$9vV0t~ri~9)*FFB{pip4h{KIQ7Zai2B0 zIkI;fnH=N3Gogn!zj{FX+IY`S2A*m{p3Z~*`n76LwB>(+uZ4ZuU09Q8n3m7*S!Oc4 zXA6^}Wm@2$xUG)*y@B@Jhqm4YJ*E(4eFJPARAs9(Fm(|9`!`I(w0wro0=LyMMm8#c z(#W39a~szl2Hej>zJfBCvY+p9eICFxuc=S+;C1v7O3P=V56pXJ{lkY{JAzh(#NneI z?>NvUocnY|6wQP0oq$Uv}!TNtW(5;&|z-8cBs^+IIf0l z6yJZh8)L}3#ge%RFTlmi=qGaX#|=9E>i(BSSkb=WY0&Q*4u;%{!WH%9+$&niI@dnQk-GVT{re-` z?E4sdQ~xJz>m);mSK^xRY8{l9J()JwO&S|A`>#f2w_^nLanqdE zw87H(d6FNhe8{Vrs_e<6FUxHgjAoEyB$KXBlH9K-C}yH^}McrcQl z7fa{m$?~ro(L+4_#DjADp~`1jEOf%K%VqyKv|F>YATQoiyeEFpmqqf6RemIa$Hmfl z(<0@+ymb@D9+9?XSeKc@=lZL99RvKXQFZ4#NBbDZWGW<6K6UUtK89)cABkIZ1sJ;E-cz+I`e} z$TC@W$Hu4Mt$0saP8mbnpdJ#H&oK_i&unA7-+0H4kk`v^pNa9wW;_x3Gf0PZ( zQ`M1Wb!`0Sxh(tjm!7TIw(iMm!g~49KbSXcscnHP2lFPfZ1ppJ{168^U3t8h_mTh9 z88}|gy`r@oi&Fp08#^$neD=GX%b;9=&PF@DhyFEH&d-oW=Dp?Vb>*i|xKb4xb%xGE z8*X2`p9iQ*!Oke4tBLv3$4R}C??vG!A$tt0q5u2^_9u?Zsf+6R zCv|t^eSmqhj93A7DB2uPhiv>8vC4Mf!E4qH{kG)A;@Oi0=O$n~mNs5qvrNvJP#4$r zZJmAl93{^pak!8E?|b0!dg%K#t{Kq&xA!l*wfwxi#N|c^&@RAZr+dqDDlh zXn4kv`yoTVM4NmGT_R#zK>YWJ8x0#^1;}+Rr{I^cH*kDV0lNMT$os#L-J3Dq&BYvO zEzDolLRq<&HK@KBH2$|$?LXYmw|%_|u(A6pQ0%S7*%NWlaqhSRF%U<@PH}qjb_!${H(*ZLS$NZR6(C4oqIgZNM(R@ZoSql+hCGtsx_9Y3Yjwcfje|Bn9WrcZe7d4(Rr9GP&%idf z6Sm^h(brj_A9iwQ+w&VL!OpY{xR(4TUF;|ILvIWAmwb0QpNn~Bd9A1Qy5=*iC(FP* z=du@`Szl@8qMMVd!=3Y|Ifb8mSONN8f4rAJlEx5S4W(@bV+6s2J|ndGQWD%SVLezDbgcfLeezKS(qIxO->&MN z1AS#oMd+~&(MPVrm}0lW0DW>^c=k!L0ptFA@0<(T=1Q9i=N&meLfatcYY!g$6 z$I7%Ta&8#77Wah@UPFfv>mFPoUV46mz_?Lxj)Zk!nO$4dSOq<$;r#ru6@g!=OUJ4U zN^)rV!npTn%x5%%Y+D80jJDL4_F0mQLOGlpqr-L8A+g+?0tAO+Smd!r_ zy5^IhF+64}k`s#mihgB#q|QkCy#o18+VwF~NUvkQ>Im_L^wK^@yCm&`x;=$ulcxUd zFMbkOJYm)1;_n6e5GQZkp!1>M?xHTM=+)2U7j19_o7Y8br}5~gZv^#o=0P6Q2E+R6 z2gfH$7w3CTpSGtSy;n4by*R3D&_voW?l^yj$2g@2WF%x3eL;5V&+(dcGjG^drJvi5 zci)K2OUI)>WE%<1F>s#rne`8eH(%Z&-q`kB_;_ACyZ&JTeOl`OYyRUe>&Pr=_BwR4$SGuHjYO>ZT@vmDktsDlu7i* z@Cr{nv=Z%u`4o(aD98A&(+|*%1JZ_fp*CrChoRk?Iq2F};( z^z(WxWP%?2(yu=g@7jz0#~)l?j1JO98cFP`#UYxJuS1^!%;`6W9{8pEouS;Izm*Z0XG1qDjvJ=sJek|>Z<~I~8}<`?e@Xwx@4qYU ztn`s_^OXNdE9C4l=$1!aacP~&=vRJr>+h61^u<&DOR3~P{lG{Uc}@C1+WD?5jy^lI za~Ac*N?$=RedgP58oT~xkY_7>xTCn@9m2^ z*^%oY^i!v%J(l)j(xMKQMSMU%hCkZ}QM9u_(m-0GF(T(fcH^1$tC!5F0>8t}dfj-< zzK^=RuE(niq>la%qv&VfM;fB~VbDhUNHfMBRsIAYY0Nha#2lUUEl~9!-Z*!M@s}by zat=a&Ec|eefV@@sp@3DzR|-d~nY8Wc~}nY4}_-1%72zV5;0&dXai9f|hXs$-1Tw3&Yd zS?mr$=y&I#|Bodfj;VB{-z%2-=o))^5GiHU+mkr*G+yP z`B^LzEkf6y_5O=xlLlROl19=B{h=Q0sZP6kr*Lkj9c*9HS3zNnGL7>@>;v7wHvirF zr{X{TcR5$*?te)uX-41SKqsaCIa!TU75zL@&!C^{=Y^j{RUy^%b3N6+zbKUc=4UVK+{kyeZYA_h{7 zZCe3HJJfymnV6$5{hsjn&oBK!#*eT&iD$4@f_5zT_*c<|G&`VMwj%R)y!)nX1Nfew zj%PLjPrtf#3DiyUWcw>yu|Do?x&Do7>_T?X*!Ca#_L+{~p_56Q1ob#&R|(OLxku1O z8cC~8`?f6`oYu8Zfqv1%AM>DY z=G%UP@gC>3b$LjdpexVC+`w@yv3`p*y93tdIm;K_bOh%Arh-0cgOl_(J_Bv~kYL-A z9v-SKZK&{1J2>o&0_&gT8dK`-Tw};FW~@LTJ=%Ih_8qrBZ|FbU zroFV^PRDwqko{I+hcu8D(zJZxtVHC?`zX&De0k&ZF^4GEP!R*r_at9v^QOIwevn&X zBcP0-ZzsoA?!a}ezy5jvW6-a#PULC1w&%eW3#HAR`4rjDmlw02D}0g$(n6a22Kq_Q zpE0g7^o;c?ANGO7N~oQy$h8)oo17`v@Y1IQeYwDVgB-Kb{={{%^dIFM1#QZIM;ynE zpMUm=^g)GByS(R~zaU;!nLJ}|e*LXCj;}oFs*pdapE|s-d7T6Q8VB9VRxB_K4dF&qdj`r$z0?8 z+QU52XU*$(S=}q4+cW|u|A_giBQC0bxKC;mC&OB0+U&}$Tr{gP_%jT=O1ch^FMBYa z8iu~EGV^8`sSZ6_p6gtVy#R79JQ3@lk8;fyaC{w->y&*w*fw66!W!z`nC~4ntVhek z{QAY%svFmljvdtTFubcnp^xtl%^Ca#x^0zTA@lx?_~#+>Zh`OJE$}&bo<0NU1AgT` z39JjQcSA=Qn%gJmux{8Jp(FzR1oOrYF5jWiX%ir8cLT#O!H;h$`ieU6b3KxH-~m1E zNa(|Lr~`n{FJWB0yM6uY6DE!9QGP(j=shA#>mkJ6YA~S#*L$kUGo6X}zYxwv`ndp( zOZ=Y?eJ>sXe zpj@%_WWa%(FUX$F`7nM+7r`UTJ9FM;c@~^!TpJ(q%@5hEIaZ<1bC##Ud79;2V&2hb zo@29EIyH0$u@U}TSzadQWtK-~Ji4a;WifH*#^dmwt+E)*>UCE1TK21Itm?*Dy#KU$ zV1KzR4zoB6ghTeDoU@9DF+cZUi@`n&i?TS(;?Oq^hjeR}H16EkADl7NcKenv-hm_(@$1walMRFX2Tx5yU`*?+T+ ztSi?-vF_vnc|o3#H{7#^yecd0URvs*{C$Gr1M~cH4OQ3XXUlyj`gf?8HhGtbX6_kB z{gAYAofm0M^h~__oZES4KuauS6|$m#a_UE*Zp2_ z51LHHK}pfgv7noe+5f@xK>F;IR6Ay3xp&ODA&WgrvQNFUv=L?^7D|FFTW&hj3;4plq(5RNVIp0$-gw>6jKLm#w0h=TAbkPo55Q}-Z>oK_6o!&LW1rS61~tE~ zxA7gMWOqc)(#U&1ZB$m%Y{mYJ_y&v-9v;BA(UJ{*G01dl?_V0Y zIQqAyBfRtG%lKZzEdu+P81a(4XB!}t>HgJSKl<(}o!zuAw9%gUeqP*mqD;93--^i8 zK-#${gJ0gVE!ZXqWg3Un(b;GC<%?H39TW6D_j~By=cSJ3l{e$UHd?(HE7$Y^;F``g z*k{i#&0gvFU7IH#T7_?&JRvx4ix*67`D~lAxK@;FZMa8etTs1^*ZFPoTzG#L{c-sX zV&anPDTs|1pIaYwKbb%L_7V1<4y13I)Qf5PjVP}F@CwUroo>u`w$%!J3mGA!|^;5t4rJF_@|3?pKSF9?JgujDfnm^kvya#MX;gD^u z?+;~K?|A8T=Eh6szLyUC@w*%Da!cYrbwBpgdRRRB`oOf&A0!jjEtAG%>;Zn-O6RGc z^eRoN@y9+;l~r2K?m8#?e$cMT@0%l(8hJ?liQnc+7tc#0{y1hySN%=P;dn<6w&Vl9 z;}Etll?WEO7oMrT$&`0q>2+Ru-H#RLmIZn~$y`(4i&bW6i05}f^?>igSf!VC^>puf zxEbHPC@J3RyfmR9Rrs?tt~aTRY1#?Hy6J37N!x9HVhzhki!3b3HMu$?P1+$9_zOC& zG@;v8TAgqD+@P)e)4A68t_3qv@(%goh0aGm=~bFk;E&&aQTdnl^P-!ti?ELNSljfb zb3dhd`D3lq@0TADCgQ^HGfbBX{AJQQm9W2yWZz%6ziQn_hnPS}OaIGn9GSGe&9st% z;UANHZR3wVE+*xdhO|2GZ2O3DT!WAn{F&^-da-o z6mHwHDZ;*>{vWY;PE4c=f81Ls79FXK=lT#mn3QE3f49w;;F||-y7f8)xqji%3RbCv(p2-P(8ir3!zfpZ&02&v@5i z9|BqJrStQBKNl}g{T?z-i~Q5ew0TXPB#}?0WM25kq-@*x8_~0+@AgY2{;nJ0Uk)>^ z3iR(Y;h&$h$UEck$N6yj!v_g|c%ssjRs7vJX_#*u>Gy>h@nVdtsmdl=i>LtRryO<>o0@B?CVrzGd;}jlWsf zk1*n+yAAdKi|0&Xd!`hBCh}gV&Feb6Cv0F0dgU1_E{i{J{4JR~)f)bY#D&KsL3DH9E#(U6aOSL#({L;)w{H1Dd4bFQf8&qBWoU{0g zjlY()es5jAuuZt%a55OAeb`Ui21(PcMU7c?-=-t=<~g27h`o=%Be zR`eww5; zwF{5`VJBt zFPM~FR`F-@-7>HFH=V!lz5SX<<(?u7Z=S^BVq);6EgMsYJz|BvgEm7Je?s~+`{hF- z{IPAg=f2T7qb58s!5`be1luNbFfI4bL2zvP-+0lGtdA*)j1|1f zixpQE@yGp1V%66xp8MvR1d~0!yvj=y$8XQ2()MlozM1fbX%p2?zhBnycgxgKM)fBz z!rziHVl&%N=cCPQV(*SQH>4zg?pc-UV8V;CgukHse+K=&SgK@Hc>RxK@~uR_ZJuiE zF@L|bFkPnOkKY{N`W}9N-K5?sEyokd1eK4ibE7klBsp>n!tWc~%2(yX?>(kEsIvT= zOA>$Ng&!JIm4?2X`u9Ig+a(oagejx@kPL}G&Pmv=dw4%q)2bS!H=+4Z#UJJ6vl|{Y z;;TC`ziDW~Yd>lE&1{5-4Q5cMhStk)*TeRIKlM~;4mJGIe`4O#q| zwSdiiMpZk7<#Sy8{S7{dD!r|yPExy?wbdEVzd(f_j;2V2P zn~MF0!utdJ=0l={vFhs;Uy}GsR1ZJ*>1)bw&e5joRlh`W9LxF%saXFJbUz~7{;ynP zYBMC_xqd&>@u%}`!mwa_(E8bL(e^rEKQ_!Q~0-Z<4@-rm}`V^2ziY(tiB!*WSO> zs>}hIfw9MDP1-n7THEW85|yXlFN^r2PpZk@X@1s2*!IOs27lalQg6d#uE{6c!GxZ& zh(GeP$vH>+ZX-YVW1c2_O_cVn*Ir!Fnu3yuK)^^bIPjp>Y@n^C=%`g6J?m0^TL4-i~Gx^4HqV~Ua=6Kui zGm_0^6@Mno;E6%B+nr_|WRb*6_!DHB%A1>KZF9i$62`+5F}Pv1E$B*;7VZ z!(Xb_0>{FdS9}(KX85zY<~QtnXC(iIb-%qL4Cr{VF$PV_$l@;=e=BaEnf7)jw)|i)6?+i*!3x(YhxcXmg+)Jk zsx(>rl`Q`J>^-DoGo8AD!U)eM-|EtzOLT1;fAp(NRHnKg-gD8{J7tvC?&Kb$&`Q z81!2;C5gY%BL9N=-=|vs5i_yy6eNE9kS;01U{KjqlK3kv@-OK6qg3LLSP6o$M9(al zJ5^%Prf)1UL|&-Cy;7fD|A_h<_gs?rD=qSmeTQE@Odmfu!p~If^-Vg65rm}r+j!3t z8$tJAip3`#fA060zB}9xlX@X}#=ZNwMxP;8eqQlGWvnd7<0tou*1pS6mHubyC!+I! z-y-zlQ_#4k=TsFN*WO1?r3`y|-klnsVU7NH_zTJp_j5Y$J>X;y?w)t1=VuXM3MAulBVar?AH}zkeDue?DvC&u0^BvGU@)SKK$Nw-g4n7v6@T<$^wajGA&tKGY0$mBZQGP>;!foiWZinE z;?MT}#Hqxo6nxmA*S2#0DPA2*;-0(C+y^5l z9jI$Y$Ua3U{ptPIb>YpER8z_`?fZOhx&JTiwwz;+g~wR&?y}u&5mlgtKkvN$Vqp7| zo7QCi(>~{3*QI<%g5(`u80(}h3P z_A3|967-R=?JMNPQ`(ke@h_;YPcJ7Eu}7MFUs^j#HtBVWbxl30Puq(G{jj)S%({nG zM*OW*+h*dKa{I}LS4+KuePiI`uKAKDTQ@zPkS{j&v1c2yEi>`BYrza-{Kdj0fZw)2RWefcDZ07Wkl(tdDjj{OhjeW!xW5y9 z@mNmyyF7uALf@CMgF8vxj`|(185cBA$DmC2d+-~n^tUSM|Y4+nv^;!<_JT2Hxw+$i|-n`;DPW1}3L2}P9 zw|&Pek63a1eh+0@cwI!XVoc|WVwIDs_;leT)#cb+E0PLctN9oD(Q>Zd0v)f z`Kj!})YtqzTN3HQ`%t7sKBXFev`v)+53^-f4$SxPHw(%H{xZc+DT~)4yoSFOUMBEI z`D*ifI$4|);UpEj;P-!1-6y6y|2fmf1nvt`!Q*V6u`x{hb-MA9uJSmpz#z z+HWt}HY)4Smj++MRAV~4S9_V67b|O+O!aphQ;n~9`IiNM(6WX%ulfX8_Y|+)OT)cP z*n7&WEe_Q4``QkziPYP zR6jkcPn$y#d#tk%2lM19>Su4YsK4@0VWr}61?7v!IW*BnhXan&EILMry^d4W9arc$ z#R|!HoN`g=3Mw6R5b_GOvI`i)pvC3O2>fV|t0jXJ2%EM6Syr9w58 z&MR(@N~Q6kuqZCV2d}t-qI8i8=NH9AD(n?klq|vot-9cAh-i&u#|c-YP=7W|pjL$9 zbX0cX45P9OXBd@TxaIW{cnxAS#)s}Uli-O?2?||B$U@3WoCcOqz47Xl_PE067LpBI z;En@)^WAZPuUDKq8NlH}8dKyIg9~JjS6ne@05HW^ig&ZHc)69l;tGnVE1zFHu3Ygb z|1n^TLZ)xn4Z*;=QNbC~&tgWKN+w4!v11VjyFS6^y>8SiyOsIEWDCCPwzk zE@EWw?J8JmMP6|(&QxO=e&bvfX~t*$#Sk8#xO}~p!b(jtaZ$_< zD^6Z7lz`r zA|e1*1j~eBd{hfP75WWR-As=Qw`ZOnhqkMPa-yO@VBSGpqvl + + + + + + +tgstation-server: tools/ReleaseNotes/Program.cs File Reference + + + + + + + + + + +
+ +
+
Program.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  ReleaseNotes.Program
 Contains the application entrypoint More...
 
+ + + +

+Namespaces

namespace  ReleaseNotes
 
+
+ + + + diff --git a/tools_2_release_notes_2_program_8cs_source.html b/tools_2_release_notes_2_program_8cs_source.html new file mode 100644 index 0000000000..22b77cd57c --- /dev/null +++ b/tools_2_release_notes_2_program_8cs_source.html @@ -0,0 +1,85 @@ + + + + + + + +tgstation-server: tools/ReleaseNotes/Program.cs Source File + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Program.cs
+
+
+Go to the documentation of this file.
1 using Octokit;
2 using System;
3 using System.Collections.Generic;
4 using System.Globalization;
5 using System.IO;
6 using System.Linq;
7 using System.Text;
8 using System.Threading.Tasks;
9 
10 namespace ReleaseNotes
11 {
15  static class Program
16  {
20  static async Task<int> Main(string[] args)
21  {
22  if (args.Length < 1)
23  {
24  Console.WriteLine("Missing version argument!");
25  return 1;
26  }
27 
28  var versionString = args[0];
29  if (!Version.TryParse(versionString, out var version))
30  {
31  Console.WriteLine("Invalid version: " + versionString);
32  return 2;
33  }
34 
35  var doNotCloseMilestone = args.Length >= 2 && args[1].ToUpperInvariant() == "--NO-CLOSE";
36 
37  const string ReleaseNotesEnvVar = "TGS_RELEASE_NOTES_TOKEN";
38  var githubToken = Environment.GetEnvironmentVariable(ReleaseNotesEnvVar);
39  if (String.IsNullOrWhiteSpace(githubToken))
40  {
41  Console.WriteLine("Missing " + ReleaseNotesEnvVar + " environment variable!");
42  return 3;
43  }
44 
45  try
46  {
47  var client = new GitHubClient(new ProductHeaderValue("tgs_release_notes"));
48  client.Credentials = new Credentials(githubToken);
49 
50  const string RepoOwner = "tgstation";
51  const string RepoName = "tgstation-server";
52 
53  var releasesTask = client.Repository.Release.GetAll(RepoOwner, RepoName);
54 
55  Console.WriteLine("Getting pull requests in milestone " + versionString + "...");
56  var milestonePRs = await client.Search.SearchIssues(new SearchIssuesRequest
57  {
58  Milestone = versionString,
59  Type = IssueTypeQualifier.PullRequest,
60  Repos = { { RepoOwner, RepoName } }
61  }).ConfigureAwait(false);
62 
63  if (milestonePRs.IncompleteResults)
64  {
65  Console.WriteLine("Incomplete results for milestone PRs query!");
66  return 5;
67  }
68  Console.WriteLine(milestonePRs.Items.Count + " total pull requests");
69 
70  Task<Milestone> milestoneTask = null;
71  var milestoneTaskLock = new object();
72  var releaseDictionary = new Dictionary<int, List<string>>();
73  var authorizedUsers = new Dictionary<long, Task<bool>>();
74 
75  async Task GetReleaseNotesFromPR(Issue pullRequest)
76  {
77  //need to check it was merged
78  var fullPR = await client.Repository.PullRequest.Get(RepoOwner, RepoName, pullRequest.Number).ConfigureAwait(false);
79 
80  async Task<Milestone> GetMilestone()
81  {
82  if (fullPR.Milestone == null)
83  return null;
84  return await client.Issue.Milestone.Get(RepoOwner, RepoName, fullPR.Milestone.Number);
85  };
86 
87  lock (milestoneTaskLock)
88  if (milestoneTask == null)
89  milestoneTask = GetMilestone();
90 
91  if (!fullPR.Merged)
92  return;
93 
94  async Task BuildNotesFromComment(string comment, User user)
95  {
96  var commentSplits = comment.Split('\n');
97  var notesOpen = false;
98  var notesClosed = false;
99  var notes = new List<string>();
100  foreach (var line in commentSplits)
101  {
102  var trimmedLine = line.Trim();
103  if (!notesOpen)
104  {
105  notesOpen = trimmedLine.StartsWith(":cl:", StringComparison.Ordinal);
106  notesClosed = false;
107  continue;
108  }
109  if (trimmedLine.StartsWith("/:cl:", StringComparison.Ordinal))
110  {
111  notesClosed = true;
112  notesOpen = false;
113  continue;
114  }
115  if (trimmedLine.Length == 0)
116  continue;
117  notes.Add(trimmedLine);
118  }
119  if (!notesClosed || notes.Count == 0)
120  return;
121 
122  Task<bool> authTask;
123  TaskCompletionSource<bool> ourTcs = null;
124  lock (authorizedUsers)
125  {
126  if (!authorizedUsers.TryGetValue(user.Id, out authTask))
127  {
128  ourTcs = new TaskCompletionSource<bool>();
129  authTask = ourTcs.Task;
130  authorizedUsers.Add(user.Id, authTask);
131  }
132  }
133 
134  if (ourTcs != null)
135  try
136  {
137  //check if the user has access
138  var perm = await client.Repository.Collaborator.ReviewPermission(RepoOwner, RepoName, user.Login).ConfigureAwait(false);
139  ourTcs.SetResult(perm.Permission == PermissionLevel.Write || perm.Permission == PermissionLevel.Admin);
140  }
141  catch
142  {
143  ourTcs.SetResult(false);
144  throw;
145  }
146 
147  var authorized = await authTask.ConfigureAwait(false);
148  if (!authorized)
149  return;
150 
151  lock (releaseDictionary)
152  {
153  foreach (var I in notes)
154  Console.WriteLine("#" + fullPR.Number + " - " + I + " (@" + user.Login + ")");
155  if (releaseDictionary.TryGetValue(fullPR.Number, out var currentValues))
156  currentValues.AddRange(notes);
157  else
158  releaseDictionary.Add(fullPR.Number, notes);
159  }
160  }
161 
162  var comments = await client.Issue.Comment.GetAllForIssue(RepoOwner, RepoName, fullPR.Number).ConfigureAwait(false);
163  await Task.WhenAll(BuildNotesFromComment(fullPR.Body, fullPR.User), Task.WhenAll(comments.Select(x => BuildNotesFromComment(x.Body, x.User)))).ConfigureAwait(false);
164  }
165 
166  var tasks = new List<Task>();
167  foreach (var I in milestonePRs.Items)
168  tasks.Add(GetReleaseNotesFromPR(I));
169 
170  var releases = await releasesTask.ConfigureAwait(false);
171 
172  var releasingSuite = version.Major;
173 
174  Version highestReleaseVersion = null;
175  Release highestRelease = null;
176  foreach (var I in releases)
177  {
178  if (!Version.TryParse(I.TagName.Replace("tgstation-server-v", String.Empty), out var currentReleaseVersion))
179  {
180  Console.WriteLine("WARNING: Unable to determine version of release " + I.HtmlUrl);
181  continue;
182  }
183 
184  if (currentReleaseVersion.Major == releasingSuite && (highestReleaseVersion == null || currentReleaseVersion > highestReleaseVersion))
185  {
186  highestReleaseVersion = currentReleaseVersion;
187  highestRelease = I;
188  }
189  }
190 
191  if (highestReleaseVersion == null)
192  {
193  Console.WriteLine("Unable to determine highest release version for suite " + releasingSuite + "!");
194  return 6;
195  }
196 
197  var oldNotes = highestRelease.Body;
198 
199  var splits = new List<string>(oldNotes.Split('\n'));
200  //trim away all the lines that don't start with #
201 
202  string keepThisRelease;
203  if (version.Revision == 0)
204  if (version.Build == 0)
205  keepThisRelease = "# ";
206  else
207  keepThisRelease = "## ";
208  else
209  keepThisRelease = "### ";
210 
211  for (; !splits[0].StartsWith(keepThisRelease, StringComparison.Ordinal); splits.RemoveAt(0))
212  if (splits.Count == 1)
213  {
214  Console.WriteLine("Error formatting release notes: Can't detemine notes start!");
215  return 7;
216  }
217 
218  oldNotes = String.Join('\n', splits);
219 
220  string prefix;
221  switch (releasingSuite)
222  {
223  case 3:
224  prefix = "The /tg/station server suite";
225  break;
226  default:
227  prefix = "See https://tgstation.github.io/tgstation-server for installation instructions";
228  break;
229  }
230 
231  var newNotes = new StringBuilder(prefix);
232  newNotes.Append(Environment.NewLine);
233  newNotes.Append(Environment.NewLine);
234  if (version.Revision == 0)
235  if (version.Build == 0)
236  {
237  newNotes.Append("# [Version ");
238  newNotes.Append(version.Minor);
239  }
240  else
241  {
242  newNotes.Append("## [Changelog for ");
243  newNotes.Append(version.Build);
244  newNotes.Append(".x");
245  }
246  else
247  {
248  newNotes.Append("### [Patch ");
249  newNotes.Append(version.Revision);
250  }
251  newNotes.Append("](");
252  var milestone = await milestoneTask.ConfigureAwait(false);
253  if (milestone == null)
254  {
255  Console.WriteLine("Unable to detemine milestone!");
256  return 9;
257  }
258  newNotes.Append(milestone.HtmlUrl);
259  newNotes.Append("?closed=1)");
260  newNotes.Append(Environment.NewLine);
261 
262  await Task.WhenAll(tasks).ConfigureAwait(false);
263 
264  if (releaseDictionary.Count == 0)
265  {
266  Console.WriteLine("No release notes for this milestone!");
267  return 8;
268  }
269 
270  foreach (var I in releaseDictionary)
271  foreach (var note in I.Value)
272  {
273  newNotes.Append(Environment.NewLine);
274  newNotes.Append("- ");
275  newNotes.Append(note);
276  newNotes.Append(" (#");
277  newNotes.Append(I.Key);
278  newNotes.Append(')');
279  }
280 
281  newNotes.Append(Environment.NewLine);
282  newNotes.Append(Environment.NewLine);
283  newNotes.Append(oldNotes);
284 
285  Console.WriteLine("Writing out new release notes...");
286  var releaseNotes = newNotes.ToString();
287  await File.WriteAllTextAsync("release_notes.md", releaseNotes).ConfigureAwait(false);
288 
289  if (doNotCloseMilestone)
290  Console.WriteLine("Not closing milestone due to parameter!");
291  else
292  {
293  Console.WriteLine("Closing milestone...");
294  await client.Issue.Milestone.Update(RepoOwner, RepoName, milestone.Number, new MilestoneUpdate
295  {
296  State = ItemState.Closed
297  }).ConfigureAwait(false);
298  }
299 
300  return 0;
301  }
302  catch (Exception e)
303  {
304  Console.WriteLine(e);
305  return 4;
306  }
307  }
308  }
309 }
+
static async Task< int > Main(string[] args)
The entrypoint for the Program
Definition: Program.cs:20
+
Contains the application entrypoint
Definition: Program.cs:15
+
+ + + + diff --git a/tools_2_release_notes_2_r_e_a_d_m_e_8md.html b/tools_2_release_notes_2_r_e_a_d_m_e_8md.html new file mode 100644 index 0000000000..197adb6330 --- /dev/null +++ b/tools_2_release_notes_2_r_e_a_d_m_e_8md.html @@ -0,0 +1,78 @@ + + + + + + + +tgstation-server: tools/ReleaseNotes/README.md File Reference + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
tools/ReleaseNotes/README.md File Reference
+
+
+
+ + + +